Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 29 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ name: ci
# + marketplace.json/plugins/ sync + version bumps on release PRs
# + post-merge version backstop on pushes to main
# link-check: CI-02: the tools/check-links.sh sweep
# compile-check: EVAL-02 compile the baked JCSMP samples verbatim
# trigger-evals: lightweight skill-triggering check; self-skips green without a key
# jcsmp-sample-check: EVAL-02 compile the baked JCSMP samples verbatim
# python-sample-check: check the baked Python samples against the latest solace-pubsubplus
# trigger-evals: lightweight skill-triggering check; disabled until CI may hold an API key
on:
# Deliberately no `edited` type: running on title/body edits either re-runs
# the paid eval matrix for a no-code change or, if jobs are gated, lets the
Expand Down Expand Up @@ -50,7 +51,7 @@ jobs:
# missing license are warnings only. Also validate the Claude
# plugin/marketplace manifests.
validate:
runs-on: ubuntu-latest
runs-on: ubuntu-26.04
timeout-minutes: 10
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
Expand Down Expand Up @@ -99,7 +100,7 @@ jobs:

# CI-02: sweep the plugins/ tree for broken and soft-404 documentation links.
link-check:
runs-on: ubuntu-latest
runs-on: ubuntu-26.04
timeout-minutes: 15
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
Expand All @@ -108,8 +109,8 @@ jobs:

# EVAL-02: compile the baked JCSMP samples verbatim against the live-resolved
# sol-jcsmp. Pure compile gate, no API budget and no credential.
compile-check:
runs-on: ubuntu-latest
jcsmp-sample-check:
runs-on: ubuntu-26.04
timeout-minutes: 25
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
Expand All @@ -118,8 +119,23 @@ jobs:
distribution: temurin
java-version: 11
cache: maven
- name: Compile baked samples (EVAL-02 hard gate)
run: ./plugins/solace-messaging-skills/skills/solace-application-development/references/jcsmp/evals/compile-fixture/compile.sh
- name: Check baked JCSMP samples (EVAL-02 hard gate)
run: ./plugins/solace-messaging-skills/skills/solace-application-development/references/jcsmp/evals/sample-check/check-samples.sh

# Check the baked Python samples against the latest solace-pubsubplus from PyPI:
# py_compile, then import each sample and build its API objects against a
# resolvable host without a broker. Python has no compile step, so this is the
# Python counterpart of jcsmp-sample-check. No API budget and no credential.
python-sample-check:
runs-on: ubuntu-26.04
timeout-minutes: 15
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: '3.11'
- name: Check baked Python samples
run: ./plugins/solace-messaging-skills/skills/solace-application-development/references/python/evals/sample-check/check-samples.sh

# Lightweight skill-triggering check. For every case in each plugin's
# evals/trigger-evals.json, run the prompt with only that plugin loaded and
Expand All @@ -133,8 +149,12 @@ jobs:
# run summary. The secret is legal in the job env but illegal in a job-level
# if, so the guard reads HAS_KEY at step level and the real key is scoped to
# the run step only.
# Disabled: no policy permits an API key on this public repo, so the job can
# only self-skip. Run the trigger evals locally instead; remove this `if` to
# re-enable the job once a key is allowed.
trigger-evals:
runs-on: ubuntu-latest
if: false
runs-on: ubuntu-26.04
timeout-minutes: 120 # per model leg; 57 cases x 3 runs (~50 min observed)
strategy:
fail-fast: false # each model is an independent check
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
# GSD planning directory (local-only)
.planning/

# Python bytecode cache
__pycache__/
72 changes: 72 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# CLAUDE.md

Orientation for AI coding agents in this repository. For humans, the [README](README.md) covers installation, development, CI, and releases, and the [evals README](plugins/solace-messaging-skills/evals/README.md) covers the eval corpora and runners.

This repository is a Claude Code plugin marketplace (`solace-agent-plugins`) of Agent Skills for building Solace messaging applications. The product is Markdown skill files, reference samples, and eval corpora. Nothing is compiled or packaged.

## Where things live

| Path | What it is |
|------|------------|
| `.claude-plugin/marketplace.json` | The marketplace. One entry per plugin directory. |
| `plugins/<plugin>/.claude-plugin/plugin.json` | Plugin manifest, including the plugin's version. |
| `plugins/<plugin>/skills/<skill>/SKILL.md` | A skill. The frontmatter `description` alone decides when the skill fires. |
| `plugins/solace-messaging-skills/skills/solace-application-development/references/<api>.md` | Per-API entry file (`jcsmp.md`, `python.md`). Mode files, baked samples, and scripts sit in the matching `references/<api>/` folder. |
| `plugins/<plugin>/evals/` | Trigger and output eval corpora. Maintainer tooling, not shipped functionality. |
| `tools/` | CI check scripts, the two eval runners, and `output-evals.schema.json`. |
| `.github/workflows/ci.yml` | The only CI workflow. |

Nothing in the repository is generated or vendored. The Eclipse files under `references/jcsmp/evals/sample-check/` are IDE metadata for the JCSMP sample check; leave them alone.

## Commands

Run from the repository root. These match the README.

```shell
gh skill publish --dry-run # skills against the Agent Skills spec (gh 2.90 or later)
claude plugin validate . --strict # marketplace and plugin manifests
./tools/check-plugin-versions.sh --sync-only # marketplace.json matches plugins/
./tools/check-links.sh plugins # broken and soft-404 doc links
./plugins/solace-messaging-skills/skills/solace-application-development/references/jcsmp/evals/sample-check/check-samples.sh # check the baked JCSMP samples (compile and config smoke)
./plugins/solace-messaging-skills/skills/solace-application-development/references/python/evals/sample-check/check-samples.sh # check the baked Python samples (python3 and PyPI access)
claude --plugin-dir plugins/solace-messaging-skills # load the plugin from the clone
```

The commands above need no broker and no API key. The evals need an exported `ANTHROPIC_API_KEY` or `CLAUDE_CODE_OAUTH_TOKEN`; an existing `claude` login does not work, because the runners use a scratch config directory.

```shell
./tools/run-trigger-evals.sh --model haiku # then --model sonnet
./tools/run-output-evals.sh --model sonnet # then --model opus; a full leg takes about an hour
./tools/run-output-evals.sh --case <case-id> # one output eval case
```

The trigger runner has no single-case mode; set `TRIGGER_EVAL_RUNS=1` for a quicker check. Only the output evals can touch a broker, and only when all four `OUTPUT_EVAL_BROKER_*` variables are exported (see the evals README).

## Conventions

- Never hardcode a library version in skill content. Generated builds resolve the latest release at generation time (Invariant 3 in the application-development `SKILL.md`).
- Link documentation to the live `docs.solace.com` `.md` URL. Do not copy doc content into a skill. Every link under `plugins/` must pass `check-links.sh`.
- A new skill needs cases in both `trigger-evals.json` (positive and near-miss negative prompts) and `output-evals.json` (validate the latter against `tools/output-evals.schema.json`).
- A new, removed, or renamed plugin directory needs the matching `marketplace.json` change in the same pull request.
- A new baked JCSMP sample must be added to the sample roster in `jcsmp/evals/sample-check/check-samples.sh`, or the sample check does not cover it. A new baked Python sample goes into the roster in `python/evals/sample-check/check-samples.sh`; `check_samples.py` picks it up from there.
- Do not put exact counts (of cases, skills, or graders) in READMEs or skill docs. They go stale.

## Gotchas / do not

- **Do not bump a `plugin.json` version in a feature pull request.** Versions change only when a release is prepared. Claude Code caches installed plugins by version, so the bump is what ships a release, and a stray bump confuses what users have. Changes under `plugins/<plugin>/evals/`, `tools/`, `.github/`, or the repository root never need a bump.
- **Both repositories are public.** Never write internal links, internal system names, credentials, API keys, or broker details into files, commit messages, branch names, or pull request text.
- **Run `gh repo set-default SolaceDev/agent-plugins` in a fresh clone.** With the `upstream` remote present, a bare `gh pr` command otherwise targets `SolaceProducts/agent-plugins`.
- **A green `trigger-evals` check asserts nothing.** The job is disabled (`if: false`) because the public repositories hold no API key. Run the evals locally and record the results in the pull request description.
- **A trigger eval leg can go red on one `must_pass` case from model variance.** If the prompt and skill descriptions did not change, re-run the full leg before you treat it as a regression.
- **Keep shell scripts on LF line endings.** `.gitattributes` enforces it. Bash rejects CRLF scripts, and an output eval grader compares the generated `verify.sh` byte for byte with the bundled copy in `references/jcsmp/scripts/`.
- **Keep the pins in `ci.yml`.** Every `uses:` step is pinned to a commit SHA with the tag in a trailing comment, and the Claude Code CLI version is pinned in `CLAUDE_CODE_VERSION`. Update a SHA and its comment together.
- **`check-links.sh` sweeps `plugins/` only.** It does not check links in the root README or this file.
- **A tool permission denial during an output eval is an infrastructure failure, not a skill failure.** Managed settings, hooks, or local command shims can deny a command. Fix the environment, then re-run.

## Agent workflow

- Open pull requests as drafts. Watch the checks with `gh pr checks <number> --watch`, fix failures, and mark the pull request ready only when all checks are green.
- Print a failed CI job's log with `gh run view <run-id> --log-failed`, then reproduce it with the matching command above.
- For a change to skill content or skill descriptions, run the trigger evals on Haiku and Sonnet and the output evals on Sonnet and Opus, and record the results in the pull request description.
- Do not pick reviewers. Ask the user who to tag.
- Never merge a release pull request. A human reviewer merges it.
11 changes: 8 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# AI Agent Plugins by Solace

A collection of Solace AI agent plugins that package skills for building event-driven messaging applications. These skills help developers using AI coding assistants (such as Claude Code) design and implement Solace messaging applications that follow Solace best practices out of the gate. The solace-application-development skill designs and generates Solace messaging applications (publishing to topics, consuming from queues, and guaranteed messaging), starting with the Solace Messaging API for JCSMP. A companion solace-topic-best-practices skill looks up the canonical Topic Architecture Best Practices page online and applies it to topic-hierarchy decisions.
A collection of Solace AI agent plugins that package skills for building event-driven messaging applications. These skills help developers using AI coding assistants (such as Claude Code) design and implement Solace messaging applications that follow Solace best practices out of the gate. The solace-application-development skill designs and generates Solace messaging applications (publishing to topics, consuming from queues, and guaranteed messaging), with the Solace JCSMP API and the Solace Python API. A companion solace-topic-best-practices skill looks up the canonical Topic Architecture Best Practices page online and applies it to topic-hierarchy decisions.

> [!WARNING]
> These skills are powered by language models, which are nondeterministic and may change over time. Generated code can vary between runs and may be incorrect, insecure, incomplete, or unsuitable for your environment. You are responsible for reviewing, testing, and validating all generated code before use, especially before deploying to production.
Expand Down Expand Up @@ -42,7 +42,7 @@ This repository includes the following skills:

| Skill | Description |
|-------|-------------|
| **solace-application-development** | Routes Solace messaging design and implementation requests to grounded Solace documentation. Full guidance for messaging pattern selection, runnable code generation, and message round trip verification arrives in upcoming releases. |
| **solace-application-development** | Front door for Solace API development (JCSMP and Python). Routes each request to the right API, helps choose a messaging pattern, and generates a runnable application from reference samples, grounded in canonical Solace documentation. |
| **solace-topic-best-practices** | Navigation-only lookup skill that reads the canonical Topic Architecture Best Practices page online and applies it to topic-hierarchy decisions, without generating application code. |
| **solace-messaging-feedback** | Formats the current session into copy-paste-ready feedback about the skills, routed by support-contract status: contract holders get an email to Solace Support for bugs and a Solace Ideas portal submission for feature ideas, users without a contract get a Solace Community post for both. Formatter only: it produces the text for you to review and send or post, and never sends anything itself. |

Expand All @@ -62,8 +62,9 @@ agent-plugins/
│ │ └── SKILL.md # Navigation-only manifest; reads the live docs page
│ └── solace-messaging-feedback/ # Feedback formatter skill
│ └── SKILL.md # Formats and routes session feedback (Support, Community, or Ideas portal)
├── tools/ # Re-runnable scripts (check-links, run-trigger-evals, run-output-evals)
├── tools/ # CI check scripts and the trigger and output eval runners
├── README.md # This file
├── CLAUDE.md # Orientation for AI coding agents that work in this repository
└── .claude-plugin/ # Claude marketplace definition (marketplace.json)
```

Expand All @@ -73,6 +74,10 @@ Each plugin ships a trigger eval corpus under `plugins/<plugin>/evals/` that che

Each plugin also ships an output eval corpus in the same directory that checks a skill's output honors the skill contract (design before code, the door question, scrubbed feedback drafts, grounded answers). Output evals run locally only. See the [output evals section](plugins/solace-messaging-skills/evals/README.md#output-evals) of the same README for the corpus format, the graders, and how to run them.

## Contributing

This repository does not accept external pull requests or GitHub issues. If you have a Solace support contract, report bugs to Solace Support and suggest features on the [Solace Ideas portal](https://ideas.solace.com/ideas). Otherwise, post both on the [Solace Community](https://community.solace.com/). The `solace-messaging-feedback` skill formats a session into a ready-to-send report for each channel.

## License

This project is licensed under the Apache License 2.0. See the [LICENSE](LICENSE) file for details.
2 changes: 1 addition & 1 deletion plugins/solace-messaging-skills/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "solace-messaging-skills",
"description": "Skills for building applications on the Solace platform. Includes solace-application-development (designs and generates Solace messaging code grounded in canonical Solace docs), solace-topic-best-practices (looks up the canonical Topic Architecture Best Practices page online for topic-hierarchy questions), and solace-messaging-feedback (formats a session into copy-paste-ready feedback routed to the Solace Ideas portal, Solace Support, or the Solace Community)",
"version": "0.1.1",
"version": "0.2.0",
"license": "Apache-2.0",
"author": {
"name": "Solace"
Expand Down
Loading
Loading