Fork 管理器:自动执行 Git 同步和 PR 变基 - Openclaw Skills

作者:互联网

2026-04-07

AI教程

什么是 Fork 管理器?

Fork 管理器是一款专业级工具,专为在向上游仓库贡献代码时维护活跃 fork 的开发者设计。通过利用 Openclaw Skills 框架,该智能体可以自动执行与上游远程库同步、同时变基多个 PR 分支以及跟踪待处理贡献状态的复杂过程。它确保您的本地开发环境与上游更改保持同步,且不会丢失您独特的改进或本地补丁。

该技能运行在弹性编排器和工作器模型上,能够轻松管理高吞吐量的代码库。它通过提供一种结构化的方式来处理 PR 生命周期(从初始创建到自动冲突解决),有效减少了 Git 维护的手动开销。对于任何希望在 Openclaw Skills 生态系统中扩展其贡献工作流的开发者来说,这都是一个必不可少的组件。

下载入口:https://github.com/openclaw/skills/tree/main/skills/glucksberg/fork-manager

安装与下载

1. ClawHub CLI

从源直接安装技能的最快方式。

npx clawhub@latest install fork-manager

2. 手动安装

将技能文件夹复制到以下位置之一

全局模式 ~/.openclaw/skills/ 工作区 /skills/

优先级:工作区 > 本地 > 内置

3. 提示词安装

将此提示词复制到 OpenClaw 即可自动安装。

请帮我使用 Clawhub 安装 fork-manager。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。

Fork 管理器 应用场景

  • 将 fork 与上游仓库同步,以保持与最新提交同步。
  • 自动将所有打开的拉取请求(PR)分支变基到最新的上游主分支。
  • 构建并维护一个整合的生产分支,结合多个打开的 PR 和本地补丁。
  • 审计打开的 PR,以检测上游维护者是否已经解决的冗余或更改。
  • 管理针对被上游仓库拒绝或取代的关键修复的本地补丁。
Fork 管理器 工作原理
  1. 智能体通过从特定的 Openclaw Skills 目录加载仓库配置和执行历史记录来进行初始化。
  2. 它从上游和源远程库执行深度获取(fetch),以评估所有分支的同步状态。
  3. 使用 GitHub CLI 验证拉取请求状态,以识别已合并、已关闭或过时的贡献。
  4. 编排器派生工作智能体来执行同步和变基操作,确保主智能体的上下文窗口保持整洁。
  5. 如果出现合并冲突,系统可以启动专门的 AI 子智能体,利用语义逻辑解决冲突。
  6. 生成一份全面的状态报告并附加到历史日志中,并重建生产分支以包含所有已验证的更改。

Fork 管理器 配置指南

要开始使用 Fork 管理器,请确保您已安装 Git 和 GitHub CLI 并完成身份验证。在 Openclaw Skills 结构中为您的仓库创建一个配置文件:

# 确保依赖项可用
git --version
gh --version

# 设置配置目录
mkdir -p fork-manager/repos/your-project-name
touch fork-manager/repos/your-project-name/config.json

config.json 中填充您的仓库元数据,包括 localPathupstreamRemoteprBranches,以便智能体跟踪您的工作。

Fork 管理器 数据架构与分类体系

该技能通过 Openclaw Skills 内的结构化文件系统维护状态和元数据。这确保了透明度以及从中断中轻松恢复。

文件 用途
config.json 存储仓库元数据、远程名称、分支映射和本地补丁跟踪。
history.md 一个仅追加的日志,记录每个同步操作、变基结果和自动决策。
checkpoint.json 捕获自动运行期间的状态,以便从故障中恢复。
localPatches 一个 JSON 对象,用于跟踪保留供本地使用的特定分支以及相关的审查日期。
name: fork-manager
description: Manage forks with open PRs - sync upstream, rebase branches, track PR status, and maintain production branches with pending contributions. Supports automatic conflict resolution via --auto-resolve flag (spawns AI subagents to resolve rebase conflicts). Use when syncing forks, rebasing PR branches, building production branches that combine all open PRs, reviewing closed/rejected PRs, or managing local patches kept outside upstream. Requires Git and GitHub CLI (gh).
metadata: {"openclaw": {"requires": {"bins": ["git", "gh"]}}}

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: "",
      model: "",
      mode: "run"
    )
    
  2. Worker (subagente) — executa o full-sync/status/rebase/etc. Lê a SKILL.md, segue o fluxo, escreve history.
  3. 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 — 
    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//checkpoint.json so the next run (or manual invocation) can resume
  4. 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//config.json relative to the skill directory:

fork-manager/
├── SKILL.md
└── repos/
    ├── project-a/
    │   └── config.json
    └── project-b/
        └── config.json

Formato do config.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": "Breve descri??o do que o patch faz",
      "originalPR": 789,
      "closedReason": "rejected|superseded|duplicate|wontfix",
      "keepReason": "Motivo pelo qual mantemos localmente",
      "addedAt": "2026-02-07T00:00:00Z",
      "reviewDate": "2026-03-07T00:00:00Z"
    }
  },
  "lastSync": "2026-01-28T12:00:00Z",
  "notes": {
    "mergedUpstream": {},
    "closedWithoutMerge": {},
    "droppedPatches": {}
  }
}

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."
--auto-resolve OU config.autoResolveConflicts: true Spawna subagentes Opus para resolver conflitos. Resultados classificados como trivial/semantico/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
description O que o patch faz
originalPR 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:

fork-manager/
└── repos/
    ├── project-a/
    │   ├── config.json
    │   └── history.md
    └── project-b/
        ├── config.json
        └── history.md

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
# Ler última entrada do history (tudo após o último "---")
tail -n +$(grep -n '^---$' "$SKILL_DIR/repos//history.md" | tail -1 | cut -d: -f1) "$SKILL_DIR/repos//history.md"

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:

---
## YYYY-MM-DD HH:MM UTC | 
**Operator:** 

### Summary
- Main: 
- PRs: 
- Local Patches: 
- Production: 

### Actions Taken
- 
- <"Rebased 21/21 branches clean">
- <"PR #999 closed → kept as local patch local/my-fix">
- <"PR #777 reopened → restored to openPRs (was in droppedPatches)">

### Pending
- 
- <"3 local patches with expired reviewDate — run review-patches">

### Full Report

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):

# SKILL_DIR is the directory containing this SKILL.md
# Resolve it relative to the agent's workspace or skill install path
SKILL_DIR=""

# Load config for the target repo
cat "$SKILL_DIR/repos//config.json"

# Ler último output do history para contexto
HISTORY="$SKILL_DIR/repos//history.md"
if [ -f "$HISTORY" ]; then
  # Extrair última entrada (após último ---)
  LAST_SEP=$(grep -n '^---$' "$HISTORY" | tail -1 | cut -d: -f1)
  if [ -n "$LAST_SEP" ]; then
    tail -n +"$LAST_SEP" "$HISTORY"
  fi
fi

2. Navegar para o repositório

cd 

3. Fetch de ambos remotes

git fetch 
git fetch 

4. Analisar estado do main

# Commits que upstream tem e origin/main n?o tem
git log --oneline /../

# Contar commits atrás
git rev-list --count /../

5. Verificar PRs abertos via GitHub CLI

# Listar PRs abertos do usuário
gh pr list --state open --author @me --json number,title,headRefName,state

# Verificar status de um PR específico
gh pr view  --json state,mergedAt,closedAt,title

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:

git log --oneline /../ | wc -l  # commits à frente
git log --oneline /../ | wc -l  # commits atrás

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

# Buscar comentários e motivo do fechamento
gh pr view  --repo  --json title,closedAt,state,comments,labels

# Verificar se upstream resolveu o problema de outra forma
# (procurar PRs mergeados recentes que toquem os mesmos arquivos)
gh pr list --state merged --repo  --json number,title,mergedAt --limit 30

7.2. Classificar o motivo do fechamento

Categoria Descri??o A??o padr?o
resolved_upstream Upstream corrigiu o problema por outro caminho drop — n?o precisamos mais
superseded_by_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:

### PR #
- **Fechado em:** <data>
- **Motivo:** <categoria>
- **Comentários do mantenedor:** <resumo>
- **O fix ainda é relevante pra nós?** Análise: <o que o patch faz e se upstream resolve>

**Op??es:**
1. ??? **Drop** — remover completamente (branch local + remote)
2. ?? **Keep as local patch** — mover para `localPatches`, manter na production branch
3. ?? **Resubmit** — retrabalhar e abrir novo PR com abordagem diferente
4. ?? **Defer** — manter no limbo por agora, revisitar depois
</CODE></PRE>
<H4 id=74-executar-a-decis?o>7.4. Executar a decis?o</H4>
<P><STRONG>Drop:</STRONG></P><PRE><CODE class=language-bash>git branch -D <branch> 2>/dev/null
git push <originRemote> --delete <branch> 2>/dev/null
# Mover para notes.droppedPatches no config
</CODE></PRE>
<P><STRONG>Keep as local patch:</STRONG></P><PRE><CODE class=language-bash># Branch continua existindo, mas sai de openPRs/prBranches
# Entra em localPatches com metadata completa
# Renomear branch de fix/xxx para local/xxx (opcional, para clareza)
</CODE></PRE>
<P><STRONG>Resubmit:</STRONG></P><PRE><CODE class=language-bash># Manter branch, criar novo PR com descri??o atualizada
gh pr create --title "<novo titulo>" --body "<nova descri??o com contexto>"
# Atualizar config com novo número de PR
</CODE></PRE>
<P><STRONG>Defer:</STRONG></P><PRE><CODE class=language-bash># Mover para uma se??o notes.deferred no config
# Será apresentado novamente no próximo full-sync
</CODE></PRE>
<H3 id=8-auditar-prs-abertos-audit-open>8. Auditar PRs abertos (<CODE>audit-open</CODE>)</H3>
<P>Análise proativa dos PRs <STRONG>ainda abertos</STRONG> para detectar redundancias e obsolescência. Deve rodar no <CODE>full-sync</CODE> depois do <CODE>update-config</CODE>.</P>
<H4 id=81-resolved-upstream>8.1. Resolved upstream</H4>
<P>Verificar se o upstream já resolveu o problema que nosso PR corrige, sem mergear nosso PR:</P><PRE><CODE class=language-bash># Para cada PR aberto, buscar os arquivos que ele toca
gh pr view <number> --repo <repo> --json files --jq '[.files[].path]'

# Verificar se upstream alterou esses mesmos arquivos recentemente
# (commits no upstream/main que n?o est?o no nosso PR branch)
git log --oneline upstream/main --since="<lastSync>" -- <files>

# Se houve mudan?as upstream nos mesmos arquivos, verificar se o diff
# do nosso PR ainda faz diferen?a (pode ter sido absorvido)
git diff upstream/main..origin/<branch> -- <files>
</CODE></PRE>
<P><STRONG>Se o diff do PR estiver vazio</STRONG> (upstream absorveu as mudan?as): marcar como <CODE>resolved_upstream</CODE>. <STRONG>Se o diff for parcial</STRONG> (upstream resolveu parte): marcar como <CODE>partially_resolved</CODE> para revis?o.</P>
<H4 id=82-duplicate-externo>8.2. Duplicate externo</H4>
<P>Verificar se outra pessoa abriu um PR que resolve o mesmo problema:</P><PRE><CODE class=language-bash># Buscar PRs abertos no upstream que tocam os mesmos arquivos
gh pr list --state open --repo <repo> --json number,title,headRefName,files --limit 50

# Buscar PRs mergeados recentes que tocam os mesmos arquivos
gh pr list --state merged --repo <repo> --json number,title,mergedAt,files --limit 30 r
  | jq '[.[] | select(.mergedAt >= "<lastSync>")]'
</CODE></PRE>
<P>Para cada PR encontrado que toca os mesmos arquivos, comparar:</P>
<UL>
<LI>Mesmo issue referenciado?</LI>
<LI>Mesma área de código?</LI>
<LI>Mesmo tipo de fix?</LI></UL>
<P>Se houver match forte: marcar como <CODE>duplicate_external</CODE> ou <CODE>superseded_external</CODE>.</P>
<H4 id=83-self-duplicate>8.3. Self-duplicate</H4>
<P>Detectar sobreposi??o entre nossos próprios PRs abertos:</P><PRE><CODE class=language-bash># Coletar files de todos os nossos PRs abertos
for pr in <openPRs>; do
  gh pr view $pr --repo <repo> --json number,files --jq '{number, files: [.files[].path]}'
done

# Cruzar: se dois PRs tocam os mesmos arquivos, s?o candidatos a duplicata
</CODE></PRE>
<P>Para cada par com overlap de arquivos:</P>
<UL>
<LI>Verificar se o diff é similar ou complementar</LI>
<LI>Se similar: recomendar fechar o mais antigo/menos limpo</LI>
<LI>Se complementar: ok, apenas nota informativa</LI></UL>
<H4 id=84-apresentar-resultados>8.4. Apresentar resultados</H4><PRE><CODE class=language-markdown>### Audit de PRs Abertos

#### Possivelmente resolvidos upstream
| # | Titulo | Arquivos em comum | Status |
|---|--------|-------------------|--------|
| 123 | fix(foo): bar | foo.ts (changed upstream 3 days ago) | ?? Verificar |

#### Possíveis duplicatas externas
| Nosso PR | PR externo | Overlap | Recomenda??o |
|----------|-----------|---------|--------------|
| #123 | #456 (@user) | foo.ts, bar.ts | ?? Mesmo issue, verificar |

#### Self-duplicates (nossos PRs que se sobrep?em)
| PR A | PR B | Arquivos em comum | Recomenda??o |
|------|------|-------------------|--------------|
| #6471 | #8386 | skills/refresh.ts | ??? Fechar #6471 (duplicata) |

**Op??es por PR flagged:**
1. ??? **Close** — fechar o PR no upstream e drop
2. ? **Keep** — falso positivo, manter aberto
3. ?? **Merge into** — combinar com outro PR
4. ?? **Defer** — revisitar depois
</CODE></PRE>
<H2 id=comandos-do-agente>Comandos do Agente</H2>
<H3 id=status---verificar-estado-atual><CODE>status</CODE> - Verificar estado atual</H3>
<OL>
<LI>Carregar config</LI>
<LI>Fetch remotes</LI>
<LI>Contar commits atrás do upstream</LI>
<LI>Listar PRs e seus estados</LI>
<LI>Reportar ao usuário</LI></OL>
<H3 id=sync---sincronizar-main-com-upstream><CODE>sync</CODE> - Sincronizar main com upstream</H3><PRE><CODE class=language-bash>cd <localPath>
git fetch <upstreamRemote>
git checkout <mainBranch>
git merge <upstreamRemote>/<mainBranch>
git push <originRemote> <mainBranch>
</CODE></PRE>
<H3 id=rebase-branch---rebase-de-uma-branch-específica><CODE>rebase <branch></CODE> - Rebase de uma branch específica</H3><PRE><CODE class=language-bash>git checkout <branch>
git fetch <upstreamRemote>
git rebase <upstreamRemote>/<mainBranch>
# Se conflito: resolver e git rebase --continue
git push <originRemote> <branch> --force-with-lease
</CODE></PRE>
<H3 id=rebase-all---rebase-de-todas-as-branches-de-pr><CODE>rebase-all</CODE> - Rebase de todas as branches de PR</H3>
<P>Para cada branch em <CODE>prBranches</CODE>:</P>
<OL>
<LI>Checkout da branch</LI>
<LI>Rebase no upstream/main</LI>
<LI>Push com --force-with-lease</LI>
<LI>Reportar sucesso/falha</LI></OL>
<H3 id=resolve-conflicts---resolu??o-automática-de-conflitos-via-subagentes><CODE>resolve-conflicts</CODE> - Resolu??o automática de conflitos via subagentes</H3>
<BLOCKQUOTE>
<P><STRONG>Requer <CODE>--auto-resolve</CODE> na invoca??o OU <CODE>autoResolveConflicts: true</CODE> no config do repo.</STRONG> Se nenhum dos dois, este comando n?o é executado e conflitos s?o apenas reportados com a nota "?? Conflitos requerem aval do desenvolvedor."</P></BLOCKQUOTE>
<P>Após <CODE>rebase-all</CODE> detectar conflitos, o <STRONG>orchestrator</STRONG> (agente principal) spawna subagentes individuais para tentar resolver cada conflito automaticamente.</P>
<H4 id=fluxo-1>Fluxo</H4>
<OL>
<LI>O worker do <CODE>rebase-all</CODE> retorna a lista de branches com conflito</LI>
<LI>O orchestrator agrupa os conflitos e spawna <STRONG>até 5 subagentes simultaneos</STRONG> (model: Opus)</LI>
<LI>Conforme subagentes terminam, novos s?o lan?ados até esgotar a fila</LI>
<LI>Cada subagente tem <STRONG>timeout de 10 minutos</STRONG></LI>
<LI>Resultados s?o coletados e integrados no relatório final</LI></OL>
<H4 id=prompt-do-subagente-resolver>Prompt do subagente resolver</H4>
<P>Cada subagente recebe:</P><PRE><CODE>Resolve o conflito de rebase da branch <branch> (PR #<number>) no repo <localPath>.

## Contexto
- Upstream: <upstreamRemote>/<mainBranch>
- Branch do PR: <originRemote>/<branch>
- Arquivos em conflito: <lista de arquivos do erro de rebase>

## Passos
1. cd <localPath>
2. git checkout -B <branch> <originRemote>/<branch> --no-track
3. git rebase <upstreamRemote>/<mainBranch>
   → O rebase vai parar com conflito
4. Para cada arquivo em conflito:
   a. Ler o arquivo com os marcadores de conflito (<<<<<<<, =======, >>>>>>>)
   b. Entender o que o upstream mudou (OURS) vs o que o PR mudou (THEIRS)
   c. Resolver preservando a inten??o de ambos
   d. git add <arquivo>
5. git rebase --continue
6. Se houver mais conflitos em commits subsequentes, repetir 4-5
7. git push <originRemote> <branch> --force-with-lease

## Regras de resolu??o
- **Arquivo deletado no upstream + modificado pelo PR:** aceitar a dele??o do upstream (nosso PR targeted código que n?o existe mais). git rm <arquivo> && git rebase --continue
- **Import/formatting conflicts:** mesclar ambos, preservar imports de ambos os lados
- **Lógica alterada em ambos os lados:** preservar a mudan?a do upstream E encaixar o fix do PR. Se o fix do PR n?o faz mais sentido com o novo código upstream, reportar como UNRESOLVABLE.
- **NUNCA alterar a lógica do PR** — apenas adaptar ao novo contexto do upstream

## Output
Responda com EXATAMENTE um destes formatos:

RESOLVED|<branch>|trivial|<resumo de 1 linha>
RESOLVED|<branch>|semantic|<resumo de 1 linha>
UNRESOLVABLE|<branch>|<motivo de 1 linha>
</CODE></PRE>
<H4 id=classifica??o-do-resultado>Classifica??o do resultado</H4>
<DIV class=table-scroll-wrapper>
<TABLE>
<THEAD>
<TR>
<TH>Resultado</TH>
<TH>Significado</TH>
<TH>A??o</TH></TR></THEAD>
<TBODY>
<TR>
<TD><CODE>RESOLVED|trivial</CODE></TD>
<TD>Conflito mecanico resolvido (imports, formatting, deleted files)</TD>
<TD>? Push feito, sem necessidade de revis?o</TD></TR>
<TR>
<TD><CODE>RESOLVED|semantic</CODE></TD>
<TD>Conflito envolvendo lógica de negócio resolvido</TD>
<TD>?? Push feito, <STRONG>marcar no report para revis?o humana</STRONG></TD></TR>
<TR>
<TD><CODE>UNRESOLVABLE</CODE></TD>
<TD>Subagente n?o conseguiu resolver sem risco</TD>
<TD>? N?o faz push, escala no report</TD></TR></TBODY></TABLE></DIV>
<H4 id=após-resolu??o>Após resolu??o</H4>
<P>Para branches resolvidas com sucesso:</P>
<OL>
<LI>Verificar que o push foi feito (<CODE>git log --oneline <originRemote>/<branch> -1</CODE>)</LI>
<LI>Tentar rebase novamente para confirmar que está clean</LI>
<LI>Atualizar <CODE>notes.conflictBranches</CODE> no config: remover entries resolvidas</LI></OL>
<P>Para branches n?o resolvidas:</P>
<OL>
<LI>Manter em <CODE>notes.conflictBranches</CODE> com ciclo incrementado</LI>
<LI>Incluir no relatório com o motivo do subagente</LI></OL>
<H4 id=integra??o-com-build-production>Integra??o com build-production</H4>
<P>Após <CODE>resolve-conflicts</CODE>, o <CODE>build-production</CODE> roda normalmente. Branches que foram resolvidas no rebase agora devem mergear clean na production. Se ainda houver conflito de <STRONG>production merge</STRONG> (diferente do conflito de rebase), o <CODE>build-production</CODE> trata como sempre: abort e reportar.</P>
<H3 id=update-config---atualizar-config-com-prs-atuais><CODE>update-config</CODE> - Atualizar config com PRs atuais</H3><PRE><CODE class=language-bash># Buscar PRs abertos
gh pr list --state open --author @me --repo <repo> --json number,headRefName

# Atualizar o arquivo $SKILL_DIR/repos/<repo-name>/config.json com os PRs atuais
# Usar jq ou editar manualmente o JSON
</CODE></PRE>
<H4 id=detec??o-de-prs-reabertos>Detec??o de PRs reabertos</H4>
<P>Ao comparar a lista do GitHub (<CODE>gh pr list --state open</CODE>) com o config local, detectar <STRONG>três cenários</STRONG>:</P>
<DIV class=table-scroll-wrapper>
<TABLE>
<THEAD>
<TR>
<TH>Cenário</TH>
<TH>Condi??o</TH>
<TH>A??o</TH></TR></THEAD>
<TBODY>
<TR>
<TD><STRONG>PR novo</STRONG></TD>
<TD>No GitHub mas n?o em <CODE>openPRs</CODE>, <CODE>localPatches</CODE>, nem <CODE>notes</CODE></TD>
<TD>Adicionar a <CODE>openPRs</CODE> + <CODE>prBranches</CODE> normalmente</TD></TR>
<TR>
<TD><STRONG>PR reaberto (dropped)</STRONG></TD>
<TD>No GitHub como open, encontrado em <CODE>notes.closedWithoutMerge</CODE> ou <CODE>notes.droppedPatches</CODE></TD>
<TD><STRONG>Restaurar</STRONG>: mover de volta para <CODE>openPRs</CODE> + <CODE>prBranches</CODE>, remover da se??o <CODE>notes</CODE>. Fetch da branch: <CODE>git fetch <originRemote> <branch></CODE>. Logar no relatório como "?? Reopened"</TD></TR>
<TR>
<TD><STRONG>PR reaberto (local patch)</STRONG></TD>
<TD>No GitHub como open, encontrado em <CODE>localPatches</CODE> (via campo <CODE>originalPR</CODE>)</TD>
<TD><STRONG>Promover</STRONG>: mover de <CODE>localPatches</CODE> para <CODE>openPRs</CODE> + <CODE>prBranches</CODE>. Logar no relatório como "?? Reopened (was local patch)"</TD></TR></TBODY></TABLE></DIV>
<P><STRONG>Implementa??o:</STRONG></P><PRE><CODE class=language-bash># Para cada PR open no GitHub que N?O está em openPRs:
# 1. Checar se o número está em notes.closedWithoutMerge ou notes.droppedPatches
#    → Se sim: PR foi reaberto. Restaurar automaticamente.
# 2. Checar se algum entry em localPatches tem originalPR == número
#    → Se sim: PR foi reaberto. Promover de volta a openPRs.
# 3. Se n?o encontrado em lugar nenhum: PR genuinamente novo.

# Restaurar branch se foi deletada:
git fetch <originRemote> <branch> 2>/dev/null || git fetch <originRemote> pull/<number>/head:<branch>
</CODE></PRE>
<P><STRONG>Nota:</STRONG> 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.</P>
<H3 id=build-production---criar-branch-de-produ??o-com-todos-os-prs--local-patches><CODE>build-production</CODE> - Criar branch de produ??o com todos os PRs + local patches</H3><PRE><CODE class=language-bash>cd <localPath>
git fetch <upstreamRemote>
git fetch <originRemote>

# ?? SEMPRE preservar arquivos n?o-commitados antes de trocar de branch
if [ -n "$(git status --porcelain)" ]; then
  git stash push --include-untracked -m "fork-manager: pre-build-production $(date -u +%Y%m%dT%H%M%S)"
  STASHED=1
fi

# Deletar branch antiga se existir
git branch -D <productionBranch> 2>/dev/null || true

# Criar nova branch a partir do upstream
git checkout -b <productionBranch> <upstreamRemote>/<mainBranch>

# 1. Mergear cada PR branch (contribui??es upstream pendentes)
for branch in <prBranches>; do
  git merge <originRemote>/$branch -m "Merge PR #<number>: <title>"
  # Se conflito, resolver
done

# 2. Mergear cada local patch (fixes mantidos localmente)
for branch in <localPatches>; do
  git merge <originRemote>/$branch -m "Merge local patch: <description>"
  # Se conflito, resolver
done

# Push
git push <originRemote> <productionBranch> --force-with-lease

# Restaurar arquivos n?o-commitados
if [ "$STASHED" = "1" ]; then
  git stash pop
fi
</CODE></PRE>
<P><STRONG>After rebuilding the production branch, remind the user to run their project's build command if needed.</STRONG></P>
<P><STRONG>Ordem de merge:</STRONG> 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.</P>
<H3 id=audit-open---auditar-prs-abertos-por-redundanciaobsolescência><CODE>audit-open</CODE> - Auditar PRs abertos por redundancia/obsolescência</H3>
<P>Análise proativa de todos os PRs abertos (se??o 8 acima):</P>
<OL>
<LI>Para cada PR aberto, coletar arquivos tocados</LI>
<LI><STRONG>Resolved upstream</STRONG>: verificar se upstream alterou os mesmos arquivos desde último sync; se diff do PR ficou vazio, flaggar</LI>
<LI><STRONG>Duplicate externo</STRONG>: buscar PRs upstream (open + recently merged) que tocam mesmos arquivos</LI>
<LI><STRONG>Self-duplicate</STRONG>: cruzar arquivos entre nossos próprios PRs abertos</LI>
<LI>Apresentar findings ao usuário com op??es: close / keep / merge-into / defer</LI>
<LI>Executar decis?es</LI>
<LI>Atualizar config</LI></OL>
<H3 id=review-closed---revisar-prs-recém-fechados><CODE>review-closed</CODE> - Revisar PRs recém-fechados</H3>
<P>Detecta PRs que foram fechados/mergeados desde o último sync e guia o usuário na decis?o:</P>
<OL>
<LI>Buscar todos os PRs do config no GitHub</LI>
<LI>Identificar os que mudaram de estado (merged ou closed)</LI>
<LI>Para <STRONG>merged</STRONG>: mover para <CODE>notes.mergedUpstream</CODE>, deletar branches</LI>
<LI>Para <STRONG>closed sem merge</STRONG>: iniciar fluxo de revis?o interativo (se??o 7 acima)</LI>
<LI>Para cada closed, apresentar contexto e op??es ao usuário</LI>
<LI>Executar decis?o: drop / keep as local patch / resubmit / defer</LI>
<LI>Atualizar config</LI></OL>
<H3 id=review-patches---reavaliar-patches-locais-existentes><CODE>review-patches</CODE> - Reavaliar patches locais existentes</H3>
<P>Para cada entry em <CODE>localPatches</CODE> cuja <CODE>reviewDate</CODE> já passou:</P>
<OL>
<LI>Verificar se upstream resolveu o problema desde a última revis?o</LI>
<LI>Verificar se o patch ainda aplica limpo (sem conflitos)</LI>
<LI>Apresentar ao usuário com op??es: manter / drop / resubmit / estender reviewDate</LI>
<LI>Atualizar config</LI></OL>
<H3 id=full-sync---sincroniza??o-completa><CODE>full-sync</CODE> - Sincroniza??o completa</H3>
<OL>
<LI><STRONG>Stash</STRONG> - <CODE>git stash --include-untracked</CODE> se houver arquivos n?o-commitados</LI>
<LI><CODE>sync</CODE> - Atualizar main
<UL>
<LI><STRONG>Before sync:</STRONG> record <CODE>OLD_SHA=$(git rev-parse upstream/main)</CODE></LI>
<LI><STRONG>After sync:</STRONG> record <CODE>NEW_SHA=$(git rev-parse upstream/main)</CODE></LI></UL></LI>
<LI><STRONG><CODE>post-sync hooks</CODE></STRONG> <EM>(optional, repo-specific)</EM> - Run custom post-sync actions
<UL>
<LI>Skip if <CODE>OLD_SHA == NEW_SHA</CODE> (no upstream changes)</LI>
<LI>Hooks are defined per-repo in <CODE>config.json</CODE> under <CODE>"postSyncHooks"</CODE> (array of shell commands or descriptions)</LI>
<LI>Example: detect CHANGELOG changes, update downstream skills, trigger CI</LI>
<LI>If no hooks configured: skip this step entirely</LI></UL></LI>
<LI><CODE>update-config</CODE> - Atualizar lista de PRs</LI>
<LI><STRONG><CODE>review-closed</CODE></STRONG> - Revisar PRs recém-fechados/mergeados (interativo)</LI>
<LI><STRONG><CODE>audit-open</CODE></STRONG> - Auditar PRs abertos por redundancia/obsolescência (interativo)</LI>
<LI><STRONG><CODE>review-patches</CODE></STRONG> - Reavaliar local patches com reviewDate vencida (interativo)</LI>
<LI><CODE>rebase-all</CODE> - Rebase de todas as branches (PRs + local patches)</LI>
<LI><STRONG><CODE>resolve-conflicts</CODE></STRONG> <EM>(only if <CODE>--auto-resolve</CODE> flag OR <CODE>autoResolveConflicts: true</CODE> in config)</EM> - Resolver conflitos de rebase automaticamente via subagentes (Opus, até 5 paralelos, 10min timeout cada). Se nenhum dos dois, pular este passo.</LI>
<LI><CODE>build-production</CODE> - Recriar branch de produ??o (PRs + local patches)</LI>
<LI><STRONG>Pop stash</STRONG> - <CODE>git stash pop</CODE> para restaurar arquivos locais</LI>
<LI>Remind user to run their project's build command if needed</LI></OL>
<P><STRONG>Nota sobre ordem:</STRONG> <CODE>update-config</CODE> roda <STRONG>antes</STRONG> de <CODE>review-closed</CODE> porque é ali que PRs reabertos s?o detectados e restaurados automaticamente. Depois, <CODE>review-closed</CODE> processa PRs que foram genuinamente fechados. Por fim, <CODE>audit-open</CODE> roda por último, já com a lista de PRs abertos atualizada (incluindo os reabertos).</P>
<H2 id=relatório-para-o-usuário>Relatório para o Usuário</H2>
<P>Após qualquer opera??o, gerar relatório:</P><PRE><CODE class=language-markdown>## ?? Fork Status: <repo>

### Upstream Sync

- **Main branch:** X commits behind upstream
- **Last sync:** <date>

### Open PRs (Y total)

| #   | Branch        | Status           | Action Needed     |
| --- | ------------- | ---------------- | ----------------- |
| 123 | fix/issue-123 | ? Up to date    | None              |
| 456 | feat/feature  | ?? Needs rebase  | Run rebase        |
| 789 | fix/bug       | ? Has conflicts | Manual resolution |

#### ?? Resolu??o Automática de Conflitos

_Se??o presente apenas quando resolu??o automática está ativa (`--auto-resolve` ou `autoResolveConflicts: true`). Caso contrário, substituir por:_
> ?? **Conflitos requerem aval do desenvolvedor.** Resolu??o automática n?o ativada. Use `--auto-resolve` para tentar resolver automaticamente.

_Quando ativa: Conflitos semanticos (??) foram resolvidos automaticamente mas **requerem revis?o humana** — o subagente pode ter interpretado mal a inten??o do código._

| #   | Branch        | Tipo      | Resultado          | Detalhe                          |
| --- | ------------- | --------- | ------------------ | -------------------------------- |
| 123 | fix/issue-123 | trivial   | ? Resolvido        | Removed deleted test file        |
| 456 | fix/issue-456 | semantico | ?? Resolvido (revisar) | Adapted runner call to new API   |
| 789 | fix/issue-789 | —         | ? N?o resolvido    | Lógica incompatível com upstream |

#### ?? Conflitos persistentes (3+ ciclos)

_Se??o presente apenas quando há conflitos que persistem por 3 ou mais execu??es consecutivas da skill, mesmo após tentativa de resolu??o automática. Esses PRs merecem aten??o prioritária: considerar dropar, recriar sobre o main atual, ou resolver manualmente._

| #   | Branch        | Ciclos | Arquivo(s)        | Recomenda??o        |
| --- | ------------- | ------ | ----------------- | ------------------- |
| 789 | fix/bug       | 5      | agent-runner.ts   | ??? Dropar ou recriar |

### Local Patches (Z total)

| Branch             | Original PR | Motivo          | Review em  |
| ------------------ | ----------- | --------------- | ---------- |
| local/my-fix       | #321        | rejected_need   | 2026-03-07 |
| local/custom-tweak | —           | wontfix         | 2026-04-01 |

### Audit de PRs Abertos

| #   | Título           | Flag                | Detalhe                          |
| --- | ---------------- | ------------------- | -------------------------------- |
| 123 | fix(foo): bar    | ?? resolved_upstream | upstream changed foo.ts 3d ago   |
| 456 | fix(baz): qux    | ?? duplicate_external | similar to #789 by @user         |
| 111 | fix(a): b        | ?? self_duplicate    | overlaps with our #222           |

### PRs Reabertos (restaurados automaticamente)

| #   | Título           | Origem              | A??o                    |
| --- | ---------------- | ------------------- | ----------------------- |
| 777 | fix(foo): bar    | notes.droppedPatches | ?? Restored to openPRs |
| 888 | feat(baz): qux   | localPatches         | ?? Promoted to openPRs |

_Se??o presente apenas quando há PRs reabertos no ciclo atual._

### PRs Recém-Fechados (aguardando decis?o)

| #   | Título           | Fechado em | Motivo              | Recomenda??o     |
| --- | ---------------- | ---------- | ------------------- | ---------------- |
| 999 | fix(foo): bar    | 2026-02-05 | resolved_upstream   | ??? Drop          |
| 888 | feat(baz): qux   | 2026-02-06 | rejected_need       | ?? Local patch   |

### Production Branch

- **Branch:** main-with-all-prs
- **Contains:** PRs #123, #456 + Local patches: local/my-fix, local/custom-tweak
- **Status:** ? Up to date / ?? Needs rebuild

### Recommended Actions

1. ...
2. ...
</CODE></PRE>
<H2 id=notas-importantes>Notas Importantes</H2>
<UL>
<LI>Sempre usar <CODE>--force-with-lease</CODE> em vez de <CODE>--force</CODE> para push</LI>
<LI>Sempre fazer backup antes de opera??es destrutivas</LI>
<LI>Use the project's package manager for build commands (bun/npm/yarn/pnpm)</LI>
<LI>Manter o config atualizado após cada opera??o</LI>
<LI><STRONG>Resolu??o automática de conflitos (requer <CODE>--auto-resolve</CODE> ou <CODE>autoResolveConflicts: true</CODE>):</STRONG> Quando ativa, após <CODE>rebase-all</CODE> 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. <STRONG>Conflitos semanticos</STRONG> (lógica de negócio) s?o resolvidos e pushed mas <STRONG>marcados no relatório como ?? para revis?o humana</STRONG>. Se o subagente n?o conseguir resolver, marca como ? e n?o faz push. <STRONG>Quando desativada</STRONG>, conflitos s?o apenas reportados.</LI>
<LI><STRONG>Conflitos persistentes (3+ ciclos):</STRONG> Quando um conflito persiste por 3+ execu??es consecutivas (tracked pelo sufixo "Nth cycle" em <CODE>notes.conflictBranches</CODE>), 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, <STRONG>mesmo que a resolu??o automática tenha sido tentada e falhado</STRONG>.</LI>
<LI><STRONG>Local patches s?o cidad?os de primeira classe:</STRONG> rebase, build e relatório incluem tanto PRs abertos quanto local patches</LI>
<LI><STRONG>Nunca remover automaticamente um PR fechado sem merge.</STRONG> Sempre passar pelo fluxo <CODE>review-closed</CODE> para decis?o do usuário</LI>
<LI><STRONG>Review dates em local patches:</STRONG> ao criar um local patch, definir uma data de revis?o (default: 30 dias). No <CODE>full-sync</CODE>, patches com review vencida s?o apresentados ao usuário para reavalia??o</LI>
<LI><STRONG>Naming convention para local patches:</STRONG> prefixo <CODE>local/</CODE> para distinguir de branches de PR (ex: <CODE>local/my-custom-fix</CODE>). A branch original pode ser renomeada ou mantida — o importante é que o config rastreie a branch correta</LI></UL>
<H3 id=??-proteger-arquivos-n?o-commitados-antes-de-opera??es-destrutivas>?? Proteger arquivos n?o-commitados antes de opera??es destrutivas</H3>
<P>Antes de qualquer opera??o que troca de branch ou deleta/recria branches (especialmente <CODE>build-production</CODE> e <CODE>full-sync</CODE>), <STRONG>sempre</STRONG> verificar e preservar arquivos unstaged, untracked e staged:</P><PRE><CODE class=language-bash>cd <localPath>

# 1. Checar se há arquivos em risco
git status --porcelain

# 2. Se houver arquivos modificados/untracked, fazer stash com untracked
git stash push --include-untracked -m "fork-manager: pre-sync stash $(date -u +%Y%m%dT%H%M%S)"

# 3. Executar a opera??o (rebase, checkout, merge, etc.)
# ...

# 4. Após concluir, restaurar o stash
git stash pop
</CODE></PRE>
<P><STRONG>Por quê?</STRONG> Ao deletar e recriar a branch de produ??o (<CODE>git branch -D <productionBranch></CODE>), arquivos que existiam apenas no working directory (n?o commitados) s?o perdidos permanentemente. Isso inclui:</P>
<UL>
<LI>Arquivos gerados (dashboards, history, state)</LI>
<LI>Arquivos de configura??o local (serve.ts, .env)</LI>
<LI>Dados acumulados (JSON, SQLite)</LI></UL>
<P><STRONG>Regra:</STRONG> Se <CODE>git status --porcelain</CODE> retornar qualquer saída, fazer <CODE>git stash --include-untracked</CODE> antes de prosseguir. Restaurar com <CODE>git stash pop</CODE> ao final.</P>
<H2 id=security-notice>Security Notice</H2>
<P>This skill performs operations that require broad filesystem and network access by design:</P>
<UL>
<LI><STRONG>Git operations</STRONG>: fetch, checkout, merge, rebase, push across multiple remotes and branches</LI>
<LI><STRONG>GitHub CLI</STRONG>: reads PR status, creates PRs, queries repo metadata <STRONG>Before using this skill on a repository:</STRONG></LI>
<LI>All git push operations use <CODE>--force-with-lease</CODE> (not <CODE>--force</CODE>) to prevent data loss</LI>
<LI>The skill always stashes uncommitted files before destructive branch operations</LI></UL>
<P>These capabilities are inherent to fork management and cannot be removed without breaking core functionality.</P>
<H2 id=usage-examples>Usage Examples</H2>
<H3 id=basic-sync>Basic sync</H3>
<P>User: "sync my fork of project-x"</P>
<P>Agent:</P>
<OL>
<LI>Load config from <CODE>$SKILL_DIR/repos/project-x/config.json</CODE></LI>
<LI>Run <CODE>status</CODE> to assess current state</LI>
<LI>If main is behind, run <CODE>sync</CODE></LI>
<LI>If PRs need rebase, run <CODE>rebase-all</CODE></LI>
<LI>Update <CODE>productionBranch</CODE> if needed</LI>
<LI>Remind user to rebuild if needed</LI>
<LI>Report results to user</LI></OL>
<H3 id=sync-with-auto-resolve>Sync with auto-resolve</H3>
<P>User: "/fork-manager --auto-resolve" or "/fork-manager full-sync --auto-resolve"</P>
<P>Agent:</P>
<OL>
<LI>Same as basic sync, but after <CODE>rebase-all</CODE>:</LI>
<LI>For each conflict, spawn a resolver subagent (Opus)</LI>
<LI>Collect results (trivial ? / semantic ?? / unresolvable ?)</LI>
<LI>Re-run <CODE>build-production</CODE> with resolved branches</LI>
<LI>Report includes resolution table with review flags</LI></OL>                                                        
                             
                           </div>
														                            <div class="lastanext flexRow">
							 							 							  <a class="lastart flexRow"  href="/wz/331778.html"  ><span>上一篇:</span><span>safe-web:结合 PromptGuard 的安全网页搜索与抓取 - Openclaw Skills</span></a>
							 							 
                             							                                 <a class="nextart flexRow"  href="/wz/331780.html" ><span>下一篇:</span><span>YouTube 字幕提取:获取视频文案与字幕 - Openclaw Skills</span></a>
							                             </div>
                        </div>
                        <div class="dtl-xgtj">
                            <div class="jb-titles flexRow">
                                <div class="jbtle-left flexRow"><b></b><p>相关推荐</p></div>
                                
                            </div>
                            <div class="tjlist flexRow">
														                                <div class="tj-item ">
                                    <div class="tjitemd">
									
                                        <div class="tjimd-top flexRow">
                                            <a class="imdta flexRow"  href="/wz/368335.html"  >
                                                                                        <img src="/jiaoben/image/noimg.png" >
                                                                                        </a>
                                            <div class="imdt-right flexColumn">
                                                <a class="imdtra flexRow overflowclass"  href="/wz/368335.html"  >AI开发新选择:阿里云百炼多模型自由切换实践分享</a>
                                                <a class="imdtrap flexRow overflowclass"  href="/wz/368335.html"  >
                                                                                                                                     阿里云百炼CodingPlan支持Qwen3.5、GLM-5、MiniMax M2.5、Kimi K2.5四大开源模型无缝切换,统一API、智能路由、上下文连贯。技术文档、代码审查、项目规划等场景灵活调用,按需付费(轻量版首月7.9元),降本增效,降低AI开发门槛。(239字)
                                                                                                                </a>
                                            </div>
                                        </div>
									
                                        <div class="tjimd-down flexRow">
                                            <div class="imdd-tab flexRow">
                                                <p class="imddt-time flexRow"><b></b><span>2026-04-18</span></p>
                                                
                                            </div>
                                            <a  href="/wz/368335.html"   class="imdd-more flexRow flexcenter"  >立即查看</a>
                                        </div>
                                    </div>
                                </div>
								                                <div class="tj-item ">
                                    <div class="tjitemd">
									
                                        <div class="tjimd-top flexRow">
                                            <a class="imdta flexRow"  href="/wz/368334.html"  >
                                                                                        <img src="/jiaoben/image/noimg.png" >
                                                                                        </a>
                                            <div class="imdt-right flexColumn">
                                                <a class="imdtra flexRow overflowclass"  href="/wz/368334.html"  >AI范式迁移,从“数据驱动”到“认知自主”的跨越</a>
                                                <a class="imdtrap flexRow overflowclass"  href="/wz/368334.html"  >
                                                                                                                                     当2026年全球AI领域的焦点从“参数规模比拼”转向“认知能力突破”,一个清晰的信号已然显现:人工智能正经历一场深刻的范式迁移,从依赖海量数据喂养的“被动学习”,迈向具备自主认知、逻辑推理与场景适配的“主动智能”。
                                                                                                                </a>
                                            </div>
                                        </div>
									
                                        <div class="tjimd-down flexRow">
                                            <div class="imdd-tab flexRow">
                                                <p class="imddt-time flexRow"><b></b><span>2026-04-18</span></p>
                                                
                                            </div>
                                            <a  href="/wz/368334.html"   class="imdd-more flexRow flexcenter"  >立即查看</a>
                                        </div>
                                    </div>
                                </div>
								                                <div class="tj-item ">
                                    <div class="tjitemd">
									
                                        <div class="tjimd-top flexRow">
                                            <a class="imdta flexRow"  href="/wz/368333.html"  >
                                                                                        <img src="/jiaoben/image/noimg.png" >
                                                                                        </a>
                                            <div class="imdt-right flexColumn">
                                                <a class="imdtra flexRow overflowclass"  href="/wz/368333.html"  >AI 教育平台的核心功能</a>
                                                <a class="imdtrap flexRow overflowclass"  href="/wz/368333.html"  >
                                                                                                                                     K12 AI教育平台已升级为全流程智能代理协作系统,聚焦“教师增强、学生自主、家校协同”。融合智适应学习、苏格拉底式AI导师、非侵入学情监测、教师数字助理、AR虚拟实验等七大核心功能,在保障安全伦理前提下,真正实现因材施教与减负增效。(239字)
                                                                                                                </a>
                                            </div>
                                        </div>
									
                                        <div class="tjimd-down flexRow">
                                            <div class="imdd-tab flexRow">
                                                <p class="imddt-time flexRow"><b></b><span>2026-04-18</span></p>
                                                
                                            </div>
                                            <a  href="/wz/368333.html"   class="imdd-more flexRow flexcenter"  >立即查看</a>
                                        </div>
                                    </div>
                                </div>
								                                <div class="tj-item ">
                                    <div class="tjitemd">
									
                                        <div class="tjimd-top flexRow">
                                            <a class="imdta flexRow"  href="/wz/368327.html"  >
                                                                                        <img src="/jiaoben/image/noimg.png" >
                                                                                        </a>
                                            <div class="imdt-right flexColumn">
                                                <a class="imdtra flexRow overflowclass"  href="/wz/368327.html"  >AI编程平民化趋势:从昂贵工具到普惠服务的转变</a>
                                                <a class="imdtrap flexRow overflowclass"  href="/wz/368327.html"  >
                                                                                                                                     近年来,AI编程工具加速平民化,价格大幅降低(如阿里云CodingPlan轻量版首月仅7.9元),推动开发门槛下降、生态繁荣。个人开发者、中小企业与教育领域广泛受益,市场呈现多样化、集成化、体验优化趋势。技术普惠正重塑软件开发未来。(238字)
                                                                                                                </a>
                                            </div>
                                        </div>
									
                                        <div class="tjimd-down flexRow">
                                            <div class="imdd-tab flexRow">
                                                <p class="imddt-time flexRow"><b></b><span>2026-04-18</span></p>
                                                
                                            </div>
                                            <a  href="/wz/368327.html"   class="imdd-more flexRow flexcenter"  >立即查看</a>
                                        </div>
                                    </div>
                                </div>
									
                                
								
                            </div>

                        </div>
                    </div>


                    <div class="cd-right dtlcd-right">
                        <div class="dtl-ht">
                            <div class="jb-titles flexRow">
                                <div class="jbtle-left flexRow"><b></b><p>专题</p></div>
                                
                            </div>
                            <div class="dtlht-list ">
							                                <div class="htl-item flexRow">
                                    <div class="htmitem-left">
                                        <div class="htiteml-top flexRow">
                                            <a href="/wz/zt-69351.html"  >#数据可视化</a>
                                            <span></span>
                                        </div>
                                        <a class="htiteml-down flexRow" href="/wz/zt-69351.html"  >数据可视化(Data Visu</a>
                                    </div>
                                    <p class="htmitem-right flexRow flexcenter gz" data-id="69351"  >+ 收藏</p>
                                </div>
							                                <div class="htl-item flexRow">
                                    <div class="htmitem-left">
                                        <div class="htiteml-top flexRow">
                                            <a href="/wz/zt-69342.html"  >#自然语言处理</a>
                                            <span></span>
                                        </div>
                                        <a class="htiteml-down flexRow" href="/wz/zt-69342.html"  >自然语言处理(Natural</a>
                                    </div>
                                    <p class="htmitem-right flexRow flexcenter gz" data-id="69342"  >+ 收藏</p>
                                </div>
							                                <div class="htl-item flexRow">
                                    <div class="htmitem-left">
                                        <div class="htiteml-top flexRow">
                                            <a href="/wz/zt-68363.html"  >#Excel公式</a>
                                            <span></span>
                                        </div>
                                        <a class="htiteml-down flexRow" href="/wz/zt-68363.html"  >Excel公式就是:用函数 +</a>
                                    </div>
                                    <p class="htmitem-right flexRow flexcenter gz" data-id="68363"  >+ 收藏</p>
                                </div>
							                                <div class="htl-item flexRow">
                                    <div class="htmitem-left">
                                        <div class="htiteml-top flexRow">
                                            <a href="/wz/zt-68355.html"  >#Excel技巧</a>
                                            <span></span>
                                        </div>
                                        <a class="htiteml-down flexRow" href="/wz/zt-68355.html"  >Excel是日常生活中必不可</a>
                                    </div>
                                    <p class="htmitem-right flexRow flexcenter gz" data-id="68355"  >+ 收藏</p>
                                </div>
							                                <div class="htl-item flexRow">
                                    <div class="htmitem-left">
                                        <div class="htiteml-top flexRow">
                                            <a href="/wz/zt-68081.html"  >#蛋仔派对</a>
                                            <span></span>
                                        </div>
                                        <a class="htiteml-down flexRow" href="/wz/zt-68081.html"  >蛋仔派对最新官方活动、关卡速</a>
                                    </div>
                                    <p class="htmitem-right flexRow flexcenter gz" data-id="68081"  >+ 收藏</p>
                                </div>
							                                <div class="htl-item flexRow">
                                    <div class="htmitem-left">
                                        <div class="htiteml-top flexRow">
                                            <a href="/wz/zt-68000.html"  >#人工智能</a>
                                            <span></span>
                                        </div>
                                        <a class="htiteml-down flexRow" href="/wz/zt-68000.html"  >人工智能(AI),简单说,就</a>
                                    </div>
                                    <p class="htmitem-right flexRow flexcenter gz" data-id="68000"  >+ 收藏</p>
                                </div>
								
                                


                            </div>
                        </div>


                        <div class="   dtl-zt">
                            <div class="jb-titles flexRow">
                                <div class="jbtle-left flexRow"><b></b><p>最新数据</p></div>
                               
                            </div>


                            <div class="wkch-downs">
																					                                <div class="weekch-top flexRow">
                                        <a class="wktpa flexRow" href="/wz/331785.html"  >
                                                                                     <img src="/jiaoben/image/noimg.png" >
                                                                                    </a>
                                    <div class="wktpa-right flexColumn">
                                        <a class="wktpara flexRow overflowclass"  href="/wz/331785.html"  >Molta:AI 智能体问答与协作平台 - Openclaw Skills</a>
                                        <a class="wktparp flexRow overflowclass"  href="/wz/331785.html"  >
                                                                                            什么是 Molta AI 问答平
                                                                                        
                                        </a>
                                    </div>
                                </div>
								
															
															
															
															
															
															
															
															
															
								
                                <div class="weekch-list">
                                										
																											<div class="weekch-con flexRow">
											<div class="weekch-icon flexRow"><b></b></div>
											<a  href="/wz/331784.html"  class="weekcha flexRow flexcenter overflowclass" >RAGLite: 本地优先的 RAG 缓存与混合搜索 - Openclaw Skills</a>
										</div>
										
																											<div class="weekch-con flexRow">
											<div class="weekch-icon flexRow"><b></b></div>
											<a  href="/wz/331783.html"  class="weekcha flexRow flexcenter overflowclass" >图书查询:搜索并检索书籍元数据 - Openclaw Skills</a>
										</div>
										
																											<div class="weekch-con flexRow">
											<div class="weekch-icon flexRow"><b></b></div>
											<a  href="/wz/331782.html"  class="weekcha flexRow flexcenter overflowclass" >Book Tailor: 本地服务发现与预订 - Openclaw Skills</a>
										</div>
										
																											<div class="weekch-con flexRow">
											<div class="weekch-icon flexRow"><b></b></div>
											<a  href="/wz/331781.html"  class="weekcha flexRow flexcenter overflowclass" >Moltfounders: AI 智能体团队协作市场 - Openclaw Skills</a>
										</div>
										
																											<div class="weekch-con flexRow">
											<div class="weekch-icon flexRow"><b></b></div>
											<a  href="/wz/331777.html"  class="weekcha flexRow flexcenter overflowclass" >预订整脊师:自动化整脊预约 - Openclaw Skills</a>
										</div>
										
																											<div class="weekch-con flexRow">
											<div class="weekch-icon flexRow"><b></b></div>
											<a  href="/wz/331776.html"  class="weekcha flexRow flexcenter overflowclass" >项目文档:ADR、PRD 与工作流 - Openclaw Skills</a>
										</div>
										
																											<div class="weekch-con flexRow">
											<div class="weekch-icon flexRow"><b></b></div>
											<a  href="/wz/331775.html"  class="weekcha flexRow flexcenter overflowclass" >qq经典农场手机版入口-2026QQ经典农场最新版入口</a>
										</div>
										
																											<div class="weekch-con flexRow">
											<div class="weekch-icon flexRow"><b></b></div>
											<a  href="/wz/331774.html"  class="weekcha flexRow flexcenter overflowclass" >MiniMax 提供商:将 MiniMax M2.1 集成到 OpenClaw - Openclaw Skills</a>
										</div>
										
																											<div class="weekch-con flexRow">
											<div class="weekch-icon flexRow"><b></b></div>
											<a  href="/wz/331773.html"  class="weekcha flexRow flexcenter overflowclass" >CalDAV CLI:管理 Google、iCloud 和 Yandex 日历 - Openclaw Skills</a>
										</div>
										
										
                                    
    
                                </div>
    
                            </div>
                           
                        </div>

                       
                        <div class="  dtl-wz">
                            <div class="jb-titles flexRow">
                                <div class="jbtle-left flexRow"><b></b><p>相关文章</p></div>
                                
                            </div>
                            <div class="blog-list">
							                                <a  href="/wz/358178.html"   class="bloga flexRow over"><p class="overflowclass">语音备忘录管理器:AI 驱动的转录与行动项提取 - Openclaw Skills</p><div class="blogtime"><span>04/</span>18</div></a>
							                                <a  href="/wz/358179.html"   class="bloga flexRow over"><p class="overflowclass">Thenvoi:多智能体消息传递与协作 - Openclaw 技能</p><div class="blogtime"><span>04/</span>18</div></a>
							                                <a  href="/wz/358180.html"   class="bloga flexRow over"><p class="overflowclass">Construction PM:面向 AI 智能体的项目管理 - Openclaw 技能</p><div class="blogtime"><span>04/</span>18</div></a>
							                                <a  href="/wz/358181.html"   class="bloga flexRow over"><p class="overflowclass">YouTube 自动字幕:AI 字幕生成与翻译 - Openclaw Skills</p><div class="blogtime"><span>04/</span>18</div></a>
							                                <a  href="/wz/358182.html"   class="bloga flexRow over"><p class="overflowclass">代币合约安全扫描器:智能合约风险分析 - Openclaw Skills</p><div class="blogtime"><span>04/</span>18</div></a>
							                                <a  href="/wz/358183.html"   class="bloga flexRow over"><p class="overflowclass">Shopify SEO 优化器:提升店铺排名 - Openclaw Skills</p><div class="blogtime"><span>04/</span>18</div></a>
							                                <a  href="/wz/358184.html"   class="bloga flexRow over"><p class="overflowclass">提示词润色器:专业的提示词工程 - Openclaw Skills</p><div class="blogtime"><span>04/</span>18</div></a>
							                                <a  href="/wz/358186.html"   class="bloga flexRow over"><p class="overflowclass">Meme Safe Scanner:加密货币链上安全审计 - Openclaw Skills</p><div class="blogtime"><span>04/</span>18</div></a>
							                                <a  href="/wz/358190.html"   class="bloga flexRow over"><p class="overflowclass">Bio Generator:自动化专业简历生成 - Openclaw Skills</p><div class="blogtime"><span>04/</span>18</div></a>
							                                <a  href="/wz/358192.html"   class="bloga flexRow over"><p class="overflowclass">AI 写作助手:专业内容自动化 - Openclaw Skills</p><div class="blogtime"><span>04/</span>18</div></a>
								
                                
                            </div>

                        </div>

                        <div class="cdr-ai">
                        <div class="jb-titles flexRow">
                            <div class="jbtle-left flexRow"><b></b><p>AI精选 </p></div>
							<a class="jbtitle-more flexRow" href="/category/list_344_1.html"  title=""><span>更多</span><b></b></a>
                        </div>
						                        <div class="ai-list">
                            <div class="ail-top flexRow">
																                                <a  href="/wz/368332.html"  title="" class="ailta ">
                                                                        <img src="https://images.jiaoben.net/uploads/20260418/logo_69e34c01884c81.jpg" >
                                                                        <p ><span>小溪边坦率的户外肖像</span></p></a>
																								                                <a  href="/wz/368331.html"  title="" class="ailta ">
                                                                        <img src="https://images.jiaoben.net/uploads/20260418/logo_69e34bf3bd46a1.jpg" >
                                                                        <p ><span>水彩猫和情人节纸杯蛋糕</span></p></a>
																																																																																																																																																                               
                            </div>
                            <div class="ail-down">
																																																						<a class="ali-con flexRow"  href="/wz/368322.html"  title="">
										<div class="alicon-left flexRow"><span>精选</span></div>
										<p class="aliconp overflowclass">电影求婚场景(身份锁定)</p>
									</a>
																																<a class="ali-con flexRow"  href="/wz/368320.html"  title="">
										<div class="alicon-left flexRow"><span>精选</span></div>
										<p class="aliconp overflowclass">Megan Fox 情人节美妆大片</p>
									</a>
																																<a class="ali-con flexRow"  href="/wz/368310.html"  title="">
										<div class="alicon-left flexRow"><span>精选</span></div>
										<p class="aliconp overflowclass">分解玉米饼商业可视化</p>
									</a>
																																<a class="ali-con flexRow"  href="/wz/368273.html"  title="">
										<div class="alicon-left flexRow"><span>精选</span></div>
										<p class="aliconp overflowclass">水下奢华护肤品广告</p>
									</a>
																																<a class="ali-con flexRow"  href="/wz/368272.html"  title="">
										<div class="alicon-left flexRow"><span>精选</span></div>
										<p class="aliconp overflowclass">商务人士超逼真企业形象照</p>
									</a>
																																<a class="ali-con flexRow"  href="/wz/368261.html"  title="">
										<div class="alicon-left flexRow"><span>精选</span></div>
										<p class="aliconp overflowclass">可爱泡泡玛特中国新年羊驼</p>
									</a>
																																<a class="ali-con flexRow"  href="/wz/368260.html"  title="">
										<div class="alicon-left flexRow"><span>精选</span></div>
										<p class="aliconp overflowclass">东亚女性电影感落日肖像</p>
									</a>
																																<a class="ali-con flexRow"  href="/wz/368248.html"  title="">
										<div class="alicon-left flexRow"><span>精选</span></div>
										<p class="aliconp overflowclass">超逼真传统纱丽肖像</p>
									</a>
															                               
                            </div>
                        </div>

                    </div>
    
						<div class="cdr-blog">
							<div class="jb-titles flexRow">
								<div class="jbtle-left flexRow"><b></b><p>脚本推荐</p></div>
								
							</div>
							<div class="blog-list">
															<a href="/wz/zt-49225.html" title="" class="bloga flexRow over"><p class="overflowclass">SeeDance 2.0 Video Creator专区</p></a>
															<a href="/wz/zt-49224.html" title="" class="bloga flexRow over"><p class="overflowclass">OpenClaw AI专区</p></a>
															<a href="/wz/zt-49223.html" title="" class="bloga flexRow over"><p class="overflowclass">cowork专区</p></a>
															<a href="/wz/zt-49222.html" title="" class="bloga flexRow over"><p class="overflowclass">claude code skills专区</p></a>
								
					  
							</div>

						</div>

                    </div>
                </div>
            </div>
            
        </div>


    </main>
     <script>
        $(function() {
            // “+ 收藏”按钮点击事件
            $(document).on('click', '.htmitem-right, .ztop-right', function(e) {
                // 仅针对包含 “+ 收藏” 文字的按钮
                if ($(this).text().indexOf('+ 收藏') === -1) return;
                
                e.preventDefault();
                
                const id = $(this).data('id');
                if (!id) {
                    layer.msg('该项暂无有效ID,无法收藏');
                    return;
                }

                // 构造收藏 URL: 当前域名 + /wz/zt- + id + /
                const bookmarkUrl = window.location.origin + '/wz/zt-' + id + '.html';
                
                // 获取收藏标题 (优先从同级元素获取话题名称,否则使用页面标题)
                let bookmarkTitle = $(this).closest('.htl-item, .zttopd').find('a:first, span.overflowclass').text().trim() || document.title;
                if (bookmarkTitle.startsWith('#')) bookmarkTitle = bookmarkTitle.substring(1);

                // 浏览器收藏逻辑 (带 Fallback)
                try {
                    if (window.sidebar && window.sidebar.addPanel) { 
                        // Firefox < 23
                        window.sidebar.addPanel(bookmarkTitle, bookmarkUrl, "");
                    } else if (window.external && ('AddFavorite' in window.external)) { 
                        // IE
                        window.external.AddFavorite(bookmarkUrl, bookmarkTitle);
                    } else {
                        // Chrome, Safari, Firefox 23+, etc.
                        const isMac = /Mac/i.test(navigator.userAgent);
                        const keyStr = isMac ? 'Command + D' : 'Ctrl + D';
                        
                        layer.confirm('由于浏览器安全限制,请使用 <b>' + keyStr + '</b> 手动添加收藏。<br><br>收藏地址:<br><small>' + bookmarkUrl + '</small>', {
                            title: '收藏提示',
                            btn: ['复制链接', '知道了'],
                            yes: function(index) {
                                copyToClipboard(bookmarkUrl).then(() => {
                                    layer.msg('链接已复制,请手动添加到收藏夹');
                                }).catch(() => {
                                    layer.msg('复制失败,请手动选择复制');
                                });
                                layer.close(index);
                            }
                        });
                    }
                } catch (err) {
                    layer.msg('收藏失败,请手动添加');
                }
            });

            // 兼容非 HTTPS 的复制函数
            function copyToClipboard(text) {
                if (navigator.clipboard && window.isSecureContext) {
                    return navigator.clipboard.writeText(text);
                } else {
                    let textArea = document.createElement("textarea");
                    textArea.value = text;
                    textArea.style.position = "fixed";
                    textArea.style.left = "-999999px";
                    textArea.style.top = "-999999px";
                    document.body.appendChild(textArea);
                    textArea.focus();
                    textArea.select();
                    return new Promise((res, rej) => {
                        document.execCommand('copy') ? res() : rej();
                        textArea.remove();
                    });
                }
            }
        });
    </script>
<footer>
        <div class="foot ">
            <div class="foot-top flexRow">
                <div class="foot-left">
                    <div class="ftl-top flexRow"><span class="flexRow flexcenter">脚本</span>在线</div>
                    <p class="ftl-down">
                        智能赋能梦想,脚本构筑现实。我们致力于链接AI智能指令
                        与传统自动化,为您提供一站式、高效率的脚 本资产与生成
                        服务。
                    </p>
                </div>
                <div class="foot-right flexRow">
                    <div class="ftr-list flexColumn">
                        <p>核心板块</p>
                        <span>AI脚本库</span>
                        <span>自动化仓库</span>
                        <span>脚本实验室</span>
                    </div>
                    <div class="ftr-list flexColumn">
                        <p>关于我们</p>
                        <a href="/category/list_229_1.html"   >最新游戏</a>
                        <span>商务合作</span>
                        <span>隐私政策</span>
                    </div>
                    <div class="ftr-list flexColumn">
                        <p>社区支持</p>
                        <span >API文档</span>
                        <a href="/category/list_334_1.html"   >攻略资讯</a>
                        <span>违规举报</span>
                    </div>
                </div>
            </div>
            <div class="foot-down flexColumn">
                <p>© 2026  jiaoben.net | 脚本在线 | 联系:jiaobennet2026@163.com</p>
                <p>备案:<a style="color: #7F7F7F;" href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">湘ICP备18025217号-11</a> </p>
            </div>
        </div>
    </footer>

    <div style="display:none;">
			<script type="text/javascript">
		  var _paq = window._paq = window._paq || [];
		  _paq.push(['trackPageView']);
		  _paq.push(['enableLinkTracking']);

		  (function() {
			var u="//tongji.zhangwan.net/";
			_paq.push(['setTrackerUrl', u+'matomo.php']);
			_paq.push(['setSiteId', '29']);

			// Add this code below within the Matomo JavaScript tracker code
			// Important: the tracker url includes the /matomo.php
			var secondaryTrackerUrl = u+'matomo.php';
			var secondaryWebsiteId = 27;
			// Also send all of the tracking data to this other Matomo server, in website ID 77
			_paq.push(['addTracker', secondaryTrackerUrl, secondaryWebsiteId]);
			// That's it!
			var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
			g.type='text/javascript'; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
		  })();
		</script>
	    <script>
        var _hmt = _hmt || [];
        (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?5d3cfe1f36b1988029fe82a0d475b20d";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
        })();
    </script>
	
</div>  </body>
</html>