Shapes turns action-first: action leads, steps numbered, state restated. Use for ADHD-friendly output. Do not use to trim tokens; use response-compression.
日本語の概要は準備中です。原文の説明を表示しています。
Rebuild the dev environment: uv, Python tiers, pins, traps. Use when onboarding or toolchain breaks. Do not use for daily commands; use night-market-operations.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Recreate a working claude-night-market development environment from a bare machine, verify it in under an hour, and avoid the traps that have broken it before. Everything below was verified against the repo on 2026-07-02 (v1.9.15).
One rule dominates: every Python tool runs through uv run. uv is
Astral's Python package and environment manager. On first uv run it
creates .venv/ and syncs it from uv.lock. Never install repo
dependencies with bare pip.
Install in this order. "via uv" means the tool resolves from uv.lock
automatically. There is no manual install step for those rows.
| # | Tool | Required? | Install hint | Verify command |
|---|---|---|---|---|
| 1 | uv | REQUIRED | official installer at astral.sh/uv | uv --version |
| 2 | Python 3.12 | REQUIRED | uv python install 3.12 | python3 --version |
| 3 | make + bash | REQUIRED | GNU make 3.82+ (Xcode CLT ships 3.81, which ignores .SHELLFLAGS; brew install make, run gmake) | make --version |
| 4 | ruff >=0.14.13 | via uv | none (dev dependency in uv.lock) | uv run ruff --version |
| 5 | bandit | via uv | none (pre-commit env is pinned separately, see traps) | uv run bandit --version |
| 6 | mypy >=1.13 | via uv | none | uv run mypy --version |
| 7 | pre-commit >=4 | via uv | uv run pre-commit install | uv run pre-commit --version |
| 8 | Python 3.9 | optional | uv python install 3.9 | uv venv --python 3.9 /tmp/py39-check |
| 9 | node + npm | optional | needed for conjure Gemini delegation | node --version |
| 10 | Rust + cargo | optional | rustup (only for make skrills-build) | cargo --version |
| 11 | skrills binary | optional | make skrills-build or make skrills-install | make skrills-verify |
| 12 | mdbook | optional | cargo install mdbook; builds book/ | mdbook --version |
| 13 | gh CLI | optional | cli.github.com (releases and Discussions) | gh --version |
Notes on the optional rows:
.github/workflows/python39-compat.yml.package.json pins
@google/gemini-cli at ^0.25.1. Run npm install at the repo root
only if you use conjure delegation.make validate-skills,
make analyze-skills) has a Python fallback, so you can skip Rust
entirely.gh discussion subcommand. They are reachable only through
gh api graphql.Version numbers observed on the reference machine (2026-07-02):
uv 0.8.22, Python 3.12.3, ruff 0.14.13, mypy 1.19.1, bandit 1.9.2,
pre-commit 4.5.1. Newer versions of uv are fine. The ruff version must
match uv.lock (see traps).
Run these in order after installing rows 1-3 above. Each step lists the output shape that means success.
Step 1: clone and check uv.
git clone git@github.com:athola/claude-night-market.git
cd claude-night-market
uv --version
Expected: a single line like uv 0.8.22. Any 0.8+ version works. CI
pins astral-sh/setup-uv@v8.2.0.
Step 2: validate all plugin structures (also proves the venv syncs).
make validate-all
Expected: one block per plugin (26 directories) shaped like:
>>> Validating plugins/abstract:
Plugin Validation Report: abstract
...
OK Plugin validation passed
Blue "Recommendations" lines are advisory and fine. A red failure line
or (validation failed) is not.
Step 3: run one fast plugin test suite.
make -C plugins/leyline test
Expected: verbose pytest output ending with a coverage table and a
summary like 710 passed, 6 warnings in 9.96s (counts and timing
drift, but zero failures is the invariant). This proves uv run, pytest,
and per-plugin coverage thresholds all work.
Step 4: install the git hooks.
uv run pre-commit install
Expected: pre-commit installed at .git/hooks/pre-commit. From now on
commits run the full hook chain (file validation, bandit, ruff, mypy,
changed-plugin tests, structure validation). Never bypass it with
--no-verify; CONSTITUTION.md forbids that.
If any step fails, load night-market-debugging-playbook.
This is the number-one onboarding misconception. The README says "Python 3.9+ for hooks", and newcomers read that as "the repo runs on 3.9". It does not. There are three tiers:
| Tier | Version | Enforced by | Why |
|---|---|---|---|
| Root tooling (pytest, ruff, mypy) | 3.12 | root pyproject.toml requires-python = ">=3.12", ruff target-version = "py312", mypy python_version = "3.12" | dev toolchain runs inside the uv venv |
| Plugin packages | varies, 3.9 to 3.12 | each plugins/<name>/pyproject.toml | plugins are independent deployables (ADR-0001) |
| Hook import chains | 3.9 | .github/workflows/python39-compat.yml | hooks run under the HOST system Python (macOS 3.9.6), outside any venv |
Per-plugin requires-python as of 2026-07-02 (22 of 26 plugin dirs
have a pyproject.toml):
<3.14), imbue, leyline, minister,
sanctum, scryWhy the hook tier exists: Claude Code executes hook scripts with
whatever interpreter the host provides, not the repo venv. A hook file
AND everything it transitively imports must therefore stay
3.9-compatible, even inside a plugin whose package requires 3.12. CI
enforces this with two gates in python39-compat.yml: gate 1 runs
ruff check --select UP007 --target-version py39 on hook files (bare
X | Y union annotations), gate 2 builds a real 3.9 venv with
uv venv --python 3.9 and runs hook tests with
--override-ini="addopts=".
Consequences you must respect in hook-reachable code:
timezone.utc, never datetime.UTC (a 3.11+ alias). The root
ruff config extend-ignores UP017 specifically so autofix does not
reintroduce the alias. This break recurred three times before the
ignore plus an AST guard test held the line.yaml, anthropic) in hook entrypoints.
The system interpreter has none of the repo's dependencies, and an
unguarded import makes every git commit emit ModuleNotFoundError.| Trap | Symptom | Fix or guard |
|---|---|---|
setup-uv@v8 bare tag | CI fails: the bare v8 tag does not exist upstream | pin exact tag astral-sh/setup-uv@v8.2.0 (commit f81d89a5). Guard: scripts/check_pinned_versions.py |
| bandit 1.9+ under system 3.9 | pre-commit bandit hook env fails to install | .pre-commit-config.yaml pins rev: 1.8.6, the last release supporting 3.9 (commit 25bf5a9d). The project-venv bandit (1.9.x via uv run) is a different install and is fine |
stale .uv-tools binary shadows ruff | bare ruff reports an old version (0.7.3 observed) and disagrees with CI | root Makefile sets UV_TOOL_DIR ?= $(abspath .)/.uv-tools and prepends .uv-tools/ruff/bin to PATH. Always lint via make lint or uv run ruff, never bare ruff. Guard: scripts/check_ruff_version.py compares uv.lock to PyPI |
| root pytest silently skips plugins | uv run pytest at the root collects only tests/, never plugin tests | root pyproject.toml sets norecursedirs = ["plugins/*", ...] on purpose (root conftest.py documents ImportPathMismatchError). Run make -C plugins/<name> test or make <name>-test |
| imbue coverage artifacts | every pytest run in plugins/imbue writes htmlcov/, coverage.xml | imbue's pytest addopts force --cov=scripts with term, html, and xml reports. Artifacts are gitignored. Expect them and never commit them |
make skrills-build fails | Error: skrills repo not found at $HOME/skrills | SKRILLS_REPO defaults to $(HOME)/skrills. Set SKRILLS_REPO=/path/to/skrills or skip: make validate-skills falls back to a Python checker when no skrills binary exists |
| plugins run from a cache dir | plugin hook cannot find a file by relative path | installed plugins execute from the Claude Code cache dir, not the repo. Hooks must never use paths relative to the current working directory |
VOW_SHADOW_MODE, quality gates): use night-market-config-catalog.uv --version prints a version at the repo root.uv run ruff --version prints the uv.lock version (0.14.13 as
of 2026-07-02), not the .uv-tools version.make validate-all prints Plugin validation passed for every
plugin and no (validation failed) lines.make -C plugins/leyline test ends with N passed and zero
failures, plus a coverage table.uv run pre-commit install created .git/hooks/pre-commit.Compiled 2026-07-02 against repo v1.9.15 (branch discussions-fix-1.9.14). Observed tool versions and test counts in this file are snapshots and will drift. Re-verify with:
rg -n "requires-python" pyproject.tomlrg -n "requires-python" plugins/*/pyproject.tomlrg -n -A1 'name = "ruff"$' uv.lockrg -n "setup-uv" .github/workflows/*.ymlrg -n -B2 "id: bandit" .pre-commit-config.yamlrg -n "UV_TOOL_DIR|SKRILLS_REPO \?=" Makefilerg -n "norecursedirs" pyproject.tomlrg -n -A8 "addopts" plugins/imbue/pyproject.tomlrg -n "gemini-cli" package.jsonmake -C plugins/leyline testまだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Shapes turns action-first: action leads, steps numbered, state restated. Use for ADHD-friendly output. Do not use to trim tokens; use response-compression.
日本語の概要は準備中です。原文の説明を表示しています。
Inverts burden of proof for code additions. Use when reviewing PRs, planning refactors, or running unbloat to challenge every addition's necessity.
日本語の概要は準備中です。原文の説明を表示しています。
Tracks per-agent token usage and flags waste in parallel dispatch. Use when evaluating parallel agent efficiency or after a multi-agent run.
日本語の概要は準備中です。原文の説明を表示しています。
Coordinates Claude agent teams via filesystem protocol. Use when orchestrating parallel agents with task dependencies. Do not use for single-agent tasks.
日本語の概要は準備中です。原文の説明を表示しています。
Evaluates API surface design, consistency, and exemplar alignment. Use when reviewing public API changes or before releasing a new API surface.
日本語の概要は準備中です。原文の説明を表示しています。
Selects architecture paradigm via research before scaffolding. Use when architecture is undecided and the choice needs justification and documentation.
日本語の概要は準備中です。原文の説明を表示しています。