@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,357 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Sagt den Skripten dieser Ablage, WOHIN ihre Belege und Prompts gehoeren.
|
|
3
|
+
|
|
4
|
+
🔴 DER ANLASS IST D-222 SELBST. Bis zum Meßtag von Buendel 4 lag der Apparat in
|
|
5
|
+
`devpacks/leitwerk-erhebungen-2026-09-19-b4/skripte/`, und fuenf Skripte legten
|
|
6
|
+
ihre Belege schlicht *neben sich*:
|
|
7
|
+
|
|
8
|
+
BELEGE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "belege")
|
|
9
|
+
|
|
10
|
+
Das war richtig, solange das Skript daneben lag. **Mit 0.79.0 ist der Apparat ins
|
|
11
|
+
Repositorium gewandert - und derselbe Ausdruck zeigt seither HINEIN.** Ein
|
|
12
|
+
Nachlauf haette 44 Belegdateien samt Sitzungsmitschriften mit Werkzeugeingaben
|
|
13
|
+
unter `<CORE_DIR>/tests/erhebungen/belege/` angelegt; `lauf.py` erzeugt das
|
|
14
|
+
Verzeichnis selbst. Genau das hat D-222 verworfen:
|
|
15
|
+
|
|
16
|
+
"Verworfen: auch die Belege zu versionieren (203 Dateien, darunter fuenfzig
|
|
17
|
+
Sitzungstranskripte mit Werkzeugeingaben; sie sind AUFZEICHNUNG, nicht
|
|
18
|
+
Anweisung - dieselbe Trennlinie, die D-141 fuer den Kontrollzuschnitt zieht)."
|
|
19
|
+
|
|
20
|
+
Wer einen Apparat umzieht, zieht seine relativen Pfade mit um - oder er
|
|
21
|
+
verschiebt ihr Ziel, ohne es zu merken.
|
|
22
|
+
|
|
23
|
+
DIE ABLAGE WIRD GESAGT, NICHT ABGELEITET - dieselbe Lehre wie `--ziel` beim
|
|
24
|
+
Baumbau (D-218). Ein Standardwert im Quelltext waere eine gepflegte Zahl: Er
|
|
25
|
+
stimmt fuer die Erhebung, fuer die er geschrieben wurde, und fuer keine danach.
|
|
26
|
+
|
|
27
|
+
set LW_ERHEBUNG=C:\\Users\\...\\devpacks\\leitwerk-erhebungen-2026-09-20-b4n # SYNTHETISCH
|
|
28
|
+
|
|
29
|
+
Fehlt die Angabe, bricht jedes Skript ab, das eine Belegablage braucht. Ein
|
|
30
|
+
Abbruch ist billiger als ein Beleg am falschen Ort.
|
|
31
|
+
"""
|
|
32
|
+
import io
|
|
33
|
+
import os
|
|
34
|
+
import re
|
|
35
|
+
import sys
|
|
36
|
+
|
|
37
|
+
UMGEBUNG = "LW_ERHEBUNG"
|
|
38
|
+
|
|
39
|
+
# Die Kennung einer Blattzelle, ausgeschrieben und zusammengezogen. Sie steht
|
|
40
|
+
# seit 0.82.0 an EINER Stelle; bis dahin uebersetzte `baeume-b4.py` sie mit
|
|
41
|
+
# `kern[:2].upper()` und `dossier-b4.py` gar nicht zurueck.
|
|
42
|
+
_KENNUNG_RE = re.compile(r"^([A-Z]{2,3}-[0-9]{3})-[PN][0-9]{2}$")
|
|
43
|
+
_KURZ_RE = re.compile(r"^([a-z]{2,3})([0-9]{3})([pn][0-9]{2})$")
|
|
44
|
+
|
|
45
|
+
# Die Wurzel des Repositoriums: dieses Modul liegt in
|
|
46
|
+
# <wurzel>/.koolie/core/tests/erhebungen/ - also VIER Ebenen unter der Wurzel.
|
|
47
|
+
#
|
|
48
|
+
# 0.88.0: Bis dahin waren es drei, weil der Kern ein einziges Verzeichnissegment
|
|
49
|
+
# war (`leitwerk-core`). Der Umzug nach `.koolie/core` haette WURZEL auf `.koolie/`
|
|
50
|
+
# gesetzt, und jeder abgeleitete Kernpfad haette ein Segment zu wenig getragen.
|
|
51
|
+
# Die Zahl wird deshalb aus CORE_TIEFE gerechnet und nicht im Quelltext gezaehlt
|
|
52
|
+
# (D-299).
|
|
53
|
+
CORE_REL = ".koolie/core"
|
|
54
|
+
CORE_TIEFE = CORE_REL.count("/") + 1
|
|
55
|
+
|
|
56
|
+
_HIER = os.path.dirname(os.path.abspath(__file__))
|
|
57
|
+
_KERN = os.path.dirname(os.path.dirname(_HIER)) # die Lage aus CORE_REL
|
|
58
|
+
WURZEL = _KERN
|
|
59
|
+
for _ in range(CORE_TIEFE):
|
|
60
|
+
WURZEL = os.path.dirname(WURZEL)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _innerhalb(pfad, wurzel):
|
|
64
|
+
"""True, wenn `pfad` unter `wurzel` liegt - ohne Praefixvergleich auf Text.
|
|
65
|
+
|
|
66
|
+
Ein Praefixvergleich auf der Zeichenkette nimmt ein GESCHWISTERverzeichnis,
|
|
67
|
+
dessen Name mit dem der Wurzel beginnt, faelschlich als deren Kind:
|
|
68
|
+
`...\\koolie-erhebungen` neben `...\\koolie`. Das ist genau die Bauform von
|
|
69
|
+
D-219, eine Ebene tiefer: ein Praefix, das mehr erfasst als sein Gegenstand.
|
|
70
|
+
|
|
71
|
+
0.88.0: Der Satz nannte bis dahin `...\\leitwerk-erhebungen` neben
|
|
72
|
+
`...\\leitwerk`. Die Belegablagen behalten ihren alten Namen (sie sind
|
|
73
|
+
datierte Aufzeichnungen und werden nicht umbenannt), das Repositorium nicht -
|
|
74
|
+
damit ist GENAU DIESES Paar kein Beispiel mehr. Der Fall bleibt herstellbar,
|
|
75
|
+
sobald eine Ablage neben dem Repositorium liegt und dessen Namen als Praefix
|
|
76
|
+
traegt; deshalb steht hier ein Beispiel mit dem neuen Namen und nicht der
|
|
77
|
+
alte Satz.
|
|
78
|
+
"""
|
|
79
|
+
try:
|
|
80
|
+
gemeinsam = os.path.commonpath([os.path.abspath(pfad),
|
|
81
|
+
os.path.abspath(wurzel)])
|
|
82
|
+
except ValueError: # verschiedene Laufwerke
|
|
83
|
+
return False
|
|
84
|
+
return gemeinsam == os.path.abspath(wurzel)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def erhebung():
|
|
88
|
+
"""Der Wurzelpfad der Erhebungsablage - mit zwei Waechtern."""
|
|
89
|
+
wert = os.environ.get(UMGEBUNG, "").strip().strip('"')
|
|
90
|
+
if not wert:
|
|
91
|
+
raise SystemExit(
|
|
92
|
+
"ABBRUCH: %s ist nicht gesetzt.\n"
|
|
93
|
+
"Die Belege einer Erhebung sind AUFZEICHNUNG und liegen ausserhalb\n"
|
|
94
|
+
"des Repositoriums (D-222). Seit der Apparat im Kern liegt, gibt es\n"
|
|
95
|
+
"keinen ableitbaren Ort mehr - er wird gesagt:\n"
|
|
96
|
+
" set %s=<Pfad der Erhebungsablage>" % (UMGEBUNG, UMGEBUNG))
|
|
97
|
+
wert = os.path.abspath(wert)
|
|
98
|
+
if _innerhalb(wert, WURZEL):
|
|
99
|
+
raise SystemExit(
|
|
100
|
+
"ABBRUCH: %s zeigt mit %r INS Repositorium (%s).\n"
|
|
101
|
+
"Belege und Prompts einer Erhebung gehoeren daneben, nicht hinein\n"
|
|
102
|
+
"(D-222)." % (UMGEBUNG, wert, WURZEL))
|
|
103
|
+
return wert
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def kernversion():
|
|
107
|
+
"""Die Version, die das Uebungsrepositorium tragen MUSS.
|
|
108
|
+
|
|
109
|
+
🔴 DREI WAECHTER DERSELBEN VORBEDINGUNG, DREI SOLLWERTE, KEINER STIMMTE
|
|
110
|
+
(2026-09-20, Vorbedingungsdurchgang des Nachlaufs). `umgebungen-bauen-b4.py`
|
|
111
|
+
und `baeume-b4.py` fuehrten `--erwarte 0.78.0`, `historie-bauen-b4.py`
|
|
112
|
+
fuehrte `0.77.0` - waehrend das Uebungsrepositorium auf `0.78.2` stand und
|
|
113
|
+
der Kern auf `0.79.1`. Ein Sollwert im Quelltext ist eine gepflegte Zahl,
|
|
114
|
+
und eine Zahl, die gepflegt werden muss, wird nicht gepflegt (D-153).
|
|
115
|
+
|
|
116
|
+
Er wird deshalb ABGELEITET: Sollstand ist die Version DIESES Kerns. Damit
|
|
117
|
+
beantwortet der Waechter zugleich die erste Frage jedes
|
|
118
|
+
Vorbedingungsdurchgangs - hat ein Release den Gegenstand der Messung
|
|
119
|
+
angefasst? -, statt sie einem gepflegten Wert zu ueberlassen.
|
|
120
|
+
`--erwarte` bleibt als Uebersteuerung erhalten.
|
|
121
|
+
"""
|
|
122
|
+
p = os.path.join(WURZEL, ".koolie/core", "VERSION")
|
|
123
|
+
with open(p, encoding="utf-8") as f:
|
|
124
|
+
return f.read().strip()
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
UMGEBUNG_UEBUNG = "LW_UEBUNG"
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def uebungsrepositorium():
|
|
131
|
+
"""Der Pfad des Uebungsrepositoriums - GESAGT, nicht im Quelltext.
|
|
132
|
+
|
|
133
|
+
🔴 DER ANLASS IST GEMESSEN (2026-09-21, D-231). Acht Werkzeuge dieses Kerns
|
|
134
|
+
trugen einen Arbeitsplatzpfad im Quelltext, und der Pfad enthaelt den
|
|
135
|
+
Kontonamen einer natuerlichen Person:
|
|
136
|
+
|
|
137
|
+
UEB = r"C:\\Users\\<konto>\\Documents\\devpacks\\test-devin-framework" # SYNTHETISCH
|
|
138
|
+
|
|
139
|
+
Solange der Apparat NEBEN dem Repositorium lag, stand das in einer
|
|
140
|
+
unversionierten Ablage. **Mit D-222 ist er hineingewandert und hat den Pfad
|
|
141
|
+
mitgebracht** - in genau das Repositorium, dessen Overlay-Manifest *"keine
|
|
142
|
+
Secrets, keine Personen, keine internen Adressen"* verlangt und fuer das
|
|
143
|
+
`0.78.1` eigens `UEBERGABE.local.md` eingefuehrt hat. **Keine der siebzig
|
|
144
|
+
Pruefungen sah es**: Pruefung 6 kennt Secret-Muster, E-Mail-Adressen,
|
|
145
|
+
IP-Adressen und Hostnamen - keinen Benutzerprofilpfad.
|
|
146
|
+
|
|
147
|
+
Wer einen Apparat umzieht, zieht seine Arbeitsplatzpfade mit um - und
|
|
148
|
+
veroeffentlicht sie, ohne es zu entscheiden.
|
|
149
|
+
|
|
150
|
+
Dieselbe Loesung wie bei D-224: Der Ort wird gesagt. Ein Standardwert waere
|
|
151
|
+
wieder ein Arbeitsplatz im Quelltext.
|
|
152
|
+
"""
|
|
153
|
+
wert = os.environ.get(UMGEBUNG_UEBUNG, "").strip().strip('"')
|
|
154
|
+
if not wert:
|
|
155
|
+
raise SystemExit(
|
|
156
|
+
"ABBRUCH: %s ist nicht gesetzt.\n"
|
|
157
|
+
"Das Uebungsrepositorium liegt NEBEN diesem Repositorium, und sein\n"
|
|
158
|
+
"Pfad gehoert keinem Quelltext - er wird gesagt (D-231):\n"
|
|
159
|
+
" set %s=<Pfad des Uebungsrepositoriums>"
|
|
160
|
+
% (UMGEBUNG_UEBUNG, UMGEBUNG_UEBUNG))
|
|
161
|
+
wert = os.path.abspath(wert)
|
|
162
|
+
if not os.path.isdir(wert):
|
|
163
|
+
raise SystemExit(
|
|
164
|
+
"ABBRUCH: %s zeigt mit %r auf kein Verzeichnis." % (UMGEBUNG_UEBUNG, wert))
|
|
165
|
+
return wert
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def belege(anlegen=True):
|
|
169
|
+
"""`<Erhebungsablage>/belege` - der Ort aller Belegquellen eines Laufs."""
|
|
170
|
+
p = os.path.join(erhebung(), "belege")
|
|
171
|
+
if anlegen:
|
|
172
|
+
os.makedirs(p, exist_ok=True)
|
|
173
|
+
return p
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def prompts(anlegen=True):
|
|
177
|
+
"""`<Erhebungsablage>/prompts` - der Ort der Promptdateien."""
|
|
178
|
+
p = os.path.join(erhebung(), "prompts")
|
|
179
|
+
if anlegen:
|
|
180
|
+
os.makedirs(p, exist_ok=True)
|
|
181
|
+
return p
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def sollmenge(promptordner, baumordner):
|
|
185
|
+
"""Die Kennungen, die DIESE Erhebung schuldet - und die, die sie nicht schuldet.
|
|
186
|
+
|
|
187
|
+
🔴 DER ANLASS IST GEMESSEN (2026-09-21, D-230). Der Nachlauf von Buendel 4 misst
|
|
188
|
+
vierzehn Zellen. Sein Promptverzeichnis traegt die **fuenfzig** Prompts des
|
|
189
|
+
Messtags, weil `prompts-schreiben-b4.py` sie alle schreibt und keine Zelle
|
|
190
|
+
kennt. `stand-b4.py` leitete seine Sollmenge daraus ab und meldete am halb
|
|
191
|
+
gefahrenen Nachlauf **35 fehlende Laeufe und rund 37 USD** - faellig waren
|
|
192
|
+
fuenfzehn und rund achtzehn. Und `reihe-b4.py` ohne Argumente - der Befehl, den
|
|
193
|
+
`stand-b4.py` selbst als naechsten nennt - brach am ersten Baum ab, den es in
|
|
194
|
+
dieser Erhebung nie gab, und fuhr **keinen einzigen** Lauf.
|
|
195
|
+
|
|
196
|
+
Die Sollmenge kommt deshalb aus den **Messbaeumen**: `baeume-b4.py` legt genau
|
|
197
|
+
die Baeume an, die der Zuschnitt dieser Erhebung nennt. Ein Prompt ohne Baum ist
|
|
198
|
+
eine Zelle einer anderen Erhebung - derselbe Grund, aus dem `LW_ERHEBUNG` gesagt
|
|
199
|
+
wird (D-224) und `--ziel` beim Baumbau (D-218): **Ein Ort, der aus der Umgebung
|
|
200
|
+
erschlossen wird, gehoert dem, der ihn zuletzt gefuellt hat.**
|
|
201
|
+
|
|
202
|
+
Ein Verzeichnis ist kein Zuschnitt. Es ist der Zuschnitt von gestern.
|
|
203
|
+
|
|
204
|
+
Gibt zwei sortierte Listen zurueck: die Kennungen mit Baum (ein `-t2.txt` ist
|
|
205
|
+
kein eigener Eintrag - er ist der zweite Turn seiner Zelle) und die Prompts ohne
|
|
206
|
+
Baum, die die Aufrufer NENNEN muessen, statt sie stillschweigend zu uebergehen.
|
|
207
|
+
"""
|
|
208
|
+
einfach, zwei = set(), set()
|
|
209
|
+
for x in sorted(os.listdir(promptordner)):
|
|
210
|
+
if not x.endswith(".txt"):
|
|
211
|
+
continue
|
|
212
|
+
n = x[:-4]
|
|
213
|
+
# 🔴 Eine NACHMESSUNG (`n<kennung>`) gehoert nicht zur Sollmenge. Sie faehrt
|
|
214
|
+
# einen weiteren Turn im Baum ihrer Zelle und hat keinen eigenen Baum; wer
|
|
215
|
+
# sie mitzaehlt, meldet einen Fehlbestand, den es nicht gibt. Praezedenz:
|
|
216
|
+
# `nsk004p01` und `nsk009p01` aus Buendel 2.
|
|
217
|
+
if n.startswith("n"):
|
|
218
|
+
continue
|
|
219
|
+
if n.endswith("-t2"):
|
|
220
|
+
zwei.add(n[:-3])
|
|
221
|
+
else:
|
|
222
|
+
einfach.add(n)
|
|
223
|
+
vorhanden = set()
|
|
224
|
+
if os.path.isdir(baumordner):
|
|
225
|
+
vorhanden = {x for x in os.listdir(baumordner)
|
|
226
|
+
if os.path.isdir(os.path.join(baumordner, x))}
|
|
227
|
+
mit, ohne = [], []
|
|
228
|
+
for k in sorted(einfach):
|
|
229
|
+
(mit if k in vorhanden else ohne).append(k)
|
|
230
|
+
return mit, zwei, ohne
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def blaetter(wurzel=None):
|
|
234
|
+
"""Je Kennungspraefix eines Testblatts (`SK-012`, `RE-001`) sein Skill und sein Ort.
|
|
235
|
+
|
|
236
|
+
🔴 ABGELEITET, NICHT GEPFLEGT - und der Anlass ist derselbe zum dritten Mal.
|
|
237
|
+
`umgebungen-bauen-b4.py` fuehrte die drei Skills von Buendel 4 BEIM NAMEN, und
|
|
238
|
+
alle drei lagen auch im Baum von Buendel 5: Der Waechter haette geschwiegen,
|
|
239
|
+
waehrend der gemessene Skill fehlte (D-237). `dossier-b4.py` fuehrte dieselbe
|
|
240
|
+
Zuordnung ein zweites Mal als Handliste.
|
|
241
|
+
|
|
242
|
+
Marken, Wurzeln und Namenslisten gehoeren abgeleitet, nicht gepflegt.
|
|
243
|
+
|
|
244
|
+
Gesucht wird jede `TESTS.md` unter `framework/skills/` und unter
|
|
245
|
+
`framework/<art>/<pack>/skills/`; der Praefix kommt aus der ersten Spalte ihrer
|
|
246
|
+
Tabellenzeilen, also aus dem Blatt selbst und nicht aus seinem Dateinamen.
|
|
247
|
+
Rueckgabe: Praefix -> dict(skill, blatt, pack, art).
|
|
248
|
+
"""
|
|
249
|
+
wurzel = wurzel or WURZEL
|
|
250
|
+
rahmen = os.path.join(wurzel, ".koolie/core", "framework")
|
|
251
|
+
orte = [(os.path.join(rahmen, "skills"), None, None)]
|
|
252
|
+
for art in ("role-packs", "tech-packs"):
|
|
253
|
+
basis = os.path.join(rahmen, art)
|
|
254
|
+
if not os.path.isdir(basis):
|
|
255
|
+
continue
|
|
256
|
+
for pack in sorted(os.listdir(basis)):
|
|
257
|
+
unter = os.path.join(basis, pack, "skills")
|
|
258
|
+
if os.path.isdir(unter):
|
|
259
|
+
orte.append((unter, pack, art))
|
|
260
|
+
aus = {}
|
|
261
|
+
for ablage, pack, art in orte:
|
|
262
|
+
if not os.path.isdir(ablage):
|
|
263
|
+
continue
|
|
264
|
+
for skill in sorted(os.listdir(ablage)):
|
|
265
|
+
blatt = os.path.join(ablage, skill, "TESTS.md")
|
|
266
|
+
if not os.path.isfile(blatt):
|
|
267
|
+
continue
|
|
268
|
+
with io.open(blatt, encoding="utf-8", newline="") as fh:
|
|
269
|
+
text = fh.read()
|
|
270
|
+
for zeile in text.replace("\r\n", "\n").split("\n"):
|
|
271
|
+
if not zeile.startswith("| "):
|
|
272
|
+
continue
|
|
273
|
+
kennung = zeile.split("|")[1].strip()
|
|
274
|
+
treffer = _KENNUNG_RE.match(kennung)
|
|
275
|
+
if not treffer:
|
|
276
|
+
continue
|
|
277
|
+
praefix = treffer.group(1)
|
|
278
|
+
fruehere = aus.get(praefix)
|
|
279
|
+
if fruehere and fruehere["skill"] != skill:
|
|
280
|
+
raise SystemExit(
|
|
281
|
+
"ABBRUCH: der Kennungspraefix %s steht in zwei Blaettern "
|
|
282
|
+
"(%s und %s) - eine Zelle laesst sich dann keinem Skill "
|
|
283
|
+
"zuordnen" % (praefix, fruehere["skill"], skill))
|
|
284
|
+
aus[praefix] = {
|
|
285
|
+
"skill": skill,
|
|
286
|
+
"blatt": os.path.relpath(blatt, wurzel).replace(os.sep, "/"),
|
|
287
|
+
"pack": pack,
|
|
288
|
+
"art": art,
|
|
289
|
+
}
|
|
290
|
+
if not aus:
|
|
291
|
+
raise SystemExit("ABBRUCH: kein Testblatt unter framework/ gefunden - die "
|
|
292
|
+
"Ableitung haette ihren Gegenstand verloren und bliebe "
|
|
293
|
+
"leise leer (D-23)")
|
|
294
|
+
return aus
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def zellkennung(kurz):
|
|
298
|
+
"""`sk012p01` -> `SK-012-P01`, `re001n09` -> `RE-001-N09`.
|
|
299
|
+
|
|
300
|
+
Der Apparat fuehrt die Kennung einer Zelle zusammengezogen und klein; das
|
|
301
|
+
Testblatt fuehrt sie ausgeschrieben. Die Ruecknahme stand bis 0.81.0 an zwei
|
|
302
|
+
Stellen im Quelltext.
|
|
303
|
+
"""
|
|
304
|
+
treffer = _KURZ_RE.match(kurz)
|
|
305
|
+
if not treffer:
|
|
306
|
+
raise SystemExit("ABBRUCH: %r ist keine Zellkennung des Apparats" % kurz)
|
|
307
|
+
a, b, c = treffer.groups()
|
|
308
|
+
return "%s-%s-%s" % (a.upper(), b, c.upper())
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def skillmenge(zellen, wurzel=None):
|
|
312
|
+
"""Welche Skills eine Zellmenge misst - und welche Packs dafuer aktiv sein muessen.
|
|
313
|
+
|
|
314
|
+
Rueckgabe: (skills, packs). `skills` ist die sortierte Namensliste, `packs` die
|
|
315
|
+
sortierte Liste der (Art, Packname) - leer, wenn alle gemessenen Skills im Kern
|
|
316
|
+
liegen. Genau diese beiden Listen ersetzen die Handliste des Waechters (D-237).
|
|
317
|
+
"""
|
|
318
|
+
karte = blaetter(wurzel)
|
|
319
|
+
skills, packs, unbekannt = set(), set(), []
|
|
320
|
+
for kurz in zellen:
|
|
321
|
+
voll = zellkennung(kurz) if "-" not in kurz else kurz
|
|
322
|
+
praefix = "-".join(voll.split("-")[:2])
|
|
323
|
+
eintrag = karte.get(praefix)
|
|
324
|
+
if not eintrag:
|
|
325
|
+
unbekannt.append(voll)
|
|
326
|
+
continue
|
|
327
|
+
skills.add(eintrag["skill"])
|
|
328
|
+
if eintrag["pack"]:
|
|
329
|
+
packs.add((eintrag["art"], eintrag["pack"]))
|
|
330
|
+
if unbekannt:
|
|
331
|
+
raise SystemExit("ABBRUCH: zu %d Zelle(n) traegt kein Testblatt des Frameworks "
|
|
332
|
+
"den Kennungspraefix: %s" % (len(unbekannt),
|
|
333
|
+
", ".join(sorted(unbekannt))))
|
|
334
|
+
return sorted(skills), sorted(packs)
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def laeufe(zellen, zwei):
|
|
338
|
+
"""Die Laufkennungen einer Zellmenge - eine Zelle mit zweitem Turn hat ZWEI."""
|
|
339
|
+
aus = []
|
|
340
|
+
for k in zellen:
|
|
341
|
+
if k in zwei:
|
|
342
|
+
aus += [k + "t1", k]
|
|
343
|
+
else:
|
|
344
|
+
aus.append(k)
|
|
345
|
+
return aus
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
if __name__ == "__main__":
|
|
349
|
+
sys.stdout.reconfigure(encoding="utf-8")
|
|
350
|
+
print("Kernversion: ", kernversion())
|
|
351
|
+
print("Erhebungsablage:", erhebung())
|
|
352
|
+
print("Belege: ", belege(anlegen=False))
|
|
353
|
+
print("Prompts: ", prompts(anlegen=False))
|
|
354
|
+
karte = blaetter()
|
|
355
|
+
print("Testblaetter: %d (%s)"
|
|
356
|
+
% (len(karte), ", ".join("%s=%s" % (k, v["skill"])
|
|
357
|
+
for k, v in sorted(karte.items()))))
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Der Messapparat als Paket (CR-2026-160, D-473, K-174).
|
|
3
|
+
|
|
4
|
+
Bis 1.18.2 entstand je Release eine Handvoll kopierter Skripte in der Erhebungsablage -
|
|
5
|
+
67 Stueck in elf Ablagen, ohne einen einzigen Test (D-436). Dieses Paket ersetzt sie fuer
|
|
6
|
+
jede NEUE Reihe:
|
|
7
|
+
|
|
8
|
+
* reihe.py die Reihe als DATEN (eine JSON-Datei in der Erhebungsablage) - Laeufe,
|
|
9
|
+
Prompts, Erwartungen, Client, Modell, Gruppe, Kontingent
|
|
10
|
+
* baum.py Messbaum: bauen, herrichten, auf den Sollstand zuruecksetzen, Baum-Hash
|
|
11
|
+
* vorpruefung.py deterministisch VOR jedem bezahlten Lauf - Abbruch statt Lauf
|
|
12
|
+
* kontingent.py ein Buch je Lauf, die Summe wird gerechnet (Falle 8 aus 1.17.0)
|
|
13
|
+
* clients.py je Client ein Adapter; was nicht erhoben ist, sagt es
|
|
14
|
+
* belege.py sichern und auswerten
|
|
15
|
+
* stand.py die Standmarke einer Ergebniszelle (Pruefung 103, K-61)
|
|
16
|
+
* selbsttest.py der Apparat gegen einen Attrappen-Client - ohne Kontingent
|
|
17
|
+
|
|
18
|
+
Aufruf: python tests/erhebungen/messen.py REIHE.json BEFEHL (siehe messen.py).
|
|
19
|
+
|
|
20
|
+
Die Skripte der Buendel 4 und 5 bleiben liegen: Sie sind Beleg vergangener Protokolle und
|
|
21
|
+
bauen weiterhin deren Messbaeume; eine neue Reihe faehrt mit diesem Paket (D-473).
|
|
22
|
+
"""
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Der Messbaum: bauen, herrichten, zuruecksetzen - und sein Zustand als EINE Zahl.
|
|
3
|
+
|
|
4
|
+
FESTER PFAD STATT NEUER VERZEICHNISSE (K-174, Frage d). Der Client stellt jeder Anfrage
|
|
5
|
+
einen Anfang voran, in dem auch das Arbeitsverzeichnis steht. Ein neues Verzeichnis je
|
|
6
|
+
Lauf ist ein neuer Anfang - und jeder Lauf legte rund 35.000 Token Cache NEU an (D-436).
|
|
7
|
+
Im Modus 'fest' laeuft jede Reihe in DEMSELBEN Verzeichnis, und zwischen zwei Laeufen
|
|
8
|
+
wird zurueckgesetzt statt neu kopiert.
|
|
9
|
+
|
|
10
|
+
DAS ZURUECKSETZEN MUSS VOLLSTAENDIG SEIN - sonst misst der naechste Lauf den vorigen mit
|
|
11
|
+
(das Rauschen aus D-213). Deshalb wird es nicht geglaubt, sondern gemessen: baumhash()
|
|
12
|
+
ueber jede Datei ausser .git und den genannten Ausnahmen, vor jedem Lauf gegen den Hash
|
|
13
|
+
der Basis (vorpruefung.py). Ignorierte Dateien der Basis (.env ist eine) werden aus der
|
|
14
|
+
Basis zurueckkopiert; git allein wuerde sie nicht wiederherstellen.
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import hashlib
|
|
19
|
+
import os
|
|
20
|
+
import shutil
|
|
21
|
+
import stat
|
|
22
|
+
import subprocess
|
|
23
|
+
import sys
|
|
24
|
+
|
|
25
|
+
AUTOR = ["-c", "user.name=Messung", "-c", "user.email=messung@example.invalid"]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def git(baum: str, *args: str, pruefen: bool = True) -> str:
|
|
29
|
+
p = subprocess.run(["git", "-C", baum, *args], capture_output=True, text=True,
|
|
30
|
+
encoding="utf-8", errors="replace")
|
|
31
|
+
if pruefen and p.returncode != 0:
|
|
32
|
+
raise RuntimeError(f"git {' '.join(args)} in {baum}: {p.stderr.strip()}")
|
|
33
|
+
return p.stdout.strip()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _ist_verbindung(pfad: str) -> bool:
|
|
37
|
+
"""Symlink oder Verzeichnisverbindung (Windows-Junction) - wird nie betreten."""
|
|
38
|
+
if os.path.islink(pfad):
|
|
39
|
+
return True
|
|
40
|
+
try:
|
|
41
|
+
return bool(os.lstat(pfad).st_file_attributes & stat.FILE_ATTRIBUTE_REPARSE_POINT)
|
|
42
|
+
except (AttributeError, OSError):
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def dateien(baum: str, ohne=()) -> list:
|
|
47
|
+
"""Alle Dateien relativ zum Baum, sortiert - ohne .git, ohne Ausnahmen, ohne Verbindungen."""
|
|
48
|
+
aus = []
|
|
49
|
+
ausnahmen = {".git", *ohne}
|
|
50
|
+
for wurzel, verz, files in os.walk(baum):
|
|
51
|
+
verz[:] = sorted(d for d in verz
|
|
52
|
+
if d not in ausnahmen and not _ist_verbindung(os.path.join(wurzel, d)))
|
|
53
|
+
for f in sorted(files):
|
|
54
|
+
voll = os.path.join(wurzel, f)
|
|
55
|
+
if _ist_verbindung(voll):
|
|
56
|
+
continue
|
|
57
|
+
aus.append(os.path.relpath(voll, baum).replace(os.sep, "/"))
|
|
58
|
+
return aus
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def baumhash(baum: str, ohne=()) -> str:
|
|
62
|
+
"""Pfad und Inhalt jeder Datei - ein Zustand, keine Zaehlung (D-218)."""
|
|
63
|
+
h = hashlib.sha256()
|
|
64
|
+
for rel in dateien(baum, ohne):
|
|
65
|
+
h.update(rel.encode("utf-8") + b"\0")
|
|
66
|
+
with open(os.path.join(baum, *rel.split("/")), "rb") as fh:
|
|
67
|
+
h.update(hashlib.sha256(fh.read()).digest())
|
|
68
|
+
return h.hexdigest()[:16]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def sollstand(basis: str, ohne=()) -> dict:
|
|
72
|
+
return {"commit": git(basis, "rev-parse", "HEAD"),
|
|
73
|
+
"branch": git(basis, "symbolic-ref", "--short", "HEAD"),
|
|
74
|
+
"hash": baumhash(basis, ohne)}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _schreibschutz_weg(func, pfad, _info) -> None:
|
|
78
|
+
os.chmod(pfad, stat.S_IWRITE)
|
|
79
|
+
func(pfad)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def entfernen(pfad: str) -> None:
|
|
83
|
+
"""Loeschen, ohne einer Verzeichnisverbindung in ihr Ziel zu folgen (D-262)."""
|
|
84
|
+
if not os.path.lexists(pfad):
|
|
85
|
+
return
|
|
86
|
+
for wurzel, verz, _ in os.walk(pfad):
|
|
87
|
+
for d in list(verz):
|
|
88
|
+
voll = os.path.join(wurzel, d)
|
|
89
|
+
if _ist_verbindung(voll):
|
|
90
|
+
os.rmdir(voll) if not os.path.islink(voll) else os.unlink(voll)
|
|
91
|
+
verz.remove(d)
|
|
92
|
+
if sys.version_info >= (3, 12):
|
|
93
|
+
shutil.rmtree(pfad, onexc=_schreibschutz_weg)
|
|
94
|
+
else:
|
|
95
|
+
shutil.rmtree(pfad, onerror=_schreibschutz_weg)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def basis_bauen(ziel: str, kern_quelle: str, client: str, praeparation: list) -> dict:
|
|
99
|
+
"""Eine frische Installation als git-Baum - fuer Schrankenreihen ohne Uebungsrepositorium.
|
|
100
|
+
|
|
101
|
+
Schritte der Praeparation: {"art": "datei", "pfad", "inhalt"} | {"art": "entferne",
|
|
102
|
+
"pfad"} | {"art": "commit", "nachricht"}. Am Ende steht ein Commit 'Basis' mit
|
|
103
|
+
synthetischem Autor; ignorierte Dateien (etwa .env) liegen daneben und gehoeren zum
|
|
104
|
+
Sollstand, weil der Baum-Hash sie mitzaehlt.
|
|
105
|
+
"""
|
|
106
|
+
if os.path.exists(ziel):
|
|
107
|
+
raise RuntimeError(f"{ziel} besteht schon - eine Basis wird nicht ueberschrieben")
|
|
108
|
+
os.makedirs(ziel)
|
|
109
|
+
git(ziel, "init", "-q", "-b", "main")
|
|
110
|
+
git(ziel, "config", "core.autocrlf", "false")
|
|
111
|
+
p = subprocess.run([sys.executable, "-B", os.path.join(kern_quelle, "install.py"),
|
|
112
|
+
"--target", ziel, "--client", client],
|
|
113
|
+
capture_output=True, text=True, encoding="utf-8", errors="replace")
|
|
114
|
+
if p.returncode != 0:
|
|
115
|
+
raise RuntimeError(f"install.py --target: Exit {p.returncode}\n{p.stdout[-800:]}\n{p.stderr[-800:]}")
|
|
116
|
+
for schritt in praeparation:
|
|
117
|
+
art = schritt.get("art")
|
|
118
|
+
pfad = os.path.join(ziel, *schritt.get("pfad", "").split("/")) if schritt.get("pfad") else ""
|
|
119
|
+
if art == "datei":
|
|
120
|
+
os.makedirs(os.path.dirname(pfad), exist_ok=True)
|
|
121
|
+
with open(pfad, "w", encoding="utf-8", newline="\n") as fh:
|
|
122
|
+
fh.write(schritt.get("inhalt", ""))
|
|
123
|
+
elif art == "entferne":
|
|
124
|
+
if os.path.isdir(pfad):
|
|
125
|
+
entfernen(pfad)
|
|
126
|
+
elif os.path.exists(pfad):
|
|
127
|
+
os.remove(pfad)
|
|
128
|
+
elif art == "commit":
|
|
129
|
+
git(ziel, "add", "-A")
|
|
130
|
+
git(ziel, *AUTOR, "commit", "-q", "--allow-empty", "-m", schritt.get("nachricht", "Schritt"))
|
|
131
|
+
else:
|
|
132
|
+
raise RuntimeError(f"unbekannter Praeparationsschritt '{art}'")
|
|
133
|
+
git(ziel, "add", "-A")
|
|
134
|
+
git(ziel, *AUTOR, "commit", "-q", "--allow-empty", "-m", "Basis")
|
|
135
|
+
return sollstand(ziel)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _remote_neu(baum: str, basis: str, hooks: str = "") -> None:
|
|
139
|
+
"""Ein Wegwerf-Remote je Baum - ein durchgelassener Push landet dort und nirgends sonst.
|
|
140
|
+
|
|
141
|
+
Mit 'hooks' traegt das Remote Branch-Schutz und CI der Referenzgruppe (1.21.0): Die
|
|
142
|
+
Hooks liegen ausserhalb des Messbaums, der Agent erreicht sie nur ueber einen Push.
|
|
143
|
+
"""
|
|
144
|
+
remote = baum.rstrip("\\/") + ".remote.git"
|
|
145
|
+
entfernen(remote)
|
|
146
|
+
subprocess.run(["git", "clone", "-q", "--bare", basis, remote], check=True,
|
|
147
|
+
capture_output=True)
|
|
148
|
+
if hooks:
|
|
149
|
+
for name in sorted(os.listdir(hooks)):
|
|
150
|
+
ziel = os.path.join(remote, "hooks", name)
|
|
151
|
+
shutil.copy2(os.path.join(hooks, name), ziel)
|
|
152
|
+
os.chmod(ziel, 0o755)
|
|
153
|
+
git(baum, "remote", "remove", "origin", pruefen=False)
|
|
154
|
+
git(baum, "remote", "add", "origin", remote)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def verbinden(baum: str, verbindungen: dict) -> None:
|
|
158
|
+
"""Verzeichnisverbindungen, die weder Hash noch Zuruecksetzen betreten (1.21.0).
|
|
159
|
+
|
|
160
|
+
Der geteilte node_modules-Bestand (node-waechter.py): 118 MB je Baum waeren der Preis
|
|
161
|
+
einer Kopie. Eine vorhandene Verbindung bleibt; ein echtes Verzeichnis an ihrer Stelle
|
|
162
|
+
ist ein Abbruch - es waere ein Rest oder eine Kopie.
|
|
163
|
+
"""
|
|
164
|
+
for rel, quelle in (verbindungen or {}).items():
|
|
165
|
+
ziel = os.path.join(baum, *rel.replace("\\", "/").split("/"))
|
|
166
|
+
if os.path.lexists(ziel):
|
|
167
|
+
if _ist_verbindung(ziel):
|
|
168
|
+
continue
|
|
169
|
+
raise RuntimeError(f"{rel} besteht im Baum und ist keine Verbindung")
|
|
170
|
+
os.makedirs(os.path.dirname(ziel), exist_ok=True)
|
|
171
|
+
if os.name == "nt":
|
|
172
|
+
subprocess.run(["cmd", "/c", "mklink", "/J", ziel, os.path.abspath(quelle)],
|
|
173
|
+
check=True, capture_output=True)
|
|
174
|
+
else:
|
|
175
|
+
os.symlink(os.path.abspath(quelle), ziel, target_is_directory=True)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def herrichten(basis: str, baum: str, branch: str, soll: dict, remote: bool, ohne=(),
|
|
179
|
+
verbindungen=None, remote_hooks: str = "") -> None:
|
|
180
|
+
"""Den Baum auf den Sollstand der Basis bringen - neu kopiert oder zurueckgesetzt.
|
|
181
|
+
|
|
182
|
+
Fehlt er, wird die Basis kopiert (mit .git und ignorierten Dateien). Besteht er, setzt
|
|
183
|
+
git die versionierten Dateien zurueck, und was die Basis ignoriert fuehrt, wird aus ihr
|
|
184
|
+
zurueckkopiert; jede Datei, die die Basis nicht kennt, faellt weg. Danach steht HEAD auf
|
|
185
|
+
dem gesagten Branch - bei einem Arbeitsbranch frisch vom Sollcommit (K-172).
|
|
186
|
+
"""
|
|
187
|
+
if not os.path.exists(baum):
|
|
188
|
+
shutil.copytree(basis, baum, symlinks=True,
|
|
189
|
+
ignore=shutil.ignore_patterns(*ohne) if ohne else None)
|
|
190
|
+
else:
|
|
191
|
+
git(baum, "checkout", "-q", "-f", soll["branch"])
|
|
192
|
+
git(baum, "reset", "-q", "--hard", soll["commit"])
|
|
193
|
+
soll_dateien = set(dateien(basis, ohne))
|
|
194
|
+
for rel in dateien(baum, ohne):
|
|
195
|
+
if rel not in soll_dateien:
|
|
196
|
+
os.remove(os.path.join(baum, *rel.split("/")))
|
|
197
|
+
for rel in soll_dateien:
|
|
198
|
+
quelle = os.path.join(basis, *rel.split("/"))
|
|
199
|
+
ziel = os.path.join(baum, *rel.split("/"))
|
|
200
|
+
if not os.path.exists(ziel) or open(quelle, "rb").read() != open(ziel, "rb").read():
|
|
201
|
+
os.makedirs(os.path.dirname(ziel), exist_ok=True)
|
|
202
|
+
shutil.copy2(quelle, ziel)
|
|
203
|
+
# leere Verzeichnisse, die ein Lauf angelegt hat
|
|
204
|
+
for wurzel, verz, files in os.walk(baum, topdown=False):
|
|
205
|
+
if ".git" in wurzel.split(os.sep) or any(a in wurzel.split(os.sep) for a in ohne):
|
|
206
|
+
continue
|
|
207
|
+
if wurzel != baum and not os.listdir(wurzel) and not os.path.isdir(
|
|
208
|
+
os.path.join(basis, os.path.relpath(wurzel, baum))):
|
|
209
|
+
os.rmdir(wurzel)
|
|
210
|
+
if branch != soll["branch"]:
|
|
211
|
+
git(baum, "checkout", "-q", "-B", branch, soll["commit"])
|
|
212
|
+
verbinden(baum, verbindungen)
|
|
213
|
+
if remote:
|
|
214
|
+
_remote_neu(baum, basis, remote_hooks)
|