From c4114ffcfe1533497133c4384b68c8c52a6a9ac6 Mon Sep 17 00:00:00 2001 From: Paulo Castellano Date: Thu, 15 Oct 2026 20:40:07 -0300 Subject: [PATCH 1/4] Find the TryPost tools before asking the user to sign in In a Codex session the setup skill asked an already connected user to sign in: the client loads MCP tools on demand, the skill's first step named a tool the model could not see yet, and the hint to search for trypost sat at the end of the sign-in step. Searching for the tools is now step 1 of the setup skill, and sign-in comes only when the search finds none or a call asks for it. The main skill's Connecting section follows the same order. Version 2.0.2. --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- .cursor-plugin/marketplace.json | 2 +- .cursor-plugin/plugin.json | 2 +- .grok-plugin/plugin.json | 2 +- SKILL.md | 4 ++-- skills/setup/SKILL.md | 9 +++++---- skills/trypost/SKILL.md | 4 ++-- tests/skill.test.ts | 10 ++++++++++ 10 files changed, 25 insertions(+), 14 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index c933803..402bed3 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -6,7 +6,7 @@ }, "metadata": { "description": "TryPost plugin for planning, scheduling and publishing social media posts", - "version": "2.0.1" + "version": "2.0.2" }, "plugins": [ { diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 8025658..e10e02d 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "trypost", - "version": "2.0.1", + "version": "2.0.2", "description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.", "author": { "name": "Paulo Castellano", diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index efae7bf..7876047 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "trypost", - "version": "2.0.1", + "version": "2.0.2", "description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.", "author": { "name": "TryPost", diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index e1ac00c..409306e 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -11,7 +11,7 @@ { "name": "trypost", "source": "./", - "version": "2.0.1", + "version": "2.0.2", "description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.", "author": { "name": "Paulo Castellano", diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index b933d7d..883fb98 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "trypost", - "version": "2.0.1", + "version": "2.0.2", "description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.", "author": { "name": "Paulo Castellano", diff --git a/.grok-plugin/plugin.json b/.grok-plugin/plugin.json index 07ecd91..cea346c 100644 --- a/.grok-plugin/plugin.json +++ b/.grok-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "trypost", - "version": "2.0.1", + "version": "2.0.2", "description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.", "author": { "name": "Paulo Castellano", diff --git a/SKILL.md b/SKILL.md index 05cb59b..dca594e 100644 --- a/SKILL.md +++ b/SKILL.md @@ -14,8 +14,8 @@ App: https://app.trypost.it ## Connecting -- Every tool here comes from the `trypost` MCP server and is written `trypost:`. Clients may show the same tool in another form, for example `trypost.list-social-accounts-tool` or `mcp__trypost__list_social_accounts_tool`. If no TryPost tool is listed, search the client's tools for `trypost` before concluding they are missing: some clients load MCP tools on demand. -- The tools are listed only once the user has connected TryPost. If they are missing, or a call asks the user to sign in, the user needs to connect TryPost from the client's plugin or connector settings: that opens TryPost's sign-in (https://app.trypost.it/login), where they pick the workspace to use. No account yet: https://app.trypost.it/register. +- Every tool here comes from the `trypost` MCP server and is written `trypost:`. Clients may load MCP tools on demand and show them in another form, for example `trypost.list-social-accounts-tool` or `mcp__trypost__list_social_accounts_tool`. Before saying a TryPost tool is unavailable, search the client's tools for `trypost`. +- Only when that search finds no TryPost tool, or a call asks the user to sign in, is TryPost not connected: the user connects it from the client's plugin or connector settings, which opens TryPost's sign-in (https://app.trypost.it/login), where they pick the workspace to use. No account yet: https://app.trypost.it/register. - The TryPost web app in a browser is not a substitute for these tools. ## Authentication diff --git a/skills/setup/SKILL.md b/skills/setup/SKILL.md index 64bd3cb..40b7a27 100644 --- a/skills/setup/SKILL.md +++ b/skills/setup/SKILL.md @@ -5,7 +5,8 @@ description: Checks that TryPost is connected after the plugin is installed and # TryPost setup -1. Call `trypost:get-workspace-tool`. When it answers, tell the user which workspace is connected and whether their posts need approval (`me.requires_approval`). -2. Call `trypost:list-social-accounts-tool` and list the connected channels. A channel with `status` `token_expired` or `disconnected` must be reconnected in the TryPost app (Accounts). With no channel, the user connects one in the TryPost app at https://app.trypost.it: channels cannot be connected through the plugin. -3. If the TryPost tools are not listed, or a call asks the user to sign in, they have not connected TryPost yet. Ask them to connect TryPost from the plugin settings: it opens TryPost's sign-in (https://app.trypost.it/login), where they pick the workspace this connection may use. No account yet: https://app.trypost.it/register. Some clients show the tools as `trypost.` or `mcp__trypost__`; search for `trypost` before concluding they are missing. -4. To use another workspace, disconnect TryPost in the plugin settings and connect again, picking that workspace. +1. Find the TryPost tools first. Clients may load MCP tools on demand and name them differently, for example `trypost.get-workspace-tool` or `mcp__trypost__get_workspace_tool`. Search the client's tools for `trypost` before anything else. Only when the search finds none, go to step 4. +2. Call `trypost:get-workspace-tool`. When it answers, tell the user which workspace is connected and whether their posts need approval (`me.requires_approval`). If it asks the user to sign in, go to step 4. +3. Call `trypost:list-social-accounts-tool` and list the connected channels. A channel with `status` `token_expired` or `disconnected` must be reconnected in the TryPost app (Accounts). With no channel, the user connects one in the TryPost app at https://app.trypost.it: channels cannot be connected through the plugin. +4. Only when step 1 found no TryPost tool, or a call asked the user to sign in: TryPost is not connected yet. Ask the user to connect TryPost from the plugin settings: it opens TryPost's sign-in (https://app.trypost.it/login), where they pick the workspace this connection may use. No account yet: https://app.trypost.it/register. +5. To use another workspace, disconnect TryPost in the plugin settings and connect again, picking that workspace. diff --git a/skills/trypost/SKILL.md b/skills/trypost/SKILL.md index 05cb59b..dca594e 100644 --- a/skills/trypost/SKILL.md +++ b/skills/trypost/SKILL.md @@ -14,8 +14,8 @@ App: https://app.trypost.it ## Connecting -- Every tool here comes from the `trypost` MCP server and is written `trypost:`. Clients may show the same tool in another form, for example `trypost.list-social-accounts-tool` or `mcp__trypost__list_social_accounts_tool`. If no TryPost tool is listed, search the client's tools for `trypost` before concluding they are missing: some clients load MCP tools on demand. -- The tools are listed only once the user has connected TryPost. If they are missing, or a call asks the user to sign in, the user needs to connect TryPost from the client's plugin or connector settings: that opens TryPost's sign-in (https://app.trypost.it/login), where they pick the workspace to use. No account yet: https://app.trypost.it/register. +- Every tool here comes from the `trypost` MCP server and is written `trypost:`. Clients may load MCP tools on demand and show them in another form, for example `trypost.list-social-accounts-tool` or `mcp__trypost__list_social_accounts_tool`. Before saying a TryPost tool is unavailable, search the client's tools for `trypost`. +- Only when that search finds no TryPost tool, or a call asks the user to sign in, is TryPost not connected: the user connects it from the client's plugin or connector settings, which opens TryPost's sign-in (https://app.trypost.it/login), where they pick the workspace to use. No account yet: https://app.trypost.it/register. - The TryPost web app in a browser is not a substitute for these tools. ## Authentication diff --git a/tests/skill.test.ts b/tests/skill.test.ts index 463c33a..cebdc3d 100644 --- a/tests/skill.test.ts +++ b/tests/skill.test.ts @@ -64,6 +64,11 @@ describe('skill tool names and sign-in', () => { assert.deepEqual(unqualifiedToolNames(skill), []); }); + test('asks to search for the tools before asking the user to sign in', () => { + assert.ok(skill.indexOf("search the client's tools for `trypost`") > -1); + assert.ok(skill.indexOf("search the client's tools for `trypost`") < skill.indexOf('https://app.trypost.it/login')); + }); + test('explains where the tools come from and how the user signs in', () => { assert.ok(skill.includes('## Connecting')); assert.ok(skill.includes('mcp__trypost__list_social_accounts_tool')); @@ -97,6 +102,11 @@ describe('setup skill', () => { } }); + test('finds the tools first and asks to sign in only when they are missing', () => { + assert.match(setup, /^1\. Find the TryPost tools first\./m); + assert.ok(setup.indexOf("Search the client's tools for `trypost`") < setup.indexOf('https://app.trypost.it/login')); + }); + test('tells the user how to sign in and where to create an account', () => { assert.ok(setup.includes('https://app.trypost.it/login')); assert.ok(setup.includes('https://app.trypost.it/register')); From 1e626f484171e76d49016e28c1a79961baa92a59 Mon Sep 17 00:00:00 2001 From: Paulo Castellano Date: Thu, 15 Oct 2026 21:36:12 -0300 Subject: [PATCH 2/4] Sign in through the plugin settings, never the TryPost website Linking app.trypost.it/login made the model send users to the website, which does not connect the plugin. --- SKILL.md | 2 +- skills/setup/SKILL.md | 2 +- skills/trypost/SKILL.md | 2 +- tests/skill.test.ts | 12 +++++++----- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/SKILL.md b/SKILL.md index dca594e..e6073ea 100644 --- a/SKILL.md +++ b/SKILL.md @@ -15,7 +15,7 @@ App: https://app.trypost.it ## Connecting - Every tool here comes from the `trypost` MCP server and is written `trypost:`. Clients may load MCP tools on demand and show them in another form, for example `trypost.list-social-accounts-tool` or `mcp__trypost__list_social_accounts_tool`. Before saying a TryPost tool is unavailable, search the client's tools for `trypost`. -- Only when that search finds no TryPost tool, or a call asks the user to sign in, is TryPost not connected: the user connects it from the client's plugin or connector settings, which opens TryPost's sign-in (https://app.trypost.it/login), where they pick the workspace to use. No account yet: https://app.trypost.it/register. +- Only when that search finds no TryPost tool, or a call asks the user to sign in, is TryPost not connected: the user connects it from the client's plugin or connector settings, which opens TryPost's sign-in, where they pick the workspace to use. Never send them to the TryPost website to sign in: that does not connect the plugin. No account yet: https://app.trypost.it/register. - The TryPost web app in a browser is not a substitute for these tools. ## Authentication diff --git a/skills/setup/SKILL.md b/skills/setup/SKILL.md index 40b7a27..9209b5a 100644 --- a/skills/setup/SKILL.md +++ b/skills/setup/SKILL.md @@ -8,5 +8,5 @@ description: Checks that TryPost is connected after the plugin is installed and 1. Find the TryPost tools first. Clients may load MCP tools on demand and name them differently, for example `trypost.get-workspace-tool` or `mcp__trypost__get_workspace_tool`. Search the client's tools for `trypost` before anything else. Only when the search finds none, go to step 4. 2. Call `trypost:get-workspace-tool`. When it answers, tell the user which workspace is connected and whether their posts need approval (`me.requires_approval`). If it asks the user to sign in, go to step 4. 3. Call `trypost:list-social-accounts-tool` and list the connected channels. A channel with `status` `token_expired` or `disconnected` must be reconnected in the TryPost app (Accounts). With no channel, the user connects one in the TryPost app at https://app.trypost.it: channels cannot be connected through the plugin. -4. Only when step 1 found no TryPost tool, or a call asked the user to sign in: TryPost is not connected yet. Ask the user to connect TryPost from the plugin settings: it opens TryPost's sign-in (https://app.trypost.it/login), where they pick the workspace this connection may use. No account yet: https://app.trypost.it/register. +4. Only when step 1 found no TryPost tool, or a call asked the user to sign in: TryPost is not connected yet. Ask the user to connect TryPost from the plugin settings: Connect opens TryPost's sign-in, where they pick the workspace this connection may use. Never send them to the TryPost website to sign in: that does not connect the plugin. No account yet: https://app.trypost.it/register. 5. To use another workspace, disconnect TryPost in the plugin settings and connect again, picking that workspace. diff --git a/skills/trypost/SKILL.md b/skills/trypost/SKILL.md index dca594e..e6073ea 100644 --- a/skills/trypost/SKILL.md +++ b/skills/trypost/SKILL.md @@ -15,7 +15,7 @@ App: https://app.trypost.it ## Connecting - Every tool here comes from the `trypost` MCP server and is written `trypost:`. Clients may load MCP tools on demand and show them in another form, for example `trypost.list-social-accounts-tool` or `mcp__trypost__list_social_accounts_tool`. Before saying a TryPost tool is unavailable, search the client's tools for `trypost`. -- Only when that search finds no TryPost tool, or a call asks the user to sign in, is TryPost not connected: the user connects it from the client's plugin or connector settings, which opens TryPost's sign-in (https://app.trypost.it/login), where they pick the workspace to use. No account yet: https://app.trypost.it/register. +- Only when that search finds no TryPost tool, or a call asks the user to sign in, is TryPost not connected: the user connects it from the client's plugin or connector settings, which opens TryPost's sign-in, where they pick the workspace to use. Never send them to the TryPost website to sign in: that does not connect the plugin. No account yet: https://app.trypost.it/register. - The TryPost web app in a browser is not a substitute for these tools. ## Authentication diff --git a/tests/skill.test.ts b/tests/skill.test.ts index cebdc3d..db71c74 100644 --- a/tests/skill.test.ts +++ b/tests/skill.test.ts @@ -66,13 +66,14 @@ describe('skill tool names and sign-in', () => { test('asks to search for the tools before asking the user to sign in', () => { assert.ok(skill.indexOf("search the client's tools for `trypost`") > -1); - assert.ok(skill.indexOf("search the client's tools for `trypost`") < skill.indexOf('https://app.trypost.it/login')); + assert.ok(skill.indexOf("search the client's tools for `trypost`") < skill.indexOf("plugin or connector settings")); }); test('explains where the tools come from and how the user signs in', () => { assert.ok(skill.includes('## Connecting')); assert.ok(skill.includes('mcp__trypost__list_social_accounts_tool')); - assert.ok(skill.includes('https://app.trypost.it/login')); + assert.ok(skill.includes('plugin or connector settings')); + assert.ok(!skill.includes('https://app.trypost.it/login')); assert.ok(skill.includes('https://app.trypost.it/register')); }); }); @@ -104,11 +105,12 @@ describe('setup skill', () => { test('finds the tools first and asks to sign in only when they are missing', () => { assert.match(setup, /^1\. Find the TryPost tools first\./m); - assert.ok(setup.indexOf("Search the client's tools for `trypost`") < setup.indexOf('https://app.trypost.it/login')); + assert.ok(setup.indexOf("Search the client's tools for `trypost`") < setup.indexOf('connect TryPost from the plugin settings')); }); - test('tells the user how to sign in and where to create an account', () => { - assert.ok(setup.includes('https://app.trypost.it/login')); + test('signs the user in through the plugin settings, never the website', () => { + assert.ok(setup.includes('connect TryPost from the plugin settings')); + assert.ok(!setup.includes('https://app.trypost.it/login')); assert.ok(setup.includes('https://app.trypost.it/register')); }); }); From 15f17335f8454ac9e40df5c2f137e3ea1a19330c Mon Sep 17 00:00:00 2001 From: Paulo Castellano Date: Thu, 15 Oct 2026 21:51:33 -0300 Subject: [PATCH 3/4] Name plugin builds by date The ZIP is written as build/trypost-chatgpt-.zip so builds sort by date and never overwrite each other. --- .github/workflows/tests.yml | 4 ++-- AGENTS.md | 2 +- README.md | 2 +- scripts/build.ts | 15 +++++++++++---- tests/build.test.ts | 19 +++++++++++++++---- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7a7de72..826ab76 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -73,9 +73,9 @@ jobs: run: node scripts/build.ts - name: List the ZIP - run: unzip -l build/trypost-chatgpt.zip + run: unzip -l build/trypost-chatgpt-*.zip - uses: actions/upload-artifact@v7 with: name: trypost-chatgpt - path: build/trypost-chatgpt.zip + path: build/trypost-chatgpt-*.zip diff --git a/AGENTS.md b/AGENTS.md index 5a3f040..e41c4f5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -63,7 +63,7 @@ This repository packages TryPost as a plugin for Claude Code, Cursor, Grok, Chat - 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 `node scripts/build.ts`: it writes `build/trypost-chatgpt.zip` (git-ignored) from `HEAD`. The list of packed paths lives only in `scripts/build.ts` (`pluginPaths`); `tests/build.test.ts` checks it covers everything the manifest references. Never commit the ZIP. +- Build the upload with `node scripts/build.ts`: it writes `build/trypost-chatgpt-.zip` (git-ignored, named by build time) from `HEAD`. Other targets follow the same `build/trypost--.zip` pattern. The list of packed paths lives only in `scripts/build.ts` (`pluginPaths`); `tests/build.test.ts` checks it covers everything the manifest references. Never commit the ZIP. ## Skill (`SKILL.md`) diff --git a/README.md b/README.md index ada4800..b7a3553 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Build the ZIP to upload at [platform.openai.com/plugins](https://platform.openai node scripts/build.ts ``` -It writes `build/trypost-chatgpt.zip` (git-ignored) from the last commit, so commit your changes before building. The demo video URL goes in `.codex-plugin/plugin.json` (`extensions.com.openai.review.demo_recording_url`); reviewer credentials and the domain verification token are entered in the dashboard, never in the package. +It writes `build/trypost-chatgpt-.zip` (git-ignored, named by build time so builds sort by date) from the last commit, so commit your changes before building. The demo video URL goes in `.codex-plugin/plugin.json` (`extensions.com.openai.review.demo_recording_url`); reviewer credentials and the domain verification token are entered in the dashboard, never in the package. ### Cursor plugin diff --git a/scripts/build.ts b/scripts/build.ts index 41519d9..63209bb 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -6,16 +6,23 @@ export const root = join(import.meta.dirname, '..'); export const pluginPaths = ['.codex-plugin', '.mcp.json', 'skills', 'assets']; -export const outputFile = 'build/trypost-chatgpt.zip'; +const pad = (value: number): string => String(value).padStart(2, '0'); + +export const timestamp = (date: Date): string => + `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}${pad(date.getHours())}${pad(date.getMinutes())}${pad(date.getSeconds())}`; + +export const outputFile = (date: Date = new Date()): string => `build/trypost-chatgpt-${timestamp(date)}.zip`; + +export const buildPluginZip = (date: Date = new Date()): string => { + const file = outputFile(date); -export const buildPluginZip = (): string => { mkdirSync(join(root, 'build'), { recursive: true }); - execFileSync('git', ['archive', '--format=zip', '--prefix=trypost/', '-o', outputFile, 'HEAD', ...pluginPaths], { + execFileSync('git', ['archive', '--format=zip', '--prefix=trypost/', '-o', file, 'HEAD', ...pluginPaths], { cwd: root, }); - return join(root, outputFile); + return join(root, file); }; if (import.meta.main) { diff --git a/tests/build.test.ts b/tests/build.test.ts index f9ee21f..6f28fd4 100644 --- a/tests/build.test.ts +++ b/tests/build.test.ts @@ -1,8 +1,9 @@ import assert from 'node:assert/strict'; import { execFileSync } from 'node:child_process'; +import { rmSync } from 'node:fs'; import { describe, test } from 'node:test'; -import { buildPluginZip, outputFile, pluginPaths, root } from '../scripts/build.ts'; +import { buildPluginZip, outputFile, pluginPaths, root, timestamp } from '../scripts/build.ts'; import { exists, read, readJson } from './helpers.ts'; import type { PluginManifest } from './types.ts'; @@ -28,11 +29,21 @@ describe('OpenAI plugin build', () => { } }); + test('names the ZIP trypost-chatgpt with the build time, so builds sort by date', () => { + const date = new Date(2026, 9, 5, 7, 8, 9); + + assert.equal(timestamp(date), '20261005070809'); + assert.equal(outputFile(date), 'build/trypost-chatgpt-20261005070809.zip'); + }); + test('writes a ZIP into build/ with the plugin under one trypost/ folder', () => { - const file = buildPluginZip(); + const date = new Date(); + const file = buildPluginZip(date); const entries = zipEntries(file); - assert.equal(file, `${root}/${outputFile}`); + rmSync(file); + + assert.equal(file, `${root}/${outputFile(date)}`); for (const entry of ['.codex-plugin/plugin.json', '.mcp.json', 'skills/trypost/SKILL.md', 'skills/setup/SKILL.md', 'assets/icon-512.png']) { assert.ok(entries.includes(`trypost/${entry}`), `trypost/${entry} is missing from the ZIP`); @@ -49,7 +60,7 @@ describe('OpenAI plugin build', () => { }); test('keeps the build output out of git', () => { - assert.doesNotThrow(() => execFileSync('git', ['check-ignore', '--quiet', outputFile], { cwd: root })); + assert.doesNotThrow(() => execFileSync('git', ['check-ignore', '--quiet', outputFile()], { cwd: root })); }); test('the README builds the ZIP with the script', () => { From 96701acdd265491413e58389ab492dfda1e98f0b Mon Sep 17 00:00:00 2001 From: Paulo Castellano Date: Thu, 15 Oct 2026 22:13:24 -0300 Subject: [PATCH 4/4] Add the demo recording for OpenAI review and release 2.0.3 --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 3 ++- .cursor-plugin/marketplace.json | 2 +- .cursor-plugin/plugin.json | 2 +- .grok-plugin/plugin.json | 2 +- tests/openai.test.ts | 4 ++++ tests/types.ts | 1 + 8 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 402bed3..6849cf4 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -6,7 +6,7 @@ }, "metadata": { "description": "TryPost plugin for planning, scheduling and publishing social media posts", - "version": "2.0.2" + "version": "2.0.3" }, "plugins": [ { diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index e10e02d..0d57c86 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "trypost", - "version": "2.0.2", + "version": "2.0.3", "description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.", "author": { "name": "Paulo Castellano", diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 7876047..c81986b 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "trypost", - "version": "2.0.2", + "version": "2.0.3", "description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.", "author": { "name": "TryPost", @@ -91,6 +91,7 @@ } ] }, + "demo_recording_url": "https://drive.google.com/file/d/1vq3Z9HHRRo2SBt_z2UxeGpN9HMbHPPyG/view?usp=sharing", "commerce": false, "commerce_description": "TryPost does not sell products or process payments in ChatGPT." }, diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 409306e..8be1a68 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -11,7 +11,7 @@ { "name": "trypost", "source": "./", - "version": "2.0.2", + "version": "2.0.3", "description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.", "author": { "name": "Paulo Castellano", diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 883fb98..97ad740 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "trypost", - "version": "2.0.2", + "version": "2.0.3", "description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.", "author": { "name": "Paulo Castellano", diff --git a/.grok-plugin/plugin.json b/.grok-plugin/plugin.json index cea346c..4c45ebe 100644 --- a/.grok-plugin/plugin.json +++ b/.grok-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "trypost", - "version": "2.0.2", + "version": "2.0.3", "description": "Plan, schedule and publish social media posts, manage your queue and approvals, and read post analytics in TryPost.", "author": { "name": "Paulo Castellano", diff --git a/tests/openai.test.ts b/tests/openai.test.ts index 4602690..49050bc 100644 --- a/tests/openai.test.ts +++ b/tests/openai.test.ts @@ -113,6 +113,10 @@ describe('OpenAI review', () => { } }); + test('links a public https demo recording', () => { + assert.match(openai.review?.demo_recording_url ?? '', /^https:\/\/\S+$/); + }); + test('declares no commerce and keeps reviewer access out of the package', () => { assert.equal(openai.review?.commerce, false); assert.doesNotMatch(JSON.stringify(manifest), /test_credentials|reviewer_instructions|password/i); diff --git a/tests/types.ts b/tests/types.ts index facaa56..7c133c8 100644 --- a/tests/types.ts +++ b/tests/types.ts @@ -51,6 +51,7 @@ export type OpenAiSettings = { hooks?: unknown; apps?: unknown; review?: { + demo_recording_url?: string; test_cases?: { positive?: ReviewTestCase[]; negative?: ReviewTestCase[];