@renoxar/koolie 1.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +16 -0
- package/.gitignore +51 -0
- package/.koolie/QUELLREPOSITORIUM.md +18 -0
- package/.koolie/core/CHANGELOG.md +11832 -0
- package/.koolie/core/LICENSE +674 -0
- package/.koolie/core/LICENSE-HINWEIS.md +98 -0
- package/.koolie/core/OWNERS.md +36 -0
- package/.koolie/core/VERSION +1 -0
- package/.koolie/core/banner.py +397 -0
- package/.koolie/core/build/README.md +34 -0
- package/.koolie/core/build/assemble.py +354 -0
- package/.koolie/core/build/build-docx.py +194 -0
- package/.koolie/core/build/doc/00-kopf.md +18 -0
- package/.koolie/core/build/doc/01-executive-summary.md +24 -0
- package/.koolie/core/build/doc/02-zielbild.md +13 -0
- package/.koolie/core/build/doc/03-ziele-nichtziele.md +28 -0
- package/.koolie/core/build/doc/04-geltungsbereich.md +25 -0
- package/.koolie/core/build/doc/05-glossar.md +47 -0
- package/.koolie/core/build/doc/06-leitprinzipien.md +5 -0
- package/.koolie/core/build/doc/07-architektur.md +60 -0
- package/.koolie/core/build/doc/07a-abbildungsschicht.md +66 -0
- package/.koolie/core/build/doc/08-trennung.md +24 -0
- package/.koolie/core/build/doc/09-betriebsmodi.md +18 -0
- package/.koolie/core/build/doc/10-arbeitsablauf.md +5 -0
- package/.koolie/core/build/doc/11-datenschutz.md +5 -0
- package/.koolie/core/build/doc/12-sicherheit.md +5 -0
- package/.koolie/core/build/doc/13-risiko.md +5 -0
- package/.koolie/core/build/doc/14-rollen.md +9 -0
- package/.koolie/core/build/doc/15-referenzstruktur.md +124 -0
- package/.koolie/core/build/doc/16-agentenanweisung.md +8 -0
- package/.koolie/core/build/doc/17-overlay.md +29 -0
- package/.koolie/core/build/doc/18-skill-standard.md +5 -0
- package/.koolie/core/build/doc/19-skill-template.md +5 -0
- package/.koolie/core/build/doc/20-referenz-skills.md +70 -0
- package/.koolie/core/build/doc/21-prompts.md +53 -0
- package/.koolie/core/build/doc/22-checklisten.md +49 -0
- package/.koolie/core/build/doc/23-entscheidungsbaeume.md +29 -0
- package/.koolie/core/build/doc/24-onboarding.md +33 -0
- package/.koolie/core/build/doc/25-governance.md +35 -0
- package/.koolie/core/build/doc/26-qs-test.md +9 -0
- package/.koolie/core/build/doc/27-pilot.md +13 -0
- package/.koolie/core/build/doc/28-uebernahme.md +5 -0
- package/.koolie/core/build/doc/29-grenzen.md +87 -0
- package/.koolie/core/build/doc/30-roadmap.md +5 -0
- package/.koolie/core/build/doc/31-anhaenge.md +151 -0
- package/.koolie/core/build/doc/32-abschluss.md +92 -0
- package/.koolie/core/build/ref-a4.docx +0 -0
- package/.koolie/core/checklists/01-preflight.md +54 -0
- package/.koolie/core/checklists/02-privacy-context.md +51 -0
- package/.koolie/core/checklists/03-before-code-change.md +51 -0
- package/.koolie/core/checklists/04-review-ai-code.md +58 -0
- package/.koolie/core/checklists/05-testing.md +48 -0
- package/.koolie/core/checklists/06-security.md +50 -0
- package/.koolie/core/checklists/07-new-dependency.md +57 -0
- package/.koolie/core/checklists/08-merge-request.md +47 -0
- package/.koolie/core/checklists/09-onboarding.md +52 -0
- package/.koolie/core/checklists/10-project-adoption.md +74 -0
- package/.koolie/core/checklists/11-framework-release.md +71 -0
- package/.koolie/core/checklists/README.md +28 -0
- package/.koolie/core/clientmap.py +1358 -0
- package/.koolie/core/clients/README.md +113 -0
- package/.koolie/core/clients/_template/CLIENT_PACK.md +197 -0
- package/.koolie/core/clients/claude-code/CLIENT_PACK.md +383 -0
- package/.koolie/core/clients/claude-code/manifest.json +232 -0
- package/.koolie/core/clients/claude-code/root-template/.claude/README.md +127 -0
- package/.koolie/core/clients/cursor/CLIENT_PACK.md +229 -0
- package/.koolie/core/clients/cursor/manifest.json +330 -0
- package/.koolie/core/clients/cursor/root-template/.cursor/README.md +36 -0
- package/.koolie/core/clients/devin-desktop/CLIENT_PACK.md +251 -0
- package/.koolie/core/clients/devin-desktop/manifest.json +163 -0
- package/.koolie/core/clients/devin-desktop/root-template/.devin/README.md +79 -0
- package/.koolie/core/clients/kiro/CLIENT_PACK.md +223 -0
- package/.koolie/core/clients/kiro/manifest.json +300 -0
- package/.koolie/core/clients/kiro/root-template/.kiro/README.md +37 -0
- package/.koolie/core/clients/openai-codex/CLIENT_PACK.md +257 -0
- package/.koolie/core/clients/openai-codex/manifest.json +208 -0
- package/.koolie/core/clients/openai-codex/root-template/.codex/README.md +35 -0
- package/.koolie/core/decision-trees/01-context-allowed.md +46 -0
- package/.koolie/core/decision-trees/02-may-ai-do-task.md +47 -0
- package/.koolie/core/decision-trees/03-analyze-or-modify.md +50 -0
- package/.koolie/core/decision-trees/04-required-review.md +49 -0
- package/.koolie/core/decision-trees/05-stop-or-escalate.md +47 -0
- package/.koolie/core/decision-trees/06-rule-placement.md +58 -0
- package/.koolie/core/decision-trees/README.md +14 -0
- package/.koolie/core/docs/ADOPTION_GUIDE.md +582 -0
- package/.koolie/core/docs/DOCUMENTATION_STANDARD.md +91 -0
- package/.koolie/core/docs/PLACEHOLDER_REGISTRY.md +79 -0
- package/.koolie/core/docs/ROADMAP.md +848 -0
- package/.koolie/core/docs/RUNTIME_GLOSSARY.md +113 -0
- package/.koolie/core/examples/README.md +11 -0
- package/.koolie/core/examples/example-ergebnisbericht.md +31 -0
- package/.koolie/core/examples/example-mr-description.md +31 -0
- package/.koolie/core/examples/example-overlay-runtime.md +48 -0
- package/.koolie/core/framework/core/00-principles.md +93 -0
- package/.koolie/core/framework/core/01-governance.md +58 -0
- package/.koolie/core/framework/core/02-privacy.md +141 -0
- package/.koolie/core/framework/core/03-security.md +86 -0
- package/.koolie/core/framework/core/04-quality.md +48 -0
- package/.koolie/core/framework/core/05-working-model.md +199 -0
- package/.koolie/core/framework/core/06-prompting-rules.md +51 -0
- package/.koolie/core/framework/core/07-review-rules.md +52 -0
- package/.koolie/core/framework/core/08-skill-conventions.md +115 -0
- package/.koolie/core/framework/core/09-risk-model.md +87 -0
- package/.koolie/core/framework/core/10-error-escalation.md +53 -0
- package/.koolie/core/framework/org-policies/MAPPING_CLASSIFICATION.md +16 -0
- package/.koolie/core/framework/org-policies/README.md +29 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/branching-strategy/muster-general.md +43 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/coding-guidelines/muster-general.md +82 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/definition-of-done/muster-general.md +52 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/definition-of-ready/muster-general.md +54 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/quality/muster-general.md +59 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/security/muster-general.md +52 -0
- package/.koolie/core/framework/overlay-patterns/general.md +150 -0
- package/.koolie/core/framework/role-packs/README.md +63 -0
- package/.koolie/core/framework/role-packs/_template/ROLE_PACK.md +58 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/ROLE_PACK.md +158 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/runtime/30-role-requirements-engineering.md +88 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/CHANGELOG.md +10 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/EXAMPLES.md +148 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/SKILL.md +195 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/TESTS.md +22 -0
- package/.koolie/core/framework/role-packs/software-development/ROLE_PACK.md +95 -0
- package/.koolie/core/framework/role-packs/software-development/runtime/30-role-software-development.md +26 -0
- package/.koolie/core/framework/runtime/agents/fw-reviewer.md +34 -0
- package/.koolie/core/framework/runtime/client-settings.json +3 -0
- package/.koolie/core/framework/runtime/hooks.json +20 -0
- package/.koolie/core/framework/runtime/mcp-config.example.json +4 -0
- package/.koolie/core/framework/runtime/permissions.json +106 -0
- package/.koolie/core/framework/runtime/root-instruction-local.example.md +19 -0
- package/.koolie/core/framework/runtime/root-instruction.md +116 -0
- package/.koolie/core/framework/runtime/rules/00-framework-core.md +49 -0
- package/.koolie/core/framework/runtime/rules/10-privacy-security.md +49 -0
- package/.koolie/core/framework/runtime/rules/15-development-rules.md +41 -0
- package/.koolie/core/framework/runtime/rules/16-plan-spezifikation.md +32 -0
- package/.koolie/core/framework/runtime/rules/20-project-overlay.md +60 -0
- package/.koolie/core/framework/skills/fw-bugfix-prepare/CHANGELOG.md +14 -0
- package/.koolie/core/framework/skills/fw-bugfix-prepare/EXAMPLES.md +57 -0
- package/.koolie/core/framework/skills/fw-bugfix-prepare/SKILL.md +177 -0
- package/.koolie/core/framework/skills/fw-bugfix-prepare/TESTS.md +15 -0
- package/.koolie/core/framework/skills/fw-change-analyze/CHANGELOG.md +12 -0
- package/.koolie/core/framework/skills/fw-change-analyze/EXAMPLES.md +66 -0
- package/.koolie/core/framework/skills/fw-change-analyze/SKILL.md +167 -0
- package/.koolie/core/framework/skills/fw-change-analyze/TESTS.md +16 -0
- package/.koolie/core/framework/skills/fw-change-small/CHANGELOG.md +13 -0
- package/.koolie/core/framework/skills/fw-change-small/EXAMPLES.md +68 -0
- package/.koolie/core/framework/skills/fw-change-small/SKILL.md +175 -0
- package/.koolie/core/framework/skills/fw-change-small/TESTS.md +13 -0
- package/.koolie/core/framework/skills/fw-code-explain/CHANGELOG.md +11 -0
- package/.koolie/core/framework/skills/fw-code-explain/EXAMPLES.md +61 -0
- package/.koolie/core/framework/skills/fw-code-explain/SKILL.md +163 -0
- package/.koolie/core/framework/skills/fw-code-explain/TESTS.md +11 -0
- package/.koolie/core/framework/skills/fw-docs-update/CHANGELOG.md +10 -0
- package/.koolie/core/framework/skills/fw-docs-update/EXAMPLES.md +59 -0
- package/.koolie/core/framework/skills/fw-docs-update/SKILL.md +160 -0
- package/.koolie/core/framework/skills/fw-docs-update/TESTS.md +12 -0
- package/.koolie/core/framework/skills/fw-error-analyze/CHANGELOG.md +10 -0
- package/.koolie/core/framework/skills/fw-error-analyze/EXAMPLES.md +67 -0
- package/.koolie/core/framework/skills/fw-error-analyze/SKILL.md +160 -0
- package/.koolie/core/framework/skills/fw-error-analyze/TESTS.md +12 -0
- package/.koolie/core/framework/skills/fw-mr-description/CHANGELOG.md +12 -0
- package/.koolie/core/framework/skills/fw-mr-description/EXAMPLES.md +69 -0
- package/.koolie/core/framework/skills/fw-mr-description/SKILL.md +170 -0
- package/.koolie/core/framework/skills/fw-mr-description/TESTS.md +12 -0
- package/.koolie/core/framework/skills/fw-overlay-pflege/CHANGELOG.md +7 -0
- package/.koolie/core/framework/skills/fw-overlay-pflege/EXAMPLES.md +48 -0
- package/.koolie/core/framework/skills/fw-overlay-pflege/SKILL.md +147 -0
- package/.koolie/core/framework/skills/fw-overlay-pflege/TESTS.md +13 -0
- package/.koolie/core/framework/skills/fw-plan/CHANGELOG.md +14 -0
- package/.koolie/core/framework/skills/fw-plan/EXAMPLES.md +69 -0
- package/.koolie/core/framework/skills/fw-plan/SKILL.md +168 -0
- package/.koolie/core/framework/skills/fw-plan/TESTS.md +14 -0
- package/.koolie/core/framework/skills/fw-refactor/CHANGELOG.md +10 -0
- package/.koolie/core/framework/skills/fw-refactor/EXAMPLES.md +70 -0
- package/.koolie/core/framework/skills/fw-refactor/SKILL.md +173 -0
- package/.koolie/core/framework/skills/fw-refactor/TESTS.md +14 -0
- package/.koolie/core/framework/skills/fw-repo-analyze/CHANGELOG.md +10 -0
- package/.koolie/core/framework/skills/fw-repo-analyze/EXAMPLES.md +52 -0
- package/.koolie/core/framework/skills/fw-repo-analyze/SKILL.md +149 -0
- package/.koolie/core/framework/skills/fw-repo-analyze/TESTS.md +11 -0
- package/.koolie/core/framework/skills/fw-review-support/CHANGELOG.md +12 -0
- package/.koolie/core/framework/skills/fw-review-support/EXAMPLES.md +69 -0
- package/.koolie/core/framework/skills/fw-review-support/SKILL.md +179 -0
- package/.koolie/core/framework/skills/fw-review-support/TESTS.md +13 -0
- package/.koolie/core/framework/skills/fw-tests/CHANGELOG.md +9 -0
- package/.koolie/core/framework/skills/fw-tests/EXAMPLES.md +65 -0
- package/.koolie/core/framework/skills/fw-tests/SKILL.md +169 -0
- package/.koolie/core/framework/skills/fw-tests/TESTS.md +12 -0
- package/.koolie/core/framework/tech-packs/README.md +15 -0
- package/.koolie/core/framework/tech-packs/_template/TECH_PACK.md +61 -0
- package/.koolie/core/governance/ADOPTION_REGISTRY.md +89 -0
- package/.koolie/core/governance/CHANGE_REQUEST_TEMPLATE.md +60 -0
- package/.koolie/core/governance/DECISION_LOG.md +779 -0
- package/.koolie/core/governance/EXCEPTION_PROCESS.md +31 -0
- package/.koolie/core/governance/FEEDBACK_PROCESS.md +34 -0
- package/.koolie/core/governance/FRAMEWORK_DEV_PROFILE.md +135 -0
- package/.koolie/core/governance/INCIDENT_HANDLING.md +47 -0
- package/.koolie/core/governance/PRIORITY_HIERARCHY.md +61 -0
- package/.koolie/core/governance/RACI.md +37 -0
- package/.koolie/core/governance/RELEASE_PROCESS.md +183 -0
- package/.koolie/core/governance/change-requests/CR-2026-001-definition-release-1-0-0.md +67 -0
- package/.koolie/core/governance/change-requests/CR-2026-002-client-packs.md +63 -0
- package/.koolie/core/governance/change-requests/CR-2026-003-install-client-schalter.md +70 -0
- package/.koolie/core/governance/change-requests/CR-2026-004-client-pack-claude-code.md +82 -0
- package/.koolie/core/governance/change-requests/CR-2026-005-kern-neutralisierung.md +75 -0
- package/.koolie/core/governance/change-requests/CR-2026-006-gemeinsame-skill-quelle.md +77 -0
- package/.koolie/core/governance/change-requests/CR-2026-007-geteilte-kernbestandteile.md +80 -0
- package/.koolie/core/governance/change-requests/CR-2026-008-berechtigungen-und-hooks.md +85 -0
- package/.koolie/core/governance/change-requests/CR-2026-009-umbenennung-leitwerk.md +77 -0
- package/.koolie/core/governance/change-requests/CR-2026-010-restduplikation.md +73 -0
- package/.koolie/core/governance/change-requests/CR-2026-011-hauptdokument.md +72 -0
- package/.koolie/core/governance/change-requests/CR-2026-012-schreibschutz-kernverzeichnis.md +106 -0
- package/.koolie/core/governance/change-requests/CR-2026-013-validator-blindstellen.md +128 -0
- package/.koolie/core/governance/change-requests/CR-2026-014-kurzform-langform.md +125 -0
- package/.koolie/core/governance/change-requests/CR-2026-015-versionskette.md +150 -0
- package/.koolie/core/governance/change-requests/CR-2026-016-ap2-claude-code.md +127 -0
- package/.koolie/core/governance/change-requests/CR-2026-017-ladebedingungen-claude-code.md +173 -0
- package/.koolie/core/governance/change-requests/CR-2026-018-quellenliste-claude-code.md +121 -0
- package/.koolie/core/governance/change-requests/CR-2026-019-strukturentscheidungen-fortschreiben.md +143 -0
- package/.koolie/core/governance/change-requests/CR-2026-020-akteursbezeichnung.md +118 -0
- package/.koolie/core/governance/change-requests/CR-2026-021-hook-interpreter.md +113 -0
- package/.koolie/core/governance/change-requests/CR-2026-022-artefaktversionen.md +73 -0
- package/.koolie/core/governance/change-requests/CR-2026-023-shell-lesesperre.md +128 -0
- package/.koolie/core/governance/change-requests/CR-2026-024-clientbindungen.md +78 -0
- package/.koolie/core/governance/change-requests/CR-2026-025-betriebsmodi.md +110 -0
- package/.koolie/core/governance/change-requests/CR-2026-026-fail-closed.md +134 -0
- package/.koolie/core/governance/change-requests/CR-2026-027-zeichenlimit-einstufung.md +105 -0
- package/.koolie/core/governance/change-requests/CR-2026-028-berechtigungsmodi.md +130 -0
- package/.koolie/core/governance/change-requests/CR-2026-029-hook-ablageort.md +115 -0
- package/.koolie/core/governance/change-requests/CR-2026-030-lesende-werkzeuge.md +143 -0
- package/.koolie/core/governance/change-requests/CR-2026-031-regelquellen-ausserhalb.md +182 -0
- package/.koolie/core/governance/change-requests/CR-2026-032-fremde-skill-ablage.md +151 -0
- package/.koolie/core/governance/change-requests/CR-2026-033-modusabhaengige-durchsetzung.md +131 -0
- package/.koolie/core/governance/change-requests/CR-2026-034-nachweisbedingungen.md +116 -0
- package/.koolie/core/governance/change-requests/CR-2026-035-readme-in-der-regelablage.md +115 -0
- package/.koolie/core/governance/change-requests/CR-2026-036-ortsangaben-hook-konfiguration.md +108 -0
- package/.koolie/core/governance/change-requests/CR-2026-037-meldender-hook-clientgebunden.md +133 -0
- package/.koolie/core/governance/change-requests/CR-2026-038-importsteuerung.md +159 -0
- package/.koolie/core/governance/change-requests/CR-2026-039-normative-saetze-in-kommentaren.md +124 -0
- package/.koolie/core/governance/change-requests/CR-2026-040-erh01-ist-clientgebunden.md +115 -0
- package/.koolie/core/governance/change-requests/CR-2026-041-s5-nicht-abbildbar.md +128 -0
- package/.koolie/core/governance/change-requests/CR-2026-042-abwesenheitsnachweis-suchwerkzeug.md +102 -0
- package/.koolie/core/governance/change-requests/CR-2026-043-validator-gibt-trefferwerte-aus.md +135 -0
- package/.koolie/core/governance/change-requests/CR-2026-044-aktivierungspruefung-clientgebunden.md +112 -0
- package/.koolie/core/governance/change-requests/CR-2026-045-update-verliert-die-clientwahl.md +116 -0
- package/.koolie/core/governance/change-requests/CR-2026-046-erstinstallation-ueberschreibt-projektdatei.md +125 -0
- package/.koolie/core/governance/change-requests/CR-2026-047-zusagen-je-zugriffskanal.md +133 -0
- package/.koolie/core/governance/change-requests/CR-2026-048-modusgrenze-ohne-durchsetzung.md +137 -0
- package/.koolie/core/governance/change-requests/CR-2026-049-sondenlauf-kodierungsabhaengig.md +126 -0
- package/.koolie/core/governance/change-requests/CR-2026-050-allowed-tools-und-verworfene-permissions.md +110 -0
- package/.koolie/core/governance/change-requests/CR-2026-051-quellenkarte-und-ueberholter-stand.md +110 -0
- package/.koolie/core/governance/change-requests/CR-2026-052-drei-regelkonflikte.md +166 -0
- package/.koolie/core/governance/change-requests/CR-2026-053-lesesperre-und-entwicklungsprofil.md +144 -0
- package/.koolie/core/governance/change-requests/CR-2026-054-aktivierung-verlangt-aktivitaet.md +124 -0
- package/.koolie/core/governance/change-requests/CR-2026-055-domain-ausnahme-ohne-mechanismus.md +173 -0
- package/.koolie/core/governance/change-requests/CR-2026-056-eingabeschema-und-pfadidentitaet.md +245 -0
- package/.koolie/core/governance/change-requests/CR-2026-057-disallowed-tools-und-s3.md +148 -0
- package/.koolie/core/governance/change-requests/CR-2026-058-unteragent-reichweite.md +203 -0
- package/.koolie/core/governance/change-requests/CR-2026-059-unteragent-tiefe-und-widerspruch.md +125 -0
- package/.koolie/core/governance/change-requests/CR-2026-060-stumme-brueche.md +170 -0
- package/.koolie/core/governance/change-requests/CR-2026-061-berechtigungsdatei-ohne-pruefung.md +169 -0
- package/.koolie/core/governance/change-requests/CR-2026-062-werkzeugabbildung-des-frontmatters.md +178 -0
- package/.koolie/core/governance/change-requests/CR-2026-063-skillaufruf-ohne-freigabe.md +207 -0
- package/.koolie/core/governance/change-requests/CR-2026-064-pruefregister-nicht-nachgezaehlt.md +141 -0
- package/.koolie/core/governance/change-requests/CR-2026-065-devin-suchwerkzeuge-erhoben.md +170 -0
- package/.koolie/core/governance/change-requests/CR-2026-066-schlitzdeckung-ohne-abgleich.md +153 -0
- package/.koolie/core/governance/change-requests/CR-2026-067-hookblock-und-praeparationsregister.md +140 -0
- package/.koolie/core/governance/change-requests/CR-2026-068-sondenlauf-nebenlaeufig.md +106 -0
- package/.koolie/core/governance/change-requests/CR-2026-069-bytecode-des-kerns.md +108 -0
- package/.koolie/core/governance/change-requests/CR-2026-070-d11-zaehler.md +114 -0
- package/.koolie/core/governance/change-requests/CR-2026-071-strukturentscheidungen-bestaetigen.md +322 -0
- package/.koolie/core/governance/change-requests/CR-2026-072-modulstatus-heben.md +315 -0
- package/.koolie/core/governance/change-requests/CR-2026-073-nicht-skill-traeger-heben.md +246 -0
- package/.koolie/core/governance/change-requests/CR-2026-074-restliche-nicht-skill-traeger-heben.md +271 -0
- package/.koolie/core/governance/change-requests/CR-2026-075-ap2-zielversion-devin-desktop.md +335 -0
- package/.koolie/core/governance/change-requests/CR-2026-076-erster-sitzungstest.md +455 -0
- package/.koolie/core/governance/change-requests/CR-2026-077-sitzungstest-schranken.md +425 -0
- package/.koolie/core/governance/change-requests/CR-2026-078-planung-nach-1-0-0.md +294 -0
- package/.koolie/core/governance/change-requests/CR-2026-079-umbenennung-vorziehen.md +233 -0
- package/.koolie/core/governance/change-requests/CR-2026-080-clientbindung-des-kerns.md +321 -0
- package/.koolie/core/governance/change-requests/CR-2026-081-produktnamen-im-kern.md +297 -0
- package/.koolie/core/governance/change-requests/CR-2026-082-sitzungstest-pi-ds-2.md +145 -0
- package/.koolie/core/governance/change-requests/CR-2026-083-sitzungstest-ne-sc.md +300 -0
- package/.koolie/core/governance/change-requests/CR-2026-084-trockenlauf-gegen-den-committeten-stand.md +117 -0
- package/.koolie/core/governance/change-requests/CR-2026-085-vorbedingungen-sitzungstest-5.md +182 -0
- package/.koolie/core/governance/change-requests/CR-2026-086-grenzfaelle-gegen-die-fassungen.md +164 -0
- package/.koolie/core/governance/change-requests/CR-2026-087-produktbeobachtung-quellenliste.md +206 -0
- package/.koolie/core/governance/change-requests/CR-2026-088-vorbedingungen-testblaetter.md +127 -0
- package/.koolie/core/governance/change-requests/CR-2026-089-herrichtung-uebungsrepositorium.md +226 -0
- package/.koolie/core/governance/change-requests/CR-2026-090-vorbedingungen-sitzungstest-5-zweiter-durchgang.md +255 -0
- package/.koolie/core/governance/change-requests/CR-2026-091-sitzungstest-5.md +163 -0
- package/.koolie/core/governance/change-requests/CR-2026-092-pruefmittelwort-und-buendelschnitt.md +226 -0
- package/.koolie/core/governance/change-requests/CR-2026-093-sechzehnte-praeparation.md +151 -0
- package/.koolie/core/governance/change-requests/CR-2026-094-testblaetter-buendel-1.md +113 -0
- package/.koolie/core/governance/change-requests/CR-2026-095-pruefapparat-filter.md +65 -0
- package/.koolie/core/governance/change-requests/CR-2026-096-vorbedingungen-buendel-2.md +225 -0
- package/.koolie/core/governance/change-requests/CR-2026-097-testblaetter-buendel-2.md +162 -0
- package/.koolie/core/governance/change-requests/CR-2026-098-anforderungen-auslieferung.md +93 -0
- package/.koolie/core/governance/change-requests/CR-2026-099-k74-und-vorbedingungen-buendel-3.md +119 -0
- package/.koolie/core/governance/change-requests/CR-2026-100-testblaetter-buendel-3.md +120 -0
- package/.koolie/core/governance/change-requests/CR-2026-101-k77-eigener-posten.md +165 -0
- package/.koolie/core/governance/change-requests/CR-2026-102-k77-entschieden.md +118 -0
- package/.koolie/core/governance/change-requests/CR-2026-103-vorbedingungen-buendel-4.md +76 -0
- package/.koolie/core/governance/change-requests/CR-2026-104-herrichtung-buendel-4.md +82 -0
- package/.koolie/core/governance/change-requests/CR-2026-105-messapparat-buendel-4.md +227 -0
- package/.koolie/core/governance/change-requests/CR-2026-106-uebergabe-einchecken.md +91 -0
- package/.koolie/core/governance/change-requests/CR-2026-107-uebergabe-im-release-commit.md +111 -0
- package/.koolie/core/governance/change-requests/CR-2026-108-testblaetter-buendel-4.md +118 -0
- package/.koolie/core/governance/change-requests/CR-2026-109-berichtsweg-des-aufraeumers.md +108 -0
- package/.koolie/core/governance/change-requests/CR-2026-110-vorbedingungen-des-nachlaufs.md +184 -0
- package/.koolie/core/governance/change-requests/CR-2026-111-der-apparat-auf-dem-weg-der-wiederaufnahme.md +127 -0
- package/.koolie/core/governance/change-requests/CR-2026-112-der-arbeitsplatz-im-kern.md +103 -0
- package/.koolie/core/governance/change-requests/CR-2026-113-nachlauf-buendel-4.md +103 -0
- package/.koolie/core/governance/change-requests/CR-2026-114-vorbedingungen-buendel-5.md +317 -0
- package/.koolie/core/governance/change-requests/CR-2026-115-herrichtung-buendel-5.md +244 -0
- package/.koolie/core/governance/change-requests/CR-2026-116-messtag-buendel-5.md +178 -0
- package/.koolie/core/governance/change-requests/CR-2026-117-sammelzellen-zentraler-katalog.md +251 -0
- package/.koolie/core/governance/change-requests/CR-2026-118-quellenzuordnung-matrixzeilen.md +115 -0
- package/.koolie/core/governance/change-requests/CR-2026-119-umbenennung-koolie.md +204 -0
- package/.koolie/core/governance/change-requests/CR-2026-120-ap2-rest-devin-desktop.md +96 -0
- package/.koolie/core/governance/change-requests/CR-2026-121-verify-marker-abschaffen.md +185 -0
- package/.koolie/core/governance/change-requests/CR-2026-122-umbenennung-koolie-lauf.md +131 -0
- package/.koolie/core/governance/change-requests/CR-2026-123-vortrag-und-namensabsatz.md +170 -0
- package/.koolie/core/governance/change-requests/CR-2026-124-hauptdokument-ap11.md +237 -0
- package/.koolie/core/governance/change-requests/CR-2026-125-word-fassung-und-blinder-fleck.md +204 -0
- package/.koolie/core/governance/change-requests/CR-2026-126-lizenz-gpl3.md +112 -0
- package/.koolie/core/governance/change-requests/CR-2026-127-gegenzeichnung-rollenfrage.md +96 -0
- package/.koolie/core/governance/change-requests/CR-2026-128-freigabelauf-1.0.0.md +278 -0
- package/.koolie/core/governance/change-requests/CR-2026-129-archiv-zeilenenden.md +90 -0
- package/.koolie/core/governance/change-requests/CR-2026-130-reihenfolge-des-hebens.md +204 -0
- package/.koolie/core/governance/change-requests/CR-2026-131-chronik-und-vorlage.md +194 -0
- package/.koolie/core/governance/change-requests/CR-2026-132-erhebung-openai-codex.md +185 -0
- package/.koolie/core/governance/change-requests/CR-2026-133-bau-openai-codex.md +97 -0
- package/.koolie/core/governance/change-requests/CR-2026-134-uebergabe-lokal.md +117 -0
- package/.koolie/core/governance/change-requests/CR-2026-135-pfadlisten-nul-getrennt.md +139 -0
- package/.koolie/core/governance/change-requests/CR-2026-136-overlay-werte-einordnung.md +156 -0
- package/.koolie/core/governance/change-requests/CR-2026-137-kopierweg-kern.md +144 -0
- package/.koolie/core/governance/change-requests/CR-2026-138-overlay-muster-general.md +118 -0
- package/.koolie/core/governance/change-requests/CR-2026-139-overlay-muster-dokumente.md +105 -0
- package/.koolie/core/governance/change-requests/CR-2026-140-installer-je-zielsystem.md +120 -0
- package/.koolie/core/governance/change-requests/CR-2026-141-lieferumfang.md +123 -0
- package/.koolie/core/governance/change-requests/CR-2026-142-dokumentationsstandard.md +90 -0
- package/.koolie/core/governance/change-requests/CR-2026-143-klasse-b-core-laufzeit.md +89 -0
- package/.koolie/core/governance/change-requests/CR-2026-144-klasse-b-governance.md +90 -0
- package/.koolie/core/governance/change-requests/CR-2026-145-klasse-b-skills.md +81 -0
- package/.koolie/core/governance/change-requests/CR-2026-146-code-pack-posten.md +84 -0
- package/.koolie/core/governance/change-requests/CR-2026-147-regel-register-posten.md +78 -0
- package/.koolie/core/governance/change-requests/CR-2026-148-mehrprojekt-tokenlast.md +70 -0
- package/.koolie/core/governance/change-requests/CR-2026-149-regelablage-pfadtoken.md +71 -0
- package/.koolie/core/governance/change-requests/CR-2026-150-client-pack-kiro.md +76 -0
- package/.koolie/core/governance/change-requests/CR-2026-151-skill-anweisungen.md +71 -0
- package/.koolie/core/governance/change-requests/CR-2026-152-testblaetter-modellwechsel.md +78 -0
- package/.koolie/core/governance/change-requests/CR-2026-153-attributionszeile.md +88 -0
- package/.koolie/core/governance/change-requests/CR-2026-154-auffindbarkeit.md +102 -0
- package/.koolie/core/governance/change-requests/CR-2026-155-client-pack-cursor.md +80 -0
- package/.koolie/core/governance/change-requests/CR-2026-156-mandat-und-reibung.md +100 -0
- package/.koolie/core/governance/change-requests/CR-2026-157-mcp-anbindung.md +93 -0
- package/.koolie/core/governance/change-requests/CR-2026-158-registerpflege.md +69 -0
- package/.koolie/core/governance/change-requests/CR-2026-159-powershell.md +49 -0
- package/.koolie/core/governance/change-requests/CR-2026-160-messapparat.md +59 -0
- package/.koolie/core/governance/change-requests/CR-2026-161-pruefwerkzeuge.md +52 -0
- package/.koolie/core/governance/change-requests/CR-2026-162-schutzschicht.md +65 -0
- package/.koolie/core/governance/change-requests/CR-2026-163-pfadsemantik.md +61 -0
- package/.koolie/core/governance/change-requests/CR-2026-164-modi-ausnahmen.md +65 -0
- package/.koolie/core/governance/change-requests/CR-2026-165-installer-banner.md +406 -0
- package/.koolie/core/governance/change-requests/CR-2026-166-nachlauf-aufzeichnungen.md +59 -0
- package/.koolie/core/governance/change-requests/CR-2026-167-einsatzarchitektur.md +60 -0
- package/.koolie/core/governance/change-requests/CR-2026-168-paketquellen.md +64 -0
- package/.koolie/core/governance/change-requests/CR-2026-169-modusbindung-messfragen.md +58 -0
- package/.koolie/core/governance/change-requests/CR-2026-170-erste-veroeffentlichung.md +62 -0
- package/.koolie/core/governance/change-requests/CR-2026-171-befehl-im-projektverzeichnis.md +57 -0
- package/.koolie/core/governance/change-requests/CR-2026-172-auftritt-npm-suche.md +58 -0
- package/.koolie/core/install.py +2402 -0
- package/.koolie/core/install_dialog.py +227 -0
- package/.koolie/core/koexistenz.py +112 -0
- package/.koolie/core/mandat.py +605 -0
- package/.koolie/core/onboarding/COMPLETION_CRITERIA.md +37 -0
- package/.koolie/core/onboarding/GUIDE.md +103 -0
- package/.koolie/core/onboarding/KNOWLEDGE_CHECK.md +48 -0
- package/.koolie/core/onboarding/MENTOR_CHECKLIST.md +40 -0
- package/.koolie/core/onboarding/QUICKSTART.md +50 -0
- package/.koolie/core/onboarding/REFERENCE.md +69 -0
- package/.koolie/core/onboarding/exercises/EXERCISES.md +78 -0
- package/.koolie/core/onboarding/exercises/README.md +120 -0
- package/.koolie/core/pilot/METRICS.md +59 -0
- package/.koolie/core/pilot/PILOT_CONCEPT.md +42 -0
- package/.koolie/core/prompts/01-understand-codebase.md +99 -0
- package/.koolie/core/prompts/02-impact-analysis.md +104 -0
- package/.koolie/core/prompts/03-implementation-planning.md +102 -0
- package/.koolie/core/prompts/04-code-generation.md +100 -0
- package/.koolie/core/prompts/05-test-generation.md +103 -0
- package/.koolie/core/prompts/06-refactoring.md +102 -0
- package/.koolie/core/prompts/07-debugging.md +97 -0
- package/.koolie/core/prompts/08-security-review.md +92 -0
- package/.koolie/core/prompts/09-performance-analysis.md +89 -0
- package/.koolie/core/prompts/10-documentation.md +91 -0
- package/.koolie/core/prompts/11-merge-request-review.md +94 -0
- package/.koolie/core/prompts/12-developer-training.md +90 -0
- package/.koolie/core/prompts/README.md +88 -0
- package/.koolie/core/templates/MR_AI_DISCLOSURE.md +37 -0
- package/.koolie/core/templates/PLAN_TEMPLATE.md +57 -0
- package/.koolie/core/templates/SKILL_TEMPLATE.md +159 -0
- package/.koolie/core/templates/project-overlay/OVERLAY.md +315 -0
- package/.koolie/core/templates/project-overlay/documents/README.md +43 -0
- package/.koolie/core/templates/project-overlay/documents/ai-governance/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/ai-process-model/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/architecture/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/architecture/decisions/README.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/branching-strategy/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/coding-guidelines/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/definition-of-done/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/definition-of-ready/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/deployment/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/glossary/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/quality/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/roadmap/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/roles/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/security/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/exceptions/EXCEPTIONS.md +9 -0
- package/.koolie/core/templates/project-overlay/forbidden-terms.txt +8 -0
- package/.koolie/core/templates/project-overlay/overlay-manifest.yaml +73 -0
- package/.koolie/core/templates/rules/21-overlay-TEMPLATE.md.template +28 -0
- package/.koolie/core/templates/rules/40-tech-TEMPLATE.md.template +33 -0
- package/.koolie/core/tests/EDGE_CASES.md +67 -0
- package/.koolie/core/tests/TEST_CATALOG.md +170 -0
- package/.koolie/core/tests/erhebungen/README.md +326 -0
- package/.koolie/core/tests/erhebungen/ablage.py +357 -0
- package/.koolie/core/tests/erhebungen/apparat/__init__.py +22 -0
- package/.koolie/core/tests/erhebungen/apparat/baum.py +214 -0
- package/.koolie/core/tests/erhebungen/apparat/belege.py +91 -0
- package/.koolie/core/tests/erhebungen/apparat/clients.py +321 -0
- package/.koolie/core/tests/erhebungen/apparat/freigabe.py +74 -0
- package/.koolie/core/tests/erhebungen/apparat/kontingent.py +64 -0
- package/.koolie/core/tests/erhebungen/apparat/laeufer.py +155 -0
- package/.koolie/core/tests/erhebungen/apparat/reihe.py +202 -0
- package/.koolie/core/tests/erhebungen/apparat/selbsttest.py +280 -0
- package/.koolie/core/tests/erhebungen/apparat/stand.py +30 -0
- package/.koolie/core/tests/erhebungen/apparat/vorpruefung.py +70 -0
- package/.koolie/core/tests/erhebungen/auswerten-b4.py +468 -0
- package/.koolie/core/tests/erhebungen/auswerten-b5.py +517 -0
- package/.koolie/core/tests/erhebungen/auswerten-dd.py +172 -0
- package/.koolie/core/tests/erhebungen/baeume-b4.py +334 -0
- package/.koolie/core/tests/erhebungen/baeume-b5.py +339 -0
- package/.koolie/core/tests/erhebungen/baeume_loeschen.py +138 -0
- package/.koolie/core/tests/erhebungen/cc-overlay-fuellen.py +277 -0
- package/.koolie/core/tests/erhebungen/dossier-b4.py +178 -0
- package/.koolie/core/tests/erhebungen/dossier-b5.py +202 -0
- package/.koolie/core/tests/erhebungen/historie-bauen-b4.py +642 -0
- package/.koolie/core/tests/erhebungen/k-bauen-b3.py +841 -0
- package/.koolie/core/tests/erhebungen/lauf-dd.py +146 -0
- package/.koolie/core/tests/erhebungen/lauf.py +114 -0
- package/.koolie/core/tests/erhebungen/mcp-waechter.py +278 -0
- package/.koolie/core/tests/erhebungen/messbaum-schnitt.py +256 -0
- package/.koolie/core/tests/erhebungen/messen.py +72 -0
- package/.koolie/core/tests/erhebungen/node-waechter.py +74 -0
- package/.koolie/core/tests/erhebungen/packaktivierung.py +403 -0
- package/.koolie/core/tests/erhebungen/prompts-schreiben-b4.py +210 -0
- package/.koolie/core/tests/erhebungen/prompts-schreiben-b5.py +251 -0
- package/.koolie/core/tests/erhebungen/reihe-b4.py +171 -0
- package/.koolie/core/tests/erhebungen/reihe-b5.py +172 -0
- package/.koolie/core/tests/erhebungen/stand-b4.py +135 -0
- package/.koolie/core/tests/erhebungen/stand-b5.py +137 -0
- package/.koolie/core/tests/erhebungen/trust-b4.py +56 -0
- package/.koolie/core/tests/erhebungen/trust-b5.py +56 -0
- package/.koolie/core/tests/erhebungen/turn2-schreiben-b4.py +105 -0
- package/.koolie/core/tests/erhebungen/umgebungen-bauen-b4.py +377 -0
- package/.koolie/core/tests/erhebungen/umgebungen-bauen-b5.py +363 -0
- package/.koolie/core/tests/erhebungen/zaehlen46.py +74 -0
- package/.koolie/core/tests/erhebungen/zustand-b4.py +82 -0
- package/.koolie/core/tests/erhebungen/zustand-b5.py +82 -0
- package/.koolie/core/tests/protocols/2026-09-10-AP2-claude-code-wirkungsnachweise.md +194 -0
- package/.koolie/core/tests/protocols/2026-09-10-AP2-claude-code.md +468 -0
- package/.koolie/core/tests/protocols/2026-09-10-CR-2026-020-akteursbezeichnung.md +99 -0
- package/.koolie/core/tests/protocols/2026-09-10-CR-2026-021-hook-interpreter.md +138 -0
- package/.koolie/core/tests/protocols/2026-09-10-CR-2026-022-artefaktversionen.md +87 -0
- package/.koolie/core/tests/protocols/2026-09-10-CR-2026-023-shell-lesesperre.md +135 -0
- package/.koolie/core/tests/protocols/2026-09-10-CR-2026-024-clientbindungen.md +98 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-DS-03.md +90 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-KO-01.md +105 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-KO-02.md +123 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-KO-04.md +73 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-RE-02.md +99 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-VN-01-wiederholung.md +108 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-VN-01.md +249 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-ZA-05.md +99 -0
- package/.koolie/core/tests/protocols/2026-09-11-AP2-devin-desktop.md +257 -0
- package/.koolie/core/tests/protocols/2026-09-11-CR-2026-026-fail-closed.md +113 -0
- package/.koolie/core/tests/protocols/2026-09-11-erhebungen-K21-K26.md +243 -0
- package/.koolie/core/tests/protocols/2026-09-11-wirkungsnachweise-0.26.0.md +101 -0
- package/.koolie/core/tests/protocols/2026-09-12-B01-allowed-tools.md +152 -0
- package/.koolie/core/tests/protocols/2026-09-12-B04-B05-gegenpruefung.md +204 -0
- package/.koolie/core/tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md +268 -0
- package/.koolie/core/tests/protocols/2026-09-12-mehrprojekt-arbeitsbereich.md +154 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.26.1.md +126 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.27.0.md +114 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.28.0.md +129 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.29.0.md +121 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.30.0.md +112 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.31.0.md +107 -0
- package/.koolie/core/tests/protocols/2026-09-13-B06-gegenpruefung.md +370 -0
- package/.koolie/core/tests/protocols/2026-09-13-B07-B09-gegenpruefung.md +211 -0
- package/.koolie/core/tests/protocols/2026-09-13-B08-B11-gegenpruefung.md +179 -0
- package/.koolie/core/tests/protocols/2026-09-13-erhebung-disallowed-tools.md +147 -0
- package/.koolie/core/tests/protocols/2026-09-13-erhebung-unteragent-tiefe.md +139 -0
- package/.koolie/core/tests/protocols/2026-09-13-erhebung-unteragent.md +214 -0
- package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-berechtigungsdatei.md +253 -0
- package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-stumme-brueche.md +202 -0
- package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-werkzeugabbildung.md +219 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.32.0.md +133 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.33.0.md +169 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.34.0.md +187 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.35.0.md +187 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.36.0.md +137 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.37.0.md +112 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.38.0.md +154 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.39.0.md +188 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.40.0.md +214 -0
- package/.koolie/core/tests/protocols/2026-09-14-erhebung-devin-werkzeuge.md +267 -0
- package/.koolie/core/tests/protocols/2026-09-14-erhebung-skillaufruf.md +238 -0
- package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-pruefregister.md +156 -0
- package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-schlitzdeckung.md +206 -0
- package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-skillwahl.md +127 -0
- package/.koolie/core/tests/protocols/2026-09-14-migrationslauf-pilot.md +134 -0
- package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.41.0.md +175 -0
- package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.42.0.md +180 -0
- package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.43.0.md +165 -0
- package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.44.0.md +130 -0
- package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-d11-zaehlregeln.md +311 -0
- package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-modulstatus.md +524 -0
- package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-nicht-skill-traeger.md +225 -0
- package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-restliche-nicht-skill-traeger.md +345 -0
- package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-strukturentscheidungen.md +392 -0
- package/.koolie/core/tests/protocols/2026-09-15-herrichtung-uebungsrepositorium.md +213 -0
- package/.koolie/core/tests/protocols/2026-09-15-migrationslauf-pilot-0.46.0.md +143 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.45.0.md +127 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.46.0.md +193 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.47.0.md +149 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.49.0.md +202 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.50.0.md +183 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.51.0.md +202 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.52.0.md +168 -0
- package/.koolie/core/tests/protocols/2026-09-16-AP2-zielversion-devin-desktop.md +231 -0
- package/.koolie/core/tests/protocols/2026-09-16-wirkungsnachweise-0.53.0.md +350 -0
- package/.koolie/core/tests/protocols/2026-09-17-nachtrag-migrationshinweis-0.54.1.md +121 -0
- package/.koolie/core/tests/protocols/2026-09-17-sitzungstest-pi-ds.md +523 -0
- package/.koolie/core/tests/protocols/2026-09-17-sitzungstest-schranken.md +433 -0
- package/.koolie/core/tests/protocols/2026-09-17-wirkungsnachweise-0.54.0.md +159 -0
- package/.koolie/core/tests/protocols/2026-09-18-FW-AK-01.md +442 -0
- package/.koolie/core/tests/protocols/2026-09-18-FW-KO-05.md +231 -0
- package/.koolie/core/tests/protocols/2026-09-18-herrichtung-uebungsrepositorium.md +273 -0
- package/.koolie/core/tests/protocols/2026-09-18-nachtrag-preis-umbenennung-0.56.1.md +102 -0
- package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-5.md +349 -0
- package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-ne-sc.md +430 -0
- package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-pi-ds-2.md +499 -0
- package/.koolie/core/tests/protocols/2026-09-18-vorbedingungen-sitzungstest-5-zweiter-durchgang.md +170 -0
- package/.koolie/core/tests/protocols/2026-09-18-vorbedingungen-testblaetter.md +184 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.55.0.md +202 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.56.0.md +135 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.56.2.md +154 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.57.0.md +228 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.57.1.md +262 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.58.0.md +135 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.59.0.md +150 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.60.0.md +340 -0
- package/.koolie/core/tests/protocols/2026-09-19-herrichtung-buendel-4.md +235 -0
- package/.koolie/core/tests/protocols/2026-09-19-k77-zurechenbarkeit.md +236 -0
- package/.koolie/core/tests/protocols/2026-09-19-pruefapparat-filter.md +50 -0
- package/.koolie/core/tests/protocols/2026-09-19-pruefmittelwort-und-buendelschnitt.md +239 -0
- package/.koolie/core/tests/protocols/2026-09-19-sechzehnte-praeparation.md +135 -0
- package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-1.md +250 -0
- package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-2.md +229 -0
- package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-3.md +293 -0
- package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-2.md +236 -0
- package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-3.md +253 -0
- package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-4.md +138 -0
- package/.koolie/core/tests/protocols/2026-09-20-messapparat-buendel-4.md +433 -0
- package/.koolie/core/tests/protocols/2026-09-20-testblaetter-buendel-4.md +321 -0
- package/.koolie/core/tests/protocols/2026-09-20-uebergabe-im-release-commit.md +146 -0
- package/.koolie/core/tests/protocols/2026-09-20-vorbedingungen-nachlauf-b4.md +259 -0
- package/.koolie/core/tests/protocols/2026-09-21-arbeitsplatz-im-kern.md +127 -0
- package/.koolie/core/tests/protocols/2026-09-21-nachlauf-buendel-4.md +157 -0
- package/.koolie/core/tests/protocols/2026-09-21-vorbedingungen-buendel-5.md +247 -0
- package/.koolie/core/tests/protocols/2026-09-21-wiederaufnahme-nachlauf-b4.md +190 -0
- package/.koolie/core/tests/protocols/2026-09-22-ap2-rest-devin-desktop.md +614 -0
- package/.koolie/core/tests/protocols/2026-09-22-hauptdokument-ap11.md +443 -0
- package/.koolie/core/tests/protocols/2026-09-22-herrichtung-buendel-5.md +224 -0
- package/.koolie/core/tests/protocols/2026-09-22-messtag-buendel-5.md +327 -0
- package/.koolie/core/tests/protocols/2026-09-22-quellenzuordnung-matrixzeilen.md +230 -0
- package/.koolie/core/tests/protocols/2026-09-22-sammelzellen-zentraler-katalog.md +354 -0
- package/.koolie/core/tests/protocols/2026-09-22-umbenennung-koolie.md +296 -0
- package/.koolie/core/tests/protocols/2026-09-22-verify-marker-abschaffen.md +283 -0
- package/.koolie/core/tests/protocols/2026-09-22-vortrag-und-name.md +261 -0
- package/.koolie/core/tests/protocols/2026-09-22-wirkungsnachweise-0.86.0.md +158 -0
- package/.koolie/core/tests/protocols/2026-09-23-archiv-zeilenenden.md +113 -0
- package/.koolie/core/tests/protocols/2026-09-23-bau-openai-codex.md +168 -0
- package/.koolie/core/tests/protocols/2026-09-23-chronik-und-vorlage.md +224 -0
- package/.koolie/core/tests/protocols/2026-09-23-erhebung-openai-codex.md +309 -0
- package/.koolie/core/tests/protocols/2026-09-23-freigabelauf-1.0.0-vorbereitung.md +119 -0
- package/.koolie/core/tests/protocols/2026-09-23-freigabelauf-1.0.0.md +150 -0
- package/.koolie/core/tests/protocols/2026-09-23-gegenzeichnung-rollenfrage.md +198 -0
- package/.koolie/core/tests/protocols/2026-09-23-reihenfolge-des-hebens.md +220 -0
- package/.koolie/core/tests/protocols/2026-09-23-word-fassung-und-blinder-fleck.md +307 -0
- package/.koolie/core/tests/protocols/2026-09-24-kopierweg-kern.md +98 -0
- package/.koolie/core/tests/protocols/2026-09-24-overlay-werte-einordnung.md +111 -0
- package/.koolie/core/tests/protocols/2026-09-24-pfadlisten-nul-getrennt.md +128 -0
- package/.koolie/core/tests/protocols/2026-09-24-uebergabe-lokal.md +85 -0
- package/.koolie/core/tests/protocols/2026-09-25-code-pack-posten.md +86 -0
- package/.koolie/core/tests/protocols/2026-09-25-dokumentationsstandard.md +101 -0
- package/.koolie/core/tests/protocols/2026-09-25-installer-je-zielsystem.md +134 -0
- package/.koolie/core/tests/protocols/2026-09-25-klasse-b-core-laufzeit.md +126 -0
- package/.koolie/core/tests/protocols/2026-09-25-klasse-b-governance.md +133 -0
- package/.koolie/core/tests/protocols/2026-09-25-klasse-b-skills.md +91 -0
- package/.koolie/core/tests/protocols/2026-09-25-lieferumfang.md +76 -0
- package/.koolie/core/tests/protocols/2026-09-25-overlay-muster-dokumente.md +107 -0
- package/.koolie/core/tests/protocols/2026-09-25-overlay-muster-general.md +100 -0
- package/.koolie/core/tests/protocols/2026-09-25-regel-register-posten.md +87 -0
- package/.koolie/core/tests/protocols/2026-09-26-attributionszeile.md +83 -0
- package/.koolie/core/tests/protocols/2026-09-26-auffindbarkeit.md +85 -0
- package/.koolie/core/tests/protocols/2026-09-26-bau-cursor.md +68 -0
- package/.koolie/core/tests/protocols/2026-09-26-bau-kiro.md +75 -0
- package/.koolie/core/tests/protocols/2026-09-26-mehrprojekt-tokenlast.md +174 -0
- package/.koolie/core/tests/protocols/2026-09-26-regelablage-pfadtoken.md +133 -0
- package/.koolie/core/tests/protocols/2026-09-26-skill-anweisungen.md +111 -0
- package/.koolie/core/tests/protocols/2026-09-26-testblaetter-modellwechsel.md +106 -0
- package/.koolie/core/tests/protocols/2026-09-27-mandat-und-reibung.md +58 -0
- package/.koolie/core/tests/protocols/2026-09-28-mcp-anbindung.md +72 -0
- package/.koolie/core/tests/protocols/2026-09-29-messapparat.md +75 -0
- package/.koolie/core/tests/protocols/2026-09-29-powershell.md +58 -0
- package/.koolie/core/tests/protocols/2026-09-29-pruefwerkzeuge.md +64 -0
- package/.koolie/core/tests/protocols/2026-09-29-registerpflege.md +228 -0
- package/.koolie/core/tests/protocols/2026-09-29-schutzschicht.md +95 -0
- package/.koolie/core/tests/protocols/2026-09-30-einsatzarchitektur.md +104 -0
- package/.koolie/core/tests/protocols/2026-09-30-modi-ausnahmen.md +77 -0
- package/.koolie/core/tests/protocols/2026-09-30-nachlauf-banner.md +85 -0
- package/.koolie/core/tests/protocols/2026-09-30-paketquellen.md +65 -0
- package/.koolie/core/tests/protocols/2026-09-30-pfadsemantik.md +79 -0
- package/.koolie/core/tests/protocols/2026-10-01-auftritt-und-suche.md +58 -0
- package/.koolie/core/tests/protocols/2026-10-01-befehl-im-projektverzeichnis.md +47 -0
- package/.koolie/core/tests/protocols/2026-10-01-erste-veroeffentlichung.md +60 -0
- package/.koolie/core/tests/protocols/2026-10-01-modusbindung-messfragen.md +107 -0
- package/.koolie/core/tests/protocols/README.md +14 -0
- package/.koolie/core/tests/scripts/hook-check-secrets.py +1307 -0
- package/.koolie/core/tests/scripts/hook-overlay-status.py +120 -0
- package/.koolie/core/tests/scripts/mermaid_renderer.py +67 -0
- package/.koolie/core/tests/scripts/overlay_status.py +130 -0
- package/.koolie/core/tests/scripts/probe-pruefungen.py +110 -0
- package/.koolie/core/tests/scripts/pruefungen/__init__.py +4 -0
- package/.koolie/core/tests/scripts/pruefungen/berechtigungen.py +1559 -0
- package/.koolie/core/tests/scripts/pruefungen/bestand.py +1433 -0
- package/.koolie/core/tests/scripts/pruefungen/dokumente.py +1262 -0
- package/.koolie/core/tests/scripts/pruefungen/gemeinsam.py +784 -0
- package/.koolie/core/tests/scripts/pruefungen/hooks.py +1188 -0
- package/.koolie/core/tests/scripts/pruefungen/overlay.py +1251 -0
- package/.koolie/core/tests/scripts/pruefungen/packs.py +1314 -0
- package/.koolie/core/tests/scripts/pruefungen/register.py +950 -0
- package/.koolie/core/tests/scripts/pruefungen/testkatalog.py +1202 -0
- package/.koolie/core/tests/scripts/pruefungen/werkzeuge.py +957 -0
- package/.koolie/core/tests/scripts/sonden/__init__.py +4 -0
- package/.koolie/core/tests/scripts/sonden/apparat.py +653 -0
- package/.koolie/core/tests/scripts/sonden/teil01_grundbestand_und_installation.py +999 -0
- package/.koolie/core/tests/scripts/sonden/teil02_packs_mandat_mcp.py +942 -0
- package/.koolie/core/tests/scripts/sonden/teil03_pruefungen_26_bis_36.py +1184 -0
- package/.koolie/core/tests/scripts/sonden/teil04_pruefungen_37_bis_45.py +1491 -0
- package/.koolie/core/tests/scripts/sonden/teil05_pruefungen_46_bis_55.py +1447 -0
- package/.koolie/core/tests/scripts/sonden/teil06_pruefungen_57_bis_65.py +739 -0
- package/.koolie/core/tests/scripts/sonden/teil07_overlay_und_lieferung.py +1014 -0
- package/.koolie/core/tests/scripts/sonden/teil08_pruefungen_66_bis_80.py +1325 -0
- package/.koolie/core/tests/scripts/sonden/teil09_pruefmittel_81_und_82.py +505 -0
- package/.koolie/core/tests/scripts/sonden/teil10_pruefungen_83_bis_95.py +1218 -0
- package/.koolie/core/tests/scripts/sonden/teil11_pruefungen_104_und_105.py +149 -0
- package/.koolie/core/tests/scripts/sonden/teil12_pruefungen_106_und_107.py +136 -0
- package/.koolie/core/tests/scripts/sonden/teil13_pfad_und_mustersemantik.py +150 -0
- package/.koolie/core/tests/scripts/sonden/teil14_modi_ausnahmen_skills.py +204 -0
- package/.koolie/core/tests/scripts/sonden/teil15_banner_und_nachlauf.py +193 -0
- package/.koolie/core/tests/scripts/sonden/teil16_koexistenz.py +114 -0
- package/.koolie/core/tests/scripts/sonden/teil17_paketquellen.py +115 -0
- package/.koolie/core/tests/scripts/sonden/teil18_modusbindung_m3_m5.py +113 -0
- package/.koolie/core/tests/scripts/validate-framework.py +1104 -0
- package/.koolie/core/tests/scripts/validate-output.py +296 -0
- package/.koolie/core/wirksamkeit.py +430 -0
- package/CONTRIBUTING.md +119 -0
- package/LICENSE +674 -0
- package/QUICKSTART.en.md +135 -0
- package/QUICKSTART.md +129 -0
- package/README.en.md +108 -0
- package/README.md +107 -0
- package/install.cmd +44 -0
- package/install.command +46 -0
- package/package.json +21 -0
- package/paketquellen/README.md +41 -0
- package/paketquellen/bauen.py +411 -0
- package/paketquellen/koolie.cmd +23 -0
- package/paketquellen/koolie_befehl.py +82 -0
- package/paketquellen/npm/koolie.js +26 -0
|
@@ -0,0 +1,784 @@
|
|
|
1
|
+
"""Gemeinsame Grundlage der Pruefungen: Bericht (err, warn, hinweis), Lesen,
|
|
2
|
+
Tabellenzellen, Dateibestand, Clienterkennung und alles, was mehr als ein Gegenstand
|
|
3
|
+
braucht.
|
|
4
|
+
|
|
5
|
+
Teil des Validators validate-framework.py, seit 1.19.1 nach Gegenstand in Module geteilt
|
|
6
|
+
(K-174). Das Register aller Pruefungen steht im Kopfkommentar des Einstiegs, die Grenze
|
|
7
|
+
jeder einzelnen in ihrem Kopfkommentar hier."""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
import re
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
import yaml # type: ignore
|
|
19
|
+
except ImportError: # pragma: no cover
|
|
20
|
+
yaml = None
|
|
21
|
+
|
|
22
|
+
# Name des Kernverzeichnisses. Er steht hier einmal statt an drei Stellen im Skript.
|
|
23
|
+
KERN = ".koolie/core"
|
|
24
|
+
|
|
25
|
+
# Seit 1.19.1 liegt der Code der beiden Pruefskripte in einem Paket neben seinem
|
|
26
|
+
# Einstieg (K-174). Wer ihren Quelltext liest - Pruefung 40 das Register und
|
|
27
|
+
# die Sondenmenge, Pruefung 104 die Verdrahtung -, liest den Einstieg UND sein Paket, den Einstieg zuerst: Sein
|
|
28
|
+
# Kopfkommentar ist das Register.
|
|
29
|
+
PAKET_JE_SKRIPT = {"tests/scripts/validate-framework.py": "tests/scripts/pruefungen",
|
|
30
|
+
"tests/scripts/probe-pruefungen.py": "tests/scripts/sonden"}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def paketquelltext(root: str, rel: str) -> str:
|
|
34
|
+
"""Der Quelltext des Pakets zu einem Einstieg, Modul fuer Modul nach Namen."""
|
|
35
|
+
paket = PAKET_JE_SKRIPT.get(rel)
|
|
36
|
+
ordner = os.path.join(root, KERN, *paket.split("/")) if paket else ""
|
|
37
|
+
if not ordner or not os.path.isdir(ordner):
|
|
38
|
+
return ""
|
|
39
|
+
return "".join("\n" + read(os.path.join(ordner, name))
|
|
40
|
+
for name in sorted(os.listdir(ordner)) if name.endswith(".py"))
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# ---------------------------------------------------------------------------
|
|
44
|
+
# AUSGABEFORM DER BERECHTIGUNGSDATEI - UND DIE PRUEFUNGEN, DIE AN IHR HAENGEN
|
|
45
|
+
# ---------------------------------------------------------------------------
|
|
46
|
+
# ANLASS (CR-2026-133, D-346). Bis 1.3.0 hatte jedes Client Pack dieselbe Ausgabeform:
|
|
47
|
+
# eine JSON-Datei mit den Koerben deny/ask/allow aus Regeln der Gestalt
|
|
48
|
+
# Werkzeug(Muster). Zwoelf Pruefungen lesen sie so. Das dritte Pack hat diese Gestalt
|
|
49
|
+
# nicht - es bindet Pfade an Zugriffsarten in einer TOML-Tabelle und Befehle in einer
|
|
50
|
+
# eigenen Regelsprache.
|
|
51
|
+
#
|
|
52
|
+
# EINE PRUEFUNG, DIE EINE FREMDE FORM LIEST, MELDET EINEN FEHLER, DEN ES NICHT GIBT;
|
|
53
|
+
# EINE, DIE SIE STILL UEBERSPRINGT, MISST EIN PACK NICHT UND SAGT ES NICHT.
|
|
54
|
+
# ➡️ Deshalb steht die Menge hier, sie wird benannt, und Pruefung 87 haelt sie gegen den
|
|
55
|
+
# Abschnitt 5 des betroffenen Packs. Aus einer stillen Luecke wird eine erklaerte.
|
|
56
|
+
#
|
|
57
|
+
# Ein Pack sagt seine Form im Manifest (permissions_format); der Standard ist "json" -
|
|
58
|
+
# eine Form wird gesagt, nicht durch Schweigen geerbt.
|
|
59
|
+
#
|
|
60
|
+
# SEIT 1.13.0 NENNT JEDER EINTRAG DIE FORMEN, DIE ER ERREICHT (CR-2026-150, D-416).
|
|
61
|
+
# Bis dahin war die Menge an genau eine Frage gebunden - "json oder nicht" -, und zwei
|
|
62
|
+
# Dinge stimmten nicht: (1) Sie fuehrte als Nummer 76 "Das Pack steht im eigenen
|
|
63
|
+
# Korb"; Pruefung 76 ist die Kernlage und laeuft bei jeder Form. Gemeint war 72, und
|
|
64
|
+
# die enthielt sich bei openai-codex nicht, weil sie hier stand, sondern weil
|
|
65
|
+
# json.loads an der TOML-Datei scheiterte - still. (2) Vier dieser Pruefungen (37, 42,
|
|
66
|
+
# 43, 54, 72) hatten gar keinen Schutz; sie lasen eine Datei, die bei TOML nicht
|
|
67
|
+
# einlesbar war. Das dritte JSON-Format (das Agentenprofil von kiro) IST einlesbar, und
|
|
68
|
+
# dieselben Pruefungen meldeten 64 Fehler, die es nicht gab. Jede Pruefung der Menge
|
|
69
|
+
# fragt deshalb jetzt ausdruecklich formatgebunden() - und 72 erreicht das
|
|
70
|
+
# Agentenprofil, weil sie dort liest, was sie braucht.
|
|
71
|
+
FORMATGEBUNDENE_PRUEFUNGEN = {
|
|
72
|
+
2: ("Berechtigungsdatei als JSON, Kernregeln unter _core_rules_integrity", {"json"}),
|
|
73
|
+
37: ("Die drei Koerbe der installierten Datei gegen die Kernquelle", {"json"}),
|
|
74
|
+
42: ("Der Befehlsschlitz traegt den Befehl, den das Overlay erklaert", {"json"}),
|
|
75
|
+
43: ("Die Berechtigungsdatei traegt den Hook, den das Pack dort fuehrt", {"json"}),
|
|
76
|
+
54: ("Deklarierte Zusatzschluessel stehen auf ihrer Ebene", {"json"}),
|
|
77
|
+
59: ("Gegenstand (c): die ausgeschlossenen Pfade im deny-Korb", {"json"}),
|
|
78
|
+
72: ("Jeder installierte Skill steht in der Berechtigungsdatei",
|
|
79
|
+
{"json", "kiro-agent"}),
|
|
80
|
+
89: ("Gegenstand (c): die Nur-Lese-Pfade im deny-Korb", {"json"}),
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def formatgebunden(man: dict, nummer: int) -> bool:
|
|
85
|
+
"""Wahr, wenn diese Pruefung die Ausgabeform dieses Packs nicht erreicht. Der
|
|
86
|
+
Aufrufer kehrt dann zurueck, ohne zu melden - die Auslassung steht in
|
|
87
|
+
FORMATGEBUNDENE_PRUEFUNGEN und wird von Pruefung 87 eingefordert."""
|
|
88
|
+
if nummer not in FORMATGEBUNDENE_PRUEFUNGEN:
|
|
89
|
+
raise KeyError(
|
|
90
|
+
f"Pruefung {nummer} beruft sich auf die Ausgabeform, steht aber nicht in "
|
|
91
|
+
f"FORMATGEBUNDENE_PRUEFUNGEN. Eine Auslassung, die nirgends steht, ist die "
|
|
92
|
+
f"stille Luecke, die D-346 abgestellt hat")
|
|
93
|
+
return man.get("permissions_format", "json") not in FORMATGEBUNDENE_PRUEFUNGEN[nummer][1]
|
|
94
|
+
|
|
95
|
+
ERRORS: list[str] = []
|
|
96
|
+
WARNINGS: list[str] = []
|
|
97
|
+
# Seit 1.8.0 (D-367): Zeilen, die eine reduzierte Installation erklaeren - was sie nicht
|
|
98
|
+
# mitliefert und welche Pruefung deshalb nichts zu pruefen hat. Sie zaehlen weder als
|
|
99
|
+
# Fehler noch als Warnung; eine reduzierte Installation ist kein Mangel. Stumm bleiben
|
|
100
|
+
# duerfen sie nicht: Eine Luecke, die nur besteht, ist ein blinder Fleck (D-346).
|
|
101
|
+
HINWEISE: list[str] = []
|
|
102
|
+
|
|
103
|
+
# ".cmd" und ".command" seit 1.7.0: die Starter des Installers (D-365). Ohne sie lasen
|
|
104
|
+
# weder die Neutralitaets- noch die Zeilenendepruefungen diese Traeger.
|
|
105
|
+
TEXT_EXT = {".md", ".json", ".yaml", ".yml", ".txt", ".py", ".template", ".example",
|
|
106
|
+
".cmd", ".command"}
|
|
107
|
+
SKIP_DIRS = {".git", "build", "node_modules", "__pycache__", "target", "dist", ".venv"}
|
|
108
|
+
SKILL_STATUS = {"entwurf", "pilot", "aktiv", "veraltet", "zurückgezogen"}
|
|
109
|
+
PLACEHOLDER_RE = re.compile(r"<([A-Z][A-Z0-9_]{2,})>")
|
|
110
|
+
TBD_RE = re.compile(r"<TBD[:>]")
|
|
111
|
+
|
|
112
|
+
# --- Zellen einer Markdown-Tabellenzeile (CR-2026-060, D-75) --------------------
|
|
113
|
+
# GFM trennt Zellen am Strich; ein Strich INNERHALB einer Zelle wird maskiert (\\|)
|
|
114
|
+
# und bleibt Inhalt. Eine Zerlegung, die das nicht kennt, beanstandet einen korrekten
|
|
115
|
+
# Text - gemessen an Pruefung 30, die eine Grenzfallzeile mit maskiertem Strich als
|
|
116
|
+
# neunspaltig meldete, obwohl sie siebenspaltig rendert. D-69 des Decision Logs
|
|
117
|
+
# traegt genau diese Schreibweise seit 0.36.0.
|
|
118
|
+
#
|
|
119
|
+
# Die Zerlegung lag bis 0.37.0 VIERMAL eigenhaendig im Validator. Sie liegt jetzt
|
|
120
|
+
# einmal: vier Gelegenheiten fuer denselben Fehler sind eine.
|
|
121
|
+
ZELLTRENNER_RE = re.compile(r"(?<!\\)\|")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def tabellenzellen(zeile: str) -> list:
|
|
125
|
+
"""Die Zellen einer Tabellenzeile, maskierte Striche als Inhalt.
|
|
126
|
+
|
|
127
|
+
Erwartet eine Zeile, die mit '|' beginnt; die aeusseren Striche sind Rahmen und
|
|
128
|
+
zaehlen nicht als Zellen. Fuer eine Zeile ohne Rahmen liefert sie die Felder
|
|
129
|
+
zwischen den Trennern.
|
|
130
|
+
"""
|
|
131
|
+
z = zeile.strip()
|
|
132
|
+
teile = ZELLTRENNER_RE.split(z)
|
|
133
|
+
if z.startswith("|"):
|
|
134
|
+
teile = teile[1:]
|
|
135
|
+
if z.endswith("|") and not z.endswith("\\|") and teile:
|
|
136
|
+
teile = teile[:-1]
|
|
137
|
+
return [t.strip() for t in teile]
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def err(msg: str) -> None:
|
|
141
|
+
ERRORS.append(msg)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def warn(msg: str) -> None:
|
|
145
|
+
WARNINGS.append(msg)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def hinweis(msg: str) -> None:
|
|
149
|
+
if msg not in HINWEISE:
|
|
150
|
+
HINWEISE.append(msg)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def read(path: str) -> str:
|
|
154
|
+
with open(path, encoding="utf-8") as fh:
|
|
155
|
+
return fh.read()
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _gitignore_namen(root: str) -> set:
|
|
159
|
+
"""Die DATEINAMEN, die die .gitignore der Wurzel als nicht zu teilend fuehrt.
|
|
160
|
+
|
|
161
|
+
🔴 WARUM DER VALIDATOR SIE UEBERSPRINGT (D-215, CR-2026-106): Was nicht
|
|
162
|
+
eingecheckt wird, ist kein Bestandteil des Repositoriums - und eine Pruefung,
|
|
163
|
+
die es trotzdem meldet, prueft am Gegenstand vorbei. Gemessen am 2026-09-20:
|
|
164
|
+
Die lokale Beilage der Uebergabe traegt Servername und Konto, steht in der
|
|
165
|
+
.gitignore, und der Validator meldete gegen sie zwei Fehler. Sie existiert
|
|
166
|
+
gerade deshalb, damit diese Angaben NICHT im Repositorium stehen.
|
|
167
|
+
|
|
168
|
+
🔴 BEWUSST NUR EINFACHE DATEINAMEN, keine Muster und keine Pfade. Ein
|
|
169
|
+
`*`-Muster oder ein Verzeichnis liesse sich hier eintragen, um eine echte
|
|
170
|
+
Pruefung stillzulegen - `.koolie/core/**` wuerde den halben Kern
|
|
171
|
+
ausblenden, und niemand saehe es. Ein Dateiname trifft eine Datei, und die
|
|
172
|
+
Liste ist kurz genug zum Lesen. Zeilen mit `/`, `*`, `?`, `[` oder `!`
|
|
173
|
+
werden ignoriert.
|
|
174
|
+
"""
|
|
175
|
+
pfad = os.path.join(root, ".gitignore")
|
|
176
|
+
namen = set()
|
|
177
|
+
if not os.path.isfile(pfad):
|
|
178
|
+
return namen
|
|
179
|
+
# `read` ist die Leseroutine dieses Moduls; ein eigener `io`-Import waere ein
|
|
180
|
+
# zweiter Weg zum selben Zweck.
|
|
181
|
+
try:
|
|
182
|
+
roh = read(pfad)
|
|
183
|
+
except OSError:
|
|
184
|
+
return namen
|
|
185
|
+
for zeile in roh.splitlines():
|
|
186
|
+
z = zeile.strip()
|
|
187
|
+
if not z or z.startswith("#"):
|
|
188
|
+
continue
|
|
189
|
+
if any(c in z for c in "/*?[!"):
|
|
190
|
+
continue
|
|
191
|
+
namen.add(z)
|
|
192
|
+
return namen
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _walk_text_files(start: str, ignoriert: set = frozenset()):
|
|
196
|
+
for dirpath, dirnames, filenames in os.walk(start):
|
|
197
|
+
dirnames[:] = [d for d in dirnames if d not in SKIP_DIRS]
|
|
198
|
+
for fn in filenames:
|
|
199
|
+
if fn in ignoriert:
|
|
200
|
+
continue
|
|
201
|
+
ext = os.path.splitext(fn)[1]
|
|
202
|
+
if ext in TEXT_EXT or fn in ("VERSION", ".gitignore"):
|
|
203
|
+
yield os.path.join(dirpath, fn)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def iter_text_files(root: str):
|
|
207
|
+
ignoriert = _gitignore_namen(root)
|
|
208
|
+
yield from _walk_text_files(root, ignoriert)
|
|
209
|
+
# 'build' steht in SKIP_DIRS, weil dort die Erzeugnisse eines Projekts liegen. Die
|
|
210
|
+
# handgeschriebenen Quellen des Hauptdokuments liegen aber darunter und gehoeren
|
|
211
|
+
# geprueft - gerade weil aus ihnen ein Lieferbestandteil entsteht. Vier Backticks
|
|
212
|
+
# brechen genau hier die Assemblierung, und ein Secret erschiene im ausgelieferten
|
|
213
|
+
# Dokument.
|
|
214
|
+
#
|
|
215
|
+
# 🔴 BIS 0.89.0 STAND HIER NUR build/doc - UND DIE DREI TRAEGER DANEBEN ERREICHTE
|
|
216
|
+
# KEINE EINZIGE PRUEFUNG (D-313, CR-2026-125): assemble.py, build-docx.py und
|
|
217
|
+
# build/README.md. Begruendet war das mit EINER Frage - die Werkzeuge fuehren eigene
|
|
218
|
+
# Marker in spitzen Klammern, die keine Framework-Platzhalter sind. Gewirkt hat es auf
|
|
219
|
+
# ZWOELF Pruefungen, die ueber diesen Iterator laufen. Gemessen beim Oeffnen am
|
|
220
|
+
# 2026-09-23: zwei Fehler und zwei Warnungen. Die zwei Warnungen SIND die Begruendung
|
|
221
|
+
# und haben jetzt eine eigene, benannte Ausnahme bei der einen Frage, fuer die sie
|
|
222
|
+
# gilt (OHNE_PLATZHALTERREGISTER). Die zwei Fehler sind Pruefung 14 am Erzeuger der
|
|
223
|
+
# Word-Fassung: Er haette den ueberholten Dokumenttitel samt CLIENTNAMEN in die
|
|
224
|
+
# Dokumenteigenschaften der Lieferung gestempelt.
|
|
225
|
+
# ➡️ Dieselbe Auflösung wie bei D-311: eine benannte Ausnahme ueber benannte Traeger
|
|
226
|
+
# statt einer stummen ueber ein Verzeichnis. EINE AUSNAHME GILT SO WEIT WIE IHRE
|
|
227
|
+
# BEGRUENDUNG UND NICHT SO WEIT WIE IHR MECHANISMUS.
|
|
228
|
+
#
|
|
229
|
+
# `out/` bleibt aussen vor und das ist kein Versehen: Es ist das ERZEUGNIS, steht in
|
|
230
|
+
# der .gitignore und ist in einer frischen Auscheckung nicht da. Eine Pruefung dagegen
|
|
231
|
+
# waere im Framework gruen und in jeder Installation rot - der Konstruktionsfehler,
|
|
232
|
+
# den Pruefung 75 mit 0.88.0 zweimal bezahlt hat.
|
|
233
|
+
bau = os.path.join(root, KERN, "build")
|
|
234
|
+
if os.path.isdir(bau):
|
|
235
|
+
for pfad in _walk_text_files(bau, ignoriert):
|
|
236
|
+
if os.path.relpath(pfad, bau).replace(os.sep, "/").startswith("out/"):
|
|
237
|
+
continue
|
|
238
|
+
yield pfad
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def parse_frontmatter(text: str):
|
|
242
|
+
if not text.startswith("---"):
|
|
243
|
+
return None, text
|
|
244
|
+
parts = text.split("---", 2)
|
|
245
|
+
if len(parts) < 3:
|
|
246
|
+
return None, text
|
|
247
|
+
fm_text, body = parts[1], parts[2]
|
|
248
|
+
if yaml is None:
|
|
249
|
+
return {"_raw": fm_text}, body
|
|
250
|
+
try:
|
|
251
|
+
data = yaml.safe_load(fm_text) or {}
|
|
252
|
+
except yaml.YAMLError as exc: # type: ignore[attr-defined]
|
|
253
|
+
return {"_error": str(exc)}, body
|
|
254
|
+
return data, body
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
# --- Clienterkennung (Client Packs) -------------------------------------------
|
|
258
|
+
# Der Validator lief frueher fest gegen .devin/. Seit es mehrere Client Packs gibt,
|
|
259
|
+
# wird die Laufzeitschicht erkannt: Jedes Pack beschreibt seine Pfade in
|
|
260
|
+
# clients/<name>/manifest.json; geprueft wird das Pack, dessen runtime_dir im
|
|
261
|
+
# Zielverzeichnis tatsaechlich liegt.
|
|
262
|
+
MANIFEST_FALLBACK = {
|
|
263
|
+
"client": "unbekannt", "runtime_dir": ".devin", "root_instruction_file": "AGENTS.md",
|
|
264
|
+
"permissions_file": ".devin/config.json", "skills_dir": ".devin/skills",
|
|
265
|
+
"agents_dir": ".devin/agents", "pack_runtime_dir": ".devin/rules",
|
|
266
|
+
"has_rule_triggers": True,
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def detect_client(root: str) -> dict:
|
|
271
|
+
"""Manifest des installierten Client Packs. Fallback, wenn keines zutrifft."""
|
|
272
|
+
base = os.path.join(root, KERN, "clients")
|
|
273
|
+
treffer = []
|
|
274
|
+
if os.path.isdir(base):
|
|
275
|
+
for name in sorted(os.listdir(base)):
|
|
276
|
+
mp = os.path.join(base, name, "manifest.json")
|
|
277
|
+
if not os.path.exists(mp):
|
|
278
|
+
continue
|
|
279
|
+
try:
|
|
280
|
+
man = json.loads(read(mp))
|
|
281
|
+
except json.JSONDecodeError as exc:
|
|
282
|
+
err(f"clients/{name}/manifest.json ist kein gültiges JSON: {exc}")
|
|
283
|
+
continue
|
|
284
|
+
if os.path.isdir(os.path.join(root, *man.get("runtime_dir", "").split("/"))):
|
|
285
|
+
# <CORE_DIR> ist die LAGE des Kerns unter der Projektwurzel, nicht der
|
|
286
|
+
# Name eines Verzeichnisses. Bis 0.87.0 stand hier os.path.basename()
|
|
287
|
+
# ueber drei dirname-Aufrufe; seit der Kern zwei Segmente tief liegt,
|
|
288
|
+
# lieferte das "core" statt ".koolie/core" - und der Validator haette
|
|
289
|
+
# denselben falschen Wert gebunden wie install.py und deshalb nichts
|
|
290
|
+
# gemeldet (D-299).
|
|
291
|
+
man.setdefault("runtime_placeholders", {})["<CORE_DIR>"] = KERN
|
|
292
|
+
treffer.append(man)
|
|
293
|
+
if len(treffer) > 1:
|
|
294
|
+
namen = ", ".join(m["client"] for m in treffer)
|
|
295
|
+
err(f"Mehrere Laufzeitschichten gleichzeitig vorhanden ({namen}). "
|
|
296
|
+
f"Ein Projekt nutzt genau ein Client Pack.")
|
|
297
|
+
return treffer[0] if treffer else MANIFEST_FALLBACK
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def regel_endung(man: dict) -> str:
|
|
301
|
+
"""Die Endung der Regeldateien dieses Packs (cursor: .mdc, CR-2026-155) - dieselbe
|
|
302
|
+
Auskunft wie clientmap.regel_endung(), hier ohne Import, weil die Pruefungen auch
|
|
303
|
+
ohne das Abbildungsmodul laufen muessen."""
|
|
304
|
+
return man.get("rule_file_ext", ".md")
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def regeldatei(man: dict, name: str) -> str:
|
|
308
|
+
"""'20-project-overlay.md' in der Schreibweise der Regelablage dieses Packs."""
|
|
309
|
+
endung = regel_endung(man)
|
|
310
|
+
return name[:-3] + endung if endung != ".md" and name.endswith(".md") else name
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
# ---------------------------------------------------------------------------
|
|
314
|
+
# 37: Die drei Koerbe der Berechtigungsdatei gegen die Kernquelle
|
|
315
|
+
# ---------------------------------------------------------------------------
|
|
316
|
+
#
|
|
317
|
+
# Anlass ist eine Messung vom 2026-09-13 (CR-2026-061, D-77): Die erzeugte Datei traegt
|
|
318
|
+
# 65 Regeln, geprueft waren dreizehn. Ein Projekt konnte 41 deny-Regeln loeschen, den
|
|
319
|
+
# ask-Korb leeren und eine allow-Zeile ergaenzen, ohne dass ein Lauf davon Notiz nahm -
|
|
320
|
+
# und install.py --update fasst die Datei nie an, --check nennt sie nicht einmal.
|
|
321
|
+
#
|
|
322
|
+
# Die Pruefung ist das Verschaerfungsprinzip, mechanisch angewandt
|
|
323
|
+
# (PRIORITY_HIERARCHY.md Regel 2.1), in zwei Saetzen:
|
|
324
|
+
# Fehlt eine erzeugte Regel, ist es ein Fehler - in jedem Korb.
|
|
325
|
+
# Steht eine Regel zu viel, entscheidet der Korb: in deny zulaessig (Verschaerfung),
|
|
326
|
+
# in ask und allow ein Fehler (Ausweitung) - abzueglich der Platzhalterschlitze
|
|
327
|
+
# UND der Skillfreigaben aktivierter Packs (D-243, siehe skillfreigaben()).
|
|
328
|
+
PROJEKTPLATZHALTER = re.compile(r"<[A-Z][A-Z0-9_]*>")
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def korb_zerlegung(ist: list, soll_korb: list) -> tuple:
|
|
332
|
+
"""Ein Korb in Pflicht, Schlitze, gefuellte Schlitze und Ueberschuss.
|
|
333
|
+
|
|
334
|
+
Die Zerlegung lag bis 0.43.0 in check_berechtigungskoerbe und wurde fuer Pruefung 42
|
|
335
|
+
ein zweites Mal gebraucht. Sie liegt jetzt einmal: zwei Gelegenheiten fuer denselben
|
|
336
|
+
Fehler sind eine - dieselbe Begruendung wie bei tabellenzellen() mit 0.37.0.
|
|
337
|
+
|
|
338
|
+
pflicht Regeln ohne Projektplatzhalter; sie muessen dastehen.
|
|
339
|
+
schlitze Regeln mit Projektplatzhalter; sie gehoeren dem Projekt.
|
|
340
|
+
ungefuellt Schlitze, die woertlich in der Datei stehen. Sie sind noch offen.
|
|
341
|
+
zusatz Regeln der Datei, die weder Pflicht noch ein offener Schlitz sind - ein
|
|
342
|
+
gefuellter Schlitz steht hier ebenso wie eine hinzugefuegte Freigabe.
|
|
343
|
+
WELCHE von beiden, sagt diese Funktion nicht und kann es nicht sagen;
|
|
344
|
+
das ist der Gegenstand von Pruefung 42.
|
|
345
|
+
"""
|
|
346
|
+
pflicht = [r for r in soll_korb if not PROJEKTPLATZHALTER.search(r)]
|
|
347
|
+
schlitze = [r for r in soll_korb if PROJEKTPLATZHALTER.search(r)]
|
|
348
|
+
ungefuellt = [s for s in schlitze if s in ist]
|
|
349
|
+
zusatz = [r for r in ist if r not in pflicht and r not in schlitze]
|
|
350
|
+
return pflicht, schlitze, ungefuellt, zusatz
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def fremde_praefixe(root: str) -> list:
|
|
354
|
+
"""Die zulaessig deklarierten Praefixe fremder Skills (1.21.0, K-31, Pruefung 111).
|
|
355
|
+
|
|
356
|
+
Fehlt koexistenz.py (etwa in einer Teilkopie des Kerns), gilt nichts als deklariert -
|
|
357
|
+
die Skills werden dann wie bisher als Koolie-Skills geprueft, strenger und nicht lockerer.
|
|
358
|
+
"""
|
|
359
|
+
kern = os.path.join(root, KERN)
|
|
360
|
+
if not os.path.isdir(kern):
|
|
361
|
+
return []
|
|
362
|
+
if kern not in sys.path:
|
|
363
|
+
sys.path.insert(0, kern)
|
|
364
|
+
try:
|
|
365
|
+
import koexistenz
|
|
366
|
+
except ImportError:
|
|
367
|
+
return []
|
|
368
|
+
return [p for p in koexistenz.deklariert(root) if koexistenz.zulaessig(p)]
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def soll_korbregeln(root: str, man: dict) -> dict | None:
|
|
372
|
+
"""Die drei Koerbe in der Schreibweise dieses Clients, aus der Kernquelle.
|
|
373
|
+
|
|
374
|
+
Dieselbe Quelle wie soll_kernregeln, nur ohne die Einschraenkung auf 'core': true.
|
|
375
|
+
Fehlt das Abbildungsmodul, unterbleibt die Pruefung - check_config hat dafuer bereits
|
|
376
|
+
gewarnt, und eine zweite Warnung ueber dieselbe Tatsache waere Laerm.
|
|
377
|
+
"""
|
|
378
|
+
kern = os.path.join(root, KERN)
|
|
379
|
+
if not os.path.isdir(kern):
|
|
380
|
+
return None
|
|
381
|
+
if kern not in sys.path:
|
|
382
|
+
sys.path.insert(0, kern)
|
|
383
|
+
try:
|
|
384
|
+
import clientmap
|
|
385
|
+
except ImportError:
|
|
386
|
+
return None
|
|
387
|
+
# Sonde auf den verlorenen Anker (seit 0.32.0): Diese Pruefung findet ihren
|
|
388
|
+
# Gegenstand ueber einen Funktionsnamen. Geht er bei einem Umbau verloren, bestuende
|
|
389
|
+
# sie leise - deshalb meldet sie sein Fehlen selbst.
|
|
390
|
+
if not hasattr(clientmap, "basket_rules"):
|
|
391
|
+
err(f"{KERN}/clientmap.py: Funktion 'basket_rules(' fehlt – Prüfung 37 hat ihren "
|
|
392
|
+
f"Gegenstand verloren und würde sonst leise bestehen")
|
|
393
|
+
return None
|
|
394
|
+
try:
|
|
395
|
+
quelle = json.loads(clientmap.load_source(kern, "permissions.json"))
|
|
396
|
+
return {korb: clientmap.basket_rules(quelle, man, korb)
|
|
397
|
+
for korb in ("deny", "ask", "allow")}
|
|
398
|
+
except (OSError, ValueError) as exc:
|
|
399
|
+
err(f"Kernquelle der Berechtigungen nicht auswertbar: {exc}")
|
|
400
|
+
return None
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
def skill_dirs(root: str, man: dict) -> list[tuple[str, str]]:
|
|
404
|
+
"""Alle Skill-Ablagen: die aktivierte Laufzeitschicht und die Quellablagen der Packs.
|
|
405
|
+
|
|
406
|
+
Pack-Skills liegen unter framework/{role,tech}-packs/<pack>/skills/ und werden erst zur
|
|
407
|
+
Aktivierung nach .devin/skills/ kopiert. Ohne diese Ablagen wuerde ein fehlerhafter
|
|
408
|
+
Pack-Skill erst im uebernehmenden Projekt auffallen - also nach der Auslieferung.
|
|
409
|
+
"""
|
|
410
|
+
out: list[tuple[str, str]] = []
|
|
411
|
+
runtime = os.path.join(root, *man["skills_dir"].split("/"))
|
|
412
|
+
if os.path.isdir(runtime):
|
|
413
|
+
out.append((runtime, man["skills_dir"]))
|
|
414
|
+
# Gemeinsame Quelle der Framework-Skills (seit 0.5.0). Sie wird streng geprueft;
|
|
415
|
+
# die installierte Fassung ist daraus erzeugt.
|
|
416
|
+
quelle = os.path.join(root, ".koolie/core", "framework", "skills")
|
|
417
|
+
if os.path.isdir(quelle):
|
|
418
|
+
out.append((quelle, ".koolie/core/framework/skills"))
|
|
419
|
+
for kind in ("role-packs", "tech-packs"):
|
|
420
|
+
base = os.path.join(root, ".koolie/core", "framework", kind)
|
|
421
|
+
if not os.path.isdir(base):
|
|
422
|
+
continue
|
|
423
|
+
for pack in sorted(os.listdir(base)):
|
|
424
|
+
src = os.path.join(base, pack, "skills")
|
|
425
|
+
if os.path.isdir(src):
|
|
426
|
+
out.append((src, f".koolie/core/framework/{kind}/{pack}/skills"))
|
|
427
|
+
return out
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
# --- Ausnahmen der Werkzeugneutralitaet (D-128, D-129) ----------------------------
|
|
431
|
+
#
|
|
432
|
+
# EINE Menge fuer BEIDE Pruefungen, die den Kern auf Clientbindung halten: Pruefung 14
|
|
433
|
+
# (der Produktname) und Pruefung 48 (der Pfad). Bis 0.57.0 fuehrten sie zwei Mengen -
|
|
434
|
+
# und die waren schon auseinandergelaufen: docs/ROADMAP.md stand nur in einer von
|
|
435
|
+
# beiden. Zwei Listen fuer denselben Gegenstand driften; eine tut es nicht.
|
|
436
|
+
#
|
|
437
|
+
# Die Gattungen und ihre Begruendung stehen in docs/RUNTIME_GLOSSARY.md, nicht hier -
|
|
438
|
+
# eine Ausnahme, die nur im Quelltext steht, ist keine Regel, sondern eine
|
|
439
|
+
# Voreinstellung.
|
|
440
|
+
NEUTRAL_CHRONIK = (
|
|
441
|
+
KERN + "/CHANGELOG.md",
|
|
442
|
+
KERN + "/governance/change-requests/",
|
|
443
|
+
KERN + "/governance/DECISION_LOG.md",
|
|
444
|
+
KERN + "/tests/protocols/",
|
|
445
|
+
KERN + "/docs/ROADMAP.md",
|
|
446
|
+
)
|
|
447
|
+
# Jeder Aenderungsverlauf ist ein historisches Dokument, nicht nur der des Frameworks.
|
|
448
|
+
NEUTRAL_CHRONIK_BASENAMES = ("CHANGELOG.md",)
|
|
449
|
+
# DIE BEFRISTETE AUSNAHME FUER build/ IST MIT 0.89.0 GEFALLEN (AP11, D-311).
|
|
450
|
+
#
|
|
451
|
+
# Sie galt fuer das GANZE Verzeichnis, mit der Begruendung, es halte die Quellen des
|
|
452
|
+
# Hauptdokuments, das mit AP11 neu gesetzt werde. Gemessen beim Neusetzen: Von 36
|
|
453
|
+
# Fundstellen lagen 27 in den beiden ANHANG- und ABSCHLUSSTRAEGERN - der Quellenliste
|
|
454
|
+
# JE CLIENT PACK und dem konsolidierten Verifikationsbedarf EINES Packs. Das ist
|
|
455
|
+
# dieselbe Gattung, die NEUTRAL_ABBILDUNG seit 0.57.1 dauerhaft ausnimmt, und
|
|
456
|
+
# CR-2026-025 E3 hatte sie 2026-09-11 auch schon ausdruecklich ausgewiesen
|
|
457
|
+
# ("die Anhaenge beschreiben teils Pruefpunkte gegen die Dokumentation eines konkreten
|
|
458
|
+
# Clients"). EINE FRIST UEBER EINEN GEGENSTAND, DER DIE AUSNAHME DAUERHAFT BRAUCHT,
|
|
459
|
+
# KANN NICHT ABLAUFEN - sie sieht nur zwanzig Releases lang so aus, als lehne sie an.
|
|
460
|
+
#
|
|
461
|
+
# Die uebrigen neun Fundstellen lagen in den Kapiteln und sind mit 0.89.0 aufgeloest.
|
|
462
|
+
# Was bleibt, ist eine Dauerausnahme ueber DREI benannte Traeger, nicht ueber ein
|
|
463
|
+
# Verzeichnis:
|
|
464
|
+
# 29-grenzen.md Zeitdokument des Stands vom 2026-09-01, ausdruecklich nicht
|
|
465
|
+
# fortgeschrieben - Chronik wie CHANGELOG.md und DECISION_LOG.md
|
|
466
|
+
# 31-anhaenge.md Quellenliste JE CLIENT PACK und Verifikationsbedarf EINES Packs
|
|
467
|
+
# 32-abschluss.md Chronik der Releases und die Aussagen des Auftrags UEBER die
|
|
468
|
+
# Produktnennung selbst ("der Hersteller-/Produktbezug ist fuer
|
|
469
|
+
# Phase 3 erforderlich")
|
|
470
|
+
NEUTRAL_DOKUMENT = (
|
|
471
|
+
KERN + "/build/doc/29-grenzen.md",
|
|
472
|
+
KERN + "/build/doc/31-anhaenge.md",
|
|
473
|
+
KERN + "/build/doc/32-abschluss.md",
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
# Pruefung 15: Der Interpreter der Hook-Aufrufe startet auf dieser Maschine wirklich
|
|
478
|
+
# Python. Geprueft wird die Wirkung, nicht die Anwesenheit des Namens (AP2-CC-13).
|
|
479
|
+
HOOK_SONDE = "KOOLIE-INTERPRETER-OK"
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
def _client_packs(root: str) -> list[tuple[str, str, dict]]:
|
|
483
|
+
"""(Kennung, Verzeichnis, Manifest) je Client Pack; OHNE die Vorlage `_template`.
|
|
484
|
+
|
|
485
|
+
🔴 D-336: Bis 1.2.0 stand hier "_template ohne Manifest" - eine Annahme, keine
|
|
486
|
+
Ausnahme. `_template` traegt eine CLIENT_PACK.md und stand damit in dieser Menge;
|
|
487
|
+
was es vor allen Pruefungen schuetzte, war allein sein fehlendes `manifest.json`.
|
|
488
|
+
Gemessen am 2026-09-23 mit einem Probemanifest: drei Packs mit Manifest, Validator
|
|
489
|
+
0 Fehler. Und `clients/README.md` Schritt 5 verlangt genau dieses Manifest fuer
|
|
490
|
+
jedes neue Pack.
|
|
491
|
+
➡️ Eine Vorlage, die nur durch ihre Unvollstaendigkeit ungeprueft bleibt, ist nicht
|
|
492
|
+
ausgenommen. Die Ausnahme steht seit D-336 HIER, wo die Packmenge entsteht - und
|
|
493
|
+
Pruefung 84 haelt fest, was sie voraussetzt.
|
|
494
|
+
"""
|
|
495
|
+
raus: list[tuple[str, str, dict]] = []
|
|
496
|
+
cdir = os.path.join(root, KERN, "clients")
|
|
497
|
+
if not os.path.isdir(cdir):
|
|
498
|
+
return raus
|
|
499
|
+
for name in sorted(os.listdir(cdir)):
|
|
500
|
+
if name == "_template":
|
|
501
|
+
continue # die Vorlage ist kein Pack (D-336, Pruefung 84)
|
|
502
|
+
pdir = os.path.join(cdir, name)
|
|
503
|
+
if not os.path.isdir(pdir):
|
|
504
|
+
continue
|
|
505
|
+
if not os.path.isfile(os.path.join(pdir, "CLIENT_PACK.md")):
|
|
506
|
+
continue
|
|
507
|
+
mf = os.path.join(pdir, "manifest.json")
|
|
508
|
+
man: dict = {}
|
|
509
|
+
if os.path.isfile(mf):
|
|
510
|
+
try:
|
|
511
|
+
man = json.loads(read(mf))
|
|
512
|
+
except Exception:
|
|
513
|
+
man = {}
|
|
514
|
+
raus.append((name, pdir, man))
|
|
515
|
+
return raus
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
def _hook_interpreter() -> str | None:
|
|
519
|
+
"""Der erste Interpretername, der auf dieser Maschine wirklich Python startet."""
|
|
520
|
+
for kandidat in ("python3", "python", "py"):
|
|
521
|
+
try:
|
|
522
|
+
lauf = subprocess.run([kandidat, "-c", "import sys; sys.stdout.write('%s')" % HOOK_SONDE],
|
|
523
|
+
capture_output=True, text=True, timeout=15)
|
|
524
|
+
if lauf.returncode == 0 and HOOK_SONDE in (lauf.stdout or ""):
|
|
525
|
+
return kandidat
|
|
526
|
+
except (OSError, subprocess.SubprocessError):
|
|
527
|
+
continue
|
|
528
|
+
return None
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
def _hook_lauf(interpreter: str, skript: str, eingabe: str) -> int:
|
|
532
|
+
"""Ruft den Schutz-Hook mit --fail-closed auf und liefert den Exit-Code."""
|
|
533
|
+
try:
|
|
534
|
+
lauf = subprocess.run([interpreter, skript, "--fail-closed"], input=eingabe,
|
|
535
|
+
capture_output=True, text=True, timeout=20,
|
|
536
|
+
env={k: v for k, v in os.environ.items()
|
|
537
|
+
if k != "FW_HOOK_FAIL_CLOSED"})
|
|
538
|
+
except (OSError, subprocess.SubprocessError):
|
|
539
|
+
return -1
|
|
540
|
+
return lauf.returncode
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
# Pruefung 38: Eine Quelle, ein Vokabular - und die Sperrliste ist nie enger als die
|
|
544
|
+
# Vorabfreigabe (CR-2026-062, D-78 bis D-80).
|
|
545
|
+
#
|
|
546
|
+
# ANLASS. Ein Manifest fuehrt VIER Werkzeugabbildungen, nicht zwei: skill_frontmatter.
|
|
547
|
+
# tool_names, agent_frontmatter.tool_names, hook_tools und permission_tools - dazu
|
|
548
|
+
# agent_start_tools daneben. Drei Vokabulare stossen darin aufeinander: das der Quelle
|
|
549
|
+
# (read, grep, glob, edit, exec), das des Hooks (read, search, exec, write) und das der
|
|
550
|
+
# Berechtigungsdatei (read, search, write, exec, fetch, mcp).
|
|
551
|
+
#
|
|
552
|
+
# Gemessen am 2026-09-13 (tests/protocols/2026-09-13-gegenpruefung-werkzeugabbildung.md):
|
|
553
|
+
# DREI der vier Abbildungen brechen ab, wenn ihnen ein Verb fehlt - die vierte reichte
|
|
554
|
+
# es woertlich durch, und sie kommt zweimal vor. Eine geleerte tool_names-Abbildung
|
|
555
|
+
# lieferte 'tools: read, grep, glob' im Agentenprofil fw-reviewer, also drei Namen, die
|
|
556
|
+
# dieser Client nicht kennt (M16); ein 'permissions.deny: glob' erzeugte lautlos keine
|
|
557
|
+
# Sperre, und der Validator meldete 0 Fehler (M6).
|
|
558
|
+
#
|
|
559
|
+
# VIER GEGENSTAENDE:
|
|
560
|
+
# 1. Der verlorene Anker. Fehlen clientmap.FRONTMATTER_VERBEN oder VERB_BRUECKE,
|
|
561
|
+
# meldet diese Pruefung das selbst - sonst bestuende sie leise (D-23).
|
|
562
|
+
# 2. Die Deklaration je Pack. Jedes Verb des Vokabulars ist in tool_names abgebildet
|
|
563
|
+
# ODER in tool_names_unmapped erklaert, samt nicht leerer _tool_names_unmapped_note;
|
|
564
|
+
# beides zugleich ist ein Widerspruch, ein Schluessel ausserhalb des Vokabulars ein
|
|
565
|
+
# Schreibfehler. Bauform wie Pruefung 26 (hook_tools_absent, D-47) und Pruefung 34.
|
|
566
|
+
# 3. Die RICHTUNG zwischen Vorabfreigabe und Sperre. Fuer jedes Verbpaar der Bruecke
|
|
567
|
+
# muss hook_tools mindestens so weit sein wie tool_names. Heute ist es das bei allen
|
|
568
|
+
# fuenf; die Abweichung, die es gibt, geht in die zulaessige Richtung
|
|
569
|
+
# (tool_names.edit fuehrt Edit und Write, hook_tools.write zusaetzlich NotebookEdit).
|
|
570
|
+
# Umgekehrt waere sie eine Luecke: Ein Skill, der 'edit' vorab freigibt und 'edit'
|
|
571
|
+
# sperrt, bekaeme ein Werkzeug freigegeben, das die Sperre nicht erfasst.
|
|
572
|
+
# 4. Die Quellen. Kein ausgeliefertes SKILL.md und kein Agentenprofil nennt in
|
|
573
|
+
# allowed-tools oder permissions.deny ein Verb ausserhalb des Vokabulars.
|
|
574
|
+
#
|
|
575
|
+
# WAS SIE HEUTE FAENGT: bei den beiden Packs nichts - sie sind in Ordnung, seit
|
|
576
|
+
# devin-desktop seine fuenf nicht abgebildeten Verben deklariert. Gegenstand 3 ist eine
|
|
577
|
+
# VERANKERUNG wie Pruefung 35 und 36; Gegenstand 2 faengt gegen 0.39.0 zehn Fundstellen,
|
|
578
|
+
# Gegenstand 4 keine. Das steht so im Wirkungsnachweis und ist kein Abzaehlen von
|
|
579
|
+
# Befunden, sondern eines von Deklarationen.
|
|
580
|
+
#
|
|
581
|
+
# WAS SIE NICHT LEISTET: Sie belegt nicht, dass die Werkzeugnamen eines Packs RICHTIG
|
|
582
|
+
# sind - das kann nur eine Erhebung, und fuer devin-desktop steht sie aus. Sie belegt,
|
|
583
|
+
# dass jedes Verb des Vokabulars eine Antwort hat und dass die beiden Listen nicht in
|
|
584
|
+
# die gefaehrliche Richtung auseinanderlaufen.
|
|
585
|
+
FRONTMATTER_BLOECKE = ("skill_frontmatter", "agent_frontmatter")
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
# ---------------------------------------------------------------------------
|
|
589
|
+
# Pruefung 40: Die Register des Pruefapparats werden nachgezaehlt
|
|
590
|
+
# ---------------------------------------------------------------------------
|
|
591
|
+
#
|
|
592
|
+
# ANLASS. Gemessen am 2026-09-14 (tests/protocols/2026-09-14-gegenpruefung-pruefregister.md,
|
|
593
|
+
# CR-2026-064): FUENF Aussagen ueber den eigenen Pruefstand, keine davon richtig. Das
|
|
594
|
+
# Register im Kopfkommentar dieser Datei fuehrte die Pruefungen 1 bis 38, waehrend 39
|
|
595
|
+
# lief; der Satz zum Wirkungsnachweis nannte "18 bis 30"; der Kopfsatz des Sondenskripts
|
|
596
|
+
# war eine Release-Chronik, die bei 0.29.0 endete; FW-KO-01 nannte "6, 18 bis 31" und
|
|
597
|
+
# FW-KO-05 zwoelf Grenzfaelle, wo es zwanzig sind. KEINE der fuenf war falsch
|
|
598
|
+
# geschrieben - alle fuenf waren bei ihrer Einfuehrung richtig und sind stehen geblieben,
|
|
599
|
+
# waehrend ihr Gegenstand wuchs. In zehn von zwoelf Releases hat sich mindestens eine der
|
|
600
|
+
# drei Zahlen bewegt; deshalb ist die Behebung eine Pruefung und keine Textaenderung.
|
|
601
|
+
#
|
|
602
|
+
# VIER GEGENSTAENDE:
|
|
603
|
+
# 1. Der verlorene Anker. Fuenf Ankertexte in vier Dateien. Geht einer verloren,
|
|
604
|
+
# bestuende diese Pruefung leise - sie meldet sein Fehlen deshalb selbst (D-23).
|
|
605
|
+
# 2. Das Register ist lueckenlos von 1 bis zu seiner hoechsten Nummer, und diese
|
|
606
|
+
# hoechste Nummer ist die hoechste, die in den beiden Pruefskripten ueberhaupt
|
|
607
|
+
# genannt wird. In beide Richtungen: eine Pruefung ohne Eintrag ist ein Fehler, ein
|
|
608
|
+
# Eintrag ohne Nennung im Code auch.
|
|
609
|
+
# 3. Die Sondenmenge steht an DREI Stellen in derselben, ausgerechneten Schreibweise -
|
|
610
|
+
# im Satz unter dem Register, im Kopfsatz von probe-pruefungen.py und in der
|
|
611
|
+
# Pruefmittelspalte von FW-KO-01. Der Vergleich ist woertlich, und die Fehlermeldung
|
|
612
|
+
# nennt die richtige Zeichenkette (D-86).
|
|
613
|
+
# 4. Die Grenzfallanzahl in FW-KO-05 ist die gezaehlte. Pruefung 30 rechnet sie
|
|
614
|
+
# INNERHALB von EDGE_CASES.md nach; ausserhalb nennt sie nur dieses Testblatt, und
|
|
615
|
+
# dort als Arbeitsanweisung: Wer FW-KO-05 heute faehrt, prueft zwoelf von zwanzig
|
|
616
|
+
# Grenzfaellen und meldet ihn bestanden.
|
|
617
|
+
#
|
|
618
|
+
# WARUM NICHT DIE KOPFKOMMENTARE ALS ANKER (CR-2026-064 E2). Gemessen tragen sie drei
|
|
619
|
+
# Formen - "# Pruefung N:", "# N:" und "# Pruefungen N bis M" -, und eine vierte sieht
|
|
620
|
+
# aus wie ein Kopf und ist keiner: "# Pruefung 37 und dieselbe Ehrlichkeit ..." im Block
|
|
621
|
+
# von Pruefung 39. Der erste Entwurf dieser Pruefung ist genau daran gefallen und hat
|
|
622
|
+
# Pruefung 37 gefunden, wo kein Kopf stand.
|
|
623
|
+
#
|
|
624
|
+
# WARUM NUR TEST_CATALOG.md UND NICHT DAS GANZE REPOSITORIUM (D-86). docs/ROADMAP.md,
|
|
625
|
+
# CR-2026-052 und der Wirkungsnachweis zu 0.32.0 nennen ebenfalls zwoelf Grenzfaelle -
|
|
626
|
+
# und sind RICHTIG, weil sie den Stand von 0.32.0 beschreiben. Eine Nennung in der
|
|
627
|
+
# Vorgeschichte ist kein Register, und wer sie mitzieht, macht aus einer richtigen Zeile
|
|
628
|
+
# eine falsche.
|
|
629
|
+
#
|
|
630
|
+
# GRENZE. Sie zaehlt NENNUNGEN, nicht Pruefungen: Wer eine Pruefung baut und ihre Nummer
|
|
631
|
+
# nirgends schreibt, wird nicht gefangen - dieselbe Ehrlichkeit wie Gegenstand 2 von
|
|
632
|
+
# Pruefung 38, der Deklarationen zaehlt und nicht Richtigkeit. Und sie belegt die
|
|
633
|
+
# VOLLSTAENDIGKEIT des Registers, nicht die Richtigkeit seiner Eintraege: Ein Eintrag,
|
|
634
|
+
# der etwas anderes beschreibt als seine Pruefung tut, laeuft durch.
|
|
635
|
+
REGISTER_ANKER = "Prüft (statisch, ohne laufenden KI-Client):"
|
|
636
|
+
REGISTER_ENDE = "Der Wirksamkeitsnachweis nach D-23"
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
def _ueb_katalogdateien(root: str) -> list:
|
|
640
|
+
"""Der Testkatalog und die dezentralen Testblaetter je Skill (Verfahren Nr. 6)."""
|
|
641
|
+
treffer = [os.path.join(KERN, "tests", "TEST_CATALOG.md")]
|
|
642
|
+
basis = os.path.join(root, KERN, "framework")
|
|
643
|
+
for dirpath, dirnames, filenames in os.walk(basis):
|
|
644
|
+
dirnames[:] = sorted(d for d in dirnames if d != "__pycache__")
|
|
645
|
+
if "TESTS.md" in filenames:
|
|
646
|
+
treffer.append(os.path.relpath(os.path.join(dirpath, "TESTS.md"), root))
|
|
647
|
+
return sorted(treffer)
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
def _verfolgte_dateien(root: str) -> list | None:
|
|
651
|
+
"""Vom Versionsverwalter verfolgte Pfade unter <CORE_DIR>/ - oder None.
|
|
652
|
+
|
|
653
|
+
None heisst: nicht messbar. Kein git im Pfad, keine Versionierung, oder der Aufruf
|
|
654
|
+
ist gescheitert. Der Unterschied zu einer leeren Liste ist der ganze Punkt - eine
|
|
655
|
+
leere Liste ist ein Messergebnis, None ist keins.
|
|
656
|
+
"""
|
|
657
|
+
try:
|
|
658
|
+
lauf = subprocess.run(["git", "-C", root, "ls-files", "-z", "--", KERN],
|
|
659
|
+
capture_output=True, text=True, encoding="utf-8",
|
|
660
|
+
errors="replace", timeout=30)
|
|
661
|
+
except (OSError, subprocess.SubprocessError):
|
|
662
|
+
return None
|
|
663
|
+
if lauf.returncode != 0:
|
|
664
|
+
return None
|
|
665
|
+
return _git_pfade(lauf.stdout)
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
def _git_pfade(ausgabe: str | None) -> list:
|
|
669
|
+
"""Die Pfade einer `git ... -z`-Ausgabe (CR-2026-135, D-352).
|
|
670
|
+
|
|
671
|
+
OHNE `-z` IST DIE AUSGABE KEIN PFAD MEHR, SOBALD ER EIN NICHT-ASCII-ZEICHEN TRAEGT.
|
|
672
|
+
git quotet ihn dann (`core.quotePath`, Vorgabe an) - aus einem U-Umlaut wird
|
|
673
|
+
`"docs/\\303\\234bersicht.md"`, samt Anfuehrungszeichen. Die Pruefungen 75 und 81
|
|
674
|
+
fanden unter diesem Namen keine Datei und gingen LEISE weiter; 78 zaehlte ihn als
|
|
675
|
+
Datei, aber nicht als Markdown - das schliessende Anfuehrungszeichen steht hinter
|
|
676
|
+
der Endung. Gemessen: Ein Traeger mit U-Umlaut im Namen und gemischten
|
|
677
|
+
Zeilenenden war fuer Pruefung 81 unsichtbar (Sonde 81e). Dieselbe Ursache wie in
|
|
678
|
+
`install.py` - eine Pfadliste als Textzeilen statt NUL-getrennt.
|
|
679
|
+
"""
|
|
680
|
+
return [z for z in (ausgabe or "").split("\0") if z]
|
|
681
|
+
|
|
682
|
+
|
|
683
|
+
def _tabellenspalte(kopf: str, ueberschrift: str) -> int:
|
|
684
|
+
"""Index der Spalte mit dieser Ueberschrift - ueber die STELLUNG, nicht die Nummer.
|
|
685
|
+
|
|
686
|
+
Eine neue Spalte im Testkatalog verschiebt sonst jede Pruefung, die eine Nummer
|
|
687
|
+
verdrahtet hat. -1 heisst: diese Tabelle fuehrt die Spalte nicht.
|
|
688
|
+
"""
|
|
689
|
+
zellen = [z.strip() for z in kopf.strip().strip("|").split("|")]
|
|
690
|
+
for i, z in enumerate(zellen):
|
|
691
|
+
if z == ueberschrift:
|
|
692
|
+
return i
|
|
693
|
+
return -1
|
|
694
|
+
|
|
695
|
+
|
|
696
|
+
# --- Pruefung 67: ENTFALLEN mit 1.4.1 (D-350) --------------------------------------
|
|
697
|
+
#
|
|
698
|
+
# Sie hielt die Titelzeile der Uebergabe gegen VERSION (D-216). Seit 1.4.1 ist die
|
|
699
|
+
# Uebergabe ein lokales Arbeitsdokument und nicht mehr versioniert; ihr Gegenstand
|
|
700
|
+
# fehlt in jeder frischen Auscheckung. Die Nummer bleibt im Register, damit es
|
|
701
|
+
# lueckenlos bleibt und keine andere Pruefung sie erbt.
|
|
702
|
+
#
|
|
703
|
+
# DAS KENNZEICHEN DES QUELLREPOSITORIUMS (D-351). Bis 1.4.0 unterschieden die
|
|
704
|
+
# Pruefungen 75, 78, 79 und 81 an UEBERGABE.md, ob sie im Framework-Repositorium oder
|
|
705
|
+
# in einem uebernehmenden Projekt laufen. Mit der Uebergabe ist dieser Anker aus dem
|
|
706
|
+
# Versionierten verschwunden - und die Pruefungen 75 und 81 lesen `git ls-files`:
|
|
707
|
+
# Sie haetten das Quellrepositorium LEISE fuer ein Projekt gehalten und nur noch das
|
|
708
|
+
# Ausgelieferte geprueft, auch auf dem Arbeitsplatz, der die Datei noch fuehrt.
|
|
709
|
+
# ➡️ Ein Anker, der nur an einem Arbeitsplatz liegt, ist keiner.
|
|
710
|
+
# Das Kennzeichen ist deshalb eine eigene, versionierte Datei NEBEN dem Kern: Das
|
|
711
|
+
# Heben kopiert nur den Kern, und install.py legt sie nicht an.
|
|
712
|
+
# Die Einstiegsdokumente des Quellrepositoriums in seiner Wurzel (D-437): die README,
|
|
713
|
+
# der Quickstart und ihre englischen Fassungen. Klasse A wie die README, und aus
|
|
714
|
+
# demselben Grund nur im Quellrepositorium - in einem Projekt gehoert die Wurzel dem
|
|
715
|
+
# Projekt (D-299). Pruefung 92 ist fuer die englischen Fassungen wirkungslos, aber
|
|
716
|
+
# harmlos: Ihre Stammliste ist deutsch und trifft englischen Text nicht.
|
|
717
|
+
DOK_WURZEL = ("README.md", "README.en.md", "QUICKSTART.md", "QUICKSTART.en.md")
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
QUELLREPO_KENNZEICHEN = ".koolie/QUELLREPOSITORIUM.md"
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
def ist_quellrepositorium(root: str) -> bool:
|
|
724
|
+
"""Traegt dieser Baum das Kennzeichen des Framework-Repositoriums (D-351)?"""
|
|
725
|
+
return os.path.isfile(os.path.join(root, *QUELLREPO_KENNZEICHEN.split("/")))
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
# --- Pruefung 90: Der Lieferumfang einer Installation (D-367, CR-2026-141) ----------
|
|
729
|
+
#
|
|
730
|
+
# ANLASS. Seit 1.8.0 kann ein Projekt den Kern ohne die Nachweisschicht bekommen
|
|
731
|
+
# (install.py --target --lieferumfang nutzung). Die Nachweisschicht steht an EINER
|
|
732
|
+
# Stelle - clientmap.NACHWEIS_ABLAGEN -, und dieser Validator liest sie dort, statt sie
|
|
733
|
+
# ein zweites Mal aufzuzaehlen: zwei Listen, die einander decken sollen, sind die
|
|
734
|
+
# Bauform von 0.57.0.
|
|
735
|
+
#
|
|
736
|
+
# WAS SICH IN EINER REDUZIERTEN INSTALLATION AENDERT, und nur das (gemessen am
|
|
737
|
+
# 2026-09-25 an allen drei Packs): 70 Verweise ausgelieferter Traeger zeigen in
|
|
738
|
+
# tests/protocols/ - Herkunftsangaben, deren Aussage ohne die Datei steht -, und drei
|
|
739
|
+
# Pruefungen verlieren ihren Gegenstand: 76 (eine ihrer vier Stellen,
|
|
740
|
+
# tests/erhebungen/ablage.py), 77 (build/doc/00-kopf.md) und 80 (tests/protocols/).
|
|
741
|
+
# Alles das wird dort nicht gemeldet, sondern als HINWEIS genannt. Jede andere Zeile
|
|
742
|
+
# bleibt, wie sie in einer vollen Installation stuende - die Sonde L367 haelt beide
|
|
743
|
+
# Ausgaben zeilengleich gegeneinander.
|
|
744
|
+
#
|
|
745
|
+
# DREI GEGENSTAENDE:
|
|
746
|
+
# (a) LIEFERUMFANG traegt einen bekannten Wert.
|
|
747
|
+
# (b) "nutzung" stimmt mit dem Bestand: Keine Ablage der Nachweisschicht liegt da.
|
|
748
|
+
# Sonst behauptete die Datei weniger, als geliefert ist - und das naechste Heben
|
|
749
|
+
# loeschte es.
|
|
750
|
+
# (c) Das Quellrepositorium fuehrt KEINE solche Datei. Es ist keine Installation;
|
|
751
|
+
# eine Quelle, die "nutzung" behauptet, kann install.py keinen vollen Kern mehr
|
|
752
|
+
# liefern. Die Lockerung oben gilt dort ohnehin nie - was immer die Datei sagt.
|
|
753
|
+
# GRENZE. Ob die Nutzung ohne die Nachweisschicht auskommt, belegt nicht diese
|
|
754
|
+
# Pruefung, sondern der Vergleich einer reduzierten mit einer vollen Installation
|
|
755
|
+
# (Sonde L367). Ein Traeger, den ein Werkzeug zur Laufzeit aus der Nachweisschicht
|
|
756
|
+
# liest, fiele erst dort auf.
|
|
757
|
+
def _clientmap(root: str):
|
|
758
|
+
kern = os.path.join(root, KERN)
|
|
759
|
+
if not os.path.isdir(kern):
|
|
760
|
+
return None
|
|
761
|
+
if kern not in sys.path:
|
|
762
|
+
sys.path.insert(0, kern)
|
|
763
|
+
try:
|
|
764
|
+
import clientmap
|
|
765
|
+
except ImportError:
|
|
766
|
+
return None
|
|
767
|
+
return clientmap if hasattr(clientmap, "NACHWEIS_ABLAGEN") else None
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
def reduziert(root: str) -> bool:
|
|
771
|
+
"""Liegt hier eine Installation mit Lieferumfang 'nutzung' (D-367)?"""
|
|
772
|
+
if ist_quellrepositorium(root):
|
|
773
|
+
return False
|
|
774
|
+
cm = _clientmap(root)
|
|
775
|
+
return cm is not None and cm.lieferumfang(os.path.join(root, KERN)) == "nutzung"
|
|
776
|
+
|
|
777
|
+
|
|
778
|
+
def nicht_geliefert(root: str, rel: str) -> bool:
|
|
779
|
+
"""Ist rel (projektrelativ) ein Teil der Nachweisschicht, den diese reduzierte
|
|
780
|
+
Installation nicht mitliefert?"""
|
|
781
|
+
if not rel.startswith(KERN + "/") or not reduziert(root):
|
|
782
|
+
return False
|
|
783
|
+
return _clientmap(root).ist_nachweis(rel[len(KERN) + 1:])
|
|
784
|
+
P73_ZEILE_RE = re.compile(r"^\|\s*([RSBHAMX]\d+)\s*\|")
|