Memory Import Processor
O Memory Import Processor é um recurso que permite modularizar seus arquivos de contexto (por exemplo, QWEN.md) importando conteúdo de outros arquivos usando a sintaxe @file.md.
Visão Geral
Esse recurso permite dividir arquivos de contexto grandes (por exemplo, QWEN.md) em componentes menores e mais gerenciáveis, que podem ser reutilizados em diferentes contextos. O import processor suporta caminhos relativos e absolutos, com recursos de segurança integrados para prevenir imports circulares e garantir a segurança no acesso aos arquivos.
Sintaxe
Use o símbolo @ seguido do caminho do arquivo que você deseja importar:
# Arquivo QWEN.md principal
Este é o conteúdo principal.
@./components/instructions.md
Mais conteúdo aqui.
@./shared/configuration.mdFormatos de Caminho Suportados
Caminhos Relativos
@./file.md- Importa do mesmo diretório@../file.md- Importa do diretório pai@./components/file.md- Importa de um subdiretório
Caminhos Absolutos
@/absolute/path/to/file.md- Import usando caminho absoluto
Exemplos
Import Básico
# My QWEN.md
Bem-vindo ao meu projeto!
@./getting-started.md
## Funcionalidades
@./features/overview.mdImports Aninhados
Os arquivos importados podem conter, eles mesmos, imports, criando uma estrutura aninhada:
# main.md
@./header.md
@./content.md
@./footer.md
# header.md
# Cabeçalho do Projeto
@./shared/title.mdRecursos de Segurança
Detecção de Import Circular
O processador detecta e previne automaticamente imports circulares:
# file-a.md
@./file-b.md
# file-b.md
@./file-a.md <!-- Isso será detectado e evitado -->Segurança no Acesso a Arquivos
A função validateImportPath garante que os imports sejam permitidos apenas a partir de diretórios específicos, evitando acesso a arquivos sensíveis fora do escopo permitido.
Profundidade Máxima de Importação
Para prevenir recursão infinita, existe uma profundidade máxima configurável para importações (padrão: 5 níveis).
Tratamento de Erros
Arquivos Ausentes
Se um arquivo referenciado não existir, a importação falhará de forma elegante com um comentário de erro na saída.
Erros de Acesso a Arquivos
Problemas de permissão ou outros erros do sistema de arquivos são tratados de forma elegante com mensagens de erro apropriadas.
Detecção de Regiões de Código
O processador de importação utiliza a biblioteca marked para detectar blocos de código e spans de código inline, garantindo que as importações @ dentro dessas regiões sejam ignoradas corretamente. Isso proporciona um tratamento robusto de blocos de código aninhados e estruturas Markdown complexas.
Estrutura da Árvore de Importação
O processador retorna uma árvore de importação que mostra a hierarquia dos arquivos importados. Isso ajuda os usuários a depurar problemas com seus arquivos de contexto, mostrando quais arquivos foram lidos e suas relações de importação.
Exemplo de estrutura de árvore:
Memory Files
L project: QWEN.md
L a.md
L b.md
L c.md
L d.md
L e.md
L f.md
L included.mdA árvore preserva a ordem em que os arquivos foram importados e mostra a cadeia completa de importação para fins de depuração.
Comparação com a Abordagem /memory do Claude Code (claude.md)
O recurso /memory do Claude Code (como visto em claude.md) produz um documento plano e linear concatenando todos os arquivos incluídos, sempre marcando os limites dos arquivos com comentários claros e nomes de caminhos. Ele não apresenta explicitamente a hierarquia de imports, mas o LLM recebe todos os conteúdos e caminhos dos arquivos, o que é suficiente para reconstruir a hierarquia se necessário.
Nota: A árvore de imports é principalmente para clareza durante o desenvolvimento e tem relevância limitada para o consumo do LLM.
Referência da API
processImports(content, basePath, debugMode?, importState?)
Processa declarações de import no conteúdo do arquivo de contexto.
Parâmetros:
content(string): O conteúdo a ser processado para resolver os importsbasePath(string): O caminho do diretório onde o arquivo atual está localizadodebugMode(boolean, opcional): Se deve habilitar o log de debug (padrão: false)importState(ImportState, opcional): Estado usado para rastrear e prevenir imports circulares
Retorna: Promise<ProcessImportsResult> - Objeto contendo o conteúdo processado e a árvore de imports
ProcessImportsResult
interface ProcessImportsResult {
content: string; // O conteúdo processado com os imports resolvidos
importTree: MemoryFile; // Estrutura em árvore mostrando a hierarquia dos imports
}MemoryFile
interface MemoryFile {
path: string; // O caminho do arquivo
imports?: MemoryFile[]; // Imports diretos, na ordem em que foram importados
}validateImportPath(importPath, basePath, allowedDirectories)
Valida os caminhos de importação para garantir que sejam seguros e estejam dentro dos diretórios permitidos.
Parâmetros:
importPath(string): O caminho de importação a ser validadobasePath(string): O diretório base para resolver caminhos relativosallowedDirectories(string[]): Array de caminhos de diretórios permitidos
Retorna: boolean - Se o caminho de importação é válido
findProjectRoot(startDir)
Encontra a raiz do projeto procurando por um diretório .git subindo a partir do diretório inicial fornecido. Implementada como uma função async usando APIs do sistema de arquivos non-blocking para evitar bloquear o event loop do Node.js.
Parâmetros:
startDir(string): O diretório onde iniciar a busca
Retorna: Promise<string> - O diretório raiz do projeto (ou o diretório inicial caso nenhum .git seja encontrado)
Boas Práticas
- Use nomes de arquivos descritivos para componentes importados
- Mantenha imports rasos - evite cadeias de importação muito profundas
- Documente sua estrutura - mantenha uma hierarquia clara dos arquivos importados
- Teste seus imports - garanta que todos os arquivos referenciados existem e são acessíveis
- Use caminhos relativos quando possível para melhor portabilidade
Solução de Problemas
Problemas Comuns
- Import não funcionando: Verifique se o arquivo existe e se o caminho está correto
- Avisos de import circular: Revise sua estrutura de importação em busca de referências circulares
- Erros de permissão: Garanta que os arquivos sejam legíveis e estejam dentro dos diretórios permitidos
- Problemas de resolução de caminho: Use caminhos absolutos se os caminhos relativos não estiverem resolvendo corretamente
Modo Debug
Habilite o modo debug para ver logs detalhados do processo de importação:
const result = await processImports(content, basePath, true);