Descrição
O comando fill remove o frontmatter YAML dos arquivos de docs/ e agents/ após preencher o conteúdo, e o listToFill (MCP) não verifica o campo status — lista todos os arquivos incondicionalmente. Isso cria um loop destrutivo onde o usuário/agente sempre acha que precisa rodar fill novamente, sobrescrevendo conteúdo já preenchido.
Versão
@ai-coders/context@0.7.0
Passos para Reproduzir
# 1. Init limpo
npx @ai-coders/context@latest init . both -v
# 2. Verificar que frontmatter foi criado corretamente
head -5 .context/docs/architecture.md
# Output:
# ---
# type: doc
# name: architecture
# description: System architecture...
# category: architecture
# 3. Fill com provider Google
export GOOGLE_API_KEY="..."
npx @ai-coders/context@latest fill . -v --provider google
# 4. Verificar frontmatter após fill
head -5 .context/docs/architecture.md
# Output:
# # Architecture Notes ← FRONTMATTER FOI REMOVIDO
#
# The OABot system is designed...
# 5. Verificar status nos agents
grep "^status:" .context/agents/*.md
# Resultado: apenas 5 de 14 agents têm status, e o valor é "active" (não "filled")
# 6. Via MCP, listToFill reporta TODOS como pendentes
# (sempre retorna 23 arquivos independente do status)
Comportamento Esperado
- Após
fill, docs e agents deveriam manter frontmatter com status: filled
listToFill deveria filtrar arquivos que já têm status: filled
- Re-executar
fill não deveria sobrescrever conteúdo já preenchido
Comportamento Atual
fill remove o frontmatter via removeFrontMatter() em fillService.js:processTarget()
listToFill lista todos os .md sem verificar status (em fillScaffoldingTool.js)
collectTargets() processa todos os arquivos sem filtrar por needsFill()
- Agents recebem
status: active (quando o LLM gera frontmatter) em vez de status: filled
Análise do Source Code
1. fillService.js — processTarget() (~linha 150)
// Remove front matter from filled content (status: unfilled marker)
const cleanContent = removeFrontMatter(updatedContent);
await fs.writeFile(target.fullPath, this.ensureTrailingNewline(cleanContent));
O frontmatter é intencionalmente removido. Mas isso significa que docs/agents perdem todo o metadata.
2. fillScaffoldingTool.js — listFilesToFillTool
const docFiles = await fs.readdir(docsDir);
for (const file of docFiles) {
if (!file.endsWith('.md')) continue;
files.push({ path, relativePath, type: 'doc' });
}
Lista TODOS os .md sem nenhuma verificação de status.
3. frontMatter.js — needsFill()
async function needsFill(filePath) {
const firstLines = await readFirstLines(filePath, 3);
return firstLines.some(line => line.includes('status: unfilled'));
}
Só lê as 3 primeiras linhas, mas status: está na linha ~8 do frontmatter. Nunca detectaria.
Impacto
- Perda silenciosa de dados: cada re-fill sobrescreve conteúdo editado manualmente
- Loop infinito:
listToFill sempre reporta pendências → agente roda fill → conteúdo regenerado → repete
- Inconsistência: skills recebem
status: filled corretamente, mas docs/agents não
Sugestão de Correção
processTarget(): após fill, adicionar frontmatter com status: filled via addFrontMatter() em vez de chamar removeFrontMatter()
listFilesToFillTool: filtrar usando needsFill() antes de incluir no resultado
collectTargets(): filtrar por needsFill() para evitar re-fill destrutivo
needsFill(): ler linhas suficientes (10+) para encontrar o campo status
Ambiente
- OS: Windows 11
- Node: v20.x
- @ai-coders/context: 0.7.0
- Provider testado: Google (gemini-3-flash-preview)
- Reproduzido tanto via CLI quanto via MCP (Claude Code)
Descrição
O comando
fillremove o frontmatter YAML dos arquivos dedocs/eagents/após preencher o conteúdo, e olistToFill(MCP) não verifica o campostatus— lista todos os arquivos incondicionalmente. Isso cria um loop destrutivo onde o usuário/agente sempre acha que precisa rodar fill novamente, sobrescrevendo conteúdo já preenchido.Versão
@ai-coders/context@0.7.0Passos para Reproduzir
Comportamento Esperado
fill, docs e agents deveriam manter frontmatter comstatus: filledlistToFilldeveria filtrar arquivos que já têmstatus: filledfillnão deveria sobrescrever conteúdo já preenchidoComportamento Atual
fillremove o frontmatter viaremoveFrontMatter()emfillService.js:processTarget()listToFilllista todos os.mdsem verificar status (emfillScaffoldingTool.js)collectTargets()processa todos os arquivos sem filtrar porneedsFill()status: active(quando o LLM gera frontmatter) em vez destatus: filledAnálise do Source Code
1.
fillService.js—processTarget()(~linha 150)O frontmatter é intencionalmente removido. Mas isso significa que docs/agents perdem todo o metadata.
2.
fillScaffoldingTool.js—listFilesToFillToolLista TODOS os
.mdsem nenhuma verificação de status.3.
frontMatter.js—needsFill()Só lê as 3 primeiras linhas, mas
status:está na linha ~8 do frontmatter. Nunca detectaria.Impacto
listToFillsempre reporta pendências → agente roda fill → conteúdo regenerado → repetestatus: filledcorretamente, mas docs/agents nãoSugestão de Correção
processTarget(): após fill, adicionar frontmatter comstatus: filledviaaddFrontMatter()em vez de chamarremoveFrontMatter()listFilesToFillTool: filtrar usandoneedsFill()antes de incluir no resultadocollectTargets(): filtrar porneedsFill()para evitar re-fill destrutivoneedsFill(): ler linhas suficientes (10+) para encontrar o campostatusAmbiente