Agent skill, license/publish template options, repo CI, and modernization (tbd v0.2.3)#25
Conversation
Refreshes generated skills and hooks via tbd setup --auto, bumps the pinned get-tbd version in the session script, and adds the new v0.2.x integration surfaces (AGENTS.md with repo-specific build/conventions sections filled in, portable .agents skill, Codex hooks). https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Maps out making the template directly usable by AI coding agents: a single installable skill (skills/simple-modern-uv) covering new project, adopt-existing, and update workflows; license and publish-to-PyPI template options; AGENTS.md in template output; agent-first README with uvtemplate demoted; CI for this repo (render smoke tests + skill validation); version currency; and a summary of uv changes since March 2025 with action items. Tracked as nine beads linked to the spec. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Adds a User Flows section defining the shared interview contract (infer, confirm once, execute, verify, next steps) across the three flows: new project, upgrade existing project, update templated project. Adds references/faq.md to the skill for common migration problems and surfaces Flow 2's no-safe-default decision points (requires-python floor, src layout, first version tag). Per author decision, uvtemplate is now removed entirely rather than demoted: all references in this repo go away, and the follow-up is a full retirement (deprecation note, final pointer release, archive). https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Essentials (kebab-case package/repo name with derived snake_case module, description, license, publish-or-not) are the only decisions surfaced to the user; src/ layout, v0.1.0 initial tag, and the 3.11+ floor become silently applied conventions. The one Flow 2 exception: shrinking a published package's Python support matrix is surfaced. Adds answer-schema evolution rules to D2 so copier update stays clean when questions are added: behavior-preserving defaults (vanilla update is a no-op), skill-side reconciliation of hand customizations via explicit --data, an update-path test in CI, and release-notes callouts as standing policy. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
package_license offers MIT (default), Apache-2.0, BSD-3-Clause, and Proprietary, driving the LICENSE file (canonical SPDX texts) and the pyproject license field. publish_to_pypi=false excludes publish.yml and docs/publishing.md from the render, adds the Private :: Do Not Upload classifier, and drops publishing cross-references. Defaults are behavior-preserving: a default render is byte-identical to the previous template output (verified by diffing against a render of the prior commit), so existing projects updating with --defaults see no change. Also recommends kebab-case package names in the package_name help. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
All upgrades clear the 14-day supply-chain cooloff (cutoff 2026-05-28): uv 0.11.12 -> 0.11.17 in CI workflows, ruff floor >=0.15.15, basedpyright floor >=1.39.6. pytest/pytest-sugar/codespell/rich/funlog/ uv-dynamic-versioning already at latest. setup-uv v8.2.0 (Jun 3) and checkout v6.0.3 (Jun 2) are inside the cooloff window, so v8.1.0 and floating @v6 stay. Adds [tool.uv] required-version = ">=0.9" so projects fail fast on uv versions that predate relative-duration UV_EXCLUDE_NEWER support. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Generated projects now ship a concise AGENTS.md (agents.md standard): uv/make commands, src-layout and tooling conventions, versioning rules, and a CLAUDE.md symlink note for Claude Code. Conditional publishing line follows publish_to_pypi. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
basedpyright floor already bumped to 1.39.6 in the currency commit; config toggles reviewed, no changes needed. Adds the uv 0.11.18 preview 'uv check' command as a revisit signal: once stable, ty is the zero-config checker for uv projects. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
skills/simple-modern-uv/SKILL.md routes three workflows (new project, upgrade existing project, update templated project) under a two-tier interview contract: essentials the user confirms once (kebab-case package name with derived snake_case module, description, license, publish-or-not), conventions applied silently (src/ layout, v0.1.0 first tag, 3.11+ floor). All commands pin uvx copier@9.15.1. References carry the bulk: adopt-existing.md (render-and-merge migration with Poetry/setuptools/PDM translations), customize.md (license, private packages, reconciling new template questions on update), faq.md (dynamic-versioning tags, basedpyright on legacy code, copier conflicts, OIDC publish setup, cooloff resolution). Validates with skills-ref; installable via npx skills add jlevy/simple-modern-uv or raw-URL fetch. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
"In a Hurry?" and Option 1 now lead with the agent skill (npx skills add jlevy/simple-modern-uv, per-flow prompts, zero-install raw-URL variant). The uvtemplate badge, walkthrough, and publishing.md cross-reference are removed; a one-line retirement note remains. The "Agent Rules" section becomes "Agent Support," reflecting that AGENTS.md and Agent Skills are now stable standards the template ships. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Four jobs on every push/PR: doc format check; render smoke tests for the default and proprietary/no-publish variants (full sync/lint/test/build on each render, with variant-specific output assertions); the update-path test from the previous release tag (converges to a fresh render with --defaults, honors --data overrides for newer questions); and agent-skill validation (skills-ref plus relative-link resolution). The downstream simple-modern-uv-template repo remains the release gate; this makes PRs to the template self-validating. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
updating.md now reflects the split: this repo's CI makes PRs self-validating (renders, update-path test, skill validation) while the downstream repo remains the release gate. Adds the standing answer-schema evolution policy for future template-question changes and the skill to the update checklist. research-uv-changes.md is a living doc tracking uv 0.6.x -> 0.11.x changes relevant to the template, with the decisions: stay on hatchling + uv-dynamic-versioning (uv_build has no plugin support), required-version >=0.9 (done), watch uv audit / UV_MALWARE_CHECK (preview), keep devtools/lint.py over uv format/check, add Python 3.15 when final. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
updating.md now reflects the split: this repo's CI makes PRs self-validating (renders, update-path test, skill validation) while the downstream repo remains the release gate. Adds the standing answer-schema evolution policy for future template-question changes and the skill to the update checklist. research-uv-changes.md is a living doc tracking uv 0.6.x -> 0.11.x changes relevant to the template, with the decisions: stay on hatchling + uv-dynamic-versioning (uv_build has no plugin support), required-version >=0.9 (done), watch uv audit / UV_MALWARE_CHECK (preview), keep devtools/lint.py over uv format/check, add Python 3.15 when final. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
All in-repo implementation items are checked off. Remaining: skill activation testing in scratch repos, downstream release-gate validation, and the external uvtemplate retirement (post-release). https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
UV_EXCLUDE_NEWER at workflow level blocked uvx flowmark-rs@0.3.1 in format-check (published 2026-05-30, inside the 14-day window). The cool-off governs template dependency resolution, so it now lives on the render-test and update-path jobs; format-check runs only the Makefile's explicitly pinned formatter. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Title Case for H2/H3 headings in the skill references and updating.md, guideline footers on the new docs (SKILL.md, references, AGENTS.md template), "or" instead of "/" in prose, and present-state phrasing: past-behavior asides removed from the README and copier.yml comments (release notes carry change history). The skill's update workflow now states the durable rule for finding unanswered questions instead of naming today's new keys. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Per common-doc-guidelines, full stops, commas, colons, and semicolons replace em dashes across the skill, its references, the AGENTS.md template, the uv research doc, and the new README/AGENTS.md sections. Inline list headings use the boldfaced-colon form. Also fixes a stale cross-reference to the retitled "Reconciling New Questions on Update" section and converts "+" to prose conjunctions. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
AGPL-3.0-or-later renders the canonical GNU AGPL text. None renders no LICENSE file (conditional filename) and no license field, with a pyproject comment pointing at how to choose later. MIT remains the default, so update behavior is unchanged; verified locally that a v0.2.27 render updates to HEAD across the LICENSE template rename with zero conflicts and converges to a fresh render. CI gains a no-license render variant. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Replaces remaining em dashes with commas, colons, and semicolons per common-doc-guidelines, including the pre-existing ones in the README type-checker and repo-setup sections and the template's development and publishing docs. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Step 7 now says when to cut a minor vs patch release and requires naming new question keys and defaults in release notes, matching the answer-schema policy. Also drops the stale claim that this repo has no CI. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Generated projects now include a two-line CLAUDE.md that imports AGENTS.md via Claude Code's @file syntax, replacing the manual symlink suggestion (committed symlinks behave poorly across platforms). The upgrade flow handles pre-existing files: keep user content, fold in build/test commands or add the import line rather than overwriting. CI asserts both files render. README: "In a Hurry?" and "Agent Support" merge into one "Agent Quick Start" section, and the intro notes the template also upgrades existing projects, with the skill covering both workflows. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
jlevy
left a comment
There was a problem hiding this comment.
Senior Engineering Review
Reviewed PR #25 at 66c75e1fb7a6336e2754287162580c4f799150f6 using tbd shortcut review-github-pr / review-code, checked out the branch locally as codex/review-pr-25, and exercised the new-project path in a temporary GitHub repo: https://github.com/jlevy/test-smu-1.
Findings
-
[P1] New-project setup leaves the editable install stuck at
0.0.0.
The new-project instructions runuv sync --all-extrasbefore the first commit inskills/simple-modern-uv/SKILL.md:92-99,README.md:347-353, and the Copier after-copy message incopier.yml:17-23. I followed that sequence in/private/tmp/test-smu-1: aftergit init,uv sync --all-extras, and the initial commit,uv run python -c "from importlib.metadata import version; print(version('test-smu-1'))"still returned0.0.0.uv buildcomputed0.0.1.dev1+61fedbf, anduv sync --reinstall-package test-smu-1then updated the installed metadata to0.0.1.dev1+61fedbf. CI does not catch this because the render test commits and tags before the first sync (.github/workflows/ci.yml:90-104). Fix the user/agent setup sequence so the first editable install happens after a commit, or explicitly reinstall the local package after the initial commit. -
[P2] The gh setup hook falsely warns on valid keyring auth and points to a missing doc.
Both.codex/ensure-gh-cli.sh:109-121and.claude/scripts/ensure-gh-cli.sh:109-121only treatGH_TOKENas an authenticated state. On this machine,gh auth statussucceeds asjlevyvia keyring, but running either hook printsNOTE: GH_TOKEN not set - some operations may require authenticationand links todocs/general/agent-setup/github-cli-setup.md, which is not in this repo. The hook should rungh auth statusregardless of whetherGH_TOKENis set, report success for any valid gh auth mechanism, and only warn/fail whengh auth statusactually fails. -
[P2] New CI/agent instructions still execute unpinned moving targets.
The new root CI usesnpx --yes skills-ref@latestfor validation (.github/workflows/ci.yml:165-166), and the new rootAGENTS.mdsmoke-test example uses unpinneduvx copier copy(AGENTS.md:32-35). The newly added root CI also uses the floatingactions/checkout@v6tag in each job (.github/workflows/ci.yml:34,57,116,164) even though the docs and PR text emphasize pinned tools and the 14-day cool-off. These paths bypass the uv cool-off entirely and can change or fail independently of the PR. Pinskills-ref, pin theuvx copier@9.15.1examples, and use an exact checkout version or SHA if the policy is immutable action refs. -
[P3] README still tells users to hand-edit outputs for the new template questions.
README.md:292-296still says to updatelicense/LICENSEmanually and delete.github/workflows/publish.ymlif not publishing. That contradicts the newpackage_licenseandpublish_to_pypianswers and can leave.copier-answers.ymlinconsistent, causing future updates to reintroduce or revert those files. Replace that paragraph with the new answer-based flow and link toskills/simple-modern-uv/references/customize.md.
Validation Performed
gh auth status: authenticated asjlevy.gh pr checks 25 --repo jlevy/simple-modern-uv: all 5 PR checks passing.- Checked out PR branch locally at
66c75e1. make format-check: pass.npx --yes skills-ref@latest validate skills/simple-modern-uv: pass, with npm config warnings.- Rendered PR head with
uvx copier@9.15.1 copy --defaults --vcs-ref=HEAD ... --data publish_to_pypi=falseinto/private/tmp/test-smu-1; verified publish workflow/docs were omitted. - Generated project local checks:
make lint-checkpass,make testpass,uv buildpass. - Created and pushed temporary sandbox repo
jlevy/test-smu-1; its generated GitHub Actions CI passed on Python 3.11, 3.12, 3.13, and 3.14. - Tested repo-local agent hooks: Codex/Claude
tbd-session.sh --briefworks; Codex post-tool closing reminder works with a samplegit pushpayload; gh setup hook has the false-auth warning described above.
No existing PR comments or review threads were unresolved at review time.
Setup sequence (P1): sync after the first commit everywhere (SKILL.md, README, copier next-steps message) so dynamic versioning gives the editable install a real version instead of 0.0.0; CI's render job now follows the documented sequence and asserts the installed version; FAQ gains the uv sync --reinstall-package recovery note. gh setup hook (P2): trust `gh auth status` over GH_TOKEN presence, so keyring auth no longer false-warns; the dead doc link is replaced with a `gh auth login` hint (both .claude and .codex copies). Pins (P2): skills-ref@0.1.5 in CI, copier@9.15.1 in the AGENTS.md example, and actions/checkout pinned to the immutable v6.0.2 in this repo's and the template's workflows, matching the stated supply-chain policy; updating.md examples updated. README (P3): the hand-edit license/publish paragraph is replaced with the answer-based flow, linking the skill's customize guide. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
Skill Definition Follow-UpI reread Overall, the skill definition looks clean and concise. It follows the important baseline practices: standard Additional suggestions:
I would not inline the reference files into the main skill body. The current progressive-disclosure split is the right shape; the changes above are mostly about tool pre-approval, version consistency, and activation testing. |
|
All four findings addressed in the latest push:
https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X Generated by Claude Code |
allowed-tools now pre-grants make and gh, matching the commands the skill body runs. The raw-URL fallback tells agents to fetch reference files from the same ref as SKILL.md instead of pointing at main, so a pinned skill can't mix with newer references. updating.md gains skill activation smoke checks (positive, negative, explicit invocation) before any release touching the skill. https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X
|
All three follow-ups landed: https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X Generated by Claude Code |
Summary
Full implementation of the agent-skill and modernization plan (spec:
docs/project/specs/active/plan-2026-06-11-agent-skill-and-modernization.md, tracked as epic smu-7kwg).The skill (
skills/simple-modern-uv/)Installable via
npx skills add jlevy/simple-modern-uv, raw-URL prompt paste, or manual copy.SKILL.md(skills-ref-validated) carries the two-tier interview contract — essentials the user confirms once (kebab-case package name with derived snake_case module shown, description, license, publish-or-not); conventions applied silently (src/layout,v0.1.0first tag, 3.11+ floor) — and routes three flows: new project, upgrade existing project (references/adopt-existing.md: render-and-merge with Poetry/setuptools/PDM/mypy translations), and update templated project.references/customize.mdcovers license changes, private packages, and reconciling new template questions;references/faq.mdseeds ten real failure modes. All commands pinuvx copier@9.15.1.Template changes
package_license:MIT(default),Apache-2.0,BSD-3-Clause,AGPL-3.0-or-later,Proprietary, orNone (choose later)— canonical license texts;Nonerenders no LICENSE file and no license field.publish_to_pypigatespublish.yml,docs/publishing.md, and thePrivate :: Do Not Uploadclassifier. Verified behavior-preserving: defaults reproduce prior output; a v0.2.27 render updates to this branch with zero conflicts and converges to a fresh render (including across the LICENSE template rename).AGENTS.mdin generated projects (agents.md standard; CLAUDE.md symlink note).[tool.uv] required-version = ">=0.9".CI for this repo (first CI here)
Render smoke tests (default, proprietary/no-publish, no-license variants with output assertions and full sync/lint/test/build), the update-path test, skill validation plus link check, and doc format check (cooloff scoped to render jobs so the pinned formatter resolves).
Docs
Agent-first README (uvtemplate fully removed; retirement of the external repo tracked post-release).
updating.md: CI split, the answer-schema evolution policy, and version-choice guidance (minor vs patch) in the release step. New living docresearch-uv-changes.md(uv 0.6.x→0.11.x timeline and decisions). Common-doc-guidelines applied throughout (Title Case headings, footers, present-state phrasing, em dashes replaced with preferred punctuation).Validation performed
All license variants and the no-publish/no-license variants rendered and inspected; full
uv sync → lint --check → pytest → buildon renders with uv 0.11.17; update-path both cases locally and in CI;make format-check,skills-ref validateclean. Remaining post-merge: skill activation testing, downstream release-gate run, uvtemplate retirement.Draft release notes for v0.3.0 (minor release; copy into
gh release createafter the downstream gate passes, per updating.md Steps 3–8)What's Changed
New Features
Agent skill: use the template from any AI coding agent.
skills/simple-modern-uv/routes three workflows: create a new project, upgrade an existing Python package (including Poetry/setuptools/PDM migrations), or update an already-templated project. Install withnpx skills add jlevy/simple-modern-uv, or paste the raw SKILL.md URL into any agent.New template questions (defaults reproduce prior output, so
copier update --defaultsis a no-op for existing projects):package_license:MIT(default),Apache-2.0,BSD-3-Clause,AGPL-3.0-or-later,Proprietary, orNone (choose later). Drives the LICENSE file and pyprojectlicensefield;Nonerenders neither.publish_to_pypi:true(default) orfalse.falseremovespublish.ymlanddocs/publishing.mdand adds thePrivate :: Do Not Uploadclassifier.If you had customized the license or deleted publishing files by hand, pass explicit values when updating (e.g.
copier update --data publish_to_pypi=false); see the skill'sreferences/customize.md.AGENTS.md in generated projects (agents.md standard) with build/test commands and conventions.
CI for the template repo itself: render smoke tests, an update-path test from the previous release, and skill validation on every PR.
Improvements
[tool.uv] required-version = ">=0.9"in generated projectsuvtemplatehelper is retired (projects it created keep updating normally)research-uv-changes.md) and refreshed type-checker comparisonDownstream validation: jlevy/simple-modern-uv-template CI passed for
<TEMPLATE_COMMIT>Full Changelog: v0.2.27...v0.3.0
https://claude.ai/code/session_01T3RGHgchJZBpvuiesrrE7X