Repository navigation
2.2.0 (Codex support) is on main but hasn't been tagged. A release-readiness review turned up three blockers and a set of smaller fixes, all in this PR. Once it merges, main can be tagged 2.2.0.
Blockers
./install.sh --helpwas broken — a regression in 2.2.0. The usage heredoc was unquoted, so bash ran`.claude/skills`and the other backticked paths as commands. The output had four errors and read "Claude Code uses and .". CI missed it because--severity=warninghides SC2006.- 2.1.0 users had no upgrade path. The README now has an "Upgrading from 2.1.0" section, and the CHANGELOG entry is rewritten. Both cover three things:
- the marketplace rename from
draz-fluttertoflutter-craft-skills, which installs everything twice if both marketplaces are added - the
.claude/commands/flutter-adapt.mda vendored 2.1.0 install left behind .agents/winning over.claude/when a project has both profiles
- the marketplace rename from
flutter-adaptcould start without being asked. As a command it only ran when typed. As a skill withWritein its tools, an agent could run it on its own. It is now explicit-only on both hosts:disable-model-invocation: truefor Claude Code, andagents/openai.yamlwithallow_implicit_invocation: falsefor Codex.
Fixes
install.sh--project,--personaland--all-personalare mutually exclusive. Combining them used to silently drop one.--projectwith no path gives a clean error instead ofunbound variable.- Paths containing spaces work.
__pycache__folders are no longer copied into installed skills.- It prints the right invocation for a vendored install (
/flutter-adapt). - It warns about the stale 2.1.0 command, and
--forceremoves it. Only files containing that command's own text are touched.
check.sh--profilewith a path that doesn't exist exits2. It used to apply the defaults and could exit0.- When both
.agents/and.claude/profiles exist, the report notes that the.claude/one was ignored.
compare.pyexits2instead of1when Pillow or numpy is missing. A1means "the screen differs", so an agent would start changing widget code.- Skill text
- state-management told
providerusers to checkmountedon aChangeNotifier, which has no such property. - It claimed every stack deduplicates equal states;
setStateandChangeNotifierdon't. - Its Riverpod
refresh()example setstateright after anawait, breaking its own rule 2. - review-gate listed a check the script doesn't run.
- The architecture description still said "Cubit or Bloc" and "feature-first".
.claude/skillswas called "legacy" even though it is the installer's default.- The Claude Code invocation for vendored installs is now shown as
/flutter-adapt.
- state-management told
validate.pynow fails the build when:- the Claude and Codex manifests, or the marketplace entries, disagree on description, keywords, homepage, license or author (flutter-code-quality's already disagreed)
- the top CHANGELOG entry isn't the version in the manifests
- a skill links to another skill's file that
install.shcan't rewrite for vendored installs - a plugin ships a
commands/file
- CI
actions/checkoutandactions/setup-pythonmove to v7.- Flutter is pinned to 3.41.9 and ruff to 0.16.5.
- shellcheck runs at default severity over all four shell scripts, now including
test_check_sh.sh. .ruff_cache/is added to.gitignore.
Verification (local)
| Check | Result |
|---|---|
python3 scripts/validate.py |
12 skills, 0 warnings |
bash scripts/test_check_sh.sh |
64/64 (4 new) |
bash scripts/test_install_sh.sh |
112/112 (26 fail against the old installer) |
python3 scripts/test_compare.py |
21/21 (1 new) |
| shellcheck, default severity, all four scripts | clean |
ruff check scripts plugins (0.16.5) |
clean |
claude plugin validate on the repo and both plugins |
passes |
The v7 action versions and the pinned Flutter version are only tested by this PR's CI run. A Codex install has not been smoke-tested; the Codex CLI isn't installed on the machine this was prepared on.
Deliberately not included
These change the gate's result on projects that pass today, so under this repo's versioning rule they wait for 3.0.0:
- region-coded locales (
ar_EG) quietly turning the RTL check into a warning - untracked files and apps in a repo subdirectory not getting diff-scoped
- case-sensitive credential matching
compare.pycounting ignored pixels in its denominator- blocking on the asset check
The review-gate doc now describes the two scope limits in the meantime.