215 Commits

Author SHA1 Message Date
Seth Hobson cc37bfdd29 feat: add fable model tier and refresh per-harness model aliases
Add Claude Fable 5 (model: fable) as the tier above opus across the
adapter framework - native passthrough in Claude Code, mapped to each
harness's top model elsewhere. No agents are promoted yet; tier criteria
and cost guidance are documented in docs/agents.md and docs/authoring.md.

Refresh MODEL_ALIASES against current harness catalogs (June 2026):
- Codex: gpt-5 family -> gpt-5.5 / gpt-5.4-mini (per Codex model docs)
- Copilot: GPT-5 stand-ins -> native Claude models (claude-opus-4.8,
  claude-sonnet-4.6, claude-haiku-4.5) now that Copilot CLI serves them
- OpenCode: opus -> anthropic/claude-opus-4-8; haiku dated pin ->
  latest-tracking anthropic/claude-haiku-4-5
- Gemini: intentionally stays on GA gemini-2.5-* (3.x is preview-gated)
- plugin-eval judge opus tier -> claude-opus-4-8

Gates: generate-all (no committed drift), validate STRICT=1, garden,
test (442 passed), smoke-test all green.
2026-06-12 10:55:38 +09:00
Seth Hobson 75ebf8c644 Merge pull request #567 from yanghaod2278827/improve-skill-descriptions
docs: improve skill description for better trigger accuracy
2026-06-12 08:57:54 +09:00
dependabot[bot] 9ec9d4debf deps(plugin-eval): bump the python-minor-and-patch group
Bumps the python-minor-and-patch group in /plugins/plugin-eval with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [typer](https://github.com/fastapi/typer) | `0.26.4` | `0.26.7` |
| [claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-python) | `0.2.87` | `0.2.93` |
| [anthropic](https://github.com/anthropics/anthropic-sdk-python) | `0.105.2` | `0.107.1` |
| [ruff](https://github.com/astral-sh/ruff) | `0.15.15` | `0.15.16` |
| [ty](https://github.com/astral-sh/ty) | `0.0.40` | `0.0.44` |


Updates `typer` from 0.26.4 to 0.26.7
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.26.4...0.26.7)

Updates `claude-agent-sdk` from 0.2.87 to 0.2.93
- [Release notes](https://github.com/anthropics/claude-agent-sdk-python/releases)
- [Changelog](https://github.com/anthropics/claude-agent-sdk-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/claude-agent-sdk-python/compare/v0.2.87...v0.2.93)

Updates `anthropic` from 0.105.2 to 0.107.1
- [Release notes](https://github.com/anthropics/anthropic-sdk-python/releases)
- [Changelog](https://github.com/anthropics/anthropic-sdk-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/anthropic-sdk-python/compare/v0.105.2...v0.107.1)

Updates `ruff` from 0.15.15 to 0.15.16
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.15...0.15.16)

Updates `ty` from 0.0.40 to 0.0.44
- [Release notes](https://github.com/astral-sh/ty/releases)
- [Changelog](https://github.com/astral-sh/ty/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ty/compare/0.0.40...0.0.44)

---
updated-dependencies:
- dependency-name: typer
  dependency-version: 0.26.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python-minor-and-patch
- dependency-name: claude-agent-sdk
  dependency-version: 0.2.93
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python-minor-and-patch
- dependency-name: anthropic
  dependency-version: 0.107.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-minor-and-patch
- dependency-name: ruff
  dependency-version: 0.15.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python-minor-and-patch
- dependency-name: ty
  dependency-version: 0.0.44
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python-minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-08 01:08:32 +00:00
dependabot[bot] 79c76adbfc deps(plugin-eval): bump starlette in /plugins/plugin-eval
Bumps [starlette](https://github.com/Kludex/starlette) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/Kludex/starlette/releases)
- [Changelog](https://github.com/Kludex/starlette/blob/main/docs/release-notes.md)
- [Commits](https://github.com/Kludex/starlette/compare/1.0.0...1.0.1)

---
updated-dependencies:
- dependency-name: starlette
  dependency-version: 1.0.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-04 17:30:41 +00:00
yanghaod2278827 3ce0342afd docs: improve skill description for better trigger accuracy 2026-06-03 11:33:57 +08:00
Seth Hobson 767d969a73 docs: sync plugin/agent/skill counts to 84/192/156 after social-publishing merge
PR #558 updated the headline totals but left trailing references at
83/191/155 across README, AGENTS.md, GEMINI.md, ARCHITECTURE.md, and
docs/*. Sync them all to the true counts (82 local + 2 external = 84
plugins, 192 agents, 156 skills).

Also runs make generate-all to bring the committed harness registries in
sync — adds the social-publishing entries to .agents/ and .cursor-plugin/
(which the original PR could not regenerate) and fixes the stale count in
the generated cursor manifests.

Left round-trip-results.md (point-in-time CLI verification results) and
plugin-eval.md (grade threshold) unchanged.
2026-06-02 19:15:30 -04:00
Seth Hobson 207b9a0f99 Merge pull request #558 from ndesv21/add-social-publishing
feat: add social-publishing plugin via SocialClaw
2026-06-03 08:10:00 +09:00
dependabot[bot] 63f1c99292 deps(plugin-eval): bump the python-minor-and-patch group
Bumps the python-minor-and-patch group in /plugins/plugin-eval with 3 updates: [typer](https://github.com/fastapi/typer), [anthropic](https://github.com/anthropics/anthropic-sdk-python) and [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio).


Updates `typer` from 0.25.1 to 0.26.4
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.25.1...0.26.4)

Updates `anthropic` from 0.104.1 to 0.105.2
- [Release notes](https://github.com/anthropics/anthropic-sdk-python/releases)
- [Changelog](https://github.com/anthropics/anthropic-sdk-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/anthropic-sdk-python/compare/v0.104.1...v0.105.2)

Updates `pytest-asyncio` from 1.3.0 to 1.4.0
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v1.3.0...v1.4.0)

---
updated-dependencies:
- dependency-name: typer
  dependency-version: 0.26.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-minor-and-patch
- dependency-name: anthropic
  dependency-version: 0.105.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-minor-and-patch
- dependency-name: pytest-asyncio
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-01 02:18:07 +00:00
Seth Hobson d31e8b8fea fix: address PR review + upgrade ruff/ty so CI matches local
Review feedback:
- codex.py: Codex marketplace entries now conform to the openai/codex
  core-plugins schema — source {source: "local", path}, policy
  {installation, authentication}, and category (was missing required
  fields; flagged P1). Top-level trimmed to {name, plugins}.
- codex.py: interface.shortDescription cuts on a word boundary + ellipsis
  instead of a mid-word [:120] slice in committed .codex-plugin manifests.
- cursor.py: top-level .cursor-plugin/plugin.json displayName is now the
  short "Claude Code Workflows" instead of the long marketplace description.

Tooling (local drives CI):
- Bump ruff 0.15.14 -> 0.15.15 and ty 0.0.39 -> 0.0.40 in plugin-eval's
  uv.lock so CI installs the same versions we run locally, and reformat the
  tools/ + plugin-eval sources to ruff 0.15.15 (fixes the failing
  ruff format --check; the lock-hash change also busts CI's stale cache).

make validate STRICT=1 clean / garden 0 errors / 442 tests pass; regeneration
remains drift-free.
2026-05-29 13:18:48 -04:00
Seth Hobson 608c3840ca feat: native plugin-install for Codex/Cursor/Gemini + CLAUDE.md→AGENTS.md symlink
Add lean, native plugin-install entry points so each harness's own plugin
manager can install this marketplace (mirroring obra/superpowers) — committing
only small JSON registries, not duplicated skill/agent content trees.

- Codex: committed marketplace registry (.agents/plugins/marketplace.json) +
  per-plugin manifests (plugins/*/.codex-plugin/plugin.json). Entries point at
  source ./plugins/<name>; Codex reads SKILL.md directly. Transformed
  .codex/skills|agents stay gitignored.
- Cursor: commit the existing .cursor-plugin/ marketplace + .cursor/rules/
  (these already point at source plugins/).
- Gemini: gemini-extension.json already committed (contextFileName: AGENTS.md);
  transformed trees stay gitignored (install via clone + make generate).
- OpenCode: unchanged — install via `make install-opencode` (transformed tree
  stays gitignored).
- CLAUDE.md is now a symlink to AGENTS.md; Claude-Code addenda moved to
  docs/harnesses.md.
- CI: new step fails if `make generate-all` drifts from the committed registries.

Net new committed: ~720 KB of manifests (no skill/agent duplication). Adds
round-trip tests for the new registries + the symlink. Docs updated across
README, docs/harnesses.md, ARCHITECTURE.md, CONTRIBUTING.md, GEMINI.md,
docs/authoring.md, and the PR template.
2026-05-29 13:02:40 -04:00
ndesv21 c8e2c8dd3c fix: restore license field in SKILL.md lost during rebase
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 10:17:43 +02:00
ndesv21 10d1e67f9a fix: bump plugin count to 84 and clarify 13 platforms breakdown
- Update marketplace metadata: 83 → 84 marketplace plugins
- Explicitly list LinkedIn (Profile + Page) and Instagram
  (Business + Standalone) variants so the 13-platform count
  is unambiguous

Addresses CodeRabbit review feedback.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 10:17:05 +02:00
Seth Hobson a85bcb5849 fix: address review feedback for social-publishing plugin
- Add model: haiku to agent frontmatter (required by docs/authoring.md)
- Rename agent to social-publishing-publisher for plugin-scoped naming
- Remove non-standard license: field from SKILL.md frontmatter
- Update catalog counts and listings in AGENTS.md, README.md,
  docs/plugins.md, docs/agents.md, docs/agent-skills.md
2026-05-25 21:33:21 -04:00
ndesv21 655723aa2d fix: align SKILL.md metadata version to 1.0.0
Consistent semantic versioning across plugin.json and SKILL.md
metadata, as flagged in code review.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 21:20:13 -04:00
ndesv21 af541c8955 feat: add social-publishing plugin via SocialClaw
Adds the social-publishing plugin — an agent + skill for scheduling and
publishing posts across 13 social media platforms via the SocialClaw API.

Platforms: X, LinkedIn, Instagram, Facebook Pages, TikTok, Discord,
Telegram, YouTube, Reddit, WordPress, Pinterest.

Install: npx skills add ndesv21/socialclaw
Source: https://github.com/ndesv21/socialclaw

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 21:20:13 -04:00
jon 5162141430 fix(plugin-eval): exempt slash-only and path-triggered skills from MISSING_TRIGGER (#531)
* fix(plugin-eval): exempt slash-only and path-triggered skills from MISSING_TRIGGER

Skills can be invoked through three mechanisms in Claude Code:

1. Model-driven auto-invocation based on the description (the default,
   and what MISSING_TRIGGER is designed to gate).
2. User-driven slash invocation only — opt-out via
   `disable-model-invocation: true` in the SKILL.md frontmatter.
3. Path-triggered auto-load — opt-in via the `paths:` frontmatter glob,
   where the skill is loaded when the model opens a matching file.

The current `MISSING_TRIGGER` check runs against every skill regardless
of invocation mechanism. Skills in (2) cannot be auto-invoked at all, so
a trigger phrase in the description is irrelevant. Skills in (3) are
triggered by file paths, not description matching, so the description
serves as documentation rather than as a discovery surface.

Add a `_skill_uses_description_trigger(skill)` predicate that consults
`skill.frontmatter` and short-circuits the MISSING_TRIGGER check for
the two non-description invocation paths. Behaviour for ordinary
model-invocable skills is unchanged.

Tests:
- `test_disable_model_invocation_exempts_skill` — slash-only, no trigger,
  no flag.
- `test_paths_auto_load_exempts_skill` — path-triggered, no trigger,
  no flag.
- `test_disable_model_invocation_false_still_checks_trigger` — explicit
  `false` does not exempt.
- `test_empty_paths_value_still_checks_trigger` — empty string is not
  a valid auto-load configuration.

Full plugin-eval suite (73 tests) passes.

* fix: address ruff SIM103/SIM102 and guard paths check against non-string values

Simplify conditional returns (SIM103), collapse nested ifs (SIM102),
and use isinstance(paths, str) to prevent paths: [] from incorrectly
exempting a skill from MISSING_TRIGGER.

---------

Co-authored-by: Seth Hobson <wshobson@gmail.com>
2026-05-25 21:14:51 -04:00
dependabot[bot] db81b36add deps(plugin-eval): bump the python-minor-and-patch group (#556)
Bumps the python-minor-and-patch group in /plugins/plugin-eval with 2 updates: [claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-python) and [ty](https://github.com/astral-sh/ty).


Updates `claude-agent-sdk` from 0.2.85 to 0.2.87
- [Release notes](https://github.com/anthropics/claude-agent-sdk-python/releases)
- [Changelog](https://github.com/anthropics/claude-agent-sdk-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/claude-agent-sdk-python/compare/v0.2.85...v0.2.87)

Updates `ty` from 0.0.38 to 0.0.39
- [Release notes](https://github.com/astral-sh/ty/releases)
- [Changelog](https://github.com/astral-sh/ty/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ty/compare/0.0.38...0.0.39)

---
updated-dependencies:
- dependency-name: claude-agent-sdk
  dependency-version: 0.2.87
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python-minor-and-patch
- dependency-name: ty
  dependency-version: 0.0.39
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python-minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-25 19:40:46 -04:00
Seth Hobson 8df77ecd46 Fix duplicate agent name collisions (#554)
* fix: namespace duplicate agent names

* fix: format duplicate-name regression test

* fix: align command phase output references

* docs: clarify agent naming formula
2026-05-24 19:55:35 -04:00
dependabot[bot] cbcde3f1f4 deps(plugin-eval): bump rich in /plugins/plugin-eval (#547)
Bumps [rich](https://github.com/Textualize/rich) from 14.3.3 to 15.0.0.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v14.3.3...v15.0.0)

---
updated-dependencies:
- dependency-name: rich
  dependency-version: 15.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-22 17:25:01 -04:00
dependabot[bot] 07413134b0 deps(plugin-eval): bump the python-minor-and-patch group (#546)
Bumps the python-minor-and-patch group in /plugins/plugin-eval with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [pydantic](https://github.com/pydantic/pydantic) | `2.12.5` | `2.13.4` |
| [typer](https://github.com/fastapi/typer) | `0.24.1` | `0.25.1` |
| [claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-python) | `0.1.50` | `0.2.85` |
| [anthropic](https://github.com/anthropics/anthropic-sdk-python) | `0.87.0` | `0.104.1` |
| [ruff](https://github.com/astral-sh/ruff) | `0.15.7` | `0.15.14` |


Updates `pydantic` from 2.12.5 to 2.13.4
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.12.5...v2.13.4)

Updates `typer` from 0.24.1 to 0.25.1
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.24.1...0.25.1)

Updates `claude-agent-sdk` from 0.1.50 to 0.2.85
- [Release notes](https://github.com/anthropics/claude-agent-sdk-python/releases)
- [Changelog](https://github.com/anthropics/claude-agent-sdk-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/claude-agent-sdk-python/compare/v0.1.50...v0.2.85)

Updates `anthropic` from 0.87.0 to 0.104.1
- [Release notes](https://github.com/anthropics/anthropic-sdk-python/releases)
- [Changelog](https://github.com/anthropics/anthropic-sdk-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/anthropic-sdk-python/compare/v0.87.0...v0.104.1)

Updates `ruff` from 0.15.7 to 0.15.14
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.7...0.15.14)

---
updated-dependencies:
- dependency-name: pydantic
  dependency-version: 2.13.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-minor-and-patch
- dependency-name: typer
  dependency-version: 0.25.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-minor-and-patch
- dependency-name: claude-agent-sdk
  dependency-version: 0.2.85
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-minor-and-patch
- dependency-name: anthropic
  dependency-version: 0.104.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-minor-and-patch
- dependency-name: ruff
  dependency-version: 0.15.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python-minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-22 17:21:53 -04:00
Seth Hobson 2d3f6a8527 chore: move toolchain to uv-native (no pip, no requirements.txt) (#543)
* chore: move toolchain to uv-native (no pip, no requirements.txt)

The repo previously mixed uv (for plugin-eval) with pip + requirements.txt
(for yt-design-extractor) and raw `python3` invocations in the Makefile and
CI workflows. This makes the toolchain uniformly uv-managed.

## yt-design-extractor

Moved `tools/yt-design-extractor.py` into `tools/yt-design-extractor/` with its
own `pyproject.toml` + `uv.lock`. EasyOCR (and its ~2 GB torch dependency)
becomes an optional extra (`uv sync --extra easyocr`). Deleted
`tools/requirements.txt`.

## Makefile

All targets now route through uv:
- `make install` / `make install-easyocr` / `make deps` / `make check` / `make run*`:
  `cd tools/yt-design-extractor && uv run/uv sync`
- `make generate` / `make validate` / `make garden` / `make clean-generated`:
  `uv run --project plugins/plugin-eval python tools/...` (reuses plugin-eval's
  venv — it already has pyyaml and `extra-paths = ["../.."]` for tools/adapters)
- `make test` / `make smoke-test`: `uv run --project plugins/plugin-eval pytest`

## CI

- `.github/workflows/validate.yml`:
  - `multi-harness-generate` swapped from `actions/setup-python@v5` to
    `astral-sh/setup-uv@v5` + `uv sync` of plugin-eval before `make generate-all`
  - Workflow-level `permissions: contents: read` + `persist-credentials: false`
    on every checkout (carrying the security hardening forward consistently)
- `.github/workflows/code-quality.yml`:
  - `json-lint` job swapped from `setup-python` to `setup-uv`
  - YAML validator now uses `uv run --with pyyaml python` (no pre-step install)
  - JSON/TOML validators use `uv run python` (stdlib `json.tool`, `tomllib`)
  - Dropped the standalone `pip install pyyaml --quiet` line

## Inline hints

- `plugins/plugin-eval/src/plugin_eval/layers/judge.py`: error message
  recommends `uv sync --extra llm` instead of `pip install plugin-eval[llm]`
- `tools/yt-design-extractor/yt-design-extractor.py`: usage docstring and
  install hints now reference `make install` / `make install-easyocr` / `uv run`

The pip refs inside plugin-authored commands (deps-audit.md, doc-generate.md,
error-trace.md) describe scanning **user** Python projects — those legitimately
use pip and are out of scope.

Local gates green: make test (385 pass), make garden (0 errors), make validate
clean, ruff + format + ty all pass, markdownlint clean.

* chore: address PR #543 review feedback

- checkmake (Makefile): consolidate the multi-line `.PHONY:` declaration
  onto a single line. The previous backslash-continued form was readable
  but checkmake couldn't parse it, falsely flagging `validate` and
  `clean-generated` as missing from .PHONY. They were already declared —
  just invisible to the linter.

Other CodeRabbit feedback declined:

- pyproject.toml dep version constraints (CodeRabbit self-tagged "Low value"):
  uv.lock pins exact versions for reproducibility; upper bounds on yt-dlp,
  Pillow, etc. would invite stale-pin churn without changing the locked
  installation. Tracking upstream aggressively is the right default for a
  utility tool.

- SHA-pinning for GitHub Actions (CodeRabbit "Major" but defensible):
  Workflow has no write scope (permissions: contents: read on both files),
  no secrets are exposed, and the actions involved are first-party Anthropic
  (astral-sh, actions/*, DavidAnson). Same policy decision as PR #542 —
  blanket SHA pinning is a bigger commitment than this PR's scope warrants.

* chore: pin all GitHub Actions to commit SHAs

Addresses CodeRabbit's Major finding (zizmor `unpinned-uses`). Reverses the
earlier policy decision now that the workflow scope has grown — pins both
workflows consistently in one pass:

- actions/checkout         v4  → 34e114876b0b11c390a56381ad16ebd13914f8d5
- actions/setup-node       v4  → 49933ea5288caeca8642d1e84afbd3f7d6820020
- actions/upload-artifact  v4  → ea165f8d65b6e75b540449e92b4886f43607fa02
- astral-sh/setup-uv       v5  → e58605a9b6da7c637471fab8847a5e5a6b8df081
- DavidAnson/markdownlint-cli2-action v18 → eb5ca3ab411449c66620fe7f1b3c9e10547144b0
- oven-sh/setup-bun        v2  → 0c5077e51419868618aeaa5fe8019c62421857d6

Each pin keeps the version tag in a trailing comment for human readability
and dependabot/renovate compatibility.

Both workflows YAML-validated locally; functionality unchanged.
2026-05-22 12:20:56 -04:00
Seth Hobson 98862b56d8 feat: AGENTS.md canonical context + OpenAI harness-engineering layout (#542)
* feat: AGENTS.md canonical context + OpenAI harness-engineering layout

Promote AGENTS.md to the committed cross-harness context file (per the
agents.md convention and OpenAI's harness-engineering blog). Harness-
specific files become thin redirects:

- AGENTS.md          — canonical, committed (~74 lines, table-of-contents)
- CLAUDE.md          — `@AGENTS.md` import + Claude-specific addenda
- GEMINI.md          — Gemini-specific setup only
- .gemini/settings.json — redirects Gemini CLI's context to read AGENTS.md
- ARCHITECTURE.md    — new at root, top-level architectural map
- gemini-extension.json — bumps version to 1.7.0, sets contextFileName: AGENTS.md
- .gitignore         — drops the AGENTS.md entry (file is now committed)

Harness support verified:
- Codex CLI reads AGENTS.md natively (root → cwd walk, 32 KiB cap)
- Cursor 2.5+ reads AGENTS.md natively
- OpenCode reads AGENTS.md natively (wins over CLAUDE.md if both exist)
- Claude Code: `CLAUDE.md` first line is `@AGENTS.md` (Anthropic's
  documented interop pattern)
- Gemini CLI: `.gemini/settings.json` context.fileName redirect
  (Gemini doesn't support @-imports)

Codex adapter no longer generates AGENTS.md — `emit_global` instead
validates the committed file fits Codex's 32 KiB cap and the 150-line
table-of-contents convention. Tests updated. Clean-output target no
longer touches AGENTS.md.

## Auxiliary files updated for multi-harness reality

- `.github/ISSUE_TEMPLATE/bug_report.yml` — dropdown for harness +
  component path; renames "subagent" → "plugin/agent/skill/command"
- `.github/ISSUE_TEMPLATE/feature_request.yml` — scope dropdown covers
  framework / harness / tooling / docs / CI in addition to components
- `.github/ISSUE_TEMPLATE/new_subagent.yml` — relabeled "New Component
  Proposal" with component-type dropdown (plugin/agent/skill/command/
  harness adapter) and cross-harness portability field
- `.github/ISSUE_TEMPLATE/config.yml` — links to AGENTS.md, authoring
  guide, per-harness docs; updated Contributing link to root
- `.github/CONTRIBUTING.md` — thin pointer to canonical root CONTRIBUTING.md
- `.github/PULL_REQUEST_TEMPLATE.md` — new; scope + affected-harness
  checklists, test-plan checklist, portability-notes section
- CONTRIBUTING.md (root) — updated to reference AGENTS.md / ARCHITECTURE.md
- gemini-extension.json — version 1.6.0 → 1.7.0, count fixes, redirects
  to AGENTS.md as contextFileName

## Code-quality CI

New `.github/workflows/code-quality.yml` with three jobs:
- `python-lint` — `ruff check`, `ruff format --check`, `ty check` on
  the adapter framework + plugin-eval. yt-design-extractor.py legacy
  code excluded.
- `markdown-lint` — markdownlint-cli2 against README, AGENTS, ARCHITECTURE,
  CLAUDE, top-level guides, and docs/. Config in `.markdownlint.json`.
- `json-lint` — validates every JSON / TOML / YAML in the repo (excluding
  generated trees).

Required ty environment config added to plugin-eval/pyproject.toml so
`tools.adapters.*` resolves from outside the package.

Fixed one ty error in `tools/adapters/base.py:HarnessAdapter.capabilities`
(return-type annotation didn't match the `Capability` dataclass returned).
Fixed two ruff SIM108 ternary suggestions in codex.py and doc_gardener.py.
ruff format applied across all in-scope files (formatting-only diffs).

## Tests + verification

- 387 pytest tests pass (1 new test for the AGENTS.md validate-don't-overwrite behavior)
- `make validate STRICT=1` clean
- `make garden` 0 errors (10 warnings — remaining oversize source skills)
- `make smoke-test` clean against locally installed OpenCode/Gemini/Codex/Claude Code
- Real-CLI round-trip: `opencode agent list` discovers 193 subagents,
  `gemini extensions validate .` succeeds, all 191 Codex agent TOMLs parse

## Tag recommendations (separate task — for repo About panel)

Top 20 by reach + relevance (from `gh api search/repositories?q=topic:<tag>`):
automation mcp ai-agents developer-tools claude-code anthropic agentic-ai
agents prompt-engineering cursor multi-agent agent-skills orchestration
opencode workflows gemini-cli codex-cli claude-code-skills cursor-rules
claude-code-plugins

* fix(ci): YAML multi-doc + markdownlint scope/rules

Two CI failures on PR #542, both fixed:

## JSON/TOML/YAML syntax job (3 false-positive YAML errors)

The job's YAML validation used `yaml.safe_load` which only reads the first
document in a multi-document YAML stream. Three Kubernetes manifest
templates use the standard `---` document separator (valid YAML) and were
mis-flagged:

  plugins/kubernetes-operations/skills/k8s-manifest-generator/assets/configmap-template.yaml
  plugins/kubernetes-operations/skills/k8s-manifest-generator/assets/service-template.yaml
  plugins/kubernetes-operations/skills/k8s-security-policies/assets/network-policy-template.yaml

Switched to `list(yaml.safe_load_all(...))` so multi-doc YAML is accepted.

## Markdown lint job (lots of pre-existing plugin-README violations)

Two changes:

1. **Narrow the lint glob** — markdownlint now runs against top-level
   guides (README, AGENTS, ARCHITECTURE, CLAUDE, per-harness setup,
   CONTRIBUTING) and our authored `docs/` only. Per-plugin READMEs
   (`plugins/*/README.md`) are owned by their plugin authors and not
   lint-gated as part of this framework PR. Lint enforcement for those
   belongs at the plugin-author layer, not the framework PR layer.

2. **Tighten `.markdownlint.json`** — disable two rules that produce
   noise without catching real defects:
   - MD040 (fenced-code-language) — terminal output / shell command
     blocks frequently omit a language by convention
   - MD060 (table-column-style) — cosmetic table-pipe spacing; doesn't
     affect rendering

   Genuine formatting rules kept: MD029 (ol-prefix), MD031 (blanks-
   around-fences), MD032 (blanks-around-lists), MD056 (table-column-
   count), MD058 (blanks-around-tables).

## Real defects caught and fixed

The narrower scope still caught 5 real issues:

- `docs/agent-skills.md:397` — code fence inside an ordered list item
  needed a blank line before the fence
- `docs/authoring.md:90` — bulleted list needed a blank line above
- `docs/plugin-eval.md:87` — table needed a blank line above
- `OPENCODE.md:39` — table-column-count error caused by literal `|`
  inside backticks: ``mode: primary|subagent|all`` (3 cells reads as 5)
  Rewrote as ``mode:` one of `primary` / `subagent` / `all``

## Verification

- `npx markdownlint-cli2 "*.md" "docs/*.md"` → 0 errors
- `yaml.safe_load_all` accepts all multi-doc YAMLs (0 errors)
- All other CI jobs already passing (Python ruff/ty, multi-harness
  generate, CLI smoke test, plugin-eval pytest, tools pytest)

* fix: address PR #542 bot feedback

- Codex P2 (chatgpt-codex-connector): emit_global now reads AGENTS.md from
  the repo root (WORKTREE), not output_root. Previously `--output-root <scratch>`
  produced a false "missing" warning even when AGENTS.md was committed at the
  real root, breaking --strict generation outside the repo. Added a constructor
  arg `repo_root` so tests can stage a fake AGENTS.md without touching the
  committed file, plus a regression test that proves the two paths are decoupled.

- CodeRabbit nitpick (code-quality.yml): added workflow-level `permissions:
  contents: read` and `persist-credentials: false` on every checkout. Skipped
  the SHA-pinning recommendation — it's a heavier blanket-policy decision and
  the workflow has no write scope to abuse.

- CodeRabbit nitpick (pyproject.toml): consolidated the duplicate `dev` groups
  by moving `ty` into `[project.optional-dependencies].dev` and removing the
  now-empty `[dependency-groups]` block. Dropped `--group dev` from
  `code-quality.yml`'s `uv sync` since `--all-extras` now covers it.

- Verified gemini-extension.json counts (82/191/155/102) against the actual
  source-of-truth: 81 local plugins + 1 external = 82 in marketplace.json,
  191 agent .md files, 155 SKILL.md files, 102 command .md files. Counts are
  correct as-is — CodeRabbit's quick-win was a regex miscount.
2026-05-22 11:16:39 -04:00
Seth Hobson be57c0b2e3 feat: multi-harness plugin marketplace (Codex, Cursor, OpenCode, Gemini) (#541)
* feat(adapters): multi-harness framework + harness_portability eval dimension

Turn this Claude Code plugin marketplace into a generic agentic-harness
marketplace. Adapters under tools/adapters/ emit harness-native artifacts
for OpenAI Codex CLI, Cursor, OpenCode, and Gemini CLI from a single
Markdown source. Source-of-truth stays under plugins/ — Claude Code is
unchanged.

Framework (tools/adapters/):
- base.py — PluginSource parser, HarnessAdapter ABC, write/mirror helpers
  (path-traversal guard, UTF-8-safe), inline-list + block-list + block-scalar
  YAML-ish parser, _utf8_safe_cut, _split_inline_list, _normalize_author
- capabilities.py — per-harness capability matrix, TOOL_NAME_MAPS,
  MODEL_ALIASES, resolve_model() with explicit warnings
- codex.py — emits .codex/{skills,agents}/ + AGENTS.md (≤150-line
  table-of-contents). Fence-aware body splitter, _utf8_safe_cut for
  multibyte safety, _yaml_scalar with reserved-word + special-char quoting.
  Skill/command name collision detection (and second-order __cmd fallback).
- cursor.py — emits .cursor-plugin/{plugin,marketplace}.json + curated
  .cursor/rules/*.mdc. _validate_mdc_frontmatter handles YAML block scalars
  (no false positives on colons in description body). _normalize_author
  handles dict, npm-style strings, and author lists.
- opencode.py — transpiles agents to .opencode/agents/<id>.md with
  mode:subagent + permission: deny-everything-else block (skill/task always
  allowed as base capabilities — Claude's implicit defaults).
- gemini.py — emits native skills/, agents/, and commands/ at extension
  root (April 2026 spec). Tool-allowlist remapped via TOOL_NAME_MAPS.

CLI + tooling:
- tools/generate.py — unified `make generate HARNESS=<x> [PLUGIN=<y>]`,
  with --clean (containment-guarded; case-insensitive on Darwin/Win32),
  --prune (orphan removal across all per-harness output trees), --strict
  (warnings fail), per-plugin error aggregation, refuses --clean --plugin
  (would silently wipe other plugins' artifacts).
- tools/validate_generated.py — structural validation across all four
  harness outputs. Codex 8KB cap → error. _extract_permission_block
  correctly handles nested permission keys (column-0 only).
- tools/doc_gardener.py — recurring drift detection per OpenAI harness-
  engineering principle. STALE_ARTIFACT (info), DEAD_LINK (error),
  MARKETPLACE_ORPHAN (error), SKILL_OVER_CODEX_CAP (warning), grouped
  output sorted by severity.

plugin-eval (extends existing framework):
- New harness_portability dimension (6% weight, rebalanced from existing
  static sub-scores). Surfaces non-portable patterns with concrete
  remediation hints: SKILL_OVER_CODEX_CAP, CLAUDE_TOOL_REFS,
  CLAUDE_TOOL_PROSE, AGENT_NAME_COLLISION, BARE_MODEL_ALIAS.
- _CAMEL_TOOL_PATTERN requires Claude-tool context (no false positives
  on Rust's `Task` etc.). _TOOL_PROSE_PATTERN case-sensitive on tool
  names, case-insensitive on the leading article.
- Findings do NOT also feed anti_pattern_penalty (no double-counting).

Documentation:
- Top-level guides: CODEX.md, CURSOR.md, OPENCODE.md (≤150 lines each,
  table-of-contents pattern per OpenAI harness-engineering post)
- docs/harnesses.md — capability matrix, graceful-degradation table,
  generated output paths
- docs/authoring.md — portable-content style guide (tools, models,
  collision rules, fence-respect)
- docs/round-trip-results.md — real-CLI verification recipes (OpenCode
  discovers 193 subagents, Gemini extensions validate passes, Codex
  TOMLs all parse)
- CONTRIBUTING.md — new file pointing at docs/authoring.md
- README.md — rewritten for multi-harness (145 lines, was 460)
- CLAUDE.md — trimmed to 60-line table-of-contents
- GEMINI.md — trimmed from 1500 to 500 tokens (3× over budget previously)

Tests: 181 passing (103 plugin-eval + 78 tools/tests). Real-CLI round-trip
verified for OpenCode, Gemini, and Codex (TOML parses).

Replaces tools/generate_gemini_commands.py with the unified CLI.

* refactor(skills): extract detail to references/details.md (~75 skills)

Apply Anthropic's canonical SKILL.md progressive-disclosure pattern across
the marketplace: SKILL.md body becomes a navigation tier (trigger phrasing
+ quick start), detailed templates and worked examples move to
references/details.md (loaded on demand by the agent).

Motivation: OpenAI Codex CLI hard-truncates skills at 8 KB. Before this
change, ~90 skills exceeded that cap and would silently break on Codex.
The progressive-disclosure pattern is also Anthropic's documented
recommendation for token efficiency — Claude Code reads references/ files
on demand when the body navigation says to.

What's extracted, by pattern:
- Pass 1 (## Templates section): 19 skills — full template libraries
  moved to references/details.md
- Pass 2 (## Implementation Patterns / ## Advanced Patterns): 13 skills
- Pass 3 (everything between nav-tier and wrap-tier headings): 53 skills
- Conservative re-extraction for 8 skills that got over-reduced — kept
  ~6-7 KB inline (most of the quick-start tier) plus references/ overflow

What stays inline (SKILL.md navigation tier):
- description: frontmatter (triggering — unchanged for all skills)
- ## When to Use This Skill / ## Core Concepts / ## Quick Start
- ## Best Practices / ## Troubleshooting / ## See Also wrap-ups
- A pointer note ("see references/details.md") so the agent knows where
  to look for detail

What goes to references/details.md (detail tier, on-demand load):
- ## Templates (full code template libraries)
- ## Implementation Patterns / ## Advanced Patterns (deep examples)
- Mid-skill walkthroughs that exceed the inline budget

Also in this commit:
- plugins/brand-landingpage description trimmed from 958→543 chars
  (preserves trigger phrasing, drops verbose example-quote list)

Net effect:
- SKILL_OVER_CODEX_CAP findings: 90 → 10 (88% reduction)
- All triggers unchanged — discovery behavior identical across harnesses
- 75 new references/details.md files with the extracted content
- Same depth of guidance, loaded progressively

Remaining 10 oversized skills are complex multi-section docs (e.g.
postgresql, code-review-excellence, evaluation-methodology) that need
per-skill manual judgment — flagged by `make garden` for future work.

* chore: bump all plugin versions (multi-harness release)

Patch-bump every local plugin (81) in both .claude-plugin/marketplace.json
entries and each plugins/<name>/.claude-plugin/plugin.json. Minor-bump the
top-level marketplace metadata.version (1.6.0 → 1.7.0) to signal the
multi-harness adapter framework addition.

The external git-subdir entry (qa-orchestra) is unaffected — its version
is governed by its upstream repo.

* fix(opencode): preserve explicit tools:[] + word-boundary subtask match

Addresses two Codex review findings on PR #541.

## P1 — `tools: []` silently upgraded to permissive (privilege escalation)

Before: `_build_permission_block` returned `{}` for any empty list, which
omits the `permission:` block entirely from the emitted agent. An author
who explicitly wrote `tools: []` to lock down an advisory-only agent got
an UNRESTRICTED agent in OpenCode. Affected agent in this tree:
`plugins/arm-cortex-microcontrollers/agents/arm-cortex-expert.md`.

Fix: `_build_permission_block` now takes a `has_tools_field` flag so the
caller can distinguish "tools: key missing" (Claude default permissive)
from "tools: []" (explicit lock-down). The lock-down case emits a
deny-everything block that allows ONLY the base capabilities (skill, task)
that Claude Code always grants implicitly. Verified against the real
arm-cortex-expert agent — now emits read/edit/write/bash/grep/glob/list:
deny, task/skill: allow.

## P2 — `"agent" in cmd.body.lower()` false-positives on substrings

Before: a command body containing `PerformanceReviewAgent` (class name
in a code snippet) or `useragent` triggered `subtask: true`, changing
runtime behavior based on incidental text.

Fix: switch to a compiled word-boundary regex `\b(agent|subagent)s?\b`
(case-insensitive). Tests confirm the substring `PerformanceReviewAgent`
no longer fires, while a real "spawn a subagent" sentence still does.

## Tests

3 new regression tests in tools/tests/test_adapters.py:
- `test_explicit_empty_tools_yields_locked_permission_block` (P1)
- `test_missing_tools_field_yields_no_permission_block` (P1 boundary)
- `test_subtask_inference_word_boundary` (P2)

184 total tests pass (was 181). OpenCode round-trip still discovers all
193 subagents; arm-cortex-expert agent is now properly locked down.

* test: behavioral verification + CI gates for multi-harness pipeline

Adds three layers of automated verification that pure-Python parser tests
miss, plus the CI jobs that turn them into hard gates. Catches the kinds
of issues that previously only surfaced when a real user installed the
marketplace and tried to use it.

## test_real_world.py — real-source structural tests

Runs against the actual `plugins/` tree (not synthetic fixtures). Catches
issues that only appear on real content:

- every marketplace entry resolves to a plugins/<name>/ dir
- every local plugin dir appears in marketplace.json
- marketplace.json version == per-plugin plugin.json version (catches drift)
- every plugin loads via load_plugin() without error
- no plugin name contains `__` (adapter namespace separator)
- every agent has name + description; every skill has a trigger phrase
  (same regex plugin_eval's MISSING_TRIGGER check uses)
- no agent name collides with Codex built-ins
- every refactored skill (with `references/details.md`) has:
  - meaningful detail content (>=500 B in details.md)
  - a pointer to references/ in the SKILL.md body
  - a navigation-tier heading preserved (When to Use, Overview, etc.)
  - body >= 600 B (not a stub)
- every plugin.json has name + version matching the dir

This test pass found and fixed three real defects before commit:
- ship-mate/skills/scan: description had no trigger phrase ("Use when…")
- reverse-engineering/skills/memory-forensics: nav-tier section lost
  during extraction
- reverse-engineering/skills/binary-analysis-patterns: same

All three are now fixed (preserved trigger phrasing, added When-to-Use
sections back to the skills my extraction over-trimmed).

## test_round_trip.py — generate→parse→verify

CI runs this AFTER `make generate-all`. Catches generation-time regressions:

- OpenCode/Codex/Gemini agent counts match source agent count (no skips)
- every Codex SKILL.md under 8 KB (the cap that would silently truncate)
- every Codex agent TOML has required fields + valid sandbox_mode
- every OpenCode agent has mode in {primary,subagent,all} and
  provider-prefixed model
- locked agents (source `tools: []`) emit proper deny-everything permission
  block with skill/task allow (regression guard for PR-541 P1)
- every Gemini @{path} injection resolves to a real source file
- every Gemini command TOML has prompt + {{args}} placeholder
- every context file (CLAUDE.md, AGENTS.md, GEMINI.md, etc.) within
  150-line cap
- Cursor marketplace + per-plugin manifests cover all local plugins
- .cursor/rules/*.mdc only use the 3 documented frontmatter keys

## test_cli_smoke.py — real-CLI subprocess tests

Invokes the actual harness binaries (OpenCode, Gemini, Codex, Claude Code)
against the generated artifacts. Catches CLI-level issues pure-Python
parsing can't see: schema-loader drift, plugin-discovery bugs, version
incompatibilities.

- `opencode agent list` — must succeed AND discover every source agent
  (currently 191 + 2 OpenCode built-ins)
- `gemini extensions validate <repo>` — must return success
- `codex doctor` — must report healthy install
- every Codex agent TOML must parse with stdlib `tomllib`
- `claude --version` — sanity check the Claude Code CLI loads
- marketplace.json must have owner + metadata.version for Claude Code's loader

Per-CLI tests skip gracefully when the binary isn't on PATH, so local
devs only exercise what they have installed. CI installs OpenCode +
Gemini and turns those skips into hard gates.

## Makefile + CI

- `make test` — full pytest suite (plugin-eval + tools/tests/)
- `make smoke-test` — generates if needed, then runs real-CLI smoke tests
- `.github/workflows/validate.yml` extended with:
  - `tools-tests` job — runs pytest tools/tests/
  - `multi-harness-generate` job — `make generate-all && make validate
    STRICT=1 && make garden`, uploads generated artifacts on every run
  - `cli-smoke-test` job — installs OpenCode + Gemini, runs test_cli_smoke.py

## Test counts

- Before: 184 tests
- After: 386 tests (parameterized real-source tests over all 82 plugins)
- All passing locally on OpenCode 1.15.7 + Gemini 0.42.0 + Codex 0.133.0
  + Claude Code 2.1.148
2026-05-22 08:18:21 -04:00
jau123 4bb47e9eeb meigen-ai-design: bump to 1.0.8, pin npm to meigen@1.3.2 (#538) 2026-05-21 16:01:37 -04:00
dependabot[bot] 0a8ea4f308 chore(deps): bump idna from 3.11 to 3.15 in /plugins/plugin-eval (#539)
Bumps [idna](https://github.com/kjd/idna) from 3.11 to 3.15.
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.md)
- [Commits](https://github.com/kjd/idna/compare/v3.11...v3.15)

---
updated-dependencies:
- dependency-name: idna
  dependency-version: '3.15'
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-21 16:01:33 -04:00
Seth Hobson 08ded5e7b0 fix: agent teams coordination guardrails (#535)
* fix agent teams coordination guardrails

* address agent teams review feedback
2026-05-16 20:46:39 -04:00
mehmet turac 3e17b71b2d feat(machine-learning-ops): add recsys-pipeline-architect skill (#533)
Adds recsys-pipeline-architect under plugins/machine-learning-ops/skills/.
A skill for designing composable recommendation, ranking, and feed
pipelines using the six-stage Source→Hydrator→Filter→Scorer→Selector→
SideEffect framework popularized by xAI's open-sourced X For You
algorithm. Independent MIT reimplementation; surfaces multi-action vs
single-score, candidate isolation vs joint, and online vs offline batch
trade-offs explicitly.

Skill is a single SKILL.md file following Anthropic's agent-skills spec
(name + description frontmatter). Activation triggers cover content
feeds, search ranking, RAG rerankers, task prioritizers, and
notification triage.
2026-05-16 20:15:54 -04:00
jon 112197c6bf fix(plugin-eval): broaden MISSING_TRIGGER pattern to match canonical phrasings (#530)
The static-layer trigger heuristic was a literal substring match on
"Use when …" / "Use this skill when …" / "Use proactively" / "Trigger
when …". Three real-world phrasings were missed:

1. Third-person canonical form recommended by Anthropic's own plugin-dev
   skill-development skill: "This skill should be used when …" (contains
   "used when", not "use when"). Running the previous regex on plugin-dev
   itself produces 7 false-positive MISSING_TRIGGER flags.

2. Prepositional temporal triggers: "Use after …", "Use before …",
   "Use immediately before …", "Use whenever …". Common in self-audit
   and hook-adjacent skills (e.g. functional-emotions: 6 flags).

3. Path-triggered self-documenting skills: "Auto-loads when …".

Extract the pattern to a module-level `_TRIGGER_PATTERN` and share it
between the anti-pattern detector and `_description_pushiness` so the
two sites stay in sync. Expand it to match `(should be )?use(d)?
(this skill )?(immediately )?(when|after|before|whenever)` plus
`auto-loads when` and `trigger when`.

Verification:
- plugin-dev (Anthropic's own): 33.82 → 55.18, MISSING_TRIGGER cleared
- functional-emotions: 39.04 → 59.68, all 6 false positives cleared
- 22 tests pass, including 11 new positive-form parametrised cases
  and 2 regression tests against canonical Anthropic phrasings.
2026-05-14 09:04:34 -04:00
jon 83d70bcc58 fix(plugin-eval): surface plugin-level depth downgrades loudly (#532)
`plugin-eval certify <plugin-dir>` advertises a deep, three-layer
evaluation (static + judge + Monte Carlo) but `EvalEngine.evaluate_plugin`
only runs the static layer regardless of requested depth, since judge
and Monte Carlo are per-skill primitives. The docstring on that method
acknowledges this, but nothing surfaces it to the user:

  - The CLI emits no warning.
  - The markdown report prints `**Depth:** deep` even though only the
    static layer ran.
  - The user's only signal is a footnote ("No model usage") near the
    bottom of the report and the `Confidence: Estimated` row — both
    easy to miss when the requested depth said otherwise.

This change makes the downgrade impossible to miss without changing
the underlying eval behaviour (per-skill judge aggregation is a larger
feature, not a bug fix):

1. **CLI warning to stderr.** `_run_score` detects plugin-target runs
   at non-quick depth and prints a yellow `warning:` line to stderr
   naming the skipped layers and the workaround (run on a single skill
   to get the deeper layers).

2. **In-band markdown callout.** `Reporter` now derives the *effective*
   depth from the set of layers actually present in the result. When it
   differs from the requested depth, the report header reads
   `Depth: deep (requested) → quick (effective)` and a `> Note:` block
   above the score table explains why and how to get the deeper layers.

3. **Effective-depth helper.** `_effective_depth(result)` maps the set
   of layer names (`static` / `judge` / `monte_carlo`) back to a `Depth`
   value, so the reporter never has to trust `result.config.depth` when
   describing what actually ran.

Tests:
  - `TestDepthDowngradeWarning` (4 tests): asserts the helper, the
    "no warning when honored" path, and the warning content for both
    deep and standard requests.
  - `TestCLI` (2 new tests): asserts the stderr warning is emitted on
    plugin-level certify and is *not* emitted at quick depth.

Full plugin-eval suite (75 tests) passes.
2026-05-14 08:57:04 -04:00
jau123 86bad08ba7 meigen-ai-design: bump to 1.0.7, pin npm to meigen@1.3.1 (#527)
Supersedes #525 (1.0.6 / meigen@1.3.0).

What's new in npm meigen@1.3.1:

- Veo 3.1 capability expansion: fast/pro tiers + 4/6/8s durations +
  720p/1080p/4K resolutions at the same price per tier+duration.
- Seedance 2.0 reference-video continuation: new `referenceVideo` +
  `referenceVideoDuration` paired params for semantic continuation
  of a previous clip.

No schema breaking changes — every new field is optional. Existing
1.3.0 calls continue to work unchanged.

Release notes: https://github.com/jau123/MeiGen-AI-Design-MCP/releases/tag/v1.3.1
2026-05-14 08:44:23 -04:00
Pranay Yadav 34632bcbea feat: add ship-mate plugin (#505) 2026-05-11 19:29:31 -04:00
dependabot[bot] 74fd2a5798 chore(deps): bump python-multipart in /plugins/plugin-eval (#521)
Bumps [python-multipart](https://github.com/Kludex/python-multipart) from 0.0.26 to 0.0.27.
- [Release notes](https://github.com/Kludex/python-multipart/releases)
- [Changelog](https://github.com/Kludex/python-multipart/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Kludex/python-multipart/compare/0.0.26...0.0.27)

---
updated-dependencies:
- dependency-name: python-multipart
  dependency-version: 0.0.27
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-09 09:08:48 -04:00
Seth Hobson ece811f233 docs(security-scanning): remove links to unwritten SAST reference and asset files (#516)
The Reference Documentation and Templates & Assets sections of
sast-configuration's SKILL.md linked to six files that don't exist
(references/{semgrep-rules,sonarqube-config,codeql-setup}.md,
assets/{semgrep-config.yml,sonarqube-settings.xml}, scripts/run-sast.sh).
The references/, assets/, and scripts/ directories were created but
never populated. Removed the two sections so the skill no longer
points users at 404s; the inline configuration examples that
remain in the skill body cover the immediate setup needs.

A repo-wide sweep across all 153 SKILL.md files confirms no other
dead references/, assets/, or scripts/ links remain.

Fixes #514
2026-05-02 17:35:12 -04:00
Travis 51d8a2dd54 feat: add brand-landingpage plugin (Stitch-backed landing page workflow) (#509) 2026-05-02 17:14:47 -04:00
jau123 7d17c7552d meigen-ai-design: bump to 1.0.5, pin npm to meigen@1.2.13 (#510)
Co-authored-by: jau123 <quaasparrotte@gmail.com>
2026-05-02 17:14:31 -04:00
Seth Hobson 1ca21d893b docs(review-agent-governance): fix SKILL.md compose example
Update the "Composing with protect-mcp" example to use the current
hooks array schema and pin protect-mcp@0.5.5, matching the runtime
hooks.json. Prevents users from copy-pasting a config that current
Claude Code refuses to load.
2026-04-27 20:27:59 -04:00
Tom Farley 02e77c58ca fix(review-agent-governance): use current hooks array schema
Migrates plugins/review-agent-governance/hooks/hooks.json from the
deprecated singular "hook": {...} shape to the current
"hooks": [{...}] array shape, matching the schema fix that landed
in #503 for plugins/protect-mcp/hooks/hooks.json.

Same conversion applied to both PreToolUse and PostToolUse blocks:

  Before: { "matcher": ".*", "hook": {"type": "command", ...} }
  After:  { "matcher": ".*", "hooks": [{"type": "command", ...}] }

Verified the resulting structure matches the post-#503 shape used by
plugins/protect-mcp/hooks/hooks.json byte-for-byte at the schema level.
Without this fix, current Claude Code reports
"path: hooks.PreToolUse.0.hooks - expected array, received undefined"
on plugin load.
2026-04-26 19:53:53 -04:00
tommylauren 0ae6bca711 fix(review-agent-governance): pin protect-mcp@0.5.5 in hooks.json
Resolves wshobson's blocker: npx protect-mcp@latest reintroduces the
reproducibility gap closed by #497 for the protect-mcp plugin. Pins
both PreToolUse and PostToolUse hook invocations to 0.5.5.
2026-04-26 19:52:50 -04:00
tommylauren cb381c47d1 fix: address @wshobson review feedback on #495
Three blocking items + one non-blocking clarification from the review:

1. marketplace.json unicode regression FIXED. Reset the file to upstream
   HEAD, then inserted ONLY the review-agent-governance entry with a
   string-based append that preserves every existing UTF-8 character
   byte-for-byte. No entries other than the new one are modified.
   `grep -c '\\u' marketplace.json` returns 0 escape sequences.

2. approve-review.md $1 → $ARGUMENTS. The marketplace slash-command
   convention (per plugins/codebase-cleanup/commands/deps-audit.md from
   PR #490) is $ARGUMENTS, which captures the full argument including
   spaces. $1 only captured the first word. Also JSON-escape the reason
   before embedding in the approval record (via python3 json.dumps) so
   quotes, backslashes, and newlines do not break the JSON body. This
   resolves the non-blocking JSON-escape note too.

3. README honesty on the approval log. Previously claimed the chain
   "records exactly which actions were human-gated and when," which was
   overstating: approval log entries under ./review-receipts/approvals/
   are plain JSON, not signed. Rewrote that paragraph to explicitly
   separate the signed PostToolUse chain (covered by
   @veritasacta/verify) from the operator-trust approval log. Points
   users at protect-mcp sign directly if they need signed approval
   records for regulated environments.

4. Added an explicit note on what the signed chain covers when the
   approval flag is present: PreToolUse short-circuits without calling
   Cedar, so the downstream PostToolUse receipt has decision:allow but
   no policy_digest. Auditors walking the chain should expect this.
   Resolves the "document the short-circuit" non-blocking item.

Not addressed (pending Seth's follow-up):
- marketplace.json conflict with #496 will be resolved by rebase order
  (whichever merges first; the other rebases)

Tests:
- python3 -m json.tool validates marketplace.json, plugin.json, hooks.json
- grep -c '\\u' on marketplace.json = 0
2026-04-26 19:52:50 -04:00
tommylauren 7e1aa0f977 feat: add review-agent-governance plugin (closes review-bot failure class)
Second inhabitant of the `governance` category. Addresses the failure mode
where an AI agent posts PR reviews, comments, merges, or edits CI config
without a human gate. Directly inspired by the Hermes-style incident
pattern where review-bot hallucinations produce account-linked damage.

Components
──────────
- plugin.json, README.md, skills/review-agent-setup/SKILL.md
- agents/review-policy-author.md (sonnet) — Cedar author specialized in
  review-surface gating across GitHub / GitLab / protected branches /
  CI paths / notification surfaces
- commands/approve-review.md — opens an approval window via ./.review-approved
  flag file, records the reason in ./review-receipts/approvals/
- commands/list-pending.md — walks the receipt chain to show recent denials
  (the set of actions the agent tried that were blocked)
- hooks/hooks.json — PreToolUse gate + PostToolUse sign
- policies/review-agent-governance.cedar — default Cedar policy with five
  forbid rules covering gh/glab review actions, protected-branch pushes,
  CI config paths, and WebFetch POSTs to hooks.slack.com / api.github.com

Behavior
────────
By default, the plugin forbids:
  - gh pr review|comment|merge|close|edit, gh issue comment|close|edit,
    gh release create|edit, gh api repos
  - GitLab and Bitbucket equivalents
  - git push to main|master|release|production
  - Writes to .github/workflows/, .gitlab-ci.yml, .circleci/config.yml,
    .github/CODEOWNERS
  - WebFetch POSTs to api.github.com / api.gitlab.com / hooks.slack.com /
    discord.com

Non-review actions pass through unchanged. Composes with protect-mcp for
general policy enforcement; configure separate receipt directories to
keep the chains distinct.

Approval pattern
────────────────
Human opens an approval window by creating ./.review-approved (or via
/approve-review "<reason>"). The PreToolUse hook short-circuits to
permit while the flag is present. Every action, approved or denied,
still produces an Ed25519 receipt, so the chain records exactly what
happened and under what approval.

Marketplace entry
─────────────────
Added under category: "governance" with seven discovery keywords. The
governance category now has two inhabitants (protect-mcp + this one),
which turns it from a vanity category into a real shelf.

Standards
─────────
- Ed25519 (RFC 8032), JCS (RFC 8785), Cedar (AWS)
- IETF draft-farley-acta-signed-receipts
- Uses protect-mcp as its evaluation/signing runtime
2026-04-26 19:52:50 -04:00
Seth Hobson adde832d8f fix: add missing frontmatter to service-mesh-expert and monorepo-architect
Both agent files were missing YAML frontmatter entirely, leaving them
unloadable as plugin agents. Adds name/description/model frontmatter
matching the conventions used by sibling architecture agents in each
plugin (opus tier, description sourced from existing intro line).

Bumps cloud-infrastructure to 1.3.1 and developer-essentials to 1.0.3.

Reported in #500.
2026-04-26 16:42:31 -04:00
Seth Hobson 89b93d5db4 Merge pull request #499 from thc1006/fix/supply-chain-hardening-v2
fix: supply chain hardening — pin actions, images, and fix secret logging
2026-04-26 16:26:17 -04:00
Seth Hobson 18a93eaac2 Merge pull request #504 from jau123/update-meigen-1.2.10
meigen-ai-design: bump to 1.0.2 (meigen@1.2.10)
2026-04-26 16:26:14 -04:00
jau123 d2abf70891 meigen-ai-design: bump to 1.0.2 (meigen@1.2.10, supersedes 1.2.9)
Updates to match upstream MeiGen MCP release 1.2.10.

- Bump pinned MCP server: meigen@1.2.8 → meigen@1.2.10
- Bump plugin version and marketplace entry: 1.0.1 → 1.0.2

Why skip 1.2.9:
meigen@1.2.9 was deprecated on npm earlier today because of a pricing
regression. It set GPT Image 2.0 as the new default model but left the
server-side `resolution` fallback at 2K, silently doubling credit cost
for users who did not pass `resolution` explicitly. 1.2.10 defaults
gpt-image-2 to 1K (10 credits, matching the platform product default).

What changed in meigen@1.2.10:
- gpt-image-2* defaults to 1K/medium = 10 credits
- New generate_image parameters: `resolution` (1K / 2K / 4K) and
  `quality` (low / medium) for opt-in upgrades or cost savings
- list_models now surfaces each model's supported resolutions and
  quality tiers (via extra_config) so the host LLM can make
  informed cost / detail tradeoffs
- SERVER_INSTRUCTIONS gains a "GPT Image 2.0 resolution / quality"
  section guiding the LLM to stay on 1K unless the use case
  (poster/print/wallpaper) justifies the cost

No behavioral change to agents, commands, or required env vars.

Upstream release: https://github.com/jau123/MeiGen-AI-Design-MCP/releases/tag/v1.2.10
npm deprecation note: https://www.npmjs.com/package/meigen/v/1.2.9
2026-04-23 19:17:30 +08:00
Devin Dissanayaka 4510da4e1f Refactor hooks to use hooks array structure 2026-04-23 11:14:48 +05:30
thc1006 5a36aa23b7 fix: supply chain hardening — pin actions, images, and fix secret logging
Supply chain:
- Pin GitHub Actions to stable releases instead of @master/@main:
  trivy-action@0.28.0, snyk@0.4.0, sonarcloud@v3, dependency-check@v6
- Update EOL actions: upload-artifact v3→v4, codeql/upload-sarif v2→v3,
  codecov v3→v4
- Pin container images to specific tags instead of :latest:
  kubectl:1.31, vault:1.17, prometheus:v3.2, jaeger:1.62, tempo:2.7,
  sonarqube:10.8-community, trivy:0.58.0, trufflehog:3.88, uv:0.6,
  temporalio auto-setup:1.26, temporalio ui:2.33

Security:
- Replace echo of secrets in CI examples with env var injection pattern
  (secrets-management SKILL.md)

Misc:
- Fix CRLF → LF line endings in deployment-engineer.md
2026-04-19 11:13:46 +00:00
Seth Hobson 27a7ed9575 Merge pull request #496 from tomjwxf/feat/signed-audit-trails-skill
feat: add signed-audit-trails teaching plugin (third governance-category skill)
2026-04-18 14:30:34 -04:00
tommylauren da311bfc54 chore(protect-mcp): pin protect-mcp@0.5.5 and @veritasacta/verify@0.3.0
Closes the version-pinning suggestion from @wshobson on #494. The
tamper-detection test in plugins/protect-mcp/test/run-tests.sh
previously called `npx protect-mcp@latest` and `npx @veritasacta/verify`
with no version constraint, meaning an upstream npm publish could
flip the test green or red without any repo-side signal. Pinning
eliminates that.

Changes
───────
- plugins/protect-mcp/hooks/hooks.json: 2 x
    protect-mcp@latest -> protect-mcp@0.5.5
  (PreToolUse evaluate + PostToolUse sign)

- plugins/protect-mcp/test/run-tests.sh:
    6 x protect-mcp@latest -> protect-mcp@0.5.5
    3 x @veritasacta/verify    -> @veritasacta/verify@0.3.0
  (the four PreToolUse test invocations, keygen, sign, plus the two
  verify calls in tests 7 and 8)

- Header comment at the top of run-tests.sh now mentions the pinned
  @veritasacta/verify version for clarity.

What is NOT pinned
──────────────────
README.md and SKILL.md references remain as `npx protect-mcp@latest`
and `npx @veritasacta/verify`. Those are documentation of the pattern
a user should use in their own project, and "latest" is the right
advice for that audience. The test infrastructure is the only
executed path where pinning matters for reproducibility.

How to bump
───────────
When you want to update (e.g., protect-mcp publishes 0.6.0 with a
breaking change to --input handling), update both files together:

  perl -i -pe 's/protect-mcp\@0\.5\.5/protect-mcp\@0.6.0/g' \
    plugins/protect-mcp/hooks/hooks.json \
    plugins/protect-mcp/test/run-tests.sh

Then re-run ./plugins/protect-mcp/test/run-tests.sh to confirm the
tamper-detection guard still passes before merging.

This PR does NOT touch review-agent-governance or signed-audit-trails
because those plugins are still in review (#495, #496). Once they
land, a follow-up PR will pin them too.

Tests
─────
- python3 -m json.tool hooks.json passes
- bash -n run-tests.sh passes
- No other files touched; no marketplace.json changes (avoids conflict
  with #495 and #496)
2026-04-17 20:54:55 -04:00
Seth Hobson 9a8ad81832 Merge pull request #494 from tomjwxf/test/protect-mcp-fixtures
test(protect-mcp): add test/ fixtures and round-trip verification
2026-04-17 13:15:37 -04:00
Seth Hobson 8e40baf81e Merge pull request #492 from xiaolai/fix/nlpm-framework-migration-frontmatter
fix: add missing YAML frontmatter to framework-migration and c4-architecture commands
2026-04-17 13:15:34 -04:00