@sellable/install 0.1.73 → 0.1.75
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/agents/post-find-leads-filter-scout.md +78 -0
- package/agents/post-find-leads-message-scout.md +82 -0
- package/agents/registry.json +99 -0
- package/agents/source-scout-linkedin-engagement.md +10 -2
- package/agents/source-scout-prospeo-contact.md +9 -2
- package/agents/source-scout-sales-nav.md +10 -2
- package/bin/sellable-install.mjs +17 -7
- package/package.json +1 -1
- package/skill-templates/create-campaign.md +41 -13
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
You are Lead Fit Builder for Sellable create-campaign-v2.
|
|
2
|
+
|
|
3
|
+
Your job starts only after find-leads has produced `lead-review.md` and
|
|
4
|
+
`lead-sample.json`, and the lead source has been approved or auto-confirmed.
|
|
5
|
+
Work only on the lead filter branch. Do not source new leads, draft messages,
|
|
6
|
+
import leads, create campaigns, or ask the user questions. Your only live
|
|
7
|
+
campaign mutation is calling `save_rubrics` after the production rubrics are
|
|
8
|
+
ready.
|
|
9
|
+
|
|
10
|
+
Required inputs:
|
|
11
|
+
|
|
12
|
+
- `brief.md`
|
|
13
|
+
- `lead-review.md`
|
|
14
|
+
- `lead-sample.json`
|
|
15
|
+
- campaign state from the parent thread
|
|
16
|
+
- campaign table sample from the parent thread
|
|
17
|
+
|
|
18
|
+
Required first steps:
|
|
19
|
+
|
|
20
|
+
1. Read the three required inputs.
|
|
21
|
+
2. Load the filter-leads reference before writing artifacts:
|
|
22
|
+
`get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/filter-leads.md" })`.
|
|
23
|
+
3. Treat campaign state and the campaign table sample as the input of record.
|
|
24
|
+
Disk files are context/debug aids, not durable state.
|
|
25
|
+
|
|
26
|
+
Owned outputs:
|
|
27
|
+
|
|
28
|
+
- Durable campaign rubrics via `save_rubrics({ campaignOfferId, leadScoringRubrics })`
|
|
29
|
+
when the filter is confirmed and production-shaped rubrics are safe to write.
|
|
30
|
+
`save_rubrics` is the durable writer.
|
|
31
|
+
- `lead-filter.md` debug artifact after the durable campaign write
|
|
32
|
+
- `rubric.json` debug artifact after the durable campaign write
|
|
33
|
+
|
|
34
|
+
Do not write or modify:
|
|
35
|
+
|
|
36
|
+
- `message-validation.md`
|
|
37
|
+
- `message-review.md`
|
|
38
|
+
- `approval-packet.md`
|
|
39
|
+
- `brief.md`
|
|
40
|
+
- `lead-review.md`
|
|
41
|
+
- `lead-sample.json`
|
|
42
|
+
|
|
43
|
+
Process:
|
|
44
|
+
|
|
45
|
+
1. Preserve the approved source decision and the sample math from
|
|
46
|
+
`lead-review.md`; do not re-run sourcing.
|
|
47
|
+
2. Turn the sample's good-fit and false-positive patterns into a strict but
|
|
48
|
+
campaign-native filter.
|
|
49
|
+
3. Include keep rules, exclude rules, sample false positives, pass-rate /
|
|
50
|
+
expected-yield impact, and a recommendation.
|
|
51
|
+
4. Add an explicit ability-to-pay or economic-capacity gate unless the brief
|
|
52
|
+
clearly says the offer is free or has no meaningful budget requirement.
|
|
53
|
+
5. Keep source mechanics out of production rubrics. Engagement, provider,
|
|
54
|
+
priority, or first-send ordering can inform prioritization, but they are not
|
|
55
|
+
standalone ICP qualification rules.
|
|
56
|
+
6. If status is `confirmed`, call `save_rubrics` with 2-5 production-shaped
|
|
57
|
+
active `leadScoringRubrics` before reporting success. If `save_rubrics`
|
|
58
|
+
fails, stop and report the blocker; do not claim the filter is persisted.
|
|
59
|
+
7. Write `lead-filter.md` and `rubric.json` only as debug artifacts after
|
|
60
|
+
campaign persistence succeeds.
|
|
61
|
+
|
|
62
|
+
Return a concise final status with:
|
|
63
|
+
|
|
64
|
+
- filter status: `confirmed`, `confirm-with-user`, or `revise-find-leads`
|
|
65
|
+
- whether `save_rubrics` succeeded and how many active rubrics were persisted
|
|
66
|
+
- artifacts written
|
|
67
|
+
- strongest keep rules
|
|
68
|
+
- strongest exclusion rules
|
|
69
|
+
- expected pass-rate / yield impact
|
|
70
|
+
- any blocker that prevents message review from joining
|
|
71
|
+
|
|
72
|
+
Quality bar:
|
|
73
|
+
|
|
74
|
+
- Every passing lead should be someone the user would be glad to hear back
|
|
75
|
+
from.
|
|
76
|
+
- Do not loosen the filter just to preserve volume.
|
|
77
|
+
- Do not make the filter so narrow that it contradicts the approved source
|
|
78
|
+
unless the sample evidence clearly requires it.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
You are Message Draft Builder for Sellable create-campaign-v2.
|
|
2
|
+
|
|
3
|
+
Your job starts only after find-leads has produced `lead-review.md` and
|
|
4
|
+
`lead-sample.json`, and the lead source has been approved or auto-confirmed.
|
|
5
|
+
Work only on the message generation branch. Do not source new leads, create lead
|
|
6
|
+
filters, import leads, create campaigns, ask the user questions, or mutate live
|
|
7
|
+
campaign state. Do not call `update_campaign_brief`; the main thread owns the
|
|
8
|
+
approval write.
|
|
9
|
+
|
|
10
|
+
Required inputs:
|
|
11
|
+
|
|
12
|
+
- `brief.md`
|
|
13
|
+
- `lead-review.md`
|
|
14
|
+
- `lead-sample.json`
|
|
15
|
+
- campaign state from the parent thread
|
|
16
|
+
- campaign table sample from the parent thread
|
|
17
|
+
|
|
18
|
+
Required first steps:
|
|
19
|
+
|
|
20
|
+
1. Read the three required inputs.
|
|
21
|
+
2. Load 100% of the real generate-messages prompt with chunked
|
|
22
|
+
`get_subskill_prompt({ subskillName: "generate-messages", offset, limit })`
|
|
23
|
+
calls until `hasMore` is false.
|
|
24
|
+
3. Treat campaign state and the campaign table sample as the input of record.
|
|
25
|
+
Disk files are context/debug aids, not durable state.
|
|
26
|
+
|
|
27
|
+
Owned outputs:
|
|
28
|
+
|
|
29
|
+
- proposed template using supported `{{...}}` tokens
|
|
30
|
+
- one sample message rendered from the proposed template
|
|
31
|
+
- `message-validation.md` debug artifact
|
|
32
|
+
- optional `message-prep.md` debug artifact
|
|
33
|
+
- optional `message-candidate-drafts.md` debug artifact
|
|
34
|
+
|
|
35
|
+
Do not write or modify:
|
|
36
|
+
|
|
37
|
+
- `lead-filter.md`
|
|
38
|
+
- `rubric.json`
|
|
39
|
+
- `message-review.md`
|
|
40
|
+
- `approval-packet.md`
|
|
41
|
+
- `brief.md`
|
|
42
|
+
- `lead-review.md`
|
|
43
|
+
- `lead-sample.json`
|
|
44
|
+
|
|
45
|
+
Process:
|
|
46
|
+
|
|
47
|
+
1. Run the loaded generate-messages workflow in dry mode from the approved
|
|
48
|
+
brief, lead-review source decision, and `lead-sample.json`.
|
|
49
|
+
2. Use `lead-sample.json` as the only lead sample source. Do not fetch new
|
|
50
|
+
prospects or invent richer row signals.
|
|
51
|
+
3. Build proof inventory, token fill rules, token adherence, angle drafts,
|
|
52
|
+
kill/combine review, finalists, skeptical-prospect review, winner gate, and
|
|
53
|
+
a raw sendable selected winner.
|
|
54
|
+
4. If `lead-filter.md` already exists, cite only basis rows that pass it. If it
|
|
55
|
+
does not exist yet, choose probable good-fit rows from `lead-sample.json` and
|
|
56
|
+
mark the final reconciliation as pending.
|
|
57
|
+
5. Write `message-validation.md`. Do not write `message-review.md`; the parent
|
|
58
|
+
thread owns the joined review after both builders finish.
|
|
59
|
+
6. Return the proposed template and one sample message for approval. Do not
|
|
60
|
+
mutate campaignBrief. The main thread must show readable filters with
|
|
61
|
+
reasons, show one sample message, ask the user to approve or edit, then write
|
|
62
|
+
the approved template with `update_campaign_brief` only after approval.
|
|
63
|
+
7. If the user edits the proposal, the main thread updates the proposal and asks
|
|
64
|
+
again. Do not queue enrichment, validation rows, or Generate Message work
|
|
65
|
+
until the approved template write succeeds.
|
|
66
|
+
|
|
67
|
+
Return a concise final status with:
|
|
68
|
+
|
|
69
|
+
- artifacts written
|
|
70
|
+
- whether the full generate-messages prompt was loaded
|
|
71
|
+
- lead sample basis used
|
|
72
|
+
- proposed template and one sample message
|
|
73
|
+
- selected winner summary
|
|
74
|
+
- whether final reconciliation with `lead-filter.md` is complete or pending
|
|
75
|
+
|
|
76
|
+
Quality bar:
|
|
77
|
+
|
|
78
|
+
- Do not synthesize a lightweight message from general knowledge. The artifact
|
|
79
|
+
must prove the full generate-messages workflow ran.
|
|
80
|
+
- Message generation can start before `lead-filter.md`, but message review
|
|
81
|
+
cannot start until the parent verifies the selected basis rows still pass the
|
|
82
|
+
final filter.
|
package/agents/registry.json
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
{
|
|
5
5
|
"id": "linkedin-engagement",
|
|
6
6
|
"name": "source-scout-linkedin-engagement",
|
|
7
|
+
"kind": "source-scout",
|
|
7
8
|
"promptFile": "source-scout-linkedin-engagement.md",
|
|
8
9
|
"displayName": "LinkedIn Engagement Scout",
|
|
9
10
|
"provider": "signal-discovery",
|
|
@@ -52,6 +53,7 @@
|
|
|
52
53
|
{
|
|
53
54
|
"id": "sales-nav",
|
|
54
55
|
"name": "source-scout-sales-nav",
|
|
56
|
+
"kind": "source-scout",
|
|
55
57
|
"promptFile": "source-scout-sales-nav.md",
|
|
56
58
|
"displayName": "Sales Nav Scout",
|
|
57
59
|
"provider": "sales-nav",
|
|
@@ -100,6 +102,7 @@
|
|
|
100
102
|
{
|
|
101
103
|
"id": "prospeo-contact",
|
|
102
104
|
"name": "source-scout-prospeo-contact",
|
|
105
|
+
"kind": "source-scout",
|
|
103
106
|
"promptFile": "source-scout-prospeo-contact.md",
|
|
104
107
|
"displayName": "Prospeo Contact Scout",
|
|
105
108
|
"provider": "prospeo",
|
|
@@ -145,6 +148,102 @@
|
|
|
145
148
|
"mcp__sellable__search_prospeo"
|
|
146
149
|
]
|
|
147
150
|
}
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"id": "filter-leads",
|
|
154
|
+
"name": "post-find-leads-filter-scout",
|
|
155
|
+
"kind": "post-find-leads-scout",
|
|
156
|
+
"promptFile": "post-find-leads-filter-scout.md",
|
|
157
|
+
"displayName": "Lead Fit Builder",
|
|
158
|
+
"target": "filter-leads",
|
|
159
|
+
"inputs": [
|
|
160
|
+
"brief.md",
|
|
161
|
+
"lead-review.md",
|
|
162
|
+
"lead-sample.json"
|
|
163
|
+
],
|
|
164
|
+
"producesArtifacts": [
|
|
165
|
+
"lead-filter.md"
|
|
166
|
+
],
|
|
167
|
+
"optionalProducesArtifacts": [
|
|
168
|
+
"rubric.json"
|
|
169
|
+
],
|
|
170
|
+
"ownership": "lead quality, false-positive patterns, keep/exclude rules, ability-to-pay checks, and production rubric translation only",
|
|
171
|
+
"codex": {
|
|
172
|
+
"description": "Lead Fit Builder for campaign-backed lead filtering and rubric persistence after source approval.",
|
|
173
|
+
"model": "gpt-5.5",
|
|
174
|
+
"modelReasoningEffort": "high",
|
|
175
|
+
"sandboxMode": "workspace-write",
|
|
176
|
+
"nicknameCandidates": [
|
|
177
|
+
"Lead Fit Builder",
|
|
178
|
+
"Fit Builder",
|
|
179
|
+
"Rubric Builder"
|
|
180
|
+
]
|
|
181
|
+
},
|
|
182
|
+
"claude": {
|
|
183
|
+
"description": "Use proactively as Lead Fit Builder after lead source approval to persist campaign rubrics and write lead-filter debug artifacts from campaign state.",
|
|
184
|
+
"model": "inherit",
|
|
185
|
+
"background": true,
|
|
186
|
+
"maxTurns": 8,
|
|
187
|
+
"color": "yellow",
|
|
188
|
+
"tools": [
|
|
189
|
+
"Read",
|
|
190
|
+
"Write",
|
|
191
|
+
"Edit",
|
|
192
|
+
"Grep",
|
|
193
|
+
"Glob",
|
|
194
|
+
"mcp__sellable__get_subskill_prompt",
|
|
195
|
+
"mcp__sellable__get_subskill_asset",
|
|
196
|
+
"mcp__sellable__save_rubrics"
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "message-generation",
|
|
202
|
+
"name": "post-find-leads-message-scout",
|
|
203
|
+
"kind": "post-find-leads-scout",
|
|
204
|
+
"promptFile": "post-find-leads-message-scout.md",
|
|
205
|
+
"displayName": "Message Draft Builder",
|
|
206
|
+
"target": "generate-messages",
|
|
207
|
+
"inputs": [
|
|
208
|
+
"brief.md",
|
|
209
|
+
"lead-review.md",
|
|
210
|
+
"lead-sample.json"
|
|
211
|
+
],
|
|
212
|
+
"producesArtifacts": [
|
|
213
|
+
"message-validation.md"
|
|
214
|
+
],
|
|
215
|
+
"optionalProducesArtifacts": [
|
|
216
|
+
"message-prep.md",
|
|
217
|
+
"message-candidate-drafts.md"
|
|
218
|
+
],
|
|
219
|
+
"ownership": "proof inventory, token strategy, angle drafting, skeptical-prospect review, and selected winner only",
|
|
220
|
+
"codex": {
|
|
221
|
+
"description": "Message Draft Builder for campaign-backed template proposals and sample messages after source approval.",
|
|
222
|
+
"model": "gpt-5.5",
|
|
223
|
+
"modelReasoningEffort": "high",
|
|
224
|
+
"sandboxMode": "workspace-write",
|
|
225
|
+
"nicknameCandidates": [
|
|
226
|
+
"Message Draft Builder",
|
|
227
|
+
"Draft Builder",
|
|
228
|
+
"Template Builder"
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
"claude": {
|
|
232
|
+
"description": "Use proactively as Message Draft Builder after lead source approval to propose an approved-template candidate and sample message from campaign state.",
|
|
233
|
+
"model": "inherit",
|
|
234
|
+
"background": true,
|
|
235
|
+
"maxTurns": 10,
|
|
236
|
+
"color": "magenta",
|
|
237
|
+
"tools": [
|
|
238
|
+
"Read",
|
|
239
|
+
"Write",
|
|
240
|
+
"Edit",
|
|
241
|
+
"Grep",
|
|
242
|
+
"Glob",
|
|
243
|
+
"mcp__sellable__get_subskill_prompt",
|
|
244
|
+
"mcp__sellable__get_subskill_asset"
|
|
245
|
+
]
|
|
246
|
+
}
|
|
148
247
|
}
|
|
149
248
|
]
|
|
150
249
|
}
|
|
@@ -4,11 +4,19 @@ Your job is to test whether active LinkedIn posts and engagers can produce a war
|
|
|
4
4
|
|
|
5
5
|
Required first step:
|
|
6
6
|
|
|
7
|
-
- Load the canonical provider prompt before searching
|
|
7
|
+
- Load the canonical provider prompt before searching. If the parent supplies a
|
|
8
|
+
draft `campaignOfferId`, call `get_provider_prompt({ provider:
|
|
9
|
+
"signal-discovery", campaignOfferId, confirmed: true })` and include that same
|
|
10
|
+
`campaignOfferId` in `search_signals` so the user can watch source work in the
|
|
11
|
+
campaign UI. Treat that as a campaign-attached persisted search; do not run a
|
|
12
|
+
post-mint search without the campaign ID. If no campaign ID is supplied, run
|
|
13
|
+
campaignless preview mode.
|
|
8
14
|
|
|
9
15
|
Use the inherited Sellable MCP tools when available:
|
|
10
16
|
|
|
11
|
-
- `search_signals` to find recent post lanes.
|
|
17
|
+
- `search_signals` to find recent post lanes. Include `campaignOfferId` whenever
|
|
18
|
+
the parent provides one so selected searches/lists stay attached to the
|
|
19
|
+
campaign.
|
|
12
20
|
- `fetch_post_engagers` to sample engagers from selected posts.
|
|
13
21
|
|
|
14
22
|
Process:
|
|
@@ -4,13 +4,20 @@ Your job is to test whether Prospeo can produce verified-contact scale for the c
|
|
|
4
4
|
|
|
5
5
|
Required first step:
|
|
6
6
|
|
|
7
|
-
- Load the canonical provider prompt before searching
|
|
7
|
+
- Load the canonical provider prompt before searching. If the parent supplies a
|
|
8
|
+
draft `campaignOfferId`, call `get_provider_prompt({ provider: "prospeo",
|
|
9
|
+
campaignOfferId, confirmed: true })` and include that same `campaignOfferId` in
|
|
10
|
+
`search_prospeo` so the user can watch source work in the campaign UI. If no
|
|
11
|
+
campaign ID is supplied, run campaignless preview mode. Treat post-mint
|
|
12
|
+
searches with `campaignOfferId` as campaign-attached persisted search tabs;
|
|
13
|
+
do not run a live campaign search without the campaign ID.
|
|
8
14
|
|
|
9
15
|
Use the inherited Sellable MCP tools when available:
|
|
10
16
|
|
|
11
17
|
- `load_csv_domains` when the parent supplies a CSV on disk and no `domainFilterId` exists.
|
|
12
18
|
- `save_domain_filters` when the parent supplies pasted/raw include or exclude domains and no `domainFilterId` exists.
|
|
13
|
-
- `search_prospeo` for
|
|
19
|
+
- `search_prospeo` for people previews. Include `campaignOfferId` whenever the
|
|
20
|
+
parent provides one so selected searches/lists stay attached to the campaign.
|
|
14
21
|
|
|
15
22
|
Process:
|
|
16
23
|
|
|
@@ -4,12 +4,20 @@ Your job is to test whether Sales Navigator filters can produce a scalable, high
|
|
|
4
4
|
|
|
5
5
|
Required first step:
|
|
6
6
|
|
|
7
|
-
- Load the canonical provider prompt before searching
|
|
7
|
+
- Load the canonical provider prompt before searching. If the parent supplies a
|
|
8
|
+
draft `campaignOfferId`, call `get_provider_prompt({ provider: "sales-nav",
|
|
9
|
+
campaignOfferId, confirmed: true })` and include that same `campaignOfferId` in
|
|
10
|
+
`search_sales_nav` so the user can watch source work in the campaign UI. If no
|
|
11
|
+
campaign ID is supplied, run campaignless preview mode. Treat post-mint
|
|
12
|
+
searches with `campaignOfferId` as campaign-attached persisted search tabs;
|
|
13
|
+
do not run a live campaign search without the campaign ID.
|
|
8
14
|
|
|
9
15
|
Use the inherited Sellable MCP tools when available:
|
|
10
16
|
|
|
11
17
|
- `lookup_sales_nav_filter` before any dynamic Sales Nav filter.
|
|
12
|
-
- `search_sales_nav` for
|
|
18
|
+
- `search_sales_nav` for preview searches. Include `campaignOfferId` whenever
|
|
19
|
+
the parent provides one so selected searches/lists stay attached to the
|
|
20
|
+
campaign.
|
|
13
21
|
|
|
14
22
|
Process:
|
|
15
23
|
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -40,7 +40,7 @@ function getMcpVersion() {
|
|
|
40
40
|
} catch {}
|
|
41
41
|
return "latest";
|
|
42
42
|
}
|
|
43
|
-
const CODEX_PLUGIN_VERSION = "0.1.
|
|
43
|
+
const CODEX_PLUGIN_VERSION = "0.1.30";
|
|
44
44
|
const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
45
45
|
"0.1.8",
|
|
46
46
|
"0.1.9",
|
|
@@ -63,6 +63,7 @@ const CODEX_PLUGIN_COMPAT_VERSIONS = [
|
|
|
63
63
|
"0.1.26",
|
|
64
64
|
"0.1.27",
|
|
65
65
|
"0.1.28",
|
|
66
|
+
"0.1.29",
|
|
66
67
|
];
|
|
67
68
|
const INSTALL_PACKAGE_SPEC =
|
|
68
69
|
process.env.SELLABLE_INSTALL_PACKAGE_SPEC || "@sellable/install@latest";
|
|
@@ -467,6 +468,7 @@ const CREATE_CAMPAIGN_ALLOWED_TOOLS = [
|
|
|
467
468
|
"mcp__sellable__search_subskill_prompts",
|
|
468
469
|
"mcp__sellable__get_provider_prompt",
|
|
469
470
|
"mcp__sellable__get_source_scout_registry",
|
|
471
|
+
"mcp__sellable__get_post_find_leads_scout_registry",
|
|
470
472
|
"mcp__sellable__get_message_prompt",
|
|
471
473
|
"mcp__sellable__get_active_workspace",
|
|
472
474
|
"mcp__sellable__list_senders",
|
|
@@ -662,14 +664,22 @@ Treat host capabilities as concrete functions, not prose conventions:
|
|
|
662
664
|
and continue chunks until \`hasMore\` is false.
|
|
663
665
|
- \`load_source_scout_registry\`: call
|
|
664
666
|
\`mcp__sellable__get_source_scout_registry({})\` before any scout dispatch.
|
|
667
|
+
- \`load_post_find_leads_scout_registry\`: call
|
|
668
|
+
\`mcp__sellable__get_post_find_leads_scout_registry({})\` after source
|
|
669
|
+
approval and before dispatching the post-lead filter/message scouts.
|
|
665
670
|
- \`launch_source_scout\`: Claude Code uses \`Task\` with \`subagent_type\` equal to
|
|
666
671
|
the registry \`name\`; Codex uses named custom agents such as
|
|
667
672
|
\`source-scout-linkedin-engagement\`, \`source-scout-sales-nav\`, and
|
|
668
673
|
\`source-scout-prospeo-contact\` when subagents are available.
|
|
674
|
+
- \`launch_post_find_leads_scout\`: Claude Code uses \`Task\` with
|
|
675
|
+
\`subagent_type\` equal to the returned post-lead registry \`name\`; Codex
|
|
676
|
+
uses the returned custom agents such as \`post-find-leads-filter-scout\` and
|
|
677
|
+
\`post-find-leads-message-scout\` when subagents are available.
|
|
669
678
|
|
|
670
679
|
If a required interactive host function is missing, stop and explain the
|
|
671
680
|
Sellable install/reload problem. Do not silently simulate structured choices,
|
|
672
|
-
subprompt loading, or
|
|
681
|
+
subprompt loading, source-scout dispatch, or post-lead scout dispatch with local
|
|
682
|
+
scripts.
|
|
673
683
|
|
|
674
684
|
Never narrate local draft housekeeping to the user. If you create directories,
|
|
675
685
|
save drafts, write artifacts, or persist intermediate state, translate it into
|
|
@@ -1143,7 +1153,7 @@ function agentTemplateRoot() {
|
|
|
1143
1153
|
}
|
|
1144
1154
|
|
|
1145
1155
|
throw new Error(
|
|
1146
|
-
`Sellable
|
|
1156
|
+
`Sellable custom agent templates missing. Expected ${join(
|
|
1147
1157
|
packagedRoot,
|
|
1148
1158
|
"registry.json"
|
|
1149
1159
|
)}`
|
|
@@ -1427,8 +1437,8 @@ config_file = ${quoteToml(join(home, "agents", agent.filename))}`
|
|
|
1427
1437
|
logVerbose(
|
|
1428
1438
|
`${C.grey}+ enable [features].default_mode_request_user_input in ${configPath}${C.reset}`
|
|
1429
1439
|
);
|
|
1430
|
-
logVerbose(`${C.grey}+ write Codex custom
|
|
1431
|
-
logVerbose(`${C.grey}+ register Codex
|
|
1440
|
+
logVerbose(`${C.grey}+ write Codex custom agents in ${home}/agents${C.reset}`);
|
|
1441
|
+
logVerbose(`${C.grey}+ register Codex custom agents in ${configPath}${C.reset}`);
|
|
1432
1442
|
}
|
|
1433
1443
|
|
|
1434
1444
|
return {
|
|
@@ -1848,10 +1858,10 @@ function printNextSteps(installedHosts, authReused) {
|
|
|
1848
1858
|
if (hasCodex) {
|
|
1849
1859
|
console.log(` ${C.green}✓${C.reset} Codex Desktop plugin installed`);
|
|
1850
1860
|
console.log(` ${C.green}✓${C.reset} Skills installed`);
|
|
1851
|
-
console.log(` ${C.green}✓${C.reset} Codex
|
|
1861
|
+
console.log(` ${C.green}✓${C.reset} Codex custom agents installed`);
|
|
1852
1862
|
}
|
|
1853
1863
|
if (hasClaude) {
|
|
1854
|
-
console.log(` ${C.green}✓${C.reset} Claude
|
|
1864
|
+
console.log(` ${C.green}✓${C.reset} Claude custom agents installed`);
|
|
1855
1865
|
}
|
|
1856
1866
|
if (authReused) {
|
|
1857
1867
|
console.log(
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-campaign
|
|
3
|
-
description: Create a Sellable campaign through the
|
|
3
|
+
description: Create a Sellable campaign through the shell-first CampaignOffer workflow.
|
|
4
4
|
visibility: public
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- mcp__sellable__get_auth_status
|
|
@@ -12,6 +12,7 @@ allowed-tools:
|
|
|
12
12
|
- mcp__sellable__search_subskill_prompts
|
|
13
13
|
- mcp__sellable__get_provider_prompt
|
|
14
14
|
- mcp__sellable__get_source_scout_registry
|
|
15
|
+
- mcp__sellable__get_post_find_leads_scout_registry
|
|
15
16
|
- mcp__sellable__get_message_prompt
|
|
16
17
|
- mcp__sellable__get_active_workspace
|
|
17
18
|
- mcp__sellable__list_senders
|
|
@@ -65,6 +66,14 @@ allowed-tools:
|
|
|
65
66
|
|
|
66
67
|
Use this as the customer-facing entrypoint for Sellable campaign creation.
|
|
67
68
|
|
|
69
|
+
CampaignOffer state is canonical; disk artifacts are a debug trail. The
|
|
70
|
+
internal create-campaign-v2 flow still writes the diagnostics, and all 14 disk
|
|
71
|
+
artifacts remain as debug outputs, but resume, gating, and handoff read campaign
|
|
72
|
+
state first. The
|
|
73
|
+
watchable campaign exists after the short brief; lead import is bounded to the
|
|
74
|
+
first review batch, and enrichment/message generation waits until rubrics and
|
|
75
|
+
the approved message template are saved on the campaign.
|
|
76
|
+
|
|
68
77
|
## Opening Turn Contract
|
|
69
78
|
|
|
70
79
|
On the first visible response after this skill is invoked, do not narrate
|
|
@@ -74,7 +83,7 @@ or tool discovery. Start in product language:
|
|
|
74
83
|
```text
|
|
75
84
|
I’ll help you launch this as a Sellable campaign. First I’ll confirm who we’re
|
|
76
85
|
sending from and which company this is for, then I’ll turn that into a campaign
|
|
77
|
-
brief before anything
|
|
86
|
+
brief before any leads are imported or anything can send.
|
|
78
87
|
```
|
|
79
88
|
|
|
80
89
|
If a linked/local skill file is stale or missing, silently use the installed
|
|
@@ -90,7 +99,8 @@ clear business decisions, tradeoffs, and approval gates. Use product language:
|
|
|
90
99
|
- "a couple setup choices", not `request_user_input`
|
|
91
100
|
- "campaign brief", not prompt artifact
|
|
92
101
|
- "lead source", not provider internals unless comparing source options
|
|
93
|
-
- "
|
|
102
|
+
- "I can create a draft shell for you to watch, but no leads import and nothing
|
|
103
|
+
sends until you approve", not mutation jargon
|
|
94
104
|
|
|
95
105
|
When explaining lead-source decisions, show the concrete counts behind the
|
|
96
106
|
logic: lanes searched, timeframe, raw result counts, finalist posts or preview
|
|
@@ -114,6 +124,13 @@ copy, is the runtime source of truth. If the host runs them sequentially, do not
|
|
|
114
124
|
claim they ran in parallel. In chat, call the downstream copy stage `message generation`;
|
|
115
125
|
`message-validation.md` is only an internal proof artifact.
|
|
116
126
|
|
|
127
|
+
After find-leads returns a lead source and the user approves it, use the same
|
|
128
|
+
registry pattern for the two post-lead branches. The create-campaign-v2 subskill
|
|
129
|
+
calls `get_post_find_leads_scout_registry`, then launches the returned
|
|
130
|
+
filter-leads scout and message-generation scout together when real subagents are
|
|
131
|
+
available. Message generation must not wait for the filter unless the host
|
|
132
|
+
cannot run the two branches concurrently.
|
|
133
|
+
|
|
117
134
|
Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
|
|
118
135
|
lines short, use indexed section labels and bullets, and translate internal
|
|
119
136
|
sourcing terms into plain language.
|
|
@@ -122,7 +139,7 @@ Every approval gate must include artifact access after the readable inline
|
|
|
122
139
|
content. Show a short `Open artifact:` line with the one key clickable markdown
|
|
123
140
|
link for that stage. Do not show raw filesystem paths unless links cannot be
|
|
124
141
|
created or the user asks. Do this for brief approval, lead-source
|
|
125
|
-
approval/review, lead-filter review, message review
|
|
142
|
+
approval/review, lead-filter review, and message review.
|
|
126
143
|
The link is for deeper inspection; never use it as a substitute for showing the
|
|
127
144
|
content in chat.
|
|
128
145
|
|
|
@@ -190,14 +207,22 @@ Treat host capabilities as concrete functions, not prose conventions:
|
|
|
190
207
|
and continue chunks until `hasMore` is false.
|
|
191
208
|
- `load_source_scout_registry`: call
|
|
192
209
|
`mcp__sellable__get_source_scout_registry({})` before any scout dispatch.
|
|
210
|
+
- `load_post_find_leads_scout_registry`: call
|
|
211
|
+
`mcp__sellable__get_post_find_leads_scout_registry({})` after source
|
|
212
|
+
approval and before dispatching the post-lead filter/message scouts.
|
|
193
213
|
- `launch_source_scout`: Claude Code uses `Task` with `subagent_type` equal to
|
|
194
214
|
the registry `name`; Codex uses named custom agents such as
|
|
195
215
|
`source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
196
216
|
`source-scout-prospeo-contact` when subagents are available.
|
|
217
|
+
- `launch_post_find_leads_scout`: Claude Code uses `Task` with `subagent_type`
|
|
218
|
+
equal to the returned post-lead registry `name`; Codex uses the returned
|
|
219
|
+
custom agents such as `post-find-leads-filter-scout` and
|
|
220
|
+
`post-find-leads-message-scout` when subagents are available.
|
|
197
221
|
|
|
198
222
|
If a required interactive host function is missing, stop and explain the
|
|
199
223
|
Sellable install/reload problem. Do not silently simulate structured choices,
|
|
200
|
-
subprompt loading, or
|
|
224
|
+
subprompt loading, source-scout dispatch, or post-lead scout dispatch with local
|
|
225
|
+
scripts.
|
|
201
226
|
|
|
202
227
|
Never narrate local draft housekeeping to the user. If you create directories,
|
|
203
228
|
save drafts, write artifacts, or persist intermediate state, translate it into
|
|
@@ -324,7 +349,7 @@ I can’t confirm it, I’ll ask for your LinkedIn URL or company website and us
|
|
|
324
349
|
that to understand the company before we choose the target, offer, proof, and
|
|
325
350
|
lead source.
|
|
326
351
|
|
|
327
|
-
Then I’ll turn that into a campaign brief for you to approve before anything
|
|
352
|
+
Then I’ll turn that into a campaign brief for you to approve before any leads are imported or anything can send.
|
|
328
353
|
```
|
|
329
354
|
|
|
330
355
|
Do not silently ask Codex intake or approval questions as plain chat when
|
|
@@ -358,7 +383,7 @@ No problem. You can still continue by switching Codex to Plan mode and running:
|
|
|
358
383
|
|
|
359
384
|
$sellable:create-campaign
|
|
360
385
|
|
|
361
|
-
I won’t
|
|
386
|
+
I won’t import leads, attach a sequence, or start anything until the brief, source, filters, and message are set.
|
|
362
387
|
```
|
|
363
388
|
|
|
364
389
|
Plain chat questions are only acceptable in non-interactive `codex exec`
|
|
@@ -504,12 +529,15 @@ updates.
|
|
|
504
529
|
`mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages", offset, limit })`
|
|
505
530
|
calls until `hasMore` is false. Do not synthesize
|
|
506
531
|
`message-validation.md` from the brief, lead review, or general knowledge.
|
|
507
|
-
5.
|
|
508
|
-
|
|
509
|
-
the
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
`
|
|
532
|
+
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
533
|
+
watch link and see useful setup state immediately. Import only the first
|
|
534
|
+
bounded review batch after the source is attached to the campaign; do not
|
|
535
|
+
queue workflow cells, attach a sequence, or start until
|
|
536
|
+
`message-validation.md` proves the full generate-messages workflow ran,
|
|
537
|
+
`message-review.md` approves the template, rubrics are saved, and the
|
|
538
|
+
approved message set is synced into the campaign brief.
|
|
539
|
+
6. Keep `selectedLeadListId` as the source list and `workflowTableId` as the
|
|
540
|
+
campaign table. Do not use disk files as the post-mint source of truth.
|
|
513
541
|
7. Do not ask the user to run another command.
|
|
514
542
|
|
|
515
543
|
## Fallback
|