@sellable/mcp 0.1.245 → 0.1.247

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.
@@ -49,16 +49,31 @@ function getCampaignBuilderWatchModeFromUrl(watchUrl) {
49
49
  export function getCampaignBuilderWatchModeDriverLabel(mode = getCampaignBuilderWatchModeParam()) {
50
50
  return mode === "codex" ? "Codex" : "Claude Code";
51
51
  }
52
+ function buildWatchHandoffHeadlineBox(headline) {
53
+ const width = 52;
54
+ const visibleHeadline = headline.length > width ? headline.slice(0, width) : headline;
55
+ const padding = Math.max(width - visibleHeadline.length, 0);
56
+ const left = Math.floor(padding / 2);
57
+ const right = padding - left;
58
+ const border = `+${"-".repeat(width + 2)}+`;
59
+ return [
60
+ "```",
61
+ border,
62
+ `| ${" ".repeat(left)}${visibleHeadline}${" ".repeat(right)} |`,
63
+ border,
64
+ "```",
65
+ ].join("\n");
66
+ }
52
67
  export function buildCampaignWatchHandoffMarkdown(watchUrl, mode = getCampaignBuilderWatchModeFromUrl(watchUrl) ??
53
68
  getCampaignBuilderWatchModeParam()) {
54
69
  const driverLabel = getCampaignBuilderWatchModeDriverLabel(mode);
55
70
  const headline = `WATCH ${driverLabel.toUpperCase()} BUILD THE CAMPAIGN LIVE`;
56
71
  return [
57
- `> **${headline}**`,
58
- ">",
59
- `> [Open live campaign builder](${watchUrl})`,
60
- ">",
61
- "> Keep this chat open. I'll ask approval questions here before making decisions that need your judgment.",
72
+ buildWatchHandoffHeadlineBox(headline),
73
+ "",
74
+ `[Open live campaign builder](${watchUrl})`,
75
+ "",
76
+ "Keep this chat open. I'll ask approval questions here before making decisions that need your judgment.",
62
77
  ].join("\n");
63
78
  }
64
79
  function buildCampaignBuilderWatchPath(campaignId) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.245",
3
+ "version": "0.1.247",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -409,19 +409,23 @@ automation just because a watch link exists. If `create_campaign` returns
409
409
  approval question. It will use the URL mode to say Codex or Claude Code:
410
410
 
411
411
  ````markdown
412
- > **WATCH CODEX BUILD THE CAMPAIGN LIVE**
413
- >
414
- > [Open live campaign builder]({watchUrl})
415
- >
416
- > Keep this chat open. I'll ask approval questions here before making decisions
417
- > that need your judgment.
412
+ ```
413
+ +------------------------------------------------------+
414
+ | WATCH CODEX BUILD THE CAMPAIGN LIVE |
415
+ +------------------------------------------------------+
416
+ ```
417
+
418
+ [Open live campaign builder]({watchUrl})
419
+
420
+ Keep this chat open. I'll ask approval questions here before making decisions
421
+ that need your judgment.
418
422
  ````
419
423
 
420
- The rendered callout is intentional: rendered chat clients highlight the
421
- headline, link, and note without treating it as a code block, and plain terminals
422
- still expose the tokenized URL inside the Markdown target. Do not wrap this CTA
423
- in a fenced code block, replace it with a shell command, or add a
424
- browser-opening instruction.
424
+ The ASCII banner is intentional because it is unmissable in both Codex and plain
425
+ terminals. Only the banner should be fenced/preformatted; keep the Markdown link
426
+ and chat note outside the fence so rendered chat clients still expose a normal
427
+ click target. Do not add a code-fence language label, replace the link with a
428
+ shell command, or add a browser-opening instruction.
425
429
 
426
430
  The watch link should auto-login through the token in the URL. If the user says
427
431
  the link lands on auth, 404, permission, blank, or a visible error state, recover
@@ -341,12 +341,16 @@ approve/revise recommendation, not fallback samples, concerns, or a QA receipt.
341
341
  Be explicit about what has and has not happened:
342
342
 
343
343
  ````markdown
344
- > **WATCH CODEX BUILD THE CAMPAIGN LIVE**
345
- >
346
- > [Open live campaign builder]({watchUrl})
347
- >
348
- > Keep this chat open. I'll ask approval questions here before making decisions
349
- > that need your judgment.
344
+ ```
345
+ +------------------------------------------------------+
346
+ | WATCH CODEX BUILD THE CAMPAIGN LIVE |
347
+ +------------------------------------------------------+
348
+ ```
349
+
350
+ [Open live campaign builder]({watchUrl})
351
+
352
+ Keep this chat open. I'll ask approval questions here before making decisions
353
+ that need your judgment.
350
354
  ````
351
355
 
352
356
  Print that watch-link handoff only once before the brief approval question, and
@@ -39,12 +39,16 @@ useful brief instead of an empty campaign.
39
39
  Example skeleton:
40
40
 
41
41
  ````markdown
42
- > **WATCH CODEX BUILD THE CAMPAIGN LIVE**
43
- >
44
- > [Open live campaign builder]({watchUrl})
45
- >
46
- > Keep this chat open. I'll ask approval questions here before making decisions
47
- > that need your judgment.
42
+ ```
43
+ +------------------------------------------------------+
44
+ | WATCH CODEX BUILD THE CAMPAIGN LIVE |
45
+ +------------------------------------------------------+
46
+ ```
47
+
48
+ [Open live campaign builder]({watchUrl})
49
+
50
+ Keep this chat open. I'll ask approval questions here before making decisions
51
+ that need your judgment.
48
52
 
49
53
  Now ask the brief approval question. Do not show the approve/revise question
50
54
  panel until the full brief content and this exact watch-link handoff have
@@ -6,6 +6,36 @@ visibility: internal
6
6
 
7
7
  # Create Post
8
8
 
9
+ <command_model>
10
+ `create-post` is the user-facing content command for LinkedIn post work.
11
+
12
+ It owns the content workflow:
13
+
14
+ - log rough post source material, voice memos, transcripts, and freestyle notes
15
+ - mine transcript-derived content memory for recurring ideas and hidden angles
16
+ - workshop a promising idea until the premise has enough story/proof/tension
17
+ - run external LinkedIn research
18
+ - draft, validate, save, and publish-track posts
19
+
20
+ It does not own foundational identity setup. Use `$sellable:interview` for the
21
+ foundation layer: core values, founder identity, company truth, durable stories,
22
+ proof ledgers, answer bank, context modes, anti-AI rules, and transcript indexes.
23
+
24
+ Implementation detail: `mcp__sellable__get_engage_memory` is the
25
+ backward-compatible loader for unified Sellable memory. It is not a separate
26
+ user-facing command. `create-post` must call it and use both:
27
+
28
+ - interview-created foundation memory: `core/about-me.md`,
29
+ `core/my-company.md`, `core/story-bank.md`, `core/proof-ledger.md`,
30
+ `core/answer-bank.md`, `core/context-modes.md`
31
+ - content memory: `core/content-memory/**` clusters, cards, questions, and seeds
32
+
33
+ If foundation memory is missing or too thin, ask the user to run
34
+ `$sellable:interview` or answer the missing foundation questions before
35
+ drafting. If content-memory is missing, continue from the raw source and propose
36
+ the smallest content-memory write-back.
37
+ </command_model>
38
+
9
39
  <role>
10
40
  You are the Sellable LinkedIn post writer for a specific user.
11
41
 
@@ -6,6 +6,30 @@ visibility: public
6
6
 
7
7
  # Core Identity Interview
8
8
 
9
+ <command_model>
10
+ `interview` is the foundation-memory command.
11
+
12
+ It owns:
13
+
14
+ - core values and founder identity
15
+ - company truth and positioning
16
+ - durable stories and reusable answers
17
+ - proof/wins ledgers and proof-safety rules
18
+ - context modes and anti-AI writing rules
19
+ - transcript/topic references and raw interview archives
20
+ - approved reference packs
21
+
22
+ It does not own the LinkedIn post production workflow. When a user wants to log
23
+ post source notes, mine transcripts for post ideas, workshop a post seed, or
24
+ draft a LinkedIn post, route that to `$sellable:create-post`.
25
+
26
+ The bridge is unified memory: `interview` writes the foundation under
27
+ `~/.sellable/configs/core/**`; `create-post` loads it through
28
+ `mcp__sellable__get_engage_memory` before researching or drafting. This means
29
+ posts should always have access to interview-created values, voice, stories,
30
+ proof, and context modes when they exist.
31
+ </command_model>
32
+
9
33
  <role>
10
34
  You are the Sellable core identity/company memory interviewer. Your job is to
11
35
  turn source material, voice samples, transcripts, corrections, and a short