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.
- {git_repokit-0.10.1/git_repokit.egg-info → git_repokit-0.10.3}/PKG-INFO +13 -1
- {git_repokit-0.10.1 → git_repokit-0.10.3}/README.md +10 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3/git_repokit.egg-info}/PKG-INFO +13 -1
- {git_repokit-0.10.1 → git_repokit-0.10.3}/git_repokit.egg-info/SOURCES.txt +3 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/git_repokit.egg-info/requires.txt +2 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/pyproject.toml +7 -1
- git_repokit-0.10.3/repokit/__version__.py +9 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/branch_utils.py +40 -2
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/cli.py +21 -8
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/common_kit.py +54 -10
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/config.py +10 -1
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/defaults.py +61 -7
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/layers.py +2 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/repo_manager.py +226 -57
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/hooks/pre-commit.template +15 -1
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/vault.py +20 -8
- git_repokit-0.10.3/tests/test_common_guard.py +443 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_directory_profiles.py +4 -1
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_cli.py +6 -1
- git_repokit-0.10.3/tests/test_list_templates.py +21 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_new_default.py +13 -4
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_packaging.py +15 -0
- git_repokit-0.10.3/tests/test_private_modes.py +388 -0
- git_repokit-0.10.1/repokit/__version__.py +0 -4
- {git_repokit-0.10.1 → git_repokit-0.10.3}/LICENSE +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/MANIFEST.in +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/git_repokit.egg-info/dependency_links.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/git_repokit.egg-info/entry_points.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/git_repokit.egg-info/top_level.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/__init__.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/__main__.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/__init__.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/__init__.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/analyzer.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/backend.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/cache.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/parsers.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/__init__.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/cli.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/openai_compat.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/transports/prompt_file.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/_vendor/ailib/types.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/auth_integration.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/badges.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/directory_analyzer.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/directory_profiles.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/git_config.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/github_create.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/github_setup.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/guardrails.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/history_cleaner.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/history_protection.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/hooks/pre-commit-guardrails +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/hooks/pre-commit-template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/0bsd.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/LICENSES.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/__init__.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/agpl-3.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/all-rights-reserved.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/apache-2.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/bsd-2-clause.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/bsd-3-clause.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/bsl-1.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/cc-by-4.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/cc-by-sa-4.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/cc0-1.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/epl-2.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/gpl-2.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/gpl-3.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/isc.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/lgpl-2.1.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/lgpl-3.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/mit.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/mpl-2.0.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/proprietary-evaluation.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/licenses/unlicense.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/readme_blocks.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/remote_integration.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/template_engine.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/ai/claude/CLAUDE-nested.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/ai/claude/CLAUDE.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/ai/claude/instructions/step1_context_rebuilder.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/ai/claude/instructions/step2_dev_workflow_process.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/ai/claude/instructions/step3_context_bridge.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/common/CHANGELOG.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/common/CONTRIBUTING.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/common/README.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/common/gitattributes.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/common/gitignore.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/FUNDING.yml.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/ROADMAP.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/dependabot.yml.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/one-offs-README.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/platform-support.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/pull_request_template.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/release-template.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/settings.json.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/extras/stale.yml.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/github/CODEOWNERS.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/github/ISSUE_TEMPLATE/bug-report.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/github/ISSUE_TEMPLATE/feature-request.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/github/issues/notes.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/github/issues/roadmap.md.template +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/any/claude-plugin/.claude-plugin/marketplace.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/any/claude-plugin/plugin/.claude-plugin/plugin.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/any/claude-plugin/plugin/README.md +0 -0
- {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
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.repokit-common.toml.rkappend +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.vscode/launch.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/.vscode/tasks.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/CMakeLists.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/CMakePresets.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/cmake/GenerateStamp.cmake +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/src/main.cpp +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/tests/test_version.cpp +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/cmake-app/vcpkg.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/.vscode/launch.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/Makefile +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/build.bat +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/minimal/src/__RK_SNAKE__.c +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/.vscode/launch.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/.vscode/tasks.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/__RK_PROJECT__.sln +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/__RK_PROJECT__.vcxproj +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/c-cpp/msbuild/src/main.cpp +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/.repokit-common.toml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/.vscode/launch.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/claude-plugin/plugin/hooks/hooks.json +0 -0
- {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
- {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
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node/.repokit-common.toml.rkappend +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node/package.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/.github/workflows/release.yml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/package.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/src/index.ts +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/node-package/tests/index.test.ts +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/script/.vscode/launch.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/script/__RK_PROJECT__.js +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/script/tests/version.test.js +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/ts/package.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/js-ts/ts/tsconfig.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/paradox/ck3/.repokit-common.toml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/paradox/ck3/mod/descriptor.mod +0 -0
- {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
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/paradox/descriptor-mod/mod/descriptor.mod +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/paradox/descriptor-mod/mod/thumbnail.png +0 -0
- {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
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/.github/workflows/ci-python.yml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/.repokit-common.toml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/.vscode/launch.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/VERSION +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/plugin/hooks/hooks.json +0 -0
- {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
- {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
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/claude-plugin/plugin/tests/test_manifest.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/.github/workflows/release.yml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/.vscode/launch.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/__init__.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/__main__.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/_version.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/__RK_SNAKE__/cli.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/pyproject.toml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/tests/conftest.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/pypi/tests/test_version.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/.github/workflows/ci-python.yml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/.repokit-common.toml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/.vscode/launch.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/VERSION +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/__RK_PROJECT__.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/script/tests/test_version.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/setuppy/requirements.txt +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/archetypes/python/setuppy/setup.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/.gitignore.rkappend +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/.repokit-common.toml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/include/__RK_SNAKE__/version.h +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/c-cpp/src/app.rc +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.editorconfig +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.github/workflows/ci-js-ts.yml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.gitignore.rkappend +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.repokit-common.toml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/.vscode/launch.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/js-ts/VERSION +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/paradox/.gitattributes.rkappend +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/paradox/.repokit-common.toml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/paradox/VERSION +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/paradox/docs/modding.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/python/.github/workflows/ci-python.yml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/python/.gitignore.rkappend +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/languages/python/.vscode/launch.json +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/layers/manifest.toml +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/CLAUDE.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_maps/MOC-project.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_oracle/backlinks.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_oracle/concepts.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_oracle/manifest.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_todo/ACTIVE-WORK.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/templates/vault/claude/_todo/OPEN-LOOPS.md +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/repokit/utils.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/setup.cfg +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/setup.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_badges.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_branch_strategies.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_cli_examples.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_cli_integration.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_core_functionality.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_deployment_scenarios.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_docs_links.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_extras_cli.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_github_create.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_github_integration.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_github_owner.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_github_setup.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_guardrails.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_hermetic.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_hook_encoding.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_hook_patterns.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_languages_setting.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layer_action_pins.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_c_cpp.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_claude_plugin.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_compositions.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_js_ts.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_layers_vscode.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_legacy_smoke.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_license_adopt.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_license_cli.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_licenses.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_paradox.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_private_branch_create.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_readme_blocks.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_run_tests_driver.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_template_parity.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_utils.py +0 -0
- {git_repokit-0.10.1 → git_repokit-0.10.3}/tests/test_vault_bootstrap.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
@@ -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.
|
|
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=
|
|
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
|
|
326
|
-
"
|
|
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
|
|
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
|
|
338
|
-
"
|
|
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
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
184
|
-
#
|
|
185
|
-
#
|
|
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",
|
|
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 = []
|