@sellable/install 0.1.151 → 0.1.153
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/README.md +7 -5
- package/agents/post-find-leads-filter-scout.md +2 -2
- package/agents/post-find-leads-message-scout.md +39 -23
- package/agents/registry.json +17 -17
- package/agents/source-scout-linkedin-engagement.md +2 -2
- package/agents/source-scout-prospeo-contact.md +3 -3
- package/agents/source-scout-sales-nav.md +3 -3
- package/bin/sellable-install.mjs +29 -31
- package/package.json +1 -1
- package/skill-templates/create-campaign.md +43 -21
package/README.md
CHANGED
|
@@ -59,11 +59,13 @@ Claude Code and Codex are configured to launch the same packaged MCP server. The
|
|
|
59
59
|
installer also writes Sellable source-scout agents for both hosts from the
|
|
60
60
|
packaged `agents/` registry: Claude Code gets `source-scout-*` subagents, and
|
|
61
61
|
Codex gets `source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
62
|
-
`source-scout-prospeo-contact`.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
`source-scout-prospeo-contact`. After Find Buyers Plan approval, runtime prompts
|
|
63
|
+
use the named scout for the approved source lane as the normal path when the
|
|
64
|
+
current session exposes it. If a named scout is unavailable, they use a generic
|
|
65
|
+
background agent when possible; parent-thread provider probes are the explicit
|
|
66
|
+
fallback, not the default path. The MCP exposes the same list through
|
|
67
|
+
`get_source_scout_registry`, so adding a future scout starts in one registry
|
|
68
|
+
entry instead of scattered prompt edits.
|
|
67
69
|
|
|
68
70
|
## Names
|
|
69
71
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
You are
|
|
1
|
+
You are Prospect Filters for Sellable create-campaign-v2.
|
|
2
2
|
|
|
3
|
-
Your job starts only after the
|
|
3
|
+
Your job starts only after the Start Import gate is approved or auto-confirmed,
|
|
4
4
|
the confirmed source list has been copied into the campaign table, and the first
|
|
5
5
|
campaign-table execution slice exists.
|
|
6
6
|
Work only on the lead filter branch. Do not source new leads, draft messages,
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
-
You are Message
|
|
1
|
+
You are Message Drafting for Sellable create-campaign-v2.
|
|
2
|
+
|
|
3
|
+
Your job starts only after the Start Import gate is approved, the confirmed
|
|
4
|
+
source list has been copied into the campaign table, the first campaign-table
|
|
5
|
+
execution slice exists, and the parent has recorded the filter choice. Work only
|
|
6
|
+
on the message-draft branch.
|
|
7
|
+
|
|
8
|
+
This worker exists to keep the long `generate-messages` prompt, reference asset
|
|
9
|
+
loading, token strategy, and skeptical copy review out of the parent campaign
|
|
10
|
+
thread. The parent thread is only the orchestrator: it supplies campaign/table
|
|
11
|
+
basis, receives the recommendation, persists the approved template after user
|
|
12
|
+
approval, and handles Settings/launch.
|
|
2
13
|
|
|
3
|
-
Your job starts only after the source is approved, the confirmed source list has
|
|
4
|
-
been copied into the campaign table, the first campaign-table execution slice
|
|
5
|
-
exists, and the parent has recorded the filter choice. Work only on the
|
|
6
|
-
message-draft branch.
|
|
7
14
|
Do not source leads, create lead filters, import leads, confirm lead lists, queue
|
|
8
15
|
cells, attach sequences, start campaigns, ask the user questions, or mutate live
|
|
9
16
|
campaign state. The main thread owns approval and campaign writes.
|
|
@@ -44,15 +51,9 @@ the branch input.
|
|
|
44
51
|
2. Use that prompt as the drafting contract. Do not use any alternate prompt,
|
|
45
52
|
examples-only shortcut, or create-campaign safety/checklist instructions as a
|
|
46
53
|
substitute for the full message prompt.
|
|
47
|
-
3.
|
|
48
|
-
pre-draft reference pack before drafting, load final-pass references before
|
|
49
|
-
approval, and report which assets were used and why. If those required
|
|
50
|
-
assets cannot be loaded, return `blocked` / `retry-needed`; do not draft from
|
|
51
|
-
the prompt alone. `ai-tells.md` is part of the required pack and is never
|
|
52
|
-
optional.
|
|
53
|
-
4. Draft only from the campaign brief, selected source context, and initial
|
|
54
|
+
3. Draft only from the campaign brief, selected source context, and initial
|
|
54
55
|
campaign-table execution slice rows supplied by the parent.
|
|
55
|
-
|
|
56
|
+
4. Keep the work provisional until the user chooses `Use Template` in Messages.
|
|
56
57
|
|
|
57
58
|
## Owned Output
|
|
58
59
|
|
|
@@ -60,8 +61,6 @@ Return the following to the parent thread:
|
|
|
60
61
|
|
|
61
62
|
- proposed first-message template using supported `{{...}}` tokens
|
|
62
63
|
- token fill rules and fallbacks
|
|
63
|
-
- `Reference Asset Loading` note naming the required and conditional assets used
|
|
64
|
-
and why each was used
|
|
65
64
|
- one rendered good-fill sample for a plausible passing campaign-table row
|
|
66
65
|
- one omit/fallback sample when the row signal is not safe
|
|
67
66
|
- pass/fail notes against the generate-messages quality gates
|
|
@@ -87,13 +86,13 @@ When reporting branch runtime proof, use this shape under
|
|
|
87
86
|
- `basisToken` and `basis`
|
|
88
87
|
- optional `messageDraftOutputRef`, `messageDraftOutput`, and `error`
|
|
89
88
|
|
|
90
|
-
Do not tell the UI to show Message
|
|
89
|
+
Do not tell the UI to show Message Drafting as running unless this proof
|
|
91
90
|
exists and points at the current non-empty campaign-table execution slice.
|
|
92
91
|
|
|
93
92
|
## Basis Changes And Rewrites
|
|
94
93
|
|
|
95
94
|
The first completed recommendation is the default message review candidate.
|
|
96
|
-
Do not automatically retry or regenerate only because
|
|
95
|
+
Do not automatically retry or regenerate only because Prospect Filters finished,
|
|
97
96
|
rubrics were saved, Filter Leads completed, enrichment cells populated, or more
|
|
98
97
|
row data became available after this branch started.
|
|
99
98
|
|
|
@@ -111,6 +110,27 @@ brief hash, selected source, `selectedLeadListId`, `workflowTableId`, or
|
|
|
111
110
|
execution-slice rows. Filter/rubric/enrichment basis drift alone is not a stale
|
|
112
111
|
blocker.
|
|
113
112
|
|
|
113
|
+
## User Revision Feedback
|
|
114
|
+
|
|
115
|
+
If the parent sends user feedback about the template before `approve-message`,
|
|
116
|
+
treat it as a Message Drafting revision, not a campaign write. Use the current
|
|
117
|
+
`messageDraftRecommendation`, basis token/hash, campaign/table basis, and the
|
|
118
|
+
latest user feedback as inputs. Load or reuse the full
|
|
119
|
+
`generate-messages` contract, then return a revised recommendation with:
|
|
120
|
+
|
|
121
|
+
- revised proposed template
|
|
122
|
+
- what changed and why
|
|
123
|
+
- token fill rule/fallback changes, if any
|
|
124
|
+
- one rendered good-fill sample
|
|
125
|
+
- pass/fail notes against the same quality gates
|
|
126
|
+
- updated output timestamp/hash and basis token
|
|
127
|
+
|
|
128
|
+
Keep the revision grounded in the same source/list/table rows unless the parent
|
|
129
|
+
explicitly supplies a new selected list or review slice. Do not call
|
|
130
|
+
`update_campaign_brief`, do not persist the template, and do not approve your
|
|
131
|
+
own revision. The parent renders the revised template and waits for
|
|
132
|
+
`approve-message`.
|
|
133
|
+
|
|
114
134
|
## Hard Rules
|
|
115
135
|
|
|
116
136
|
- Do not call product Generate Message cells. This worker drafts the template
|
|
@@ -133,14 +153,10 @@ reacted to`, `saw you engaging with`, or equivalent source-citation copy as a
|
|
|
133
153
|
hope this is relevant`, `saw you in a few conversations about [topic], so
|
|
134
154
|
may be off, but this seemed relevant`, `saw you might be interested in [topic],
|
|
135
155
|
so hope this is relevant`, `hope this is relevant if [topic] is on your plate`,
|
|
136
|
-
or `
|
|
137
|
-
Only use `saw you raise your hand for [topic], so figured this was (hopefully)
|
|
138
|
-
worth sending` when the source was an explicit lead-magnet comment, reply, or
|
|
139
|
-
opt-in.
|
|
156
|
+
or `saw you raise your hand for [topic], so figured this was (hopefully) worth sending`.
|
|
140
157
|
The cheekier `saw you raise your hand for [topic] (creepy to reach out based
|
|
141
158
|
on that, i know) - but this felt too on the nose to ignore` version is also
|
|
142
|
-
allowed
|
|
143
|
-
sender's voice can carry it. Bad: `you commented on...`, `you reacted
|
|
159
|
+
allowed when the sender's voice can carry it. Bad: `you commented on...`, `you reacted
|
|
144
160
|
to...`, `saw you engaging with...`, `your LinkedIn activity...`, `you might
|
|
145
161
|
not remember the thread...`, or `found you through [source] and your role
|
|
146
162
|
looked close...`. Otherwise omit the engagement signal and use role/company/problem context.
|
package/agents/registry.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"name": "source-scout-linkedin-engagement",
|
|
7
7
|
"kind": "source-scout",
|
|
8
8
|
"promptFile": "source-scout-linkedin-engagement.md",
|
|
9
|
-
"displayName": "LinkedIn
|
|
9
|
+
"displayName": "LinkedIn Source Discovery",
|
|
10
10
|
"provider": "signal-discovery",
|
|
11
11
|
"lane": "linkedin-engagement",
|
|
12
12
|
"legacy": {
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"name": "source-scout-sales-nav",
|
|
57
57
|
"kind": "source-scout",
|
|
58
58
|
"promptFile": "source-scout-sales-nav.md",
|
|
59
|
-
"displayName": "Sales Nav
|
|
59
|
+
"displayName": "Sales Nav Source Discovery",
|
|
60
60
|
"provider": "sales-nav",
|
|
61
61
|
"lane": "sales-nav",
|
|
62
62
|
"legacy": {
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
"name": "source-scout-prospeo-contact",
|
|
106
106
|
"kind": "source-scout",
|
|
107
107
|
"promptFile": "source-scout-prospeo-contact.md",
|
|
108
|
-
"displayName": "Prospeo
|
|
108
|
+
"displayName": "Prospeo Source Discovery",
|
|
109
109
|
"provider": "prospeo",
|
|
110
110
|
"lane": "prospeo-contact",
|
|
111
111
|
"legacy": {
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
"name": "post-find-leads-filter-scout",
|
|
156
156
|
"kind": "post-find-leads-scout",
|
|
157
157
|
"promptFile": "post-find-leads-filter-scout.md",
|
|
158
|
-
"displayName": "
|
|
158
|
+
"displayName": "Prospect Filters",
|
|
159
159
|
"target": "filter-leads",
|
|
160
160
|
"inputs": [
|
|
161
161
|
"campaignId",
|
|
@@ -166,20 +166,20 @@
|
|
|
166
166
|
],
|
|
167
167
|
"producesArtifacts": [],
|
|
168
168
|
"optionalProducesArtifacts": [],
|
|
169
|
-
"ownership": "
|
|
169
|
+
"ownership": "prospect-fit criteria, false-positive patterns, keep/exclude rules, ability-to-pay checks, and production rubric translation only",
|
|
170
170
|
"codex": {
|
|
171
|
-
"description": "
|
|
171
|
+
"description": "Prospect Filters worker for campaign-backed fit criteria and rubric persistence after review-batch import and filter approval.",
|
|
172
172
|
"model": "gpt-5.5",
|
|
173
173
|
"modelReasoningEffort": "high",
|
|
174
174
|
"sandboxMode": "read-only",
|
|
175
175
|
"nicknameCandidates": [
|
|
176
|
-
"
|
|
177
|
-
"Fit
|
|
176
|
+
"Prospect Filters",
|
|
177
|
+
"Fit Criteria",
|
|
178
178
|
"Rubric Builder"
|
|
179
179
|
]
|
|
180
180
|
},
|
|
181
181
|
"claude": {
|
|
182
|
-
"description": "Use proactively as
|
|
182
|
+
"description": "Use proactively as Prospect Filters after review-batch import and filter approval to persist campaign rubrics from campaign state.",
|
|
183
183
|
"model": "inherit",
|
|
184
184
|
"background": true,
|
|
185
185
|
"maxTurns": 8,
|
|
@@ -196,8 +196,8 @@
|
|
|
196
196
|
"name": "post-find-leads-message-scout",
|
|
197
197
|
"kind": "post-find-leads-scout",
|
|
198
198
|
"promptFile": "post-find-leads-message-scout.md",
|
|
199
|
-
"displayName": "Message
|
|
200
|
-
"target": "generate-messages
|
|
199
|
+
"displayName": "Message Drafting",
|
|
200
|
+
"target": "generate-messages",
|
|
201
201
|
"inputs": [
|
|
202
202
|
"campaignId",
|
|
203
203
|
"campaignBrief",
|
|
@@ -212,20 +212,20 @@
|
|
|
212
212
|
"rendered sample"
|
|
213
213
|
],
|
|
214
214
|
"optionalProducesArtifacts": [],
|
|
215
|
-
"ownership": "proof inventory, token
|
|
215
|
+
"ownership": "message strategy, proof inventory, token rules, skeptical-prospect review, and selected winner only",
|
|
216
216
|
"codex": {
|
|
217
|
-
"description": "Message
|
|
217
|
+
"description": "Message Drafting worker for campaign-backed template proposals after confirm_lead_list imports a non-empty bounded review batch.",
|
|
218
218
|
"model": "gpt-5.5",
|
|
219
|
-
"modelReasoningEffort": "
|
|
219
|
+
"modelReasoningEffort": "xhigh",
|
|
220
220
|
"sandboxMode": "read-only",
|
|
221
221
|
"nicknameCandidates": [
|
|
222
|
-
"Message
|
|
223
|
-
"Draft
|
|
222
|
+
"Message Drafting",
|
|
223
|
+
"Draft Writer",
|
|
224
224
|
"Template Builder"
|
|
225
225
|
]
|
|
226
226
|
},
|
|
227
227
|
"claude": {
|
|
228
|
-
"description": "Use proactively as Message
|
|
228
|
+
"description": "Use proactively as Message Drafting after confirm_lead_list imports a non-empty bounded review batch; load generate-messages and draft only from scoped campaign/tool state.",
|
|
229
229
|
"model": "inherit",
|
|
230
230
|
"background": true,
|
|
231
231
|
"maxTurns": 10,
|
|
@@ -45,8 +45,8 @@ sales Claude`; do not treat broad anchor-only lanes like `Claude Code`, `MCP`,
|
|
|
45
45
|
campaignOfferId, selectionMode: "replace", selections, headlineICPCriteria,
|
|
46
46
|
scrapePlanMode: "all-selected", currentStep: "signal-discovery" })` before sampling so the watched Signal
|
|
47
47
|
Discovery table shows the promoted posts and the exact posts being tested.
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
|
|
49
|
+
visible transition after Start Import approval.
|
|
50
50
|
6. Fetch or sample engagers for promoted posts and score rough ICP fit from
|
|
51
51
|
visible headline/display-name cues only. Do not enrich people during
|
|
52
52
|
viability estimation.
|
|
@@ -12,8 +12,8 @@ campaignOfferId, confirmed: true })` and include that same `campaignOfferId`
|
|
|
12
12
|
If no campaign ID is supplied, run campaignless preview mode. Treat post-mint
|
|
13
13
|
searches with `campaignOfferId` as campaign-attached persisted search tabs;
|
|
14
14
|
do not run a live campaign search without the campaign ID.
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
|
|
16
|
+
visible transition after Start Import approval.
|
|
17
17
|
|
|
18
18
|
Use the inherited Sellable MCP tools when available:
|
|
19
19
|
|
|
@@ -57,7 +57,7 @@ Evidence standards:
|
|
|
57
57
|
below 10% after reasonable refinement, recommend tightening the ICP/source
|
|
58
58
|
direction rather than switching providers again.
|
|
59
59
|
- Never recommend "import 25 leads" as the Prospeo source action. Recommend
|
|
60
|
-
|
|
60
|
+
Start Import for the approved source list; the parent thread later
|
|
61
61
|
copies the confirmed source rows into the campaign and internally uses the
|
|
62
62
|
first campaign-table execution slice for filter and message setup.
|
|
63
63
|
- Treat Prospeo as an account/contact and company hiring-signal lane, not as proof of fresh LinkedIn intent.
|
|
@@ -12,8 +12,8 @@ campaignOfferId, confirmed: true })` and include that same `campaignOfferId` in
|
|
|
12
12
|
route. If no campaign ID is supplied, run campaignless preview mode. Treat post-mint
|
|
13
13
|
searches with `campaignOfferId` as campaign-attached persisted search tabs;
|
|
14
14
|
do not run a live campaign search without the campaign ID.
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
|
|
16
|
+
visible transition after Start Import approval.
|
|
17
17
|
|
|
18
18
|
Use the inherited Sellable MCP tools when available:
|
|
19
19
|
|
|
@@ -81,7 +81,7 @@ Evidence standards:
|
|
|
81
81
|
- If projected good-fit after cleanup is below 10%, do not recommend Sales Nav
|
|
82
82
|
as the winning source; recommend Prospeo as the next provider.
|
|
83
83
|
- Never recommend "import 25 leads" as the Sales Nav source action. Recommend
|
|
84
|
-
|
|
84
|
+
Start Import for the approved source list; the parent thread later
|
|
85
85
|
copies the confirmed source rows into the campaign and internally uses the
|
|
86
86
|
first campaign-table execution slice for filter and message setup.
|
|
87
87
|
- Do not hand-wave missing filter IDs.
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -772,7 +772,7 @@ are likely. Sales Nav is useful for recent LinkedIn activity, role/title
|
|
|
772
772
|
precision, and referral paths, but it does not provide hiring-by-role filters;
|
|
773
773
|
say that distinction plainly in the source-plan gate.
|
|
774
774
|
|
|
775
|
-
After scouting, ask for a second approval on
|
|
775
|
+
After scouting, ask for a second approval on Start Import. For
|
|
776
776
|
LinkedIn engagement (\`signal-discovery\` internally), use plain language:
|
|
777
777
|
selected posts, people we can check, likely prospects, what the first
|
|
778
778
|
review will inspect, cleanup risk, and fallback. N must be the smallest
|
|
@@ -922,15 +922,15 @@ Treat host capabilities as concrete functions, not prose conventions:
|
|
|
922
922
|
\`mcp__sellable__get_source_scout_registry({})\` before any scout dispatch.
|
|
923
923
|
- \`load_post_find_leads_scout_registry\`: call
|
|
924
924
|
\`mcp__sellable__get_post_find_leads_scout_registry({})\` after source
|
|
925
|
-
|
|
925
|
+
import and before dispatching Prospect Filters/Message Drafting.
|
|
926
926
|
- \`launch_source_scout\`: Claude Code uses \`Task\` with \`subagent_type\` equal to
|
|
927
927
|
the registry \`name\` only when the session lists those agents; Codex uses
|
|
928
928
|
named custom agents such as
|
|
929
929
|
\`source-scout-linkedin-engagement\`, \`source-scout-sales-nav\`, and
|
|
930
930
|
\`source-scout-prospeo-contact\` when subagents are available.
|
|
931
931
|
- \`launch_post_find_leads_scout\`: Claude Code uses \`Task\` with
|
|
932
|
-
\`subagent_type\` equal to the returned
|
|
933
|
-
the session lists those agents; Codex uses the returned
|
|
932
|
+
\`subagent_type\` equal to the returned prospect-setup registry \`name\` only when
|
|
933
|
+
the session lists those agents; Codex uses the returned compatibility agents such as
|
|
934
934
|
\`post-find-leads-filter-scout\` and \`post-find-leads-message-scout\` when
|
|
935
935
|
subagents are available.
|
|
936
936
|
|
|
@@ -1108,10 +1108,22 @@ updates.
|
|
|
1108
1108
|
copies of this file; packaged Claude Code and Codex runs must use the MCP
|
|
1109
1109
|
asset loader so they share the same config.
|
|
1110
1110
|
3. Follow that prompt and workflow config exactly.
|
|
1111
|
-
4. For message generation,
|
|
1112
|
-
|
|
1111
|
+
4. For message generation, keep the parent thread as a lean orchestrator and
|
|
1112
|
+
use the \`post-find-leads-message-scout\` agent whenever the host exposes it
|
|
1113
|
+
and the current host policy allows agent launch. The worker must load
|
|
1113
1114
|
\`mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages" })\`.
|
|
1114
|
-
|
|
1115
|
+
In Codex, YOLO/autonomous mode counts as campaign-scoped permission to use
|
|
1116
|
+
Sellable background agents for pre-launch work. If the user has not enabled
|
|
1117
|
+
YOLO and has not explicitly asked for background agents, subagents, parallel
|
|
1118
|
+
agents, delegation, or a message/bg agent in this campaign, ask once for
|
|
1119
|
+
permission before loading the long message prompt in the parent. If
|
|
1120
|
+
permission is granted but the named custom agent is not
|
|
1121
|
+
available, spawn a generic background agent with \`model: "gpt-5.5"\` and
|
|
1122
|
+
\`reasoning_effort: "xhigh"\` using the same campaign/table basis. Do not
|
|
1123
|
+
silently fall back to parent-thread message drafting; parent fallback is
|
|
1124
|
+
allowed only when the user explicitly says to continue without a background
|
|
1125
|
+
agent.
|
|
1126
|
+
Do not use any alternate or examples-only message prompt. Message review requires Message Drafting output:
|
|
1115
1127
|
do not draft from a checklist, local markdown artifact, or parent-thread
|
|
1116
1128
|
intuition. Use campaign state, campaign brief content, selected source state,
|
|
1117
1129
|
and initial campaign-table execution slice rows as the source of truth; do not read stale
|
|
@@ -1120,10 +1132,10 @@ updates.
|
|
|
1120
1132
|
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
1121
1133
|
watch link and see useful setup state immediately. Materialize the approved
|
|
1122
1134
|
source list, copy confirmed rows into the campaign, and internally process the
|
|
1123
|
-
|
|
1124
|
-
load
|
|
1125
|
-
Once the user answers, launch
|
|
1126
|
-
basis. If filters are approved, also launch
|
|
1135
|
+
first campaign-table execution slice after the source is attached to the campaign; do not
|
|
1136
|
+
load prospect-setup registries/prompts before asking add filters vs skip filters.
|
|
1137
|
+
Once the user answers, launch Message Drafting from the same campaign/table
|
|
1138
|
+
basis. If filters are approved, also launch Prospect Filters. Do not queue
|
|
1127
1139
|
workflow cells, attach a sequence, or start until saved filters and the
|
|
1128
1140
|
message template/token rules are approved. When filters are chosen, immediately
|
|
1129
1141
|
call \`mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })\`
|
|
@@ -1244,8 +1256,8 @@ Desktop, then start a new thread.
|
|
|
1244
1256
|
2. When the canonical prompt asks for \`references/*.md\`, load those files
|
|
1245
1257
|
with \`mcp__sellable__get_subskill_asset({ subskillName: "interview", assetPath: "references/<file>.md" })\`.
|
|
1246
1258
|
3. Follow the canonical prompt exactly. Save local memory only where that prompt
|
|
1247
|
-
directs, under
|
|
1248
|
-
|
|
1259
|
+
directs, under \`.sellable/configs/core/**\` and
|
|
1260
|
+
\`.sellable/interviews/**\`.
|
|
1249
1261
|
|
|
1250
1262
|
## MCP Prompt Fallback
|
|
1251
1263
|
|
|
@@ -1291,7 +1303,7 @@ Desktop, then start a new thread.
|
|
|
1291
1303
|
If the response has \`hasMore=true\`, continue with \`nextOffset\` until
|
|
1292
1304
|
\`hasMore=false\`.
|
|
1293
1305
|
2. Follow the canonical prompt exactly. Read the relevant
|
|
1294
|
-
|
|
1306
|
+
\`.sellable/configs/**\` memory files it names.
|
|
1295
1307
|
3. Apply the loaded memory silently to the user's requested writing or answer.
|
|
1296
1308
|
If the user only asked to load voice, summarize the active rules briefly and
|
|
1297
1309
|
ask what they want drafted, answered, or reviewed.
|
|
@@ -2044,7 +2056,7 @@ function patchClaudeAlwaysLoad(opts) {
|
|
|
2044
2056
|
}
|
|
2045
2057
|
|
|
2046
2058
|
function installCodex(opts) {
|
|
2047
|
-
if (!
|
|
2059
|
+
if (!commandExists("codex")) {
|
|
2048
2060
|
const message =
|
|
2049
2061
|
"Codex CLI not found. Install/login to Codex, then rerun: sellable --host codex";
|
|
2050
2062
|
if (opts.host === "all") {
|
|
@@ -2053,9 +2065,6 @@ function installCodex(opts) {
|
|
|
2053
2065
|
}
|
|
2054
2066
|
throw new Error(message);
|
|
2055
2067
|
}
|
|
2056
|
-
if (!opts.dryRun) {
|
|
2057
|
-
mkdirSync(codexHome(), { recursive: true, mode: 0o700 });
|
|
2058
|
-
}
|
|
2059
2068
|
if (opts.server === "hosted") {
|
|
2060
2069
|
run("codex", codexMcpAddArgs(opts), opts);
|
|
2061
2070
|
const info = installCodexDesktopPlugin(opts);
|
|
@@ -2622,13 +2631,6 @@ async function main() {
|
|
|
2622
2631
|
process.exit(2);
|
|
2623
2632
|
}
|
|
2624
2633
|
const token = rawArgs[2];
|
|
2625
|
-
const authSetFlags = rawArgs.slice(3);
|
|
2626
|
-
const dryRun = authSetFlags.includes("--dry-run");
|
|
2627
|
-
const unknownAuthSetFlag = authSetFlags.find((arg) => arg !== "--dry-run");
|
|
2628
|
-
if (unknownAuthSetFlag) {
|
|
2629
|
-
console.error(`Unknown auth set option: ${unknownAuthSetFlag}`);
|
|
2630
|
-
process.exit(2);
|
|
2631
|
-
}
|
|
2632
2634
|
if (!token) {
|
|
2633
2635
|
console.error(
|
|
2634
2636
|
"Usage: sellable auth set <token>\n" +
|
|
@@ -2653,13 +2655,9 @@ async function main() {
|
|
|
2653
2655
|
writeJson(
|
|
2654
2656
|
authPath(),
|
|
2655
2657
|
{ token, activeWorkspaceId: null, apiUrl },
|
|
2656
|
-
{ dryRun }
|
|
2658
|
+
{ dryRun: false }
|
|
2657
2659
|
);
|
|
2658
|
-
|
|
2659
|
-
console.log(`Dry run: token would be saved to ${authPath()}`);
|
|
2660
|
-
} else {
|
|
2661
|
-
console.log(`✓ Token saved to ${authPath()}`);
|
|
2662
|
-
}
|
|
2660
|
+
console.log(`✓ Token saved to ${authPath()}`);
|
|
2663
2661
|
console.log(` apiUrl: ${apiUrl}`);
|
|
2664
2662
|
console.log(` Continue in your agent:`);
|
|
2665
2663
|
console.log(` Claude Code: /sellable:create-campaign`);
|
package/package.json
CHANGED
|
@@ -203,7 +203,7 @@ are likely. Sales Nav is useful for recent LinkedIn activity, role/title
|
|
|
203
203
|
precision, and referral paths, but it does not provide hiring-by-role filters;
|
|
204
204
|
say that distinction plainly in the source-plan gate.
|
|
205
205
|
|
|
206
|
-
After scouting, ask for a second approval on
|
|
206
|
+
After scouting, ask for a second approval on Start Import. For
|
|
207
207
|
LinkedIn engagement (`signal-discovery` internally), name how many
|
|
208
208
|
recommended posts will be scraped and the target engager/source-candidate
|
|
209
209
|
volume. N must be the smallest right-content post set that clears the source
|
|
@@ -253,20 +253,29 @@ scout those angles as independent branches when the host can actually do it:
|
|
|
253
253
|
LinkedIn posts / people reacting or commenting (internal `signal-discovery`
|
|
254
254
|
provider prompt), Sales Nav / title + company filters, and Prospeo Contact /
|
|
255
255
|
domains, hiring filters, or broad verified-contact expansion when relevant. In
|
|
256
|
-
Codex,
|
|
256
|
+
Codex, source discovery is agent-first after the Find Buyers Plan approval. For
|
|
257
|
+
the approved single source lane, explicitly spawn that returned named custom
|
|
258
|
+
scout; for example, choosing LinkedIn posts should spawn
|
|
259
|
+
`source-scout-linkedin-engagement` even when no comparison is needed. When
|
|
260
|
+
multiple source angles are credible, explicitly spawn the named custom scouts
|
|
257
261
|
`source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
258
262
|
`source-scout-prospeo-contact` for the credible lanes only when the current host
|
|
259
|
-
exposes those names; Codex does not infer subagent fan-out from generic
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
263
|
+
exposes those names; Codex does not infer subagent fan-out from generic wording.
|
|
264
|
+
YOLO/autonomous mode counts as campaign-scoped permission to use Sellable source
|
|
265
|
+
background agents. In Claude Code, invoke the generated `source-scout-*`
|
|
266
|
+
Task/Agent subagent for the approved lane, or all credible lanes in one
|
|
267
|
+
assistant message when comparison/fallback is needed, only when the current
|
|
268
|
+
session lists those names. The installer writes them from the same canonical
|
|
269
|
+
Sellable agent registry with explicit Sellable MCP tool allowlists.
|
|
264
270
|
The create-campaign-v2 subskill calls `get_source_scout_registry` before
|
|
265
271
|
dispatch so the current registry, not this copy, is the runtime source of truth.
|
|
266
|
-
If the
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
272
|
+
If the named source scout is unavailable, use a generic `gpt-5.5` high
|
|
273
|
+
background agent when the host can spawn generic agents. Continue source
|
|
274
|
+
discovery in the parent thread only when agent launch is impossible or the user
|
|
275
|
+
explicitly says to continue inline. Do not claim a scout ran unless one did, and
|
|
276
|
+
do not surface install status to the customer. In chat, call the downstream copy
|
|
277
|
+
stage `message generation`; message validation is only an internal approval
|
|
278
|
+
proof.
|
|
270
279
|
|
|
271
280
|
For campaign-attached Signal Discovery sampling, promote/select the exact posts
|
|
272
281
|
with `select_promising_posts` before `fetch_post_engagers` so the user can see
|
|
@@ -281,17 +290,17 @@ actually engaging and the source is viable.
|
|
|
281
290
|
|
|
282
291
|
After confirmed source rows exist in the campaign table, use the same registry pattern for
|
|
283
292
|
|
|
284
|
-
|
|
293
|
+
prospect setup work, but do not load that registry or any deep filter/message prompt
|
|
285
294
|
before the filter-choice question. After `confirm_lead_list`, ask add filters
|
|
286
|
-
vs skip filters immediately. Once the user answers, launch
|
|
295
|
+
vs skip filters immediately. Once the user answers, launch Message Drafting
|
|
287
296
|
from the same campaign/table basis. If the user chooses filters, also launch the
|
|
288
|
-
|
|
297
|
+
Prospect Filters worker, move to Filter Rules, save rubrics, then ask for filter
|
|
289
298
|
approval. After approval, move to Filter Leads and show `Filters saved + waiting
|
|
290
299
|
for message approval` while the message recommendation is reviewed. If the user
|
|
291
300
|
skips filters, move to Messages/message review. Enrichment/filtering and
|
|
292
301
|
Generate Message cells wait for message approval. AI Generated is an explicit
|
|
293
302
|
opt-out from the template path. If the
|
|
294
|
-
|
|
303
|
+
prospect setup agents are absent, the main thread still orchestrates the same
|
|
295
304
|
branches from compact MCP context.
|
|
296
305
|
|
|
297
306
|
Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
|
|
@@ -427,15 +436,15 @@ Treat host capabilities as concrete functions, not prose conventions:
|
|
|
427
436
|
`mcp__sellable__get_source_scout_registry({})` before any scout dispatch.
|
|
428
437
|
- `load_post_find_leads_scout_registry`: call
|
|
429
438
|
`mcp__sellable__get_post_find_leads_scout_registry({})` after source
|
|
430
|
-
|
|
439
|
+
import and before dispatching Prospect Filters/Message Drafting.
|
|
431
440
|
- `launch_source_scout`: Claude Code uses `Task` with `subagent_type` equal to
|
|
432
441
|
the registry `name` only when the session lists those agents; Codex uses
|
|
433
442
|
named custom agents such as
|
|
434
443
|
`source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
435
444
|
`source-scout-prospeo-contact` when subagents are available.
|
|
436
445
|
- `launch_post_find_leads_scout`: Claude Code uses `Task` with `subagent_type`
|
|
437
|
-
equal to the returned
|
|
438
|
-
those agents; Codex uses the returned
|
|
446
|
+
equal to the returned prospect-setup registry `name` only when the session
|
|
447
|
+
lists those agents; Codex uses the returned compatibility agents such as
|
|
439
448
|
`post-find-leads-filter-scout` and `post-find-leads-message-scout` when
|
|
440
449
|
subagents are available.
|
|
441
450
|
|
|
@@ -758,10 +767,23 @@ updates.
|
|
|
758
767
|
copies of this file; packaged Claude Code and Codex runs must use the MCP
|
|
759
768
|
asset loader so they share the same config.
|
|
760
769
|
3. Follow that prompt and workflow config exactly.
|
|
761
|
-
4. For message generation,
|
|
762
|
-
|
|
770
|
+
4. For message generation, keep the parent thread as a lean orchestrator and
|
|
771
|
+
use the `post-find-leads-message-scout` compatibility agent for Message
|
|
772
|
+
Drafting whenever the host exposes it
|
|
773
|
+
and the current host policy allows agent launch. The worker must load
|
|
763
774
|
`mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages" })`.
|
|
764
|
-
|
|
775
|
+
In Codex, YOLO/autonomous mode counts as campaign-scoped permission to use
|
|
776
|
+
Sellable background agents for pre-launch work. If the user has not enabled
|
|
777
|
+
YOLO and has not explicitly asked for background agents, subagents, parallel
|
|
778
|
+
agents, delegation, or a message/bg agent in this campaign, ask once for
|
|
779
|
+
permission before loading the long message prompt in the parent. If
|
|
780
|
+
permission is granted but the named custom agent is not
|
|
781
|
+
available, spawn a generic background agent with `model: "gpt-5.5"` and
|
|
782
|
+
`reasoning_effort: "xhigh"` using the same campaign/table basis. Do not
|
|
783
|
+
silently fall back to parent-thread message drafting; parent fallback is
|
|
784
|
+
allowed only when the user explicitly says to continue without a background
|
|
785
|
+
agent.
|
|
786
|
+
Do not use any alternate or examples-only message prompt. Message review requires Message Drafting output:
|
|
765
787
|
do not draft from a checklist, local markdown artifact, or parent-thread
|
|
766
788
|
intuition. Use campaign state, campaign brief content, selected source state, and
|
|
767
789
|
initial campaign-table execution slice rows as the source of truth; do not read stale local
|