setup-project
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSkill: setup-project
Skill: setup-project
Você configura, uma vez por repositório, os contratos que o resto do pipeline lê em runtime. Sem eles as outras skills param com erro — de propósito, para falhar alto em vez de adivinhar.
O output são os arquivos abaixo. Os três primeiros são o contrato que o resto do pipeline lê; o restante é o que faz o PR chegar decidível sem abrir o diff.
- arquivo de instruções — três seções curtas: ,
## Issue Tracker,## Commands## Fluxo - — o detalhe pesado (comandos do tracker, tabela de labels)
docs/agents/issue-tracker.md - — o mapa do código que
docs/agents/architecture.md,to-spec,to-ticketse revisor leem (Parte 5)implementer - — critérios deste projeto e os caminhos extras de risco (Parte 6). Sempre criado.
docs/agents/review-rules-projeto.md - — as seções Como foi testado, Risco e Como desfazer (Parte 7)
.github/pull_request_template.md - — os gates de
.github/workflows/ci.ymle, em projeto Node,## Commands(Parte 7)npm audit
Qual é o arquivo de instruções: na raiz — o formato que a maioria das ferramentas de agente lê. Se o repo já tem e não tem , use o existente em vez de criar um segundo arquivo.
AGENTS.mdCLAUDE.mdAGENTS.mdCLAUDE.mdFerramenta que não lê sozinha: crie o ponteiro — não basta avisar, porque sem ele a seção nunca entra no contexto. Descubra a ferramenta pela pasta onde as skills do pipeline foram instaladas. Skills em → é o Claude Code: crie na raiz com a linha , ou acrescente essa linha ao existente se ela faltar. Outra ferramenta com arquivo próprio → a mesma ideia, na convenção dela. Informe o que criou.
AGENTS.md## Fluxo.claude/skills/CLAUDE.md@AGENTS.mdCLAUDE.mdO arquivo de instruções entra no contexto de toda conversa — mantê-lo enxuto importa. O detalhe fica isolado num arquivo que só quem precisa vai ler.
Sete partes, nesta ordem.
O que você pergunta, e o que não. O dono do repositório pode não ler código. Pergunte só decisões de processo: qual tracker, qual vocabulário de labels, qual o limiar do . O que é técnico — comandos do tracker, script , mapa do código, critérios de review — você decide, grava e informa em uma linha, sem pedir aprovação de rascunho.
## Fluxoclean你每个仓库只需配置一次 pipeline 在运行时读取的契约。缺少这些契约,其他 skills 会故意报错——宁可明确失败,也不要猜测。
输出为下列文件。前三个是 pipeline 其余部分在运行时读取的契约;其余文件用于让 PR 无需打开 diff 也能做出决策。
- 指令文件——三个简短章节:、
## Issue Tracker、## Commands## Fluxo - ——详细配置(tracker 命令、labels 表)
docs/agents/issue-tracker.md - ——供
docs/agents/architecture.md、to-spec、to-tickets和 reviewer 读取的代码地图(第 5 部分)implementer - ——本项目的标准以及额外的风险路径(第 6 部分)。始终创建。
docs/agents/review-rules-projeto.md - ——包含“如何测试”“风险”和“如何回滚”的章节(第 7 部分)
.github/pull_request_template.md - ——包含
.github/workflows/ci.yml中的 gates;对于 Node 项目,还包含## Commands(第 7 部分)npm audit
**哪个是指令文件:**根目录下的 ——这是大多数 Agent 工具都会读取的格式。如果仓库已有 但没有 ,则使用现有的 ,不要创建第二个文件。
AGENTS.mdCLAUDE.mdAGENTS.mdCLAUDE.md**无法自行读取 的工具:**创建指针——仅作提醒不够,因为没有指针, 章节就永远无法进入上下文。通过 pipeline 的 skills 安装目录判断所用工具。如果 skills 位于 ,则说明是 Claude Code:在根目录创建 并写入 这一行;如果已有 但缺少该行,则追加进去。对于使用自有文件的其他工具,也采用相同思路,但遵循其自身约定。说明你创建了什么。
AGENTS.md## Fluxo.claude/skills/CLAUDE.md@AGENTS.mdCLAUDE.md指令文件会进入每次对话的上下文,因此保持精简很重要。详细内容应隔离到单独文件中,只让确实需要的人读取。
以下七个部分必须按此顺序处理。
**该询问什么,不该询问什么。**仓库所有者可能不读代码。只询问流程决策:使用哪个 tracker、使用什么 labels 词汇表、 的阈值是什么。技术事项——tracker 命令、 script、代码地图、review 标准——由你决定、记录并用一行说明,无需请求用户批准草稿。
## FluxocleanPortabilidade dos comandos — regra dura
命令可移植性——硬性规则
O pipeline roda em Bash e em PowerShell. Todo comando que você documentar — e todo comando que outra skill lê daqui — tem que rodar nos dois:
- Nada de composição de shell: ,
||,&&,$(...), pipe,2>/dev/null. Quando um passo depende do resultado do anterior, documente como passos separados: "rode X, leia a saída, use-a em Y".VAR=... - Corpo de issue, comentário e PR vai por , nunca
--body-file <arquivo>. Markdown tem crase, aspas,--body "...",$e!, e escapar isso inline quebra de jeitos diferentes em cada shell. O arquivo fica em&..scratch/
pipeline 同时运行于 Bash 和 PowerShell。你记录的所有命令,以及其他 skills 从此处读取的所有命令,都必须能在两者中运行:
- 禁止 shell 组合:、
||、&&、$(...)、pipe、2>/dev/null。当一个步骤依赖前一步的结果时,应将其记录为独立步骤:“运行 X,读取输出,在 Y 中使用它”。VAR=... - Issue、评论和 PR 正文必须通过 传入,绝不能使用
--body-file <arquivo>。Markdown 中可能包含反引号、引号、--body "..."、$和!,内联转义这些字符会在不同 shell 中以不同方式破坏命令。文件放在&中。.scratch/
O modelo de artefatos
产物模型
Independente do tracker, a hierarquia é sempre a mesma — muda só como ela é materializada:
| Conceito | Gerado por | GitHub / Linear | Markdown local |
|---|---|---|---|
| Spec — um objetivo inteiro | | Issue | Arquivo no nível da feature |
| Ticket — uma fatia vertical da spec | | Sub-issue daquela issue | Arquivo em |
Com tracker real, a issue é canônica. e também deixam uma cópia de trabalho em , que é ignorada pelo git — serve para organizar e reler a unidade em curso sem uma chamada de rede a cada leitura. Cópia de trabalho não é fonte de verdade: divergiu, vale a issue, e pode ser apagado a qualquer momento sem perda.
to-specto-tickets.scratch/<slug>/.scratch/Com markdown local, o arquivo em é a própria fonte de verdade, e nada é publicado.
.scratch/Em nenhum dos dois modos existe uma segunda cópia versionada no repo. Documentação de spec commitada em diverge da issue e depois ninguém sabe qual vale.
docs/无论使用哪种 tracker,层级结构始终相同,区别仅在于如何具体实现:
| 概念 | 生成方 | GitHub / Linear | 本地 Markdown |
|---|---|---|---|
| Spec——一个完整目标 | | Issue | feature 目录下的文件 |
| Ticket——spec 的一段纵向切片 | | 该 Issue 的 Sub-issue | feature 目录内 |
使用真实 tracker 时,Issue 是唯一事实来源。 和 还会在被 git 忽略的 中留下工作副本,用于组织并重新读取当前工作单元,而无需每次读取都发起网络请求。工作副本不是事实来源:如果发生分歧,以 Issue 为准; 可随时删除,不会造成损失。
to-specto-tickets.scratch/<slug>/.scratch/使用本地 Markdown 时, 中的文件本身就是唯一事实来源,不会发布任何内容。
.scratch/无论采用哪种模式,仓库中都不会存在第二份受版本控制的副本。将 spec 文档提交到 后,一旦它与 Issue 分歧,后续就没人能判断哪一份有效。
docs/O que o arquivo de instruções guarda — regra canônica
指令文件保存什么——规范规则
O arquivo de instruções não guarda fato que envelhece.
O critério não é o tamanho da seção — é se aquela informação envelhece sozinha. Decisão estável fica; fato que muda a cada PR vira ponteiro.
| Tipo de informação | Envelhece? | Onde mora |
|---|---|---|
Como o pipeline roda neste repo ( | não | arquivo de instruções |
| Como o deploy funciona; o resumo do design system que precede toda tarefa de UI | não | arquivo de instruções, curto, com ponteiro para o documento completo |
| O que o produto é, e quais são os requisitos | sim | |
| Estado atual do código: módulos, seams, invariantes | sim | |
| O que já foi construído, quantas telas existem, o que falta | sim | não mora em lugar nenhum: é o histórico do git e o quadro de issues |
Por que a regra existe: fato que muda a cada PR ("este repositório ainda não tem código", "o produto é uma landing de guias grátis") apodrece sozinho, e o arquivo de instruções não tem dono que o mantenha. Misturado com decisão estável, ele acaba descrevendo um produto que não existe mais e contradizendo o PRD real.
Ao gravar ou reconfigurar: se você encontrar uma seção , ou equivalente descrevendo o que já existe no código, substitua por um ponteiro e mova o conteúdo para o documento que tem dono.
## Status## Product指令文件不保存会自行过时的信息。
判断标准不是章节长度,而是该信息是否会自行变旧。稳定的决策可以保留;每次 PR 都会变化的事实则应改为指针。
| 信息类型 | 会过时吗? | 存放位置 |
|---|---|---|
pipeline 如何在此仓库中运行( | 否 | 指令文件 |
| deploy 如何运行;每项 UI 任务之前都要阅读的 design system 摘要 | 否 | 指令文件,简要记录并指向完整文档 |
| 产品是什么,以及有哪些需求 | 是 | |
| 代码当前状态:模块、seams、不变量 | 是 | |
| 已经构建了什么、有多少页面、还缺少什么 | 是 | 不存放在任何固定位置:这些信息属于 git 历史和 Issue 看板 |
**设置该规则的原因:**每次 PR 都会变化的事实(例如“这个仓库目前还没有代码”“产品是一个免费指南的 landing page”)会自行失效,而指令文件没有专人维护。将这些事实与稳定决策混在一起,最终只会描述一个已经不存在的产品,并与真实 PRD 冲突。
写入或重新配置时,如果发现 、 或同类章节正在描述代码中已经存在的内容,请将其替换为指针,并把内容移动到有明确维护者的文档中。
## Status## ProductParte 1 — Issue tracker
第 1 部分——Issue Tracker
1. Explorar antes de perguntar
1. 先探索,再询问
Antes de fazer qualquer pergunta, levante o estado atual do repositório:
- — há remote? Aponta para GitHub, GitLab, ou outro host?
git remote -v - ou
AGENTS.mdna raiz — já existe uma seçãoCLAUDE.md? Se sim, essa é uma reconfiguração, não um setup do zero.## Issue Tracker - — já existe, mesmo que a seção no arquivo de instruções tenha sido apagada? Sinal de configuração anterior a recuperar ou substituir.
docs/agents/issue-tracker.md - — já existem pastas de feature aqui? Sinal de que uma convenção de markdown local já está em uso, mesmo sem registro formal.
.scratch/
进行任何询问之前,先查明仓库当前状态:
- ——是否配置了 remote?是否指向 GitHub、GitLab 或其他 host?
git remote -v - 根目录中的 或
AGENTS.md——是否已经存在CLAUDE.md章节?如果存在,说明这是重新配置,而不是从零 setup。## Issue Tracker - ——即使指令文件中的章节已被删除,该文件是否仍然存在?这是需要恢复或替换的旧配置线索。
docs/agents/issue-tracker.md - ——这里是否已经存在 feature 目录?这说明即使没有正式记录,也已经在使用本地 Markdown 约定。
.scratch/
2. Propor um default inferido, não abrir um menu em branco
2. 提出推断出的默认值,不要打开空白菜单
Com base na exploração, lidere com a recomendação e deixe o usuário aceitar em uma palavra ou trocar:
- Se o remote aponta para GitHub → proponha GitHub Issues
- Se não há remote configurado, ou já está em uso → proponha Markdown local
.scratch/ - Caso contrário, apresente as opções sem assumir: GitHub Issues (via ), Markdown local, Linear (via MCP), Jira, Outro / customizado
gh
Se já existir configuração anterior (seção no arquivo de instruções ou ), pergunte primeiro se é reconfiguração ou se deve manter a atual — não pule direto para a proposta de default.
docs/agents/issue-tracker.md根据探索结果主动给出推荐,让用户用一个词接受,或进行替换:
- 如果 remote 指向 GitHub,推荐 GitHub Issues
- 如果没有配置 remote,或者已经在使用 ,推荐 本地 Markdown
.scratch/ - 否则,在不预设的情况下给出选项:GitHub Issues(通过 )、本地 Markdown、Linear(通过 MCP)、Jira、其他/自定义
gh
如果已有旧配置(指令文件中的章节或 ),先询问这是重新配置,还是应该保持当前配置;不要直接跳到默认推荐。
docs/agents/issue-tracker.md3. Configurar de acordo com o tracker escolhido
3. 根据所选 tracker 进行配置
GitHub Issues
GitHub Issues
- Confirme autenticação:
gh auth status - Confirme remote: . Se não houver remote, pare e instrua a rodar o Bootstrap do
git remote -vprimeiro.to-prd - A spec vira uma issue; cada ticket vira uma sub-issue daquela issue, usando a relação nativa do GitHub.
⚠️ Onão tem comando nativo de sub-issue (verificado na 2.88.1: nemghnemgh issue createtêm flag de parent). O vínculo é feito pela API GraphQL, com a mutationgh issue edit. Documente os comandos abaixo literalmente — sem eles,addSubIssuepublica issues soltas e oto-ticketsnão acha os tickets da spec.implement
Comandos a documentar (com placeholders ):
{...}bash
undefined- 确认身份认证:
gh auth status - 确认 remote:。如果没有 remote,请停止并指导用户先运行 to-prd 的 Bootstrap。
git remote -v - Spec 变成一个 Issue;每个 Ticket 变成该 Issue 的 Sub-issue,使用 GitHub 的原生关系。
⚠️没有原生的 sub-issue 命令(已在 2.88.1 中确认:gh和gh issue create都没有 parent flag)。关联通过 GraphQL API 的gh issue editmutation 完成。请逐字记录以下命令——缺少它们,addSubIssue就会发布彼此独立的 Issues,而to-tickets将找不到 spec 对应的 tickets。implement
需要记录的命令(使用 作为占位符):
{...}bash
undefinedCriar spec — devolve a URL da issue no stdout
Criar spec — devolve a URL da issue no stdout
gh issue create --title "{title}" --body-file {arquivo} --label "{label}"
gh issue create --title "{title}" --body-file {arquivo} --label "{label}"
Node ID da spec (necessário para vincular sub-issues)
Node ID da spec (necessário para vincular sub-issues)
gh issue view {spec-number} --json id -q .id
gh issue view {spec-number} --json id -q .id
Criar ticket — devolve a URL do ticket no stdout; leia-a e use no passo seguinte
Criar ticket — devolve a URL do ticket no stdout; leia-a e use no passo seguinte
gh issue create --title "{title}" --body-file {arquivo} --label "{label}"
gh issue create --title "{title}" --body-file {arquivo} --label "{label}"
Vincular o ticket como sub-issue da spec
Vincular o ticket como sub-issue da spec
gh api graphql -f query='
mutation($parent:ID!, $url:String!) {
addSubIssue(input:{issueId:$parent, subIssueUrl:$url}) { clientMutationId }
}' -f parent={spec-node-id} -f url={ticket-url}
gh api graphql -f query='
mutation($parent:ID!, $url:String!) {
addSubIssue(input:{issueId:$parent, subIssueUrl:$url}) { clientMutationId }
}' -f parent={spec-node-id} -f url={ticket-url}
Listar os tickets de uma spec (com o corpo, de onde sai o ## Blocked by)
Listar os tickets de uma spec (com o corpo, de onde sai o ## Blocked by)
gh api graphql -f query='
query($owner:String!, $repo:String!, $num:Int!) {
repository(owner:$owner, name:$repo) {
issue(number:$num) {
subIssues(first:50) {
nodes { number title state body labels(first:10){ nodes{ name } } }
}
}
}
}' -f owner={owner} -f repo={repo} -F num={spec-number}
gh api graphql -f query='
query($owner:String!, $repo:String!, $num:Int!) {
repository(owner:$owner, name:$repo) {
issue(number:$num) {
subIssues(first:50) {
nodes { number title state body labels(first:10){ nodes{ name } } }
}
}
}
}' -f owner={owner} -f repo={repo} -F num={spec-number}
Ver o pai (a spec) de um ticket — sem pai, parent vem null
Ver o pai (a spec) de um ticket — sem pai, parent vem null
gh api graphql -f query='
query($owner:String!, $repo:String!, $num:Int!) {
repository(owner:$owner, name:$repo) {
issue(number:$num) { parent { number title } }
}
}' -f owner={owner} -f repo={repo} -F num={ticket-number}
gh api graphql -f query='
query($owner:String!, $repo:String!, $num:Int!) {
repository(owner:$owner, name:$repo) {
issue(number:$num) { parent { number title } }
}
}' -f owner={owner} -f repo={repo} -F num={ticket-number}
Listar por label / ver / editar labels
Listar por label / ver / editar labels
gh issue list --label "{label}"
gh issue view {number}
gh issue edit {number} --add-label "{label}" --remove-label "{label}"
gh issue list --label "{label}"
gh issue view {number}
gh issue edit {number} --add-label "{label}" --remove-label "{label}"
Fechar (ticket aprovado)
Fechar (ticket aprovado)
gh issue close {number} --reason completed
`addSubIssue` aceita `subIssueUrl` no lugar do node ID do filho — por isso a URL que o `gh issue create` devolve serve direto, sem uma segunda consulta. O agente a lê do stdout e a passa no comando seguinte; não há variável de shell no meio.
**Bloqueio entre tickets não usa relação nativa**, mesmo o GitHub tendo uma. A fonte única é a seção `## Blocked by` do corpo de cada ticket: funciona igual em qualquer tracker, e uma fonte só não diverge. Por isso a query de tickets traz o `body`.gh issue close {number} --reason completed
`addSubIssue` 接受 `subIssueUrl`,因此可以直接使用 `gh issue create` 返回的 URL,无需再次查询。Agent 读取 stdout,并在下一条命令中传入;中间不使用 shell 变量。
**Tickets 之间的阻塞关系不使用原生关系**,即使 GitHub 提供了这种能力。唯一来源是每个 Ticket 正文中的 `## Blocked by` 章节:它适用于所有 tracker,而且单一来源不会产生分歧。因此,查询 tickets 时必须获取 `body`。Markdown local (.scratch/
)
.scratch/本地 Markdown(.scratch/
)
.scratch/- Uma pasta por feature:
.scratch/{feature-slug}/ - Spec — no nível da feature: . Corpo conforme o
.scratch/{feature-slug}/spec.mdque vive dentro da skill<spec-template>.to-spec - Tickets — um nível abaixo, em :
issues/, numerados a partir de.scratch/{feature-slug}/issues/{NN}-{slug}.mdem ordem de dependência (bloqueadores primeiro). Corpo conforme o01que vive dentro da skill<local-ticket-template>.to-tickets - O nível existe para separar tickets da spec, não para agrupar — o agrupamento já é a pasta da feature.
issues/ - Adicione ao
.scratch/se ainda não estiver. É espaço de trabalho da sessão, não documentação do projeto..gitignore - Comandos a documentar (usando as ferramentas do agente em vez de shell):
- Criar spec: escrever
.scratch/{feature-slug}/spec.md - Criar ticket: escrever
.scratch/{feature-slug}/issues/{NN}-{slug}.md - Listar: buscar em
\*\*Status:\*\* {label}.scratch/*/issues/*.md - Ver: ler o arquivo correspondente
- Editar label: editar o campo no corpo do arquivo
**Status:** - Fechar: editar o campo para
**Status:**closed - Vincular ticket à spec: gravar o ticket em dentro da pasta da spec
issues/ - Listar tickets da spec: ler
.scratch/{feature-slug}/issues/*.md - Ver pai: a spec é , na mesma pasta do ticket
.scratch/{feature-slug}/spec.md
- Criar spec: escrever
⚠️ Sem orquestração AFK neste modo. A skillgerencia estado por labels num tracker real; deimplementela só lê a cópia de trabalho da SPEC, nunca o.scratch/dos tickets. Markdown local serve para trabalho conduzido por você, consumido na própria sessão. Avise o usuário disso ao confirmar a escolha.**Status:**
- 每个 feature 一个目录:
.scratch/{feature-slug}/ - Spec——位于 feature 层级:。正文遵循
.scratch/{feature-slug}/spec.mdskill 内的to-spec。<spec-template> - Tickets——位于下一级 中:
issues/,从.scratch/{feature-slug}/issues/{NN}-{slug}.md开始编号,并按依赖顺序排列(阻塞项在前)。正文遵循01skill 内的to-tickets。<local-ticket-template> - 层级用于将 Tickets 与 Spec 区分开,而不是用于分组;分组已经由 feature 目录完成。
issues/ - 如果 中尚未包含
.gitignore,则添加。该目录是会话工作空间,不是项目文档。.scratch/ - 需要记录的命令(使用 Agent 工具而非 shell):
- 创建 Spec:写入
.scratch/{feature-slug}/spec.md - 创建 Ticket:写入
.scratch/{feature-slug}/issues/{NN}-{slug}.md - 列出:在 中查找
.scratch/*/issues/*.md\*\*Status:\*\* {label} - 查看:读取对应文件
- 编辑 label:编辑文件正文中的 字段
**Status:** - 关闭:将 字段编辑为
**Status:**closed - 将 Ticket 关联到 Spec:把 Ticket 写入 Spec 所在目录的 中
issues/ - 列出 Spec 的 Tickets:读取
.scratch/{feature-slug}/issues/*.md - 查看父项:Spec 是同一目录中的
.scratch/{feature-slug}/spec.md
- 创建 Spec:写入
⚠️ 此模式下没有 AFK 编排。skill 在真实 tracker 中通过 labels 管理状态;对于implement,它只读取 SPEC 的工作副本,绝不读取 Tickets 的.scratch/。本地 Markdown 用于由你引导的工作,并在当前会话中消费。确认选择时,请向用户说明这一点。**Status:**
Linear
Linear
- Confirme que o MCP do Linear está conectado (liste workspaces/times disponíveis para o usuário escolher).
- Registre: workspace, team key, e os comandos/tools MCP usados para criar e listar issues, vincular um ticket como sub-issue da spec, listar os tickets de uma spec e ver o pai de um ticket.
- 确认 Linear 的 MCP 已连接(列出可用 workspaces/times,供用户选择)。
- 记录:workspace、team key,以及用于创建和列出 Issues、将 Ticket 关联为 Spec 的 Sub-issue、列出 Spec 的 Tickets、查看 Ticket 父项的 MCP 命令/工具。
Jira
Jira
- Peça: base URL, project key, e método de autenticação já configurado (MCP ou API token).
- Registre os comandos/tools equivalentes a criar, listar, ver, editar labels, fechar, vincular ticket à spec, listar os tickets de uma spec e ver o pai de um ticket.
- 询问:base URL、project key,以及已配置的认证方式(MCP 或 API token)。
- 记录等效命令/工具:创建、列出、查看、编辑 labels、关闭、将 Ticket 关联到 Spec、列出 Spec 的 Tickets,以及查看 Ticket 的父项。
Outro / customizado
其他/自定义
- Descubra os comandos equivalentes a criar, listar, ver, editar labels, fechar, vincular ticket à spec, listar os tickets de uma spec e ver o pai de um ticket. Pergunte ao usuário só o que não der para descobrir (ex: qual sistema, onde está a credencial).
- 找出等效命令:创建、列出、查看、编辑 labels、关闭、将 Ticket 关联到 Spec、列出 Spec 的 Tickets,以及查看 Ticket 的父项。只询问无法自行发现的信息,例如使用什么系统、凭据存放在哪里。
4. Definir o vocabulário de labels de triagem
4. 定义分诊 labels 词汇表
Vocabulário padrão sugerido — apresente ao usuário para confirmação ou ajuste, não grave sem aprovação:
| Label | Significado |
|---|---|
| Pronta para um agente autônomo (AFK) implementar sem supervisão |
| Bloqueada — aguardando decisão ou ação humana |
| Ainda não avaliada por um maintainer |
| Agente no loop — implementando ou em review |
| Aprovada pelo revisor, aguardando merge (só SPEC ou issue sem tickets) |
ready-for-agentto-specto-ticketsimplementwontfixneeds-infoDuas propriedades deste vocabulário não são negociáveis:
- Os estados são exclusivos. Um card anda entre colunas, não acumula colunas. Toda transição remove o estado anterior. Adicionar sem remover deixa a issue em +
ready-for-agent+in-progressao mesmo tempo, e a detecção de estado doin-review— que pergunta "algo emimplement?" — fica verdadeira para sempre.in-progress - Não existe label de "concluída". Issue fechada já é essa informação. Uma label duplica o que o tracker já sabe e exige alguém para mantê-la — é mais um estado para desincronizar. Quem fecha depende do que a issue é: o ticket é fechado pelo
doneassim que o revisor aprova, e é isso que faz o progresso de sub-issues da SPEC andar durante a execução; a SPEC (ou a issue sem tickets) fecha no merge, peloimplementdo corpo do PR. Por issoCloses #Nsó aparece em SPEC ou issue sem tickets: um ticket vai dein-reviewdireto para fechado. A review é parte do loop e não ganha label própria.in-progress
Este é o único vocabulário de labels do pipeline. Nenhum agente define o seu próprio — e leem daqui.
implementreviewer建议使用以下默认词汇表——呈现给用户确认或调整,不要未经批准就写入:
| Label | 含义 |
|---|---|
| 已准备好,可由自主 Agent(AFK)在无人监督的情况下实现 |
| 已阻塞——正在等待人工决策或操作 |
| maintainer 尚未评估 |
| Agent 正在循环——实现或 review 中 |
| reviewer 已批准,正在等待 merge(仅适用于 SPEC 或没有 tickets 的 Issue) |
ready-for-agentto-specto-ticketsimplementwontfixneeds-info该词汇表有两个不可协商的属性:
- **状态互斥。**一个 card 在各状态之间移动,而不是同时累积多个状态。每次状态转换都必须移除上一个状态。如果只添加而不移除,Issue 就会同时处于 、
ready-for-agent和in-progress,而in-review的状态检测——即检查“是否存在implement”——将永远为真。in-progress - **不存在“已完成”label。**Issue 已关闭本身就代表完成。label 会重复 tracker 已经知道的信息,还需要有人维护它——这只会增加一个可能失去同步的状态。由谁关闭取决于 Issue 的类型:Ticket 在 reviewer 批准后由
done立即关闭,这会推动执行期间 SPEC 的 Sub-issue 进度;SPEC(或没有 tickets 的 Issue)在 merge 时通过 PR 正文中的implement关闭。因此,Closes #N只出现在 SPEC 或没有 tickets 的 Issue 上:Ticket 会从in-review直接进入已关闭状态。Review 是循环的一部分,不使用单独的 label。in-progress
这是 pipeline 使用的唯一 labels 词汇表。任何 Agent 都不能定义自己的词汇表—— 和 都从这里读取。
implementreviewer5. Criar as labels no tracker (quando aplicável)
5. 在 tracker 中创建 labels(适用时)
Para Markdown local, não há nada a criar aqui — o vocabulário do passo 4 já é a única fonte de verdade, aplicado diretamente no campo do corpo de cada arquivo.
**Status:**Para GitHub Issues, crie (idempotente, sobrescreve se já existir) as labels confirmadas no passo 4:
--forcebash
gh label create "ready-for-agent" --color "0E8A16" --description "Pronta para agente autônomo implementar" --force
gh label create "ready-for-human" --color "D93F0B" --description "Bloqueada, aguardando ação humana" --force
gh label create "needs-triage" --color "FBCA04" --description "Ainda não avaliada por um maintainer" --force
gh label create "in-progress" --color "1D76DB" --description "Agente no loop: implementação e review" --force
gh label create "in-review" --color "5319E7" --description "Aprovada, aguardando merge (SPEC ou issue sem tickets)" --forceAjuste os comandos ao vocabulário efetivamente confirmado — não à lista padrão, se o usuário customizou. Para Linear/Jira/outro, crie os labels/estados equivalentes pelas ferramentas daquele sistema, se o sistema exigir criação prévia.
对于本地 Markdown,无需在此创建任何内容——第 4 步的词汇表已经是唯一事实来源,直接应用于每个文件正文中的 字段。
**Status:**对于 GitHub Issues,创建第 4 步中已确认的 labels(命令具有幂等性, 会在 label 已存在时覆盖其配置):
--forcebash
gh label create "ready-for-agent" --color "0E8A16" --description "Pronta para agente autônomo implementar" --force
gh label create "ready-for-human" --color "D93F0B" --description "Bloqueada, aguardando ação humana" --force
gh label create "needs-triage" --color "FBCA04" --description "Ainda não avaliada por um maintainer" --force
gh label create "in-progress" --color "1D76DB" --description "Agente no loop: implementação e review" --force
gh label create "in-review" --color "5319E7" --description "Aprovada, aguardando merge (SPEC ou issue sem tickets)" --force根据实际确认的词汇表调整命令,不要始终使用默认列表,即使用户进行了自定义。对于 Linear、Jira 或其他系统,如果系统要求预先创建 labels/状态,则通过对应系统的工具创建等效项。
6. Gravar
6. 写入
docs/agents/issue-tracker.mdmarkdown
undefineddocs/agents/issue-tracker.mdmarkdown
undefinedIssue Tracker
Issue Tracker
Tracker: [github-issues | markdown-local | linear | jira | outro]
Orquestração AFK: [sim | não — markdown-local não suporta]
Tracker: [github-issues | markdown-local | linear | jira | outro]
Orquestração AFK: [sim | não — markdown-local não suporta]
Estrutura
Estrutura
Spec: [onde a spec é publicada]
Tickets: [onde os tickets são publicados, e como se ligam à spec]
Spec: [onde a spec é publicada]
Tickets: [onde os tickets são publicados, e como se ligam à spec]
Comandos
Comandos
Criar spec: [comando/operação exata com placeholders]
Criar ticket: [comando/operação exata com placeholders]
Vincular ticket à spec: [comando/operação exata com placeholders]
Listar tickets da spec: [comando/operação exata com placeholders — traz estado, labels e corpo]
Ver pai: [comando/operação exata com placeholders]
Listar: [comando/operação exata com placeholders]
Ver: [comando/operação exata com placeholders]
Editar labels: [comando/operação exata com placeholders]
Fechar: [comando/operação exata com placeholders]
Bloqueio entre tickets: seção do corpo — fonte única, sem relação nativa.
## Blocked byCriar spec: [comando/operação exata com placeholders]
Criar ticket: [comando/operação exata com placeholders]
Vincular ticket à spec: [comando/operação exata com placeholders]
Listar tickets da spec: [comando/operação exata com placeholders — traz estado, labels e corpo]
Ver pai: [comando/operação exata com placeholders]
Listar: [comando/operação exata com placeholders]
Ver: [comando/operação exata com placeholders]
Editar labels: [comando/operação exata com placeholders]
Fechar: [comando/operação exata com placeholders]
Bloqueio entre tickets: seção do corpo — fonte única, sem relação nativa.
## Blocked byVocabulário de Labels
Vocabulário de Labels
| Label | Significado |
|---|---|
| ready-for-agent | ... |
| ... | ... |
**Arquivo de instruções** — bloco resumido:
```markdown| Label | Significado |
|---|---|
| ready-for-agent | ... |
| ... | ... |
**指令文件**——简要区块:
```markdownIssue Tracker
Issue Tracker
Tracker: [github-issues | markdown-local | linear | jira | outro]. Ver para estrutura, comandos e vocabulário de labels.
docs/agents/issue-tracker.md
Se a seção `## Issue Tracker` já existir no arquivo de instruções, **atualize o bloco in-place** — não duplique, não toque nas seções vizinhas do arquivo.
Esses dois arquivos juntos são o contrato que `to-spec`, `to-tickets` e o `implement` leem para saber onde e como publicar — mesmo espírito que `## Commands` cumpre para o `implementer`, mas com o detalhe pesado isolado fora do arquivo de instruções. Sem eles, essas skills devem parar com erro.Tracker: [github-issues | markdown-local | linear | jira | outro]. Ver para estrutura, comandos e vocabulário de labels.
docs/agents/issue-tracker.md
如果指令文件中已经存在 `## Issue Tracker` 章节,**请原地更新该区块**——不要创建重复内容,也不要修改相邻章节。
这两个文件共同构成 `to-spec`、`to-tickets` 和 `implement` 用于获知发布位置与方式的契约——其理念与 `## Commands` 对 `implementer` 的作用相同,但将详细内容隔离在指令文件之外。缺少它们时,这些 skills 必须停止并报错。Parte 2 — ## Commands
## Commands第 2 部分——## Commands
## CommandsO contrato de execução. O lê esta seção para saber o que rodar; sem ela, para com hard stop. O também a lê, mas só no Bootstrap, para medir a baseline.
implementerimplement这是执行契约。 会读取该章节以确定需要运行什么;如果缺少该章节,它会 hard stop。 也会读取,但仅在 Bootstrap 阶段用于测量 baseline。
implementerimplement1. Derivar, não perguntar
1. 推导,而不是询问
Leia o manifesto do projeto e extraia os comandos reais:
| Stack | Onde olhar |
|---|---|
| Node | |
| Rust | |
| Go | |
| Python | |
Ambiguidade também é sua de resolver, não do usuário. Repo com , e tem três candidatos e só um é o gate: escolha o que roda a suite inteira uma vez e termina — nunca o modo watch, que não termina, nem o e2e, lento demais para gate por task — e informe a escolha em uma linha.
testtest:watchtest:e2eRepo sem manifesto ainda — o caso do repo novo, antes da primeira SPEC: não há de onde derivar. Grave a seção só com o título e a linha , pule os passos 1b a 4 e informe isso na saída. Não escreva comando a partir da tabela Stack do PRD — é plano, e a seção nunca documenta comando que ainda não existe. É o mesmo tratamento do num repo sem código (Parte 5): o preenche a seção no mesmo commit em que o manifesto nasce, e a mantém quando muda um script de gate depois; o revisor cobra (CL6).
Nenhum label ainda: o implementer declara os comandos na unidade que criar o manifesto.architecture.mdimplementer读取项目 manifest,提取真实命令:
| Stack | 查看位置 |
|---|---|
| Node | |
| Rust | |
| Go | |
| Python | |
歧义同样由你解决,而不是交给用户。仓库同时包含 、 和 时,有三个候选项,但只有一个适合作为 gate:选择能够完整运行测试套件一次并结束的选项——绝不能选择不会结束的 watch 模式,也不能选择作为 task gate 过慢的 e2e——并用一行说明选择结果。
testtest:watchtest:e2e尚无 manifest 的仓库——即新仓库、第一次 SPEC 之前:此时没有内容可供推导。只写入章节标题和这一行:,跳过第 1b 至第 4 步,并在输出中说明。不要根据 PRD 中的 Stack 表编写命令——那只是计划,而该章节绝不记录尚不存在的命令。对于尚无代码的仓库, 也采用同样处理方式: 会在创建 manifest 的同一个 commit 中填写该章节,并在之后修改 gate script 时持续维护它;reviewer 会检查这一点(CL6)。
Nenhum label ainda: o implementer declara os comandos na unidade que criar o manifesto.architecture.mdimplementer1b. O quinto label: clean
clean1b. 第五个 label:clean
cleancleancleanQuem o usa: o roda no Bootstrap, antes de medir a baseline — é o que torna a foto honesta. E o o roda uma vez, quando um gate fica vermelho apontando para arquivo que o diff dele não tocou, antes de escalar.
implementcleanimplementerSe o manifesto não tiver um script de limpeza, crie um e informe em uma linha o que ele apaga — é decisão técnica, não pede aprovação:
| Stack | Proposta |
|---|---|
| Next.js | apagar |
| Vite | apagar |
| Rust | |
| Go | |
| Python | apagar |
⚠️ Portabilidade — regra dura. Use sempre o runtime da stack, nunca comandos de shell.não existe no PowerShell erm -rfnão existe no Bash; o pipeline roda nos dois. Em Node:rmdir /sjson"clean": "node -e \"require('fs').rmSync('.next',{recursive:true,force:true})\""Em Python,. Em Rust e Go, os comandos nativos já são portáteis.python -c "import shutil; shutil.rmtree(...)"Ofica no manifesto (oclean, opackage.json), e a linha dopyproject.tomlsó o invoca. Escrever o comando destrutivo inline na seção coloca um## Commandsnum arquivo de prosa que ninguém revisa.rm
Ordem obrigatória ao gravar: o script entra no manifesto junto ou antes da linha no . A seção nunca deve documentar um comando que ainda não existe.
## Commandscleanclean使用者: 在 Bootstrap 阶段运行 ,然后再测量 baseline,从而得到真实的基线。 则在某个 gate 变红、且红色结果指向其 diff 未触及的文件时运行一次,然后再进行升级处理。
implementcleanimplementer如果 manifest 中没有清理 script,请创建一个,并用一行说明它删除的内容——这是技术决策,不需要请求批准:
| Stack | 建议 |
|---|---|
| Next.js | 删除 |
| Vite | 删除 |
| Rust | |
| Go | |
| Python | 删除 |
⚠️ **可移植性——硬性规则。**始终使用 stack 的 runtime,绝不要使用 shell 命令。在 PowerShell 中不存在,rm -rf在 Bash 中也不存在;pipeline 必须同时支持两者。在 Node 中:rmdir /sjson"clean": "node -e \"require('fs').rmSync('.next',{recursive:true,force:true})\""在 Python 中,使用。在 Rust 和 Go 中,原生命令已经具备可移植性。python -c "import shutil; shutil.rmtree(...)"保存在 manifest(clean、package.json)中,pyproject.toml中的一行只负责调用它。把破坏性命令直接写进该章节,会让未经审查的散文文件中出现## Commands。rm
**写入时的强制顺序:**script 必须与 中的命令同时写入,或先于它写入。该章节绝不记录尚不存在的命令。
## Commands2. Medir
2. 测量
Rode cada comando uma vez e cronometre — inclusive o . Você precisa do número para o passo seguinte, e uma medição também prova que o comando funciona neste repo — comando escrito no arquivo de instruções que não roda é o mesmo que não ter seção.
clean每个命令运行一次并计时—— 也包括在内。你需要这些数字来完成下一步;同时,测量也证明命令在此仓库中确实可以运行——写入指令文件却无法运行的命令,等同于没有该章节。
clean3. Gravar
3. 写入
markdown
undefinedmarkdown
undefinedCommands
Commands
- lint:
<comando> - typecheck:
<comando> - build:
<comando> - test:
<comando> - clean: ← opcional
<comando>
Cinco labels, uma seção. **Não crie seções separadas para "CI" e "testes"** — a divisão faz o agente escolher qual ler, e escolha errada aqui produz um gate que passa sem ter rodado nada.
Se algum label não existir neste stack (projeto sem typecheck, por exemplo), omita a linha. Os agentes rodam os labels que existem, e o `clean` ausente só significa que o passo de limpeza é pulado — nada quebra.
> **`audit` não é um label desta seção.** Auditoria de dependência vive na CI, num checkout limpo. O motivo não é a ferramenta: vulnerabilidade não aparece porque alguém mexeu no manifesto, aparece porque publicaram um aviso sobre um pacote que já estava lá — e um gate que só roda quando o diff toca o manifesto nunca pega o caso comum. Quem grava `.github/workflows/ci.yml` é a Parte 7. Esta seção continua sem label `audit`, e sem uma segunda seção chamada "CI".- lint:
<comando> - typecheck:
<comando> - build:
<comando> - test:
<comando> - clean: ← opcional
<comando>
五个 labels,一个章节。**不要为“CI”和“测试”分别创建章节**——这种划分会让 Agent 不知道该读哪一部分,而在这里选错会导致某个 gate 什么都没运行却直接通过。
如果当前 stack 中不存在某个 label(例如项目没有 typecheck),省略对应行。Agents 只运行实际存在的 labels;缺少 `clean` 只意味着跳过清理步骤,不会造成任何问题。
> **`audit` 不是该章节中的 label。**依赖审计位于 CI 中,并应在干净的 checkout 中执行。原因不在于工具本身:漏洞并不总是在有人修改 manifest 后出现;有人发布了针对既有包的警告时,漏洞就会出现,而只在 diff 修改 manifest 时才运行的 gate 无法覆盖最常见的情况。写入 `.github/workflows/ci.yml` 是第 7 部分的职责。该章节仍不包含 `audit` label,也不创建第二个名为“CI”的章节。4. Reportar o custo ao usuário
4. 向用户报告成本
Mostre os tempos medidos e explique a consequência, porque ela define o comportamento do :
implementer- ,
lintetypechecksão o gate por task — rodam a cada task fechadatest - roda uma vez, no fim da unidade
build
Se a suite de passar de ~60s neste repo, avise o usuário: a esse custo ela sai do gate por task e passa a rodar junto do , uma vez no fim. Registre a exceção como uma linha logo abaixo da seção.
testbuild展示测得的时间并解释其影响,因为这会决定 的行为:
implementer- 、
lint和typecheck是 task gate——每完成一个 task 就运行test - 只在单元结束时运行一次
build
如果此仓库中的 suite 耗时超过约 60 秒,请提醒用户:达到该成本后,它会退出 task gate,改为与 一起在末尾运行一次。将该例外记录为紧接该章节下的一行。
testbuildParte 3 — ## Fluxo
## Fluxo第 3 部分——## Fluxo
## FluxoA recomendação que qualquer agente dá ao usuário quando um entendimento compartilhado é atingido — depois de um grill, ou de um pedido que virou conversa.
markdown
undefined这是任何 Agent 在形成共同理解后——经过 grill,或一次请求演变成对话后——向用户给出的推荐。
markdown
undefinedFluxo
Fluxo
Ao chegar num entendimento compartilhado de uma mudança, recomende uma das três saídas:
- Cabe numa sessão e não muda contrato público (schema, rota, auth, API) → direto, sem SPEC nem issue.
/implement - Muda contrato público, ou o registro rastreado importa → .
/to-spec - Mais de uma SPEC prevista → antes.
/to-prd
Recomende, não decida — a escolha é do usuário. Em qualquer das três, branch e PR sempre.
Confirme o critério com o usuário antes de gravar: o limiar entre "implementa direto" e "vira SPEC" é dele, não seu.
---Ao chegar num entendimento compartilhado de uma mudança, recomende uma das três saídas:
- Cabe numa sessão e não muda contrato público (schema, rota, auth, API) → direto, sem SPEC nem issue.
/implement - Muda contrato público, ou o registro rastreado importa → .
/to-spec - Mais de uma SPEC prevista → antes.
/to-prd
Recomende, não decida — a escolha é do usuário. Em qualquer das três, branch e PR sempre.
写入前与用户确认标准:“直接实现”和“转为 SPEC”之间的阈值属于用户,而不是你。
---Parte 4 — Remote e .gitignore
.gitignore第 4 部分——Remote 与 .gitignore
.gitignoreRemote: . Sem remote não há PR, e o loop de implementação encerra no bootstrap. Se não houver, crie agora () ou instrua o usuário — não siga adiante em silêncio.
git remote -vgh repo create.gitignore.scratch/Remote:。没有 remote 就无法创建 PR,实现循环也会在 Bootstrap 阶段结束。如果没有,请立即创建()或指导用户操作——不要在静默状态下继续。
git remote -vgh repo create**:**确保包含 这一行。工作副本按设计是临时性的;将其纳入版本控制会重新产生产物模型本应避免的重复。
.gitignore.scratch/Parte 5 — docs/agents/architecture.md
docs/agents/architecture.md第 5 部分——docs/agents/architecture.md
docs/agents/architecture.mdO mapa do código para os agentes: , , e revisor o leem para não redescobrir o repo a cada execução. Não é documento para o dono ler; quem o mantém é o , e quem cobra é o revisor (CL6) — a mesma posse que ele tem sobre .
to-specto-ticketsimplementerimplementer## CommandsSe ele já existe, não reescreva. Senão, explore o código e grave, curto:
markdown
undefined这是供 Agents 使用的代码地图:、、 和 reviewer 会读取它,避免每次执行都重新探索仓库。它不是给仓库所有者阅读的文档; 负责维护, 负责检查(CL6)——这与 对 的职责相同。
to-specto-ticketsimplementerimplementerreviewerimplementer## Commands如果文件已经存在,不要重写。否则,探索代码并简要写入:
markdown
undefinedArquitetura
Arquitetura
Mapa de módulos, seams de teste e invariantes deste repo. Documento vivo: o o atualiza quando uma unidade cria módulo ou camada, move um seam, muda uma fronteira ou um invariante.
implementerMapa de módulos, seams de teste e invariantes deste repo. Documento vivo: o o atualiza quando uma unidade cria módulo ou camada, move um seam, muda uma fronteira ou um invariante.
implementerOnde cada coisa mora
Onde cada coisa mora
| Área | Módulo | Nota |
|---|
| Área | Módulo | Nota |
|---|
Seams de teste
Seams de teste
[onde a lógica testável mora e onde os testes rodam; o seam preferido para código novo]
[onde a lógica testável mora e onde os testes rodam; o seam preferido para código novo]
Invariantes
Invariantes
[regras que nenhum lint pega e que o código respeita hoje — direção de dependência, fronteira servidor/cliente, onde input externo é validado]
Escreva só o que o código mostra hoje — não o que o PRD promete. Repo sem código ainda → grave só o esqueleto; o `implementer` preenche conforme os módulos nascem. Aponte para ele no arquivo de instruções, com uma linha fora das três seções do pipeline — ex: `Mapa do código (módulos, seams, invariantes): docs/agents/architecture.md`. Se já houver um ponteiro, não duplique. Informe em uma linha que o gravou.[regras que nenhum lint pega e que o código respeita hoje — direção de dependência, fronteira servidor/cliente, onde input externo é validado]
只记录当前代码所展示的内容——不要记录 PRD 所承诺的内容。仓库尚无代码时,只写入骨架;随着模块逐步创建,由 `implementer` 填充。使用一行将其从指令文件指向该文档,但放在 pipeline 的三个章节之外,例如:`Mapa do código (módulos, seams, invariantes): docs/agents/architecture.md`。如果已经存在指针,不要重复创建。用一行说明你已写入该文档。Parte 6 — docs/agents/review-rules-projeto.md
docs/agents/review-rules-projeto.md第 6 部分——docs/agents/review-rules-projeto.md
docs/agents/review-rules-projeto.mdO revisor aplica critérios universais — segurança, testes, limpeza, complexidade, code smells — que valem para qualquer stack. O que é deste projeto mora em : critério de framework ou de design system, caminho extra na classificação de risco do PR, e achado do revisor que se repetiu. O e o revisor leem esse arquivo. Ele deixa de ser opcional: todo projeto configurado por esta skill o tem.
docs/agents/review-rules-projeto.mdimplementArquivo ausente: grave o esqueleto abaixo. Arquivo presente: não reescreva critério que já está lá. Se faltar a seção , acrescente só ela no fim e avise. Se já existir, não mexa — o projeto pode ter estendido a lista.
## Risco## RiscoNão pergunte "a stack tem armadilhas?". Decida você. Se houver armadilha que nenhum lint pega (ex.: fronteira servidor/cliente num framework de SSR), grave poucos critérios concretos abaixo do esqueleto, no formato dos universais: código, regra, por quê, como checar por leitura, severidade. Se não houver, o esqueleto basta, e você informa que não acrescentou critério de stack. Critério que exige executar algo não entra: vira label de ou passo da CI.
## Commandsmarkdown
undefinedreviewer 会应用适用于任何 stack 的通用标准——安全性、测试、清理、复杂度、code smells。只适用于本项目的内容位于 :framework 或 design system 的标准、PR 风险分类中的额外路径,以及反复出现的 reviewer 发现。 和 reviewer 都会读取该文件。它不再是可选项:每个通过此 skill 配置的项目都必须拥有该文件。
docs/agents/review-rules-projeto.mdimplement**文件不存在:**写入以下骨架。**文件已存在:**不要重写已有标准。如果缺少 章节,只在末尾追加该章节并提醒用户。如果 已经存在,不要修改——项目可能已扩展该列表。
## Risco## Risco不要询问“这个 stack 有哪些陷阱?”由你自行决定。如果存在 lint 无法捕获的陷阱,例如 SSR framework 中的服务器/客户端边界,请在骨架下方写入少量具体标准,格式与通用标准一致:代码、规则、原因、如何通过阅读检查、严重级别。如果不存在此类陷阱,骨架即可,并说明未添加 stack 标准。需要执行某项操作才能验证的标准不属于这里:它应成为 中的 label 或 CI 中的步骤。
## Commandsmarkdown
undefinedCritérios de review do projeto
Critérios de review do projeto
Critérios que só fazem sentido neste repositório. O revisor lê este arquivo junto com os universais da skill . Cada critério: código, regra, por quê, como checar por leitura, severidade.
implementBug que chega na e achado que se repete em dois PRs entram aqui quando a correção for uma regra de review. O passo está no README do pipeline, seção "Quando um bug chega na main".
mainCritérios que só fazem sentido neste repositório. O revisor lê este arquivo junto com os universais da skill . Cada critério: código, regra, por quê, como checar por leitura, severidade.
implementBug que chega na e achado que se repete em dois PRs entram aqui quando a correção for uma regra de review. O passo está no README do pipeline, seção "Quando um bug chega na main".
mainRisco
Risco
A lista padrão do pipeline (skill , seção "Risco do PR") continua valendo e não se copia para cá. Os bullets abaixo só acrescentam caminhos. Nenhum bullet rebaixa um caminho que a lista padrão já marca como alto.
implementA lista padrão do pipeline (skill , seção "Risco do PR") continua valendo e não se copia para cá. Os bullets abaixo só acrescentam caminhos. Nenhum bullet rebaixa um caminho que a lista padrão já marca como alto.
implementAlto
Alto
Nenhum caminho extra.
Nenhum caminho extra.
Baixo
Baixo
Nenhum caminho extra.
Um bullet de extensão é um prefixo de caminho (`services/payments/`) ou um nome de arquivo (`billing.ts`). "Nenhum caminho extra." significa que a lista padrão basta; quando o projeto for estender, essa linha sai e entram os bullets.
---Nenhum caminho extra.
扩展项 bullet 是一个路径前缀(如 `services/payments/`)或文件名(如 `billing.ts`)。“Nenhum caminho extra.”表示默认列表已经足够;如果项目需要扩展,则删除该行并添加相应 bullets。
---Parte 7 — CI, template de PR e rótulos de risco
第 7 部分——CI、PR 模板与风险标签
O PR que o abre tem que chegar com três respostas que o dono lê sem o diff: como foi testado, qual é o risco, como desfazer. O template fixa as seções. A CI roda os gates num checkout limpo, fora da máquina de quem implementou. Os rótulos são o que a lista de PRs mostra.
implementrisk:*Nada disso é vocabulário de triagem. , e não entram na tabela de estados da Parte 1, não são exclusivos com e não vão no campo do markdown local. São rótulo de PR.
risk:altorisk:mediorisk:baixoin-progress**Status:**implementrisk:*这些内容不属于分诊词汇表。、 和 不进入第 1 部分的状态表,不与 互斥,也不会写入本地 Markdown 的 字段。它们是 PR 标签。
risk:altorisk:mediorisk:baixoin-progress**Status:**1. Não sobrescrever o que já existe
1. 不要覆盖已有内容
Antes de gravar, veja se o arquivo está no repo:
.github/pull_request_template.md- ou
.github/PULL_REQUEST_TEMPLATE.md— o GitHub aceita os três. Se qualquer um existir, o projeto já escolheu o template: não crie um segundo.docs/pull_request_template.md .github/workflows/ci.yml
Arquivo que já existe não é reescrito. Avise o caminho e, em uma linha, o que falta em relação ao que esta parte gravaria (as seções do template; no workflow, o job com os labels de e, em Node, o job ). Quem reconcilia é o dono. Setup que sobrescreve CI alheia troca workflow revisado por arquivo gerado. Arquivo ausente, crie. Diretório ausente, crie também.
gates## Commandsaudit.github/workflows/写入前,检查仓库中是否存在以下文件:
.github/pull_request_template.md- 或
.github/PULL_REQUEST_TEMPLATE.md——GitHub 接受这三种路径。如果其中任何一个已经存在,说明项目已经选择了模板:不要创建第二个。docs/pull_request_template.md .github/workflows/ci.yml
**已经存在的文件不得重写。**告知其路径,并用一行说明相对于本部分计划写入的内容还缺少什么;对于模板,是缺少的章节;对于 workflow,是包含 labels 的 job,以及 Node 项目中的 job。由仓库所有者负责协调。覆盖 CI 的 setup 会架空经过人工审查的 workflow 变更,转而采用生成文件。若文件不存在,则创建。如果 目录不存在,也一并创建。
## Commandsgatesaudit.github/workflows/2. Template de PR
2. PR 模板
Grave com estas seções, nesta ordem. O preenche as mesmas ao abrir o PR. O template é o que aparece para quem abre PR à mão.
.github/pull_request_template.mdimplementmarkdown
undefined写入 ,按以下顺序包含这些章节。 创建 PR 时会填写相同内容。该模板就是手动创建 PR 时所看到的内容。
.github/pull_request_template.mdimplementmarkdown
undefinedO que entrou
O que entrou
<!-- Em linguagem de produto: o que passou a funcionar. -->
<!-- Em linguagem de produto: o que passou a funcionar. -->
Como foi testado
Como foi testado
<!-- Gates de ## Commands, colados label por label. O que não rodou fica "não reportado". -->
<!-- Gates de ## Commands, colados label por label. O que não rodou fica "não reportado". -->
Risco
Risco
<!-- `risk:alto`, `risk:medio` ou `risk:baixo`, e o motivo pelos caminhos do diff. -->
<!-- `risk:alto`, `risk:medio` ou `risk:baixo`, e o motivo pelos caminhos do diff. -->
Como desfazer
Como desfazer
<!-- Antes do merge: fechar o PR. Depois: revert do merge e rollback do deploy. Migração de banco não volta com revert do git. -->
<!-- Antes do merge: fechar o PR. Depois: revert do merge e rollback do deploy. Migração de banco não volta com revert do git. -->
Achados do revisor
Achados do revisor
<!-- Cada achado com a resposta: corrigido, ou recusado com motivo. Apague a seção se não houver. -->
<!-- Cada achado com a resposta: corrigido, ou recusado com motivo. Apague a seção se não houver. -->
Ficou de fora
Ficou de fora
<!-- Follow-ups, e o que a baseline já tinha de vermelho. Apague a seção se não houver. -->
undefined<!-- Follow-ups, e o que a baseline já tinha de vermelho. Apague a seção se não houver. -->
undefined3. Workflow de CI
3. CI Workflow
Grave . Dispara em todo . Não dispare em só porque é comum: o contrato é o PR.
.github/workflows/ci.ymlpull_requestpushJob . Um passo por label de , exceto . apaga artefato local; o checkout da CI já é limpo. Copie o comando da seção literalmente — quando a seção diz é outro gate. Cada gate é um próprio. Sem e sem : gate vermelho falha o job.
gates## Commandscleancleannpm testnpm run test:cirun:||continue-on-errorAntes dos gates, o setup da stack:
| Stack | Antes dos gates |
|---|---|
Node ( | |
Rust ( | |
Go ( | |
Python ( | |
Pine a major (), nunca . Major nova dessas actions, quando sair, substitui a da tabela; não trave o workflow num patch.
@v7@mainEnvolva só os passos dos gates com os marcadores. O atualiza esse bloco quando muda, e não reescreve o resto do arquivo:
implementer## Commandsyaml
name: ci
on:
pull_request:
jobs:
gates:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
- run: npm ci
# pipeline:commands
- run: npm run lint
- run: npm run typecheck
- run: npm test
- run: npm run build
# pipeline:commands-fim
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm audit --audit-level=highO exemplo é Node com lockfile e os quatro labels. Gere o yaml da stack real. Label ausente em não vira passo.
## CommandsJob , só em projeto Node (existe ). Outra stack não ganha audit inventado — nem , nem — se o repo não usa essa ferramenta. O comando é : falha em e . e não falham o job. Aviso transitivo sem correção publicada deixaria todo PR vermelho, e ninguém age. É o mesmo nível que já cita. Com , instale com ; sem lock, , e avise que o resultado do audit não reproduz entre máquinas.
auditpackage.jsoncargo auditpip-auditnpm audit --audit-level=highhighcriticalmoderatelowreview-rules.mdpackage-lock.jsonnpm cinpm installRepo sem manifesto ( sem labels): grave o workflow mesmo assim. Job com checkout e, dentro dos marcadores, só o comentário de que o preenche os passos na unidade que criar o manifesto. Sem , sem job . O arquivo nasce aqui; o comando de gate nasce com o código — o mesmo trato do num repo sem código.
## Commandsgatesimplementerpackage.jsonauditarchitecture.mdNão coloque chave de API neste arquivo. Não coloque review de IA nem review de segurança de serviço pago. Gates declarados e, no Node, .
npm auditNão rode esta CI daqui. A Parte 2 já mediu os comandos; este workflow roda no GitHub, no PR.
写入 。在每次 时触发。不要仅因为 很常见就让它在 时触发:契约针对的是 PR。
.github/workflows/ci.ymlpull_requestpushpush** job。**为 中的每个 label 设置一个步骤,但不包括 。 删除本地 build 产物,而 CI 的 checkout 已经是干净的。逐字复制该章节中的命令——当章节写的是 时,复制成 就变成了另一个 gate。每个 gate 都使用独立的 。不要使用 ,也不要使用 :gate 失败必须导致 job 失败。
gates## Commandscleancleannpm run test:cinpm testrun:||continue-on-error在 gates 之前配置 stack 环境:
| Stack | Gates 之前 |
|---|---|
Node( | |
Rust( | |
Go( | |
Python( | |
固定 major(),绝不要使用 。这些 actions 发布新的 major 后,应使用表格中的新 major 替代旧版本;不要将 workflow 锁定在某个 patch 版本。
@v7@main仅用标记包裹 gates 步骤。 发生变化时, 会更新该区块,并且不会重写文件的其他部分:
## Commandsimplementeryaml
name: ci
on:
pull_request:
jobs:
gates:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
- run: npm ci
# pipeline:commands
- run: npm run lint
- run: npm run typecheck
- run: npm test
- run: npm run build
# pipeline:commands-fim
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm audit --audit-level=high该示例对应带 lockfile 和四个 labels 的 Node 项目。请生成真实 stack 对应的 YAML。 中不存在的 label 不会变成步骤。
## Commandsauditpackage.jsoncargo auditpip-auditnpm audit --audit-level=highhighcriticalmoderatelowreview-rules.mdpackage-lock.jsonnpm cinpm install没有 manifest 的仓库( 中没有 labels):仍然创建 workflow。 job 包含 checkout,并在标记内仅保留一条注释,说明 会在创建 manifest 的单元中填写步骤。没有 ,因此不添加 job。文件在此时创建;gate 命令则随代码一同产生——这与尚无代码仓库中的 采用相同处理方式。
## Commandsgatesimplementerpackage.jsonauditarchitecture.md不要在此文件中放入 API key。不要加入 AI review,也不要加入付费服务的安全 review。只配置已声明的 gates;对于 Node,再加入 。
npm audit不要从当前环境运行此 CI。第 2 部分已经测量过这些命令;此 workflow 会在 GitHub 上、针对 PR 运行。
4. Rótulos de risco
4. 风险标签
Com remote GitHub e autenticado, crie os três. é o que torna o comando idempotente: rótulo novo é criado, rótulo existente tem cor e descrição alinhadas a esta lista.
gh--forcebash
gh label create "risk:alto" --color "B60205" --description "PR toca migracao, auth, cobranca, CI ou deploy" --force
gh label create "risk:medio" --color "FBCA04" --description "PR fora das listas de alto e de baixo" --force
gh label create "risk:baixo" --color "0E8A16" --description "PR so de documentacao, texto ou estilo" --forceA descrição vai sem acento porque o que o dono lê no PR é a linha de , não esta string. O nome do rótulo é o contrato: , , .
## Riscorisk:altorisk:mediorisk:baixoSem , ou sem remote GitHub, não invente rótulo. Avise que a linha de risco no corpo do PR continua valendo e o rótulo espera um GitHub. Markdown local não tem rótulo de PR.
gh对于配置了 GitHub remote 且 已认证的仓库,创建以下三个标签。 使命令具备幂等性:新标签会被创建,已有标签的颜色和描述也会与该列表保持一致。
gh--forcebash
gh label create "risk:alto" --color "B60205" --description "PR toca migracao, auth, cobranca, CI ou deploy" --force
gh label create "risk:medio" --color "FBCA04" --description "PR fora das listas de alto e de baixo" --force
gh label create "risk:baixo" --color "0E8A16" --description "PR so de documentacao, texto ou estilo" --force描述不带重音符号,因为仓库所有者在 PR 中阅读的是 行,而不是该字符串。标签名称才是契约:、、。
## Riscorisk:altorisk:mediorisk:baixo如果没有 ,或者没有 GitHub remote,不要凭空创建标签。提醒用户:PR 正文中的风险行仍然有效,标签会等到有 GitHub 后再创建。本地 Markdown 没有 PR 标签。
gh5. O que não entra no arquivo de instruções
5. 不写入指令文件的内容
CI, template e rótulo de risco não ganham seção em . Workflow é arquivo, não decisão de processo, e o arquivo de instruções não guarda o que a Parte 2 já separou de propósito. Uma seção "CI" ao lado de continua proibida.
AGENTS.md## CommandsCI、模板和风险标签不会在 中获得章节。Workflow 是文件,不是流程决策;指令文件也不保存第 2 部分已经出于特定目的而分离出去的内容。禁止在 旁边创建“CI”章节。
AGENTS.md## CommandsSaída
输出
Ao finalizar, informe:
✅ Projeto configurado.Tracker: [tracker] — labels criadas: [lista]. Detalhe em. Commands: [lint [Ns] · typecheck [Ns] · test [Ns] · build [Ns] · clean [Ns | não declarado] | sem labels — repo sem manifesto; a unidade que criar o manifesto os declara] Fluxo: gravado no arquivo de instruções. Remote: [URL]. Arquitetura:docs/agents/issue-tracker.md[gerado | esqueleto — repo sem código | já existia]. Ponteiro: [docs/agents/architecture.md→CLAUDE.mdcriado | não necessário]. Critérios do projeto:@AGENTS.md[criado | já existia;docs/agents/review-rules-projeto.mdacrescentada | já existia com## Risco, não mexi]. Critérios de stack acrescentados: [N | nenhum]. Template de PR: [## Riscocriado | já existia em [caminho], não mexi. Falta: [seções, ou "nada"]]. CI: [.github/pull_request_template.mdcriado — gates: [labels] · audit: [sim,.github/workflows/ci.yml| não — repo sem--audit-level=high] | já existia, não mexi. Falta: [o que diverge, ou "nada"]]. Rótulos de risco: [package.json,risk:alto,risk:medio| não criados — sem GitHub].risk:baixoPróximo passo:para registrar uma unidade de trabalho, ou/to-specdireto se a mudança for pequena. Loop AFK: [disponível via/implement| indisponível neste modo]./implement
完成时告知:
✅ 项目已配置。Tracker:[tracker]——已创建 labels:[列表]。详情见。 Commands:[lint [Ns] · typecheck [Ns] · test [Ns] · build [Ns] · clean [Ns | 未声明] | 无 labels——仓库没有 manifest;创建 manifest 的单元将声明这些 commands] **Fluxo:**已写入指令文件。 Remote:[URL]。 架构:docs/agents/issue-tracker.md[已生成 | 骨架——仓库没有代码 | 已存在]。 指针:[docs/agents/architecture.md→CLAUDE.md已创建 | 不需要]。 项目标准:@AGENTS.md[已创建 | 已存在;已添加docs/agents/review-rules-projeto.md| 已存在且包含## Risco,未修改]。已添加 stack 标准:[N | 无]。 PR 模板:[## Risco已创建 | 已存在于 [路径],未修改。缺少:[章节,或“无”]]。 CI:[.github/pull_request_template.md已创建——gates:[labels] · audit:[是,.github/workflows/ci.yml| 否——仓库没有--audit-level=high] | 已存在,未修改。缺少:[差异内容,或“无”]]。 风险标签:[package.json、risk:alto、risk:medio| 未创建——没有 GitHub]。risk:baixo下一步:使用登记一个工作单元;如果改动较小,则直接使用/to-spec。AFK 循环:[可通过/implement使用 | 此模式下不可用]。/implement