Code Quality / Python (ruff + ty) (push) Has been cancelled
Code Quality / Markdown (markdownlint-cli2) (push) Has been cancelled
Code Quality / JSON / TOML / YAML syntax (push) Has been cancelled
Validate / Validate JSON files (push) Has been cancelled
Validate / plugin-eval pytest (push) Has been cancelled
Validate / tools pytest (adapters + validators + gardener) (push) Has been cancelled
Validate / Cross-harness generation + validation (push) Has been cancelled
Validate / Real-CLI smoke test (OpenCode + Gemini) (push) Has been cancelled
* fix(codex): fall back to plugin name when description is empty (#617)
npx codex-marketplace add wshobson/agents --plugins fails with
"String must contain at least 1 character(s)" at path ["description"]
because codex-marketplace's installer parses each plugin's
plugins/<name>/.codex-plugin/plugin.json with a zod schema requiring
description: z.string().min(1) (pluginManifestSchema in the installer's
dist/schema.js). _codex_plugin_manifest() previously wrote
"description": plugin.description or "" — plugin-eval's own
.claude-plugin/plugin.json has no description field, so its generated
Codex manifest shipped an empty string and failed that check for every
--plugins install of this repo.
Fix: use the same plugin.description or plugin.name fallback already
used two lines below for the interface.shortDescription field. Also
add a top-level description to each .agents/plugins/marketplace.json
entry as forward-compatible metadata, since the installer's currently
published marketplacePluginSchema doesn't declare or require it there
(unknown keys are silently stripped by zod's default .parse()) — that
alone does not fix the crash, which lives in the per-plugin manifest.
Regenerated the committed Codex artifacts via make generate-all; only
plugin-eval's .codex-plugin/plugin.json needed the description fix,
confirming it's the only plugin missing an upstream description. Added
a regression test for the plugin.name fallback in
_codex_plugin_manifest(), alongside the existing marketplace-entry
description test.
Reported by jkroepke.
* test(codex): cover marketplace description fallback to plugin name
CodeRabbit: synthetic_plugin already has a description, so the
_codex_marketplace name fallback was untested. Add a no-desc plugin
and assert description == name.
* chore: regenerate .agents marketplace after main merge
plugin-eval now carries its real description (#630) instead of the name
fallback, and the pptx-deck-creation entry (#625) gains the description
field this PR's generator emits for every marketplace entry.
---------
Co-authored-by: Seth Hobson <wshobson@gmail.com>
Reconcile plugin-count references across AGENTS.md (==CLAUDE.md), docs/architecture.md,
docs/plugins.md, and docs/usage.md to 92 plugins (88 local + 4 external). The #582 and
#614 merges each updated only a subset of count strings; this brings the rest in line.
Agents (199), skills (162), commands (106) unchanged.
Verified: make validate STRICT=1, garden (0 err), test (449 passed), smoke-test (7 passed).
Adds the `ciagent` external git-subdir plugin (testing category, Apache-2.0) pointing at suniel12/ciagent//plugins/ciagent — two skills (onboard, check) for pytest-native regression testing of the agent being built. Follows the qa-orchestra/storymap precedent (external entries live only in the Claude marketplace). Maintainer disclosure present. Counts reconciled to 92 plugins / 4 externals; make validate STRICT=1 clean. External repo verified public + valid plugin manifest.
Adds the source-native `hermes-tweet` plugin (Hermes Agent X/Twitter research + approval-gated action workflows) with Claude/Codex manifests and a portable skill. Registered across the Claude, Codex, and Cursor marketplaces; catalog counts updated to 91 plugins / 162 skills. Maintainer disclosure present per the #611 policy. Verified: make validate STRICT=1 clean across 5 harnesses, make garden 0 errors.
Bumps the protect-mcp pin from 0.5.5 to 0.7.4 in both review-agent-governance and protect-mcp hooks so the PreToolUse `evaluate` and PostToolUse `sign` verbs resolve and the governance gate runs fail-closed (deny -> exit 2). Rewrites the test suite (init --dir, receipts.jsonl, v2 receipt schema, real Cedar entity shape); 8/8 pass. Verified locally: verbs function on 0.7.4, deny path exits 2, make validate STRICT=1 clean.
Closes#601.
Recounted from the filesystem: 90 plugins (87 local + 3 external),
161 skills across 45 plugins. Also catches docs/usage.md and
docs/plugins.md install-note lines missed by earlier syncs.
* Add operating-kit plugin: session lifecycle + code-review + deploy + prod-logs
Five project-agnostic agents with {{placeholders}} that adapt to any project:
- session-start: reads state doc + verifies live state at session open
- session-end: updates state doc and memory index at session close
- code-review-preshipment: 10-section pre-ship review with SHIP verdict
- deploy-with-verification: test > build > deploy > verify-live, never reports
shipped until the live system confirms
- prod-logs-health-check: pulls real logs, distinguishes failures from retries
Closes#595
Source: https://github.com/Sharrmavishal/operating-kit
Co-authored-by: Cursor <cursoragent@cursor.com>
* Address CodeRabbit review
- Revert .claude-plugin/marketplace.json to upstream — registry updates
must go through a separate flow, not inside plugin PRs
- code-review-preshipment: replace 'in a hurry' with 'rushed' (wordiness)
- session-start: replace Read: tool-name syntax with action-verb prose
- session-end: replace Read: tool-name syntax with action-verb prose
Co-authored-by: Cursor <cursoragent@cursor.com>
* Address maintainer review: register plugin and sync agents
- Add operating-kit to marketplace.json and run make generate-all
- Fix plugin category workflow -> workflows
- Add deploy trigger phrase; sync deploy/session agents with operating-kit
(deploy updates state doc after verify-live; session-end is finalization)
- Bump catalog counts in AGENTS.md and docs/plugins.md
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Sharrmavishal <sharrmavishal@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(adapters): map sonnet tier to Claude Sonnet 5; Copilot fable to claude-fable-5
Claude Sonnet 5 is GA (Copilot GA 2026-06-30) and Copilot now serves
Fable 5 natively, so the sonnet/inherit aliases move off Sonnet 4.6 and
the Copilot fable alias no longer falls back to Opus 4.8. Catalog
verification date bumped to 2026-07.
* fix(plugin-eval): judge sonnet tier resolves to claude-sonnet-5
* docs: refresh model alias table and tier counts (Sonnet 5, five-tier, 66/22/52)
* docs(plugins): update model examples to Sonnet 5 / Opus 4.8
Replace claude-sonnet-4-6 with claude-sonnet-5 and Opus 4.7 mentions
with 4.8 in llm-application-dev; replace retired claude-3-5-sonnet in
performance-testing-review's ai-review. Drop temperature args from
migrated examples — Sonnet 5 rejects non-default sampling params.
* fix(cursor-rules): align marketplace.json rule with CONTRIBUTING.md
The rule 'Never modify .claude-plugin/marketplace.json from inside a
plugin PR' contradicted CONTRIBUTING.md step 3 and actual maintainer
practice, causing CodeRabbit to force revert/re-add churn on plugin PRs
(#577, #582, #596, #606). Reword to prohibit hand-editing the generated
registries instead.
* docs: fix stale component counts (194 agents, 106 commands, 158 skills, 44 plugins)
* docs(contributing): add commercial content and disclosure policy
* docs(protect-mcp): remove unverified downloads claim
npm reports ~3.2K monthly downloads, not 10K+; the README already has a
live shields.io downloads badge. Also drop the stale v0.5.5 reference
(see #601).
Non-git Bash actions (gh pr comment, etc.) don't carry target_branch, so
requiring it in the schema would make every such request error at runtime.
Mark it optional and guard rule 3 with `context has target_branch` so the
git-push-to-protected-branch forbid only applies when a branch is supplied.
cedar validate stays clean (optional attr accessed under a has-guard).
- judge: guard _measured_score against non-dict JSON; strip whitespace text
before the result fallback (typed result param as Any for ty).
- monte_carlo: use the shared result fallback for activation/quality; sum real
SDK usage token fields via _sdk.usage_total_tokens (no fake total_tokens=0).
- tests: importorskip claude_agent_sdk so dev-only (no llm extra) collection
doesn't fail; add tests for non-dict scores, whitespace/result fallback,
result-only activation, and token summing.
- run-tests.sh: cd guard + multiline-tolerant in-on-String detection.
- docs: cedar-validate if/else, repo-root-safe path, and #598 narrative
corrected to the verified conclusion (reporter essentially correct;
protect-mcp evaluate/sign subcommands absent -> separate issue).
De-duplicate the AssistantMessage/TextBlock/ResultMessage walk that judge.py
and monte_carlo.py each carried (collect_sdk_output in layers/_sdk.py), and
collapse the duplicated grep in the review-agent-governance policy test.
context.<attr> in [strings] is a type error under standard Cedar (in expects
an entity LHS) and is silently discarded, which would disable the gate. Rewrite
to [strings].contains(context.<attr>), which validates and is portable.
ResultMessage has no .content attribute, so the judge always read empty
text and silently fell back to 0.5. Extract from AssistantMessage TextBlocks
with ResultMessage.result fallback; mark errored/empty/non-JSON as unmeasured.