@sellable/mcp 0.1.242 → 0.1.243

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.
@@ -33,6 +33,7 @@ export interface EngageMemory {
33
33
  decisionRules?: IdentityMemoryChunk;
34
34
  changeLog?: IdentityMemoryChunk;
35
35
  transcripts?: IdentityMemoryDirectory;
36
+ contentMemory?: IdentityMemoryDirectory;
36
37
  references?: IdentityMemoryDirectory;
37
38
  }
38
39
  /** Check if a sender has per-sender config directory. */
@@ -160,6 +160,7 @@ function readStyleGuide(senderId, identityMemory) {
160
160
  appendCoreSection(parts, sourcePaths, "Core Decision Rules", identityMemory.decisionRules);
161
161
  appendCoreSection(parts, sourcePaths, "Core Change Log", identityMemory.changeLog);
162
162
  appendCoreDirectoryIndex(parts, sourcePaths, "Core Transcripts Index", identityMemory.transcripts);
163
+ appendCoreDirectoryIndex(parts, sourcePaths, "Core Content Memory Index", identityMemory.contentMemory);
163
164
  appendCoreDirectoryIndex(parts, sourcePaths, "Core References Index", identityMemory.references);
164
165
  if (core) {
165
166
  appendCompatibilitySection(parts, sourcePaths, {
@@ -210,6 +211,8 @@ function hasCoreIdentityMemory(identityMemory) {
210
211
  identityMemory.decisionRules ||
211
212
  identityMemory.changeLog ||
212
213
  identityMemory.transcripts?.index ||
214
+ identityMemory.contentMemory?.index ||
215
+ (identityMemory.contentMemory?.childIndexes?.length ?? 0) > 0 ||
213
216
  identityMemory.references?.index ||
214
217
  (identityMemory.references?.childIndexes?.length ?? 0) > 0);
215
218
  }
@@ -10,6 +10,7 @@ export declare const CORE_MEMORY_PATHS: {
10
10
  readonly decisionRules: "core/decision-rules.md";
11
11
  readonly changeLog: "core/change-log.md";
12
12
  readonly transcripts: "core/transcripts";
13
+ readonly contentMemory: "core/content-memory";
13
14
  readonly references: "core/references";
14
15
  };
15
16
  export interface IdentityMemorySource {
@@ -37,6 +38,7 @@ export interface IdentityMemory {
37
38
  decisionRules?: IdentityMemoryChunk;
38
39
  changeLog?: IdentityMemoryChunk;
39
40
  transcripts?: IdentityMemoryDirectory;
41
+ contentMemory?: IdentityMemoryDirectory;
40
42
  references?: IdentityMemoryDirectory;
41
43
  }
42
44
  export interface ReadIdentityMemoryOptions {
@@ -13,6 +13,7 @@ export const CORE_MEMORY_PATHS = {
13
13
  decisionRules: "core/decision-rules.md",
14
14
  changeLog: "core/change-log.md",
15
15
  transcripts: "core/transcripts",
16
+ contentMemory: "core/content-memory",
16
17
  references: "core/references",
17
18
  };
18
19
  export function resolveIdentityConfigsDir() {
@@ -53,6 +54,10 @@ export function readIdentityMemory(_options = {}) {
53
54
  if (transcripts) {
54
55
  memory.transcripts = transcripts;
55
56
  }
57
+ const contentMemory = readDirectory(configsDir, CORE_MEMORY_PATHS.contentMemory);
58
+ if (contentMemory) {
59
+ memory.contentMemory = contentMemory;
60
+ }
56
61
  const references = readDirectory(configsDir, CORE_MEMORY_PATHS.references);
57
62
  if (references) {
58
63
  memory.references = references;
@@ -408,7 +408,8 @@ export function updatePostDraftTool(input) {
408
408
  const safeResearchId = input.hookResearchId
409
409
  ? normalizeArtifactId(input.hookResearchId, "hookResearchId")
410
410
  : existing.metadata.hookResearchId;
411
- const iteration = normalizeDraftIteration(input.iteration ?? existing.metadata.iteration, input.priorDraftId ?? existing.metadata.priorDraftId);
411
+ const iteration = normalizeDraftIteration(input.iteration ??
412
+ existing.metadata.iteration, input.priorDraftId ?? existing.metadata.priorDraftId);
412
413
  const status = input.status || existing.metadata.status || "draft";
413
414
  assertDraftStatus(status);
414
415
  const metadata = {
@@ -416,7 +417,9 @@ export function updatePostDraftTool(input) {
416
417
  status,
417
418
  title: input.title ?? existing.metadata.title,
418
419
  hookResearchId: safeResearchId,
419
- draftVersion: iteration?.version || existing.metadata.draftVersion || inferDraftVersion(safeDraftId),
420
+ draftVersion: iteration?.version ||
421
+ existing.metadata.draftVersion ||
422
+ inferDraftVersion(safeDraftId),
420
423
  priorDraftId: iteration?.priorDraftId,
421
424
  iteration,
422
425
  updatedAt: now,
@@ -489,7 +492,8 @@ export function markPostPublishedTool(input) {
489
492
  const relativePath = `${RELATIVE_DIRS.published}/${year}/${safeId}.md`;
490
493
  const existing = readArtifactIfExists(relativePath);
491
494
  const createdAt = existing?.metadata.createdAt || publishedAt;
492
- const finalText = input.finalText ?? extractMarkdownSection(existing?.markdown || "", "Final Text");
495
+ const finalText = input.finalText ??
496
+ extractMarkdownSection(existing?.markdown || "", "Final Text");
493
497
  const publishMetadata = readJsonSection(existing?.markdown || "", "Publish Metadata", {});
494
498
  const futureMetrics = readJsonSection(existing?.markdown || "", "Future Metrics", {
495
499
  impressions: null,
@@ -2,7 +2,7 @@ import { copySenderConfig, getEngageMemory, migrateFlatConfigs, recordProvenSear
2
2
  export const engageMemoryToolDefinitions = [
3
3
  {
4
4
  name: "get_engage_memory",
5
- description: "Load backward-compatible engage memory from ~/.sellable/configs/: style guide, post writing rules, proven search keywords, tracked people, plus optional core identity/company memory. All data lives in readable markdown files the user can also edit directly. When senderId is provided, reads compatibility overrides from senders/{senderId}/ with flat-path fallback.",
5
+ description: "Load unified Sellable memory from ~/.sellable/configs/: core identity/company/proof/story memory, transcript/content-memory clusters, references, style and post writing rules, proven search keywords, and tracked people. The get_engage_memory name is backward-compatible; all data lives in readable markdown files the user can edit directly. When senderId is provided, reads compatibility overrides from senders/{senderId}/ with flat-path fallback.",
6
6
  inputSchema: {
7
7
  type: "object",
8
8
  properties: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.242",
3
+ "version": "0.1.243",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -108,10 +108,19 @@ Load user memory before hook generation or drafting:
108
108
  - `core/answer-bank.md`
109
109
  - `core/context-modes.md`
110
110
  - `core/decision-rules.md`
111
+ - `core/content-memory/**`
111
112
  - `core/references/**`
112
113
  3. Use `memory.postWritingRules` returned by `mcp__sellable__get_engage_memory` when present. If the host permits direct file reads and the memory response does not include it, read post-specific writing rules from `~/.sellable/configs/writing/posts.md` when available.
113
114
  4. Read the gold-standard post pack from `core/references/linkedin-posts/INDEX.md` and its approved copied/distilled examples when present. `get_engage_memory` may return this through the composed `core/references/**` indexes; if the host permits direct file reads, load the files directly when needed.
114
115
 
116
+ Treat `get_engage_memory` as the backward-compatible tool name for unified
117
+ Sellable memory. For transcript-derived posts, rough source notes, recurring
118
+ ideas, or post seeds, load `core/content-memory/**` before hook generation.
119
+ Use it to find the idea cluster, story/proof/question cards, proof gaps, and
120
+ post seeds. If the cluster is weak, ask workshop questions before drafting. If
121
+ the seed is mature, use it as the source packet for premise development and
122
+ external LinkedIn research.
123
+
115
124
  `writing/posts.md` is a post-writing config file, not a draft library. Treat its structure this way:
116
125
 
117
126
  - Top scratch or `## Draft Rule Candidates` sections are candidate taste notes only.
@@ -137,6 +146,8 @@ Durable write-back targets:
137
146
  privacy decisions, and downstream prompt/operator notes
138
147
  - `core/story-bank.md` for reusable first-person stories
139
148
  - `core/transcripts/INDEX.md` for source interview or voice-memo references
149
+ - `core/content-memory/INDEX.md`, cluster files, and card files for evolving
150
+ transcript-derived ideas, story cards, proof cards, questions, and post seeds
140
151
  - `core/references/linkedin-posts/INDEX.md` and adjacent files for approved
141
152
  gold-standard post references
142
153
  - `discovery/influencers.md` for approved creators/persons the user wants the
@@ -359,6 +359,7 @@ Use the smallest relevant core target:
359
359
  - `core/decision-rules.md` for durable strategy rules, public/private safety rules, and correction heuristics.
360
360
  - `core/change-log.md` for every approved correction, rejected proposal worth remembering, private mark, and downstream prompt/operator note.
361
361
  - `core/transcripts/INDEX.md` plus a topic file under `core/transcripts/topics/` for topic-specific interview snippets or unused material that should stay transcript-first.
362
+ - `core/content-memory/INDEX.md` plus cluster/card files for recurring content ideas, post seeds, proof gaps, and transcript-derived story material that should evolve over time.
362
363
  - `core/references/linkedin-posts/INDEX.md` or another `core/references/**/INDEX.md` when an approved comment/post example should become a reference artifact.
363
364
 
364
365
  Write-backs must be idempotent: use stable source keys such as `engage-session:{date}:{senderId}:{postUrlHash}:{slug}`, check copied paths before adding references, create no duplicate reference rows, and keep manual sections preserved. If the user marks a candidate private, store only the minimum private-safe metadata and do not promote it into public proof, references, or examples.
@@ -6,23 +6,26 @@ Engage memory lives in the home-level `~/.sellable/configs/` source of truth. Th
6
6
 
7
7
  | Data | Config File | MCP Tool |
8
8
  | --------------- | --------------------------------------------------------------------------------- | ---------------------------------------------------- |
9
- | Core identity | `~/.sellable/configs/core/about-me.md` | `get_engage_memory` |
10
- | Company truth | `~/.sellable/configs/core/my-company.md` | `get_engage_memory` |
11
- | Anti-AI rules | `~/.sellable/configs/core/anti-ai-writing-style.md` | `get_engage_memory` |
9
+ | Core identity | `~/.sellable/configs/core/about-me.md` | `get_engage_memory` |
10
+ | Company truth | `~/.sellable/configs/core/my-company.md` | `get_engage_memory` |
11
+ | Anti-AI rules | `~/.sellable/configs/core/anti-ai-writing-style.md` | `get_engage_memory` |
12
12
  | Proof/wins | `~/.sellable/configs/core/proof-ledger.md`, `~/.sellable/configs/core/wins-ledger.md` | `get_engage_memory` |
13
- | Stories/answers | `~/.sellable/configs/core/story-bank.md`, `~/.sellable/configs/core/answer-bank.md` | `get_engage_memory` |
14
- | Context modes | `~/.sellable/configs/core/context-modes.md` | `get_engage_memory` |
15
- | Style override | `~/.sellable/configs/writing/styleguide-core.md` or sender override | `get_engage_memory` / `set_engage_style_guide` |
16
- | Comment rules | `~/.sellable/configs/writing/comments.md` | (read via `get_engage_memory`) |
17
- | Proven searches | `~/.sellable/configs/discovery/proven-searches.md` | `get_engage_memory` / `record_engage_proven_search` |
18
- | Tracked people | `~/.sellable/configs/discovery/influencers.md` | `get_engage_memory` / `upsert_engage_tracked_person` |
19
- | Post filters | `~/.sellable/configs/discovery/post-filters.md` | (read by skill via Read tool) |
20
- | ICP | `~/.sellable/configs/audience/icp.md` | (read by skill via Read tool) |
13
+ | Stories/answers | `~/.sellable/configs/core/story-bank.md`, `~/.sellable/configs/core/answer-bank.md` | `get_engage_memory` |
14
+ | Transcripts | `~/.sellable/configs/core/transcripts/**` | `get_engage_memory` |
15
+ | Content memory | `~/.sellable/configs/core/content-memory/**` | `get_engage_memory` |
16
+ | Context modes | `~/.sellable/configs/core/context-modes.md` | `get_engage_memory` |
17
+ | Style override | `~/.sellable/configs/writing/styleguide-core.md` or sender override | `get_engage_memory` / `set_engage_style_guide` |
18
+ | Comment rules | `~/.sellable/configs/writing/comments.md` | (read via `get_engage_memory`) |
19
+ | Proven searches | `~/.sellable/configs/discovery/proven-searches.md` | `get_engage_memory` / `record_engage_proven_search` |
20
+ | Tracked people | `~/.sellable/configs/discovery/influencers.md` | `get_engage_memory` / `upsert_engage_tracked_person` |
21
+ | Post filters | `~/.sellable/configs/discovery/post-filters.md` | (read by skill via Read tool) |
22
+ | ICP | `~/.sellable/configs/audience/icp.md` | (read by skill via Read tool) |
21
23
 
22
24
  ## How Skills Update Configs
23
25
 
24
26
  - **Interview skill**: Populates primary `configs/core/**` identity/company memory, transcript references, answer bank, proof/wins ledgers, and anti-AI rules.
25
- - **Engage skill**: Reads composed core memory through `get_engage_memory`, updates proven searches after each session, adds new tracked people when discovered, and writes legacy sender style overrides only when the correction is engage-specific.
27
+ - **Engage skill**: Reads composed unified memory through `get_engage_memory`, updates proven searches after each session, adds new tracked people when discovered, and writes legacy sender style overrides only when the correction is engage-specific.
28
+ - **Create-post skill**: Reads the same unified memory, including `core/content-memory/**`, before drafting from transcripts, recurring ideas, or post seeds.
26
29
 
27
30
  ## Migration from JSON
28
31