documenteer 2.4.1__tar.gz → 2.5.0b2__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.
- documenteer-2.5.0b2/.agents/skills/project-mechanics/SKILL.md +63 -0
- documenteer-2.5.0b2/.agents/skills/stoker-create-pr/SKILL.md +255 -0
- documenteer-2.5.0b2/.agents/skills/stoker-fixup/SKILL.md +128 -0
- documenteer-2.5.0b2/.agents/skills/stoker-implement/SKILL.md +199 -0
- documenteer-2.5.0b2/.agents/skills/stoker-prd/SKILL.md +371 -0
- documenteer-2.5.0b2/.agents/skills/stoker-prd-followup/SKILL.md +459 -0
- documenteer-2.5.0b2/.agents/skills/stoker-prd-to-issues/SKILL.md +599 -0
- documenteer-2.5.0b2/.agents/skills/stoker-rebase/SKILL.md +114 -0
- documenteer-2.5.0b2/.agents/skills/stoker-review/SKILL.md +133 -0
- documenteer-2.5.0b2/.agents/skills/stoker-run-workflow/SKILL.md +256 -0
- documenteer-2.5.0b2/.agents/skills/stoker-work/SKILL.md +141 -0
- documenteer-2.5.0b2/.claude/skills/project-mechanics/SKILL.md +63 -0
- documenteer-2.5.0b2/.claude/skills/stoker-create-pr/SKILL.md +255 -0
- documenteer-2.5.0b2/.claude/skills/stoker-fixup/SKILL.md +128 -0
- documenteer-2.5.0b2/.claude/skills/stoker-implement/SKILL.md +199 -0
- documenteer-2.5.0b2/.claude/skills/stoker-prd/SKILL.md +371 -0
- documenteer-2.5.0b2/.claude/skills/stoker-prd-followup/SKILL.md +459 -0
- documenteer-2.5.0b2/.claude/skills/stoker-prd-to-issues/SKILL.md +599 -0
- documenteer-2.5.0b2/.claude/skills/stoker-rebase/SKILL.md +114 -0
- documenteer-2.5.0b2/.claude/skills/stoker-review/SKILL.md +133 -0
- documenteer-2.5.0b2/.claude/skills/stoker-run-workflow/SKILL.md +256 -0
- documenteer-2.5.0b2/.claude/skills/stoker-work/SKILL.md +141 -0
- documenteer-2.5.0b2/.claude/workflows/stoker-iteration.js +247 -0
- documenteer-2.5.0b2/.devcontainer/Dockerfile +22 -0
- documenteer-2.5.0b2/.devcontainer/devcontainer.json +33 -0
- documenteer-2.5.0b2/.devcontainer/stoker/agent-entry.sh +58 -0
- documenteer-2.5.0b2/.devcontainer/stoker/codex-config.toml +15 -0
- documenteer-2.5.0b2/.devcontainer/stoker/devcontainer.json +37 -0
- documenteer-2.5.0b2/.devcontainer/stoker/features/stoker-sandbox/devcontainer-feature.json +10 -0
- documenteer-2.5.0b2/.devcontainer/stoker/features/stoker-sandbox/install.sh +66 -0
- documenteer-2.5.0b2/.devcontainer/stoker/firewall-allowlist.txt +223 -0
- documenteer-2.5.0b2/.devcontainer/stoker/firewall-refresh.cron +2 -0
- documenteer-2.5.0b2/.devcontainer/stoker/init-firewall.sh +234 -0
- documenteer-2.5.0b2/.github/ISSUE_TEMPLATE/prd-task.yml +107 -0
- documenteer-2.5.0b2/.github/ISSUE_TEMPLATE/prd.yml +63 -0
- documenteer-2.5.0b2/.github/dependabot.yml +37 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.github/workflows/ci-cron.yaml +72 -46
- documenteer-2.5.0b2/.github/workflows/ci.yaml +295 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.gitignore +3 -0
- documenteer-2.5.0b2/.nvmrc +1 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.pre-commit-config.yaml +13 -11
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.prettierignore +1 -0
- documenteer-2.5.0b2/.stoker/.gitignore +2 -0
- documenteer-2.5.0b2/.stoker/prompts/fixup.md +31 -0
- documenteer-2.5.0b2/.stoker/prompts/implement.md +42 -0
- documenteer-2.5.0b2/.stoker/prompts/rebase.md +37 -0
- documenteer-2.5.0b2/.stoker/prompts/review.md +33 -0
- documenteer-2.5.0b2/.stoker/prompts/select.md +99 -0
- documenteer-2.5.0b2/.stoker/settings.toml +19 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/CHANGELOG.md +13 -13
- {documenteer-2.4.1 → documenteer-2.5.0b2}/CLAUDE.md +16 -10
- {documenteer-2.4.1 → documenteer-2.5.0b2}/Makefile +6 -8
- {documenteer-2.4.1/src/documenteer.egg-info → documenteer-2.5.0b2}/PKG-INFO +14 -11
- documenteer-2.5.0b2/changelog.d/20260629_000000_DM-55292-remote-code-block.md +3 -0
- documenteer-2.5.0b2/changelog.d/20260629_000001_DM-55292-sphinx-upgrade.md +15 -0
- documenteer-2.5.0b2/changelog.d/20260629_000002_DM-55292-diagrams.md +7 -0
- documenteer-2.5.0b2/changelog.d/20260629_000003_DM-55292-diagrams-svg.md +3 -0
- documenteer-2.5.0b2/changelog.d/20260629_155552_jonathan_DM_55292_upgrade.md +4 -0
- documenteer-2.5.0b2/changelog.d/20260630_125651_jonathan_DM_55292_frontend.md +6 -0
- documenteer-2.5.0b2/changelog.d/20260702_000000_DM-52076-technote-lint.md +9 -0
- documenteer-2.5.0b2/changelog.d/20260706_000000_jonathan_DM_55386_linkcheck_service.md +4 -0
- documenteer-2.5.0b2/changelog.d/20260722_000000_jonathan_DM_55387_intersphinx_cache.md +3 -0
- documenteer-2.5.0b2/changelog.d/20260723_000000_jonathan_DM_55600_intersphinx_cache_ttl.md +3 -0
- documenteer-2.5.0b2/changelog.d/20260731_000000_jonathan_autotypes.md +12 -0
- documenteer-2.5.0b2/changelog.d/20260801_000000_jonathan_git_shallow_suppress.md +3 -0
- documenteer-2.5.0b2/changelog.d/20260806_000000_jonathan_DM_55745_improve_this_page.md +3 -0
- documenteer-2.5.0b2/changelog.d/20260806_000001_jonathan_DM_55745_header_nav_wrap.md +3 -0
- documenteer-2.5.0b2/changelog.d/20260806_000002_jonathan_DM_55745_github_icon.md +3 -0
- documenteer-2.5.0b2/changelog.d/20260806_000003_jonathan_DM_55745_footer.md +3 -0
- documenteer-2.5.0b2/changelog.d/20260807_000000_jonathan_DM_55745_drop_rubin_docs_link.md +3 -0
- documenteer-2.5.0b2/changelog.d/20260812_000000_jonathan_DM_55690_sphinx9_gaps.md +9 -0
- {documenteer-2.4.1/demo/rst-technote → documenteer-2.5.0b2/demo/ipynb-technote}/diagram.py +1 -1
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/md-technote/diagram.py +1 -1
- {documenteer-2.4.1/demo/ipynb-technote → documenteer-2.5.0b2/demo/rst-technote}/diagram.py +1 -1
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/Makefile +0 -3
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/_rst_epilog.rst +9 -5
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/changelog.md +13 -13
- documenteer-2.5.0b2/docs/dev/dependency-policy.rst +37 -0
- documenteer-2.5.0b2/docs/dev/development.rst +207 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/dev/index.rst +1 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/dev/release.rst +2 -2
- documenteer-2.5.0b2/docs/dev/theme-assets.rst +74 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/documenteer.toml +0 -2
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/diagrams.rst +24 -6
- documenteer-2.5.0b2/docs/guides/improve-this-page.rst +58 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/index.rst +1 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/pyproject-configuration.rst +1 -1
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/toml-reference.rst +181 -2
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/index.rst +2 -1
- documenteer-2.5.0b2/docs/sphinx-extensions/autotypes.rst +158 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/sphinx-extensions/github-edit-link.rst +4 -1
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/sphinx-extensions/index.rst +1 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/sphinx-extensions/last-updated.rst +2 -1
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/edit-locally.rst +1 -1
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/extensions.rst +16 -3
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/index.rst +1 -0
- documenteer-2.5.0b2/docs/technotes/lint/index.rst +193 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn001.rst +65 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn002.rst +52 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn003.rst +46 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn004.rst +56 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn005.rst +54 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn006.rst +55 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn101.rst +60 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn102.rst +59 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn103.rst +44 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn201.rst +72 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn202.rst +68 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn203.rst +46 -0
- documenteer-2.5.0b2/docs/technotes/lint/tn204.rst +67 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/licenses/README.md +1 -0
- documenteer-2.5.0b2/licenses/sphinx-diagrams.txt +34 -0
- documenteer-2.5.0b2/noxfile.py +173 -0
- documenteer-2.5.0b2/package-lock.json +3637 -0
- documenteer-2.5.0b2/package.json +25 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/pyproject.toml +50 -12
- {documenteer-2.4.1 → documenteer-2.5.0b2}/ruff-shared.toml +20 -4
- documenteer-2.5.0b2/src/assets/rubin-guide/styles/rubin-pydata-theme.scss +386 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/.gitignore +2 -0
- documenteer-2.5.0b2/src/documenteer/assets/rsd-assets/rubin-partners.png +0 -0
- documenteer-2.5.0b2/src/documenteer/assets/rubin-footer-align.js +66 -0
- documenteer-2.5.0b2/src/documenteer/assets/rubin-pydata-theme.css +517 -0
- documenteer-2.5.0b2/src/documenteer/assets/rubin-pydata-theme.css.map +1 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/rubin-technote.css +82 -30
- documenteer-2.5.0b2/src/documenteer/assets/rubin-technote.css.map +1 -0
- documenteer-2.5.0b2/src/documenteer/assets/scripts/rubin-pydata-theme.js +28 -0
- documenteer-2.5.0b2/src/documenteer/assets/scripts/rubin-pydata-theme.js.map +1 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/scripts/rubin-technote.js +3 -3
- documenteer-2.5.0b2/src/documenteer/assets/scripts/rubin-technote.js.map +1 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/cli.py +82 -2
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/conf/_toml.py +180 -10
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/conf/_utils.py +53 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/conf/guide.py +68 -10
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/conf/technote.py +23 -2
- documenteer-2.5.0b2/src/documenteer/ext/autotypes/__init__.py +53 -0
- documenteer-2.5.0b2/src/documenteer/ext/autotypes/_shared.py +17 -0
- documenteer-2.5.0b2/src/documenteer/ext/autotypes/compat.py +312 -0
- documenteer-2.5.0b2/src/documenteer/ext/autotypes/documenters.py +274 -0
- documenteer-2.5.0b2/src/documenteer/ext/autotypes/xrefs.py +1333 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/bibtex.py +1 -1
- documenteer-2.5.0b2/src/documenteer/ext/diagrams.py +446 -0
- documenteer-2.5.0b2/src/documenteer/ext/intersphinxcache.py +390 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/lastmodified.py +7 -6
- documenteer-2.5.0b2/src/documenteer/ext/linkcheckservice.py +516 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/remotecodeblock.py +23 -4
- documenteer-2.5.0b2/src/documenteer/services/technotelint.py +1134 -0
- documenteer-2.5.0b2/src/documenteer/storage/authordb.py +177 -0
- documenteer-2.5.0b2/src/documenteer/storage/intersphinxcacheclient.py +217 -0
- documenteer-2.5.0b2/src/documenteer/storage/linkcheckclient.py +413 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/localtemplates/technote/Makefile +1 -1
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/localtemplates/technote/tox.ini +5 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/technotetoml.py +3 -3
- documenteer-2.5.0b2/src/documenteer/templates/pydata/components/prev-next.html +11 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/templates/pydata/last-updated.html +4 -1
- documenteer-2.5.0b2/src/documenteer/templates/pydata/rubin-footer.html +71 -0
- documenteer-2.5.0b2/src/documenteer/templates/pydata/rubin-improve-this-page.html +36 -0
- documenteer-2.5.0b2/src/documenteer/templates/pydata/rubin-print-footer.html +26 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2/src/documenteer.egg-info}/PKG-INFO +14 -11
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer.egg-info/SOURCES.txt +172 -1
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer.egg-info/requires.txt +11 -10
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer.egg-info/scm_file_list.json +374 -208
- documenteer-2.5.0b2/src/documenteer.egg-info/scm_version.json +8 -0
- documenteer-2.5.0b2/src/documenteer.egg-info/top_level.txt +2 -0
- documenteer-2.5.0b2/src/sphinx_diagrams/__init__.py +12 -0
- documenteer-2.5.0b2/tests/cli_test.py +150 -0
- documenteer-2.5.0b2/tests/ext/autotypes_test.py +1226 -0
- documenteer-2.5.0b2/tests/ext/diagrams_test.py +229 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/ext/githubeditlink_test.py +5 -3
- documenteer-2.5.0b2/tests/ext/guide_build_test.py +148 -0
- documenteer-2.5.0b2/tests/ext/intersphinxcache_test.py +987 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/ext/lastmodified_test.py +3 -1
- documenteer-2.5.0b2/tests/ext/linkcheckservice_test.py +1413 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/ext/redoc_test.py +15 -15
- documenteer-2.5.0b2/tests/roots/test-autotypes/_templates/autosummary_core/pydantic_model.rst +22 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes/autotypespkg/__init__.py +22 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes/autotypespkg/_impl.py +185 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes/conf.py +20 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes/index.rst +25 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-alias/aliasroot/__init__.py +13 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-alias/aliasroot/documented/__init__.py +30 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-alias/aliasroot/documented/helpers.py +20 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-alias/aliasroot/external/__init__.py +25 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-alias/conf.py +19 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-alias/index.rst +17 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-annotated/annotatedpkg/__init__.py +14 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-annotated/annotatedpkg/constrained.py +54 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-annotated/annotatedpkg/phased.py +43 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-annotated/conf.py +26 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-annotated/extphase/__init__.py +21 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-annotated/index.rst +19 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-inherited/conf.py +53 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-inherited/extpkg/__init__.py +59 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-inherited/index.rst +11 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-inherited/inheritpkg/__init__.py +23 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-private/conf.py +18 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-private/index.rst +15 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-private/privatepkg/__init__.py +11 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-private/privatepkg/_impl.py +17 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-private/privatepkg/helpers.py +14 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-pydantic/conf.py +21 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-pydantic/index.rst +15 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-pydantic/pydanticpkg/__init__.py +52 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-typehints/conf.py +23 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-typehints/index.rst +10 -0
- documenteer-2.5.0b2/tests/roots/test-autotypes-typehints/singletonpkg/__init__.py +27 -0
- documenteer-2.5.0b2/tests/roots/test-diagrams/conf.py +3 -0
- documenteer-2.5.0b2/tests/roots/test-diagrams/diagram.py +6 -0
- documenteer-2.5.0b2/tests/roots/test-diagrams/index.rst +17 -0
- documenteer-2.5.0b2/tests/roots/test-diagrams-svg/conf.py +4 -0
- documenteer-2.5.0b2/tests/roots/test-diagrams-svg/diagram.py +6 -0
- documenteer-2.5.0b2/tests/roots/test-diagrams-svg/index.rst +17 -0
- documenteer-2.5.0b2/tests/roots/test-guide/documenteer.toml +4 -0
- documenteer-2.5.0b2/tests/roots/test-guide/hidden.rst +7 -0
- documenteer-2.5.0b2/tests/roots/test-guide/index.rst +11 -0
- documenteer-2.5.0b2/tests/roots/test-intersphinx-cache/conf.py +13 -0
- documenteer-2.5.0b2/tests/roots/test-intersphinx-cache/index.rst +5 -0
- documenteer-2.5.0b2/tests/roots/test-intersphinx-cache-multi/conf.py +12 -0
- documenteer-2.5.0b2/tests/roots/test-intersphinx-cache-multi/index.rst +4 -0
- documenteer-2.5.0b2/tests/roots/test-intersphinx-cache-oddkey/conf.py +12 -0
- documenteer-2.5.0b2/tests/roots/test-intersphinx-cache-oddkey/index.rst +4 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service/conf.py +1 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service/documenteer.toml +4 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service/index.rst +7 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service-filter/conf.py +1 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service-filter/documenteer.toml +4 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service-filter/index.rst +10 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service-multipage/conf.py +1 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service-multipage/documenteer.toml +4 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service-multipage/index.rst +7 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service-multipage/page-a.rst +6 -0
- documenteer-2.5.0b2/tests/roots/test-linkcheck-service-multipage/page-b.rst +5 -0
- documenteer-2.5.0b2/tests/roots/test-redoc/conf.py +1 -0
- documenteer-2.5.0b2/tests/roots/test-technote-linkcheck-service/conf.py +6 -0
- documenteer-2.5.0b2/tests/roots/test-technote-linkcheck-service/index.rst +14 -0
- documenteer-2.5.0b2/tests/roots/test-technote-linkcheck-service/technote.toml +13 -0
- documenteer-2.5.0b2/tests/services/technotelint_test.py +1205 -0
- documenteer-2.5.0b2/tests/storage/authordb_test.py +170 -0
- documenteer-2.5.0b2/tests/storage/intersphinxcacheclient_test.py +214 -0
- documenteer-2.5.0b2/tests/storage/linkcheckclient_test.py +396 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/test_conf_toml.py +119 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/test_conf_utils.py +38 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/uv.lock +436 -300
- {documenteer-2.4.1 → documenteer-2.5.0b2}/webpack.config.js +19 -1
- documenteer-2.4.1/.github/dependabot.yml +0 -20
- documenteer-2.4.1/.github/workflows/ci.yaml +0 -209
- documenteer-2.4.1/.nvmrc +0 -1
- documenteer-2.4.1/docs/dev/development.rst +0 -184
- documenteer-2.4.1/docs/dev/theme-assets.rst +0 -27
- documenteer-2.4.1/package-lock.json +0 -5566
- documenteer-2.4.1/package.json +0 -24
- documenteer-2.4.1/src/documenteer/assets/rubin-pydata-theme.css +0 -133
- documenteer-2.4.1/src/documenteer/assets/rubin-technote.css.map +0 -1
- documenteer-2.4.1/src/documenteer/assets/scripts/rubin-technote.js.map +0 -1
- documenteer-2.4.1/src/documenteer/storage/authordb.py +0 -102
- documenteer-2.4.1/src/documenteer.egg-info/scm_version.json +0 -8
- documenteer-2.4.1/src/documenteer.egg-info/top_level.txt +0 -2
- documenteer-2.4.1/tests/storage/authordb_test.py +0 -64
- documenteer-2.4.1/tox.ini +0 -108
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.claude/.gitignore +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.claude/tasks/.gitkeep +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.flake8 +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.github/CODE_OF_CONDUCT.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.github/CONTRIBUTING.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.github/SUPPORT.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.npmrc +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.prettierrc.yaml +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.vscode/settings.json +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/.vscode/tasks.json +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/LICENSE +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/MANIFEST.in +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/README.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/changelog.d/20260727_000000_jonathan_DM_55634_github_edit_link_path.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/changelog.d/_template.md.jinja +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/ipynb-technote/.gitignore +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/ipynb-technote/Makefile +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/ipynb-technote/conf.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/ipynb-technote/extra-notebook.ipynb +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/ipynb-technote/index.ipynb +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/ipynb-technote/subdir/subdir-notebook.ipynb +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/ipynb-technote/technote.toml +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/md-technote/.gitignore +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/md-technote/Makefile +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/md-technote/conf.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/md-technote/index.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/md-technote/technote.toml +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/rst-technote/.gitignore +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/rst-technote/Makefile +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/rst-technote/conf.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/rst-technote/index.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/rst-technote/local.bib +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/demo/rst-technote/technote.toml +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/.gitignore +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/conf.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/dev/api/documenteer.conf.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/dev/api/documenteer.ext.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/dev/api/index.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/dev/html-templates.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/dev/theme.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/badges.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/configuration-preset.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/configuration.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/extend-conf-py.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/including-notebooks.ipynb +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/markdown-primer.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/openapi.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/organization.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/overview.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/page-redirects.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/rst-epilog.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/tabsets.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/guides/video-embeds.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/sphinx-extensions/docushare-reference.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/sphinx-extensions/githubbibcache.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/sphinx-extensions/jira-reference.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/sphinx-extensions/lsst-pybtex-style.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/sphinx-extensions/openapi.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/sphinx-extensions/remote-code-block.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/_templates/README.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/_templates/README.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/author-metadata.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/configuration.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/document-status.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/edit-on-github.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/how-your-technote-gets-published.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/migrate.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/references.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/start-a-technote.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/docs/technotes/wide-content.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/licenses/astropy-helpers.txt +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/licenses/sphinx-issue.txt +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/licenses/sphinx.txt +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/licenses/sphinxcontrib-redoc.txt +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/postcss.config.js +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/setup.cfg +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/SourceSans3VF-Italic.ttf.woff2 +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/SourceSans3VF-Upright.ttf.woff2 +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/_hacks.scss +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/_properties.scss +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/components/_article-header.scss +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/components/_authors.scss +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/components/_global-breadcrumbs.scss +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/components/_index.scss +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/components/_sidebar-section.scss +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/components/_version-info.scss +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/assets/rubin-technote/styles/rubin-technote.scss +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/__init__.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/_packagemetadata.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/_requestsutils.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/_utils.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/731c8feefe13e72a8691.woff2 +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/b8bc3440ba2145e132f5.woff2 +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/favicon.ico +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/rsd-assets/rubin-imagotype-color-on-black-crop.svg +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/rsd-assets/rubin-imagotype-color-on-white-crop.svg +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/rubin-favicon-transparent-32px.png +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/rubin-favicon.svg +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/rubin-last-modified.js +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/rubin-titlebar-imagotype-dark.svg +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/assets/rubin-titlebar-imagotype-light.svg +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/conf/__init__.py +3 -3
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/__init__.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/githubbibcache.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/githubeditlink.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/jira.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/lsstdocushare.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/mockcoderefs.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/openapi.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/redoc/__init__.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/redoc/_redoc.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/redoc/assets/redoc.html.jinja2 +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/ext/robots.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/py.typed +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/services/__init__.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/services/technoteauthor.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/services/technotemigration.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/__init__.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/latex.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/localtemplates/technote/README.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/localtemplates/technote/ci.yaml +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/localtemplates/technote/conf.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/localtemplates/technote/dependabot.yml +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/localtemplates/technote/gitignore +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/localtemplates/technote/pre-commit-config.yaml +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/localtemplates/technote/requirements.txt +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/storage/localtemplates.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/templates/pydata/autosummary_core/exception.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/templates/pydata/autosummary_core/pydantic_model.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/templates/pydata/layout.html +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/templates/technote/.gitkeep +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/templates/technote/components/.gitkeep +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/templates/technote/components/sidebar-source.html +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/templates/technote/sections/.gitkeep +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/templates/technote/sections/header-article.html +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/templates/technote/sections/sidebar-primary.html +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer/version.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer.egg-info/dependency_links.txt +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/src/documenteer.egg-info/entry_points.txt +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/__init__.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/conftest.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/afw.doxygen.conf +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/authordb.yaml +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/doxygen.tag.zip +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/package_alpha/doc/_static/package_alpha/README.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/package_alpha/doc/doxygen.conf.in +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/package_alpha/doc/manifest.yaml +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/package_alpha/doc/package.alpha/index.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/package_alpha/doc/package_alpha/index.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/package_alpha/include/README.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/package_alpha/src/README.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/data/package_beta/doc/README.md +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/ext/__init__.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/ext/conftest.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/ext/jira_test.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/ext/lsstdocushare_test.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/ext/mockcoderefs_test.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/ext/robots_test.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/packagemetadata_test.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-autocppapi/conf.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-autocppapi/doxygen.tag.zip +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-autocppapi/index.rst +0 -0
- {documenteer-2.4.1/tests/roots/test-redoc → documenteer-2.5.0b2/tests/roots/test-guide}/conf.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-lastmodified/conf.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-lastmodified/index.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-lastmodified/page2.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-lastmodified/snippet.txt +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-redoc/_static/openapi.json +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-redoc/api.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-redoc/documenteer.toml +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-redoc/index.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-robots-nositemap/conf.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-robots-nositemap/index.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-robots-nositemap/page1.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-robots-sitemap/conf.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-robots-sitemap/index.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-robots-sitemap/page1.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/roots/test-robots-sitemap/page2.rst +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/services/__init__.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/services/technotemigration_test.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/storage/__init__.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/storage/technotetoml_test.py +0 -0
- {documenteer-2.4.1 → documenteer-2.5.0b2}/tests/test_git_repository.py +0 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: project-mechanics
|
|
3
|
+
description: Project-specific build/test/lint/typing commands for this repo. Read this skill at the start of any phase that runs validation (`stoker-work`, `stoker-fixup`, `stoker-rebase`).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Project mechanics
|
|
7
|
+
|
|
8
|
+
This file is the source of truth for how this repo runs tests, lint,
|
|
9
|
+
and type-checking. Profile-shipped phase skills read it at the start
|
|
10
|
+
of each phase and use the named commands verbatim.
|
|
11
|
+
|
|
12
|
+
Tasks run through nox (via nox-uv). Invoke nox through uv so the runner
|
|
13
|
+
group is provisioned automatically: `uv run --only-group=nox nox ...`.
|
|
14
|
+
The `test`, `typing`, and `demo` sessions are parametrized over both
|
|
15
|
+
Python (3.12, 3.13) and Sphinx (8, 9, dev), so their session IDs carry
|
|
16
|
+
both factors, e.g. `test-3.13(sphinx='8')`. uv furnishes the requested
|
|
17
|
+
interpreter on demand. Run `nox -l` to confirm the exact IDs.
|
|
18
|
+
|
|
19
|
+
## Test commands
|
|
20
|
+
|
|
21
|
+
- `focused_test`: `uv run --only-group=nox nox -s "test-3.13(sphinx='8')" -- -k <test_name>` (posargs after `--` pass through to pytest, so you can also use `uv run --only-group=nox nox -s "test-3.13(sphinx='8')" -- tests/foo_test.py::test_bar`)
|
|
22
|
+
- `complete_test`: `uv run --only-group=nox nox -s "test-3.13(sphinx='8')" "test-3.13(sphinx='9')"`
|
|
23
|
+
|
|
24
|
+
## Coverage
|
|
25
|
+
|
|
26
|
+
Coverage is opt-in. The `test` session runs plain pytest by default, so no
|
|
27
|
+
`.coverage*` files are written during normal validation. To collect coverage
|
|
28
|
+
and print a combined report across the test sessions, set the
|
|
29
|
+
`DOCUMENTEER_COVERAGE` environment variable, e.g.
|
|
30
|
+
`DOCUMENTEER_COVERAGE=1 uv run --only-group=nox nox -s "test-3.13(sphinx='8')" "test-3.13(sphinx='9')"`.
|
|
31
|
+
The `coverage-report` session (combine + report) is triggered automatically
|
|
32
|
+
via `session.notify` when `DOCUMENTEER_COVERAGE` is set, and can also be run
|
|
33
|
+
directly to re-display the last combined report. CI instead sets
|
|
34
|
+
`DOCUMENTEER_COVERAGE_NO_COMBINE` in each matrix cell to skip the
|
|
35
|
+
per-invocation combine and upload raw `.coverage.*` data for a central
|
|
36
|
+
`coverage-combine` job; that flag is CI-only and not needed for local runs.
|
|
37
|
+
|
|
38
|
+
## Lint
|
|
39
|
+
|
|
40
|
+
- `lint_touched`: `uv run --only-group=lint prek run --files {files}`
|
|
41
|
+
- `lint_all`: `uv run --only-group=nox nox -s lint`
|
|
42
|
+
|
|
43
|
+
## Typing
|
|
44
|
+
|
|
45
|
+
- `typing`: `uv run --only-group=nox nox -s "typing-3.13(sphinx='8')"`
|
|
46
|
+
|
|
47
|
+
## Final validation
|
|
48
|
+
|
|
49
|
+
End-of-task validation runs `uv run --only-group=nox nox -s
|
|
50
|
+
"test-3.13(sphinx='8')" "test-3.13(sphinx='9')"` + `uv run --only-group=nox nox -s
|
|
51
|
+
lint` + `uv run --only-group=nox nox -s "typing-3.13(sphinx='8')"` in that
|
|
52
|
+
order, in the foreground, plus `uv run --only-group=nox nox -s
|
|
53
|
+
"demo-3.13(sphinx='9')"` (end-to-end rst/md/ipynb demo technote builds)
|
|
54
|
+
and `uv run --only-group=nox nox -s docs` (Documenteer's own Sphinx docs
|
|
55
|
+
build).
|
|
56
|
+
|
|
57
|
+
The full Python × Sphinx matrix (3.12/3.13 × Sphinx 8/9), `nox -s
|
|
58
|
+
docs-linkcheck` (linkcheck), and `nox -s packaging` (build + twine
|
|
59
|
+
check) are CI's responsibility, not the in-iteration gate.
|
|
60
|
+
|
|
61
|
+
<!-- stoker-onboarded-from: github.com/lsst-sqre/rubin-stoker//profile@main
|
|
62
|
+
prompt-hash: 348ec538f8f7f6fa42da3569d855eab629174668ef28ea225f8b37511daac9d4
|
|
63
|
+
onboarded-at: 2026-06-23T21:19:20Z -->
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stoker-create-pr
|
|
3
|
+
description: Create or update a pull request with a Summary / Validation steps / References body, including `Closes #<task_issue>`, `PRD: #<parent_prd>`, and `Jira: <url>` trailers, and a `DM-XXXXX:`-prefixed title for ticket branches. Use when invoked from `stoker-implement`'s PR step or when the user asks to create a PR, open a pull request, or update a PR body — and you are working in a Rubin stoker-installed repo.
|
|
4
|
+
---
|
|
5
|
+
<!-- stoker-managed: skills:.agents/skills/stoker-create-pr/SKILL.md:f4cd55824c7492db -->
|
|
6
|
+
|
|
7
|
+
# stoker-create-pr — the Rubin PR-creation primitive
|
|
8
|
+
|
|
9
|
+
Create a pull request (or update one that already exists on this
|
|
10
|
+
branch) using a fixed body template that the AFK loop and humans
|
|
11
|
+
both produce identically. This skill is the single source of truth
|
|
12
|
+
for the Rubin profile's PR shape: title format, body sections, and
|
|
13
|
+
the `Closes #N` / `PRD: #N` / `Jira: <url>` trailer conventions.
|
|
14
|
+
|
|
15
|
+
`stoker-implement` delegates here for its PR step. Humans invoke it
|
|
16
|
+
directly for hand-driven PRs.
|
|
17
|
+
|
|
18
|
+
This is the Rubin variant of the default `stoker-create-pr`. It keeps
|
|
19
|
+
the default's create-vs-update logic and multi-task `Closes #N`
|
|
20
|
+
regeneration verbatim, and layers two Rubin conventions on top: a
|
|
21
|
+
`DM-XXXXX:`-prefixed title for `tickets/DM-XXXXX...` branches, and a
|
|
22
|
+
`Jira: <url>` line in References.
|
|
23
|
+
|
|
24
|
+
## Workflow
|
|
25
|
+
|
|
26
|
+
### 1. Gather context
|
|
27
|
+
|
|
28
|
+
Collect these values. Use the first available source for each:
|
|
29
|
+
|
|
30
|
+
- **Task issue** — the `prd-task` whose work this PR delivers. Sources
|
|
31
|
+
in order: current conversation context (e.g. the implement-phase
|
|
32
|
+
prompt) > auto-detect by branch (see below) > ask the user
|
|
33
|
+
(optional — solo PRs without a tracked task are allowed).
|
|
34
|
+
- **Parent PRD** — the task issue's `### Parent PRD` field, when the
|
|
35
|
+
task is part of a PRD breakdown. Optional.
|
|
36
|
+
- **Branch** — the current branch (`git branch --show-current`).
|
|
37
|
+
- **Jira key** — sources in order: current conversation context >
|
|
38
|
+
the branch name when it matches `tickets/<KEY>...` (the `<KEY>`
|
|
39
|
+
segment, e.g. `tickets/DM-12345-add-foo` → `DM-12345`) > the task
|
|
40
|
+
issue's `### Jira Key` field > none. Optional — `u/<login>/<desc>`
|
|
41
|
+
branches and ticket-less PRDs have no Jira key.
|
|
42
|
+
- **Jira URL** — sources in order: the task issue's `### Jira URL`
|
|
43
|
+
field > constructed as `https://rubinobs.atlassian.net/browse/<key>`
|
|
44
|
+
when a Jira key is known > none.
|
|
45
|
+
|
|
46
|
+
#### Auto-detecting the task issue
|
|
47
|
+
|
|
48
|
+
If no task is in context, search by branch:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
gh issue list --label prd-task --state open --json number,title,body --limit 50
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Find the issue whose `### Branch` field matches the current branch
|
|
55
|
+
name. Extract `### Parent PRD`, `### Jira Key`, and `### Jira URL`
|
|
56
|
+
from that issue's body.
|
|
57
|
+
|
|
58
|
+
### 2. Push the branch
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
git status -sb
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
If the branch has no remote tracking branch or has unpushed commits:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
git push -u origin HEAD
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
If the push fails (non-fast-forward, permission denied, network),
|
|
71
|
+
**do not retry or rebase from this skill**. Surface the failure to
|
|
72
|
+
the caller (`stoker-implement` routes to the stuck path; humans get an
|
|
73
|
+
error message).
|
|
74
|
+
|
|
75
|
+
### 3. Detect existing PR
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
gh pr list --head <branch> --json number,title,body,state,baseRefName --limit 1
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Three cases:
|
|
82
|
+
|
|
83
|
+
- **No existing PR** → create a new one (step 4).
|
|
84
|
+
- **Existing PR, state OPEN** → regenerate the body from the branch's
|
|
85
|
+
cumulative scope (step 5).
|
|
86
|
+
- **Existing PR, state CLOSED or MERGED** → skip PR handling. Log
|
|
87
|
+
the fact and return.
|
|
88
|
+
|
|
89
|
+
### 4. Create a new PR
|
|
90
|
+
|
|
91
|
+
**Title.** Derive it from the branch's cumulative scope. This is the
|
|
92
|
+
canonical title rule; step 5 regenerates the title under the same rule
|
|
93
|
+
when a PR already exists.
|
|
94
|
+
|
|
95
|
+
- When a **Jira key** is known, prefix the title: `DM-XXXXX: <concise
|
|
96
|
+
description>`. The description is a concise summary of what this PR
|
|
97
|
+
accomplishes; keep the whole title under 70 characters.
|
|
98
|
+
- With **no Jira key** (a `u/<login>/<desc>` branch or ticket-less
|
|
99
|
+
work), use a plain concise descriptive title under 70 characters.
|
|
100
|
+
|
|
101
|
+
**Body.** Use the template below verbatim.
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
gh pr create --title "<title>" --body "$(cat <<'EOF'
|
|
105
|
+
<body>
|
|
106
|
+
EOF
|
|
107
|
+
)"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 5. Update an existing OPEN PR
|
|
111
|
+
|
|
112
|
+
Regenerate the **title and body** from the branch's full scope so the
|
|
113
|
+
title, Summary, Validation steps, and References all reflect every task
|
|
114
|
+
that has landed, not just the first. The title is regenerated here (not
|
|
115
|
+
left as the first task's title) so it does not go stale as tasks stack
|
|
116
|
+
onto the PR.
|
|
117
|
+
|
|
118
|
+
1. Enumerate every commit since the PR's base. Use `baseRefName` from
|
|
119
|
+
the `gh pr list` JSON; do not hardcode `origin/main`:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
git log origin/<baseRefName>..HEAD --format='%H%n%s%n%b---'
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
2. Take the union of `Closes #N` trailers from those commits, the
|
|
126
|
+
`Closes #N` lines already in the existing PR body's References
|
|
127
|
+
section, and the currently-picked task. (`Refs #N` trailers used
|
|
128
|
+
by stuck WIP commits naturally don't surface here, so stuck work
|
|
129
|
+
never leaks into References or Summary.)
|
|
130
|
+
|
|
131
|
+
3. For each unique `N`, fetch the issue:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
gh issue view <N> --json number,title,body,state
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Pull manual-QA bullets from the issue's `### Acceptance criteria`
|
|
138
|
+
field (if present) for the Validation steps section. Also re-read
|
|
139
|
+
the `### Jira Key` / `### Jira URL` fields here so the `Jira:`
|
|
140
|
+
reference stays correct after the first task.
|
|
141
|
+
|
|
142
|
+
4. Compose a fresh body using the template:
|
|
143
|
+
|
|
144
|
+
- **Summary** — 1–3 bullets (up to 5 if scope is genuinely
|
|
145
|
+
diverse). Collapse multiple commits advancing the same slice
|
|
146
|
+
into one bullet.
|
|
147
|
+
- **Validation steps** — union of manual-QA items from every
|
|
148
|
+
referenced task. Drop bullets CI already covers and bullets
|
|
149
|
+
superseded by later commits.
|
|
150
|
+
- **References** — one `Closes #N` per referenced task, sorted
|
|
151
|
+
ascending; then `PRD: #<parent_prd>` (omit if none); then
|
|
152
|
+
`Jira: <url>` (omit if no Jira key). Sorted + deduped is
|
|
153
|
+
idempotent by construction.
|
|
154
|
+
|
|
155
|
+
5. Regenerate the title from the same cumulative branch scope, applying
|
|
156
|
+
the same rule as step 4 — including the `DM-XXXXX:` prefix when a
|
|
157
|
+
Jira key is known, and the same <70-character limit. Do **not**
|
|
158
|
+
reuse the existing PR title; recompute it so it reflects every task
|
|
159
|
+
that has landed. All tasks on a branch share one ticket, so the
|
|
160
|
+
`DM-XXXXX:` prefix is stable across regenerations — only the
|
|
161
|
+
description after it changes.
|
|
162
|
+
|
|
163
|
+
6. Apply the title and body together (`--title` and `--body` in one
|
|
164
|
+
`gh pr edit`, so the title never lags the body):
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
gh pr edit <pr_number> --title "<title>" --body "$(cat <<'EOF'
|
|
168
|
+
<body>
|
|
169
|
+
EOF
|
|
170
|
+
)"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 6. Report the URL
|
|
174
|
+
|
|
175
|
+
After create or edit, print the PR URL so the caller can surface it
|
|
176
|
+
to the user (or the comment-and-close steps in `stoker-implement`).
|
|
177
|
+
|
|
178
|
+
## PR body template
|
|
179
|
+
|
|
180
|
+
```markdown
|
|
181
|
+
## Summary
|
|
182
|
+
|
|
183
|
+
<1–3 bullets describing what this PR does and why, in user / PRD-
|
|
184
|
+
level language. Draw ground truth from the commits on this branch;
|
|
185
|
+
draw user-facing framing from the task issue title.>
|
|
186
|
+
|
|
187
|
+
## Validation steps
|
|
188
|
+
|
|
189
|
+
<Bulleted manual-QA checklist for verifying the change. Omit anything
|
|
190
|
+
CI runs automatically (no linting, type-checking, or automated test
|
|
191
|
+
suite items). Only manual verification.>
|
|
192
|
+
|
|
193
|
+
## References
|
|
194
|
+
|
|
195
|
+
- Closes #<task_issue>
|
|
196
|
+
- PRD: #<parent_prd> <!-- omit if no parent PRD -->
|
|
197
|
+
- Jira: <jira_url> <!-- omit if no Jira key -->
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Rules for the References section:
|
|
201
|
+
|
|
202
|
+
- Use `Closes #<task_issue>` so the task auto-closes on merge.
|
|
203
|
+
- Omit the `PRD:` line if there is no parent PRD.
|
|
204
|
+
- Omit the `Closes #` line if there is no task issue (a hand-driven
|
|
205
|
+
PR with no tracked task).
|
|
206
|
+
- Omit the `Jira:` line if there is no Jira key.
|
|
207
|
+
- For multi-task branches, include one `Closes #N` per referenced
|
|
208
|
+
task, sorted ascending. There is a single `Jira:` line per PR (all
|
|
209
|
+
tasks on a branch share one ticket).
|
|
210
|
+
|
|
211
|
+
## Example output
|
|
212
|
+
|
|
213
|
+
For a branch `tickets/DM-45678-run-harness-flag`:
|
|
214
|
+
|
|
215
|
+
```markdown
|
|
216
|
+
## Summary
|
|
217
|
+
|
|
218
|
+
- Add `--harness` flag to `stoker run` so an iteration can be locked
|
|
219
|
+
to a single harness regardless of profile defaults.
|
|
220
|
+
- Validate the harness name against the registered-harness registry
|
|
221
|
+
and fail fast on unknown values.
|
|
222
|
+
|
|
223
|
+
## Validation steps
|
|
224
|
+
|
|
225
|
+
- Run `stoker run --harness codex 1` against a fixture issue and
|
|
226
|
+
confirm the implement+review phases both invoke codex.
|
|
227
|
+
- Run `stoker run --harness foo 1` and confirm it exits with a
|
|
228
|
+
non-zero code before any container work starts.
|
|
229
|
+
- Run `stoker run 1` (no flag) and confirm behavior is unchanged.
|
|
230
|
+
|
|
231
|
+
## References
|
|
232
|
+
|
|
233
|
+
- Closes #45
|
|
234
|
+
- PRD: #41
|
|
235
|
+
- Jira: https://rubinobs.atlassian.net/browse/DM-45678
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
The PR title for that branch would be
|
|
239
|
+
`DM-45678: Add --harness flag to stoker run`.
|
|
240
|
+
|
|
241
|
+
## Notes
|
|
242
|
+
|
|
243
|
+
- This skill is the PR-creation primitive shared by `stoker-implement`
|
|
244
|
+
and direct human use. Keep the body shape stable — the AFK loop's
|
|
245
|
+
multi-task PR-update logic depends on the exact section names and
|
|
246
|
+
trailer format above.
|
|
247
|
+
- This skill never calls Jira. The Jira URL comes entirely from the
|
|
248
|
+
task issue's `### Jira URL` field (written interactively by
|
|
249
|
+
`stoker-prd-to-issues`) or is constructed from the key in the branch
|
|
250
|
+
name. The sandbox AFK loop is GitHub-only — it has no Jira creds,
|
|
251
|
+
MCP, or firewall egress to Jira.
|
|
252
|
+
- No `Co-authored-by:` trailer (signing, if configured, is
|
|
253
|
+
self-identifying).
|
|
254
|
+
- No "Files changed" section — `git show` and the GitHub UI cover
|
|
255
|
+
that.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stoker-fixup
|
|
3
|
+
description: Apply a trusted blocking stoker-review's findings to one PR — read the latest review JSON from the PR, fix what you agree with, re-validate against this repo's project-mechanics, push, and post a follow-up comment for anything you skip. Use when invoked from the stoker fixup-phase prompt, or when the user asks to address a stoker review's findings on a PR — and you are working in a stoker-installed repo. Consumes project-mechanics (Phase 0.5 prelude) and MAY delegate to stoker-work.
|
|
4
|
+
---
|
|
5
|
+
<!-- stoker-managed: skills:.agents/skills/stoker-fixup/SKILL.md:af03e4d9e06dbebb -->
|
|
6
|
+
|
|
7
|
+
# stoker-fixup — apply a review's findings to one PR
|
|
8
|
+
|
|
9
|
+
You are the **fixup** primitive of the stoker AFK loop. A prior review
|
|
10
|
+
phase posted a trusted **blocking** `stoker-review` on an open PR, and a
|
|
11
|
+
selection phase picked that PR because its findings are still unaddressed
|
|
12
|
+
(the review's `head_sha` still equals the PR's current head). The host
|
|
13
|
+
has already checked out the PR's head branch. Your job is to address the
|
|
14
|
+
review: apply the findings you agree with, re-validate, push, and explain
|
|
15
|
+
anything you skip.
|
|
16
|
+
|
|
17
|
+
You inspect the PR's **reviews** and its diff; you never read issue or PR
|
|
18
|
+
**comments** — that is stoker's trust boundary. You may *post* a
|
|
19
|
+
follow-up comment (writing is fine); you must never *read* comments.
|
|
20
|
+
|
|
21
|
+
## Phase 0: Branch safety
|
|
22
|
+
|
|
23
|
+
The host has already checked out the PR's head branch — confirm with
|
|
24
|
+
`git branch --show-current` and verify it is **not** `main`. If you are
|
|
25
|
+
somehow on `main`, stop and report the problem rather than committing
|
|
26
|
+
there.
|
|
27
|
+
|
|
28
|
+
## Phase 0.5: Read project mechanics
|
|
29
|
+
|
|
30
|
+
Before continuing, read `.claude/skills/project-mechanics/SKILL.md`. It
|
|
31
|
+
defines this repo's `focused_test` / `complete_test` / `lint_touched` /
|
|
32
|
+
`lint_all` / `typing` commands and any monorepo selectors. If the file is
|
|
33
|
+
missing, stop and ask the user how to run tests/lint in this repo before
|
|
34
|
+
proceeding — do not guess.
|
|
35
|
+
|
|
36
|
+
The phases below reference these command names verbatim. When you see
|
|
37
|
+
`<lint_all>`, substitute the value from the `## Lint` section, and so on.
|
|
38
|
+
|
|
39
|
+
## Phase 1: Read the review findings
|
|
40
|
+
|
|
41
|
+
The PR number is in the prompt that invoked you. Read the PR's reviews
|
|
42
|
+
(not its comments) and recover the latest `stoker-review` sentinel:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
gh api /repos/<owner>/<name>/pulls/<PR_NUMBER>/reviews
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Walk the reviews newest-first, find the most recent body containing a
|
|
49
|
+
`<!-- stoker-review-begin v1 -->` … `<!-- stoker-review-end -->` block,
|
|
50
|
+
and parse the fenced JSON. The `findings` array (each with `summary`,
|
|
51
|
+
optional `severity` / `category` / `file` / `line_start` / `line_end` /
|
|
52
|
+
`suggested_fix`) is your work list. Use `gh pr diff <PR_NUMBER>` and read
|
|
53
|
+
the relevant source to understand each finding in context.
|
|
54
|
+
|
|
55
|
+
## Phase 2: Apply the findings
|
|
56
|
+
|
|
57
|
+
Work through the findings. For each one, decide whether you agree it
|
|
58
|
+
should be fixed:
|
|
59
|
+
|
|
60
|
+
- **Substantial findings** — a logic/correctness fix, a missing test, new
|
|
61
|
+
or changed behavior — warrant the full red/green/refactor discipline.
|
|
62
|
+
Delegate to the `stoker-work` skill (Phases 1–4) for those, so the fix
|
|
63
|
+
lands with a test and a clean validation fixpoint.
|
|
64
|
+
- **Trivial findings** — a rename, a dead-code removal, a comment fix —
|
|
65
|
+
can be applied in place; you will re-validate in Phase 3 regardless.
|
|
66
|
+
|
|
67
|
+
Keep a running list of which findings you **applied** and which you
|
|
68
|
+
**skipped** (and why) — Phase 4 needs it.
|
|
69
|
+
|
|
70
|
+
## Phase 3: Re-validate
|
|
71
|
+
|
|
72
|
+
After applying the findings, reach a clean validation fixpoint against
|
|
73
|
+
`project-mechanics` (skip this only if you applied nothing at all):
|
|
74
|
+
|
|
75
|
+
1. `git add -N` any new untracked files so the full-tree tools see them.
|
|
76
|
+
2. Run `<lint_all>`, then `<typing>`, then `<complete_test>`. Fix any
|
|
77
|
+
failure before continuing.
|
|
78
|
+
3. If anything auto-fixed code, fixpoint-loop on `<lint_touched>` over the
|
|
79
|
+
touched files until it exits clean.
|
|
80
|
+
4. `git reset HEAD` the intent-to-add files so the commit step stages
|
|
81
|
+
with intentionality.
|
|
82
|
+
|
|
83
|
+
If validation cannot be made green within this phase, do not push broken
|
|
84
|
+
state — commit what you have as a WIP, leave the branch un-pushed if
|
|
85
|
+
appropriate, and report the blocker.
|
|
86
|
+
|
|
87
|
+
## Phase 4: Explain skipped findings (disagreement path)
|
|
88
|
+
|
|
89
|
+
For every finding you deliberately **skipped**, post a single follow-up
|
|
90
|
+
comment on the PR explaining why — humans remain the final arbiter:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
gh pr comment <PR_NUMBER> --body "<explanation>"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
This is a plain comment (do **not** wrap it in a `stoker-review`
|
|
97
|
+
sentinel — that would look like a new review to later iterations). If you
|
|
98
|
+
applied every finding, skip this phase.
|
|
99
|
+
|
|
100
|
+
## Phase 5: Commit and push
|
|
101
|
+
|
|
102
|
+
Stage the files you changed (`git add <paths>`) and commit with a concise
|
|
103
|
+
imperative message describing the findings you addressed, e.g.:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
Address review findings on PR #<PR_NUMBER>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Commit plainly — **never** pass `--no-gpg-sign` / `-c
|
|
110
|
+
commit.gpgsign=false` or otherwise disable signing (stoker configures
|
|
111
|
+
signing before you run; a signing failure is a sandbox bug to report, not
|
|
112
|
+
to bypass). Then push the branch:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
git push
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The push advances the PR's head past the reviewed `head_sha`, which is
|
|
119
|
+
what clears this PR from the fixup-candidate set on the next iteration
|
|
120
|
+
(review-once: stoker does not re-review after a fixup). If you applied no
|
|
121
|
+
findings at all, there is nothing to push — the PR stays as a human
|
|
122
|
+
decides.
|
|
123
|
+
|
|
124
|
+
## Finish
|
|
125
|
+
|
|
126
|
+
End your response with a single `<stoker-status>done</stoker-status>`
|
|
127
|
+
marker once the fixup is complete, so the host knows the phase ran. Do
|
|
128
|
+
not emit any `<stoker-pick>` or `stoker-review` markers.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stoker-implement
|
|
3
|
+
description: Drive a single pre-selected task through stoker-work's TDD cycle and commit/push/PR/close it (or stuck-mark it on failure). Use when invoked from the implement-phase prompt — the host has already picked the task and checked out its branch.
|
|
4
|
+
---
|
|
5
|
+
<!-- stoker-managed: skills:.agents/skills/stoker-implement/SKILL.md:a4de715878f733e0 -->
|
|
6
|
+
|
|
7
|
+
# stoker-implement — drive one pre-selected stoker task to completion
|
|
8
|
+
|
|
9
|
+
You are operating inside the **implementation** phase of a two-phase
|
|
10
|
+
stoker iteration driven by `stoker run`. By the time this skill is
|
|
11
|
+
invoked:
|
|
12
|
+
|
|
13
|
+
- The host has already run a separate selection phase that picked
|
|
14
|
+
exactly one task.
|
|
15
|
+
- The host has already checked out the task's branch inside the
|
|
16
|
+
container.
|
|
17
|
+
- The implement-phase prompt you just received carries the picked
|
|
18
|
+
task's issue number, branch, full issue body, parent PRD body (if
|
|
19
|
+
any), and current git state.
|
|
20
|
+
|
|
21
|
+
Your job is to take that one task from here through red/green/
|
|
22
|
+
refactor, then commit/push/open-PR/close — or route to the stuck
|
|
23
|
+
path on failure.
|
|
24
|
+
|
|
25
|
+
If no other memo or instruction contradicts it, the commit / PR
|
|
26
|
+
conventions in this skill are authoritative for this iteration.
|
|
27
|
+
|
|
28
|
+
## Phase 1: Drive the task through TDD
|
|
29
|
+
|
|
30
|
+
Follow **Phases 0.5–4** of `.claude/skills/stoker-work/SKILL.md`:
|
|
31
|
+
|
|
32
|
+
- Phase 0.5 (Read project mechanics) — `stoker-work` will load
|
|
33
|
+
`.claude/skills/project-mechanics/SKILL.md` for the repo's command
|
|
34
|
+
names. If that file is missing, route to the stuck path (Phase 4
|
|
35
|
+
below).
|
|
36
|
+
- Phase 1 (Understand the task) — read the issue body (provided in
|
|
37
|
+
the prompt), the parent PRD body (if provided), and relevant code.
|
|
38
|
+
- Phase 2 (Plan) — only if not already pre-planned by the task body.
|
|
39
|
+
- Phase 3 (Red/green/refactor) — one test, one behavior at a time.
|
|
40
|
+
- Phase 4 (Final validation) — runs `<lint_all>` + `<typing>` +
|
|
41
|
+
`<complete_test>` against the project-mechanics commands and
|
|
42
|
+
guarantees a clean fixpoint, with the intent-to-add files reset
|
|
43
|
+
so this skill stages with intentionality.
|
|
44
|
+
|
|
45
|
+
If `stoker-work` Phase 4 cannot be made green within this iteration
|
|
46
|
+
(e.g. pre-existing test failures, missing upstream dependency, or
|
|
47
|
+
the project-mechanics file is missing), route to the stuck path
|
|
48
|
+
(Phase 4 of *this* skill) — do not push broken state.
|
|
49
|
+
|
|
50
|
+
**Turn-end invariant.** Your turn must not end until you have either
|
|
51
|
+
(success) committed, pushed, opened/updated the PR, and closed the
|
|
52
|
+
issue, or (failure) taken the stuck path. Never end your turn with a
|
|
53
|
+
dirty working tree, with validation still running in the background, or
|
|
54
|
+
on a `Monitor` wait for a still-running command. This covers **any**
|
|
55
|
+
project-mechanics command in **any** phase — including a Phase 3 Red/Green
|
|
56
|
+
`<focused_test>`, not just Phase 4's final validation. Under `stoker run`
|
|
57
|
+
the agent is single-shot headless, so ending your turn (or waiting on a
|
|
58
|
+
backgrounded test via `Monitor`) kills the run before the work reports
|
|
59
|
+
and leaves the tree dirty — the host's next iteration will abort on it.
|
|
60
|
+
Run every such command in the foreground and block on it, however long
|
|
61
|
+
it takes.
|
|
62
|
+
|
|
63
|
+
## Phase 2: Commit (success path)
|
|
64
|
+
|
|
65
|
+
`stoker-work` Phase 4 already left the working tree at a fixpoint with
|
|
66
|
+
the original untracked-file state restored. Do not re-run
|
|
67
|
+
`<lint_all>` here — that's the inverse of "fixpoint, then stage once
|
|
68
|
+
with intentionality." Just stage and commit.
|
|
69
|
+
|
|
70
|
+
Stage with `git add <paths>` listing every path that should land in
|
|
71
|
+
this commit. `git add -A` is allowed only if you've already verified
|
|
72
|
+
every working-tree change is intentional.
|
|
73
|
+
|
|
74
|
+
Commit using this template verbatim — both `Key decisions:` and
|
|
75
|
+
`Next-iteration notes:` are required sections so the next
|
|
76
|
+
iteration's selection phase can parse them from `git log`:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
<imperative subject, ≤70 chars>
|
|
80
|
+
|
|
81
|
+
<1–2 sentence paragraph describing what this slice does and why.>
|
|
82
|
+
|
|
83
|
+
Key decisions:
|
|
84
|
+
- <non-obvious design choice>
|
|
85
|
+
- <another, if any>
|
|
86
|
+
|
|
87
|
+
Next-iteration notes:
|
|
88
|
+
- <migrations to run, scaffolding left in place, assumed state — or "None.">
|
|
89
|
+
|
|
90
|
+
Closes #<task_issue>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
No `Co-authored-by:` trailer (signing, if configured, is
|
|
94
|
+
self-identifying). No files-changed section (`git show` covers it).
|
|
95
|
+
|
|
96
|
+
**Do not disable signing.** Whether commits are signed is controlled
|
|
97
|
+
by `git config commit.gpgsign`, which `stoker run` configures from
|
|
98
|
+
the profile's signing secrets before the agent ever runs. Run `git
|
|
99
|
+
commit` plainly; never pass `-c commit.gpgsign=false`,
|
|
100
|
+
`--no-gpg-sign`, or any other flag that disables signing on a single
|
|
101
|
+
invocation. If a commit fails because signing is misconfigured, that
|
|
102
|
+
is a sandbox / profile bug to escalate via the stuck path — not
|
|
103
|
+
something to paper over per-commit.
|
|
104
|
+
|
|
105
|
+
**Pre-commit hook retries:** if `git commit`'s hook fails (the
|
|
106
|
+
staged-file run catches something `stoker-work` Phase 4's full-tree pass
|
|
107
|
+
missed), fix the reported issue, re-stage, and create a **new**
|
|
108
|
+
commit (never `--amend`, never `--no-verify`). After **3**
|
|
109
|
+
consecutive failed commit attempts in this iteration, route to the
|
|
110
|
+
stuck path.
|
|
111
|
+
|
|
112
|
+
## Phase 3: Push, PR, close
|
|
113
|
+
|
|
114
|
+
PR creation is delegated to the `stoker-create-pr` skill — it owns title
|
|
115
|
+
format, body shape, the `Closes #N` / `PRD:` trailers, and the
|
|
116
|
+
"create new vs. update existing OPEN PR" branching. Invoke it now,
|
|
117
|
+
passing the picked task issue's number and parent PRD (if any) as
|
|
118
|
+
context.
|
|
119
|
+
|
|
120
|
+
`stoker-create-pr` will:
|
|
121
|
+
|
|
122
|
+
- Push the branch.
|
|
123
|
+
- Detect whether an open PR already exists for the branch.
|
|
124
|
+
- Either create a new PR or regenerate the existing OPEN PR's body
|
|
125
|
+
from the branch's cumulative scope.
|
|
126
|
+
- Skip handling if the PR is already MERGED / CLOSED.
|
|
127
|
+
|
|
128
|
+
If `stoker-create-pr` reports a push failure (non-fast-forward, permission,
|
|
129
|
+
network), **do not** retry or rebase from here. Route to the stuck
|
|
130
|
+
path (Phase 4 of this skill).
|
|
131
|
+
|
|
132
|
+
After `stoker-create-pr` returns the PR URL (or the merged-PR signal),
|
|
133
|
+
proceed with the comment + close steps below.
|
|
134
|
+
|
|
135
|
+
Comment on the task issue:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
✓ Implemented in commit `<sha>` — PR #<pr_number>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Close the task issue:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
gh issue close <task_issue>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Closing immediately (rather than waiting for PR merge) lets the
|
|
148
|
+
next iteration's host filter see dependent tasks become eligible.
|
|
149
|
+
If the PR is later rejected, the issue must be manually reopened —
|
|
150
|
+
this tradeoff is accepted.
|
|
151
|
+
|
|
152
|
+
## Phase 4: Stuck path
|
|
153
|
+
|
|
154
|
+
Use this path when:
|
|
155
|
+
|
|
156
|
+
- `stoker-work` Phase 4 validation cannot be made green in this iteration.
|
|
157
|
+
- `stoker-create-pr` reports a push failure (non-fast-forward, permission,
|
|
158
|
+
network).
|
|
159
|
+
- 3 consecutive pre-commit hook failures.
|
|
160
|
+
- `.claude/skills/project-mechanics/SKILL.md` is missing and you
|
|
161
|
+
could not safely guess the test/lint commands.
|
|
162
|
+
- Any other blocker that prevents a clean commit + push + close.
|
|
163
|
+
|
|
164
|
+
(Branch-resolution failures are handled by the host before this
|
|
165
|
+
skill is invoked, so you will not reach this path for a missing or
|
|
166
|
+
malformed branch.)
|
|
167
|
+
|
|
168
|
+
Steps:
|
|
169
|
+
|
|
170
|
+
1. Stage what you have. Commit with the stuck template:
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
WIP(stuck) <imperative subject>
|
|
174
|
+
|
|
175
|
+
<paragraph: what was attempted.>
|
|
176
|
+
|
|
177
|
+
Blocking:
|
|
178
|
+
- <why stuck>
|
|
179
|
+
|
|
180
|
+
Refs #<task_issue>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
2. Push the branch.
|
|
184
|
+
3. **Do not** create or update a PR.
|
|
185
|
+
4. Comment on the task issue describing what was attempted and
|
|
186
|
+
what's blocking.
|
|
187
|
+
5. Add the stuck label:
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
gh issue edit <task_issue> --add-label agent-stuck
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
6. **Do not** close the issue.
|
|
194
|
+
|
|
195
|
+
A human clears the `agent-stuck` label to re-enable the issue in
|
|
196
|
+
later runs.
|
|
197
|
+
|
|
198
|
+
After Phase 3 (success) or Phase 4 (stuck), simply end your response.
|
|
199
|
+
The host loop owns the iteration sentinel and continues on its own.
|