Wire every cli-web-<app> CLI and a new cli-anything-web umbrella package
into release-please + PyPI Trusted Publishing, so users can install each
CLI individually (pip install cli-web-<app> / uvx cli-web-<app>) or the
whole fleet at once (pip install cli-anything-web).
- release-please-config.json / manifest: add the 20 CLIs + meta umbrella
- meta/: new cli-anything-web metapackage (unpinned deps on all CLIs)
- publish.yml: single generic resolver (tag -> dir) covers every package
- docs.py + README + per-CLI docs + skills: show the published install
- docs/PUBLISHING.md: one-time Trusted Publisher setup for all 22 projects
The repo "About" description embeds a count ("... N CLIs and counting.")
that was hand-maintained and had drifted (said 17; the registry has 19).
registry.json is the fleet source of truth, so the count should derive
from it.
- cli-web-devkit about: renders the count from registry.json and reconciles
it with the live GitHub description (gh API). `--check` fails on drift
(read-only, CI-safe); `--apply` rewrites just the count, preserving any
reworded prose. Editing repo metadata needs Administration:write, which
the default GITHUB_TOKEN lacks, so --apply is a maintainer/PAT step while
--check is the CI guardrail.
- tests.yml lint job runs `about --check` (no-ops if gh metadata is
unavailable, so it never flakes CI).
- standards Step 6 runs `about --apply` alongside the other registry-driven
generators when a CLI is added.
- unit tests cover the count templating (replace/idempotent/append/
reworded-prose/first-only) and registry counting.
Also corrected the live description to 19 CLIs.
Quality gate (validate-checklist.py):
- --auth-type now defaults to auto, resolved from registry.json with
core/auth.py fallback — no-auth CLIs no longer fail auth checks
- 4.3/10.2 are N/A for browser-rendered clients, count status mapping
across client.py + exceptions.py (raise_for_status pattern), and use
an auth-aware threshold; 7.3 accepts the :cli entry function
Fleet CLIs (all 19 now pass the checklist with zero failures):
- to_dict() on base exceptions: booking, chatgpt, codewiki, futbin,
gai, notebooklm, stitch, unsplash
- context-manager protocol on clients: booking, codewiki, gh-trending,
notebooklm, pexels, stitch
- stderr UTF-8 fix: gai, gh-trending, stitch, unsplash
- futbin: group-level --json with ctx.obj propagation + resolve_json_mode
- gai: complete exception hierarchy (AuthError/ServerError/NotFoundError)
- chatgpt: utils/output.py as the real home of output helpers
- tripadvisor: README.md + mocked unit tests (65 passing, no network)
- youtube: full test_e2e.py (27 tests incl. TestCLISubprocess), pytest.ini
- headless token auto-refresh (3-attempt contract) wired into
hackernews, chatgpt, and booking clients with mocked retry tests
Templates (fresh scaffolds are now lint-clean and import-clean):
- auth-dependent client code guarded for --auth-type none
- exception import members rendered sorted for any app name
- B904 exception chaining; unused imports removed/guarded
- e2e template: usage-error exit-2 test + exit-code contract FILL_IN
devkit: resync --app prints a notice that plugin-internal copies are
only synced on full-fleet runs.
Shared modules (cli-web-core, resynced into all 60 vendored copies):
- doctor: honor group-level --json via ctx.obj; skip chmod warning on non-POSIX
- mcp_server: expose multiple=True/nargs=-1 params as array schemas and
expand them item-by-item into argv (was Python-repr stringification)
- repl_skin: create history dir lazily in create_prompt_session() with
InMemoryHistory fallback (read-only HOME broke even --help); add the 8
missing fleet accent hex entries
- polling: treat any non-None result as complete (falsy payloads no longer
poll until timeout)
Pipeline & devkit:
- run-pipeline validate: pass agent-harness dir + required --app-name
(was an unconditional argparse error)
- canary: accept legacy bare-array/object JSON and leading spinner noise;
still fail on error envelopes and success=false
- scaffold-cli: abort on missing vendored runtime file instead of shipping
an import-broken CLI
Quality gate:
- promote auth-security checks (4.4, 4.4b, 4.6) to Tier 1 in code, markers,
and tests; broaden 4.4b refresh detection to fleet spellings
(_refresh_tokens, headless login_browser)
Docs:
- fix stale exit-code map in exceptions template and two committed CLIs
- repoint dangling HARNESS.md "Token Auto-Refresh" references to
CONVENTIONS.md §Auth Rules; correct "75-check checklist" and the
fleet exit-code note
Applies Anthropic's official workflow patterns to the four phase skills and
fixes content that had gone stale against the platform itself.
Workflow patterns (official best practices):
- Copyable progress checklists added to capture/methodology/testing/standards
(the recommended pattern for complex multi-step workflows)
- Every phase now closes by marking phase-state complete (capture and
standards were missing it; the validator feedback loops were already there)
Progressive disclosure:
- capture: the --mitmproxy variant (interleaved 4x through the default path)
extracted to references/mitmproxy-mode.md as step substitutions — the
default path reads clean
- testing: VCR cassette guide extracted to references/vcr-testing.md;
helper-test and client-side-operation code blocks moved into
test-code-examples.md (398 -> 332 lines, rules stay inline)
- TOCs added to all 11 reference files over 100 lines (incl. CONVENTIONS,
RECOVERY); traffic-patterns.md nested reference chain flattened to one
level
Stale content fixed (skills now match the platform):
- standards: 'Create setup.py' -> install-and-verify (scaffold generates it);
'add CLI to tests.yml matrix' -> registry-driven flow (matrix and README
table are GENERATED from registry.json — cli-web-devkit registry
validate/docs/resync/drift + contract suite); doctor added to install
verification; smoke-test items renumbered out of the broken 5-9 scheme
- testing: handle_errors exit-code example updated to the v2.1 contract
(auth=3, unknown=1) with explicit legacy-CLI guidance
- methodology: versioned 'v1.3.0' analysis note rephrased as
capability-conditional (time-sensitive content rule)
Real pipeline gap found and fixed while verifying:
- Newly scaffolded CLIs did not get mcp_server.py/doctor.py vendored or
registered: sync.py now vendors both into the plugin's scripts/ (canon:
cli-web-core), scaffold copies all three runtime files, cli_entry.py.tpl
registers mcp-serve + doctor
- scaffold flags unified: --resource (repeatable) is canonical and renders
command modules; --resources kept as comma alias (the skill documented an
interface the script rejected — proven by scaffolding end-to-end)
- E2E verified: fresh scaffold installs, MCP handshake works, doctor green
Durable enforcement extended: test_skill_quality.py now also checks
reference files (TOC required over 100 lines, one-level reference depth).
Verified: 691 plugin/devkit/core tests, 114 contract tests, 19/19 CLI
suites, verify-plugin 28/28, drift 60/60, ruff+format+mypy clean, README
freshness green.
https://claude.ai/code/session_017wCNXuLy6UpGJ1jcPdsD5i
- cli_web_core/doctor.py: read-only environment diagnosis — Python version,
entry point on PATH, config dir, auth file presence/permissions/format
(auth-bearing CLIs only, detected via the auth module), playwright and
prompt_toolkit availability. Human output + --json envelope; exit 1 only
on fail-level findings (missing auth is a warn with the exact next step).
- Vendored to all 19 CLIs (SHARED_FILES + resync, sha256 provenance in
manifests); doctor command wired into every entry point alongside
mcp-serve.
- Fleet contract test: doctor --json envelope + no fail-level checks x19.
- README: doctor blurb in the agent-native section.
Verified: 425 plugin tests, 210 contract/core/devkit tests, 19/19 CLI
suites, drift 58/58 ok, ruff+format+mypy clean, verify-plugin 28/28.
https://claude.ai/code/session_017wCNXuLy6UpGJ1jcPdsD5i