Skip to content

v2.1.2 signup rebrand + hands-free /heal recovery#6

Merged
mrdulasolutions merged 5 commits intomainfrom
feat/v2-monorepo
Apr 21, 2026
Merged

v2.1.2 signup rebrand + hands-free /heal recovery#6
mrdulasolutions merged 5 commits intomainfrom
feat/v2-monorepo

Conversation

@mrdulasolutions
Copy link
Copy Markdown
Owner

Summary

Ships v2.1.2 to main so the PM-facing raw.githubusercontent.com/.../main/plugin/scripts/desktop-install.sh URL resolves (it 404s today and the signup page + /heal skill both reference it).

  • Signup page re-themed to match revamfg.com (warm near-black bg, cream copy, #bf6a3f copper CTA, warm-stone step pills). Mailto link on the signup-token field routes "don't have one?" to matt@mrdula.solutions with a prefilled body.
  • Email allowlist (@revamfg.com / @mrdula.solutions) — fail-closed, enforced after the signup-token check so the allowlist doesn't leak.
  • BYO CRM/integrate hubspot|salesforce|attio|pipedrive puts the user's connector at the primary while Nakatomi + AutoMem shadow-write. Full contract in docs/CONNECTORS.md.
  • Hands-free /heal recovery for stale Claude Desktop installs (the v2.0.0→v2.1.2 upgrade gap):
    • New plugin/scripts/desktop-install.sh — quits Desktop, downloads the latest zip, replaces the stale dir, writes creds, pings router, relaunches. Exits 2/3/4 on distinct failures so Cowork can report precisely.
    • revmyengine skill has a /heal section: detects capability (Bash tool | mcp__Control_your_Mac__osascript | Filesystem fallback), runs the script, or tells the PM which connector to enable.
    • reva-turbo-update-check banner leads with /heal, Terminal one-liner second, manual 5-step last.
    • Signup Step 2 offers Option A (copy-paste one-liner with the minted key baked in) and Option B (manual upload).

Test plan

  • /signup page serves the re-themed HTML (verified on Railway)
  • Email allowlist blocks non-@revamfg.com / @mrdula.solutions
  • raw.githubusercontent.com/mrdulasolutions/RevOps-RevAMfg/main/plugin/scripts/desktop-install.sh returns 200 after merge
  • /heal flow end-to-end on a PM's Mac with Control-your-Mac enabled
  • Stale-install banner fires on a synthetic ${user_config.*} plugin.json

🤖 Generated with Claude Code

MRDula and others added 5 commits April 21, 2026 10:18
A valid signup token alone isn't enough — the token is shared in a
group chat, and a leak would hand out Rev A workspace keys to random
accounts. Add a fail-closed email domain allowlist on the server and
mirror it in the browser form so typos are caught before the POST.

- `REVA_ALLOWED_EMAIL_DOMAINS` env var, default
  `revamfg.com,mrdula.solutions`. Override per tenant.
- `_email_domain_allowed()` is strict: empty allowlist => deny all,
  case-insensitive match on the exact domain (subdomain spoofs like
  `eve@fake.revamfg.com` are rejected).
- Server check runs after the token check (so a random attacker who
  guesses the domain but not the token still sees `invalid signup
  token`, not a leaked hint about the allowlist).
- HTML form shows the allowed domains inline under the email field
  and blocks submission client-side with a regex the server injects —
  same contract on both sides.

Tested in prod against the live deploy: `@gmail.com` and
`@fake.revamfg.com` both return 403 "email domain not allowed" with
a valid signup token.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Three user-facing fixes from PM feedback:

1. **README stopped lying to PMs.** The "For end users" section still
   said "Claude prompts for mcp_url and api_key" — 2.1.1 removed the
   userConfig block, so Desktop no longer prompts for anything. Rewrote
   the section with the literal Rev A signup URL, the /connect flow,
   the email allowlist (@revamfg.com / @mrdula.solutions), and a note
   about BYO CRM.

2. **Friendlier branding.** Added `displayName: "RevAOps Plugin"` to
   plugin.json and rewrote the description as product copy instead of
   changelog. Release titles follow suit.

3. **Bring-your-own CRM.** Nakatomi + AutoMem stay as zero-config
   defaults, but teams that already use HubSpot / Salesforce / Attio /
   Pipedrive in Claude Desktop can now make that their system of
   record via `/integrate <slug>`. Nakatomi + AutoMem always
   shadow-write so the shared Rev A timeline stays complete, and reads
   fall back to Nakatomi if the primary is unreachable.

New surface:
- `reva_set_primary_crm` router tool — admin-escalated PATCH of
  `workspace.data.primary_crm` with a 10-entry audit trail
  (`primary_crm_history`).
- `reva_whoami` + `reva_get_workspace_config` now return `primary_crm`
  and `connector_registry` so skills can route writes correctly.
- Seed populates `workspace.data.connector_registry` with 5 options
  (nakatomi + 4 external) and defaults primary to `nakatomi`.
- `/integrate` inline command in revmyengine with detection of
  installed connectors via MCP tool-prefix matching.
- `docs/CONNECTORS.md` documents the shadow-write contract for skill
  authors — primary write → Nakatomi shadow with source tags → AutoMem
  linked to the Nakatomi ID → return the primary's record to the PM.

Signup HTML gains a "Already using HubSpot…" panel so new PMs see the
BYO-CRM story during onboarding.

Tested: re-seeded against prod, verified workspace.data has
`primary_crm: nakatomi` and 5 connector slugs; company_profile and
user_roles untouched (non-destructive seed).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Rebuild SIGNUP_HTML with the palette from revamfg.com (warm near-black
  bg, cream copy, #bf6a3f copper CTA, warm-stone step pills). Mirrors the
  homepage's data-theme="dark" look so the signup flow reads as an
  extension of the brand rather than a separate tool. Adds warm
  radial-gradient vignette, uppercase-tracked section heads,
  brand-matching footer.

- Strengthen Step 2 with a hero "uninstall first" callout. Claude
  Desktop's plugin uploader does NOT overwrite existing installs, so
  PMs on v2.0.x stay stuck on the pre-launcher mcpServers config. The
  only fix is Plugins → Installed → Remove, quit Cmd-Q, reinstall.

- Teach reva-turbo-update-check to detect stale plugin.json (greps for
  reva-mcp-launch.sh reference + absence of ${user_config.*} template)
  and print a loud banner with the recovery steps. Healthy installs
  stay silent. Runs on every engine start, so existing stale installs
  surface the warning the first time the PM runs /reva-turbo:revmyengine
  after pulling the update.

- README: same uninstall-first callout under Step 3 for the link-first
  (no-terminal) install path.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
PMs without a token previously just saw static "one-time code from your
admin" text and had to guess who the admin is. Turn the helper text
into a mailto: to matt@mrdula.solutions with a prefilled subject
("RevAOps signup token request") and a body template that asks for
name / work email / role — matches what Matt actually needs to mint a
token.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…talls

The stale-install problem needs more than a "here are 5 manual steps"
banner. This adds a canonical recovery script that Claude Cowork can
run end-to-end, plus the skill + signup glue to surface it.

- plugin/scripts/desktop-install.sh (new, hosted at raw.githubusercontent.com):
  * Quits Claude Desktop via osascript (idempotent)
  * Detects the plugins root (Library path OR ~/.claude/plugins)
  * Downloads the latest release zip (follows /releases/latest redirect)
  * Removes the stale install dir, extracts fresh
  * Writes ~/.reva-turbo/state/mcp-credentials.env mode-600 with the key
  * Pings the router to catch bad keys BEFORE the restart
  * Relaunches Desktop via `open -a Claude`
  Exits non-zero on: missing key (2), download fail (3), fs fail (4) so
  Cowork can report the exact failure to the PM.

- plugin/skills/revmyengine/SKILL.md: new `/heal` section + command-
  registry row. Spells out the capability check (Bash | osascript |
  Filesystem-only fallback) so Cowork picks the right path. If no
  viable capability exists the skill tells the PM exactly which
  connector to enable, then run /heal again — smooth and hands-free
  when connectors are present, graceful degradation when they're not.

- plugin/bin/reva-turbo-update-check: stale banner now leads with
  `/heal` + the Terminal one-liner + documents the connector needed,
  keeps the manual 5-step as a last resort.

- services/mcp-router/router/signup.py: Step 2 becomes two explicit
  options — Option A (curl | bash, hands-free) with prominent copper-
  accent panel, Option B (manual upload) as a neutral fallback. The
  minted-key success banner now includes a ready-to-paste one-liner
  with the PM's actual key baked in, so Option A is literally copy-
  paste-enter.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@mrdulasolutions mrdulasolutions merged commit 1955768 into main Apr 21, 2026
3 checks passed
mrdulasolutions pushed a commit that referenced this pull request Apr 21, 2026
All the install-UX work that landed since the v2.1.2 tag (signup
rebrand, mailto for token requests, email allowlist enforcement,
hands-free /heal recovery, BYO CRM /integrate) shipped to `main` via
PR #6 but the v2.1.2 tag still points at the older commit — anyone
eyeballing the Releases page sees stale source. Bump to v2.1.3 so the
new tag actually matches what the release asset zip contains.

- plugin/VERSION, plugin/.claude-plugin/plugin.json: 2.1.2 → 2.1.3
- revmyengine/SKILL.md: frontmatter + /heal fallback threshold
- signup.py: footer + Option B download line

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant