@sellable/install 0.1.78 → 0.1.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/sellable-install.mjs +48 -10
- package/package.json +1 -1
- package/skill-templates/create-campaign.md +58 -13
package/bin/sellable-install.mjs
CHANGED
|
@@ -601,17 +601,55 @@ data, compare sources by source volume, sampled ICP fit, activity/warmth
|
|
|
601
601
|
signals, cleanup risk, and confidence basis. If a user asks for a forecast,
|
|
602
602
|
label it explicitly as not estimated from this run.
|
|
603
603
|
|
|
604
|
-
Every approval gate must include
|
|
605
|
-
content. Show
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
substitute for showing the content in chat.
|
|
604
|
+
Every approval gate must include live campaign access after the readable inline
|
|
605
|
+
content. Show a \`Watch link:\` line once the campaign shell exists. In normal
|
|
606
|
+
customer runs, do not show local draft filenames or filesystem paths unless the
|
|
607
|
+
user asks for debug artifacts. The link is for deeper inspection; never use it
|
|
608
|
+
as a substitute for showing the content in chat.
|
|
610
609
|
|
|
611
610
|
Never mention MCP namespaces, prompt chunking, plugin cache paths, missing
|
|
612
611
|
linked skill versions, runbooks, or local skill files in normal customer-facing
|
|
613
612
|
copy.
|
|
614
613
|
|
|
614
|
+
## Codex Watch Browser Handoff
|
|
615
|
+
|
|
616
|
+
When a campaign tool returns \`watchUrl\`, treat it as an active browser handoff,
|
|
617
|
+
not only a URL to print. A valid handoff link must be a signed
|
|
618
|
+
\`/auth/continue?token=...&redirect=/campaign-builder/{campaignId}?mode=claude\`
|
|
619
|
+
URL. \`create_campaign.watchUrl\`, \`create_campaign({ campaignId }).watchUrl\`,
|
|
620
|
+
and \`get_campaign.watchUrl\` are all acceptable only when they return that signed
|
|
621
|
+
shape.
|
|
622
|
+
|
|
623
|
+
In Codex Desktop, when in-app browser control is available, open the returned watch link on the user's behalf. After opening it, inspect the browser-visible campaign state, then explain what the user is seeing before continuing with more campaign tools. Use customer language such as:
|
|
624
|
+
|
|
625
|
+
\`\`\`text
|
|
626
|
+
I’ll open the campaign view and keep it in sync as I build.
|
|
627
|
+
\`\`\`
|
|
628
|
+
|
|
629
|
+
If browser control is unavailable, say so briefly and provide the watch link.
|
|
630
|
+
In VPS or other off-desktop Codex runs, this fallback is the expected handoff for
|
|
631
|
+
the local headed watch observer: make the signed link easy to copy/open, then
|
|
632
|
+
continue with explicit chat progress and \`get_campaign_navigation_state\`
|
|
633
|
+
orientation checks.
|
|
634
|
+
Use this fallback shape:
|
|
635
|
+
|
|
636
|
+
\`\`\`text
|
|
637
|
+
I can’t inspect the campaign browser from this Codex session, so I’ll keep the
|
|
638
|
+
chat steps explicit here. Watch link: {watchUrl}
|
|
639
|
+
\`\`\`
|
|
640
|
+
|
|
641
|
+
If opening the watch link lands on an auth, 404, permission, blank, or visible
|
|
642
|
+
error state, report only what is visible, recover a fresh signed watch link once
|
|
643
|
+
with \`create_campaign({ campaignId })\` or \`get_campaign\`, and try that link.
|
|
644
|
+
Do not claim the browser was opened, inspected, or synchronized unless the
|
|
645
|
+
visible browser state was actually observed. Do not claim the browser was opened
|
|
646
|
+
unless it was opened and observed.
|
|
647
|
+
|
|
648
|
+
After every \`update_campaign({ campaignId, currentStep })\`, use
|
|
649
|
+
\`get_campaign_navigation_state\` when available as a compact orientation check:
|
|
650
|
+
match the browser-visible step to the saved campaign state, explain the current
|
|
651
|
+
state in one sentence, and only then continue. Sender selection belongs at Settings after message approval and 10-row validation. Do not attach a sequence, start the campaign, or trigger a live send unless the user explicitly confirms that launch action outside UAT.
|
|
652
|
+
|
|
615
653
|
## Names To Use
|
|
616
654
|
|
|
617
655
|
Use these exact public names so Claude Code and Codex do not drift:
|
|
@@ -960,10 +998,10 @@ approval should show who we are targeting, why they should care, the offer/CTA,
|
|
|
960
998
|
proof, lead source hypothesis, message angle, risks/assumptions, and what
|
|
961
999
|
happens after approval.
|
|
962
1000
|
|
|
963
|
-
Every approval should also give the user a way to inspect the
|
|
964
|
-
After the readable inline content, include
|
|
965
|
-
|
|
966
|
-
|
|
1001
|
+
Every approval should also give the user a way to inspect the live campaign.
|
|
1002
|
+
After the readable inline content, include a \`Watch link:\` line when a
|
|
1003
|
+
campaign shell exists. Local artifacts are optional debug/UAT diagnostics only;
|
|
1004
|
+
do not surface file paths or local draft filenames in normal customer runs.
|
|
967
1005
|
|
|
968
1006
|
This applies especially to message approvals. Never ask someone to approve a
|
|
969
1007
|
message they cannot see. Show the subject, tokenized template, a filled sample
|
package/package.json
CHANGED
|
@@ -66,10 +66,10 @@ allowed-tools:
|
|
|
66
66
|
|
|
67
67
|
Use this as the customer-facing entrypoint for Sellable campaign creation.
|
|
68
68
|
|
|
69
|
-
CampaignOffer state
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
state first. The
|
|
69
|
+
CampaignOffer state and the watch link are the customer-facing source of truth.
|
|
70
|
+
Disk artifacts are optional debug/UAT diagnostics; normal customer runs should
|
|
71
|
+
not create, link, or surface local draft files unless the user explicitly asks
|
|
72
|
+
for them. Resume, gating, and handoff read campaign state first. The
|
|
73
73
|
watchable campaign exists after the short brief; lead import is bounded to the
|
|
74
74
|
first review batch, and enrichment/message generation waits until rubrics and
|
|
75
75
|
the approved message template are saved on the campaign.
|
|
@@ -147,18 +147,56 @@ Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
|
|
|
147
147
|
lines short, use indexed section labels and bullets, and translate internal
|
|
148
148
|
sourcing terms into plain language.
|
|
149
149
|
|
|
150
|
-
Every approval gate must include
|
|
151
|
-
content. Show a short `
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
content in chat.
|
|
150
|
+
Every approval gate must include live campaign access after the readable inline
|
|
151
|
+
content. Show a short `Watch link:` line once the campaign shell exists. In
|
|
152
|
+
normal customer runs, do not show `Open artifact:` lines, raw filesystem paths,
|
|
153
|
+
or local draft filenames. Local artifacts are debug/UAT-only unless the user asks
|
|
154
|
+
for them. The link is for deeper inspection; never use it as a substitute for
|
|
155
|
+
showing the content in chat.
|
|
157
156
|
|
|
158
157
|
Never mention MCP namespaces, prompt chunking, plugin cache paths, missing
|
|
159
158
|
linked skill versions, runbooks, or local skill files in normal customer-facing
|
|
160
159
|
copy.
|
|
161
160
|
|
|
161
|
+
## Codex Watch Browser Handoff
|
|
162
|
+
|
|
163
|
+
When a campaign tool returns `watchUrl`, treat it as an active browser handoff,
|
|
164
|
+
not only a URL to print. A valid handoff link must be a signed
|
|
165
|
+
`/auth/continue?token=...&redirect=/campaign-builder/{campaignId}?mode=claude`
|
|
166
|
+
URL. `create_campaign.watchUrl`, `create_campaign({ campaignId }).watchUrl`,
|
|
167
|
+
and `get_campaign.watchUrl` are all acceptable only when they return that signed
|
|
168
|
+
shape.
|
|
169
|
+
|
|
170
|
+
In Codex Desktop, when in-app browser control is available, open the returned watch link on the user's behalf. After opening it, inspect the browser-visible campaign state, then explain what the user is seeing before continuing with more campaign tools. Use customer language such as:
|
|
171
|
+
|
|
172
|
+
```text
|
|
173
|
+
I’ll open the campaign view and keep it in sync as I build.
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
If browser control is unavailable, say so briefly and provide the watch link.
|
|
177
|
+
In VPS or other off-desktop Codex runs, this fallback is the expected handoff for
|
|
178
|
+
the local headed watch observer: make the signed link easy to copy/open, then
|
|
179
|
+
continue with explicit chat progress and `get_campaign_navigation_state`
|
|
180
|
+
orientation checks.
|
|
181
|
+
Use this fallback shape:
|
|
182
|
+
|
|
183
|
+
```text
|
|
184
|
+
I can’t inspect the campaign browser from this Codex session, so I’ll keep the
|
|
185
|
+
chat steps explicit here. Watch link: {watchUrl}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
If opening the watch link lands on an auth, 404, permission, blank, or visible
|
|
189
|
+
error state, report only what is visible, recover a fresh signed watch link once
|
|
190
|
+
with `create_campaign({ campaignId })` or `get_campaign`, and try that link. Do
|
|
191
|
+
not claim the browser was opened, inspected, or synchronized unless the visible
|
|
192
|
+
browser state was actually observed. Do not claim the browser was opened unless
|
|
193
|
+
it was opened and observed.
|
|
194
|
+
|
|
195
|
+
After every `update_campaign({ campaignId, currentStep })`, use
|
|
196
|
+
`get_campaign_navigation_state` when available as a compact orientation check:
|
|
197
|
+
match the browser-visible step to the saved campaign state, explain the current
|
|
198
|
+
state in one sentence, and only then continue. Sender selection belongs at Settings after message approval and 10-row validation. Do not attach a sequence, start the campaign, or trigger a live send unless the user explicitly confirms that launch action outside UAT.
|
|
199
|
+
|
|
162
200
|
## Names To Use
|
|
163
201
|
|
|
164
202
|
Use these exact public names so Claude Code and Codex do not drift:
|
|
@@ -503,9 +541,16 @@ updates.
|
|
|
503
541
|
`message-validation.md` proves the message-review safety-gate workflow ran,
|
|
504
542
|
`message-review.md` approves the template, rubrics are saved, and the
|
|
505
543
|
approved message set is synced into the campaign brief.
|
|
506
|
-
6.
|
|
544
|
+
6. The main thread owns watch navigation. Call
|
|
545
|
+
`mcp__sellable__update_campaign({ campaignId, currentStep })` before major
|
|
546
|
+
visible work so the user can watch progress in the app: `create-offer` for
|
|
547
|
+
the brief, `pick-provider` or the selected provider step while sourcing,
|
|
548
|
+
`filter-choice` after the 10-row review batch, `messages` or
|
|
549
|
+
`auto-execute-messaging` for message work, `validate-sample` for validation,
|
|
550
|
+
and `awaiting-user-greenlight` for Settings. Do not advance the step backward.
|
|
551
|
+
7. Keep `selectedLeadListId` as the source list and `workflowTableId` as the
|
|
507
552
|
campaign table. Do not use disk files as the post-mint source of truth.
|
|
508
|
-
|
|
553
|
+
8. Do not ask the user to run another command.
|
|
509
554
|
|
|
510
555
|
## Fallback
|
|
511
556
|
|