feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence) - #471

Draft
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin
Draft

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence)#471
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin

Conversation

@sgang007

Copy link
Copy Markdown

Summary

New community plugin: meridian — Webcmd commands for Meridian (getmeridian.tech), the founder copilot whose Astra agent takes an idea from ideation to validated market intelligence. All commands run through the user's own Meridian account in a logged-in Webcmd browser profile.

Workflows

Authorize the account (browser sign-in/sign-up)

  • webcmd meridian login opens Meridian in the Webcmd browser; the user signs in or signs up (email/password or Google), then webcmd meridian whoami verifies the session (email, org, credits). Commands raise typed AUTH_REQUIRED errors whenever the session is missing or expired — never empty results.

Ideation → Approve & Start

  • webcmd meridian ideate "<message>" drives one turn of the Astra ideation chat (optionally --research), returning the running problem statement, solution, market opportunity, differentiation, readiness scores, tap-to-answer suggestions, and the web-research sources behind Astra's context. Conversation state persists in the site session; drafts are mirrored to the account via autosave.
  • When stage=ready_to_start, webcmd meridian approve starts the project (job-based setup polled to completion) and returns the new project id/URL.

Ideal-user personas

  • webcmd meridian persona <project> "<observed behaviour>" or --file interviews.md builds a persona conversationally and saves it to the account when Astra marks it ready; personas lists them. README documents composing with the reddit plugin (subreddit → behaviours → persona).

Competitor research

  • competitor-scan runs Meridian's landscape job; competitors returns the board prioritized by relevance; competitor-add feeds in candidates sourced via the ycombinator / hackernews / producthunt plugins so the next scan positions them.

Market intelligence

  • agent-start [--scan], agent-status, agent-pause control the Astra background agent and report its parallel branch states (market research, synthesis, planning, execution) plus checkpoints awaiting a human.

Implementation notes

  • Commands mirror the app's own API contract from the logged-in page context: httpOnly session_token cookie, credentialed cross-origin fetch from app.getmeridian.tech to api.getmeridian.tech/api (on the platform CORS allowlist).
  • Long Astra calls are kicked off inside the page and polled with short evaluates to stay under the CDP evaluate cap; job-based endpoints (project setup, competitor scan) are polled via /jobs/{id}.
  • Typed errors throughout: ArgumentError for input validation, AuthRequiredError for 401/plain-403/missing cookie, CommandExecutionError for HTTP failures, credit (402) and subscription-gate (structured 403) responses, timeouts, and the ideation content-safety guardrail.
  • Row keys match declared columns exactly (silent-column-drop safe); no generated files touched (plugin-PR scope keeps the diff inside plugins/meridian/).

Verification

  • npx vitest run --project plugin plugins/meridian49/49 tests pass (fetch machinery, error mapping, chat-state round-trips, and command contracts against a scripted fake page).
  • npm test — unit + plugin projects pass except 5 pre-existing, environment-dependent failures in src/fetch/safe-proxy.test.ts (private-DNS-answer tests; fail identically on a clean checkout of main on this machine).
  • npm run check-community-plugins — passes (124 plugins).
  • node scripts/check-plugin-pr-scope.mjs origin/main HEAD — passes (all changes inside plugins/meridian/).
  • Live, against production in a clean profile:
    • webcmd plugin install <path> → all 13 commands discoverable via webcmd list.
    • webcmd meridian whoami (signed out) → typed AUTH_REQUIRED with actionable guidance.
    • webcmd meridian login → opens app.getmeridian.tech in the Webcmd browser, returns action_required + the exact verify command, and Webcmd pauses the adapter session for the human sign-in handoff.
    • Credentialed page-context fetch from the app origin to api.getmeridian.tech/api/auth/me → HTTP 401 {"detail":"Not authenticated"} (CORS and the exact network path the commands use, confirmed; a signed-in session rides the same path).

Notes / limitations

  • Meridian meters some actions in account credits (new project, competitor scan/add, research turns); the commands surface the API's 402/403 responses as actionable messages.
  • Chat drafts keep conversation state in the persistent site session; a recycled tab starts a fresh draft (--reset does so explicitly). Ideation drafts are additionally autosaved to the account.

🤖 Generated with Claude Code

Webcmd commands for Meridian (getmeridian.tech), the founder copilot with
the Astra agent: browser-based account authorization (login/whoami),
turn-based Astra ideation chat up to the Approve & Start stage, project
creation, ideal-user persona building from behaviours or interview notes,
prioritized competitor research, and Astra background-agent (market
intelligence) controls.
Commands ride the app's own API contract from the logged-in page context
(httpOnly session cookie, cross-origin app->api fetch), kick off long
Astra calls in-page and poll to stay under the CDP evaluate cap, and poll
job-based endpoints (project setup, competitor scans) to completion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actionsBot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

Documentation sync review is deferred until this draft is marked ready for review.

This review is advisory and does not block merging.

@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:11
@sgang007
sgang007 marked this pull request as ready for review August 30, 2026 17:12
@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:12
Sign up for freeto 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.

1 participant

@sgang007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence) - #471

Draft
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin
Draft

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence)#471
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin

Conversation

@sgang007

Copy link
Copy Markdown

Summary

New community plugin: meridian — Webcmd commands for Meridian (getmeridian.tech), the founder copilot whose Astra agent takes an idea from ideation to validated market intelligence. All commands run through the user's own Meridian account in a logged-in Webcmd browser profile.

Workflows

Authorize the account (browser sign-in/sign-up)

  • webcmd meridian login opens Meridian in the Webcmd browser; the user signs in or signs up (email/password or Google), then webcmd meridian whoami verifies the session (email, org, credits). Commands raise typed AUTH_REQUIRED errors whenever the session is missing or expired — never empty results.

Ideation → Approve & Start

  • webcmd meridian ideate "<message>" drives one turn of the Astra ideation chat (optionally --research), returning the running problem statement, solution, market opportunity, differentiation, readiness scores, tap-to-answer suggestions, and the web-research sources behind Astra's context. Conversation state persists in the site session; drafts are mirrored to the account via autosave.
  • When stage=ready_to_start, webcmd meridian approve starts the project (job-based setup polled to completion) and returns the new project id/URL.

Ideal-user personas

  • webcmd meridian persona <project> "<observed behaviour>" or --file interviews.md builds a persona conversationally and saves it to the account when Astra marks it ready; personas lists them. README documents composing with the reddit plugin (subreddit → behaviours → persona).

Competitor research

  • competitor-scan runs Meridian's landscape job; competitors returns the board prioritized by relevance; competitor-add feeds in candidates sourced via the ycombinator / hackernews / producthunt plugins so the next scan positions them.

Market intelligence

  • agent-start [--scan], agent-status, agent-pause control the Astra background agent and report its parallel branch states (market research, synthesis, planning, execution) plus checkpoints awaiting a human.

Implementation notes

  • Commands mirror the app's own API contract from the logged-in page context: httpOnly session_token cookie, credentialed cross-origin fetch from app.getmeridian.tech to api.getmeridian.tech/api (on the platform CORS allowlist).
  • Long Astra calls are kicked off inside the page and polled with short evaluates to stay under the CDP evaluate cap; job-based endpoints (project setup, competitor scan) are polled via /jobs/{id}.
  • Typed errors throughout: ArgumentError for input validation, AuthRequiredError for 401/plain-403/missing cookie, CommandExecutionError for HTTP failures, credit (402) and subscription-gate (structured 403) responses, timeouts, and the ideation content-safety guardrail.
  • Row keys match declared columns exactly (silent-column-drop safe); no generated files touched (plugin-PR scope keeps the diff inside plugins/meridian/).

Verification

  • npx vitest run --project plugin plugins/meridian49/49 tests pass (fetch machinery, error mapping, chat-state round-trips, and command contracts against a scripted fake page).
  • npm test — unit + plugin projects pass except 5 pre-existing, environment-dependent failures in src/fetch/safe-proxy.test.ts (private-DNS-answer tests; fail identically on a clean checkout of main on this machine).
  • npm run check-community-plugins — passes (124 plugins).
  • node scripts/check-plugin-pr-scope.mjs origin/main HEAD — passes (all changes inside plugins/meridian/).
  • Live, against production in a clean profile:
    • webcmd plugin install <path> → all 13 commands discoverable via webcmd list.
    • webcmd meridian whoami (signed out) → typed AUTH_REQUIRED with actionable guidance.
    • webcmd meridian login → opens app.getmeridian.tech in the Webcmd browser, returns action_required + the exact verify command, and Webcmd pauses the adapter session for the human sign-in handoff.
    • Credentialed page-context fetch from the app origin to api.getmeridian.tech/api/auth/me → HTTP 401 {"detail":"Not authenticated"} (CORS and the exact network path the commands use, confirmed; a signed-in session rides the same path).

Notes / limitations

  • Meridian meters some actions in account credits (new project, competitor scan/add, research turns); the commands surface the API's 402/403 responses as actionable messages.
  • Chat drafts keep conversation state in the persistent site session; a recycled tab starts a fresh draft (--reset does so explicitly). Ideation drafts are additionally autosaved to the account.

🤖 Generated with Claude Code

Webcmd commands for Meridian (getmeridian.tech), the founder copilot with
the Astra agent: browser-based account authorization (login/whoami),
turn-based Astra ideation chat up to the Approve & Start stage, project
creation, ideal-user persona building from behaviours or interview notes,
prioritized competitor research, and Astra background-agent (market
intelligence) controls.
Commands ride the app's own API contract from the logged-in page context
(httpOnly session cookie, cross-origin app->api fetch), kick off long
Astra calls in-page and poll to stay under the CDP evaluate cap, and poll
job-based endpoints (project setup, competitor scans) to completion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actionsBot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

Documentation sync review is deferred until this draft is marked ready for review.

This review is advisory and does not block merging.

@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:11
@sgang007
sgang007 marked this pull request as ready for review August 30, 2026 17:12
@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:12
Sign up for freeto 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.

1 participant

@sgang007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence) - #471

Draft
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin
Draft

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence)#471
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin

Conversation

@sgang007

Copy link
Copy Markdown

Summary

New community plugin: meridian — Webcmd commands for Meridian (getmeridian.tech), the founder copilot whose Astra agent takes an idea from ideation to validated market intelligence. All commands run through the user's own Meridian account in a logged-in Webcmd browser profile.

Workflows

Authorize the account (browser sign-in/sign-up)

  • webcmd meridian login opens Meridian in the Webcmd browser; the user signs in or signs up (email/password or Google), then webcmd meridian whoami verifies the session (email, org, credits). Commands raise typed AUTH_REQUIRED errors whenever the session is missing or expired — never empty results.

Ideation → Approve & Start

  • webcmd meridian ideate "<message>" drives one turn of the Astra ideation chat (optionally --research), returning the running problem statement, solution, market opportunity, differentiation, readiness scores, tap-to-answer suggestions, and the web-research sources behind Astra's context. Conversation state persists in the site session; drafts are mirrored to the account via autosave.
  • When stage=ready_to_start, webcmd meridian approve starts the project (job-based setup polled to completion) and returns the new project id/URL.

Ideal-user personas

  • webcmd meridian persona <project> "<observed behaviour>" or --file interviews.md builds a persona conversationally and saves it to the account when Astra marks it ready; personas lists them. README documents composing with the reddit plugin (subreddit → behaviours → persona).

Competitor research

  • competitor-scan runs Meridian's landscape job; competitors returns the board prioritized by relevance; competitor-add feeds in candidates sourced via the ycombinator / hackernews / producthunt plugins so the next scan positions them.

Market intelligence

  • agent-start [--scan], agent-status, agent-pause control the Astra background agent and report its parallel branch states (market research, synthesis, planning, execution) plus checkpoints awaiting a human.

Implementation notes

  • Commands mirror the app's own API contract from the logged-in page context: httpOnly session_token cookie, credentialed cross-origin fetch from app.getmeridian.tech to api.getmeridian.tech/api (on the platform CORS allowlist).
  • Long Astra calls are kicked off inside the page and polled with short evaluates to stay under the CDP evaluate cap; job-based endpoints (project setup, competitor scan) are polled via /jobs/{id}.
  • Typed errors throughout: ArgumentError for input validation, AuthRequiredError for 401/plain-403/missing cookie, CommandExecutionError for HTTP failures, credit (402) and subscription-gate (structured 403) responses, timeouts, and the ideation content-safety guardrail.
  • Row keys match declared columns exactly (silent-column-drop safe); no generated files touched (plugin-PR scope keeps the diff inside plugins/meridian/).

Verification

  • npx vitest run --project plugin plugins/meridian49/49 tests pass (fetch machinery, error mapping, chat-state round-trips, and command contracts against a scripted fake page).
  • npm test — unit + plugin projects pass except 5 pre-existing, environment-dependent failures in src/fetch/safe-proxy.test.ts (private-DNS-answer tests; fail identically on a clean checkout of main on this machine).
  • npm run check-community-plugins — passes (124 plugins).
  • node scripts/check-plugin-pr-scope.mjs origin/main HEAD — passes (all changes inside plugins/meridian/).
  • Live, against production in a clean profile:
    • webcmd plugin install <path> → all 13 commands discoverable via webcmd list.
    • webcmd meridian whoami (signed out) → typed AUTH_REQUIRED with actionable guidance.
    • webcmd meridian login → opens app.getmeridian.tech in the Webcmd browser, returns action_required + the exact verify command, and Webcmd pauses the adapter session for the human sign-in handoff.
    • Credentialed page-context fetch from the app origin to api.getmeridian.tech/api/auth/me → HTTP 401 {"detail":"Not authenticated"} (CORS and the exact network path the commands use, confirmed; a signed-in session rides the same path).

Notes / limitations

  • Meridian meters some actions in account credits (new project, competitor scan/add, research turns); the commands surface the API's 402/403 responses as actionable messages.
  • Chat drafts keep conversation state in the persistent site session; a recycled tab starts a fresh draft (--reset does so explicitly). Ideation drafts are additionally autosaved to the account.

🤖 Generated with Claude Code

Webcmd commands for Meridian (getmeridian.tech), the founder copilot with
the Astra agent: browser-based account authorization (login/whoami),
turn-based Astra ideation chat up to the Approve & Start stage, project
creation, ideal-user persona building from behaviours or interview notes,
prioritized competitor research, and Astra background-agent (market
intelligence) controls.
Commands ride the app's own API contract from the logged-in page context
(httpOnly session cookie, cross-origin app->api fetch), kick off long
Astra calls in-page and poll to stay under the CDP evaluate cap, and poll
job-based endpoints (project setup, competitor scans) to completion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actionsBot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

Documentation sync review is deferred until this draft is marked ready for review.

This review is advisory and does not block merging.

@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:11
@sgang007
sgang007 marked this pull request as ready for review August 30, 2026 17:12
@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:12
Sign up for freeto 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.

1 participant

@sgang007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence) - #471

Draft
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin
Draft

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence)#471
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin

Conversation

@sgang007

Copy link
Copy Markdown

Summary

New community plugin: meridian — Webcmd commands for Meridian (getmeridian.tech), the founder copilot whose Astra agent takes an idea from ideation to validated market intelligence. All commands run through the user's own Meridian account in a logged-in Webcmd browser profile.

Workflows

Authorize the account (browser sign-in/sign-up)

  • webcmd meridian login opens Meridian in the Webcmd browser; the user signs in or signs up (email/password or Google), then webcmd meridian whoami verifies the session (email, org, credits). Commands raise typed AUTH_REQUIRED errors whenever the session is missing or expired — never empty results.

Ideation → Approve & Start

  • webcmd meridian ideate "<message>" drives one turn of the Astra ideation chat (optionally --research), returning the running problem statement, solution, market opportunity, differentiation, readiness scores, tap-to-answer suggestions, and the web-research sources behind Astra's context. Conversation state persists in the site session; drafts are mirrored to the account via autosave.
  • When stage=ready_to_start, webcmd meridian approve starts the project (job-based setup polled to completion) and returns the new project id/URL.

Ideal-user personas

  • webcmd meridian persona <project> "<observed behaviour>" or --file interviews.md builds a persona conversationally and saves it to the account when Astra marks it ready; personas lists them. README documents composing with the reddit plugin (subreddit → behaviours → persona).

Competitor research

  • competitor-scan runs Meridian's landscape job; competitors returns the board prioritized by relevance; competitor-add feeds in candidates sourced via the ycombinator / hackernews / producthunt plugins so the next scan positions them.

Market intelligence

  • agent-start [--scan], agent-status, agent-pause control the Astra background agent and report its parallel branch states (market research, synthesis, planning, execution) plus checkpoints awaiting a human.

Implementation notes

  • Commands mirror the app's own API contract from the logged-in page context: httpOnly session_token cookie, credentialed cross-origin fetch from app.getmeridian.tech to api.getmeridian.tech/api (on the platform CORS allowlist).
  • Long Astra calls are kicked off inside the page and polled with short evaluates to stay under the CDP evaluate cap; job-based endpoints (project setup, competitor scan) are polled via /jobs/{id}.
  • Typed errors throughout: ArgumentError for input validation, AuthRequiredError for 401/plain-403/missing cookie, CommandExecutionError for HTTP failures, credit (402) and subscription-gate (structured 403) responses, timeouts, and the ideation content-safety guardrail.
  • Row keys match declared columns exactly (silent-column-drop safe); no generated files touched (plugin-PR scope keeps the diff inside plugins/meridian/).

Verification

  • npx vitest run --project plugin plugins/meridian49/49 tests pass (fetch machinery, error mapping, chat-state round-trips, and command contracts against a scripted fake page).
  • npm test — unit + plugin projects pass except 5 pre-existing, environment-dependent failures in src/fetch/safe-proxy.test.ts (private-DNS-answer tests; fail identically on a clean checkout of main on this machine).
  • npm run check-community-plugins — passes (124 plugins).
  • node scripts/check-plugin-pr-scope.mjs origin/main HEAD — passes (all changes inside plugins/meridian/).
  • Live, against production in a clean profile:
    • webcmd plugin install <path> → all 13 commands discoverable via webcmd list.
    • webcmd meridian whoami (signed out) → typed AUTH_REQUIRED with actionable guidance.
    • webcmd meridian login → opens app.getmeridian.tech in the Webcmd browser, returns action_required + the exact verify command, and Webcmd pauses the adapter session for the human sign-in handoff.
    • Credentialed page-context fetch from the app origin to api.getmeridian.tech/api/auth/me → HTTP 401 {"detail":"Not authenticated"} (CORS and the exact network path the commands use, confirmed; a signed-in session rides the same path).

Notes / limitations

  • Meridian meters some actions in account credits (new project, competitor scan/add, research turns); the commands surface the API's 402/403 responses as actionable messages.
  • Chat drafts keep conversation state in the persistent site session; a recycled tab starts a fresh draft (--reset does so explicitly). Ideation drafts are additionally autosaved to the account.

🤖 Generated with Claude Code

Webcmd commands for Meridian (getmeridian.tech), the founder copilot with
the Astra agent: browser-based account authorization (login/whoami),
turn-based Astra ideation chat up to the Approve & Start stage, project
creation, ideal-user persona building from behaviours or interview notes,
prioritized competitor research, and Astra background-agent (market
intelligence) controls.
Commands ride the app's own API contract from the logged-in page context
(httpOnly session cookie, cross-origin app->api fetch), kick off long
Astra calls in-page and poll to stay under the CDP evaluate cap, and poll
job-based endpoints (project setup, competitor scans) to completion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actionsBot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

Documentation sync review is deferred until this draft is marked ready for review.

This review is advisory and does not block merging.

@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:11
@sgang007
sgang007 marked this pull request as ready for review August 30, 2026 17:12
@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:12
Sign up for freeto 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.

1 participant

@sgang007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence) - #471

Draft
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin
Draft

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence)#471
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin

Conversation

@sgang007

Copy link
Copy Markdown

Summary

New community plugin: meridian — Webcmd commands for Meridian (getmeridian.tech), the founder copilot whose Astra agent takes an idea from ideation to validated market intelligence. All commands run through the user's own Meridian account in a logged-in Webcmd browser profile.

Workflows

Authorize the account (browser sign-in/sign-up)

  • webcmd meridian login opens Meridian in the Webcmd browser; the user signs in or signs up (email/password or Google), then webcmd meridian whoami verifies the session (email, org, credits). Commands raise typed AUTH_REQUIRED errors whenever the session is missing or expired — never empty results.

Ideation → Approve & Start

  • webcmd meridian ideate "<message>" drives one turn of the Astra ideation chat (optionally --research), returning the running problem statement, solution, market opportunity, differentiation, readiness scores, tap-to-answer suggestions, and the web-research sources behind Astra's context. Conversation state persists in the site session; drafts are mirrored to the account via autosave.
  • When stage=ready_to_start, webcmd meridian approve starts the project (job-based setup polled to completion) and returns the new project id/URL.

Ideal-user personas

  • webcmd meridian persona <project> "<observed behaviour>" or --file interviews.md builds a persona conversationally and saves it to the account when Astra marks it ready; personas lists them. README documents composing with the reddit plugin (subreddit → behaviours → persona).

Competitor research

  • competitor-scan runs Meridian's landscape job; competitors returns the board prioritized by relevance; competitor-add feeds in candidates sourced via the ycombinator / hackernews / producthunt plugins so the next scan positions them.

Market intelligence

  • agent-start [--scan], agent-status, agent-pause control the Astra background agent and report its parallel branch states (market research, synthesis, planning, execution) plus checkpoints awaiting a human.

Implementation notes

  • Commands mirror the app's own API contract from the logged-in page context: httpOnly session_token cookie, credentialed cross-origin fetch from app.getmeridian.tech to api.getmeridian.tech/api (on the platform CORS allowlist).
  • Long Astra calls are kicked off inside the page and polled with short evaluates to stay under the CDP evaluate cap; job-based endpoints (project setup, competitor scan) are polled via /jobs/{id}.
  • Typed errors throughout: ArgumentError for input validation, AuthRequiredError for 401/plain-403/missing cookie, CommandExecutionError for HTTP failures, credit (402) and subscription-gate (structured 403) responses, timeouts, and the ideation content-safety guardrail.
  • Row keys match declared columns exactly (silent-column-drop safe); no generated files touched (plugin-PR scope keeps the diff inside plugins/meridian/).

Verification

  • npx vitest run --project plugin plugins/meridian49/49 tests pass (fetch machinery, error mapping, chat-state round-trips, and command contracts against a scripted fake page).
  • npm test — unit + plugin projects pass except 5 pre-existing, environment-dependent failures in src/fetch/safe-proxy.test.ts (private-DNS-answer tests; fail identically on a clean checkout of main on this machine).
  • npm run check-community-plugins — passes (124 plugins).
  • node scripts/check-plugin-pr-scope.mjs origin/main HEAD — passes (all changes inside plugins/meridian/).
  • Live, against production in a clean profile:
    • webcmd plugin install <path> → all 13 commands discoverable via webcmd list.
    • webcmd meridian whoami (signed out) → typed AUTH_REQUIRED with actionable guidance.
    • webcmd meridian login → opens app.getmeridian.tech in the Webcmd browser, returns action_required + the exact verify command, and Webcmd pauses the adapter session for the human sign-in handoff.
    • Credentialed page-context fetch from the app origin to api.getmeridian.tech/api/auth/me → HTTP 401 {"detail":"Not authenticated"} (CORS and the exact network path the commands use, confirmed; a signed-in session rides the same path).

Notes / limitations

  • Meridian meters some actions in account credits (new project, competitor scan/add, research turns); the commands surface the API's 402/403 responses as actionable messages.
  • Chat drafts keep conversation state in the persistent site session; a recycled tab starts a fresh draft (--reset does so explicitly). Ideation drafts are additionally autosaved to the account.

🤖 Generated with Claude Code

Webcmd commands for Meridian (getmeridian.tech), the founder copilot with
the Astra agent: browser-based account authorization (login/whoami),
turn-based Astra ideation chat up to the Approve & Start stage, project
creation, ideal-user persona building from behaviours or interview notes,
prioritized competitor research, and Astra background-agent (market
intelligence) controls.
Commands ride the app's own API contract from the logged-in page context
(httpOnly session cookie, cross-origin app->api fetch), kick off long
Astra calls in-page and poll to stay under the CDP evaluate cap, and poll
job-based endpoints (project setup, competitor scans) to completion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actionsBot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

Documentation sync review is deferred until this draft is marked ready for review.

This review is advisory and does not block merging.

@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:11
@sgang007
sgang007 marked this pull request as ready for review August 30, 2026 17:12
@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:12
Sign up for freeto 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.

1 participant

@sgang007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence) - #471

Draft
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin
Draft

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence)#471
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin

Conversation

@sgang007

Copy link
Copy Markdown

Summary

New community plugin: meridian — Webcmd commands for Meridian (getmeridian.tech), the founder copilot whose Astra agent takes an idea from ideation to validated market intelligence. All commands run through the user's own Meridian account in a logged-in Webcmd browser profile.

Workflows

Authorize the account (browser sign-in/sign-up)

  • webcmd meridian login opens Meridian in the Webcmd browser; the user signs in or signs up (email/password or Google), then webcmd meridian whoami verifies the session (email, org, credits). Commands raise typed AUTH_REQUIRED errors whenever the session is missing or expired — never empty results.

Ideation → Approve & Start

  • webcmd meridian ideate "<message>" drives one turn of the Astra ideation chat (optionally --research), returning the running problem statement, solution, market opportunity, differentiation, readiness scores, tap-to-answer suggestions, and the web-research sources behind Astra's context. Conversation state persists in the site session; drafts are mirrored to the account via autosave.
  • When stage=ready_to_start, webcmd meridian approve starts the project (job-based setup polled to completion) and returns the new project id/URL.

Ideal-user personas

  • webcmd meridian persona <project> "<observed behaviour>" or --file interviews.md builds a persona conversationally and saves it to the account when Astra marks it ready; personas lists them. README documents composing with the reddit plugin (subreddit → behaviours → persona).

Competitor research

  • competitor-scan runs Meridian's landscape job; competitors returns the board prioritized by relevance; competitor-add feeds in candidates sourced via the ycombinator / hackernews / producthunt plugins so the next scan positions them.

Market intelligence

  • agent-start [--scan], agent-status, agent-pause control the Astra background agent and report its parallel branch states (market research, synthesis, planning, execution) plus checkpoints awaiting a human.

Implementation notes

  • Commands mirror the app's own API contract from the logged-in page context: httpOnly session_token cookie, credentialed cross-origin fetch from app.getmeridian.tech to api.getmeridian.tech/api (on the platform CORS allowlist).
  • Long Astra calls are kicked off inside the page and polled with short evaluates to stay under the CDP evaluate cap; job-based endpoints (project setup, competitor scan) are polled via /jobs/{id}.
  • Typed errors throughout: ArgumentError for input validation, AuthRequiredError for 401/plain-403/missing cookie, CommandExecutionError for HTTP failures, credit (402) and subscription-gate (structured 403) responses, timeouts, and the ideation content-safety guardrail.
  • Row keys match declared columns exactly (silent-column-drop safe); no generated files touched (plugin-PR scope keeps the diff inside plugins/meridian/).

Verification

  • npx vitest run --project plugin plugins/meridian49/49 tests pass (fetch machinery, error mapping, chat-state round-trips, and command contracts against a scripted fake page).
  • npm test — unit + plugin projects pass except 5 pre-existing, environment-dependent failures in src/fetch/safe-proxy.test.ts (private-DNS-answer tests; fail identically on a clean checkout of main on this machine).
  • npm run check-community-plugins — passes (124 plugins).
  • node scripts/check-plugin-pr-scope.mjs origin/main HEAD — passes (all changes inside plugins/meridian/).
  • Live, against production in a clean profile:
    • webcmd plugin install <path> → all 13 commands discoverable via webcmd list.
    • webcmd meridian whoami (signed out) → typed AUTH_REQUIRED with actionable guidance.
    • webcmd meridian login → opens app.getmeridian.tech in the Webcmd browser, returns action_required + the exact verify command, and Webcmd pauses the adapter session for the human sign-in handoff.
    • Credentialed page-context fetch from the app origin to api.getmeridian.tech/api/auth/me → HTTP 401 {"detail":"Not authenticated"} (CORS and the exact network path the commands use, confirmed; a signed-in session rides the same path).

Notes / limitations

  • Meridian meters some actions in account credits (new project, competitor scan/add, research turns); the commands surface the API's 402/403 responses as actionable messages.
  • Chat drafts keep conversation state in the persistent site session; a recycled tab starts a fresh draft (--reset does so explicitly). Ideation drafts are additionally autosaved to the account.

🤖 Generated with Claude Code

Webcmd commands for Meridian (getmeridian.tech), the founder copilot with
the Astra agent: browser-based account authorization (login/whoami),
turn-based Astra ideation chat up to the Approve & Start stage, project
creation, ideal-user persona building from behaviours or interview notes,
prioritized competitor research, and Astra background-agent (market
intelligence) controls.
Commands ride the app's own API contract from the logged-in page context
(httpOnly session cookie, cross-origin app->api fetch), kick off long
Astra calls in-page and poll to stay under the CDP evaluate cap, and poll
job-based endpoints (project setup, competitor scans) to completion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actionsBot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

Documentation sync review is deferred until this draft is marked ready for review.

This review is advisory and does not block merging.

@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:11
@sgang007
sgang007 marked this pull request as ready for review August 30, 2026 17:12
@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:12
Sign up for freeto 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.

1 participant

@sgang007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence) - #471

Draft
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin
Draft

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence)#471
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin

Conversation

@sgang007

Copy link
Copy Markdown

Summary

New community plugin: meridian — Webcmd commands for Meridian (getmeridian.tech), the founder copilot whose Astra agent takes an idea from ideation to validated market intelligence. All commands run through the user's own Meridian account in a logged-in Webcmd browser profile.

Workflows

Authorize the account (browser sign-in/sign-up)

  • webcmd meridian login opens Meridian in the Webcmd browser; the user signs in or signs up (email/password or Google), then webcmd meridian whoami verifies the session (email, org, credits). Commands raise typed AUTH_REQUIRED errors whenever the session is missing or expired — never empty results.

Ideation → Approve & Start

  • webcmd meridian ideate "<message>" drives one turn of the Astra ideation chat (optionally --research), returning the running problem statement, solution, market opportunity, differentiation, readiness scores, tap-to-answer suggestions, and the web-research sources behind Astra's context. Conversation state persists in the site session; drafts are mirrored to the account via autosave.
  • When stage=ready_to_start, webcmd meridian approve starts the project (job-based setup polled to completion) and returns the new project id/URL.

Ideal-user personas

  • webcmd meridian persona <project> "<observed behaviour>" or --file interviews.md builds a persona conversationally and saves it to the account when Astra marks it ready; personas lists them. README documents composing with the reddit plugin (subreddit → behaviours → persona).

Competitor research

  • competitor-scan runs Meridian's landscape job; competitors returns the board prioritized by relevance; competitor-add feeds in candidates sourced via the ycombinator / hackernews / producthunt plugins so the next scan positions them.

Market intelligence

  • agent-start [--scan], agent-status, agent-pause control the Astra background agent and report its parallel branch states (market research, synthesis, planning, execution) plus checkpoints awaiting a human.

Implementation notes

  • Commands mirror the app's own API contract from the logged-in page context: httpOnly session_token cookie, credentialed cross-origin fetch from app.getmeridian.tech to api.getmeridian.tech/api (on the platform CORS allowlist).
  • Long Astra calls are kicked off inside the page and polled with short evaluates to stay under the CDP evaluate cap; job-based endpoints (project setup, competitor scan) are polled via /jobs/{id}.
  • Typed errors throughout: ArgumentError for input validation, AuthRequiredError for 401/plain-403/missing cookie, CommandExecutionError for HTTP failures, credit (402) and subscription-gate (structured 403) responses, timeouts, and the ideation content-safety guardrail.
  • Row keys match declared columns exactly (silent-column-drop safe); no generated files touched (plugin-PR scope keeps the diff inside plugins/meridian/).

Verification

  • npx vitest run --project plugin plugins/meridian49/49 tests pass (fetch machinery, error mapping, chat-state round-trips, and command contracts against a scripted fake page).
  • npm test — unit + plugin projects pass except 5 pre-existing, environment-dependent failures in src/fetch/safe-proxy.test.ts (private-DNS-answer tests; fail identically on a clean checkout of main on this machine).
  • npm run check-community-plugins — passes (124 plugins).
  • node scripts/check-plugin-pr-scope.mjs origin/main HEAD — passes (all changes inside plugins/meridian/).
  • Live, against production in a clean profile:
    • webcmd plugin install <path> → all 13 commands discoverable via webcmd list.
    • webcmd meridian whoami (signed out) → typed AUTH_REQUIRED with actionable guidance.
    • webcmd meridian login → opens app.getmeridian.tech in the Webcmd browser, returns action_required + the exact verify command, and Webcmd pauses the adapter session for the human sign-in handoff.
    • Credentialed page-context fetch from the app origin to api.getmeridian.tech/api/auth/me → HTTP 401 {"detail":"Not authenticated"} (CORS and the exact network path the commands use, confirmed; a signed-in session rides the same path).

Notes / limitations

  • Meridian meters some actions in account credits (new project, competitor scan/add, research turns); the commands surface the API's 402/403 responses as actionable messages.
  • Chat drafts keep conversation state in the persistent site session; a recycled tab starts a fresh draft (--reset does so explicitly). Ideation drafts are additionally autosaved to the account.

🤖 Generated with Claude Code

Webcmd commands for Meridian (getmeridian.tech), the founder copilot with
the Astra agent: browser-based account authorization (login/whoami),
turn-based Astra ideation chat up to the Approve & Start stage, project
creation, ideal-user persona building from behaviours or interview notes,
prioritized competitor research, and Astra background-agent (market
intelligence) controls.
Commands ride the app's own API contract from the logged-in page context
(httpOnly session cookie, cross-origin app->api fetch), kick off long
Astra calls in-page and poll to stay under the CDP evaluate cap, and poll
job-based endpoints (project setup, competitor scans) to completion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actionsBot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

Documentation sync review is deferred until this draft is marked ready for review.

This review is advisory and does not block merging.

@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:11
@sgang007
sgang007 marked this pull request as ready for review August 30, 2026 17:12
@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:12
Sign up for freeto 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.

1 participant

@sgang007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence) - #471

Draft
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin
Draft

feat: add meridian community plugin (Astra ideation, personas, competitor research, market intelligence)#471
sgang007 wants to merge 1 commit into
agentrhq:mainfrom
sgang007:meridian-plugin

Conversation

@sgang007

Copy link
Copy Markdown

Summary

New community plugin: meridian — Webcmd commands for Meridian (getmeridian.tech), the founder copilot whose Astra agent takes an idea from ideation to validated market intelligence. All commands run through the user's own Meridian account in a logged-in Webcmd browser profile.

Workflows

Authorize the account (browser sign-in/sign-up)

  • webcmd meridian login opens Meridian in the Webcmd browser; the user signs in or signs up (email/password or Google), then webcmd meridian whoami verifies the session (email, org, credits). Commands raise typed AUTH_REQUIRED errors whenever the session is missing or expired — never empty results.

Ideation → Approve & Start

  • webcmd meridian ideate "<message>" drives one turn of the Astra ideation chat (optionally --research), returning the running problem statement, solution, market opportunity, differentiation, readiness scores, tap-to-answer suggestions, and the web-research sources behind Astra's context. Conversation state persists in the site session; drafts are mirrored to the account via autosave.
  • When stage=ready_to_start, webcmd meridian approve starts the project (job-based setup polled to completion) and returns the new project id/URL.

Ideal-user personas

  • webcmd meridian persona <project> "<observed behaviour>" or --file interviews.md builds a persona conversationally and saves it to the account when Astra marks it ready; personas lists them. README documents composing with the reddit plugin (subreddit → behaviours → persona).

Competitor research

  • competitor-scan runs Meridian's landscape job; competitors returns the board prioritized by relevance; competitor-add feeds in candidates sourced via the ycombinator / hackernews / producthunt plugins so the next scan positions them.

Market intelligence

  • agent-start [--scan], agent-status, agent-pause control the Astra background agent and report its parallel branch states (market research, synthesis, planning, execution) plus checkpoints awaiting a human.

Implementation notes

  • Commands mirror the app's own API contract from the logged-in page context: httpOnly session_token cookie, credentialed cross-origin fetch from app.getmeridian.tech to api.getmeridian.tech/api (on the platform CORS allowlist).
  • Long Astra calls are kicked off inside the page and polled with short evaluates to stay under the CDP evaluate cap; job-based endpoints (project setup, competitor scan) are polled via /jobs/{id}.
  • Typed errors throughout: ArgumentError for input validation, AuthRequiredError for 401/plain-403/missing cookie, CommandExecutionError for HTTP failures, credit (402) and subscription-gate (structured 403) responses, timeouts, and the ideation content-safety guardrail.
  • Row keys match declared columns exactly (silent-column-drop safe); no generated files touched (plugin-PR scope keeps the diff inside plugins/meridian/).

Verification

  • npx vitest run --project plugin plugins/meridian49/49 tests pass (fetch machinery, error mapping, chat-state round-trips, and command contracts against a scripted fake page).
  • npm test — unit + plugin projects pass except 5 pre-existing, environment-dependent failures in src/fetch/safe-proxy.test.ts (private-DNS-answer tests; fail identically on a clean checkout of main on this machine).
  • npm run check-community-plugins — passes (124 plugins).
  • node scripts/check-plugin-pr-scope.mjs origin/main HEAD — passes (all changes inside plugins/meridian/).
  • Live, against production in a clean profile:
    • webcmd plugin install <path> → all 13 commands discoverable via webcmd list.
    • webcmd meridian whoami (signed out) → typed AUTH_REQUIRED with actionable guidance.
    • webcmd meridian login → opens app.getmeridian.tech in the Webcmd browser, returns action_required + the exact verify command, and Webcmd pauses the adapter session for the human sign-in handoff.
    • Credentialed page-context fetch from the app origin to api.getmeridian.tech/api/auth/me → HTTP 401 {"detail":"Not authenticated"} (CORS and the exact network path the commands use, confirmed; a signed-in session rides the same path).

Notes / limitations

  • Meridian meters some actions in account credits (new project, competitor scan/add, research turns); the commands surface the API's 402/403 responses as actionable messages.
  • Chat drafts keep conversation state in the persistent site session; a recycled tab starts a fresh draft (--reset does so explicitly). Ideation drafts are additionally autosaved to the account.

🤖 Generated with Claude Code

Webcmd commands for Meridian (getmeridian.tech), the founder copilot with
the Astra agent: browser-based account authorization (login/whoami),
turn-based Astra ideation chat up to the Approve & Start stage, project
creation, ideal-user persona building from behaviours or interview notes,
prioritized competitor research, and Astra background-agent (market
intelligence) controls.
Commands ride the app's own API contract from the logged-in page context
(httpOnly session cookie, cross-origin app->api fetch), kick off long
Astra calls in-page and poll to stay under the CDP evaluate cap, and poll
job-based endpoints (project setup, competitor scans) to completion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actionsBot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

🟠 Maintainer review suggested — low confidence

Documentation sync review is deferred until this draft is marked ready for review.

This review is advisory and does not block merging.

@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:11
@sgang007
sgang007 marked this pull request as ready for review August 30, 2026 17:12
@sgang007
sgang007 marked this pull request as draft August 30, 2026 17:12
Sign up for freeto 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.

1 participant

@sgang007