Wie man Verzeichnisstrukturen bereinigt, damit KI-Agenten in riesigen Monolithen nicht den falschen Code anfassen
Wenn man Claude Code oder Aider an ein Repository mit Hunderttausenden von Zeilen Code anbindet, fangen sie an, in den falschen Dateien zu lesen. Das Kontextfenster des Modells ist begrenzt, aber durch das Zusammenkratzen irrelevanter Dateien wird das Token-Limit gesprengt und am Ende wird der falsche Code modifiziert.
Dieses Problem lässt sich nicht durch längere Prompts lösen. Man muss den physischen Suchradius des Codes, den der Agent durchsucht, verkleinern und mechanische Prüfregeln lokal verankern.
1. Trennung von Verzeichnissen, die zirkuläre Abhängigkeiten verursachen
In einem Monolith-Repository gibt es meist drei Punkte, an denen Agenten in endlose Suchschleifen geraten: der gemeinsame Hilfsfunktionen-Ordner (src/utils/), die Service-Schicht, in der sich die Geschäftslogik verstrickt (src/services/), und das globale Modell-Verzeichnis (src/models/). Wenn diese drei Ordner anfangen, sich gegenseitig zu referenzieren, liest der Agent Dutzende von Dateien, nur um eine einzige Zeile Code zu korrigieren.
Wenn man nach technischer Schicht aufgeteilte Ordner stattdessen nach Domänen bündelt und isoliert, verringert sich der Suchbereich.
| Unterscheidung |
Schichtenbasierte Struktur |
Domänengetrennte Struktur |
Veränderung des Agentenverhaltens |
| Ordnerkriterium |
Trennung nach technischer Schicht (/controllers, /services) |
Trennung nach Domäne (/domains/order) |
Sucht nur notwendige Dateien innerhalb eines Ordners |
| Abhängigkeitsverbindung |
Direktes Importieren globaler Entitäten |
Kommunikation über Domänen-Schnittstellengrenzen |
Blockiert das kettenartige Laden irrelevanter Dateien |
| Gemeinsame Logik |
Funktionen vermischt in einem einzigen src/utils/ |
Aufteilung in domänenspezifische Utils und gemeinsame Pakete |
Verhindert unnötige globale Kontextverschmutzung |
Die Reihenfolge beim Verschieben von Verzeichnissen, damit der laufende Service nicht unterbrochen wird, sieht wie folgt aus:
- Identifizieren Sie die übermäßig aufgerufenen Abhängigkeitsbeziehungen des Agenten und bestimmen Sie die zu trennende Domäne.
- Erstellen Sie Schnittstellen für die Servicegrenzen, um direkte Verweise zwischen Domänen zu unterbrechen.
- Verschieben Sie die relevante Geschäftslogik in den Ordner
src/domains/{Domänenname}/ und aktualisieren Sie die Pfadaliase in der tsconfig.json.
- Fügen Sie im getrennten Unterverzeichnis eine domänenspezifische Konfigurationsdatei (
CLAUDE.md) hinzu.
2. Umwandlung vager natürlichsprachlicher Regeln in numerische Einschränkungen
Ausführlich in natürlicher Sprache verfasste Coding-Conventions werden vom Agenten leicht übersehen. Klare Zahlenwerte und Verbote müssen am Anfang der Konfigurationsdatei platziert werden, damit die Richtlinien exakt eingehalten werden.
`markdown
Projektbeschränkungen (am Anfang von CLAUDE.md platziert)
- Sicherheit und Fehlerbehandlung
- NEVER allow raw SQL string concatenation. ALWAYS use parameterized queries with ORM.
- NEVER throw generic Exception or Error. ALWAYS throw domain-specific exceptions inheriting from BaseDomainException.
- ALWAYS enforce tenant_id filtering in all database queries under src/domains/.
- Numerische Einschränkungen der Codestruktur
- Functions MUST NOT exceed 40 lines of code.
- Cyclomatic complexity MUST be kept under 8 per function.
- ALWAYS return Result<T, E> pattern for business layer operations instead of null.
`
Wenn eine Konfigurationsdatei 200 Zeilen überschreitet, werden Anweisungen am Ende häufiger übersehen.
- In der
CLAUDE.md des Stammverzeichnisses sollten nur Build-Befehle und globale Commit-Regeln auf unter 200 Zeilen gehalten werden.
- Regeln für Unterordner wie
src/domains/order/ werden auf dedizierte Regelfunktionen innerhalb dieses Verzeichnisses verteilt.
- Persönliche Entwicklereinstellungen werden in
CLAUDE.local.md eingetragen und in der .gitignore registriert, um Konflikte zu vermeiden.
3. Automatische Überprüfung von Agenten-Änderungen durch lokale Hooks
Syntaxfehler oder Regressionsbugs in vom Agenten generiertem Code sollten zum Zeitpunkt des Commits automatisch abgefangen werden. Mit Lefthook, das als einzelnes Go-Binary arbeitet, lassen sich parallele Prüfungen leichter als mit Node.js-basierten Tools ausführen.
Platzieren Sie eine lefthook.yml im Stammverzeichnis und trennen Sie leichte statische Prüfungen von schweren Testphasen.
`yaml
pre-commit:
parallel: true
commands:
linter:
glob: ".{ts,tsx}"
run: npx eslint --fix {staged_files}
stage_fixed: true
formatter:
glob: ".{ts,tsx,json,md}"
run: npx prettier --write {staged_files}
stage_fixed: true
security-scan:
run: gitleaks git --staged --no-banner
pre-push:
parallel: false
commands:
typecheck:
run: npx tsc --noEmit
unit-tests:
run: npm run test:unit -- --passWithNoTests
`
Der pre-commit-Schritt prüft nur die gestagten Dateien in weniger als 10 Sekunden, während vollständige Typüberprüfungen und Unit-Tests an die pre-push-Phase übergeben werden.
Um zu verhindern, dass der Agent die Option --no-verify verwendet, um den Hook zu umgehen, registrieren Sie den Interceptor .claude/hooks/block-no-verify.mjs.
`javascript
import fs from 'fs';
const input = fs.readFileSync(0, 'utf8');
const parsed = JSON.parse(input);
if (parsed.tool_input?.command?.includes('--no-verify')) {
console.error("Policy Violation: --no-verify flag is strictly prohibited.");
process.exit(1);
}
process.exit(0);
`
Wenn ein Hook fehlschlägt, fließt die Konsolenfehlerausgabe in den nächsten Prompt ein, sodass der Agent den Code eigenständig korrigiert.
4. Verhinderung von Token-Verschwendung durch Einschränkung des Suchbereichs
Wenn der Agent beginnt, Build-Ergebnisse oder Lock-Dateien zu lesen, sind die Tokens schnell aufgebraucht. Der Dateisuchbereich muss eingeschränkt werden, um unbeabsichtigte Kosten zu verhindern.
Erstellen Sie eine .ignore oder .aiderignore im Projektstammverzeichnis und registrieren Sie große Artefakte.
`text
node_modules/
dist/
build/
coverage/
*.min.js
*.svg
*.lock
package-lock.json
public/assets/
db/migrations/
`
Geben Sie auch bei der Ausführung im Terminal das zu bearbeitende Verzeichnis explizit an, um globale Scans zu blockieren.
`bash
aider "Refactor Order validation logic" --path=src/domains/order/ --exclude=src/domains/order/tests/
`
Indem Sie vor der Code-Modifikation in den Planungsmodus wechseln, um Änderungen vorab zu prüfen, fehlschlagende Unit-Tests schreiben und erst danach den passenden Code erstellen lassen, bleibt der Arbeitsradius des Agenten sicher.