git-repokit 0.10.1__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.10.1/git_repokit.egg-info → git_repokit-0.10.3}/PKG-INFO +13 -1
  2. {git_repokit-0.10.1 → git_repokit-0.10.3}/README.md +10 -0
  3. {git_repokit-0.10.1 → git_repokit-0.10.3/git_repokit.egg-info}/PKG-INFO +13 -1
  4. {git_repokit-0.10.1 → git_repokit-0.10.3}/git_repokit.egg-info/SOURCES.txt +3 -0
  5. {git_repokit-0.10.1 → git_repokit-0.10.3}/git_repokit.egg-info/requires.txt +2 -0
  6. {git_repokit-0.10.1 → git_repokit-0.10.3}/pyproject.toml +7 -1
  7. git_repokit-0.10.3/repokit/__version__.py +9 -0
  8. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/branch_utils.py +40 -2
  9. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/cli.py +21 -8
  10. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/common_kit.py +54 -10
  11. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/config.py +10 -1
  12. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/defaults.py +61 -7
  13. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/layers.py +2 -0
  14. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/repo_manager.py +226 -57
  15. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/hooks/pre-commit.template +15 -1
  16. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/vault.py +20 -8
  17. git_repokit-0.10.3/tests/test_common_guard.py +443 -0
  18. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_directory_profiles.py +4 -1
  19. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_cli.py +6 -1
  20. git_repokit-0.10.3/tests/test_list_templates.py +21 -0
  21. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_new_default.py +13 -4
  22. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_packaging.py +15 -0
  23. git_repokit-0.10.3/tests/test_private_modes.py +388 -0
  24. git_repokit-0.10.1/repokit/__version__.py +0 -4
  25. {git_repokit-0.10.1 → git_repokit-0.10.3}/LICENSE +0 -0
  26. {git_repokit-0.10.1 → git_repokit-0.10.3}/MANIFEST.in +0 -0
  27. {git_repokit-0.10.1 → git_repokit-0.10.3}/git_repokit.egg-info/dependency_links.txt +0 -0
  28. {git_repokit-0.10.1 → git_repokit-0.10.3}/git_repokit.egg-info/entry_points.txt +0 -0
  29. {git_repokit-0.10.1 → git_repokit-0.10.3}/git_repokit.egg-info/top_level.txt +0 -0
  30. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/__init__.py +0 -0
  31. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/__main__.py +0 -0
  32. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/__init__.py +0 -0
  33. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/__init__.py +0 -0
  34. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/analyzer.py +0 -0
  35. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/backend.py +0 -0
  36. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/cache.py +0 -0
  37. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/parsers.py +0 -0
  38. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/__init__.py +0 -0
  39. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/cli.py +0 -0
  40. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/openai_compat.py +0 -0
  41. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/prompt_file.py +0 -0
  42. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/types.py +0 -0
  43. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/auth_integration.py +0 -0
  44. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/badges.py +0 -0
  45. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/directory_analyzer.py +0 -0
  46. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/directory_profiles.py +0 -0
  47. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/git_config.py +0 -0
  48. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/github_create.py +0 -0
  49. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/github_setup.py +0 -0
  50. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/guardrails.py +0 -0
  51. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/history_cleaner.py +0 -0
  52. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/history_protection.py +0 -0
  53. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/hooks/pre-commit-guardrails +0 -0
  54. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/hooks/pre-commit-template +0 -0
  55. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/0bsd.txt +0 -0
  56. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/LICENSES.md +0 -0
  57. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/__init__.py +0 -0
  58. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/agpl-3.0.txt +0 -0
  59. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/all-rights-reserved.txt +0 -0
  60. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/apache-2.0.txt +0 -0
  61. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/bsd-2-clause.txt +0 -0
  62. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/bsd-3-clause.txt +0 -0
  63. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/bsl-1.0.txt +0 -0
  64. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/cc-by-4.0.txt +0 -0
  65. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/cc-by-sa-4.0.txt +0 -0
  66. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/cc0-1.0.txt +0 -0
  67. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/epl-2.0.txt +0 -0
  68. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/gpl-2.0.txt +0 -0
  69. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/gpl-3.0.txt +0 -0
  70. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/isc.txt +0 -0
  71. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/lgpl-2.1.txt +0 -0
  72. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/lgpl-3.0.txt +0 -0
  73. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/mit.txt +0 -0
  74. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/mpl-2.0.txt +0 -0
  75. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/proprietary-evaluation.txt +0 -0
  76. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/unlicense.txt +0 -0
  77. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/readme_blocks.py +0 -0
  78. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/remote_integration.py +0 -0
  79. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/template_engine.py +0 -0
  80. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/ai/claude/CLAUDE-nested.md.template +0 -0
  81. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/ai/claude/CLAUDE.md.template +0 -0
  82. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/ai/claude/instructions/step1_context_rebuilder.md +0 -0
  83. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/ai/claude/instructions/step2_dev_workflow_process.md +0 -0
  84. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/ai/claude/instructions/step3_context_bridge.md +0 -0
  85. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/common/CHANGELOG.md.template +0 -0
  86. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/common/CONTRIBUTING.md.template +0 -0
  87. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/common/README.md.template +0 -0
  88. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/common/gitattributes.template +0 -0
  89. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/common/gitignore.template +0 -0
  90. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/FUNDING.yml.template +0 -0
  91. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/ROADMAP.md.template +0 -0
  92. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/dependabot.yml.template +0 -0
  93. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/one-offs-README.md.template +0 -0
  94. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/platform-support.md.template +0 -0
  95. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/pull_request_template.md.template +0 -0
  96. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/release-template.md.template +0 -0
  97. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/settings.json.template +0 -0
  98. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/stale.yml.template +0 -0
  99. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/github/CODEOWNERS.template +0 -0
  100. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/github/ISSUE_TEMPLATE/bug-report.md.template +0 -0
  101. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/github/ISSUE_TEMPLATE/feature-request.md.template +0 -0
  102. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/github/issues/notes.md.template +0 -0
  103. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/github/issues/roadmap.md.template +0 -0
  104. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/any/claude-plugin/.claude-plugin/marketplace.json +0 -0
  105. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/any/claude-plugin/plugin/.claude-plugin/plugin.json +0 -0
  106. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/any/claude-plugin/plugin/README.md +0 -0
  107. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.github/workflows/ci-c-cpp.yml +0 -0
  108. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.repokit-common.toml.rkappend +0 -0
  109. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.vscode/launch.json +0 -0
  110. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.vscode/tasks.json +0 -0
  111. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/CMakeLists.txt +0 -0
  112. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/CMakePresets.json +0 -0
  113. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/cmake/GenerateStamp.cmake +0 -0
  114. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/src/main.cpp +0 -0
  115. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/tests/test_version.cpp +0 -0
  116. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/vcpkg.json +0 -0
  117. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/.vscode/launch.json +0 -0
  118. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/Makefile +0 -0
  119. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/build.bat +0 -0
  120. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/src/__RK_SNAKE__.c +0 -0
  121. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/.vscode/launch.json +0 -0
  122. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/.vscode/tasks.json +0 -0
  123. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/__RK_PROJECT__.sln +0 -0
  124. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/__RK_PROJECT__.vcxproj +0 -0
  125. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/src/main.cpp +0 -0
  126. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/.repokit-common.toml +0 -0
  127. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/.vscode/launch.json +0 -0
  128. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/plugin/hooks/hooks.json +0 -0
  129. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/plugin/hooks/scripts/session-start.mjs +0 -0
  130. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/plugin/tests/manifest.test.js +0 -0
  131. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node/.repokit-common.toml.rkappend +0 -0
  132. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node/package.json +0 -0
  133. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/.github/workflows/release.yml +0 -0
  134. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/package.json +0 -0
  135. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/src/index.ts +0 -0
  136. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/tests/index.test.ts +0 -0
  137. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/script/.vscode/launch.json +0 -0
  138. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/script/__RK_PROJECT__.js +0 -0
  139. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/script/tests/version.test.js +0 -0
  140. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/ts/package.json +0 -0
  141. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/ts/tsconfig.json +0 -0
  142. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/paradox/ck3/.repokit-common.toml +0 -0
  143. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/paradox/ck3/mod/descriptor.mod +0 -0
  144. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/paradox/clausewitz/mod/localisation/english/__RK_SNAKE___l_english.yml +0 -0
  145. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/paradox/descriptor-mod/mod/descriptor.mod +0 -0
  146. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/paradox/descriptor-mod/mod/thumbnail.png +0 -0
  147. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/paradox/jomini/mod/localization/english/__RK_SNAKE___l_english.yml +0 -0
  148. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/.github/workflows/ci-python.yml +0 -0
  149. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/.repokit-common.toml +0 -0
  150. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/.vscode/launch.json +0 -0
  151. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/VERSION +0 -0
  152. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/plugin/hooks/hooks.json +0 -0
  153. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/plugin/hooks/scripts/run-hook.mjs +0 -0
  154. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/plugin/hooks/scripts/session_start.py +0 -0
  155. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/plugin/tests/test_manifest.py +0 -0
  156. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/.github/workflows/release.yml +0 -0
  157. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/.vscode/launch.json +0 -0
  158. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/__init__.py +0 -0
  159. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/__main__.py +0 -0
  160. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/_version.py +0 -0
  161. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/cli.py +0 -0
  162. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/pyproject.toml +0 -0
  163. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/tests/conftest.py +0 -0
  164. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/tests/test_version.py +0 -0
  165. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/.github/workflows/ci-python.yml +0 -0
  166. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/.repokit-common.toml +0 -0
  167. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/.vscode/launch.json +0 -0
  168. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/VERSION +0 -0
  169. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/__RK_PROJECT__.py +0 -0
  170. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/tests/test_version.py +0 -0
  171. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/setuppy/requirements.txt +0 -0
  172. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/setuppy/setup.py +0 -0
  173. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/.gitignore.rkappend +0 -0
  174. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/.repokit-common.toml +0 -0
  175. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/include/__RK_SNAKE__/version.h +0 -0
  176. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/src/app.rc +0 -0
  177. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.editorconfig +0 -0
  178. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.github/workflows/ci-js-ts.yml +0 -0
  179. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.gitignore.rkappend +0 -0
  180. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.repokit-common.toml +0 -0
  181. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.vscode/launch.json +0 -0
  182. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/VERSION +0 -0
  183. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/paradox/.gitattributes.rkappend +0 -0
  184. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/paradox/.repokit-common.toml +0 -0
  185. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/paradox/VERSION +0 -0
  186. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/paradox/docs/modding.md +0 -0
  187. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/python/.github/workflows/ci-python.yml +0 -0
  188. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/python/.gitignore.rkappend +0 -0
  189. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/python/.vscode/launch.json +0 -0
  190. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/manifest.toml +0 -0
  191. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/CLAUDE.md +0 -0
  192. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_maps/MOC-project.md +0 -0
  193. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_oracle/backlinks.md +0 -0
  194. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_oracle/concepts.md +0 -0
  195. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_oracle/manifest.md +0 -0
  196. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_todo/ACTIVE-WORK.md +0 -0
  197. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_todo/OPEN-LOOPS.md +0 -0
  198. {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/utils.py +0 -0
  199. {git_repokit-0.10.1 → git_repokit-0.10.3}/setup.cfg +0 -0
  200. {git_repokit-0.10.1 → git_repokit-0.10.3}/setup.py +0 -0
  201. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_badges.py +0 -0
  202. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_branch_strategies.py +0 -0
  203. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_cli_examples.py +0 -0
  204. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_cli_integration.py +0 -0
  205. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_core_functionality.py +0 -0
  206. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_deployment_scenarios.py +0 -0
  207. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_docs_links.py +0 -0
  208. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_extras_cli.py +0 -0
  209. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_github_create.py +0 -0
  210. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_github_integration.py +0 -0
  211. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_github_owner.py +0 -0
  212. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_github_setup.py +0 -0
  213. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_guardrails.py +0 -0
  214. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_hermetic.py +0 -0
  215. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_hook_encoding.py +0 -0
  216. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_hook_patterns.py +0 -0
  217. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_languages_setting.py +0 -0
  218. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layer_action_pins.py +0 -0
  219. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers.py +0 -0
  220. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_c_cpp.py +0 -0
  221. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_claude_plugin.py +0 -0
  222. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_compositions.py +0 -0
  223. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_js_ts.py +0 -0
  224. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_vscode.py +0 -0
  225. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_legacy_smoke.py +0 -0
  226. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_license_adopt.py +0 -0
  227. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_license_cli.py +0 -0
  228. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_licenses.py +0 -0
  229. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_paradox.py +0 -0
  230. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_private_branch_create.py +0 -0
  231. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_readme_blocks.py +0 -0
  232. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_run_tests_driver.py +0 -0
  233. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_template_parity.py +0 -0
  234. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_utils.py +0 -0
  235. {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_vault_bootstrap.py +0 -0
  236. {git_repokit-0.10.1 → 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.10.1
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"
@@ -219,6 +221,16 @@ repokit has two ways to keep private work private:
219
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.
220
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.
221
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
+
222
234
  | `--branch-strategy` | Public branches | Checked out in folders | Flow |
223
235
  |---|---|---|---|
224
236
  | `main-only` | main | the project folder itself | commit on main |
@@ -178,6 +178,16 @@ repokit has two ways to keep private work private:
178
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.
179
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.
180
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
+
181
191
  | `--branch-strategy` | Public branches | Checked out in folders | Flow |
182
192
  |---|---|---|---|
183
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.10.1
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"
@@ -219,6 +221,16 @@ repokit has two ways to keep private work private:
219
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.
220
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.
221
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
+
222
234
  | `--branch-strategy` | Public branches | Checked out in folders | Flow |
223
235
  |---|---|---|---|
224
236
  | `main-only` | main | the project folder itself | commit on main |
@@ -192,6 +192,7 @@ tests/test_badges.py
192
192
  tests/test_branch_strategies.py
193
193
  tests/test_cli_examples.py
194
194
  tests/test_cli_integration.py
195
+ tests/test_common_guard.py
195
196
  tests/test_core_functionality.py
196
197
  tests/test_deployment_scenarios.py
197
198
  tests/test_directory_profiles.py
@@ -218,10 +219,12 @@ tests/test_legacy_smoke.py
218
219
  tests/test_license_adopt.py
219
220
  tests/test_license_cli.py
220
221
  tests/test_licenses.py
222
+ tests/test_list_templates.py
221
223
  tests/test_new_default.py
222
224
  tests/test_packaging.py
223
225
  tests/test_paradox.py
224
226
  tests/test_private_branch_create.py
227
+ tests/test_private_modes.py
225
228
  tests/test_readme_blocks.py
226
229
  tests/test_run_tests_driver.py
227
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.10.1"
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,20 +107,64 @@ 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
 
@@ -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,
@@ -679,7 +680,15 @@ class ConfigManager:
679
680
 
680
681
  if self.verbose >= 1:
681
682
  self.logger.info(f"Resolved directory profile '{profile}' to {len(directories)} directories")
682
-
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
+
683
692
  # Ensure private_dirs is always set
684
693
  if "private_dirs" not in self.config:
685
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,17 +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
183
- # convos/, revisions/ and logs/ are made inside private/ (vault.PRIVATE_STRUCTURE)
184
- # since 0.10.0, never at the project root; DEFAULT_PRIVATE_DIRS still names
185
- # them, so a root folder an older project has stays out of public history.
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).
186
239
  DEFAULT_DIRECTORY_PROFILES = {
187
240
  "minimal": ["src", "tests", "docs"],
188
241
  "standard": [
189
- "src", "tests", "docs", "scripts", "config", "private"
242
+ "src", "tests", "docs", "scripts", "config",
243
+ "logs", "private", "convos", "revisions"
190
244
  ],
191
245
  "complete": [
192
- "src", "tests", "docs", "scripts", "config",
193
- "private", "data", "examples",
246
+ "src", "tests", "docs", "scripts", "config", "logs",
247
+ "private", "convos", "revisions", "data", "examples",
194
248
  "tools", "resources", "assets"
195
249
  ]
196
250
  }
@@ -374,6 +374,8 @@ def catalogue_lines(manifest: Dict[str, Any], language: Optional[str] = None) ->
374
374
  if entry.get("pseudo"):
375
375
  continue
376
376
  head = f"{lang}:" + (f" (planned: {entry.get('description', '')})" if entry.get("stub") else "")
377
+ if lines:
378
+ lines.append("") # a blank line between languages (djdarcy, 2026-11-01)
377
379
  lines.append(head)
378
380
  default = entry.get("default")
379
381
  planned = []