Skip to content

Commit 5c1decf

Browse files
committed
feat(skills): identity verification coverage + announcement type (0.3.0)
Two platform features shipped since the skills last looked: usertour-sdk-install — identity verification (the enforced-JWT identify): - new references/identity-verification.md: the contract (HS256, utv_ signing secret, sub/companyId claims), the silent-rejection symptom, per-environment secrets, validator/coverage debugging; per-language minting snippets stay in the live guide (Node/Python/Ruby/PHP/Go) — the skill points there instead of copying them - SKILL.md: identify step + non-negotiables gain the enforced-token requirement; utv_ joins utp_ in the never-in-client-code grep; retrieval table gains the identity-verification guide - identify.md: the { token } option; troubleshooting.md: "identify looks ignored / user never appears" symptom → silent enforcement rejection usertour-content-authoring — announcement type: - type lists include announcement; patterns.md picker gains the row plus a banner-vs-announcement distinction and the reach-through-a- resource-center-block trap Version 0.2.15 → 0.3.0 across the six manifests (validate.js green).
1 parent 10d8ad6 commit 5c1decf

12 files changed

Lines changed: 136 additions & 12 deletions

File tree

.agents/plugins/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"plugins": [
33
{
44
"name": "usertour",
5-
"version": "0.2.15",
5+
"version": "0.3.0",
66
"category": "Coding",
77
"source": {
88
"type": "local",

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"name": "usertour",
1111
"source": "./",
1212
"description": "Skills for authoring Usertour in-app onboarding content",
13-
"version": "0.2.15"
13+
"version": "0.3.0"
1414
}
1515
]
1616
}

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "usertour",
33
"description": "Skills for Usertour in-app onboarding — authoring content (flows, checklists, launchers, banners, surveys) and installing the Web SDK — via the Usertour API/MCP",
4-
"version": "0.2.15",
4+
"version": "0.3.0",
55
"author": {
66
"name": "Usertour",
77
"url": "https://www.usertour.io"

.codex-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "usertour",
3-
"version": "0.2.15",
3+
"version": "0.3.0",
44
"description": "Skills for Usertour in-app onboarding — authoring content (flows, checklists, launchers, banners, surveys) and installing the Web SDK — via the Usertour API/MCP",
55
"author": {
66
"name": "Usertour",

.cursor-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"name": "usertour",
1010
"source": "./",
1111
"description": "Skills for authoring Usertour in-app onboarding content",
12-
"version": "0.2.15"
12+
"version": "0.3.0"
1313
}
1414
]
1515
}

.cursor-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "usertour",
3-
"version": "0.2.15",
3+
"version": "0.3.0",
44
"description": "Skills for Usertour in-app onboarding — authoring content (flows, checklists, launchers, banners, surveys) and installing the Web SDK — via the Usertour API/MCP",
55
"author": {
66
"name": "Usertour",

skills/usertour-content-authoring/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
name: usertour-content-authoring
3-
description: Author and publish Usertour in-app onboarding content — flows (tours), checklists, launchers, banners, surveys, trackers — via the Usertour API/MCP. Use when the user mentions Usertour, building a product tour / onboarding / in-app guide / checklist, or asks to create, update, validate, or publish Usertour content. Biases toward retrieving the live schema and authoring guide from the Usertour MCP over pre-trained knowledge.
3+
description: Author and publish Usertour in-app onboarding content — flows (tours), checklists, launchers, banners, announcements (release notes / product news), surveys, trackers — via the Usertour API/MCP. Use when the user mentions Usertour, building a product tour / onboarding / in-app guide / checklist, or asks to create, update, validate, or publish Usertour content. Biases toward retrieving the live schema and authoring guide from the Usertour MCP over pre-trained knowledge.
44
---
55

66
# Usertour content authoring
@@ -15,7 +15,7 @@ always current.
1515
| Source | How | Use for |
1616
|--------|-----|---------|
1717
| `get_authoring_guide` (MCP tool) | call it at the start | Lifecycle, step types, markdown subset, frequency, what each type needs to publish |
18-
| `get_content_schema` (MCP tool) | `get_content_schema({ type })` | The exact write body — `steps` for `flow`, `data` for checklist/launcher/banner/tracker/resource-center. **Fetch before authoring a non-flow type** (its `data` is polymorphic). |
18+
| `get_content_schema` (MCP tool) | `get_content_schema({ type })` | The exact write body — `steps` for `flow`, `data` for checklist/launcher/banner/tracker/announcement/resource-center. **Fetch before authoring a non-flow type** (its `data` is polymorphic). |
1919
| `validate_content_version` (MCP tool) | dry-run a draft | The publishable-or-not check + precise errors |
2020
| v2 docs | https://docs.usertour.io (API reference v2 → Concepts) | Human reference: blocks, conditions & actions, rules, type data |
2121

skills/usertour-content-authoring/references/patterns.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ don't transcribe them here. For exact fields use `get_content_schema`.
1212
| A guided multi-step walkthrough (steps must happen now, in order) | **flow** |
1313
| A "get started" list of independent, self-paced tasks | **checklist** |
1414
| A persistent help button / spotlight that opens a tooltip or runs an action | **launcher** |
15-
| A top/bottom announcement bar | **banner** |
15+
| A one-time notice strip at the top/bottom of the page | **banner** |
1616
| A help hub with tabs of content | **resource-center** |
17+
| Release notes / product news users can revisit, with an unread badge or one-time popup | **announcement** |
1718
| Fire an analytics event when conditions match, no UI | **tracker** |
1819

1920
Two opposite mistakes to avoid:
@@ -25,6 +26,13 @@ Two opposite mistakes to avoid:
2526

2627
Ongoing help belongs in a **launcher** / **resource-center**, not a tour.
2728

29+
**Banner vs announcement:** a banner is a one-shot notice (each user sees it
30+
once, dismiss and it's gone forever — think maintenance windows); an
31+
announcement is a FEED item (release notes, product news) users can revisit,
32+
delivered with an unread badge or a one-time popup. Announcements reach users
33+
ONLY through a resource center with an `announcement` block — publish alone
34+
surfaces nothing (the guide's Announcements section has the wiring).
35+
2836
## Make the flow follow the user
2937

3038
A step that can only advance via its own button gets stranded the moment the user

skills/usertour-sdk-install/SKILL.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ retrieval**: read the live docs for the snippet, and get the token from the MCP.
2121
| `get_authoring_guide` (MCP tool) | call it | The "Making it appear (the SDK)" section — the cross-surface gotchas |
2222
| `list_environments` (MCP tool) | call it | The **environment token** for `init()` (the `token` field) |
2323
| Self-hosted SDK config | WebFetch https://docs.usertour.io/open-source/usertourjs | `USERTOURJS_ENV_VARS` keys when the instance isn't Usertour Cloud |
24+
| Identity verification guide | WebFetch https://docs.usertour.io/developers/identity-verification | Backend-signed identify JWTs, when the environment enforces them |
2425

2526
If the `usertour` MCP isn't connected, you can still install from the docs, but
2627
ask the user for the environment token (Settings → Environments) — it is the
@@ -53,7 +54,10 @@ ask the user for the environment token (Settings → Environments) — it is the
5354
Call `usertour.identify(userId, attributes)` when the app knows the user.
5455
**`userId` must equal the `externalId`** the content's segments / start-rules
5556
target, or published content silently never shows. Call `usertour.reset()` on
56-
logout.
57+
logout. If the environment **requires identity verification**, `identify()` /
58+
`group()` must also carry a backend-signed JWT (the `{ token }` option) or the
59+
identity is **silently rejected** at connect — see
60+
[references/identity-verification.md](references/identity-verification.md).
5761
6. **SPA routing** — for single-page apps, confirm content re-evaluates on route
5862
change (see the framework reference).
5963
7. **Verify**[references/verify.md](references/verify.md). Load the app,
@@ -62,10 +66,17 @@ ask the user for the environment token (Settings → Environments) — it is the
6266

6367
## Non-negotiables
6468

65-
- **Token type (security):** environment token for `init()`; the API token never
66-
touches client code.
69+
- **Token type (security):** environment token for `init()`; the API token
70+
(`utp_…`) and the identity-verification **signing secret** (`utv_…`) never
71+
touch client code — only the backend-signed JWT does. Grep the app for both
72+
prefixes before finishing.
6773
- **Identify linkage:** `identify()` id == the `externalId` used in
6874
segments / start-rules, or nothing renders (the #1 "it's not showing" cause).
75+
- **Enforced identity verification:** when the target environment requires it,
76+
the install is not done until `identify()`/`group()` carry a valid signed
77+
token — unsigned calls are rejected **silently** (looks exactly like
78+
"identify ignored"). See
79+
[references/identity-verification.md](references/identity-verification.md).
6980
- **Defer the API to the docs:** this skill is the wiring + gotchas, not a copy of
7081
the snippet. Read the reference; it's the source of truth.
7182
- **Self-host target:** if the instance isn't Usertour Cloud, point the SDK at it

skills/usertour-sdk-install/references/identify.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,19 @@ Attribute **codes** must match those defined in Usertour
5757
If you target by company/account, also call
5858
`usertour.group(companyId, { name, plan, … })`. The `companyId` likewise must
5959
match the company `externalId` used in targeting.
60+
61+
## Identity verification (when the environment enforces it)
62+
63+
Some environments require every `identify()` / `group()` to be **proven** with a
64+
JWT the app's backend signs (HS256, the environment's `utv_…` signing secret,
65+
claims `{ sub: userId, companyId? }`). Pass it as the third argument:
66+
67+
```js
68+
usertour.identify(currentUser.id, attributes, { token: usertourJwt });
69+
usertour.group(company.id, companyAttributes, { token: usertourJwt });
70+
```
71+
72+
Without a valid token in an enforcing environment the identity is rejected
73+
**silently** — the user never appears in Usertour and nothing renders. Details,
74+
backend snippet, and debugging:
75+
[identity-verification.md](identity-verification.md).

0 commit comments

Comments
 (0)