@sellable/install 0.1.150 → 0.1.151

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.
@@ -44,9 +44,15 @@ the branch input.
44
44
  2. Use that prompt as the drafting contract. Do not use any alternate prompt,
45
45
  examples-only shortcut, or create-campaign safety/checklist instructions as a
46
46
  substitute for the full message prompt.
47
- 3. Draft only from the campaign brief, selected source context, and initial
47
+ 3. Follow the prompt's `Reference Asset Loading` section: load the required
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
48
54
  campaign-table execution slice rows supplied by the parent.
49
- 4. Keep the work provisional until the user chooses `Use Template` in Messages.
55
+ 5. Keep the work provisional until the user chooses `Use Template` in Messages.
50
56
 
51
57
  ## Owned Output
52
58
 
@@ -54,6 +60,8 @@ Return the following to the parent thread:
54
60
 
55
61
  - proposed first-message template using supported `{{...}}` tokens
56
62
  - token fill rules and fallbacks
63
+ - `Reference Asset Loading` note naming the required and conditional assets used
64
+ and why each was used
57
65
  - one rendered good-fill sample for a plausible passing campaign-table row
58
66
  - one omit/fallback sample when the row signal is not safe
59
67
  - pass/fail notes against the generate-messages quality gates
@@ -119,11 +127,33 @@ blocker.
119
127
  - Engagement-source personalization is a special case, not the default opener.
120
128
  Do not write `saw you {{engagement_context}} on {{post_context}}`, `saw you
121
129
  reacted to`, `saw you engaging with`, or equivalent source-citation copy as a
122
- default hook. Only refer to engagement when the line is self-aware and
123
- low-certainty, for example: `you might not remember the thread, but I found
124
- you through a [topic] discussion and your [observable role/company context]
125
- looked close to [problem]`. Otherwise omit the engagement signal and use
126
- role/company/problem context.
130
+ default hook. For LinkedIn-post-sourced campaigns, you may reference the
131
+ source when it explains why the note exists, but keep it topic-level, not
132
+ activity-log-level. Good: `saw you in a few conversations around [topic], so
133
+ hope this is relevant`, `saw you in a few conversations about [topic], so
134
+ may be off, but this seemed relevant`, `saw you might be interested in [topic],
135
+ so hope this is relevant`, `hope this is relevant if [topic] is on your plate`,
136
+ or `found you in a thread about [topic], so may be off, but this seemed relevant`.
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.
140
+ The cheekier `saw you raise your hand for [topic] (creepy to reach out based
141
+ on that, i know) - but this felt too on the nose to ignore` version is also
142
+ allowed only for explicit lead-magnet comments, replies, or opt-ins and when the
143
+ sender's voice can carry it. Bad: `you commented on...`, `you reacted
144
+ to...`, `saw you engaging with...`, `your LinkedIn activity...`, `you might
145
+ not remember the thread...`, or `found you through [source] and your role
146
+ looked close...`. Otherwise omit the engagement signal and use role/company/problem context.
147
+ - Do not use a PS to defend the source. Lines like `p.s. if the source thread
148
+ was just casual reading, ignore me` or `only reaching out where the role and
149
+ topic looked close` are blocked. If the source is too weak, omit it.
150
+ - Do not assert fit from title/company. `Your [role] role at [company] looked
151
+ close to this problem` is blocked. Keep the apologetic uncertainty instead:
152
+ `may be off, but if [workflow] is anywhere near your lane...`.
153
+ - Low-pressure relevance opt-outs are allowed when they do not defend the
154
+ source: `p.s. if this is nowhere near your outbound workflow, ignore me`.
155
+ - Do not use `Caught` as opener language. It reads unnatural in LinkedIn
156
+ outreach.
127
157
  - Do not describe the sender in third person inside the outbound message.
128
158
  Lines like `p.s. Saju's angle is...`, `Christian's angle is...`, or
129
159
  `[sender]'s approach is...` are internal notes leaking into copy. If the point
@@ -1244,8 +1244,8 @@ Desktop, then start a new thread.
1244
1244
  2. When the canonical prompt asks for \`references/*.md\`, load those files
1245
1245
  with \`mcp__sellable__get_subskill_asset({ subskillName: "interview", assetPath: "references/<file>.md" })\`.
1246
1246
  3. Follow the canonical prompt exactly. Save local memory only where that prompt
1247
- directs, under \`.sellable/configs/core/**\` and
1248
- \`.sellable/interviews/**\`.
1247
+ directs, under \`~/.sellable/configs/core/**\` and
1248
+ \`~/.sellable/interviews/**\`.
1249
1249
 
1250
1250
  ## MCP Prompt Fallback
1251
1251
 
@@ -1291,7 +1291,7 @@ Desktop, then start a new thread.
1291
1291
  If the response has \`hasMore=true\`, continue with \`nextOffset\` until
1292
1292
  \`hasMore=false\`.
1293
1293
  2. Follow the canonical prompt exactly. Read the relevant
1294
- \`.sellable/configs/**\` memory files it names.
1294
+ \`~/.sellable/configs/**\` memory files it names.
1295
1295
  3. Apply the loaded memory silently to the user's requested writing or answer.
1296
1296
  If the user only asked to load voice, summarize the active rules briefly and
1297
1297
  ask what they want drafted, answered, or reviewed.
@@ -2044,7 +2044,7 @@ function patchClaudeAlwaysLoad(opts) {
2044
2044
  }
2045
2045
 
2046
2046
  function installCodex(opts) {
2047
- if (!commandExists("codex")) {
2047
+ if (!opts.dryRun && !commandExists("codex")) {
2048
2048
  const message =
2049
2049
  "Codex CLI not found. Install/login to Codex, then rerun: sellable --host codex";
2050
2050
  if (opts.host === "all") {
@@ -2053,6 +2053,9 @@ function installCodex(opts) {
2053
2053
  }
2054
2054
  throw new Error(message);
2055
2055
  }
2056
+ if (!opts.dryRun) {
2057
+ mkdirSync(codexHome(), { recursive: true, mode: 0o700 });
2058
+ }
2056
2059
  if (opts.server === "hosted") {
2057
2060
  run("codex", codexMcpAddArgs(opts), opts);
2058
2061
  const info = installCodexDesktopPlugin(opts);
@@ -2619,6 +2622,13 @@ async function main() {
2619
2622
  process.exit(2);
2620
2623
  }
2621
2624
  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
+ }
2622
2632
  if (!token) {
2623
2633
  console.error(
2624
2634
  "Usage: sellable auth set <token>\n" +
@@ -2643,9 +2653,13 @@ async function main() {
2643
2653
  writeJson(
2644
2654
  authPath(),
2645
2655
  { token, activeWorkspaceId: null, apiUrl },
2646
- { dryRun: false }
2656
+ { dryRun }
2647
2657
  );
2648
- console.log(`✓ Token saved to ${authPath()}`);
2658
+ if (dryRun) {
2659
+ console.log(`Dry run: token would be saved to ${authPath()}`);
2660
+ } else {
2661
+ console.log(`✓ Token saved to ${authPath()}`);
2662
+ }
2649
2663
  console.log(` apiUrl: ${apiUrl}`);
2650
2664
  console.log(` Continue in your agent:`);
2651
2665
  console.log(` Claude Code: /sellable:create-campaign`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.150",
3
+ "version": "0.1.151",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {