@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.
Files changed (693) hide show
  1. package/.gitattributes +16 -0
  2. package/.gitignore +51 -0
  3. package/.koolie/QUELLREPOSITORIUM.md +18 -0
  4. package/.koolie/core/CHANGELOG.md +11832 -0
  5. package/.koolie/core/LICENSE +674 -0
  6. package/.koolie/core/LICENSE-HINWEIS.md +98 -0
  7. package/.koolie/core/OWNERS.md +36 -0
  8. package/.koolie/core/VERSION +1 -0
  9. package/.koolie/core/banner.py +397 -0
  10. package/.koolie/core/build/README.md +34 -0
  11. package/.koolie/core/build/assemble.py +354 -0
  12. package/.koolie/core/build/build-docx.py +194 -0
  13. package/.koolie/core/build/doc/00-kopf.md +18 -0
  14. package/.koolie/core/build/doc/01-executive-summary.md +24 -0
  15. package/.koolie/core/build/doc/02-zielbild.md +13 -0
  16. package/.koolie/core/build/doc/03-ziele-nichtziele.md +28 -0
  17. package/.koolie/core/build/doc/04-geltungsbereich.md +25 -0
  18. package/.koolie/core/build/doc/05-glossar.md +47 -0
  19. package/.koolie/core/build/doc/06-leitprinzipien.md +5 -0
  20. package/.koolie/core/build/doc/07-architektur.md +60 -0
  21. package/.koolie/core/build/doc/07a-abbildungsschicht.md +66 -0
  22. package/.koolie/core/build/doc/08-trennung.md +24 -0
  23. package/.koolie/core/build/doc/09-betriebsmodi.md +18 -0
  24. package/.koolie/core/build/doc/10-arbeitsablauf.md +5 -0
  25. package/.koolie/core/build/doc/11-datenschutz.md +5 -0
  26. package/.koolie/core/build/doc/12-sicherheit.md +5 -0
  27. package/.koolie/core/build/doc/13-risiko.md +5 -0
  28. package/.koolie/core/build/doc/14-rollen.md +9 -0
  29. package/.koolie/core/build/doc/15-referenzstruktur.md +124 -0
  30. package/.koolie/core/build/doc/16-agentenanweisung.md +8 -0
  31. package/.koolie/core/build/doc/17-overlay.md +29 -0
  32. package/.koolie/core/build/doc/18-skill-standard.md +5 -0
  33. package/.koolie/core/build/doc/19-skill-template.md +5 -0
  34. package/.koolie/core/build/doc/20-referenz-skills.md +70 -0
  35. package/.koolie/core/build/doc/21-prompts.md +53 -0
  36. package/.koolie/core/build/doc/22-checklisten.md +49 -0
  37. package/.koolie/core/build/doc/23-entscheidungsbaeume.md +29 -0
  38. package/.koolie/core/build/doc/24-onboarding.md +33 -0
  39. package/.koolie/core/build/doc/25-governance.md +35 -0
  40. package/.koolie/core/build/doc/26-qs-test.md +9 -0
  41. package/.koolie/core/build/doc/27-pilot.md +13 -0
  42. package/.koolie/core/build/doc/28-uebernahme.md +5 -0
  43. package/.koolie/core/build/doc/29-grenzen.md +87 -0
  44. package/.koolie/core/build/doc/30-roadmap.md +5 -0
  45. package/.koolie/core/build/doc/31-anhaenge.md +151 -0
  46. package/.koolie/core/build/doc/32-abschluss.md +92 -0
  47. package/.koolie/core/build/ref-a4.docx +0 -0
  48. package/.koolie/core/checklists/01-preflight.md +54 -0
  49. package/.koolie/core/checklists/02-privacy-context.md +51 -0
  50. package/.koolie/core/checklists/03-before-code-change.md +51 -0
  51. package/.koolie/core/checklists/04-review-ai-code.md +58 -0
  52. package/.koolie/core/checklists/05-testing.md +48 -0
  53. package/.koolie/core/checklists/06-security.md +50 -0
  54. package/.koolie/core/checklists/07-new-dependency.md +57 -0
  55. package/.koolie/core/checklists/08-merge-request.md +47 -0
  56. package/.koolie/core/checklists/09-onboarding.md +52 -0
  57. package/.koolie/core/checklists/10-project-adoption.md +74 -0
  58. package/.koolie/core/checklists/11-framework-release.md +71 -0
  59. package/.koolie/core/checklists/README.md +28 -0
  60. package/.koolie/core/clientmap.py +1358 -0
  61. package/.koolie/core/clients/README.md +113 -0
  62. package/.koolie/core/clients/_template/CLIENT_PACK.md +197 -0
  63. package/.koolie/core/clients/claude-code/CLIENT_PACK.md +383 -0
  64. package/.koolie/core/clients/claude-code/manifest.json +232 -0
  65. package/.koolie/core/clients/claude-code/root-template/.claude/README.md +127 -0
  66. package/.koolie/core/clients/cursor/CLIENT_PACK.md +229 -0
  67. package/.koolie/core/clients/cursor/manifest.json +330 -0
  68. package/.koolie/core/clients/cursor/root-template/.cursor/README.md +36 -0
  69. package/.koolie/core/clients/devin-desktop/CLIENT_PACK.md +251 -0
  70. package/.koolie/core/clients/devin-desktop/manifest.json +163 -0
  71. package/.koolie/core/clients/devin-desktop/root-template/.devin/README.md +79 -0
  72. package/.koolie/core/clients/kiro/CLIENT_PACK.md +223 -0
  73. package/.koolie/core/clients/kiro/manifest.json +300 -0
  74. package/.koolie/core/clients/kiro/root-template/.kiro/README.md +37 -0
  75. package/.koolie/core/clients/openai-codex/CLIENT_PACK.md +257 -0
  76. package/.koolie/core/clients/openai-codex/manifest.json +208 -0
  77. package/.koolie/core/clients/openai-codex/root-template/.codex/README.md +35 -0
  78. package/.koolie/core/decision-trees/01-context-allowed.md +46 -0
  79. package/.koolie/core/decision-trees/02-may-ai-do-task.md +47 -0
  80. package/.koolie/core/decision-trees/03-analyze-or-modify.md +50 -0
  81. package/.koolie/core/decision-trees/04-required-review.md +49 -0
  82. package/.koolie/core/decision-trees/05-stop-or-escalate.md +47 -0
  83. package/.koolie/core/decision-trees/06-rule-placement.md +58 -0
  84. package/.koolie/core/decision-trees/README.md +14 -0
  85. package/.koolie/core/docs/ADOPTION_GUIDE.md +582 -0
  86. package/.koolie/core/docs/DOCUMENTATION_STANDARD.md +91 -0
  87. package/.koolie/core/docs/PLACEHOLDER_REGISTRY.md +79 -0
  88. package/.koolie/core/docs/ROADMAP.md +848 -0
  89. package/.koolie/core/docs/RUNTIME_GLOSSARY.md +113 -0
  90. package/.koolie/core/examples/README.md +11 -0
  91. package/.koolie/core/examples/example-ergebnisbericht.md +31 -0
  92. package/.koolie/core/examples/example-mr-description.md +31 -0
  93. package/.koolie/core/examples/example-overlay-runtime.md +48 -0
  94. package/.koolie/core/framework/core/00-principles.md +93 -0
  95. package/.koolie/core/framework/core/01-governance.md +58 -0
  96. package/.koolie/core/framework/core/02-privacy.md +141 -0
  97. package/.koolie/core/framework/core/03-security.md +86 -0
  98. package/.koolie/core/framework/core/04-quality.md +48 -0
  99. package/.koolie/core/framework/core/05-working-model.md +199 -0
  100. package/.koolie/core/framework/core/06-prompting-rules.md +51 -0
  101. package/.koolie/core/framework/core/07-review-rules.md +52 -0
  102. package/.koolie/core/framework/core/08-skill-conventions.md +115 -0
  103. package/.koolie/core/framework/core/09-risk-model.md +87 -0
  104. package/.koolie/core/framework/core/10-error-escalation.md +53 -0
  105. package/.koolie/core/framework/org-policies/MAPPING_CLASSIFICATION.md +16 -0
  106. package/.koolie/core/framework/org-policies/README.md +29 -0
  107. package/.koolie/core/framework/overlay-patterns/general/documents/branching-strategy/muster-general.md +43 -0
  108. package/.koolie/core/framework/overlay-patterns/general/documents/coding-guidelines/muster-general.md +82 -0
  109. package/.koolie/core/framework/overlay-patterns/general/documents/definition-of-done/muster-general.md +52 -0
  110. package/.koolie/core/framework/overlay-patterns/general/documents/definition-of-ready/muster-general.md +54 -0
  111. package/.koolie/core/framework/overlay-patterns/general/documents/quality/muster-general.md +59 -0
  112. package/.koolie/core/framework/overlay-patterns/general/documents/security/muster-general.md +52 -0
  113. package/.koolie/core/framework/overlay-patterns/general.md +150 -0
  114. package/.koolie/core/framework/role-packs/README.md +63 -0
  115. package/.koolie/core/framework/role-packs/_template/ROLE_PACK.md +58 -0
  116. package/.koolie/core/framework/role-packs/requirements-engineering/ROLE_PACK.md +158 -0
  117. package/.koolie/core/framework/role-packs/requirements-engineering/runtime/30-role-requirements-engineering.md +88 -0
  118. package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/CHANGELOG.md +10 -0
  119. package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/EXAMPLES.md +148 -0
  120. package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/SKILL.md +195 -0
  121. package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/TESTS.md +22 -0
  122. package/.koolie/core/framework/role-packs/software-development/ROLE_PACK.md +95 -0
  123. package/.koolie/core/framework/role-packs/software-development/runtime/30-role-software-development.md +26 -0
  124. package/.koolie/core/framework/runtime/agents/fw-reviewer.md +34 -0
  125. package/.koolie/core/framework/runtime/client-settings.json +3 -0
  126. package/.koolie/core/framework/runtime/hooks.json +20 -0
  127. package/.koolie/core/framework/runtime/mcp-config.example.json +4 -0
  128. package/.koolie/core/framework/runtime/permissions.json +106 -0
  129. package/.koolie/core/framework/runtime/root-instruction-local.example.md +19 -0
  130. package/.koolie/core/framework/runtime/root-instruction.md +116 -0
  131. package/.koolie/core/framework/runtime/rules/00-framework-core.md +49 -0
  132. package/.koolie/core/framework/runtime/rules/10-privacy-security.md +49 -0
  133. package/.koolie/core/framework/runtime/rules/15-development-rules.md +41 -0
  134. package/.koolie/core/framework/runtime/rules/16-plan-spezifikation.md +32 -0
  135. package/.koolie/core/framework/runtime/rules/20-project-overlay.md +60 -0
  136. package/.koolie/core/framework/skills/fw-bugfix-prepare/CHANGELOG.md +14 -0
  137. package/.koolie/core/framework/skills/fw-bugfix-prepare/EXAMPLES.md +57 -0
  138. package/.koolie/core/framework/skills/fw-bugfix-prepare/SKILL.md +177 -0
  139. package/.koolie/core/framework/skills/fw-bugfix-prepare/TESTS.md +15 -0
  140. package/.koolie/core/framework/skills/fw-change-analyze/CHANGELOG.md +12 -0
  141. package/.koolie/core/framework/skills/fw-change-analyze/EXAMPLES.md +66 -0
  142. package/.koolie/core/framework/skills/fw-change-analyze/SKILL.md +167 -0
  143. package/.koolie/core/framework/skills/fw-change-analyze/TESTS.md +16 -0
  144. package/.koolie/core/framework/skills/fw-change-small/CHANGELOG.md +13 -0
  145. package/.koolie/core/framework/skills/fw-change-small/EXAMPLES.md +68 -0
  146. package/.koolie/core/framework/skills/fw-change-small/SKILL.md +175 -0
  147. package/.koolie/core/framework/skills/fw-change-small/TESTS.md +13 -0
  148. package/.koolie/core/framework/skills/fw-code-explain/CHANGELOG.md +11 -0
  149. package/.koolie/core/framework/skills/fw-code-explain/EXAMPLES.md +61 -0
  150. package/.koolie/core/framework/skills/fw-code-explain/SKILL.md +163 -0
  151. package/.koolie/core/framework/skills/fw-code-explain/TESTS.md +11 -0
  152. package/.koolie/core/framework/skills/fw-docs-update/CHANGELOG.md +10 -0
  153. package/.koolie/core/framework/skills/fw-docs-update/EXAMPLES.md +59 -0
  154. package/.koolie/core/framework/skills/fw-docs-update/SKILL.md +160 -0
  155. package/.koolie/core/framework/skills/fw-docs-update/TESTS.md +12 -0
  156. package/.koolie/core/framework/skills/fw-error-analyze/CHANGELOG.md +10 -0
  157. package/.koolie/core/framework/skills/fw-error-analyze/EXAMPLES.md +67 -0
  158. package/.koolie/core/framework/skills/fw-error-analyze/SKILL.md +160 -0
  159. package/.koolie/core/framework/skills/fw-error-analyze/TESTS.md +12 -0
  160. package/.koolie/core/framework/skills/fw-mr-description/CHANGELOG.md +12 -0
  161. package/.koolie/core/framework/skills/fw-mr-description/EXAMPLES.md +69 -0
  162. package/.koolie/core/framework/skills/fw-mr-description/SKILL.md +170 -0
  163. package/.koolie/core/framework/skills/fw-mr-description/TESTS.md +12 -0
  164. package/.koolie/core/framework/skills/fw-overlay-pflege/CHANGELOG.md +7 -0
  165. package/.koolie/core/framework/skills/fw-overlay-pflege/EXAMPLES.md +48 -0
  166. package/.koolie/core/framework/skills/fw-overlay-pflege/SKILL.md +147 -0
  167. package/.koolie/core/framework/skills/fw-overlay-pflege/TESTS.md +13 -0
  168. package/.koolie/core/framework/skills/fw-plan/CHANGELOG.md +14 -0
  169. package/.koolie/core/framework/skills/fw-plan/EXAMPLES.md +69 -0
  170. package/.koolie/core/framework/skills/fw-plan/SKILL.md +168 -0
  171. package/.koolie/core/framework/skills/fw-plan/TESTS.md +14 -0
  172. package/.koolie/core/framework/skills/fw-refactor/CHANGELOG.md +10 -0
  173. package/.koolie/core/framework/skills/fw-refactor/EXAMPLES.md +70 -0
  174. package/.koolie/core/framework/skills/fw-refactor/SKILL.md +173 -0
  175. package/.koolie/core/framework/skills/fw-refactor/TESTS.md +14 -0
  176. package/.koolie/core/framework/skills/fw-repo-analyze/CHANGELOG.md +10 -0
  177. package/.koolie/core/framework/skills/fw-repo-analyze/EXAMPLES.md +52 -0
  178. package/.koolie/core/framework/skills/fw-repo-analyze/SKILL.md +149 -0
  179. package/.koolie/core/framework/skills/fw-repo-analyze/TESTS.md +11 -0
  180. package/.koolie/core/framework/skills/fw-review-support/CHANGELOG.md +12 -0
  181. package/.koolie/core/framework/skills/fw-review-support/EXAMPLES.md +69 -0
  182. package/.koolie/core/framework/skills/fw-review-support/SKILL.md +179 -0
  183. package/.koolie/core/framework/skills/fw-review-support/TESTS.md +13 -0
  184. package/.koolie/core/framework/skills/fw-tests/CHANGELOG.md +9 -0
  185. package/.koolie/core/framework/skills/fw-tests/EXAMPLES.md +65 -0
  186. package/.koolie/core/framework/skills/fw-tests/SKILL.md +169 -0
  187. package/.koolie/core/framework/skills/fw-tests/TESTS.md +12 -0
  188. package/.koolie/core/framework/tech-packs/README.md +15 -0
  189. package/.koolie/core/framework/tech-packs/_template/TECH_PACK.md +61 -0
  190. package/.koolie/core/governance/ADOPTION_REGISTRY.md +89 -0
  191. package/.koolie/core/governance/CHANGE_REQUEST_TEMPLATE.md +60 -0
  192. package/.koolie/core/governance/DECISION_LOG.md +779 -0
  193. package/.koolie/core/governance/EXCEPTION_PROCESS.md +31 -0
  194. package/.koolie/core/governance/FEEDBACK_PROCESS.md +34 -0
  195. package/.koolie/core/governance/FRAMEWORK_DEV_PROFILE.md +135 -0
  196. package/.koolie/core/governance/INCIDENT_HANDLING.md +47 -0
  197. package/.koolie/core/governance/PRIORITY_HIERARCHY.md +61 -0
  198. package/.koolie/core/governance/RACI.md +37 -0
  199. package/.koolie/core/governance/RELEASE_PROCESS.md +183 -0
  200. package/.koolie/core/governance/change-requests/CR-2026-001-definition-release-1-0-0.md +67 -0
  201. package/.koolie/core/governance/change-requests/CR-2026-002-client-packs.md +63 -0
  202. package/.koolie/core/governance/change-requests/CR-2026-003-install-client-schalter.md +70 -0
  203. package/.koolie/core/governance/change-requests/CR-2026-004-client-pack-claude-code.md +82 -0
  204. package/.koolie/core/governance/change-requests/CR-2026-005-kern-neutralisierung.md +75 -0
  205. package/.koolie/core/governance/change-requests/CR-2026-006-gemeinsame-skill-quelle.md +77 -0
  206. package/.koolie/core/governance/change-requests/CR-2026-007-geteilte-kernbestandteile.md +80 -0
  207. package/.koolie/core/governance/change-requests/CR-2026-008-berechtigungen-und-hooks.md +85 -0
  208. package/.koolie/core/governance/change-requests/CR-2026-009-umbenennung-leitwerk.md +77 -0
  209. package/.koolie/core/governance/change-requests/CR-2026-010-restduplikation.md +73 -0
  210. package/.koolie/core/governance/change-requests/CR-2026-011-hauptdokument.md +72 -0
  211. package/.koolie/core/governance/change-requests/CR-2026-012-schreibschutz-kernverzeichnis.md +106 -0
  212. package/.koolie/core/governance/change-requests/CR-2026-013-validator-blindstellen.md +128 -0
  213. package/.koolie/core/governance/change-requests/CR-2026-014-kurzform-langform.md +125 -0
  214. package/.koolie/core/governance/change-requests/CR-2026-015-versionskette.md +150 -0
  215. package/.koolie/core/governance/change-requests/CR-2026-016-ap2-claude-code.md +127 -0
  216. package/.koolie/core/governance/change-requests/CR-2026-017-ladebedingungen-claude-code.md +173 -0
  217. package/.koolie/core/governance/change-requests/CR-2026-018-quellenliste-claude-code.md +121 -0
  218. package/.koolie/core/governance/change-requests/CR-2026-019-strukturentscheidungen-fortschreiben.md +143 -0
  219. package/.koolie/core/governance/change-requests/CR-2026-020-akteursbezeichnung.md +118 -0
  220. package/.koolie/core/governance/change-requests/CR-2026-021-hook-interpreter.md +113 -0
  221. package/.koolie/core/governance/change-requests/CR-2026-022-artefaktversionen.md +73 -0
  222. package/.koolie/core/governance/change-requests/CR-2026-023-shell-lesesperre.md +128 -0
  223. package/.koolie/core/governance/change-requests/CR-2026-024-clientbindungen.md +78 -0
  224. package/.koolie/core/governance/change-requests/CR-2026-025-betriebsmodi.md +110 -0
  225. package/.koolie/core/governance/change-requests/CR-2026-026-fail-closed.md +134 -0
  226. package/.koolie/core/governance/change-requests/CR-2026-027-zeichenlimit-einstufung.md +105 -0
  227. package/.koolie/core/governance/change-requests/CR-2026-028-berechtigungsmodi.md +130 -0
  228. package/.koolie/core/governance/change-requests/CR-2026-029-hook-ablageort.md +115 -0
  229. package/.koolie/core/governance/change-requests/CR-2026-030-lesende-werkzeuge.md +143 -0
  230. package/.koolie/core/governance/change-requests/CR-2026-031-regelquellen-ausserhalb.md +182 -0
  231. package/.koolie/core/governance/change-requests/CR-2026-032-fremde-skill-ablage.md +151 -0
  232. package/.koolie/core/governance/change-requests/CR-2026-033-modusabhaengige-durchsetzung.md +131 -0
  233. package/.koolie/core/governance/change-requests/CR-2026-034-nachweisbedingungen.md +116 -0
  234. package/.koolie/core/governance/change-requests/CR-2026-035-readme-in-der-regelablage.md +115 -0
  235. package/.koolie/core/governance/change-requests/CR-2026-036-ortsangaben-hook-konfiguration.md +108 -0
  236. package/.koolie/core/governance/change-requests/CR-2026-037-meldender-hook-clientgebunden.md +133 -0
  237. package/.koolie/core/governance/change-requests/CR-2026-038-importsteuerung.md +159 -0
  238. package/.koolie/core/governance/change-requests/CR-2026-039-normative-saetze-in-kommentaren.md +124 -0
  239. package/.koolie/core/governance/change-requests/CR-2026-040-erh01-ist-clientgebunden.md +115 -0
  240. package/.koolie/core/governance/change-requests/CR-2026-041-s5-nicht-abbildbar.md +128 -0
  241. package/.koolie/core/governance/change-requests/CR-2026-042-abwesenheitsnachweis-suchwerkzeug.md +102 -0
  242. package/.koolie/core/governance/change-requests/CR-2026-043-validator-gibt-trefferwerte-aus.md +135 -0
  243. package/.koolie/core/governance/change-requests/CR-2026-044-aktivierungspruefung-clientgebunden.md +112 -0
  244. package/.koolie/core/governance/change-requests/CR-2026-045-update-verliert-die-clientwahl.md +116 -0
  245. package/.koolie/core/governance/change-requests/CR-2026-046-erstinstallation-ueberschreibt-projektdatei.md +125 -0
  246. package/.koolie/core/governance/change-requests/CR-2026-047-zusagen-je-zugriffskanal.md +133 -0
  247. package/.koolie/core/governance/change-requests/CR-2026-048-modusgrenze-ohne-durchsetzung.md +137 -0
  248. package/.koolie/core/governance/change-requests/CR-2026-049-sondenlauf-kodierungsabhaengig.md +126 -0
  249. package/.koolie/core/governance/change-requests/CR-2026-050-allowed-tools-und-verworfene-permissions.md +110 -0
  250. package/.koolie/core/governance/change-requests/CR-2026-051-quellenkarte-und-ueberholter-stand.md +110 -0
  251. package/.koolie/core/governance/change-requests/CR-2026-052-drei-regelkonflikte.md +166 -0
  252. package/.koolie/core/governance/change-requests/CR-2026-053-lesesperre-und-entwicklungsprofil.md +144 -0
  253. package/.koolie/core/governance/change-requests/CR-2026-054-aktivierung-verlangt-aktivitaet.md +124 -0
  254. package/.koolie/core/governance/change-requests/CR-2026-055-domain-ausnahme-ohne-mechanismus.md +173 -0
  255. package/.koolie/core/governance/change-requests/CR-2026-056-eingabeschema-und-pfadidentitaet.md +245 -0
  256. package/.koolie/core/governance/change-requests/CR-2026-057-disallowed-tools-und-s3.md +148 -0
  257. package/.koolie/core/governance/change-requests/CR-2026-058-unteragent-reichweite.md +203 -0
  258. package/.koolie/core/governance/change-requests/CR-2026-059-unteragent-tiefe-und-widerspruch.md +125 -0
  259. package/.koolie/core/governance/change-requests/CR-2026-060-stumme-brueche.md +170 -0
  260. package/.koolie/core/governance/change-requests/CR-2026-061-berechtigungsdatei-ohne-pruefung.md +169 -0
  261. package/.koolie/core/governance/change-requests/CR-2026-062-werkzeugabbildung-des-frontmatters.md +178 -0
  262. package/.koolie/core/governance/change-requests/CR-2026-063-skillaufruf-ohne-freigabe.md +207 -0
  263. package/.koolie/core/governance/change-requests/CR-2026-064-pruefregister-nicht-nachgezaehlt.md +141 -0
  264. package/.koolie/core/governance/change-requests/CR-2026-065-devin-suchwerkzeuge-erhoben.md +170 -0
  265. package/.koolie/core/governance/change-requests/CR-2026-066-schlitzdeckung-ohne-abgleich.md +153 -0
  266. package/.koolie/core/governance/change-requests/CR-2026-067-hookblock-und-praeparationsregister.md +140 -0
  267. package/.koolie/core/governance/change-requests/CR-2026-068-sondenlauf-nebenlaeufig.md +106 -0
  268. package/.koolie/core/governance/change-requests/CR-2026-069-bytecode-des-kerns.md +108 -0
  269. package/.koolie/core/governance/change-requests/CR-2026-070-d11-zaehler.md +114 -0
  270. package/.koolie/core/governance/change-requests/CR-2026-071-strukturentscheidungen-bestaetigen.md +322 -0
  271. package/.koolie/core/governance/change-requests/CR-2026-072-modulstatus-heben.md +315 -0
  272. package/.koolie/core/governance/change-requests/CR-2026-073-nicht-skill-traeger-heben.md +246 -0
  273. package/.koolie/core/governance/change-requests/CR-2026-074-restliche-nicht-skill-traeger-heben.md +271 -0
  274. package/.koolie/core/governance/change-requests/CR-2026-075-ap2-zielversion-devin-desktop.md +335 -0
  275. package/.koolie/core/governance/change-requests/CR-2026-076-erster-sitzungstest.md +455 -0
  276. package/.koolie/core/governance/change-requests/CR-2026-077-sitzungstest-schranken.md +425 -0
  277. package/.koolie/core/governance/change-requests/CR-2026-078-planung-nach-1-0-0.md +294 -0
  278. package/.koolie/core/governance/change-requests/CR-2026-079-umbenennung-vorziehen.md +233 -0
  279. package/.koolie/core/governance/change-requests/CR-2026-080-clientbindung-des-kerns.md +321 -0
  280. package/.koolie/core/governance/change-requests/CR-2026-081-produktnamen-im-kern.md +297 -0
  281. package/.koolie/core/governance/change-requests/CR-2026-082-sitzungstest-pi-ds-2.md +145 -0
  282. package/.koolie/core/governance/change-requests/CR-2026-083-sitzungstest-ne-sc.md +300 -0
  283. package/.koolie/core/governance/change-requests/CR-2026-084-trockenlauf-gegen-den-committeten-stand.md +117 -0
  284. package/.koolie/core/governance/change-requests/CR-2026-085-vorbedingungen-sitzungstest-5.md +182 -0
  285. package/.koolie/core/governance/change-requests/CR-2026-086-grenzfaelle-gegen-die-fassungen.md +164 -0
  286. package/.koolie/core/governance/change-requests/CR-2026-087-produktbeobachtung-quellenliste.md +206 -0
  287. package/.koolie/core/governance/change-requests/CR-2026-088-vorbedingungen-testblaetter.md +127 -0
  288. package/.koolie/core/governance/change-requests/CR-2026-089-herrichtung-uebungsrepositorium.md +226 -0
  289. package/.koolie/core/governance/change-requests/CR-2026-090-vorbedingungen-sitzungstest-5-zweiter-durchgang.md +255 -0
  290. package/.koolie/core/governance/change-requests/CR-2026-091-sitzungstest-5.md +163 -0
  291. package/.koolie/core/governance/change-requests/CR-2026-092-pruefmittelwort-und-buendelschnitt.md +226 -0
  292. package/.koolie/core/governance/change-requests/CR-2026-093-sechzehnte-praeparation.md +151 -0
  293. package/.koolie/core/governance/change-requests/CR-2026-094-testblaetter-buendel-1.md +113 -0
  294. package/.koolie/core/governance/change-requests/CR-2026-095-pruefapparat-filter.md +65 -0
  295. package/.koolie/core/governance/change-requests/CR-2026-096-vorbedingungen-buendel-2.md +225 -0
  296. package/.koolie/core/governance/change-requests/CR-2026-097-testblaetter-buendel-2.md +162 -0
  297. package/.koolie/core/governance/change-requests/CR-2026-098-anforderungen-auslieferung.md +93 -0
  298. package/.koolie/core/governance/change-requests/CR-2026-099-k74-und-vorbedingungen-buendel-3.md +119 -0
  299. package/.koolie/core/governance/change-requests/CR-2026-100-testblaetter-buendel-3.md +120 -0
  300. package/.koolie/core/governance/change-requests/CR-2026-101-k77-eigener-posten.md +165 -0
  301. package/.koolie/core/governance/change-requests/CR-2026-102-k77-entschieden.md +118 -0
  302. package/.koolie/core/governance/change-requests/CR-2026-103-vorbedingungen-buendel-4.md +76 -0
  303. package/.koolie/core/governance/change-requests/CR-2026-104-herrichtung-buendel-4.md +82 -0
  304. package/.koolie/core/governance/change-requests/CR-2026-105-messapparat-buendel-4.md +227 -0
  305. package/.koolie/core/governance/change-requests/CR-2026-106-uebergabe-einchecken.md +91 -0
  306. package/.koolie/core/governance/change-requests/CR-2026-107-uebergabe-im-release-commit.md +111 -0
  307. package/.koolie/core/governance/change-requests/CR-2026-108-testblaetter-buendel-4.md +118 -0
  308. package/.koolie/core/governance/change-requests/CR-2026-109-berichtsweg-des-aufraeumers.md +108 -0
  309. package/.koolie/core/governance/change-requests/CR-2026-110-vorbedingungen-des-nachlaufs.md +184 -0
  310. package/.koolie/core/governance/change-requests/CR-2026-111-der-apparat-auf-dem-weg-der-wiederaufnahme.md +127 -0
  311. package/.koolie/core/governance/change-requests/CR-2026-112-der-arbeitsplatz-im-kern.md +103 -0
  312. package/.koolie/core/governance/change-requests/CR-2026-113-nachlauf-buendel-4.md +103 -0
  313. package/.koolie/core/governance/change-requests/CR-2026-114-vorbedingungen-buendel-5.md +317 -0
  314. package/.koolie/core/governance/change-requests/CR-2026-115-herrichtung-buendel-5.md +244 -0
  315. package/.koolie/core/governance/change-requests/CR-2026-116-messtag-buendel-5.md +178 -0
  316. package/.koolie/core/governance/change-requests/CR-2026-117-sammelzellen-zentraler-katalog.md +251 -0
  317. package/.koolie/core/governance/change-requests/CR-2026-118-quellenzuordnung-matrixzeilen.md +115 -0
  318. package/.koolie/core/governance/change-requests/CR-2026-119-umbenennung-koolie.md +204 -0
  319. package/.koolie/core/governance/change-requests/CR-2026-120-ap2-rest-devin-desktop.md +96 -0
  320. package/.koolie/core/governance/change-requests/CR-2026-121-verify-marker-abschaffen.md +185 -0
  321. package/.koolie/core/governance/change-requests/CR-2026-122-umbenennung-koolie-lauf.md +131 -0
  322. package/.koolie/core/governance/change-requests/CR-2026-123-vortrag-und-namensabsatz.md +170 -0
  323. package/.koolie/core/governance/change-requests/CR-2026-124-hauptdokument-ap11.md +237 -0
  324. package/.koolie/core/governance/change-requests/CR-2026-125-word-fassung-und-blinder-fleck.md +204 -0
  325. package/.koolie/core/governance/change-requests/CR-2026-126-lizenz-gpl3.md +112 -0
  326. package/.koolie/core/governance/change-requests/CR-2026-127-gegenzeichnung-rollenfrage.md +96 -0
  327. package/.koolie/core/governance/change-requests/CR-2026-128-freigabelauf-1.0.0.md +278 -0
  328. package/.koolie/core/governance/change-requests/CR-2026-129-archiv-zeilenenden.md +90 -0
  329. package/.koolie/core/governance/change-requests/CR-2026-130-reihenfolge-des-hebens.md +204 -0
  330. package/.koolie/core/governance/change-requests/CR-2026-131-chronik-und-vorlage.md +194 -0
  331. package/.koolie/core/governance/change-requests/CR-2026-132-erhebung-openai-codex.md +185 -0
  332. package/.koolie/core/governance/change-requests/CR-2026-133-bau-openai-codex.md +97 -0
  333. package/.koolie/core/governance/change-requests/CR-2026-134-uebergabe-lokal.md +117 -0
  334. package/.koolie/core/governance/change-requests/CR-2026-135-pfadlisten-nul-getrennt.md +139 -0
  335. package/.koolie/core/governance/change-requests/CR-2026-136-overlay-werte-einordnung.md +156 -0
  336. package/.koolie/core/governance/change-requests/CR-2026-137-kopierweg-kern.md +144 -0
  337. package/.koolie/core/governance/change-requests/CR-2026-138-overlay-muster-general.md +118 -0
  338. package/.koolie/core/governance/change-requests/CR-2026-139-overlay-muster-dokumente.md +105 -0
  339. package/.koolie/core/governance/change-requests/CR-2026-140-installer-je-zielsystem.md +120 -0
  340. package/.koolie/core/governance/change-requests/CR-2026-141-lieferumfang.md +123 -0
  341. package/.koolie/core/governance/change-requests/CR-2026-142-dokumentationsstandard.md +90 -0
  342. package/.koolie/core/governance/change-requests/CR-2026-143-klasse-b-core-laufzeit.md +89 -0
  343. package/.koolie/core/governance/change-requests/CR-2026-144-klasse-b-governance.md +90 -0
  344. package/.koolie/core/governance/change-requests/CR-2026-145-klasse-b-skills.md +81 -0
  345. package/.koolie/core/governance/change-requests/CR-2026-146-code-pack-posten.md +84 -0
  346. package/.koolie/core/governance/change-requests/CR-2026-147-regel-register-posten.md +78 -0
  347. package/.koolie/core/governance/change-requests/CR-2026-148-mehrprojekt-tokenlast.md +70 -0
  348. package/.koolie/core/governance/change-requests/CR-2026-149-regelablage-pfadtoken.md +71 -0
  349. package/.koolie/core/governance/change-requests/CR-2026-150-client-pack-kiro.md +76 -0
  350. package/.koolie/core/governance/change-requests/CR-2026-151-skill-anweisungen.md +71 -0
  351. package/.koolie/core/governance/change-requests/CR-2026-152-testblaetter-modellwechsel.md +78 -0
  352. package/.koolie/core/governance/change-requests/CR-2026-153-attributionszeile.md +88 -0
  353. package/.koolie/core/governance/change-requests/CR-2026-154-auffindbarkeit.md +102 -0
  354. package/.koolie/core/governance/change-requests/CR-2026-155-client-pack-cursor.md +80 -0
  355. package/.koolie/core/governance/change-requests/CR-2026-156-mandat-und-reibung.md +100 -0
  356. package/.koolie/core/governance/change-requests/CR-2026-157-mcp-anbindung.md +93 -0
  357. package/.koolie/core/governance/change-requests/CR-2026-158-registerpflege.md +69 -0
  358. package/.koolie/core/governance/change-requests/CR-2026-159-powershell.md +49 -0
  359. package/.koolie/core/governance/change-requests/CR-2026-160-messapparat.md +59 -0
  360. package/.koolie/core/governance/change-requests/CR-2026-161-pruefwerkzeuge.md +52 -0
  361. package/.koolie/core/governance/change-requests/CR-2026-162-schutzschicht.md +65 -0
  362. package/.koolie/core/governance/change-requests/CR-2026-163-pfadsemantik.md +61 -0
  363. package/.koolie/core/governance/change-requests/CR-2026-164-modi-ausnahmen.md +65 -0
  364. package/.koolie/core/governance/change-requests/CR-2026-165-installer-banner.md +406 -0
  365. package/.koolie/core/governance/change-requests/CR-2026-166-nachlauf-aufzeichnungen.md +59 -0
  366. package/.koolie/core/governance/change-requests/CR-2026-167-einsatzarchitektur.md +60 -0
  367. package/.koolie/core/governance/change-requests/CR-2026-168-paketquellen.md +64 -0
  368. package/.koolie/core/governance/change-requests/CR-2026-169-modusbindung-messfragen.md +58 -0
  369. package/.koolie/core/governance/change-requests/CR-2026-170-erste-veroeffentlichung.md +62 -0
  370. package/.koolie/core/governance/change-requests/CR-2026-171-befehl-im-projektverzeichnis.md +57 -0
  371. package/.koolie/core/governance/change-requests/CR-2026-172-auftritt-npm-suche.md +58 -0
  372. package/.koolie/core/install.py +2402 -0
  373. package/.koolie/core/install_dialog.py +227 -0
  374. package/.koolie/core/koexistenz.py +112 -0
  375. package/.koolie/core/mandat.py +605 -0
  376. package/.koolie/core/onboarding/COMPLETION_CRITERIA.md +37 -0
  377. package/.koolie/core/onboarding/GUIDE.md +103 -0
  378. package/.koolie/core/onboarding/KNOWLEDGE_CHECK.md +48 -0
  379. package/.koolie/core/onboarding/MENTOR_CHECKLIST.md +40 -0
  380. package/.koolie/core/onboarding/QUICKSTART.md +50 -0
  381. package/.koolie/core/onboarding/REFERENCE.md +69 -0
  382. package/.koolie/core/onboarding/exercises/EXERCISES.md +78 -0
  383. package/.koolie/core/onboarding/exercises/README.md +120 -0
  384. package/.koolie/core/pilot/METRICS.md +59 -0
  385. package/.koolie/core/pilot/PILOT_CONCEPT.md +42 -0
  386. package/.koolie/core/prompts/01-understand-codebase.md +99 -0
  387. package/.koolie/core/prompts/02-impact-analysis.md +104 -0
  388. package/.koolie/core/prompts/03-implementation-planning.md +102 -0
  389. package/.koolie/core/prompts/04-code-generation.md +100 -0
  390. package/.koolie/core/prompts/05-test-generation.md +103 -0
  391. package/.koolie/core/prompts/06-refactoring.md +102 -0
  392. package/.koolie/core/prompts/07-debugging.md +97 -0
  393. package/.koolie/core/prompts/08-security-review.md +92 -0
  394. package/.koolie/core/prompts/09-performance-analysis.md +89 -0
  395. package/.koolie/core/prompts/10-documentation.md +91 -0
  396. package/.koolie/core/prompts/11-merge-request-review.md +94 -0
  397. package/.koolie/core/prompts/12-developer-training.md +90 -0
  398. package/.koolie/core/prompts/README.md +88 -0
  399. package/.koolie/core/templates/MR_AI_DISCLOSURE.md +37 -0
  400. package/.koolie/core/templates/PLAN_TEMPLATE.md +57 -0
  401. package/.koolie/core/templates/SKILL_TEMPLATE.md +159 -0
  402. package/.koolie/core/templates/project-overlay/OVERLAY.md +315 -0
  403. package/.koolie/core/templates/project-overlay/documents/README.md +43 -0
  404. package/.koolie/core/templates/project-overlay/documents/ai-governance/.gitkeep.md +3 -0
  405. package/.koolie/core/templates/project-overlay/documents/ai-process-model/.gitkeep.md +3 -0
  406. package/.koolie/core/templates/project-overlay/documents/architecture/.gitkeep.md +3 -0
  407. package/.koolie/core/templates/project-overlay/documents/architecture/decisions/README.md +3 -0
  408. package/.koolie/core/templates/project-overlay/documents/branching-strategy/.gitkeep.md +3 -0
  409. package/.koolie/core/templates/project-overlay/documents/coding-guidelines/.gitkeep.md +3 -0
  410. package/.koolie/core/templates/project-overlay/documents/definition-of-done/.gitkeep.md +3 -0
  411. package/.koolie/core/templates/project-overlay/documents/definition-of-ready/.gitkeep.md +3 -0
  412. package/.koolie/core/templates/project-overlay/documents/deployment/.gitkeep.md +3 -0
  413. package/.koolie/core/templates/project-overlay/documents/glossary/.gitkeep.md +3 -0
  414. package/.koolie/core/templates/project-overlay/documents/quality/.gitkeep.md +3 -0
  415. package/.koolie/core/templates/project-overlay/documents/roadmap/.gitkeep.md +3 -0
  416. package/.koolie/core/templates/project-overlay/documents/roles/.gitkeep.md +3 -0
  417. package/.koolie/core/templates/project-overlay/documents/security/.gitkeep.md +3 -0
  418. package/.koolie/core/templates/project-overlay/exceptions/EXCEPTIONS.md +9 -0
  419. package/.koolie/core/templates/project-overlay/forbidden-terms.txt +8 -0
  420. package/.koolie/core/templates/project-overlay/overlay-manifest.yaml +73 -0
  421. package/.koolie/core/templates/rules/21-overlay-TEMPLATE.md.template +28 -0
  422. package/.koolie/core/templates/rules/40-tech-TEMPLATE.md.template +33 -0
  423. package/.koolie/core/tests/EDGE_CASES.md +67 -0
  424. package/.koolie/core/tests/TEST_CATALOG.md +170 -0
  425. package/.koolie/core/tests/erhebungen/README.md +326 -0
  426. package/.koolie/core/tests/erhebungen/ablage.py +357 -0
  427. package/.koolie/core/tests/erhebungen/apparat/__init__.py +22 -0
  428. package/.koolie/core/tests/erhebungen/apparat/baum.py +214 -0
  429. package/.koolie/core/tests/erhebungen/apparat/belege.py +91 -0
  430. package/.koolie/core/tests/erhebungen/apparat/clients.py +321 -0
  431. package/.koolie/core/tests/erhebungen/apparat/freigabe.py +74 -0
  432. package/.koolie/core/tests/erhebungen/apparat/kontingent.py +64 -0
  433. package/.koolie/core/tests/erhebungen/apparat/laeufer.py +155 -0
  434. package/.koolie/core/tests/erhebungen/apparat/reihe.py +202 -0
  435. package/.koolie/core/tests/erhebungen/apparat/selbsttest.py +280 -0
  436. package/.koolie/core/tests/erhebungen/apparat/stand.py +30 -0
  437. package/.koolie/core/tests/erhebungen/apparat/vorpruefung.py +70 -0
  438. package/.koolie/core/tests/erhebungen/auswerten-b4.py +468 -0
  439. package/.koolie/core/tests/erhebungen/auswerten-b5.py +517 -0
  440. package/.koolie/core/tests/erhebungen/auswerten-dd.py +172 -0
  441. package/.koolie/core/tests/erhebungen/baeume-b4.py +334 -0
  442. package/.koolie/core/tests/erhebungen/baeume-b5.py +339 -0
  443. package/.koolie/core/tests/erhebungen/baeume_loeschen.py +138 -0
  444. package/.koolie/core/tests/erhebungen/cc-overlay-fuellen.py +277 -0
  445. package/.koolie/core/tests/erhebungen/dossier-b4.py +178 -0
  446. package/.koolie/core/tests/erhebungen/dossier-b5.py +202 -0
  447. package/.koolie/core/tests/erhebungen/historie-bauen-b4.py +642 -0
  448. package/.koolie/core/tests/erhebungen/k-bauen-b3.py +841 -0
  449. package/.koolie/core/tests/erhebungen/lauf-dd.py +146 -0
  450. package/.koolie/core/tests/erhebungen/lauf.py +114 -0
  451. package/.koolie/core/tests/erhebungen/mcp-waechter.py +278 -0
  452. package/.koolie/core/tests/erhebungen/messbaum-schnitt.py +256 -0
  453. package/.koolie/core/tests/erhebungen/messen.py +72 -0
  454. package/.koolie/core/tests/erhebungen/node-waechter.py +74 -0
  455. package/.koolie/core/tests/erhebungen/packaktivierung.py +403 -0
  456. package/.koolie/core/tests/erhebungen/prompts-schreiben-b4.py +210 -0
  457. package/.koolie/core/tests/erhebungen/prompts-schreiben-b5.py +251 -0
  458. package/.koolie/core/tests/erhebungen/reihe-b4.py +171 -0
  459. package/.koolie/core/tests/erhebungen/reihe-b5.py +172 -0
  460. package/.koolie/core/tests/erhebungen/stand-b4.py +135 -0
  461. package/.koolie/core/tests/erhebungen/stand-b5.py +137 -0
  462. package/.koolie/core/tests/erhebungen/trust-b4.py +56 -0
  463. package/.koolie/core/tests/erhebungen/trust-b5.py +56 -0
  464. package/.koolie/core/tests/erhebungen/turn2-schreiben-b4.py +105 -0
  465. package/.koolie/core/tests/erhebungen/umgebungen-bauen-b4.py +377 -0
  466. package/.koolie/core/tests/erhebungen/umgebungen-bauen-b5.py +363 -0
  467. package/.koolie/core/tests/erhebungen/zaehlen46.py +74 -0
  468. package/.koolie/core/tests/erhebungen/zustand-b4.py +82 -0
  469. package/.koolie/core/tests/erhebungen/zustand-b5.py +82 -0
  470. package/.koolie/core/tests/protocols/2026-09-10-AP2-claude-code-wirkungsnachweise.md +194 -0
  471. package/.koolie/core/tests/protocols/2026-09-10-AP2-claude-code.md +468 -0
  472. package/.koolie/core/tests/protocols/2026-09-10-CR-2026-020-akteursbezeichnung.md +99 -0
  473. package/.koolie/core/tests/protocols/2026-09-10-CR-2026-021-hook-interpreter.md +138 -0
  474. package/.koolie/core/tests/protocols/2026-09-10-CR-2026-022-artefaktversionen.md +87 -0
  475. package/.koolie/core/tests/protocols/2026-09-10-CR-2026-023-shell-lesesperre.md +135 -0
  476. package/.koolie/core/tests/protocols/2026-09-10-CR-2026-024-clientbindungen.md +98 -0
  477. package/.koolie/core/tests/protocols/2026-09-10-FW-DS-03.md +90 -0
  478. package/.koolie/core/tests/protocols/2026-09-10-FW-KO-01.md +105 -0
  479. package/.koolie/core/tests/protocols/2026-09-10-FW-KO-02.md +123 -0
  480. package/.koolie/core/tests/protocols/2026-09-10-FW-KO-04.md +73 -0
  481. package/.koolie/core/tests/protocols/2026-09-10-FW-RE-02.md +99 -0
  482. package/.koolie/core/tests/protocols/2026-09-10-FW-VN-01-wiederholung.md +108 -0
  483. package/.koolie/core/tests/protocols/2026-09-10-FW-VN-01.md +249 -0
  484. package/.koolie/core/tests/protocols/2026-09-10-FW-ZA-05.md +99 -0
  485. package/.koolie/core/tests/protocols/2026-09-11-AP2-devin-desktop.md +257 -0
  486. package/.koolie/core/tests/protocols/2026-09-11-CR-2026-026-fail-closed.md +113 -0
  487. package/.koolie/core/tests/protocols/2026-09-11-erhebungen-K21-K26.md +243 -0
  488. package/.koolie/core/tests/protocols/2026-09-11-wirkungsnachweise-0.26.0.md +101 -0
  489. package/.koolie/core/tests/protocols/2026-09-12-B01-allowed-tools.md +152 -0
  490. package/.koolie/core/tests/protocols/2026-09-12-B04-B05-gegenpruefung.md +204 -0
  491. package/.koolie/core/tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md +268 -0
  492. package/.koolie/core/tests/protocols/2026-09-12-mehrprojekt-arbeitsbereich.md +154 -0
  493. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.26.1.md +126 -0
  494. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.27.0.md +114 -0
  495. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.28.0.md +129 -0
  496. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.29.0.md +121 -0
  497. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.30.0.md +112 -0
  498. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.31.0.md +107 -0
  499. package/.koolie/core/tests/protocols/2026-09-13-B06-gegenpruefung.md +370 -0
  500. package/.koolie/core/tests/protocols/2026-09-13-B07-B09-gegenpruefung.md +211 -0
  501. package/.koolie/core/tests/protocols/2026-09-13-B08-B11-gegenpruefung.md +179 -0
  502. package/.koolie/core/tests/protocols/2026-09-13-erhebung-disallowed-tools.md +147 -0
  503. package/.koolie/core/tests/protocols/2026-09-13-erhebung-unteragent-tiefe.md +139 -0
  504. package/.koolie/core/tests/protocols/2026-09-13-erhebung-unteragent.md +214 -0
  505. package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-berechtigungsdatei.md +253 -0
  506. package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-stumme-brueche.md +202 -0
  507. package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-werkzeugabbildung.md +219 -0
  508. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.32.0.md +133 -0
  509. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.33.0.md +169 -0
  510. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.34.0.md +187 -0
  511. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.35.0.md +187 -0
  512. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.36.0.md +137 -0
  513. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.37.0.md +112 -0
  514. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.38.0.md +154 -0
  515. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.39.0.md +188 -0
  516. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.40.0.md +214 -0
  517. package/.koolie/core/tests/protocols/2026-09-14-erhebung-devin-werkzeuge.md +267 -0
  518. package/.koolie/core/tests/protocols/2026-09-14-erhebung-skillaufruf.md +238 -0
  519. package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-pruefregister.md +156 -0
  520. package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-schlitzdeckung.md +206 -0
  521. package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-skillwahl.md +127 -0
  522. package/.koolie/core/tests/protocols/2026-09-14-migrationslauf-pilot.md +134 -0
  523. package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.41.0.md +175 -0
  524. package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.42.0.md +180 -0
  525. package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.43.0.md +165 -0
  526. package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.44.0.md +130 -0
  527. package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-d11-zaehlregeln.md +311 -0
  528. package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-modulstatus.md +524 -0
  529. package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-nicht-skill-traeger.md +225 -0
  530. package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-restliche-nicht-skill-traeger.md +345 -0
  531. package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-strukturentscheidungen.md +392 -0
  532. package/.koolie/core/tests/protocols/2026-09-15-herrichtung-uebungsrepositorium.md +213 -0
  533. package/.koolie/core/tests/protocols/2026-09-15-migrationslauf-pilot-0.46.0.md +143 -0
  534. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.45.0.md +127 -0
  535. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.46.0.md +193 -0
  536. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.47.0.md +149 -0
  537. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.49.0.md +202 -0
  538. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.50.0.md +183 -0
  539. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.51.0.md +202 -0
  540. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.52.0.md +168 -0
  541. package/.koolie/core/tests/protocols/2026-09-16-AP2-zielversion-devin-desktop.md +231 -0
  542. package/.koolie/core/tests/protocols/2026-09-16-wirkungsnachweise-0.53.0.md +350 -0
  543. package/.koolie/core/tests/protocols/2026-09-17-nachtrag-migrationshinweis-0.54.1.md +121 -0
  544. package/.koolie/core/tests/protocols/2026-09-17-sitzungstest-pi-ds.md +523 -0
  545. package/.koolie/core/tests/protocols/2026-09-17-sitzungstest-schranken.md +433 -0
  546. package/.koolie/core/tests/protocols/2026-09-17-wirkungsnachweise-0.54.0.md +159 -0
  547. package/.koolie/core/tests/protocols/2026-09-18-FW-AK-01.md +442 -0
  548. package/.koolie/core/tests/protocols/2026-09-18-FW-KO-05.md +231 -0
  549. package/.koolie/core/tests/protocols/2026-09-18-herrichtung-uebungsrepositorium.md +273 -0
  550. package/.koolie/core/tests/protocols/2026-09-18-nachtrag-preis-umbenennung-0.56.1.md +102 -0
  551. package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-5.md +349 -0
  552. package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-ne-sc.md +430 -0
  553. package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-pi-ds-2.md +499 -0
  554. package/.koolie/core/tests/protocols/2026-09-18-vorbedingungen-sitzungstest-5-zweiter-durchgang.md +170 -0
  555. package/.koolie/core/tests/protocols/2026-09-18-vorbedingungen-testblaetter.md +184 -0
  556. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.55.0.md +202 -0
  557. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.56.0.md +135 -0
  558. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.56.2.md +154 -0
  559. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.57.0.md +228 -0
  560. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.57.1.md +262 -0
  561. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.58.0.md +135 -0
  562. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.59.0.md +150 -0
  563. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.60.0.md +340 -0
  564. package/.koolie/core/tests/protocols/2026-09-19-herrichtung-buendel-4.md +235 -0
  565. package/.koolie/core/tests/protocols/2026-09-19-k77-zurechenbarkeit.md +236 -0
  566. package/.koolie/core/tests/protocols/2026-09-19-pruefapparat-filter.md +50 -0
  567. package/.koolie/core/tests/protocols/2026-09-19-pruefmittelwort-und-buendelschnitt.md +239 -0
  568. package/.koolie/core/tests/protocols/2026-09-19-sechzehnte-praeparation.md +135 -0
  569. package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-1.md +250 -0
  570. package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-2.md +229 -0
  571. package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-3.md +293 -0
  572. package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-2.md +236 -0
  573. package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-3.md +253 -0
  574. package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-4.md +138 -0
  575. package/.koolie/core/tests/protocols/2026-09-20-messapparat-buendel-4.md +433 -0
  576. package/.koolie/core/tests/protocols/2026-09-20-testblaetter-buendel-4.md +321 -0
  577. package/.koolie/core/tests/protocols/2026-09-20-uebergabe-im-release-commit.md +146 -0
  578. package/.koolie/core/tests/protocols/2026-09-20-vorbedingungen-nachlauf-b4.md +259 -0
  579. package/.koolie/core/tests/protocols/2026-09-21-arbeitsplatz-im-kern.md +127 -0
  580. package/.koolie/core/tests/protocols/2026-09-21-nachlauf-buendel-4.md +157 -0
  581. package/.koolie/core/tests/protocols/2026-09-21-vorbedingungen-buendel-5.md +247 -0
  582. package/.koolie/core/tests/protocols/2026-09-21-wiederaufnahme-nachlauf-b4.md +190 -0
  583. package/.koolie/core/tests/protocols/2026-09-22-ap2-rest-devin-desktop.md +614 -0
  584. package/.koolie/core/tests/protocols/2026-09-22-hauptdokument-ap11.md +443 -0
  585. package/.koolie/core/tests/protocols/2026-09-22-herrichtung-buendel-5.md +224 -0
  586. package/.koolie/core/tests/protocols/2026-09-22-messtag-buendel-5.md +327 -0
  587. package/.koolie/core/tests/protocols/2026-09-22-quellenzuordnung-matrixzeilen.md +230 -0
  588. package/.koolie/core/tests/protocols/2026-09-22-sammelzellen-zentraler-katalog.md +354 -0
  589. package/.koolie/core/tests/protocols/2026-09-22-umbenennung-koolie.md +296 -0
  590. package/.koolie/core/tests/protocols/2026-09-22-verify-marker-abschaffen.md +283 -0
  591. package/.koolie/core/tests/protocols/2026-09-22-vortrag-und-name.md +261 -0
  592. package/.koolie/core/tests/protocols/2026-09-22-wirkungsnachweise-0.86.0.md +158 -0
  593. package/.koolie/core/tests/protocols/2026-09-23-archiv-zeilenenden.md +113 -0
  594. package/.koolie/core/tests/protocols/2026-09-23-bau-openai-codex.md +168 -0
  595. package/.koolie/core/tests/protocols/2026-09-23-chronik-und-vorlage.md +224 -0
  596. package/.koolie/core/tests/protocols/2026-09-23-erhebung-openai-codex.md +309 -0
  597. package/.koolie/core/tests/protocols/2026-09-23-freigabelauf-1.0.0-vorbereitung.md +119 -0
  598. package/.koolie/core/tests/protocols/2026-09-23-freigabelauf-1.0.0.md +150 -0
  599. package/.koolie/core/tests/protocols/2026-09-23-gegenzeichnung-rollenfrage.md +198 -0
  600. package/.koolie/core/tests/protocols/2026-09-23-reihenfolge-des-hebens.md +220 -0
  601. package/.koolie/core/tests/protocols/2026-09-23-word-fassung-und-blinder-fleck.md +307 -0
  602. package/.koolie/core/tests/protocols/2026-09-24-kopierweg-kern.md +98 -0
  603. package/.koolie/core/tests/protocols/2026-09-24-overlay-werte-einordnung.md +111 -0
  604. package/.koolie/core/tests/protocols/2026-09-24-pfadlisten-nul-getrennt.md +128 -0
  605. package/.koolie/core/tests/protocols/2026-09-24-uebergabe-lokal.md +85 -0
  606. package/.koolie/core/tests/protocols/2026-09-25-code-pack-posten.md +86 -0
  607. package/.koolie/core/tests/protocols/2026-09-25-dokumentationsstandard.md +101 -0
  608. package/.koolie/core/tests/protocols/2026-09-25-installer-je-zielsystem.md +134 -0
  609. package/.koolie/core/tests/protocols/2026-09-25-klasse-b-core-laufzeit.md +126 -0
  610. package/.koolie/core/tests/protocols/2026-09-25-klasse-b-governance.md +133 -0
  611. package/.koolie/core/tests/protocols/2026-09-25-klasse-b-skills.md +91 -0
  612. package/.koolie/core/tests/protocols/2026-09-25-lieferumfang.md +76 -0
  613. package/.koolie/core/tests/protocols/2026-09-25-overlay-muster-dokumente.md +107 -0
  614. package/.koolie/core/tests/protocols/2026-09-25-overlay-muster-general.md +100 -0
  615. package/.koolie/core/tests/protocols/2026-09-25-regel-register-posten.md +87 -0
  616. package/.koolie/core/tests/protocols/2026-09-26-attributionszeile.md +83 -0
  617. package/.koolie/core/tests/protocols/2026-09-26-auffindbarkeit.md +85 -0
  618. package/.koolie/core/tests/protocols/2026-09-26-bau-cursor.md +68 -0
  619. package/.koolie/core/tests/protocols/2026-09-26-bau-kiro.md +75 -0
  620. package/.koolie/core/tests/protocols/2026-09-26-mehrprojekt-tokenlast.md +174 -0
  621. package/.koolie/core/tests/protocols/2026-09-26-regelablage-pfadtoken.md +133 -0
  622. package/.koolie/core/tests/protocols/2026-09-26-skill-anweisungen.md +111 -0
  623. package/.koolie/core/tests/protocols/2026-09-26-testblaetter-modellwechsel.md +106 -0
  624. package/.koolie/core/tests/protocols/2026-09-27-mandat-und-reibung.md +58 -0
  625. package/.koolie/core/tests/protocols/2026-09-28-mcp-anbindung.md +72 -0
  626. package/.koolie/core/tests/protocols/2026-09-29-messapparat.md +75 -0
  627. package/.koolie/core/tests/protocols/2026-09-29-powershell.md +58 -0
  628. package/.koolie/core/tests/protocols/2026-09-29-pruefwerkzeuge.md +64 -0
  629. package/.koolie/core/tests/protocols/2026-09-29-registerpflege.md +228 -0
  630. package/.koolie/core/tests/protocols/2026-09-29-schutzschicht.md +95 -0
  631. package/.koolie/core/tests/protocols/2026-09-30-einsatzarchitektur.md +104 -0
  632. package/.koolie/core/tests/protocols/2026-09-30-modi-ausnahmen.md +77 -0
  633. package/.koolie/core/tests/protocols/2026-09-30-nachlauf-banner.md +85 -0
  634. package/.koolie/core/tests/protocols/2026-09-30-paketquellen.md +65 -0
  635. package/.koolie/core/tests/protocols/2026-09-30-pfadsemantik.md +79 -0
  636. package/.koolie/core/tests/protocols/2026-10-01-auftritt-und-suche.md +58 -0
  637. package/.koolie/core/tests/protocols/2026-10-01-befehl-im-projektverzeichnis.md +47 -0
  638. package/.koolie/core/tests/protocols/2026-10-01-erste-veroeffentlichung.md +60 -0
  639. package/.koolie/core/tests/protocols/2026-10-01-modusbindung-messfragen.md +107 -0
  640. package/.koolie/core/tests/protocols/README.md +14 -0
  641. package/.koolie/core/tests/scripts/hook-check-secrets.py +1307 -0
  642. package/.koolie/core/tests/scripts/hook-overlay-status.py +120 -0
  643. package/.koolie/core/tests/scripts/mermaid_renderer.py +67 -0
  644. package/.koolie/core/tests/scripts/overlay_status.py +130 -0
  645. package/.koolie/core/tests/scripts/probe-pruefungen.py +110 -0
  646. package/.koolie/core/tests/scripts/pruefungen/__init__.py +4 -0
  647. package/.koolie/core/tests/scripts/pruefungen/berechtigungen.py +1559 -0
  648. package/.koolie/core/tests/scripts/pruefungen/bestand.py +1433 -0
  649. package/.koolie/core/tests/scripts/pruefungen/dokumente.py +1262 -0
  650. package/.koolie/core/tests/scripts/pruefungen/gemeinsam.py +784 -0
  651. package/.koolie/core/tests/scripts/pruefungen/hooks.py +1188 -0
  652. package/.koolie/core/tests/scripts/pruefungen/overlay.py +1251 -0
  653. package/.koolie/core/tests/scripts/pruefungen/packs.py +1314 -0
  654. package/.koolie/core/tests/scripts/pruefungen/register.py +950 -0
  655. package/.koolie/core/tests/scripts/pruefungen/testkatalog.py +1202 -0
  656. package/.koolie/core/tests/scripts/pruefungen/werkzeuge.py +957 -0
  657. package/.koolie/core/tests/scripts/sonden/__init__.py +4 -0
  658. package/.koolie/core/tests/scripts/sonden/apparat.py +653 -0
  659. package/.koolie/core/tests/scripts/sonden/teil01_grundbestand_und_installation.py +999 -0
  660. package/.koolie/core/tests/scripts/sonden/teil02_packs_mandat_mcp.py +942 -0
  661. package/.koolie/core/tests/scripts/sonden/teil03_pruefungen_26_bis_36.py +1184 -0
  662. package/.koolie/core/tests/scripts/sonden/teil04_pruefungen_37_bis_45.py +1491 -0
  663. package/.koolie/core/tests/scripts/sonden/teil05_pruefungen_46_bis_55.py +1447 -0
  664. package/.koolie/core/tests/scripts/sonden/teil06_pruefungen_57_bis_65.py +739 -0
  665. package/.koolie/core/tests/scripts/sonden/teil07_overlay_und_lieferung.py +1014 -0
  666. package/.koolie/core/tests/scripts/sonden/teil08_pruefungen_66_bis_80.py +1325 -0
  667. package/.koolie/core/tests/scripts/sonden/teil09_pruefmittel_81_und_82.py +505 -0
  668. package/.koolie/core/tests/scripts/sonden/teil10_pruefungen_83_bis_95.py +1218 -0
  669. package/.koolie/core/tests/scripts/sonden/teil11_pruefungen_104_und_105.py +149 -0
  670. package/.koolie/core/tests/scripts/sonden/teil12_pruefungen_106_und_107.py +136 -0
  671. package/.koolie/core/tests/scripts/sonden/teil13_pfad_und_mustersemantik.py +150 -0
  672. package/.koolie/core/tests/scripts/sonden/teil14_modi_ausnahmen_skills.py +204 -0
  673. package/.koolie/core/tests/scripts/sonden/teil15_banner_und_nachlauf.py +193 -0
  674. package/.koolie/core/tests/scripts/sonden/teil16_koexistenz.py +114 -0
  675. package/.koolie/core/tests/scripts/sonden/teil17_paketquellen.py +115 -0
  676. package/.koolie/core/tests/scripts/sonden/teil18_modusbindung_m3_m5.py +113 -0
  677. package/.koolie/core/tests/scripts/validate-framework.py +1104 -0
  678. package/.koolie/core/tests/scripts/validate-output.py +296 -0
  679. package/.koolie/core/wirksamkeit.py +430 -0
  680. package/CONTRIBUTING.md +119 -0
  681. package/LICENSE +674 -0
  682. package/QUICKSTART.en.md +135 -0
  683. package/QUICKSTART.md +129 -0
  684. package/README.en.md +108 -0
  685. package/README.md +107 -0
  686. package/install.cmd +44 -0
  687. package/install.command +46 -0
  688. package/package.json +21 -0
  689. package/paketquellen/README.md +41 -0
  690. package/paketquellen/bauen.py +411 -0
  691. package/paketquellen/koolie.cmd +23 -0
  692. package/paketquellen/koolie_befehl.py +82 -0
  693. 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)