Commit Graph

180 Commits

Author SHA1 Message Date
Kenneth Lien
61c0597779 Merge pull request #825 from anthropics/kenneth/channels-rollup
Channels rollup: resilience + discord port + bucket-1 features
2026-03-20 17:40:59 -07:00
Tobin South
da61886c07 Merge pull request #823 from anthropics/claude/slack-add-claude-plugin-marketplace
fix(plugin): switch stripe plugin to git-subdir source and remove local copy
2026-03-20 23:02:17 +00:00
Ralph Furman
d56d7b61f0 Merge pull request #755 from anthropics/ralph/add-math-olympiad
Add math-olympiad skill
2026-03-20 13:31:34 -07:00
Claude
802464cff3 Fix frontmatter validation to skip deleted files
The workflow was passing deleted files to the validation script, which
failed when trying to read them. Add --diff-filter=AMRC to only process
Added, Modified, Renamed, and Copied files.
2026-03-20 20:30:40 +00:00
Kenneth Lien
51bd7bd5f2 Merge remote-tracking branch 'origin/kenneth/telegram-all-file-types' into kenneth/channels-rollup 2026-03-20 13:13:58 -07:00
Kenneth Lien
71b102d75d Merge remote-tracking branch 'origin/kenneth/telegram-bot-commands-795' into kenneth/channels-rollup
# Conflicts:
#	external_plugins/telegram/server.ts
2026-03-20 13:13:58 -07:00
Kenneth Lien
556b21af96 Merge remote-tracking branch 'origin/kenneth/telegram-bot-commands' into kenneth/channels-rollup 2026-03-20 13:13:08 -07:00
Kenneth Lien
87e0f09336 Merge remote-tracking branch 'origin/kenneth/discord-resilience' into kenneth/channels-rollup 2026-03-20 13:13:08 -07:00
Kenneth Lien
aa4f7c4fb0 Merge remote-tracking branch 'origin/kenneth/discord-edit-notif-guidance' into kenneth/channels-rollup 2026-03-20 13:13:08 -07:00
Kenneth Lien
24a170a704 Merge remote-tracking branch 'origin/kenneth/channels-state-dir' into kenneth/channels-rollup 2026-03-20 13:13:07 -07:00
Kenneth Lien
f3fc62a8e7 Merge remote-tracking branch 'origin/kenneth/telegram-409' into kenneth/channels-rollup
# Conflicts:
#	external_plugins/telegram/server.ts
2026-03-20 13:13:07 -07:00
Kenneth Lien
757480dd76 Merge remote-tracking branch 'origin/kenneth/telegram-shutdown' into kenneth/channels-rollup 2026-03-20 13:12:58 -07:00
Claude
af6b2c490b Remove local stripe external plugin
Now that the stripe plugin sources from the stripe/ai git-subdir, the
locally vendored copy under external_plugins/stripe is no longer needed.
2026-03-20 20:09:40 +00:00
Claude
2bc9dfb449 Update stripe plugin to use git-subdir source
Change the stripe plugin source from local path (./external_plugins/stripe)
to git-subdir pointing to stripe/ai repo at providers/claude/plugin without
SHA pinning.
2026-03-20 19:59:36 +00:00
Kenneth Lien
1636fedbd4 Sanitize user-controlled filenames and download path components
- safeName() strips <>[]\r\n; from file_name/title before they hit the
  <channel> notification — delimiter chars would let an uploader break
  out of the tag or forge meta entries
- download_attachment strips ext/uniqueId to alphanumeric before join()
  — defense-in-depth against path traversal (file_unique_id is
  Telegram-controlled so this is belt-and-braces)
2026-03-20 11:56:57 -07:00
Kenneth Lien
ea382ec6a4 Tighten /start and /help copy
Less chatty, more precise. Explicitly mentions the /telegram:access
skill and the 6-char code format.
2026-03-20 11:55:56 -07:00
Kenneth Lien
9a101ba34c Restrict bot commands to DMs (security)
- /status in a group would leak the sender's pending pairing code to
  other group members, who could then pair as that user
- Commands in non-allowlisted groups confirm bot presence and enable spam
- /start now acknowledges dmPolicy === 'disabled' instead of lying
- setMyCommands scoped to private chats so the / menu only shows in DMs
2026-03-20 11:54:48 -07:00
Kenneth Lien
a9bc23da6f telegram: handle all inbound file types + download_attachment tool 2026-03-20 11:51:42 -07:00
Kenneth Lien
521f858e11 telegram: add /start /help /status bot commands 2026-03-20 11:47:39 -07:00
Kenneth Lien
a7cb39c269 telegram: add MarkdownV2 parse_mode to reply/edit_message 2026-03-20 11:45:46 -07:00
Kenneth Lien
aa71c24314 discord: port resilience fixes from telegram
Same patterns as #812/#813 for the discord channel:
- process-level unhandledRejection/uncaughtException handlers
- client.on('error') to log discord.js errors
- mcp.notification().catch() so inbound delivery failures surface
- stdin close / SIGTERM -> client.destroy() + exit (zombie fix)
- .unref() the approval-check interval
- client.login().catch() to log+exit on bad token instead of crashing

Discord is inherently more resilient than telegram (discord.js
auto-reconnects, no 409 equivalent), but these gaps were still there.
2026-03-20 11:28:51 -07:00
Kenneth Lien
5c58308be4 discord/telegram: guide assistant to send new reply on completion
Message edits don't trigger push notifications on the user's device.
Update system instructions and edit_message tool description to steer
the assistant toward edit-for-progress + new-reply-on-completion.

Fixes #786
2026-03-20 11:27:09 -07:00
Kenneth Lien
3d8042f259 Silently return when bot.stop() aborts the setup phase
If bot.stop() is called while bot.start() is still in setup (deleteWebhook/
getMe), grammy rejects with 'Aborted delay'. Expected, not an error.
2026-03-20 11:07:05 -07:00
Kenneth Lien
14927ff475 telegram/discord: make state dir configurable via env var
Hardcoded ~/.claude/channels/<name>/ meant only one bot per machine.
Respect TELEGRAM_STATE_DIR / DISCORD_STATE_DIR so users can run
multiple bots with separate tokens and allowlists.

Also fixed README path ('in your project' -> '~/...') to match the code.

Fixes #792
2026-03-20 10:56:57 -07:00
Kenneth Lien
1daff5f224 telegram: retry on 409 Conflict instead of crashing
During /mcp reload or when a zombie from a previous session still holds
the polling slot, the new process gets 409 Conflict on its first
getUpdates and dies immediately. Retry with backoff until the slot
frees — typically within a second or two.

Also handles the two-sessions case: the second Claude Code instance
keeps retrying (with a clear message about what's happening) and takes
over when the first one exits.

Fixes #804 #794, partial #788 (issue 4)
2026-03-20 10:55:27 -07:00
Kenneth Lien
2aa90a8387 telegram: exit when Claude Code closes the connection
When the MCP stdio transport closes, the bot kept polling Telegram as
a zombie process — holding the token and causing 409 Conflict for the
next session.

- Listen for stdin end/close and SIGTERM/SIGINT -> bot.stop() + exit
- Force-exit after 2s if bot.stop() stalls on the long-poll timeout
- unref the approval-check interval so it doesn't keep us alive

Fixes #793, partial #788 (issue 3)
2026-03-20 10:54:33 -07:00
Kenneth Lien
9f2a4feab9 telegram: add error handlers to stop silent polling death
The bot would silently stop delivering messages after the first error:
grammy's default handler calls bot.stop() on any middleware throw, and
void bot.start() / void mcp.notification() swallow rejections with no log.

- bot.catch(): log and keep polling on handler errors
- bot.start().catch(): log when polling dies (bad token, 409, network)
- mcp.notification().catch(): log when inbound delivery to Claude fails
- process-level unhandledRejection/uncaughtException as a safety net

Fixes #756 #759 #761 #777 #809, partial #788
2026-03-20 10:53:36 -07:00
Tobin South
90accf6fd2 add(plugin): mcp-server-dev — skills for building MCP servers (#731) 2026-03-20 17:51:32 +00:00
Kenneth Lien
562a27feec Merge pull request #811 from anthropics/kenneth/chmod-env-files
Lock telegram/discord .env files to owner (chmod 600)
2026-03-20 10:48:05 -07:00
Tobin South
d687c591f4 Staging → main: plugin marketplace additions (#730) 2026-03-20 17:41:01 +00:00
Kenneth Lien
8140fbad22 Lock telegram/discord .env files to owner (chmod 600)
The bot token is a credential. Tighten perms on load so hand-written
or pre-existing .env files get locked down, and update the configure
skill to chmod after writing. No-op on Windows.
2026-03-20 10:37:13 -07:00
Kenneth Lien
b664e152af Merge pull request #758 from anthropics/docs/readme-clarifications
README clarifications from docs walkthrough testing
2026-03-19 21:34:55 -07:00
Ralph Furman
c3f6d9e9fa Fix YAML frontmatter — quote description, replace colon with em-dash
Unquoted colon in 'calibrated confidence: will say' broke strict YAML parsing.
CC's parser is lenient but fix for robustness.
2026-03-20 02:07:27 +00:00
Ralph Furman
9720278412 math-olympiad: forbid web access in deep mode
Deep-mode allows bounded local computation but must NOT use WebFetch
or WebSearch. Finding the solution on AoPS is not solving the problem.
Adds explicit NO WEB prompt block and orchestrator self-restraint note.

Found by Ralph's test run (skill solved 5/6 then started fetching
dgrozev.wordpress.com and artofproblemsolving.com for P6).
2026-03-20 00:39:08 +00:00
Sarah Deaton
b01fad3396 README clarifications from docs walkthrough testing
- Drop /reload-plugins (redundant, you restart with --channels next)
- Fix token save path: .claude/channels/ not ~/.claude/channels/
- Clarify bot only responds once channel is running (pairing step)
2026-03-19 16:58:17 -07:00
Kenneth Lien
8908a582f8 Merge pull request #757 from anthropics/kenneth/add-bun-prereq
Add Bun prerequisite to discord/telegram READMEs
2026-03-19 16:31:36 -07:00
Kenneth Lien
8938650428 Add Bun prerequisite to discord and telegram plugin READMEs
Both MCP servers run on Bun, but this wasn't documented. Add a
Prerequisites section with the install command so users don't hit
a missing-runtime error on first setup.
2026-03-19 16:28:02 -07:00
Ralph Furman
3c9bf4ff5d Add math-olympiad skill — adversarial verification for competition math
The skill that addresses the Proof-or-Bluff gap: self-verified 85.7% IMO
becomes <5% under human grading. Uses fresh-context verifiers armed with
specific failure patterns (not generic 'check logic').

Validated: 17/18 IMO+Putnam 2025 solved, 0 false positives, 2 novel proofs.
See eval data in anthropic monorepo sandbox/sandbox/ralph/math_skills/.
2026-03-19 23:17:36 +00:00
Kenneth Lien
7994c270e5 Revert "Remove telegram, discord, and fakechat plugins (#741)" (#753)
This reverts commit d53f6ca4cd.
2026-03-19 13:59:14 -07:00
Noah Zweben
d53f6ca4cd Remove telegram, discord, and fakechat plugins (#741)
Remove the three chat bridge plugins from external_plugins/ and their
corresponding entries in marketplace.json.

Co-authored-by: Claude <noreply@anthropic.com>
2026-03-18 21:31:12 -07:00
Kenneth Lien
55de7f6d1a Merge pull request #740 from anthropics/marketplace-sorted
Enforce alphabetical sort on marketplace.json plugins
2026-03-18 21:21:36 -07:00
Kenneth Lien
f0fdb72a02 Enforce alphabetical sort on marketplace.json plugins
Adds a sort check as a second step in the existing validate-marketplace
workflow. The script supports --fix to sort in place.

Sorts the existing 86 entries — pure reorder, no content change.
Previously grouped loosely by kind (LSPs first, then internal, then
external); now strictly alphabetical so insertion point is unambiguous.
2026-03-18 16:56:11 -07:00
Noah Zweben
158ef95c6f Add marketplace.json validation CI workflow (#347)
* Add CI workflow to validate marketplace.json on PRs

Add a GitHub Actions workflow that validates marketplace.json is
well-formed JSON with a plugins array whenever PRs modify it. Includes:
- validate-marketplace.ts: Bun script that parses and validates the JSON
- validate-marketplace.yml: GH Actions workflow triggered on PR changes
- test-marketplace-check.js: Unit tests for the validation logic

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Strengthen marketplace validator and remove orphaned test file

- validate-marketplace.ts: check duplicate names and required fields
  (name, description, source) per entry, not just valid JSON
- remove .github/workflows/test-marketplace-check.js: tested a
  checkMarketplaceViolations function that doesn't exist in the PR,
  and was in workflows/ instead of scripts/

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Tobin South <tobin.south@gmail.com>
2026-03-18 23:49:26 +00:00
Kenneth Lien
3de6a94eb9 Register telegram, discord, fakechat channel plugins (#739)
Adds marketplace entries for the three channel plugins landing in
external_plugins/ via #735, #736, #738. iMessage (#737) is intentionally
held back from registration.

telegram and discord go under productivity; fakechat goes under
development since it's a localhost testing harness, not an end-user
messaging bridge.
2026-03-18 23:49:01 +00:00
Kenneth Lien
1b33c1d9f9 Add telegram channel plugin (#735)
Telegram messaging bridge for Claude Code. Runs a local MCP server that
connects to the Telegram Bot API via a user-created bot token.

Built-in access control: inbound messages are gated by an allowlist
(default: pairing mode), outbound sends are scoped to the same allowlist.
The /telegram:access skill manages pairing, allowlists, and policy.

Ships full source — server.ts runs locally via bun, started by the
.mcp.json command. First external_plugins entry to bundle source rather
than point at a hosted MCP endpoint.
2026-03-18 23:46:59 +00:00
Kenneth Lien
4796148ace Add discord channel plugin (#736)
Discord messaging bridge for Claude Code. Runs a local MCP server that
connects to Discord's Gateway via a user-created bot token.

Built-in access control: inbound messages are gated by an allowlist
(default: pairing mode), outbound sends are scoped to the same allowlist.
Guild channels require opt-in and @mention. The /discord:access skill
manages pairing, allowlists, and policy.

Ships full source — server.ts runs locally via bun, started by the
.mcp.json command.
2026-03-18 23:46:41 +00:00
Kenneth Lien
75e1c5d437 Add fakechat channel plugin (#738)
Localhost web chat UI for testing the channel notification flow.
No tokens, no access control, no third-party service. Serves an
iMessage-style UI on localhost; messages posted there arrive as
channel notifications, replies render in the UI.

Useful for developing against the channel protocol without a live
messaging account.

Ships full source — server.ts runs locally via bun, started by the
.mcp.json command.
2026-03-18 23:46:21 +00:00
Tobin South
6b70f99f76 docs(plugin-dev): deprecate commands/ in favor of skills/<name>/SKILL.md (#717)
P0 follow-up for EA-471. Updates plugin-dev teaching materials to stop
recommending the commands/ directory layout for new plugins:

- command-development/SKILL.md: add legacy banner at top pointing to
  skills/ format
- create-plugin.md: update scaffolding to create skills/<name>/SKILL.md
  instead of commands/; mark commands/ as acceptable legacy alternative;
  update all examples, tables, and testing instructions
- example-plugin: migrate example-command to skills/example-command/SKILL.md;
  keep commands/example-command.md with a legacy-format note; update README
  to reflect new preferred structure

Both formats remain loaded identically — this is a documentation change only.

Refs: anthropics/apps#26827

Co-authored-by: Henry Shi <henrys@anthropic.com>
2026-03-17 22:45:25 +00:00
Tobin South
78497c524d updates(staging): merge staging additions into main (#677)
* fix readme typo

* fix(plugin-dev): add missing .claude-plugin/plugin.json

The plugin-dev plugin was missing its required plugin.json manifest file,
causing the plugin to fail loading. This adds the missing configuration
file following the same format as other official plugins.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add README and setup documentation for Greptile plugin

- Add README.md with setup instructions for getting API key
- Document the GREPTILE_API_KEY environment variable requirement
- Add homepage, author URL, and keywords to plugin.json
- Update description to reflect Greptile as AI code review agent

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: add c7 agent

* Update Context7 plugin for v2 API

- Update skill/agent/command to use new query-docs tool (replaces get-library-docs)
- Add query parameter usage for intelligent reranking
- Add version pinning support (e.g., /vercel/next.js/v15.1.8)
- Add tools and model metadata to agent
- Simplify docs to focus on workflow, not parameter details
- Add README.md with usage examples

* Switch Context7 MCP to remote HTTP server

* feat: update tools with better skill/agent format prompt

* fmt

* fix: installation guide

* Change Notion name to lowercase in marketplace.json

According to the SKILLS spec (see https://agentskills.io/specification#:~:text=Max%2064%20characters.%20Lowercase%20letters%2C%20numbers%2C%20and%20hyphens%20only.%20Must%20not%20start%20or%20end%20with%20a%20hyphen.) names should not contain uppercase letters. This prevents loading the marketplace in spec-compliant agents.

Update the name to be in lowercase.

* Fix empty array crash on bash 3.2 in setup-ralph-loop.sh

* Update Vercel plugin to point to vercel-labs/vercel-plugin

Replace the marketplace pointer for the Vercel plugin from
vercel/vercel-deploy-claude-code-plugin to vercel-labs/vercel-plugin.

* vercel-labs to vercel

* docs(ralph-loop): add Windows compatibility section

Retargeted from PR #124 (originally against plugins/ralph-wiggum/,
since renamed). Documents the Git Bash workaround for Windows users
hitting WSL bash resolution issues in the stop hook.

Original author: @stefanzvonar

* add(plugin): terraform — HashiCorp infrastructure-as-code

Adapted from PR #14 by @gautambaghel (HashiCorp).
Original: https://github.com/anthropics/claude-plugins-official/pull/14

* add(plugin): autofix-bot — DeepSource automated code review

Adapted from PR #23 by @jai-deepsource (DeepSource).
Original: https://github.com/anthropics/claude-plugins-official/pull/23

* add(plugin): stagehand — Browserbase browser automation

Adapted from PR #43 by @Kylejeong2 (Browserbase). PR's marketplace.json
had a syntax error (missing '},' before adjacent entry); entry
reconstructed from the diff.
Original: https://github.com/anthropics/claude-plugins-official/pull/43

* add(plugin): atomic-agents — BrainBlend-AI framework

Adapted from PR #46 by @KennyVaneetvelde (BrainBlend-AI).
Original: https://github.com/anthropics/claude-plugins-official/pull/46

* add(plugin): microsoft-docs — official Microsoft documentation MCP

Adapted from PR #55 by @TianqiZhang (Microsoft).
Original: https://github.com/anthropics/claude-plugins-official/pull/55

* add(plugin): bonfire — session-context workflow tooling

Adapted from PR #108 by @vieko (Vercel).
Original: https://github.com/anthropics/claude-plugins-official/pull/108

* Add intercom to marketplace

* Add neon to marketplace

* Remove qodo SHA

* Merge staging into add-plugin/intercom to resolve conflict

* Merge latest staging to resolve conflict

* Remove external_plugins changes from staging

Moved to external-plugins-staging branch for separate review.

---------

Co-authored-by: Han T. <han.tan@shopify.com>
Co-authored-by: Julien Tavernier <jtavernier@Juliens-MacBook-Pro.local>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Daksh Gupta <daksh510@gmail.com>
Co-authored-by: Fahreddin Özcan <ozcanfahrettinn@gmail.com>
Co-authored-by: Matt Kotsenas <Matt.Kotsenas@gmail.com>
Co-authored-by: LuciferDono <pranavj821@gmail.com>
2026-03-17 02:00:28 +00:00
Tobin South
d5c15b861c Merge pull request #628 from anthropics/staging
Plugin batch: 17 new plugins + posthog update
2026-03-13 21:51:01 +00:00