chore: switch devcontainer to node-agentic, drop Python - #7
Merged
Conversation
The backend is Bun and TypeScript, so the python-agentic template no longer matches the stack. Rebased on node-agentic from get2knowio/devcontainer-templates, keeping this repo's two local customizations: CLAUDE_CONFIG_DIR and the ~/.claude + ~/.config/gh credential mounts. Bun comes from the template's node-dev-tools feature. Its default installs everything, but bun is named explicitly because it is this project's runtime, test runner and package manager rather than an optional extra, and postCreateCommand now checks it so a broken install fails the build instead of surfacing later. Dropped the python and python-tools features. Nothing here needs them: no .py files, no pyproject.toml or requirements.txt, and nothing shells out to Python. The one Python consumer is Spec Kit's agent-context hook, which needs a python3 that can import yaml -- and python-tools never provided that, so the hook has been silently skipping. It installs uv/Poetry/ruff/mypy, none of which put PyYAML on the system interpreter, and PEP 668 blocks pip installing into it. SPECKIT_PYTHON now points at the uv tool venv that specify itself lives in, which does ship PyYAML, so the hook runs for the first time. If that interpreter is ever missing the script falls through to python3/python and skips cleanly. This is a local workaround for get2knowio/devcontainer-features#77 and can be dropped once that ships. Turning the hook on exposed a latent problem: the hand-written design artifact list in CLAUDE.md sat inside the SPECKIT markers, so the generator discarded it on first run. Moved it below the markers with a comment, and verified a re-run now leaves it intact. Also added node_modules to .gitignore, which was missing entirely, and replaced the now-dead Python ignore entries. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CvCDKqHEKtVjg1hMbWdv7
The floating `base:ubuntu` tag has rolled over to Ubuntu 26.04 (resolute), which has no moby-engine/moby-cli packages, so the docker-in-docker feature aborts during install and the container never builds. main was pinned in dda0b71; this branch reintroduced the floating tag. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The backend is Bun + TypeScript, so
python-agenticno longer matches the stack. Rebased onnode-agentic, keeping this repo's two local customizations on top:CLAUDE_CONFIG_DIRand the~/.claude+~/.config/ghcredential mounts.Bun
Comes from the template's
node-dev-toolsfeature. Its default installs everything, so bun would arrive either way, but it's named explicitly since it's this project's runtime, test runner and package manager rather than an optional extra:postCreateCommandnow runsbun --versiontoo, so a broken install fails the build instead of surfacing later.Dropping Python
Nothing here needs it — no
.pyfiles, nopyproject.toml/requirements.txt/Pipfile/poetry.lock, and nothing in the workflows or scripts shells out to Python.There's exactly one Python consumer: Spec Kit's
agent-contexthook, enabled in.specify/extensions.yml, which needs apython3that canimport yaml.python-toolswas never satisfying it. In a container built from the old config, with bothpythonandpython-toolsinstalled:That feature installs uv/Poetry/ruff/mypy, none of which put PyYAML on the system interpreter, and PEP 668 blocks a plain
pip installinto it. The hook has been silently skipping — and because it exits 0, it read as "nothing to do" rather than "broken."Fixing the hook
The script honors
$SPECKIT_PYTHON, and the uv tool venvspecifyitself lives in already ships PyYAML 6.0.3, socontainerEnvnow points at it. The hook goes from skipping to:If that interpreter ever goes missing the script falls through to
python3/pythonand skips cleanly, so it can't hard-fail. This is a local workaround for get2knowio/devcontainer-features#77 —ai-clisinstalls Specify withuv tool install, which isolates the venv, and should expose the interpreter itself. This line can be dropped once that ships.CLAUDE.md
Turning the hook on for the first time exposed a latent problem: the hand-written "Key design artifacts" list sat inside the
<!-- SPECKIT START/END -->markers, so the generator wiped it on first run. Moved below the markers with a comment explaining why, and verified a re-run now leaves it intact.Left as-is, the first
/speckit-planor/speckit-specifyafter a rebuild would have quietly deleted it.Also
node_modules/was missing from.gitignoreentirely — it showed as untracked and was onegit add .away from being committed. Added, and replaced the now-dead Python ignore entries (__pycache__,.mypy_cache,.ruff_cache,.venv, …), keepingdist/andbuild/which apply to Node too.README updated — it still described the container as
python-agenticwith "Python tooling: uv, Poetry, ruff, mypy".Testing note
The container this was authored in was built from the old config, so the new one hasn't been built end to end yet — worth a Rebuild Container before merging. The JSONC parses, and the
SPECKIT_PYTHONpath and hook behavior were verified live.🤖 Generated with Claude Code
https://claude.ai/code/session_013CvCDKqHEKtVjg1hMbWdv7