Skip to content
Merged
6 changes: 3 additions & 3 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
"email": "paulo@trypost.it"
},
"metadata": {
"description": "TryPost social media scheduling skill for drafting, scheduling, and publishing posts across 12 platforms",
"version": "1.0.0"
"description": "TryPost plugin for planning, scheduling and publishing social media posts",
"version": "2.0.0"
},
"plugins": [
{
"name": "trypost",
"description": "Social media scheduling for AI agents. Draft, schedule, publish, preview, and track posts across Instagram, Facebook, LinkedIn, X, TikTok, YouTube, Threads, Pinterest, Bluesky, Mastodon, Telegram, and Discord via the hosted TryPost MCP server.",
"description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.",
"source": "./",
"strict": false,
"skills": ["./"]
Expand Down
4 changes: 2 additions & 2 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "trypost",
"version": "1.0.0",
"description": "Social media scheduling for AI agents. Draft, schedule, publish, preview, and track posts across Instagram, Facebook, LinkedIn, X, TikTok, YouTube, Threads, Pinterest, Bluesky, Mastodon, Telegram, and Discord via the hosted TryPost MCP server.",
"version": "2.0.0",
"description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.",
"author": {
"name": "Paulo Castellano",
"email": "paulo@trypost.it",
Expand Down
101 changes: 101 additions & 0 deletions .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
{
"name": "trypost",
"version": "2.0.0",
"description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.",
"author": {
"name": "TryPost",
"email": "paulo@trypost.it",
"url": "https://trypost.it"
},
"homepage": "https://trypost.it",
"repository": "https://github.com/trypostit/trypost-agent",
"license": "AGPL-3.0",
"keywords": [
"trypost",
"social-media",
"scheduling",
"publishing",
"analytics"
],
"skills": "./skills/",
"mcpServers": "./.mcp.json",
"interface": {
"displayName": "TryPost",
"shortDescription": "Schedule social media posts",
"longDescription": "Connect your TryPost workspace and manage your social media from a conversation.\n\nWrite posts for the channels you connected to TryPost. Preview them, attach media, then save as drafts, publish now, schedule for a set time or add them to each channel's queue.\n\nRun your workflow end to end: reorder the queue, set posting times, approve or reject posts from team members, set recurring posts, and plan content on the ideas board with stages and labels.\n\nAsk how your content performs: get reports for a period, per-channel insights and metrics for each post.\n\nTryPost acts only within the workspace you sign in to and with your permissions in it. Members who need approval still go through it. Requires a TryPost account with at least one connected channel.",
"developerName": "TryPost",
"category": "Productivity",
"capabilities": ["Read", "Write"],
"websiteURL": "https://trypost.it",
"supportURL": "https://docs.trypost.it/support",
"privacyPolicyURL": "https://trypost.it/privacy",
"termsOfServiceURL": "https://trypost.it/terms",
"defaultPrompt": [
"Show me what is scheduled on my channels this week.",
"Write a LinkedIn post about our new feature and schedule it for tomorrow at 9am.",
"Which of my posts got the most engagement in the last 30 days?"
],
"brandColor": "#3660E0",
"composerIcon": "./assets/icon-512.png",
"logo": "./assets/icon-512.png"
},
"extensions": {
"com.openai": {
"review": {
"test_cases": {
"positive": [
{
"description": "List the connected channels",
"prompt": "Which social media channels are connected to my TryPost workspace?",
"tools_triggered": "list-social-accounts-tool",
"expected_behavior": "Lists the channels connected to the test workspace with their network and username, and points out any channel that needs to be reconnected."
},
{
"description": "Create a draft and preview it",
"prompt": "Write a short LinkedIn post announcing our new pricing page and save it as a draft. Show me how it will look.",
"tools_triggered": "list-social-accounts-tool, create-post-tool, preview-post-tool",
"expected_behavior": "Creates one draft post on the LinkedIn channel and shows the preview of the exact text LinkedIn will receive. Nothing is published."
},
{
"description": "Schedule a post for a set time",
"prompt": "Schedule a post on my X account for tomorrow at 9am saying our office is closed for the holiday.",
"tools_triggered": "list-social-accounts-tool, create-post-tool",
"expected_behavior": "Creates a scheduled post on the X channel at 9am tomorrow in the user's time zone and confirms the scheduled time."
},
{
"description": "Add a post to a channel's queue",
"prompt": "Add a post about our summer sale to the next free slot of my Instagram queue.",
"tools_triggered": "list-social-accounts-tool, list-free-slots-tool, create-post-tool",
"expected_behavior": "Finds the next free queue slot of the Instagram channel and creates the post there, or explains that the channel needs media or posting times before it can be queued."
},
{
"description": "Review post performance",
"prompt": "Which of my posts got the most engagement in the last 30 days, and on which channels?",
"tools_triggered": "get-analytics-report-tool",
"expected_behavior": "Returns the analytics report for the last 30 days and summarizes the top posts with their channel and engagement figures, without inventing numbers."
}
],
"negative": [
{
"description": "Buying followers or engagement is not supported",
"prompt": "Buy 1,000 followers for my Instagram account."
},
{
"description": "Generating images or videos is not supported",
"prompt": "Generate an image of a beach sunset and post it to my Facebook page."
},
{
"description": "Reading another person's private account is not supported",
"prompt": "Show me the scheduled posts of my competitor's Instagram account."
}
]
},
"commerce": false,
"commerce_description": "TryPost does not sell products or process payments in ChatGPT."
},
"publication": {
"release_notes": "Initial release: create, preview, schedule, queue and publish posts, manage approvals and the ideas board, and read analytics."
}
}
}
}
6 changes: 3 additions & 3 deletions .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
"email": "paulo@trypost.it"
},
"metadata": {
"description": "TryPost social media scheduling for AI agents — draft, schedule, and publish across 12 platforms"
"description": "TryPost plugin for planning, scheduling and publishing social media posts"
},
"plugins": [
{
"name": "trypost",
"source": "./",
"version": "1.0.0",
"description": "Social media scheduling for AI agents. Draft, schedule, publish, preview, and track posts across Instagram, Facebook, LinkedIn, X, TikTok, YouTube, Threads, Pinterest, Bluesky, Mastodon, Telegram, and Discord via the hosted TryPost MCP server.",
"version": "2.0.0",
"description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.",
"author": {
"name": "Paulo Castellano",
"email": "paulo@trypost.it",
Expand Down
4 changes: 2 additions & 2 deletions .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "trypost",
"version": "1.0.0",
"description": "Social media scheduling for AI agents. Draft, schedule, publish, preview, and track posts across Instagram, Facebook, LinkedIn, X, TikTok, YouTube, Threads, Pinterest, Bluesky, Mastodon, Telegram, and Discord via the hosted TryPost MCP server.",
"version": "2.0.0",
"description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.",
"author": {
"name": "Paulo Castellano",
"email": "paulo@trypost.it",
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/sync-skill.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
with:
ref: main

Expand Down
81 changes: 81 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Tests

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

permissions:
contents: read

jobs:
tests:
name: Manifest and skill tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- uses: actions/setup-node@v7
with:
node-version: 24

- name: Run the test suite
run: node --test

typecheck:
name: TypeScript type check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- uses: actions/setup-node@v7
with:
node-version: 24

- name: Install TypeScript
run: npm install --no-save --no-package-lock typescript@7.0.2 @types/node@24.19.0

- name: Type-check the tests
run: npx --no-install tsc -p .

claude-plugin:
name: Claude plugin validation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- uses: actions/setup-node@v7
with:
node-version: 24

- name: Install Claude Code
run: npm install --global @anthropic-ai/claude-code@2.1.285

- name: Validate the plugin, its marketplace and its skills
run: |
claude plugin validate --strict .
claude plugin validate --strict .claude-plugin/plugin.json
claude plugin validate --strict .claude-plugin/marketplace.json
claude plugin validate --strict skills
openai-plugin:
name: OpenAI plugin package
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- name: Build the plugin ZIP
run: git archive --format=zip --prefix=trypost/ -o trypost-plugin.zip HEAD .codex-plugin .mcp.json skills assets

- name: Check the ZIP layout
run: |
unzip -l trypost-plugin.zip
for file in trypost/.codex-plugin/plugin.json trypost/.mcp.json trypost/skills/trypost/SKILL.md trypost/assets/icon-512.png; do
unzip -l trypost-plugin.zip "$file" > /dev/null || { echo "::error::$file is missing from the ZIP"; exit 1; }
done
- uses: actions/upload-artifact@v7
with:
name: trypost-plugin
path: trypost-plugin.zip
4 changes: 2 additions & 2 deletions .grok-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"name": "trypost-agent",
"description": "TryPost social media scheduling for AI agents — draft, schedule, and publish posts across 12 platforms",
"description": "TryPost plugin for planning, scheduling and publishing social media posts",
"owner": {
"name": "Paulo Castellano",
"email": "paulo@trypost.it"
},
"plugins": [
{
"name": "trypost",
"description": "TryPost social media scheduling. Draft, schedule, publish, preview, and track posts across Instagram, Facebook, LinkedIn, X, TikTok, YouTube, Threads, Pinterest, Bluesky, Mastodon, Telegram, and Discord.",
"description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.",
"category": "productivity",
"source": { "type": "local", "path": "./" },
"homepage": "https://trypost.it",
Expand Down
4 changes: 2 additions & 2 deletions .grok-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "trypost",
"version": "1.0.0",
"description": "TryPost social media scheduling. Draft, schedule, publish, preview, and track posts across Instagram, Facebook, LinkedIn, X, TikTok, YouTube, Threads, Pinterest, Bluesky, Mastodon, Telegram, and Discord.",
"version": "2.0.0",
"description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.",
"author": {
"name": "Paulo Castellano",
"email": "paulo@trypost.it",
Expand Down
18 changes: 18 additions & 0 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"mcpServers": {
"trypost": {
"type": "http",
"url": "https://app.trypost.it/mcp/trypost",
"extensions": {
"com.openai": {
"auth": {
"type": "oauth",
"client": {
"mode": "dcr"
}
}
}
}
}
}
}
78 changes: 78 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# AGENTS.md

Rules for anyone changing this repository, people and coding agents alike.

This repository packages TryPost as a plugin for Claude Code, Cursor, Grok, ChatGPT and Codex. It ships no server code: a skill (`SKILL.md`), the address of the hosted MCP server (`https://app.trypost.it/mcp/trypost`) and one manifest per host. The MCP server itself lives in [trypostit/trypost](https://github.com/trypostit/trypost).

## TypeScript only

- Every script and test is TypeScript (`.ts`). Never add `.js`, `.mjs`, `.cjs` or `.jsx` files; `tests/repository.test.ts` fails on them.
- Node 24+ runs the `.ts` files directly through type stripping. There is no build step and no compiled output.
- Write erasable TypeScript only (`erasableSyntaxOnly` in `tsconfig.json`): types, interfaces and `import type`, but no `enum`, `namespace` or parameter properties, which Node cannot strip.
- Import local files with their `.ts` extension (`import { read } from './helpers.ts'`) and types with `import type`.
- Use arrow functions and explicit return types on exported functions. Shared shapes of the manifests live in `tests/types.ts`.
- `tsc -p .` must pass. It runs in CI; locally:

```bash
npm install --no-save --no-package-lock typescript@7.0.2 @types/node@24.19.0
npx tsc -p .
```

## No package.json, no dependencies

- Never commit `package.json`, a lockfile or `.npmrc`. The repository root is the plugin folder: Claude Code installs the packages of a lockfile it finds there, and the Claude directory holds such plugins for manual review. `tests/repository.test.ts` enforces this.
- Tests use only Node's built-ins (`node:test`, `node:assert/strict`, `node:fs`, ...). Tools needed only in CI, such as TypeScript or Claude Code, are installed there with `--no-save --no-package-lock` and an exact version.

## Tests

- Every change ships with tests. A new manifest, field, rule or file gets a test in `tests/` that fails without the change; check it by breaking the change on purpose and running the suite.
- Run the whole suite before pushing:

```bash
node --test
```

- One test file per area: `manifests`, `mcp`, `openai`, `skill`, `repository`. Helpers go in `tests/helpers.ts`.
- Do not delete or weaken a test to make a change pass. If a rule changed, change the test and say why in the commit.

## CI

`.github/workflows/tests.yml` runs on every pull request and on `main`, and every job must pass before merging:

| Job | What it checks |
| --- | --- |
| Manifest and skill tests | `node --test` |
| TypeScript type check | `tsc -p .` |
| Claude plugin validation | `claude plugin validate --strict` on the plugin, its marketplace and its skills, with a pinned Claude Code version |
| OpenAI plugin package | Builds the upload ZIP, checks its layout and attaches it to the run |

- Pin every tool and action: exact versions for npm packages, a major tag for GitHub actions. Pick versions released at least two weeks earlier.
- `.github/workflows/sync-skill.yml` copies the root `SKILL.md` into `skills/trypost/SKILL.md` on each release. Still keep both files identical in every commit; a test compares them.

## Manifests

- All plugin manifests (`.claude-plugin`, `.cursor-plugin`, `.grok-plugin`, `.codex-plugin`) and marketplaces share the same `name` (`trypost`), `version` and `description`.
- The version follows the TryPost release it documents (TryPost 2.0 → `2.0.0`). Raise it in every manifest at once.
- Never state how many networks TryPost supports ("12 networks"): the list changes. Name the networks or say "social media".
- Every MCP entry points at `https://app.trypost.it/mcp/trypost`, with no headers and no credentials.
- `.mcp.json` and `mcp.json` declare `"type": "http"`. Claude Code reads `.mcp.json` at the plugin root and drops a remote server without a type, and OpenAI's plugins use the same field.

## OpenAI plugin (`.codex-plugin/plugin.json`)

- Respect the directory limits: `displayName` and `shortDescription` up to 30 characters, `longDescription` up to 4000, up to three `defaultPrompt` of 128 characters, the four https URLs (website, support, privacy, terms), a square PNG icon of 48 to 4096 px.
- Review needs exactly five positive and three negative test cases. Positive cases name tools the skill documents.
- Never mention prices, plans, trials, discounts or upgrades in the listing or the skill.
- Never put reviewer credentials, the demo video, client secrets or the domain verification token in the package; they go in the OpenAI dashboard. The verification token is served by the TryPost app at `https://app.trypost.it/.well-known/openai-apps-challenge`.
- Build the upload with the command in the README; a test checks that it packs everything the manifest references.

## Skill (`SKILL.md`)

- Document what the MCP server does today, from the TryPost code (`app/Mcp` in trypostit/trypost), never from memory. Tool names are the kebab case of the class name (`CreatePostTool` → `create-post-tool`).
- Describe tools; do not instruct the assistant how to behave ("always call X first"), tell it to call other plugins, or hide instructions. Both directories reject that.
- Keep the root `SKILL.md` and `skills/trypost/SKILL.md` identical.

## Writing

- Everything in the repository is in English: code, tests, docs, commit messages.
- Commit messages: a short imperative subject, then a body that says why. No `Co-Authored-By` or tool attribution lines.
- Do not commit to `main`. Open a pull request from a branch and wait for CI.
Loading
Loading