Skill and reference prose is the product here, and it had drifted into three
different wrapping styles. This is the mechanical pass that settles it: flowmark
with semantic line breaks, an 88-column wrap, typographic quotes and ellipses in
prose, and its safe cleanups. Fenced code is untouched. The tooling that keeps
it this way lands separately; this commit is the one-time reformat, so it can be
read as noise and skipped.
Two parts of it are not noise. Thirteen table rows across eight SDK references
held a code span with a raw `|` or a nested backtick, which GFM does not allow
and no formatter can round-trip: the pipe ends the cell early, so the
`tracePropagationTargets` row was quietly losing its description. Pipes are
escaped now, and the cells that showed a template literal name it in prose --
every one of those files already shows the real syntax in a fenced block
nearby.
The other part is file hygiene, off the Markdown path: a final newline on
.gitattributes and the two SVG assets, and a trailing blank line dropped from
skill-drift.yml.
This repository is the single source of truth for skills and routing metadata,
but it is not itself an installable plugin, and each assistant (Claude Code,
Cursor, Codex, Grok) expects the plugin in a different on-disk shape. No plugin
ecosystem can consume a zip or release asset; all install from a git ref. So a
GitHub Actions workflow builds each agent's distribution from this repository
and deploys it to a dedicated repository whose root is exactly that agent's
plugin, which a marketplace points at as getsentry/plugin-<agent>.
Each agent has a `plugin-src/<agent>/` dir with its manifests, README, and a
`build.sh` that assembles the dist tree from shared repo content. Claude, Cursor,
and Grok consume the plugin at the repo root; Codex requires it under
`plugins/sentry/` and rejects the `disable-model-invocation` field the skill
tree relies on, so its build strips that field and emits a per-skill
`agents/openai.yaml` (see `hide-skills.py`). MCP config is built from the repo's
`mcp.json` source of truth: inline in Claude's manifest, and a file for the
others.
Cross-repo writes use a short-lived token from a dedicated GitHub App scoped to
contents:write on the plugin repos; the default GITHUB_TOKEN cannot push to
other repositories.
The root `.claude-plugin/`, `.cursor-plugin/`, and `.mcp.json` are retained so
existing installs that consumed the plugin from this repo's root keep working;
their READMEs announce removal on or after 2026-07-11.
Merges `sentry-for-claude` and `sentry-for-cursor` into a single repo that serves both platforms. Both repos contained the same Sentry plugin (MCP server, skills, commands) packaged for different platforms — maintaining two repos meant duplicating every change.
Skills and commands now live at the repo root where both Claude Code and Cursor auto-discover them. Each platform gets its own metadata directory (`.claude-plugin/`, `.cursor-plugin/`) with separate `plugin.json` and `marketplace.json` files — no symlinks between platform-specific configs. MCP configs are also separate files (`.mcp.json` for Claude Code, `mcp.json` for Cursor) since the platforms use different file conventions.
`.agents/` is preserved as symlinks to `commands/` and `skills/` for backwards compatibility.
Plugin manifests validated against the official schemas from [cursor/plugins](https://github.com/cursor/plugins/tree/main/schemas) and [anthropics/claude-code](https://github.com/anthropics/claude-code).
After merge, rename repo from `sentry-for-claude` to `sentry-for-ai` and archive `sentry-for-cursor` with a redirect notice.
---------
Co-authored-by: Claude <noreply@anthropic.com>