pup-down 0.1.0__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.
@@ -0,0 +1,198 @@
1
+ # ============================================================
2
+ # .gitignore (ALL-REPOS)
3
+ # ============================================================
4
+ # Updated: 2026-08-04
5
+ #
6
+ # REQ: All professional GitHub project repositories MUST include .gitignore.
7
+ # WHY: Keep generated artifacts, local state, secrets, and OS-specific files
8
+ # out of the repository.
9
+ # ALT: Repository may customize ignores, but MUST preserve universal safety rules.
10
+
11
+ # === pup-down fragments ===
12
+
13
+ # WHY: The pup-down (professional Python project updater) may provide temporary configuration fragments for manual merging.
14
+ # WHY: Ruff settings belong in the repository's authoritative pyproject.toml.
15
+ /pyproject.toml.ruff
16
+
17
+
18
+ # === Logs and generated runtime output ===
19
+
20
+ # WHY: Ignore logs and runtime output by default; share only project.log for evidence.
21
+ *.log
22
+ logs/
23
+ !/project.log
24
+
25
+
26
+ # === Private notes and local-only files ===
27
+
28
+ PRIVATE-NOTES.md
29
+ PRIVATE_NOTES.md
30
+
31
+
32
+ # === Environment variables and secrets ===
33
+
34
+ # WHY: Never commit credentials or environment-specific configuration.
35
+ *.env
36
+ .env
37
+ .env.*
38
+
39
+ # WHY: Commit .env.example as a template showing which variables to set.
40
+ # Copy this file to .env and customize.
41
+ !.env.example
42
+
43
+
44
+ # === Operating-system files ===
45
+
46
+ # WHY: OS-generated metadata files should never be tracked.
47
+ .AppleDouble
48
+ .DS_Store
49
+ .LSOverride
50
+ .Spotlight-V100/
51
+ .Trashes
52
+ ._*
53
+ Icon\r
54
+ Thumbs.db
55
+ desktop.ini
56
+ ehthumbs.db
57
+
58
+
59
+ # === Editors and IDEs ===
60
+
61
+ # WHY: IDE metadata is machine-local and should not be tracked.
62
+ *.code-workspace
63
+ .idea/
64
+
65
+
66
+ # === VS Code ===
67
+
68
+ # WHY: Ignore editor state by default; share only project-level config.
69
+ # NOTE: Use .vscode/* (contents), not .vscode/ (directory). Git will not
70
+ # re-include a file whose parent directory is excluded.
71
+ .vscode/*
72
+ !.vscode/ABOUT_THIS_FOLDER.md
73
+ !.vscode/extensions.json
74
+ !.vscode/settings.json
75
+ !.vscode/launch.json
76
+ !.vscode/tasks.json
77
+ !.vscode/*.code-snippets
78
+
79
+
80
+ # === Temporary and swap files ===
81
+
82
+ # WHY: Temporary and swap files are machine-local noise and create meaningless diffs.
83
+ *.swo
84
+ *.swp
85
+ *.tmp
86
+ *~
87
+
88
+
89
+ # === Markup and documentation ===
90
+
91
+ # WHY: Static site build output is generated.
92
+ site/
93
+
94
+
95
+ # === Generic caches ===
96
+
97
+ # WHY: Generic caches are machine-local and should not be tracked.
98
+ .cache/
99
+
100
+
101
+ # === Node dependencies ===
102
+
103
+ # WHY: Node dependencies are restored from package-lock.json with npm ci.
104
+ node_modules/
105
+
106
+ # REQ.NODE: Do NOT git ignore package-lock.json. Commit it and use it in CI/CD pipelines.
107
+
108
+
109
+ # === Node package-manager caches ===
110
+
111
+ # WHY: Package-manager caches are machine-local and should not be tracked.
112
+ .npm/
113
+ .pnpm-store/
114
+ .yarn/cache/
115
+ .yarn/unplugged/
116
+ .yarn/build-state.yml
117
+ .yarn/install-state.gz
118
+
119
+
120
+ # === TypeScript and JavaScript build output ===
121
+
122
+ # WHY: Compiled JavaScript output is generated from TypeScript source.
123
+ out/
124
+
125
+ # WHY: Distribution/build output is generated.
126
+ build/
127
+ dist/
128
+
129
+ # WHY: TypeScript incremental build metadata is generated.
130
+ *.tsbuildinfo
131
+
132
+
133
+ # === TypeScript and JavaScript tooling caches ===
134
+
135
+ # WHY: Tooling caches are generated and machine-local.
136
+ .eslintcache
137
+ .nyc_output/
138
+ coverage/
139
+
140
+
141
+ # === VS Code extension test and package output ===
142
+
143
+ # WHY: VS Code extension test host files are generated by @vscode/test-electron.
144
+ .vscode-test/
145
+
146
+ # WHY: VSIX packages are generated release artifacts.
147
+ *.vsix
148
+
149
+
150
+ # === Python environments ===
151
+
152
+ # WHY: Virtual environments are machine-local and reproducible.
153
+ .venv/
154
+ venv/
155
+
156
+
157
+ # === Python version files ===
158
+
159
+ # REQ.PYTHON: Do NOT git ignore uv.lock. Commit it and use it in CI/CD pipelines.
160
+
161
+ # WHY: Python version when using scm matches any repo depth and any package name.
162
+ **/src/**/_version.py
163
+
164
+
165
+ # === Python bytecode ===
166
+
167
+ # WHY: Python bytecode is generated.
168
+ *.pyc
169
+ *.pyd
170
+ *.pyo
171
+ __pycache__/
172
+
173
+
174
+ # === Python build and packaging artifacts ===
175
+
176
+ # WHY: Build and packaging artifacts are generated.
177
+ *.egg
178
+ *.egg-info/
179
+ *.whl
180
+ .eggs/
181
+
182
+
183
+ # === Python tooling caches ===
184
+
185
+ # WHY: Tooling caches should not be tracked.
186
+ .coverage
187
+ .coverage.*
188
+ .mypy_cache/
189
+ .pytest_cache/
190
+ .pytype/
191
+ .ruff_cache/
192
+ .tox/
193
+
194
+
195
+ # === Notebooks ===
196
+
197
+ # WHY: Notebook checkpoint state is generated.
198
+ .ipynb_checkpoints/
@@ -0,0 +1,113 @@
1
+ # Changelog
2
+
3
+ <!-- markdownlint-disable MD024 -->
4
+
5
+ All notable changes to this project will be documented in this file.
6
+
7
+ The format is based on **[Keep a Changelog](https://keepachangelog.com/en/1.1.0/)**
8
+ and this project adheres to **[Semantic Versioning](https://semver.org/spec/v2.0.0.html)**.
9
+
10
+ ---
11
+
12
+ ## [Unreleased]
13
+
14
+ ---
15
+
16
+ ## [0.1.0] - 2026-08-25
17
+
18
+ ### Added
19
+
20
+ - Read-only comparison of repository scaffolding against canonical templates.
21
+ - Automatic repository detection and additive template-layer inference.
22
+ - Reporting for current, different, repository-newer, template-newer,
23
+ added, and deleted scaffolding files.
24
+ - Git history comparison for determining which differing file was changed
25
+ more recently.
26
+ - Canonical template fetching from **pup-pack/templates** with support for
27
+ local template paths.
28
+ - Repository-specific template rendering using detected project metadata.
29
+ - Existing Zensical template handling and layered template architecture.
30
+ - Direct command-line execution with **uvx pup-down**.
31
+
32
+ ---
33
+
34
+ ## Notes on Versioning and Releases
35
+
36
+ - We use **SemVer**:
37
+ - **MAJOR** - breaking changes
38
+ - **MINOR** - backward-compatible additions
39
+ - **PATCH** - fixes, documentation, tooling
40
+ - Versions are driven by git tags.
41
+ - Tag `vX.Y.Z` to release.
42
+ - Docs are deployed per version tag and aliased to **latest**.
43
+
44
+ ## Release Procedure
45
+
46
+ Follow these steps when creating a new release.
47
+
48
+ ### Task 1. Update release metadata
49
+
50
+ 1. Update `CITATION.cff`: change `version` and `date-released`
51
+ 2. Update `CHANGELOG.md`: move from unreleased, add entry, update links
52
+ 3. Update `pyproject.toml`: update `[tool.hatch.version] fallback-version`
53
+
54
+ ### Task 2. Validate
55
+
56
+ ```shell
57
+ uv self update
58
+ uv python install
59
+ uv lock --upgrade
60
+ uv sync
61
+
62
+ uv run pre-commit install
63
+ uv run pre-commit autoupdate
64
+
65
+ uv run pup-down
66
+
67
+ git add -A
68
+ uv run pre-commit run --all-files
69
+ # rerun if changes made
70
+ uv run pre-commit run --all-files
71
+
72
+ uv run python -m pytest
73
+ uv run ty check
74
+ uv run python -m zensical build
75
+
76
+ <!-- markdownlint-disable MD013 -->
77
+
78
+ uv run python -c "import shutil; from pathlib import Path; shutil.rmtree(Path('dist'), ignore_errors=True)"
79
+
80
+ <!-- markdownlint-enable MD013 -->
81
+
82
+ uv build
83
+ uvx twine check dist/*
84
+ ```
85
+
86
+ ### Task 3. Commit, push, tag
87
+
88
+ ```shell
89
+ git add -A
90
+ git commit -m "Prepare X.Y.Z"
91
+ git push -u origin main
92
+ ```
93
+
94
+ Verify actions run on GitHub. After success:
95
+
96
+ ```shell
97
+ git tag vX.Y.Z -m "X.Y.Z"
98
+ git push origin vX.Y.Z
99
+ ```
100
+
101
+ ## Only As Needed (delete a tag)
102
+
103
+ ```shell
104
+ git tag -d vX.Z.Y
105
+ git push origin :refs/tags/vX.Z.Y
106
+ ```
107
+
108
+ ## Links
109
+
110
+ [Unreleased]: https://github.com/pup-pack/pup-down/compare/v0.1.0...HEAD
111
+ [0.1.0]: https://github.com/pup-pack/pup-down/releases/tag/v0.1.0
112
+
113
+ <!-- markdownlint-enable MD024 -->
@@ -0,0 +1,43 @@
1
+ # ============================================================
2
+ # CITATION.cff (How to cite this project)
3
+ # ============================================================
4
+
5
+ # REQ.UNIVERSAL: Professional open projects SHOULD include this file.
6
+ # USAGE: See https://citation-file-format.github.io/ for details.
7
+
8
+ cff-version: "1.2.0"
9
+ message: "If you use this work, please cite it using the metadata in this file."
10
+ type: software
11
+
12
+ title: "pup-down"
13
+ # Set version and date-released to match latest git tag or release.
14
+ version: "0.1.0"
15
+ date-released: "2026-08-25"
16
+
17
+ authors:
18
+ - family-names: Case
19
+ given-names: Denise M.
20
+ orcid: "https://orcid.org/0000-0001-6165-7389"
21
+ affiliation: "Northwest Missouri State University, School of Computer Science and Information Systems, Maryville, MO, USA"
22
+
23
+ repository-code: "https://github.com/pup-pack/pup-down"
24
+ url: "https://github.com/pup-pack/pup-down"
25
+
26
+ license: MIT
27
+
28
+ abstract: >
29
+ Read-only command-line tool for comparing professional Python repository
30
+ infrastructure with canonical templates and identifying scaffolding changes
31
+ that may need to be incorporated into the maintained templates.
32
+
33
+ keywords:
34
+ - repository-baseline
35
+ - repository-templates
36
+ - template-management
37
+ - developer-tooling
38
+ - command-line-tool
39
+ - python
40
+ - uvx
41
+ - automation
42
+ - software-architecture
43
+ - accountable-repositories
pup_down-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Denise Case
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,171 @@
1
+ Metadata-Version: 2.5
2
+ Name: pup-down
3
+ Version: 0.1.0
4
+ Summary: Read-only command-line tool for identifying repository infrastructure changes that may belong in canonical project templates.
5
+ Project-URL: Homepage, https://github.com/pup-pack/pup-down
6
+ Project-URL: Repository, https://github.com/pup-pack/pup-down
7
+ Project-URL: Documentation, https://pup-pack.github.io/pup-down/
8
+ Project-URL: Issues, https://github.com/pup-pack/pup-down/issues
9
+ Project-URL: Changelog, https://github.com/pup-pack/pup-down/blob/main/CHANGELOG.md
10
+ Author: Denise Case
11
+ License-File: LICENSE
12
+ Keywords: automation,command-line-tool,developer-tooling,python,repository-baseline,repository-templates,software-architecture,template-management,uvx
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.15
19
+ Classifier: Topic :: Software Development
20
+ Classifier: Topic :: Software Development :: Build Tools
21
+ Classifier: Topic :: Software Development :: Quality Assurance
22
+ Classifier: Topic :: Utilities
23
+ Classifier: Typing :: Typed
24
+ Requires-Python: >=3.15
25
+ Requires-Dist: pup-core>=0.1.3
26
+ Description-Content-Type: text/markdown
27
+
28
+ # pup-down: Professional Python Project Updater (Move Updates Down to Templates)
29
+
30
+ [![PyPI](https://img.shields.io/pypi/v/pup-down?logo=pypi&label=pypi)](https://pypi.org/project/pup-down/)
31
+ [![Docs Site](https://img.shields.io/badge/docs-site-blue?logo=github)](https://pup-pack.github.io/pup-down/)
32
+ [![Repo](https://img.shields.io/badge/repo-GitHub-black?logo=github)](https://github.com/pup-pack/pup-down)
33
+ [![Python 3.15](https://img.shields.io/badge/python-3.15%2B-blue?logo=python)](https://github.com/pup-pack/pup-down/blob/main/pyproject.toml)
34
+ [![uv managed](https://img.shields.io/badge/uv-managed-DE5FE9)](https://docs.astral.sh/uv/)
35
+ [![ty type checked](https://img.shields.io/badge/ty-type_checked-2F80ED)](https://docs.astral.sh/ty/)
36
+ [![Zensical docs](https://img.shields.io/badge/Zensical-docs-purple)](https://zensical.org/)
37
+ [![MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](https://github.com/pup-pack/pup-down/blob/main/LICENSE)
38
+
39
+ [![CI](https://github.com/pup-pack/pup-down/actions/workflows/ci-python-zensical.yml/badge.svg?branch=main)](https://github.com/pup-pack/pup-down/actions/workflows/ci-python-zensical.yml)
40
+ [![Docs-Deploy](https://github.com/pup-pack/pup-down/actions/workflows/deploy-zensical.yml/badge.svg?branch=main)](https://github.com/pup-pack/pup-down/actions/workflows/deploy-zensical.yml)
41
+ [![Pre-Release](https://github.com/pup-pack/pup-down/actions/workflows/pre-release.yml/badge.svg?branch=main)](https://github.com/pup-pack/pup-down/actions/workflows/pre-release.yml)
42
+ [![Release](https://github.com/pup-pack/pup-down/actions/workflows/release-pypi.yml/badge.svg)](https://github.com/pup-pack/pup-down/actions/workflows/release-pypi.yml)
43
+ [![Links](https://github.com/pup-pack/pup-down/actions/workflows/links.yml/badge.svg?branch=main)](https://github.com/pup-pack/pup-down/actions/workflows/links.yml)
44
+ [![Dependabot](https://img.shields.io/badge/Dependabot-enabled-brightgreen.svg)](https://github.com/pup-pack/pup-down/security)
45
+
46
+ <img
47
+ src="https://raw.githubusercontent.com/pup-pack/pup-down/main/docs/images/pup.png"
48
+ alt="pup logo"
49
+ width="110">
50
+
51
+ > Opinionated professional Python project template comparison tool.
52
+ > Shows when the active repo has more recent infrastructure files that
53
+ > should possibly be copied to the canonical templates.
54
+
55
+ ## Purpose
56
+
57
+ Professional Python repositories commonly share infrastructure such as:
58
+
59
+ - editor and Git configuration
60
+ - ignore and line-ending rules
61
+ - Markdown, YAML, and link checking
62
+ - formatting, linting, type checking, and testing
63
+ - documentation tooling
64
+ - continuous integration
65
+ - package and release validation
66
+
67
+ `pup-down` makes it easy to identify infrastructure improvements made
68
+ during recent work that should possibly be copied back to the canonical
69
+ templates.
70
+
71
+ ## Benefits
72
+
73
+ `pup-down` is **report-only**.
74
+ Each repository fetches the current baseline and compares it with its
75
+ own infrastructure.
76
+ Nothing reaches in from a central place, so:
77
+
78
+ - **Repo owner is in control.** Run it when you choose.
79
+ No files are updated. A list of changes to possibly copy to the
80
+ canonical template files is provided.
81
+
82
+ Templates are fetched by **immutable commit SHA**,
83
+ so an update always reflects the latest push to the template repository
84
+ and every run is pinned to an exact template commit.
85
+
86
+ Repo type is inferred from the presence of key files
87
+ so no extensive configuration is needed.
88
+ For example:
89
+
90
+ - ALL REPOS
91
+ - `pyproject.toml` indicates ALL PY REPOS
92
+ - `pyproject.toml` + `src` indicates ALL PY SRC REPOS
93
+
94
+ ## Template Source
95
+
96
+ - [templates](https://github.com/pup-pack/templates)
97
+
98
+ ## Compare a Repo with Templates
99
+
100
+ ```shell
101
+ # compare with canonical templates
102
+ uvx pup-down
103
+
104
+ # compare using the latest published pup-down version
105
+ uvx pup-down@latest
106
+ ```
107
+
108
+ ## Developer Command Reference
109
+
110
+ <details>
111
+ <summary>Show command reference</summary>
112
+
113
+ ### In a machine terminal
114
+
115
+ Open a machine terminal where you want the project:
116
+
117
+ ```shell
118
+ git clone https://github.com/pup-pack/pup-down
119
+
120
+ cd pup-down
121
+ code .
122
+ ```
123
+
124
+ ### In a VS Code terminal
125
+
126
+ ```shell
127
+ uv self update
128
+ uv python pin 3.15
129
+ uv python install
130
+ uv lock --upgrade
131
+ uv sync
132
+
133
+ uv run pre-commit install
134
+ uv run pre-commit autoupdate
135
+
136
+ git add -A
137
+ uv run pre-commit run --all-files
138
+ # repeat if changes were made
139
+ uv run pre-commit run --all-files
140
+
141
+ # run locally to test
142
+ uv run pup-down
143
+
144
+ # types, tests, docs
145
+ uv run ty check
146
+ uv run python -m pytest
147
+ uv run python -m zensical build
148
+
149
+ # save progress
150
+ git add -A
151
+ git commit -m "update"
152
+ git push -u origin main
153
+ ```
154
+
155
+ </details>
156
+
157
+ ## Documentation
158
+
159
+ - [Documentation](https://pup-pack.github.io/pup-down/)
160
+
161
+ ## Annotations
162
+
163
+ [.annotations/annotations.md](https://github.com/pup-pack/pup-down/blob/main/.annotations/annotations.md)
164
+
165
+ ## Citation
166
+
167
+ [CITATION.cff](https://github.com/pup-pack/pup-down/blob/main/CITATION.cff)
168
+
169
+ ## License
170
+
171
+ [MIT](https://github.com/pup-pack/pup-down/blob/main/LICENSE)
@@ -0,0 +1,144 @@
1
+ # pup-down: Professional Python Project Updater (Move Updates Down to Templates)
2
+
3
+ [![PyPI](https://img.shields.io/pypi/v/pup-down?logo=pypi&label=pypi)](https://pypi.org/project/pup-down/)
4
+ [![Docs Site](https://img.shields.io/badge/docs-site-blue?logo=github)](https://pup-pack.github.io/pup-down/)
5
+ [![Repo](https://img.shields.io/badge/repo-GitHub-black?logo=github)](https://github.com/pup-pack/pup-down)
6
+ [![Python 3.15](https://img.shields.io/badge/python-3.15%2B-blue?logo=python)](https://github.com/pup-pack/pup-down/blob/main/pyproject.toml)
7
+ [![uv managed](https://img.shields.io/badge/uv-managed-DE5FE9)](https://docs.astral.sh/uv/)
8
+ [![ty type checked](https://img.shields.io/badge/ty-type_checked-2F80ED)](https://docs.astral.sh/ty/)
9
+ [![Zensical docs](https://img.shields.io/badge/Zensical-docs-purple)](https://zensical.org/)
10
+ [![MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](https://github.com/pup-pack/pup-down/blob/main/LICENSE)
11
+
12
+ [![CI](https://github.com/pup-pack/pup-down/actions/workflows/ci-python-zensical.yml/badge.svg?branch=main)](https://github.com/pup-pack/pup-down/actions/workflows/ci-python-zensical.yml)
13
+ [![Docs-Deploy](https://github.com/pup-pack/pup-down/actions/workflows/deploy-zensical.yml/badge.svg?branch=main)](https://github.com/pup-pack/pup-down/actions/workflows/deploy-zensical.yml)
14
+ [![Pre-Release](https://github.com/pup-pack/pup-down/actions/workflows/pre-release.yml/badge.svg?branch=main)](https://github.com/pup-pack/pup-down/actions/workflows/pre-release.yml)
15
+ [![Release](https://github.com/pup-pack/pup-down/actions/workflows/release-pypi.yml/badge.svg)](https://github.com/pup-pack/pup-down/actions/workflows/release-pypi.yml)
16
+ [![Links](https://github.com/pup-pack/pup-down/actions/workflows/links.yml/badge.svg?branch=main)](https://github.com/pup-pack/pup-down/actions/workflows/links.yml)
17
+ [![Dependabot](https://img.shields.io/badge/Dependabot-enabled-brightgreen.svg)](https://github.com/pup-pack/pup-down/security)
18
+
19
+ <img
20
+ src="https://raw.githubusercontent.com/pup-pack/pup-down/main/docs/images/pup.png"
21
+ alt="pup logo"
22
+ width="110">
23
+
24
+ > Opinionated professional Python project template comparison tool.
25
+ > Shows when the active repo has more recent infrastructure files that
26
+ > should possibly be copied to the canonical templates.
27
+
28
+ ## Purpose
29
+
30
+ Professional Python repositories commonly share infrastructure such as:
31
+
32
+ - editor and Git configuration
33
+ - ignore and line-ending rules
34
+ - Markdown, YAML, and link checking
35
+ - formatting, linting, type checking, and testing
36
+ - documentation tooling
37
+ - continuous integration
38
+ - package and release validation
39
+
40
+ `pup-down` makes it easy to identify infrastructure improvements made
41
+ during recent work that should possibly be copied back to the canonical
42
+ templates.
43
+
44
+ ## Benefits
45
+
46
+ `pup-down` is **report-only**.
47
+ Each repository fetches the current baseline and compares it with its
48
+ own infrastructure.
49
+ Nothing reaches in from a central place, so:
50
+
51
+ - **Repo owner is in control.** Run it when you choose.
52
+ No files are updated. A list of changes to possibly copy to the
53
+ canonical template files is provided.
54
+
55
+ Templates are fetched by **immutable commit SHA**,
56
+ so an update always reflects the latest push to the template repository
57
+ and every run is pinned to an exact template commit.
58
+
59
+ Repo type is inferred from the presence of key files
60
+ so no extensive configuration is needed.
61
+ For example:
62
+
63
+ - ALL REPOS
64
+ - `pyproject.toml` indicates ALL PY REPOS
65
+ - `pyproject.toml` + `src` indicates ALL PY SRC REPOS
66
+
67
+ ## Template Source
68
+
69
+ - [templates](https://github.com/pup-pack/templates)
70
+
71
+ ## Compare a Repo with Templates
72
+
73
+ ```shell
74
+ # compare with canonical templates
75
+ uvx pup-down
76
+
77
+ # compare using the latest published pup-down version
78
+ uvx pup-down@latest
79
+ ```
80
+
81
+ ## Developer Command Reference
82
+
83
+ <details>
84
+ <summary>Show command reference</summary>
85
+
86
+ ### In a machine terminal
87
+
88
+ Open a machine terminal where you want the project:
89
+
90
+ ```shell
91
+ git clone https://github.com/pup-pack/pup-down
92
+
93
+ cd pup-down
94
+ code .
95
+ ```
96
+
97
+ ### In a VS Code terminal
98
+
99
+ ```shell
100
+ uv self update
101
+ uv python pin 3.15
102
+ uv python install
103
+ uv lock --upgrade
104
+ uv sync
105
+
106
+ uv run pre-commit install
107
+ uv run pre-commit autoupdate
108
+
109
+ git add -A
110
+ uv run pre-commit run --all-files
111
+ # repeat if changes were made
112
+ uv run pre-commit run --all-files
113
+
114
+ # run locally to test
115
+ uv run pup-down
116
+
117
+ # types, tests, docs
118
+ uv run ty check
119
+ uv run python -m pytest
120
+ uv run python -m zensical build
121
+
122
+ # save progress
123
+ git add -A
124
+ git commit -m "update"
125
+ git push -u origin main
126
+ ```
127
+
128
+ </details>
129
+
130
+ ## Documentation
131
+
132
+ - [Documentation](https://pup-pack.github.io/pup-down/)
133
+
134
+ ## Annotations
135
+
136
+ [.annotations/annotations.md](https://github.com/pup-pack/pup-down/blob/main/.annotations/annotations.md)
137
+
138
+ ## Citation
139
+
140
+ [CITATION.cff](https://github.com/pup-pack/pup-down/blob/main/CITATION.cff)
141
+
142
+ ## License
143
+
144
+ [MIT](https://github.com/pup-pack/pup-down/blob/main/LICENSE)