git-repokit 0.9.12__tar.gz → 0.10.3__tar.gz

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 (236) hide show
  1. {git_repokit-0.9.12/git_repokit.egg-info → git_repokit-0.10.3}/PKG-INFO +18 -3
  2. {git_repokit-0.9.12 → git_repokit-0.10.3}/README.md +15 -2
  3. {git_repokit-0.9.12 → git_repokit-0.10.3/git_repokit.egg-info}/PKG-INFO +18 -3
  4. {git_repokit-0.9.12 → git_repokit-0.10.3}/git_repokit.egg-info/SOURCES.txt +15 -0
  5. {git_repokit-0.9.12 → git_repokit-0.10.3}/git_repokit.egg-info/requires.txt +2 -0
  6. {git_repokit-0.9.12 → git_repokit-0.10.3}/pyproject.toml +7 -1
  7. git_repokit-0.10.3/repokit/__version__.py +9 -0
  8. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/branch_utils.py +40 -2
  9. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/cli.py +21 -8
  10. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/common_kit.py +78 -10
  11. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/config.py +12 -4
  12. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/defaults.py +60 -4
  13. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/layers.py +11 -1
  14. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/repo_manager.py +237 -58
  15. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/hooks/pre-commit.template +15 -1
  16. git_repokit-0.10.3/repokit/templates/layers/archetypes/paradox/ck3/.repokit-common.toml +28 -0
  17. git_repokit-0.10.3/repokit/templates/layers/archetypes/paradox/ck3/mod/descriptor.mod +6 -0
  18. git_repokit-0.10.3/repokit/templates/layers/archetypes/paradox/clausewitz/mod/localisation/english/__RK_SNAKE___l_english.yml +2 -0
  19. git_repokit-0.10.3/repokit/templates/layers/archetypes/paradox/descriptor-mod/mod/descriptor.mod +9 -0
  20. git_repokit-0.10.3/repokit/templates/layers/archetypes/paradox/descriptor-mod/mod/thumbnail.png +0 -0
  21. git_repokit-0.10.3/repokit/templates/layers/archetypes/paradox/jomini/mod/localization/english/__RK_SNAKE___l_english.yml +2 -0
  22. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.repokit-common.toml +4 -3
  23. git_repokit-0.10.3/repokit/templates/layers/languages/paradox/.gitattributes.rkappend +12 -0
  24. git_repokit-0.10.3/repokit/templates/layers/languages/paradox/.repokit-common.toml +29 -0
  25. git_repokit-0.10.3/repokit/templates/layers/languages/paradox/VERSION +1 -0
  26. git_repokit-0.10.3/repokit/templates/layers/languages/paradox/docs/modding.md +34 -0
  27. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/manifest.toml +113 -0
  28. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/vault.py +28 -8
  29. git_repokit-0.10.3/tests/test_common_guard.py +443 -0
  30. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_directory_profiles.py +27 -14
  31. git_repokit-0.10.3/tests/test_languages_setting.py +79 -0
  32. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_layers_claude_plugin.py +3 -3
  33. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_layers_cli.py +11 -2
  34. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_layers_compositions.py +29 -1
  35. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_layers_js_ts.py +3 -1
  36. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_layers_vscode.py +9 -1
  37. git_repokit-0.10.3/tests/test_list_templates.py +21 -0
  38. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_new_default.py +13 -4
  39. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_packaging.py +15 -0
  40. git_repokit-0.10.3/tests/test_paradox.py +177 -0
  41. git_repokit-0.10.3/tests/test_private_modes.py +388 -0
  42. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_vault_bootstrap.py +20 -0
  43. git_repokit-0.9.12/repokit/__version__.py +0 -4
  44. {git_repokit-0.9.12 → git_repokit-0.10.3}/LICENSE +0 -0
  45. {git_repokit-0.9.12 → git_repokit-0.10.3}/MANIFEST.in +0 -0
  46. {git_repokit-0.9.12 → git_repokit-0.10.3}/git_repokit.egg-info/dependency_links.txt +0 -0
  47. {git_repokit-0.9.12 → git_repokit-0.10.3}/git_repokit.egg-info/entry_points.txt +0 -0
  48. {git_repokit-0.9.12 → git_repokit-0.10.3}/git_repokit.egg-info/top_level.txt +0 -0
  49. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/__init__.py +0 -0
  50. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/__main__.py +0 -0
  51. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/__init__.py +0 -0
  52. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/ailib/__init__.py +0 -0
  53. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/ailib/analyzer.py +0 -0
  54. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/ailib/backend.py +0 -0
  55. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/ailib/cache.py +0 -0
  56. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/ailib/parsers.py +0 -0
  57. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/__init__.py +0 -0
  58. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/cli.py +0 -0
  59. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/openai_compat.py +0 -0
  60. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/prompt_file.py +0 -0
  61. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/_vendor/ailib/types.py +0 -0
  62. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/auth_integration.py +0 -0
  63. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/badges.py +0 -0
  64. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/directory_analyzer.py +0 -0
  65. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/directory_profiles.py +0 -0
  66. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/git_config.py +0 -0
  67. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/github_create.py +0 -0
  68. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/github_setup.py +0 -0
  69. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/guardrails.py +0 -0
  70. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/history_cleaner.py +0 -0
  71. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/history_protection.py +0 -0
  72. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/hooks/pre-commit-guardrails +0 -0
  73. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/hooks/pre-commit-template +0 -0
  74. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/0bsd.txt +0 -0
  75. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/LICENSES.md +0 -0
  76. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/__init__.py +0 -0
  77. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/agpl-3.0.txt +0 -0
  78. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/all-rights-reserved.txt +0 -0
  79. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/apache-2.0.txt +0 -0
  80. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/bsd-2-clause.txt +0 -0
  81. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/bsd-3-clause.txt +0 -0
  82. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/bsl-1.0.txt +0 -0
  83. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/cc-by-4.0.txt +0 -0
  84. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/cc-by-sa-4.0.txt +0 -0
  85. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/cc0-1.0.txt +0 -0
  86. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/epl-2.0.txt +0 -0
  87. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/gpl-2.0.txt +0 -0
  88. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/gpl-3.0.txt +0 -0
  89. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/isc.txt +0 -0
  90. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/lgpl-2.1.txt +0 -0
  91. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/lgpl-3.0.txt +0 -0
  92. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/mit.txt +0 -0
  93. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/mpl-2.0.txt +0 -0
  94. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/proprietary-evaluation.txt +0 -0
  95. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/licenses/unlicense.txt +0 -0
  96. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/readme_blocks.py +0 -0
  97. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/remote_integration.py +0 -0
  98. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/template_engine.py +0 -0
  99. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/ai/claude/CLAUDE-nested.md.template +0 -0
  100. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/ai/claude/CLAUDE.md.template +0 -0
  101. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/ai/claude/instructions/step1_context_rebuilder.md +0 -0
  102. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/ai/claude/instructions/step2_dev_workflow_process.md +0 -0
  103. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/ai/claude/instructions/step3_context_bridge.md +0 -0
  104. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/common/CHANGELOG.md.template +0 -0
  105. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/common/CONTRIBUTING.md.template +0 -0
  106. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/common/README.md.template +0 -0
  107. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/common/gitattributes.template +0 -0
  108. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/common/gitignore.template +0 -0
  109. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/extras/FUNDING.yml.template +0 -0
  110. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/extras/ROADMAP.md.template +0 -0
  111. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/extras/dependabot.yml.template +0 -0
  112. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/extras/one-offs-README.md.template +0 -0
  113. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/extras/platform-support.md.template +0 -0
  114. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/extras/pull_request_template.md.template +0 -0
  115. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/extras/release-template.md.template +0 -0
  116. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/extras/settings.json.template +0 -0
  117. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/extras/stale.yml.template +0 -0
  118. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/github/CODEOWNERS.template +0 -0
  119. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/github/ISSUE_TEMPLATE/bug-report.md.template +0 -0
  120. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/github/ISSUE_TEMPLATE/feature-request.md.template +0 -0
  121. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/github/issues/notes.md.template +0 -0
  122. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/github/issues/roadmap.md.template +0 -0
  123. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/any/claude-plugin/.claude-plugin/marketplace.json +0 -0
  124. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/any/claude-plugin/plugin/.claude-plugin/plugin.json +0 -0
  125. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/any/claude-plugin/plugin/README.md +0 -0
  126. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.github/workflows/ci-c-cpp.yml +0 -0
  127. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.repokit-common.toml.rkappend +0 -0
  128. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.vscode/launch.json +0 -0
  129. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.vscode/tasks.json +0 -0
  130. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/CMakeLists.txt +0 -0
  131. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/CMakePresets.json +0 -0
  132. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/cmake/GenerateStamp.cmake +0 -0
  133. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/src/main.cpp +0 -0
  134. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/tests/test_version.cpp +0 -0
  135. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/vcpkg.json +0 -0
  136. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/.vscode/launch.json +0 -0
  137. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/Makefile +0 -0
  138. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/build.bat +0 -0
  139. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/src/__RK_SNAKE__.c +0 -0
  140. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/.vscode/launch.json +0 -0
  141. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/.vscode/tasks.json +0 -0
  142. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/__RK_PROJECT__.sln +0 -0
  143. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/__RK_PROJECT__.vcxproj +0 -0
  144. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/src/main.cpp +0 -0
  145. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/.repokit-common.toml +0 -0
  146. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/.vscode/launch.json +0 -0
  147. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/plugin/hooks/hooks.json +0 -0
  148. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/plugin/hooks/scripts/session-start.mjs +0 -0
  149. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/plugin/tests/manifest.test.js +0 -0
  150. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node/.repokit-common.toml.rkappend +0 -0
  151. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node/package.json +0 -0
  152. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/.github/workflows/release.yml +0 -0
  153. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/package.json +0 -0
  154. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/src/index.ts +0 -0
  155. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/tests/index.test.ts +0 -0
  156. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/script/.vscode/launch.json +0 -0
  157. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/script/__RK_PROJECT__.js +0 -0
  158. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/script/tests/version.test.js +0 -0
  159. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/ts/package.json +0 -0
  160. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/ts/tsconfig.json +0 -0
  161. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/.github/workflows/ci-python.yml +0 -0
  162. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/.repokit-common.toml +0 -0
  163. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/.vscode/launch.json +0 -0
  164. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/VERSION +0 -0
  165. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/plugin/hooks/hooks.json +0 -0
  166. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/plugin/hooks/scripts/run-hook.mjs +0 -0
  167. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/plugin/hooks/scripts/session_start.py +0 -0
  168. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/plugin/tests/test_manifest.py +0 -0
  169. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/.github/workflows/release.yml +0 -0
  170. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/.vscode/launch.json +0 -0
  171. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/__init__.py +0 -0
  172. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/__main__.py +0 -0
  173. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/_version.py +0 -0
  174. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/cli.py +0 -0
  175. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/pyproject.toml +0 -0
  176. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/tests/conftest.py +0 -0
  177. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/tests/test_version.py +0 -0
  178. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/.github/workflows/ci-python.yml +0 -0
  179. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/.repokit-common.toml +0 -0
  180. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/.vscode/launch.json +0 -0
  181. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/VERSION +0 -0
  182. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/__RK_PROJECT__.py +0 -0
  183. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/tests/test_version.py +0 -0
  184. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/setuppy/requirements.txt +0 -0
  185. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/setuppy/setup.py +0 -0
  186. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/.gitignore.rkappend +0 -0
  187. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/.repokit-common.toml +0 -0
  188. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/include/__RK_SNAKE__/version.h +0 -0
  189. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/src/app.rc +0 -0
  190. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.editorconfig +0 -0
  191. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.github/workflows/ci-js-ts.yml +0 -0
  192. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.gitignore.rkappend +0 -0
  193. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.vscode/launch.json +0 -0
  194. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/VERSION +0 -0
  195. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/python/.github/workflows/ci-python.yml +0 -0
  196. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/python/.gitignore.rkappend +0 -0
  197. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/layers/languages/python/.vscode/launch.json +0 -0
  198. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/vault/CLAUDE.md +0 -0
  199. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/vault/claude/_maps/MOC-project.md +0 -0
  200. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/vault/claude/_oracle/backlinks.md +0 -0
  201. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/vault/claude/_oracle/concepts.md +0 -0
  202. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/vault/claude/_oracle/manifest.md +0 -0
  203. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/vault/claude/_todo/ACTIVE-WORK.md +0 -0
  204. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/templates/vault/claude/_todo/OPEN-LOOPS.md +0 -0
  205. {git_repokit-0.9.12 → git_repokit-0.10.3}/repokit/utils.py +0 -0
  206. {git_repokit-0.9.12 → git_repokit-0.10.3}/setup.cfg +0 -0
  207. {git_repokit-0.9.12 → git_repokit-0.10.3}/setup.py +0 -0
  208. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_badges.py +0 -0
  209. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_branch_strategies.py +0 -0
  210. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_cli_examples.py +0 -0
  211. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_cli_integration.py +0 -0
  212. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_core_functionality.py +0 -0
  213. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_deployment_scenarios.py +0 -0
  214. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_docs_links.py +0 -0
  215. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_extras_cli.py +0 -0
  216. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_github_create.py +0 -0
  217. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_github_integration.py +0 -0
  218. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_github_owner.py +0 -0
  219. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_github_setup.py +0 -0
  220. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_guardrails.py +0 -0
  221. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_hermetic.py +0 -0
  222. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_hook_encoding.py +0 -0
  223. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_hook_patterns.py +0 -0
  224. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_layer_action_pins.py +0 -0
  225. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_layers.py +0 -0
  226. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_layers_c_cpp.py +0 -0
  227. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_legacy_smoke.py +0 -0
  228. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_license_adopt.py +0 -0
  229. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_license_cli.py +0 -0
  230. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_licenses.py +0 -0
  231. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_private_branch_create.py +0 -0
  232. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_readme_blocks.py +0 -0
  233. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_run_tests_driver.py +0 -0
  234. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_template_parity.py +0 -0
  235. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_utils.py +0 -0
  236. {git_repokit-0.9.12 → git_repokit-0.10.3}/tests/test_vendored_ailib.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: git-repokit
3
- Version: 0.9.12
3
+ Version: 0.10.3
4
4
  Summary: Create standardized Git repositories: language presets, licenses, GitHub setup, and a private notes vault
5
5
  Author: Dustin Darcy
6
6
  License-Expression: MIT
@@ -24,6 +24,8 @@ Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
25
  Requires-Dist: requests>=2.25.0
26
26
  Requires-Dist: tomli>=1.1; python_version < "3.11"
27
+ Requires-Dist: dazzle-lib>=0.8.2
28
+ Requires-Dist: dazzle-loglib>=0.3.3
27
29
  Provides-Extra: test
28
30
  Requires-Dist: pytest>=7.0.0; extra == "test"
29
31
  Requires-Dist: python-dotenv>=1.0.0; extra == "test"
@@ -58,10 +60,10 @@ Dynamic: license-file
58
60
  A full create (the [Quick Start](#-quick-start) below) produces:
59
61
 
60
62
  - **The structure:** README, CONTRIBUTING, CHANGELOG, LICENSE, `.gitignore`, `.gitattributes`, `docs/`, `tests/`, `scripts/`, and, if you ask for them, ROADMAP, a funding file, Dependabot, a stale-issue policy and PR and release templates.
61
- - **The code for its language:** a Python package with `pyproject.toml` and a CLI, a CMake or Visual Studio C/C++ project, a TypeScript npm package, a Claude Code plugin, and more. Each comes with tests, a CI workflow and a VS Code debug configuration that work from the first commit. See [Languages and layers](docs/Languages-and-Layers.md).
63
+ - **The code for its language:** a Python package with `pyproject.toml` and a CLI, a CMake or Visual Studio C/C++ project, a TypeScript npm package, a Claude Code plugin, a Paradox game mod (Crusader Kings III and others), and more. Each comes with tests, a CI workflow and a VS Code debug configuration where it has something to run, from the first commit. The project's settings name its languages, so the hooks run the right checks. See [Languages and layers](docs/Languages-and-Layers.md).
62
64
  - **A README that names the project:** the real GitHub owner, badges for the release, the Python or Node minimum and the license, install and test commands for the preset, and a License section at the end.
63
65
  - **The tooling:** [git-repokit-common](https://github.com/DazzleTools/git-repokit-common) vendored at `scripts/repokit-common/`, with git hooks that keep version numbers in step, keep private files out of public commits, and run the tests before a push.
64
- - **A private vault:** `private/` is its own git repository, ignored by the project, for notes, design documents and postmortems. It starts with a map, an index for an oracle session and a to-do board. See [The vault](docs/The-Vault.md).
66
+ - **A private vault:** `private/` is its own git repository, ignored by the project, for notes, design documents, postmortems, conversations (`convos/`) and old revisions (`revisions/`); run logs go to `private/logs/`, kept on disk and never versioned. It starts with a map, an index for an oracle session and a to-do board. See [The vault](docs/The-Vault.md).
65
67
  - **The repository on GitHub** (with `--github`): created with your `gh` login and pushed. It gets the standard labels, Roadmap and Quick Notes as issues #1 and #2 (pinned), discussions and topics. See [GitHub setup](docs/GitHub-Setup.md).
66
68
 
67
69
  ## 📦 Installation
@@ -173,6 +175,9 @@ repokit create my-app --with c-cpp/msbuild --license gpl-3.0-or-later
173
175
  # A TypeScript npm package
174
176
  repokit create my-lib --language js-ts --license mpl-2.0
175
177
 
178
+ # A Crusader Kings III mod: the mod in mod/, the repository's own files above it
179
+ repokit create my-mod --language paradox --license mit
180
+
176
181
  # A one-file Python script, no packaging, given away to the public domain
177
182
  repokit create my-script --with python/script --license unlicense
178
183
 
@@ -216,6 +221,16 @@ repokit has two ways to keep private work private:
216
221
  - **`main-only` (the default):** the project folder is the repository, on `main`, and `private/` is its own nested git repository that the project ignores. One branch, no merging rules to learn.
217
222
  - **The private-branch model:** your working history lives on a local-only `private` branch in `<name>/local/`, and the public branches are git worktrees in sibling folders. You move finished work across with `repokit safe-merge`, which leaves the private content behind. This is the model repokit was first built for, and it suits projects with several release stages or several people.
218
223
 
224
+ What the private branch carries is the **private mode** (`--private-mode`):
225
+
226
+ | Mode | `private/` | Tracked on the private branch | Default for |
227
+ |---|---|---|---|
228
+ | `nested` | its own repository | nothing private | `main-only` |
229
+ | `nested-branch` | its own repository, linked into every worktree | `convos/`, `revisions/`, `logs/` (run logs ignored) | a `create` with a private-branch strategy |
230
+ | `branch` | on the private branch | `private/` too | `adopt`; otherwise opt-in, warned |
231
+
232
+ The promoted folders never reach a public branch or a remote. The hooks refuse them on public branches, `safe-merge` leaves them out, and git-repokit-common's pre-push refuses a push that would add them. See [The vault](docs/The-Vault.md).
233
+
219
234
  | `--branch-strategy` | Public branches | Checked out in folders | Flow |
220
235
  |---|---|---|---|
221
236
  | `main-only` | main | the project folder itself | commit on main |
@@ -17,10 +17,10 @@
17
17
  A full create (the [Quick Start](#-quick-start) below) produces:
18
18
 
19
19
  - **The structure:** README, CONTRIBUTING, CHANGELOG, LICENSE, `.gitignore`, `.gitattributes`, `docs/`, `tests/`, `scripts/`, and, if you ask for them, ROADMAP, a funding file, Dependabot, a stale-issue policy and PR and release templates.
20
- - **The code for its language:** a Python package with `pyproject.toml` and a CLI, a CMake or Visual Studio C/C++ project, a TypeScript npm package, a Claude Code plugin, and more. Each comes with tests, a CI workflow and a VS Code debug configuration that work from the first commit. See [Languages and layers](docs/Languages-and-Layers.md).
20
+ - **The code for its language:** a Python package with `pyproject.toml` and a CLI, a CMake or Visual Studio C/C++ project, a TypeScript npm package, a Claude Code plugin, a Paradox game mod (Crusader Kings III and others), and more. Each comes with tests, a CI workflow and a VS Code debug configuration where it has something to run, from the first commit. The project's settings name its languages, so the hooks run the right checks. See [Languages and layers](docs/Languages-and-Layers.md).
21
21
  - **A README that names the project:** the real GitHub owner, badges for the release, the Python or Node minimum and the license, install and test commands for the preset, and a License section at the end.
22
22
  - **The tooling:** [git-repokit-common](https://github.com/DazzleTools/git-repokit-common) vendored at `scripts/repokit-common/`, with git hooks that keep version numbers in step, keep private files out of public commits, and run the tests before a push.
23
- - **A private vault:** `private/` is its own git repository, ignored by the project, for notes, design documents and postmortems. It starts with a map, an index for an oracle session and a to-do board. See [The vault](docs/The-Vault.md).
23
+ - **A private vault:** `private/` is its own git repository, ignored by the project, for notes, design documents, postmortems, conversations (`convos/`) and old revisions (`revisions/`); run logs go to `private/logs/`, kept on disk and never versioned. It starts with a map, an index for an oracle session and a to-do board. See [The vault](docs/The-Vault.md).
24
24
  - **The repository on GitHub** (with `--github`): created with your `gh` login and pushed. It gets the standard labels, Roadmap and Quick Notes as issues #1 and #2 (pinned), discussions and topics. See [GitHub setup](docs/GitHub-Setup.md).
25
25
 
26
26
  ## 📦 Installation
@@ -132,6 +132,9 @@ repokit create my-app --with c-cpp/msbuild --license gpl-3.0-or-later
132
132
  # A TypeScript npm package
133
133
  repokit create my-lib --language js-ts --license mpl-2.0
134
134
 
135
+ # A Crusader Kings III mod: the mod in mod/, the repository's own files above it
136
+ repokit create my-mod --language paradox --license mit
137
+
135
138
  # A one-file Python script, no packaging, given away to the public domain
136
139
  repokit create my-script --with python/script --license unlicense
137
140
 
@@ -175,6 +178,16 @@ repokit has two ways to keep private work private:
175
178
  - **`main-only` (the default):** the project folder is the repository, on `main`, and `private/` is its own nested git repository that the project ignores. One branch, no merging rules to learn.
176
179
  - **The private-branch model:** your working history lives on a local-only `private` branch in `<name>/local/`, and the public branches are git worktrees in sibling folders. You move finished work across with `repokit safe-merge`, which leaves the private content behind. This is the model repokit was first built for, and it suits projects with several release stages or several people.
177
180
 
181
+ What the private branch carries is the **private mode** (`--private-mode`):
182
+
183
+ | Mode | `private/` | Tracked on the private branch | Default for |
184
+ |---|---|---|---|
185
+ | `nested` | its own repository | nothing private | `main-only` |
186
+ | `nested-branch` | its own repository, linked into every worktree | `convos/`, `revisions/`, `logs/` (run logs ignored) | a `create` with a private-branch strategy |
187
+ | `branch` | on the private branch | `private/` too | `adopt`; otherwise opt-in, warned |
188
+
189
+ The promoted folders never reach a public branch or a remote. The hooks refuse them on public branches, `safe-merge` leaves them out, and git-repokit-common's pre-push refuses a push that would add them. See [The vault](docs/The-Vault.md).
190
+
178
191
  | `--branch-strategy` | Public branches | Checked out in folders | Flow |
179
192
  |---|---|---|---|
180
193
  | `main-only` | main | the project folder itself | commit on main |
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: git-repokit
3
- Version: 0.9.12
3
+ Version: 0.10.3
4
4
  Summary: Create standardized Git repositories: language presets, licenses, GitHub setup, and a private notes vault
5
5
  Author: Dustin Darcy
6
6
  License-Expression: MIT
@@ -24,6 +24,8 @@ Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
25
  Requires-Dist: requests>=2.25.0
26
26
  Requires-Dist: tomli>=1.1; python_version < "3.11"
27
+ Requires-Dist: dazzle-lib>=0.8.2
28
+ Requires-Dist: dazzle-loglib>=0.3.3
27
29
  Provides-Extra: test
28
30
  Requires-Dist: pytest>=7.0.0; extra == "test"
29
31
  Requires-Dist: python-dotenv>=1.0.0; extra == "test"
@@ -58,10 +60,10 @@ Dynamic: license-file
58
60
  A full create (the [Quick Start](#-quick-start) below) produces:
59
61
 
60
62
  - **The structure:** README, CONTRIBUTING, CHANGELOG, LICENSE, `.gitignore`, `.gitattributes`, `docs/`, `tests/`, `scripts/`, and, if you ask for them, ROADMAP, a funding file, Dependabot, a stale-issue policy and PR and release templates.
61
- - **The code for its language:** a Python package with `pyproject.toml` and a CLI, a CMake or Visual Studio C/C++ project, a TypeScript npm package, a Claude Code plugin, and more. Each comes with tests, a CI workflow and a VS Code debug configuration that work from the first commit. See [Languages and layers](docs/Languages-and-Layers.md).
63
+ - **The code for its language:** a Python package with `pyproject.toml` and a CLI, a CMake or Visual Studio C/C++ project, a TypeScript npm package, a Claude Code plugin, a Paradox game mod (Crusader Kings III and others), and more. Each comes with tests, a CI workflow and a VS Code debug configuration where it has something to run, from the first commit. The project's settings name its languages, so the hooks run the right checks. See [Languages and layers](docs/Languages-and-Layers.md).
62
64
  - **A README that names the project:** the real GitHub owner, badges for the release, the Python or Node minimum and the license, install and test commands for the preset, and a License section at the end.
63
65
  - **The tooling:** [git-repokit-common](https://github.com/DazzleTools/git-repokit-common) vendored at `scripts/repokit-common/`, with git hooks that keep version numbers in step, keep private files out of public commits, and run the tests before a push.
64
- - **A private vault:** `private/` is its own git repository, ignored by the project, for notes, design documents and postmortems. It starts with a map, an index for an oracle session and a to-do board. See [The vault](docs/The-Vault.md).
66
+ - **A private vault:** `private/` is its own git repository, ignored by the project, for notes, design documents, postmortems, conversations (`convos/`) and old revisions (`revisions/`); run logs go to `private/logs/`, kept on disk and never versioned. It starts with a map, an index for an oracle session and a to-do board. See [The vault](docs/The-Vault.md).
65
67
  - **The repository on GitHub** (with `--github`): created with your `gh` login and pushed. It gets the standard labels, Roadmap and Quick Notes as issues #1 and #2 (pinned), discussions and topics. See [GitHub setup](docs/GitHub-Setup.md).
66
68
 
67
69
  ## 📦 Installation
@@ -173,6 +175,9 @@ repokit create my-app --with c-cpp/msbuild --license gpl-3.0-or-later
173
175
  # A TypeScript npm package
174
176
  repokit create my-lib --language js-ts --license mpl-2.0
175
177
 
178
+ # A Crusader Kings III mod: the mod in mod/, the repository's own files above it
179
+ repokit create my-mod --language paradox --license mit
180
+
176
181
  # A one-file Python script, no packaging, given away to the public domain
177
182
  repokit create my-script --with python/script --license unlicense
178
183
 
@@ -216,6 +221,16 @@ repokit has two ways to keep private work private:
216
221
  - **`main-only` (the default):** the project folder is the repository, on `main`, and `private/` is its own nested git repository that the project ignores. One branch, no merging rules to learn.
217
222
  - **The private-branch model:** your working history lives on a local-only `private` branch in `<name>/local/`, and the public branches are git worktrees in sibling folders. You move finished work across with `repokit safe-merge`, which leaves the private content behind. This is the model repokit was first built for, and it suits projects with several release stages or several people.
218
223
 
224
+ What the private branch carries is the **private mode** (`--private-mode`):
225
+
226
+ | Mode | `private/` | Tracked on the private branch | Default for |
227
+ |---|---|---|---|
228
+ | `nested` | its own repository | nothing private | `main-only` |
229
+ | `nested-branch` | its own repository, linked into every worktree | `convos/`, `revisions/`, `logs/` (run logs ignored) | a `create` with a private-branch strategy |
230
+ | `branch` | on the private branch | `private/` too | `adopt`; otherwise opt-in, warned |
231
+
232
+ The promoted folders never reach a public branch or a remote. The hooks refuse them on public branches, `safe-merge` leaves them out, and git-repokit-common's pre-push refuses a push that would add them. See [The vault](docs/The-Vault.md).
233
+
219
234
  | `--branch-strategy` | Public branches | Checked out in folders | Flow |
220
235
  |---|---|---|---|
221
236
  | `main-only` | main | the project folder itself | commit on main |
@@ -133,6 +133,12 @@ repokit/templates/layers/archetypes/js-ts/script/.vscode/launch.json
133
133
  repokit/templates/layers/archetypes/js-ts/script/tests/version.test.js
134
134
  repokit/templates/layers/archetypes/js-ts/ts/package.json
135
135
  repokit/templates/layers/archetypes/js-ts/ts/tsconfig.json
136
+ repokit/templates/layers/archetypes/paradox/ck3/.repokit-common.toml
137
+ repokit/templates/layers/archetypes/paradox/ck3/mod/descriptor.mod
138
+ repokit/templates/layers/archetypes/paradox/clausewitz/mod/localisation/english/__RK_SNAKE___l_english.yml
139
+ repokit/templates/layers/archetypes/paradox/descriptor-mod/mod/descriptor.mod
140
+ repokit/templates/layers/archetypes/paradox/descriptor-mod/mod/thumbnail.png
141
+ repokit/templates/layers/archetypes/paradox/jomini/mod/localization/english/__RK_SNAKE___l_english.yml
136
142
  repokit/templates/layers/archetypes/python/claude-plugin/.repokit-common.toml
137
143
  repokit/templates/layers/archetypes/python/claude-plugin/VERSION
138
144
  repokit/templates/layers/archetypes/python/claude-plugin/.github/workflows/ci-python.yml
@@ -168,6 +174,10 @@ repokit/templates/layers/languages/js-ts/.repokit-common.toml
168
174
  repokit/templates/layers/languages/js-ts/VERSION
169
175
  repokit/templates/layers/languages/js-ts/.github/workflows/ci-js-ts.yml
170
176
  repokit/templates/layers/languages/js-ts/.vscode/launch.json
177
+ repokit/templates/layers/languages/paradox/.gitattributes.rkappend
178
+ repokit/templates/layers/languages/paradox/.repokit-common.toml
179
+ repokit/templates/layers/languages/paradox/VERSION
180
+ repokit/templates/layers/languages/paradox/docs/modding.md
171
181
  repokit/templates/layers/languages/python/.gitignore.rkappend
172
182
  repokit/templates/layers/languages/python/.github/workflows/ci-python.yml
173
183
  repokit/templates/layers/languages/python/.vscode/launch.json
@@ -182,6 +192,7 @@ tests/test_badges.py
182
192
  tests/test_branch_strategies.py
183
193
  tests/test_cli_examples.py
184
194
  tests/test_cli_integration.py
195
+ tests/test_common_guard.py
185
196
  tests/test_core_functionality.py
186
197
  tests/test_deployment_scenarios.py
187
198
  tests/test_directory_profiles.py
@@ -195,6 +206,7 @@ tests/test_guardrails.py
195
206
  tests/test_hermetic.py
196
207
  tests/test_hook_encoding.py
197
208
  tests/test_hook_patterns.py
209
+ tests/test_languages_setting.py
198
210
  tests/test_layer_action_pins.py
199
211
  tests/test_layers.py
200
212
  tests/test_layers_c_cpp.py
@@ -207,9 +219,12 @@ tests/test_legacy_smoke.py
207
219
  tests/test_license_adopt.py
208
220
  tests/test_license_cli.py
209
221
  tests/test_licenses.py
222
+ tests/test_list_templates.py
210
223
  tests/test_new_default.py
211
224
  tests/test_packaging.py
225
+ tests/test_paradox.py
212
226
  tests/test_private_branch_create.py
227
+ tests/test_private_modes.py
213
228
  tests/test_readme_blocks.py
214
229
  tests/test_run_tests_driver.py
215
230
  tests/test_template_parity.py
@@ -1,4 +1,6 @@
1
1
  requests>=2.25.0
2
+ dazzle-lib>=0.8.2
3
+ dazzle-loglib>=0.3.3
2
4
 
3
5
  [:python_version < "3.11"]
4
6
  tomli>=1.1
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
8
8
  # PyPI's trusted publisher is registered for this name (DazzleTools/git-repokit,
9
9
  # publish.yml, environment pypi); the command stays `repokit`
10
10
  name = "git-repokit"
11
- version = "0.9.12"
11
+ version = "0.10.3"
12
12
  description = "Create standardized Git repositories: language presets, licenses, GitHub setup, and a private notes vault"
13
13
  readme = "README.md"
14
14
  license = "MIT"
@@ -37,6 +37,12 @@ dependencies = [
37
37
  "requests>=2.25.0",
38
38
  # tomllib is 3.11+; the layer engine reads TOML (layers.py falls back to tomli)
39
39
  "tomli>=1.1; python_version < '3.11'",
40
+ # the DazzleLib stack: dazzle_lib.continuum names how exposed private work
41
+ # is (defaults.EXPOSURE_CONTINUUM); pure Python, no dependencies of its own
42
+ "dazzle-lib>=0.8.2",
43
+ # logging with channels, for the verbosity work ahead; explicit now
44
+ # (djdarcy, 2026-11-06: "there's no reason not to")
45
+ "dazzle-loglib>=0.3.3",
40
46
  ]
41
47
 
42
48
  [project.urls]
@@ -0,0 +1,9 @@
1
+ """Version information for RepoKit.
2
+
3
+ Set by hand beside pyproject.toml's version (repokit-common's version sync is
4
+ off for this project); tests/test_packaging.py fails when the two differ, as
5
+ they did at 0.10.0 and 0.10.1, whose `repokit --version` printed 0.9.12.
6
+ """
7
+
8
+ __version__ = "0.10.3"
9
+ __version_info__ = tuple(int(part) for part in __version__.split("."))
@@ -22,6 +22,33 @@ _REPOKIT_EXCLUDE_LINES = {
22
22
  }
23
23
 
24
24
 
25
+ def promoted_folders(repo_path: str) -> List[str]:
26
+ """The folders this project tracks on its private branch (0.10.3), from
27
+ its record: .repokit.json's private_mode and private_exposure. Empty for
28
+ a nested project or one with no record."""
29
+ import json
30
+ from .defaults import BRANCH_MODES
31
+ try:
32
+ with open(os.path.join(repo_path, ".repokit.json"), encoding="utf-8") as f:
33
+ record = json.load(f)
34
+ except (OSError, ValueError):
35
+ return []
36
+ mode = record.get("private_mode")
37
+ if mode not in BRANCH_MODES:
38
+ return []
39
+ folders = [k.strip("/") for k in record.get("private_exposure", {}) if k != "private/"]
40
+ return folders + (["private"] if mode == "branch" else [])
41
+
42
+
43
+ def _without_promoted(excludes: List[str], promoted: List[str]) -> List[str]:
44
+ """.git/info/exclude is one file for every checkout of the repository --
45
+ a minimal project's branch switches and every worktree -- so an exclude
46
+ written for a public branch also hides the folder on the private branch,
47
+ where a plain `git add` must take it. The public branches keep their own
48
+ protection: their .gitignore and the hooks."""
49
+ return [p for p in excludes if p.split("/", 1)[0] not in promoted]
50
+
51
+
25
52
  def _write_excludes(exclude_file: str, excludes: List[str]) -> None:
26
53
  """Write RepoKit's branch excludes, keeping every line that is not RepoKit's.
27
54
 
@@ -94,7 +121,17 @@ class BranchContext:
94
121
  'test-runs/',
95
122
  'test_runs/',
96
123
  }))
97
-
124
+
125
+ # The project's own private paths: the private-patterns its
126
+ # git-repokit-common settings name (written from --private-dirs at
127
+ # create, 0.10.2). safe-merge leaves them out of a merge into a public
128
+ # branch too, so a clone without hooks is not left with the hook as
129
+ # the only guard -- and the hook and safe-merge read one list.
130
+ from .common_kit import read_settings
131
+ project_patterns = read_settings(self.repo_path).get("private-patterns", [])
132
+ if isinstance(project_patterns, list):
133
+ self.EXCLUDE_FROM_PUBLIC.update(p for p in project_patterns if isinstance(p, str) and p)
134
+
98
135
  @property
99
136
  def current_branch(self) -> str:
100
137
  """Get current branch name."""
@@ -315,7 +352,8 @@ class BranchContext:
315
352
  "test-runs/",
316
353
  "test_runs/",
317
354
  ]
318
-
355
+ excludes = _without_promoted(excludes, promoted_folders(self.repo_path))
356
+
319
357
  _write_excludes(exclude_file, excludes)
320
358
 
321
359
  print(f"✓ Set up branch excludes for public branch '{self.current_branch}'")
@@ -14,7 +14,7 @@ import subprocess
14
14
  from typing import Dict, Any, Optional
15
15
 
16
16
  from .config import ConfigManager
17
- from .defaults import BRANCH_STRATEGIES, DEFAULT_ADOPT_STRATEGY, PRIVATE_BRANCH_STRATEGIES
17
+ from .defaults import BRANCH_STRATEGIES, DEFAULT_ADOPT_STRATEGY, PRIVATE_BRANCH_STRATEGIES, PRIVATE_MODES
18
18
  from .repo_manager import RepoManager
19
19
  from .template_engine import TemplateEngine
20
20
  from .directory_analyzer import (
@@ -320,22 +320,24 @@ Recipe: Microservice
320
320
 
321
321
  branch_group.add_argument(
322
322
  "--private-mode",
323
- choices=["nested", "branch"],
323
+ choices=list(PRIVATE_MODES),
324
324
  help="How private work is kept: 'nested' makes private/ its own git repository "
325
- "(linked into every worktree); 'branch' keeps it on the private branch only. "
326
- "Default: nested for main-only, branch for the private-branch strategies"
325
+ "(linked into every worktree); 'nested-branch' keeps that, and tracks "
326
+ "convos/, revisions/ and logs/ on the private branch; 'branch' tracks "
327
+ "private/ itself on the private branch too (opt-in). Default: nested for "
328
+ "main-only, nested-branch for the private-branch strategies (branch for adopt)"
327
329
  )
328
330
 
329
331
  common_group = branch_group.add_mutually_exclusive_group()
330
332
  common_group.add_argument(
331
333
  "--with-common", dest="with_common", action="store_true", default=None,
332
334
  help="Vendor git-repokit-common (hooks, version sync, tools) at scripts/repokit-common/ "
333
- "and install its hooks (default for main-only)"
335
+ "and install its hooks (the default, for every branch strategy)"
334
336
  )
335
337
  common_group.add_argument(
336
338
  "--no-common", dest="with_common", action="store_false",
337
- help="Do not vendor git-repokit-common; git-repokit's own pre-commit guard is installed instead "
338
- "(default for the private-branch strategies)"
339
+ help="Do not vendor git-repokit-common (warns); git-repokit's own basic pre-commit guard "
340
+ "is installed instead"
339
341
  )
340
342
 
341
343
  branch_group.add_argument(
@@ -1870,6 +1872,7 @@ def main() -> int:
1870
1872
  if not args.language:
1871
1873
  # the license catalogue, which create's --license help points to (0.9.11)
1872
1874
  from . import licenses as _licenses
1875
+ print()
1873
1876
  print("licenses (--license; or file=PATH, or none):")
1874
1877
  ids = list(_licenses.known())
1875
1878
  for i in range(0, len(ids), 8):
@@ -1877,8 +1880,10 @@ def main() -> int:
1877
1880
  return 0
1878
1881
 
1879
1882
  elif args.command == "list-templates":
1883
+ # list-templates has no --templates-dir of its own; reading
1884
+ # args.templates_dir crashed every run (since 2025, fixed in 0.10.2)
1880
1885
  template_engine = TemplateEngine(
1881
- templates_dir=args.templates_dir, verbose=args.verbose
1886
+ templates_dir=getattr(args, "templates_dir", None), verbose=args.verbose
1882
1887
  )
1883
1888
  templates = template_engine.list_templates()
1884
1889
  print("Available templates:")
@@ -2853,6 +2858,14 @@ def main() -> int:
2853
2858
  logger.error(str(e))
2854
2859
  return 1
2855
2860
 
2861
+ # A private mode the strategy cannot carry (a branch mode with no
2862
+ # private branch) is refused before anything is written (0.10.3)
2863
+ from .repo_manager import private_mode_for
2864
+ _mode, problem = private_mode_for(config)
2865
+ if problem:
2866
+ logger.error(problem)
2867
+ return 1
2868
+
2856
2869
  # The GitHub login, before any file is written: the files' URLs,
2857
2870
  # CODEOWNERS and FUNDING name it (0.9.6; before, they carried the
2858
2871
  # YOUR_GITHUB_USERNAME placeholder even with --github)
@@ -107,23 +107,91 @@ def install_hooks(repo_root: str) -> Optional[str]:
107
107
  return None
108
108
 
109
109
 
110
- def private_branch_settings(private_branch: Optional[str], private_paths: List[str]) -> Dict[str, List[str]]:
111
- """Settings that make repokit-common's pre-commit guard the private-branch model.
112
-
113
- private-patterns: the paths git-repokit's own guard protected (literal
114
- prefixes; repokit-common adds them to its built-in list).
115
- private-branches: only when the private branch is not one of
116
- repokit-common's defaults; the setting replaces the list, so the defaults
117
- are listed too.
110
+ # Strategies whose feature branches are public: they are pushed for pull
111
+ # requests, so private content may not be committed on them (0.10.2).
112
+ PUBLIC_FEATURE_STRATEGIES = {"github-flow", "gitflow"}
113
+ PUBLIC_FEATURE_PATTERNS = {"feature/*", "feat/*"}
114
+
115
+
116
+ def private_branches(strategy: Optional[str], private_branch: Optional[str]) -> List[str]:
117
+ """The branches where private content may be committed, for a strategy.
118
+
119
+ repokit-common's defaults, minus the feature-branch patterns for the
120
+ strategies that push feature branches, plus the project's own private
121
+ branch when it has a name of its own. Both hooks use this one rule.
122
+ """
123
+ branches = [b for b in REPOKIT_COMMON_PRIVATE_BRANCHES
124
+ if not (strategy in PUBLIC_FEATURE_STRATEGIES and b in PUBLIC_FEATURE_PATTERNS)]
125
+ if private_branch and private_branch not in branches:
126
+ branches.append(private_branch)
127
+ return branches
128
+
129
+
130
+ def read_settings(repo_root: str) -> Dict:
131
+ """The project's [tool.repokit-common] table: pyproject.toml's, else
132
+ .repokit-common.toml's, the order repokit-common reads them in; {} when
133
+ neither file has the table or a file cannot be parsed."""
134
+ try:
135
+ import tomllib
136
+ except ModuleNotFoundError: # Python 3.10
137
+ import tomli as tomllib
138
+ for name in ("pyproject.toml", ".repokit-common.toml"):
139
+ path = os.path.join(repo_root, name)
140
+ if not os.path.isfile(path):
141
+ continue
142
+ try:
143
+ with open(path, "rb") as f:
144
+ data = tomllib.load(f)
145
+ except (OSError, ValueError):
146
+ continue
147
+ table = data.get("tool", {}).get("repokit-common")
148
+ if isinstance(table, dict):
149
+ return table
150
+ return {}
151
+
152
+
153
+ def private_branch_settings(private_branch: Optional[str], private_paths: List[str],
154
+ strategy: Optional[str] = None) -> Dict[str, List[str]]:
155
+ """Settings that make repokit-common's pre-commit guard this project.
156
+
157
+ Written for every project, single-branch ones included (0.10.2), so a
158
+ project that later gains a private branch is already guarded.
159
+ private-patterns: the paths kept off public branches (literal prefixes;
160
+ repokit-common adds them to its built-in list).
161
+ private-branches: where they may be committed, from the strategy
162
+ (private_branches); the setting replaces repokit-common's own list.
118
163
  """
119
164
  settings: Dict[str, List[str]] = {}
120
165
  if private_paths:
121
166
  settings["private-patterns"] = sorted(dict.fromkeys(private_paths))
122
- if private_branch and private_branch not in REPOKIT_COMMON_PRIVATE_BRANCHES:
123
- settings["private-branches"] = REPOKIT_COMMON_PRIVATE_BRANCHES + [private_branch]
167
+ settings["private-branches"] = private_branches(strategy, private_branch)
124
168
  return settings
125
169
 
126
170
 
171
+ def languages_setting(languages: List[str], layer_folders: List[str]) -> List[str]:
172
+ """The `languages` value a create writes for git-repokit-common's hooks.
173
+
174
+ repokit's language names mapped to repokit-common's, in the composed
175
+ order (the first is primary): js-ts is "typescript" when the ts layer is
176
+ part of the composition, else "javascript"; python, c-cpp and paradox
177
+ are the same names; generic and the `any` pseudo-language add nothing.
178
+ Writing it, rather than leaving the hooks to detect it from the root,
179
+ keeps a project whose markers sit in a subfolder (a plugin in plugin/)
180
+ from reading as Python (design 2026-10-30__08-28-15, Addendum 2).
181
+ """
182
+ out: List[str] = []
183
+ for lang in languages:
184
+ if lang == "js-ts":
185
+ name = "typescript" if any(f.endswith("js-ts/ts") for f in layer_folders) else "javascript"
186
+ elif lang in ("python", "c-cpp", "paradox"):
187
+ name = lang
188
+ else:
189
+ continue
190
+ if name not in out:
191
+ out.append(name)
192
+ return out
193
+
194
+
127
195
  def _toml_list(values: List[str]) -> str:
128
196
  return "[" + ", ".join('"' + v.replace("\\", "\\\\").replace('"', '\\"') + '"' for v in values) + "]"
129
197
 
@@ -16,6 +16,7 @@ from typing import Dict, Any, Optional, List, Union
16
16
  from .directory_profiles import DirectoryProfileManager
17
17
  from .defaults import (
18
18
  DEFAULT_PRIVATE_DIRS,
19
+ DEFAULT_PRIVATE_DIR_SETS,
19
20
  DEFAULT_SENSITIVE_FILES,
20
21
  DEFAULT_SENSITIVE_PATTERNS,
21
22
  BRANCH_SPECIFIC_EXCLUDES,
@@ -59,12 +60,11 @@ class ConfigManager:
59
60
  # replaces them with the chosen strategy's values
60
61
  "branches": list(BRANCH_STRATEGIES[DEFAULT_BRANCH_STRATEGY]["branches"]),
61
62
  "worktrees": list(BRANCH_STRATEGIES[DEFAULT_BRANCH_STRATEGY]["worktrees"]),
63
+ # convos/, revisions/ and logs/ live in private/ since 0.10.0
64
+ # (vault.PRIVATE_STRUCTURE), not at the project root
62
65
  "directories": [
63
- "convos",
64
66
  "docs",
65
- "logs",
66
67
  "private",
67
- "revisions",
68
68
  "scripts",
69
69
  "tests",
70
70
  ],
@@ -680,7 +680,15 @@ class ConfigManager:
680
680
 
681
681
  if self.verbose >= 1:
682
682
  self.logger.info(f"Resolved directory profile '{profile}' to {len(directories)} directories")
683
-
683
+
684
+ elif private_set != "standard":
685
+ # --private-set without a profile or groups was read nowhere until
686
+ # 0.10.2: its folders join the protection list (added to, never
687
+ # replacing, any --private-dirs).
688
+ current = list(self.config.get("private_dirs") or DEFAULT_PRIVATE_DIRS)
689
+ extra = DEFAULT_PRIVATE_DIR_SETS.get(private_set, [])
690
+ self.config["private_dirs"] = current + [d for d in extra if d not in current]
691
+
684
692
  # Ensure private_dirs is always set
685
693
  if "private_dirs" not in self.config:
686
694
  self.config["private_dirs"] = DEFAULT_PRIVATE_DIRS.copy()
@@ -6,7 +6,57 @@ This module provides centralized default values to prevent duplication
6
6
  and ensure consistency across the codebase.
7
7
  """
8
8
 
9
- from typing import List
9
+ from typing import Dict, List
10
+
11
+ from dazzle_lib.continuum import Continuum
12
+
13
+ # How exposed a thing is: who can read it. Zero is "controlled" -- readable
14
+ # only by people the owner chose -- and the line every private folder must
15
+ # stay below is "shared" (a remote that could be public). Agreed with djdarcy,
16
+ # 2026-11-01 (git-repokit's vault: notes/...__both_the-exposure-continuum.md).
17
+ EXPOSURE_CONTINUUM = Continuum(
18
+ name="exposure",
19
+ ranks={"untracked": -2, "local": -1, "controlled": 0, "shared": 1, "public": 2},
20
+ invariant="who can read it",
21
+ )
22
+
23
+ # How private work is kept (--private-mode):
24
+ # nested private/ is its own git repository (main-only's default)
25
+ # nested-branch private/ is still its own repository, and the record
26
+ # folders (PROMOTED_DIRS) are tracked on the private branch
27
+ # (the private-branch strategies' default for a create)
28
+ # branch private/ itself is tracked on the private branch too
29
+ # (opt-in, warned; adopt's default)
30
+ PRIVATE_MODES = ("nested", "nested-branch", "branch")
31
+ VAULT_MODES = ("nested", "nested-branch") # private/ is its own repository
32
+ BRANCH_MODES = ("nested-branch", "branch") # the private branch tracks the record folders
33
+
34
+ # The record folders a private-branch project tracks at its root, on the
35
+ # private branch only: conversations, revisions ("as easy as MOVING an old
36
+ # file to ./revisions and it's then still git tracked"), and logs, whose run
37
+ # output is ignored (logs/.gitignore) so chosen logs can still be committed.
38
+ PROMOTED_DIRS = ("convos", "revisions", "logs")
39
+
40
+
41
+ def private_dir_names(dirs) -> List[str]:
42
+ """Folder names from --private-dirs entries however they were written:
43
+ "convos/", "/revisions" and "logs" are convos, revisions and logs."""
44
+ return [d.strip("/") for d in dirs if d and d.strip("/")]
45
+
46
+
47
+ def mode_exposure(promoted) -> Dict[str, str]:
48
+ """Where a project's private work sits on EXPOSURE_CONTINUUM, recorded in
49
+ .repokit.json: the vault, and each folder the mode promotes to the private
50
+ branch (RepoManager.promoted). Each level is checked against the
51
+ continuum: an unknown name raises, and none may reach "shared" -- the
52
+ line a private folder must stay below."""
53
+ ranks = {"private/": "local"}
54
+ ranks.update({f"{name}/": "local" for name in promoted if name != "private"})
55
+ for path, level in ranks.items():
56
+ if not EXPOSURE_CONTINUUM.is_colder(level, "shared"):
57
+ raise ValueError(f"{path} would be {level}: private work stays below shared")
58
+ return ranks
59
+
10
60
 
11
61
  # Default private directories that should not appear in public branches
12
62
  DEFAULT_PRIVATE_DIRS = [
@@ -180,15 +230,21 @@ def strategy_push_branches(name: str) -> List[str]:
180
230
  DEFAULT_BRANCH_STRATEGIES = {name: strategy_branch_list(name) for name in BRANCH_STRATEGIES}
181
231
 
182
232
  # Default directory profiles - centralized from directory_profiles.py
233
+ # The text is 0.9.12's again (0.10.3). A profile entry in the private set
234
+ # (logs, private, convos, revisions) goes to private_dirs, the protection
235
+ # list, never to the folders created -- so this text never changed a layout.
236
+ # Where convos/, revisions/ and logs/ are made follows the private mode:
237
+ # inside the vault in nested, promoted to the root on the private branch in
238
+ # nested-branch and branch (PROMOTED_DIRS).
183
239
  DEFAULT_DIRECTORY_PROFILES = {
184
240
  "minimal": ["src", "tests", "docs"],
185
241
  "standard": [
186
- "src", "tests", "docs", "scripts", "config",
242
+ "src", "tests", "docs", "scripts", "config",
187
243
  "logs", "private", "convos", "revisions"
188
244
  ],
189
245
  "complete": [
190
- "src", "tests", "docs", "scripts", "config", "logs",
191
- "private", "convos", "revisions", "data", "examples",
246
+ "src", "tests", "docs", "scripts", "config", "logs",
247
+ "private", "convos", "revisions", "data", "examples",
192
248
  "tools", "resources", "assets"
193
249
  ]
194
250
  }