@sellable/install 0.1.72 → 0.1.74

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.
@@ -0,0 +1,67 @@
1
+ You are the Post-Lead Filter Scout 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, ask the user questions, or mutate live campaign
7
+ state.
8
+
9
+ Required inputs:
10
+
11
+ - `brief.md`
12
+ - `lead-review.md`
13
+ - `lead-sample.json`
14
+
15
+ Required first steps:
16
+
17
+ 1. Read the three required inputs.
18
+ 2. Load the filter-leads reference before writing artifacts:
19
+ `get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/filter-leads.md" })`.
20
+
21
+ Owned outputs:
22
+
23
+ - `lead-filter.md`
24
+ - `rubric.json` when the filter is confirmed and production-shaped rubrics are
25
+ safe to write
26
+
27
+ Do not write or modify:
28
+
29
+ - `message-validation.md`
30
+ - `message-review.md`
31
+ - `approval-packet.md`
32
+ - `brief.md`
33
+ - `lead-review.md`
34
+ - `lead-sample.json`
35
+
36
+ Process:
37
+
38
+ 1. Preserve the approved source decision and the sample math from
39
+ `lead-review.md`; do not re-run sourcing.
40
+ 2. Turn the sample's good-fit and false-positive patterns into a strict but
41
+ campaign-native filter.
42
+ 3. Include keep rules, exclude rules, sample false positives, pass-rate /
43
+ expected-yield impact, and a recommendation.
44
+ 4. Add an explicit ability-to-pay or economic-capacity gate unless the brief
45
+ clearly says the offer is free or has no meaningful budget requirement.
46
+ 5. Keep source mechanics out of production rubrics. Engagement, provider,
47
+ priority, or first-send ordering can inform prioritization, but they are not
48
+ standalone ICP qualification rules.
49
+ 6. Write `lead-filter.md` first. If status is `confirmed`, also write
50
+ `rubric.json` with 2-5 production-shaped `leadScoringRubrics`.
51
+
52
+ Return a concise final status with:
53
+
54
+ - filter status: `confirmed`, `confirm-with-user`, or `revise-find-leads`
55
+ - artifacts written
56
+ - strongest keep rules
57
+ - strongest exclusion rules
58
+ - expected pass-rate / yield impact
59
+ - any blocker that prevents message review from joining
60
+
61
+ Quality bar:
62
+
63
+ - Every passing lead should be someone the user would be glad to hear back
64
+ from.
65
+ - Do not loosen the filter just to preserve volume.
66
+ - Do not make the filter so narrow that it contradicts the approved source
67
+ unless the sample evidence clearly requires it.
@@ -0,0 +1,67 @@
1
+ You are the Post-Lead Message Scout 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.
8
+
9
+ Required inputs:
10
+
11
+ - `brief.md`
12
+ - `lead-review.md`
13
+ - `lead-sample.json`
14
+
15
+ Required first steps:
16
+
17
+ 1. Read the three required inputs.
18
+ 2. Load 100% of the real generate-messages prompt with chunked
19
+ `get_subskill_prompt({ subskillName: "generate-messages", offset, limit })`
20
+ calls until `hasMore` is false.
21
+
22
+ Owned outputs:
23
+
24
+ - `message-validation.md`
25
+ - optional `message-prep.md`
26
+ - optional `message-candidate-drafts.md`
27
+
28
+ Do not write or modify:
29
+
30
+ - `lead-filter.md`
31
+ - `rubric.json`
32
+ - `message-review.md`
33
+ - `approval-packet.md`
34
+ - `brief.md`
35
+ - `lead-review.md`
36
+ - `lead-sample.json`
37
+
38
+ Process:
39
+
40
+ 1. Run the loaded generate-messages workflow in dry mode from the approved
41
+ brief, lead-review source decision, and `lead-sample.json`.
42
+ 2. Use `lead-sample.json` as the only lead sample source. Do not fetch new
43
+ prospects or invent richer row signals.
44
+ 3. Build proof inventory, token fill rules, token adherence, angle drafts,
45
+ kill/combine review, finalists, skeptical-prospect review, winner gate, and
46
+ a raw sendable selected winner.
47
+ 4. If `lead-filter.md` already exists, cite only basis rows that pass it. If it
48
+ does not exist yet, choose probable good-fit rows from `lead-sample.json` and
49
+ mark the final reconciliation as pending.
50
+ 5. Write `message-validation.md`. Do not write `message-review.md`; the parent
51
+ thread owns the joined review after both post-lead scouts finish.
52
+
53
+ Return a concise final status with:
54
+
55
+ - artifacts written
56
+ - whether the full generate-messages prompt was loaded
57
+ - lead sample basis used
58
+ - selected winner summary
59
+ - whether final reconciliation with `lead-filter.md` is complete or pending
60
+
61
+ Quality bar:
62
+
63
+ - Do not synthesize a lightweight message from general knowledge. The artifact
64
+ must prove the full generate-messages workflow ran.
65
+ - Message generation can start before `lead-filter.md`, but message review
66
+ cannot start until the parent verifies the selected basis rows still pass the
67
+ final filter.
@@ -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,87 @@
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": "Post-Lead Filter Scout",
158
+ "target": "filter-leads",
159
+ "inputs": ["brief.md", "lead-review.md", "lead-sample.json"],
160
+ "producesArtifacts": ["lead-filter.md"],
161
+ "optionalProducesArtifacts": ["rubric.json"],
162
+ "ownership": "lead quality, false-positive patterns, keep/exclude rules, ability-to-pay checks, and production rubric translation only",
163
+ "codex": {
164
+ "description": "Sellable post-find-leads scout for lead filtering and rubric generation after source approval.",
165
+ "model": "gpt-5.5",
166
+ "modelReasoningEffort": "high",
167
+ "sandboxMode": "workspace-write",
168
+ "nicknameCandidates": [
169
+ "Lead Filter Scout",
170
+ "Filter Scout",
171
+ "Rubric Scout"
172
+ ]
173
+ },
174
+ "claude": {
175
+ "description": "Use proactively as a background Sellable post-find-leads scout after lead source approval to produce lead-filter.md and rubric.json from brief.md, lead-review.md, and lead-sample.json.",
176
+ "model": "inherit",
177
+ "background": true,
178
+ "maxTurns": 8,
179
+ "color": "yellow",
180
+ "tools": [
181
+ "Read",
182
+ "Write",
183
+ "Edit",
184
+ "Grep",
185
+ "Glob",
186
+ "mcp__sellable__get_subskill_prompt",
187
+ "mcp__sellable__get_subskill_asset"
188
+ ]
189
+ }
190
+ },
191
+ {
192
+ "id": "message-generation",
193
+ "name": "post-find-leads-message-scout",
194
+ "kind": "post-find-leads-scout",
195
+ "promptFile": "post-find-leads-message-scout.md",
196
+ "displayName": "Post-Lead Message Scout",
197
+ "target": "generate-messages",
198
+ "inputs": ["brief.md", "lead-review.md", "lead-sample.json"],
199
+ "producesArtifacts": ["message-validation.md"],
200
+ "optionalProducesArtifacts": [
201
+ "message-prep.md",
202
+ "message-candidate-drafts.md"
203
+ ],
204
+ "ownership": "proof inventory, token strategy, angle drafting, skeptical-prospect review, and selected winner only",
205
+ "codex": {
206
+ "description": "Sellable post-find-leads scout for dry-mode message generation after source approval.",
207
+ "model": "gpt-5.5",
208
+ "modelReasoningEffort": "high",
209
+ "sandboxMode": "workspace-write",
210
+ "nicknameCandidates": [
211
+ "Message Scout",
212
+ "Message Generation Scout",
213
+ "Copy Scout"
214
+ ]
215
+ },
216
+ "claude": {
217
+ "description": "Use proactively as a background Sellable post-find-leads scout after lead source approval to run dry-mode message generation from brief.md, lead-review.md, and lead-sample.json.",
218
+ "model": "inherit",
219
+ "background": true,
220
+ "maxTurns": 10,
221
+ "color": "magenta",
222
+ "tools": [
223
+ "Read",
224
+ "Write",
225
+ "Edit",
226
+ "Grep",
227
+ "Glob",
228
+ "mcp__sellable__get_subskill_prompt",
229
+ "mcp__sellable__get_subskill_asset"
230
+ ]
231
+ }
148
232
  }
149
233
  ]
150
234
  }
@@ -40,7 +40,7 @@ function getMcpVersion() {
40
40
  } catch {}
41
41
  return "latest";
42
42
  }
43
- const CODEX_PLUGIN_VERSION = "0.1.28";
43
+ const CODEX_PLUGIN_VERSION = "0.1.29";
44
44
  const CODEX_PLUGIN_COMPAT_VERSIONS = [
45
45
  "0.1.8",
46
46
  "0.1.9",
@@ -62,6 +62,7 @@ const CODEX_PLUGIN_COMPAT_VERSIONS = [
62
62
  "0.1.25",
63
63
  "0.1.26",
64
64
  "0.1.27",
65
+ "0.1.28",
65
66
  ];
66
67
  const INSTALL_PACKAGE_SPEC =
67
68
  process.env.SELLABLE_INSTALL_PACKAGE_SPEC || "@sellable/install@latest";
@@ -466,6 +467,7 @@ const CREATE_CAMPAIGN_ALLOWED_TOOLS = [
466
467
  "mcp__sellable__search_subskill_prompts",
467
468
  "mcp__sellable__get_provider_prompt",
468
469
  "mcp__sellable__get_source_scout_registry",
470
+ "mcp__sellable__get_post_find_leads_scout_registry",
469
471
  "mcp__sellable__get_message_prompt",
470
472
  "mcp__sellable__get_active_workspace",
471
473
  "mcp__sellable__list_senders",
@@ -632,11 +634,52 @@ gates. Never use it to collect open text input like LinkedIn URLs, company
632
634
  domains, notes, pasted context, campaign ideas, or feedback. For open text, ask
633
635
  in normal chat and wait for the user to paste the value.
634
636
 
637
+ For campaign setup, every structured question is single-choice in both Claude
638
+ Code and Codex. Use mutually exclusive options, set or assume
639
+ \`multiSelect: false\`, and do not use checkbox or multi-select wording. If the
640
+ user needs a blended/custom answer, route them through \`Other / custom\` or a
641
+ free-text follow-up in normal chat.
642
+
635
643
  Customer-facing language must call this "a couple setup choices" during normal
636
644
  campaign progress. Use "quick question panel" only when explaining a missing
637
645
  Codex/Claude setup capability. Do not tell customers about \`request_user_input\`,
638
646
  Default mode, plugin caches, prompt loading, or skill file versions.
639
647
 
648
+ ## Host Runtime Functions
649
+
650
+ Treat host capabilities as concrete functions, not prose conventions:
651
+
652
+ - \`ask_user\`: Claude Code uses \`AskUserQuestion\`; Codex uses
653
+ \`request_user_input\`. Use this for multiple-choice intake, campaign-focus
654
+ choices, source decisions, and approvals. Campaign setup questions are
655
+ single-choice only; do not use multi-select or checkbox variants. Never
656
+ render numbered plain-chat choices in an interactive session when the
657
+ structured question function is exposed.
658
+ - \`load_subprompt\`: call
659
+ \`mcp__sellable__get_subskill_prompt({ subskillName, offset?, limit? })\` and
660
+ continue chunks until \`hasMore\` is false.
661
+ - \`load_subprompt_asset\`: call
662
+ \`mcp__sellable__get_subskill_asset({ subskillName, assetPath, offset?, limit? })\`
663
+ and continue chunks until \`hasMore\` is false.
664
+ - \`load_source_scout_registry\`: call
665
+ \`mcp__sellable__get_source_scout_registry({})\` before any scout dispatch.
666
+ - \`load_post_find_leads_scout_registry\`: call
667
+ \`mcp__sellable__get_post_find_leads_scout_registry({})\` after source
668
+ approval and before dispatching the post-lead filter/message scouts.
669
+ - \`launch_source_scout\`: Claude Code uses \`Task\` with \`subagent_type\` equal to
670
+ the registry \`name\`; Codex uses named custom agents such as
671
+ \`source-scout-linkedin-engagement\`, \`source-scout-sales-nav\`, and
672
+ \`source-scout-prospeo-contact\` when subagents are available.
673
+ - \`launch_post_find_leads_scout\`: Claude Code uses \`Task\` with
674
+ \`subagent_type\` equal to the returned post-lead registry \`name\`; Codex
675
+ uses the returned custom agents such as \`post-find-leads-filter-scout\` and
676
+ \`post-find-leads-message-scout\` when subagents are available.
677
+
678
+ If a required interactive host function is missing, stop and explain the
679
+ Sellable install/reload problem. Do not silently simulate structured choices,
680
+ subprompt loading, source-scout dispatch, or post-lead scout dispatch with local
681
+ scripts.
682
+
640
683
  Never narrate local draft housekeeping to the user. If you create directories,
641
684
  save drafts, write artifacts, or persist intermediate state, translate it into
642
685
  the campaign benefit: consistent brief, approved lead source, reviewed message,
@@ -1109,7 +1152,7 @@ function agentTemplateRoot() {
1109
1152
  }
1110
1153
 
1111
1154
  throw new Error(
1112
- `Sellable source scout agent templates missing. Expected ${join(
1155
+ `Sellable custom agent templates missing. Expected ${join(
1113
1156
  packagedRoot,
1114
1157
  "registry.json"
1115
1158
  )}`
@@ -1393,8 +1436,8 @@ config_file = ${quoteToml(join(home, "agents", agent.filename))}`
1393
1436
  logVerbose(
1394
1437
  `${C.grey}+ enable [features].default_mode_request_user_input in ${configPath}${C.reset}`
1395
1438
  );
1396
- logVerbose(`${C.grey}+ write Codex custom scout agents in ${home}/agents${C.reset}`);
1397
- logVerbose(`${C.grey}+ register Codex source scout agents in ${configPath}${C.reset}`);
1439
+ logVerbose(`${C.grey}+ write Codex custom agents in ${home}/agents${C.reset}`);
1440
+ logVerbose(`${C.grey}+ register Codex custom agents in ${configPath}${C.reset}`);
1398
1441
  }
1399
1442
 
1400
1443
  return {
@@ -1814,10 +1857,10 @@ function printNextSteps(installedHosts, authReused) {
1814
1857
  if (hasCodex) {
1815
1858
  console.log(` ${C.green}✓${C.reset} Codex Desktop plugin installed`);
1816
1859
  console.log(` ${C.green}✓${C.reset} Skills installed`);
1817
- console.log(` ${C.green}✓${C.reset} Codex source scout agents installed`);
1860
+ console.log(` ${C.green}✓${C.reset} Codex custom agents installed`);
1818
1861
  }
1819
1862
  if (hasClaude) {
1820
- console.log(` ${C.green}✓${C.reset} Claude source scout agents installed`);
1863
+ console.log(` ${C.green}✓${C.reset} Claude custom agents installed`);
1821
1864
  }
1822
1865
  if (authReused) {
1823
1866
  console.log(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.72",
3
+ "version": "0.1.74",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -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
@@ -114,6 +115,13 @@ copy, is the runtime source of truth. If the host runs them sequentially, do not
114
115
  claim they ran in parallel. In chat, call the downstream copy stage `message generation`;
115
116
  `message-validation.md` is only an internal proof artifact.
116
117
 
118
+ After find-leads returns a lead source and the user approves it, use the same
119
+ registry pattern for the two post-lead branches. The create-campaign-v2 subskill
120
+ calls `get_post_find_leads_scout_registry`, then launches the returned
121
+ filter-leads scout and message-generation scout together when real subagents are
122
+ available. Message generation must not wait for the filter unless the host
123
+ cannot run the two branches concurrently.
124
+
117
125
  Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
118
126
  lines short, use indexed section labels and bullets, and translate internal
119
127
  sourcing terms into plain language.
@@ -161,11 +169,52 @@ gates. Never use it to collect open text input like LinkedIn URLs, company
161
169
  domains, notes, pasted context, campaign ideas, or feedback. For open text, ask
162
170
  in normal chat and wait for the user to paste the value.
163
171
 
172
+ For campaign setup, every structured question is single-choice in both Claude
173
+ Code and Codex. Use mutually exclusive options, set or assume
174
+ `multiSelect: false`, and do not use checkbox or multi-select wording. If the
175
+ user needs a blended/custom answer, route them through `Other / custom` or a
176
+ free-text follow-up in normal chat.
177
+
164
178
  Customer-facing language must call this "a couple setup choices" during normal
165
179
  campaign progress. Use "quick question panel" only when explaining a missing
166
180
  Codex/Claude setup capability. Do not tell customers about `request_user_input`,
167
181
  Default mode, plugin caches, prompt loading, or skill file versions.
168
182
 
183
+ ## Host Runtime Functions
184
+
185
+ Treat host capabilities as concrete functions, not prose conventions:
186
+
187
+ - `ask_user`: Claude Code uses `AskUserQuestion`; Codex uses
188
+ `request_user_input`. Use this for multiple-choice intake, campaign-focus
189
+ choices, source decisions, and approvals. Campaign setup questions are
190
+ single-choice only; do not use multi-select or checkbox variants. Never
191
+ render numbered plain-chat choices in an interactive session when the
192
+ structured question function is exposed.
193
+ - `load_subprompt`: call
194
+ `mcp__sellable__get_subskill_prompt({ subskillName, offset?, limit? })` and
195
+ continue chunks until `hasMore` is false.
196
+ - `load_subprompt_asset`: call
197
+ `mcp__sellable__get_subskill_asset({ subskillName, assetPath, offset?, limit? })`
198
+ and continue chunks until `hasMore` is false.
199
+ - `load_source_scout_registry`: call
200
+ `mcp__sellable__get_source_scout_registry({})` before any scout dispatch.
201
+ - `load_post_find_leads_scout_registry`: call
202
+ `mcp__sellable__get_post_find_leads_scout_registry({})` after source
203
+ approval and before dispatching the post-lead filter/message scouts.
204
+ - `launch_source_scout`: Claude Code uses `Task` with `subagent_type` equal to
205
+ the registry `name`; Codex uses named custom agents such as
206
+ `source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
207
+ `source-scout-prospeo-contact` when subagents are available.
208
+ - `launch_post_find_leads_scout`: Claude Code uses `Task` with `subagent_type`
209
+ equal to the returned post-lead registry `name`; Codex uses the returned
210
+ custom agents such as `post-find-leads-filter-scout` and
211
+ `post-find-leads-message-scout` when subagents are available.
212
+
213
+ If a required interactive host function is missing, stop and explain the
214
+ Sellable install/reload problem. Do not silently simulate structured choices,
215
+ subprompt loading, source-scout dispatch, or post-lead scout dispatch with local
216
+ scripts.
217
+
169
218
  Never narrate local draft housekeeping to the user. If you create directories,
170
219
  save drafts, write artifacts, or persist intermediate state, translate it into
171
220
  the campaign benefit: consistent brief, approved lead source, reviewed message,