Syndication slice 2: admin page + MCP tools on blog:syndicate - #2
Merged
Merged
Conversation
Wires the slice-1 Syndicator to its two surfaces, sharing one service, capability,
and audit.
- MCP (ADR 0016): BlogToolset with syndicate_post {slug, target} and
syndication_status {slug}, both gating on nimbuscms.blog:syndicate. A content
wildcard can neither enumerate nor call them (wildcard-immune); a denied call
reports as unknown (non-enumerating).
- Admin (ADR 0020): a Syndication page listing published posts with a button per
post per target (Post / Update), the external link, and last status; the push
action inherits the page capability + CSRF. Targets not configured show as
unavailable. Nonce'd styles (admin CSP drops inline style=).
- Both built from one Syndicator wired in register() (DevToTarget from DEVTO_API_KEY,
published-only reader, canonical from Config::appUrl()).
Test fakes extracted to their own files (FakeHttpClient/FakeTarget/FakeStore) so
they autoload across suites. BlogToolsetTest proves the MCP gate (syndicate token
sees + calls; a content wildcard sees nothing and is refused). 32 tests green,
PHPStan L6 + cs-fixer clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Wires the slice-1
Syndicatorto its two surfaces, one service behind both.BlogToolsetwithsyndicate_post {slug, target}andsyndication_status {slug}, both gating onnimbuscms.blog:syndicate. A content wildcard can neither see nor call them (wildcard-immune); a denied call reports as an unknown tool (non-enumerating).Syndicatorinregister()(Dev.to key fromDEVTO_API_KEY, published-only reader, canonical fromConfig::appUrl()).Test fakes extracted to their own files so they autoload across suites.
BlogToolsetTestproves the gate: a syndicate-scoped token sees and calls the tools; a*:writetoken sees nothing and is refused. 32 tests green, PHPStan L6 + cs-fixer clean.Next: slice 3 (Hashnode adapter + operator-config docs), then slice 4 (HN/Reddit share links + the Reddit-auto-submit chat).
🤖 Generated with Claude Code