refactor: tighten repo architecture (dev/CI infra, plugins/ hygiene, dedup config loader) - #18
Merged
Merged
Conversation
The root pyproject was still the `uv init` stub and pytest — required by every plugin's test suite — was undeclared, so the tests only ran after a manual install. Bring the root up to the standard review-diff already sets: - declare a `dev` dependency-group (pytest, ruff) and `package = false` - add `[tool.pytest.ini_options]` so `uv run --group dev pytest` discovers every plugin's suite from the repo root - add `scripts/check_all.py`: a single entrypoint that runs the marketplace version check, the shared-artifact sync check, and the full test suite, reporting a combined pass/fail - add a CI workflow running check_all plus review-diff's 100% coverage gate Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCdtWgMHgeoqErt6s2NR3i
plugins/trigger-eval-workspace/ was not a plugin — it holds skill-trigger eval datasets (query → should_trigger fixtures), is not registered in marketplace.json, and is referenced by nothing. Keeping it under plugins/ (the directory meant to hold only shippable plugins) was misleading. Move the nine *-eval.json files to a top-level evals/ directory with a README explaining the format, so plugins/ now contains exactly the nine registered plugins. Update CLAUDE.md's structure tree to match. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCdtWgMHgeoqErt6s2NR3i
…dirs) check_marketplace_versions.py only validated marketplace entries against their plugin.json — it could not catch the inverse: a plugin directory added but never registered in the catalog, or a non-plugin directory living under plugins/ (the exact problem trigger-eval-workspace had). Both slipped through. Add a reverse pass over plugins/* that fails when a directory has no marketplace entry, distinguishing "unregistered plugin" (has plugin.json) from "not a plugin" (no plugin.json, belongs elsewhere). Document the now-bidirectional contract in CLAUDE.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCdtWgMHgeoqErt6s2NR3i
compound-knowledge's resolve_paths.py and understand's resolve_config.py each carried an identical copy of the `.claude/<name>.local.md` reader: the same _KV regex, _parse_config, _find_config (project>user>default precedence), and argv handling. Two copies of one parser meant two places to fix a config-format bug. Extract that scaffolding into a canonical scripts/shared/config_loader.py (parse_config / find_config / cli_roots), synced byte-identically into each plugin's scripts/ via sync_shared.py — the same mechanism already used for feedback_manager.py. Each resolver keeps only its own typing/defaults/path normalization and calls the shared loader. Both still work run-as-script (sibling import via sys.path[0]) and under pytest. Bump compound-knowledge 0.8.2 -> 0.8.3 and understand 0.1.1 -> 0.1.2, sync marketplace.json, and document the new shared artifact in CLAUDE.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCdtWgMHgeoqErt6s2NR3i
JoshuaOliphant
marked this pull request as ready for review
June 25, 2026 00:32
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.
Four focused architectural refactors, each live-tested, autoreviewed, and committed separately. Baseline (98 tests) preserved throughout.
Why
A sweep surfaced concrete structural debt:
pytest) was undeclared, so the suite only ran after a manual install, and nothing ran the guard scripts together or in CI;plugins/trigger-eval-workspace/wasn't a plugin (eval fixtures) yet lived underplugins/;plugins/undetected;.claude/<name>.local.mdresolvers each carried an identical copy of the config parser.What changed
build: reproducible dev/test infra + one-command check + CI (539658b)pyproject.tomlgets adevdependency-group (pytest, ruff),package = false, and pytest config souv run --group dev pytestdiscovers every plugin's suite from the root.scripts/check_all.py: single entrypoint running version check + shared-sync check + tests with a combined pass/fail..github/workflows/ci.yml: runscheck_allplus review-diff's 100% coverage gate.refactor: movetrigger-eval-workspaceout ofplugins/→evals/(d527691)*-eval.jsonskill-trigger fixtures move to a top-levelevals/(with a README).plugins/now holds exactly the nine registered plugins. CLAUDE.md tree updated.feat: bidirectional marketplace check (9ff0857)check_marketplace_versions.pynow also fails when aplugins/*directory has no catalog entry, distinguishing "unregistered plugin" from "not a plugin (move it out)". All three branches live-verified.refactor: extract shared.local.mdconfig loader (b945b3c)_KV/_parse_config/_find_config/argv scaffolding becomes a canonicalscripts/shared/config_loader.py, synced byte-identically intocompound-knowledgeandunderstandvia the existingsync_shared.pymechanism. Both resolvers keep only their own typing/defaults and call the shared loader; both still work run-as-script and under pytest. Versions bumped (compound-knowledge 0.8.3, understand 0.1.2) and marketplace synced. Adversarial review confirmed exact behavioral parity.Deliberately out of scope
Merging
sdlc_state.py(autonomous-sdlc) andsession_state.py(stick-shift): stick-shift is an intentional trimmed fork with a different state graph — merging would fight the documented design intent.Validation
uv run --group dev python scripts/check_all.py→ green (versions, shared-sync, 98 tests).🤖 Generated with Claude Code
https://claude.ai/code/session_01LCdtWgMHgeoqErt6s2NR3i
Generated by Claude Code