fix: merge corrected TF files instead of replacing all
- fmTf now merges new code blocks with existing S.tfFiles: updated files are replaced by name, untouched files are preserved, new files are added - System prompt changed: model generates ONLY the files that need fixing instead of all 25 files, drastically reducing output size - Prevents model from discarding existing work when correcting errors
This commit is contained in:
@@ -2042,16 +2042,20 @@ Abaixo estão os nomes corretos de resource types do provider oracle/oci. O mode
|
||||
### REGRA CRÍTICA: Correção de Arquivos Existentes
|
||||
Quando a mensagem do usuário incluir a seção "ARQUIVOS TERRAFORM ATUAIS NO WORKSPACE", significa que JÁ EXISTEM arquivos gerados anteriormente. Neste caso:
|
||||
|
||||
1. **NUNCA descarte os arquivos existentes**. Eles são o trabalho atual do usuário.
|
||||
2. **Gere TODOS os arquivos completos** — mesmo os que não precisaram de alteração. O sistema substitui todos os arquivos do workspace pelo que você gerar.
|
||||
3. **Corrija APENAS o que está errado**: se o erro é em `networking.tf`, mantenha `variables.tf`, `compute.tf`, `outputs.tf` etc. EXATAMENTE como estão e corrija apenas `networking.tf`.
|
||||
4. **Analise o output do terraform plan/apply** se incluído na mensagem — ele mostra exatamente qual recurso, atributo ou argumento causou o erro.
|
||||
5. **Mantenha a mesma estrutura de arquivos**: use os mesmos nomes de arquivo (`// filename: xxx.tf`) que já existem. NÃO renomeie, NÃO reorganize, NÃO mescle arquivos.
|
||||
6. **Preserve nomes de recursos**: NÃO renomeie recursos existentes (ex: `oci_core_vcn.hub` não deve virar `oci_core_vcn.main`), pois isso causaria destroy+recreate desnecessário.
|
||||
7. Se o erro for um resource type inválido, consulte a referência de recursos OCI neste prompt para encontrar o nome correto.
|
||||
8. Se o erro for um argumento inválido (Unsupported argument), remova-o ou substitua pela sintaxe correta.
|
||||
1. **Gere SOMENTE os arquivos que precisam de correção**. O sistema automaticamente mescla — arquivos não mencionados permanecem intactos.
|
||||
2. **Use os MESMOS nomes de arquivo** (`// filename: xxx.tf`) dos arquivos originais. NÃO renomeie, NÃO reorganize, NÃO mescle arquivos.
|
||||
3. **Preserve nomes de recursos**: NÃO renomeie recursos existentes (ex: `oci_core_vcn.hub` não deve virar `oci_core_vcn.main`), pois isso causaria destroy+recreate.
|
||||
4. **Analise o output do terraform plan/apply** se incluído — ele mostra exatamente qual recurso/atributo causou o erro.
|
||||
5. Se o erro for um resource type inválido, consulte a referência de recursos OCI neste prompt.
|
||||
6. Se o erro for um argumento inválido (Unsupported argument), remova-o ou use a sintaxe correta.
|
||||
7. Gere o arquivo corrigido **COMPLETO** (não apenas a parte alterada) — o sistema substitui o arquivo inteiro pelo novo conteúdo.
|
||||
|
||||
**RESUMO**: Ao corrigir, regenere todos os arquivos mantendo conteúdo intacto nos que não têm erro, e corrija cirurgicamente os que têm problema. O resultado deve funcionar no `terraform plan` sem erros na primeira tentativa.
|
||||
**Exemplo**: Se o workspace tem 10 arquivos e o erro está apenas em `networking.tf`, gere APENAS:
|
||||
```hcl
|
||||
// filename: networking.tf
|
||||
<conteúdo completo corrigido de networking.tf>
|
||||
```
|
||||
Os outros 9 arquivos permanecem intactos automaticamente.
|
||||
"""
|
||||
|
||||
# ── Terraform OCI Resource Reference (generated at build time, updatable at runtime) ──
|
||||
|
||||
@@ -736,15 +736,31 @@ function fmTf(t){
|
||||
return '<div class="tf-plan-block"><div class="tf-plan-header">'+TF_ICON+' Resource Plan — '+S.tfPlan.length+' resource(s)</div><div class="tf-plan-list">'+
|
||||
S.tfPlan.map(x=>'<div class="tf-plan-item"><span class="tf-plan-add">+</span><span class="tf-plan-type">'+escHtml(x.type)+'</span><span class="tf-plan-desc">'+escHtml(x.desc)+'</span></div>').join('')+'</div></div>';
|
||||
});
|
||||
// Build files list — merge blocks with same filename, keep separate files
|
||||
// Build files list — merge new blocks with existing files (corrections preserve untouched files)
|
||||
if(codeBlocks.length){
|
||||
const fileMap={};
|
||||
const newMap={};
|
||||
codeBlocks.forEach(b=>{
|
||||
if(fileMap[b.name])fileMap[b.name]+='\n\n'+b.content;
|
||||
else fileMap[b.name]=b.content;
|
||||
if(newMap[b.name])newMap[b.name]+='\n\n'+b.content;
|
||||
else newMap[b.name]=b.content;
|
||||
});
|
||||
S.tfFiles=Object.entries(fileMap).map(([name,content])=>({name,content,size:content.length,type:'hcl'}));
|
||||
// Set tfCode to combined content for backward compat
|
||||
// If existing files: merge (update matched, keep unmatched)
|
||||
if(S.tfFiles.length){
|
||||
const merged=[];
|
||||
const usedNew=new Set();
|
||||
// Update existing files with new content if name matches
|
||||
for(const f of S.tfFiles){
|
||||
if(newMap[f.name]!=null){merged.push({name:f.name,content:newMap[f.name],size:newMap[f.name].length,type:'hcl'});usedNew.add(f.name)}
|
||||
else{merged.push(f)}
|
||||
}
|
||||
// Add any truly new files
|
||||
for(const[name,content] of Object.entries(newMap)){
|
||||
if(!usedNew.has(name))merged.push({name,content,size:content.length,type:'hcl'})
|
||||
}
|
||||
S.tfFiles=merged;
|
||||
}else{
|
||||
// First generation: set all
|
||||
S.tfFiles=Object.entries(newMap).map(([name,content])=>({name,content,size:content.length,type:'hcl'}));
|
||||
}
|
||||
S.tfCode=S.tfFiles.map(f=>'// filename: '+f.name+'\n'+f.content).join('\n\n');
|
||||
}
|
||||
r=r.replace(/\*\*(.*?)\*\*/g,'<strong>$1</strong>').replace(/`(.*?)`/g,'<code>$1</code>').replace(/\n/g,'<br>');
|
||||
|
||||
Reference in New Issue
Block a user