Skip to content

Add Hermes Tweet Twitter/X adapter#2

Open
kriptoburak wants to merge 15 commits into
AutomateLab-tech:mainfrom
kriptoburak:codex/add-hermes-tweet-twitter-adapter
Open

Add Hermes Tweet Twitter/X adapter#2
kriptoburak wants to merge 15 commits into
AutomateLab-tech:mainfrom
kriptoburak:codex/add-hermes-tweet-twitter-adapter

Conversation

@kriptoburak
Copy link
Copy Markdown

Summary

  • Add an optional Hermes Tweet/Xquik adapter for the existing twitter and x channels.
  • Preserve the current browser compose fallback when no Hermes Tweet key is configured.
  • Document profile and environment configuration, and add a Node test command with focused adapter tests.

Validation

  • npm ci
  • npm test
  • git diff --cached --check
  • staged public-text scan for token-like strings

ratamaha-git and others added 15 commits May 20, 2026 12:09
…flow

- adapters/linkedin.py: wraps LinkedIn Posts API (rest/posts, YYYYMM versioning),
  handles personal + org-page channels, auto-rotates expired access tokens via
  refresh token, 429 retry, idempotency, canonical-URL footer, unpublish via DELETE
- adapters/linkedin_oauth.py: OAuth 2.0 helper — is_token_expired, refresh_access_token,
  run_install_flow (local HTTP redirect capture, userinfo person-URN resolution)
- cli.py: `linkedin install` subcommand — browser OAuth dance, tokens merged into
  named distribution profile
- tests/test_linkedin_adapter.py: 40 tests covering all non-OAuth paths

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All five browser adapters (linkedin, medium, twitter, hashnode, coderlegion)
and the reddit adapter had optional Playwright pre-fill blocks that are no
longer needed. Browser automation is out of scope: non-API platforms are
supported by draft generation + compose URL only. The operator pastes manually.

Changes:
- Strip _playwright_prefill() function from all five browser adapter files
- Remove prefill/playwright_prefill profile-extras blocks from publish()
- Simplify open-pending CLI command (remove --no-prefill flag, drop asyncio.run)
- Remove playwright optional-dep entries from pyproject.toml
- Replace stale PRAW-based reddit tests with browser-fallback tests (203 pass)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- LinkedIn: Manual (browser) → Auto (OAuth 2.0 Posts API via `linkedin install`)
- Reddit: Auto-gated (PRAW) → Manual (browser, draft + pre-filled submit URL)
- Remove [browser] extra and `playwright install chromium` from Install section
- Remove stale "Reddit gate logic" reference from spec.md pointer

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the Python/pip implementation with a TypeScript/Node.js MCP
server published to npm as @ratamaha/content-distribution-mcp.

Install: npx @ratamaha/content-distribution-mcp
Config:  { "command": "npx", "args": ["-y", "@ratamaha/content-distribution-mcp"] }

- All 8 MCP tools preserved (publish, schedule, drain, status, unpublish,
  hints, list_profiles, list_subreddits)
- Adapters: devto, hashnode, github-discussions, reddit, bluesky,
  browser-fallback for medium/linkedin/twitter
- YAML backend unchanged in behaviour; stored in ~/.distribution-mcp/
- Pure fetch() — no Python, no pip, no virtualenv
- Requires Node.js 18+

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Marketing improvements:
- Lead with outcome: publish everywhere without platform friction
- Add 'The Problem It Solves' section addressing pain points:
  * Format differences across platforms (Reddit, Twitter, DEV.to)
  * Platform rules (cooldowns, flair, automoderator gates)
  * State management chaos
  * Auth friction (OAuth, credentials, browser automation)
- Add 'How It Works' section explaining solution simply
- Reframe benefits: write once, adapt per-channel, scale safely

Company branding:
- Change @ratamaha@automatelab throughout (install, config examples, n8n docs)
- Align with official company organization
Marketing improvements:
- Lead with outcome: publish everywhere without platform friction
- Add 'The Problem It Solves' section addressing 3 core pain points:
  * Format differences across platforms (Reddit, Twitter, DEV.to)
  * Platform rules (cooldowns, flair, automoderator gates)
  * State management chaos
- Add 'How It Works' section explaining solution simply
- Reframe benefits: write once, adapt per-channel, scale safely

Company branding:
- Change @ratamaha@automatelab throughout (install, config examples, n8n docs)
- Align with official company organization
- Add glama.json with maintainer claim
- Add .describe() to every ContentSchema and VariantSchema field
- Rewrite all 8 tool descriptions to cover: what it does, side effects,
  determinism, and when to use vs sibling tools (Glama quality-score gates)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace startCommand-only config with commandFunction (JS expression)
  so Smithery's scanner can probe tool capabilities
- Conditionally pass DISTRIBUTION_BACKEND_DIR only when set
- Add icon.svg (indigo hub-and-spoke) for listing thumbnail
- Migrate from server.tool() to server.registerTool() so each tool can
  declare an outputSchema (callers type-check responses) and MCP
  annotations (readOnlyHint, destructiveHint, idempotentHint,
  openWorldHint, title).
- Rename all 8 tools to dot-notation forming a navigable tree:
  post.publish, post.schedule, post.drain, post.status, post.unpublish,
  channel.hints, profile.list, subreddit.list.
- Tools now return structuredContent alongside text content, matching
  the declared outputSchema.
- Update README to document the new surface and mark v2.2.0 as a
  breaking change for callers using the old flat names.
2.2.1 was published to npm without committing the bump to git, leaving
package.json drifted at 2.2.0. Bumping git to match closes the drift.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants