@timmeck/marketing-brain 0.2.1 → 0.4.0

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.
Files changed (160) hide show
  1. package/Dockerfile +22 -0
  2. package/README.md +20 -3
  3. package/dashboard.html +6 -0
  4. package/dist/cli/colors.d.ts +11 -24
  5. package/dist/cli/colors.js +3 -46
  6. package/dist/cli/colors.js.map +1 -1
  7. package/dist/cli/commands/dashboard.js +15 -0
  8. package/dist/cli/commands/dashboard.js.map +1 -1
  9. package/dist/cli/commands/peers.d.ts +2 -0
  10. package/dist/cli/commands/peers.js +38 -0
  11. package/dist/cli/commands/peers.js.map +1 -0
  12. package/dist/config.js +2 -29
  13. package/dist/config.js.map +1 -1
  14. package/dist/db/connection.d.ts +1 -2
  15. package/dist/db/connection.js +1 -18
  16. package/dist/db/connection.js.map +1 -1
  17. package/dist/hooks/post-tool-use.d.ts +2 -0
  18. package/dist/hooks/post-tool-use.js +182 -0
  19. package/dist/hooks/post-tool-use.js.map +1 -0
  20. package/dist/index.js +2 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/ipc/client.d.ts +1 -13
  23. package/dist/ipc/client.js +1 -92
  24. package/dist/ipc/client.js.map +1 -1
  25. package/dist/ipc/protocol.d.ts +1 -8
  26. package/dist/ipc/protocol.js +1 -28
  27. package/dist/ipc/protocol.js.map +1 -1
  28. package/dist/ipc/router.d.ts +2 -0
  29. package/dist/ipc/router.js +30 -0
  30. package/dist/ipc/router.js.map +1 -1
  31. package/dist/ipc/server.d.ts +1 -14
  32. package/dist/ipc/server.js +1 -129
  33. package/dist/ipc/server.js.map +1 -1
  34. package/dist/learning/confidence-scorer.d.ts +1 -5
  35. package/dist/learning/confidence-scorer.js +2 -13
  36. package/dist/learning/confidence-scorer.js.map +1 -1
  37. package/dist/learning/learning-engine.d.ts +2 -5
  38. package/dist/learning/learning-engine.js +3 -20
  39. package/dist/learning/learning-engine.js.map +1 -1
  40. package/dist/marketing-core.d.ts +2 -0
  41. package/dist/marketing-core.js +22 -2
  42. package/dist/marketing-core.js.map +1 -1
  43. package/dist/mcp/server.js +5 -60
  44. package/dist/mcp/server.js.map +1 -1
  45. package/dist/mcp/tools.js +29 -0
  46. package/dist/mcp/tools.js.map +1 -1
  47. package/dist/research/research-engine.d.ts +2 -5
  48. package/dist/research/research-engine.js +3 -24
  49. package/dist/research/research-engine.js.map +1 -1
  50. package/dist/services/analytics.service.d.ts +1 -1
  51. package/dist/services/synapse.service.d.ts +10 -10
  52. package/dist/synapses/activation.d.ts +2 -13
  53. package/dist/synapses/activation.js +2 -49
  54. package/dist/synapses/activation.js.map +1 -1
  55. package/dist/synapses/decay.d.ts +2 -11
  56. package/dist/synapses/decay.js +2 -26
  57. package/dist/synapses/decay.js.map +1 -1
  58. package/dist/synapses/hebbian.d.ts +2 -13
  59. package/dist/synapses/hebbian.js +2 -34
  60. package/dist/synapses/hebbian.js.map +1 -1
  61. package/dist/synapses/pathfinder.d.ts +2 -14
  62. package/dist/synapses/pathfinder.js +2 -49
  63. package/dist/synapses/pathfinder.js.map +1 -1
  64. package/dist/synapses/synapse-manager.d.ts +7 -23
  65. package/dist/synapses/synapse-manager.js +6 -63
  66. package/dist/synapses/synapse-manager.js.map +1 -1
  67. package/dist/types/ipc.types.d.ts +1 -11
  68. package/dist/utils/events.d.ts +4 -8
  69. package/dist/utils/events.js +2 -14
  70. package/dist/utils/events.js.map +1 -1
  71. package/dist/utils/hash.d.ts +1 -1
  72. package/dist/utils/hash.js +1 -4
  73. package/dist/utils/hash.js.map +1 -1
  74. package/dist/utils/logger.d.ts +3 -2
  75. package/dist/utils/logger.js +8 -35
  76. package/dist/utils/logger.js.map +1 -1
  77. package/dist/utils/paths.d.ts +2 -1
  78. package/dist/utils/paths.js +4 -13
  79. package/dist/utils/paths.js.map +1 -1
  80. package/eslint.config.js +14 -0
  81. package/package.json +9 -2
  82. package/.github/FUNDING.yml +0 -1
  83. package/.github/workflows/ci.yml +0 -27
  84. package/.mcp.json +0 -9
  85. package/src/api/server.ts +0 -86
  86. package/src/cli/colors.ts +0 -59
  87. package/src/cli/commands/campaign.ts +0 -66
  88. package/src/cli/commands/config.ts +0 -168
  89. package/src/cli/commands/dashboard.ts +0 -165
  90. package/src/cli/commands/doctor.ts +0 -110
  91. package/src/cli/commands/export.ts +0 -40
  92. package/src/cli/commands/import.ts +0 -84
  93. package/src/cli/commands/insights.ts +0 -44
  94. package/src/cli/commands/learn.ts +0 -24
  95. package/src/cli/commands/network.ts +0 -71
  96. package/src/cli/commands/post.ts +0 -47
  97. package/src/cli/commands/query.ts +0 -108
  98. package/src/cli/commands/rules.ts +0 -27
  99. package/src/cli/commands/start.ts +0 -100
  100. package/src/cli/commands/status.ts +0 -73
  101. package/src/cli/commands/stop.ts +0 -33
  102. package/src/cli/commands/suggest.ts +0 -64
  103. package/src/cli/ipc-helper.ts +0 -22
  104. package/src/cli/update-check.ts +0 -63
  105. package/src/config.ts +0 -110
  106. package/src/dashboard/renderer.ts +0 -136
  107. package/src/dashboard/server.ts +0 -140
  108. package/src/db/connection.ts +0 -22
  109. package/src/db/migrations/001_core_schema.ts +0 -63
  110. package/src/db/migrations/002_learning_schema.ts +0 -46
  111. package/src/db/migrations/003_synapse_schema.ts +0 -27
  112. package/src/db/migrations/004_insights_schema.ts +0 -38
  113. package/src/db/migrations/005_fts_indexes.ts +0 -77
  114. package/src/db/migrations/index.ts +0 -62
  115. package/src/db/repositories/audience.repository.ts +0 -53
  116. package/src/db/repositories/campaign.repository.ts +0 -72
  117. package/src/db/repositories/engagement.repository.ts +0 -108
  118. package/src/db/repositories/insight.repository.ts +0 -100
  119. package/src/db/repositories/post.repository.ts +0 -123
  120. package/src/db/repositories/rule.repository.ts +0 -87
  121. package/src/db/repositories/strategy.repository.ts +0 -82
  122. package/src/db/repositories/synapse.repository.ts +0 -148
  123. package/src/db/repositories/template.repository.ts +0 -76
  124. package/src/index.ts +0 -69
  125. package/src/ipc/__tests__/protocol.test.ts +0 -153
  126. package/src/ipc/client.ts +0 -110
  127. package/src/ipc/protocol.ts +0 -35
  128. package/src/ipc/router.ts +0 -126
  129. package/src/ipc/server.ts +0 -140
  130. package/src/learning/confidence-scorer.ts +0 -36
  131. package/src/learning/learning-engine.ts +0 -254
  132. package/src/marketing-core.ts +0 -285
  133. package/src/mcp/server.ts +0 -72
  134. package/src/mcp/tools.ts +0 -216
  135. package/src/research/research-engine.ts +0 -226
  136. package/src/services/analytics.service.ts +0 -73
  137. package/src/services/audience.service.ts +0 -40
  138. package/src/services/campaign.service.ts +0 -80
  139. package/src/services/insight.service.ts +0 -54
  140. package/src/services/post.service.ts +0 -116
  141. package/src/services/rule.service.ts +0 -90
  142. package/src/services/strategy.service.ts +0 -53
  143. package/src/services/synapse.service.ts +0 -32
  144. package/src/services/template.service.ts +0 -50
  145. package/src/synapses/activation.ts +0 -80
  146. package/src/synapses/decay.ts +0 -38
  147. package/src/synapses/hebbian.ts +0 -68
  148. package/src/synapses/pathfinder.ts +0 -81
  149. package/src/synapses/synapse-manager.ts +0 -115
  150. package/src/types/config.types.ts +0 -79
  151. package/src/types/ipc.types.ts +0 -8
  152. package/src/types/post.types.ts +0 -156
  153. package/src/types/synapse.types.ts +0 -43
  154. package/src/utils/__tests__/hash.test.ts +0 -39
  155. package/src/utils/__tests__/paths.test.ts +0 -70
  156. package/src/utils/events.ts +0 -44
  157. package/src/utils/hash.ts +0 -5
  158. package/src/utils/logger.ts +0 -48
  159. package/src/utils/paths.ts +0 -19
  160. package/tsconfig.json +0 -18
package/Dockerfile ADDED
@@ -0,0 +1,22 @@
1
+ FROM node:22-slim
2
+
3
+ # better-sqlite3 needs build tools
4
+ RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/*
5
+
6
+ WORKDIR /app
7
+
8
+ COPY package.json package-lock.json ./
9
+ RUN npm ci --omit=dev
10
+
11
+ COPY dist/ dist/
12
+ COPY dashboard.html ./
13
+ COPY package.json ./
14
+
15
+ # Data directory for marketing-brain.db
16
+ RUN mkdir -p /data
17
+ ENV MARKETING_BRAIN_DATA_DIR=/data
18
+
19
+ EXPOSE 7781 7782
20
+
21
+ ENTRYPOINT ["node", "dist/index.js"]
22
+ CMD ["mcp-server"]
package/README.md CHANGED
@@ -54,7 +54,7 @@ Without Marketing Brain, your marketing knowledge lives in your head. With it:
54
54
  - **Research Insights** — Tabbed view: Trends, Gaps, Synergies, Templates, Optimizations
55
55
  - **Real-Time Updates** — SSE-powered live stats refresh every 30 seconds
56
56
 
57
- ### MCP Tools (13 tools for Claude Code)
57
+ ### MCP Tools (17 tools for Claude Code)
58
58
  - **Draft Checking** — Check a post against learned rules before publishing
59
59
  - **Post Reporting** — Track published posts with one command
60
60
  - **Engagement Updates** — Feed in likes, shares, impressions as they come
@@ -133,6 +133,11 @@ marketing network --node post:42 Explore a specific node's connections
133
133
  marketing export Export all data as JSON
134
134
  ```
135
135
 
136
+ ### Ecosystem
137
+ ```
138
+ marketing peers Show status of peer brains in the ecosystem
139
+ ```
140
+
136
141
  ### Configuration
137
142
  ```
138
143
  marketing config show Show current configuration
@@ -191,6 +196,10 @@ These tools are available to Claude Code when Marketing Brain is configured:
191
196
  | `marketing_insight_list` | Get active insights (trends, gaps, synergies) |
192
197
  | `marketing_analytics_summary` | Full analytics overview |
193
198
  | `marketing_analytics_best` | Top performing posts and strategies |
199
+ | `marketing_ecosystem_status` | Get status of all brains in the ecosystem |
200
+ | `marketing_query_peer` | Query another brain in the ecosystem (method + params) |
201
+ | `marketing_cross_promote` | Pull Brain insights as content ideas for cross-promotion |
202
+ | `marketing_trading_performance` | Pull Trading Brain stats for performance-related posts |
194
203
 
195
204
  ## REST API
196
205
 
@@ -347,10 +356,18 @@ Marketing Brain is part of the **Brain Ecosystem** — a family of standalone MC
347
356
  | [Brain](https://github.com/timmeck/brain) | Error memory & code intelligence | 7777 / 7778 |
348
357
  | [Trading Brain](https://github.com/timmeck/trading-brain) | Adaptive trading intelligence | 7779 / 7780 |
349
358
  | **Marketing Brain** | Content strategy & engagement | **7781** / 7782 / 7783 |
350
- | [Brain Core](https://github.com/timmeck/brain-core) | Shared infrastructure (optional) | — |
359
+ | [Brain Core](https://github.com/timmeck/brain-core) v1.6.0 | Shared infrastructure (IPC, MCP, REST, CLI, math, synapses) | — |
351
360
  | [Brain Hub](https://timmeck.github.io/brain-hub/) | Ecosystem landing page | — |
352
361
 
353
- Each brain is **fully standalone** — [Brain Core](https://www.npmjs.com/package/@timmeck/brain-core) is an optional shared dependency that eliminates code duplication across brains.
362
+ Each brain is **fully standalone** — [Brain Core](https://www.npmjs.com/package/@timmeck/brain-core) provides shared infrastructure (IPC, MCP, REST API, CLI, math, synapse algorithms) used by all brains, eliminating ~2,800 lines of duplicated code.
363
+
364
+ ### Cross-Brain Communication
365
+
366
+ Brains discover and query each other at runtime via IPC named pipes. Use `marketing peers` to see online peers, or the `marketing_query_peer` / `marketing_ecosystem_status` MCP tools to access peer data from Claude Code. Use `marketing_cross_promote` to pull Brain insights as content ideas, or `marketing_trading_performance` to pull Trading Brain stats for performance posts. Brains also push event notifications — when Marketing Brain publishes a post or creates a campaign, peers are notified automatically.
367
+
368
+ ### Ecosystem Dashboard
369
+
370
+ The interactive HTML dashboard (`marketing dashboard`) includes an Ecosystem Peers section showing the live status of all connected brains.
354
371
 
355
372
  ## License
356
373
 
package/dashboard.html CHANGED
@@ -221,6 +221,7 @@
221
221
 
222
222
  <nav class="reveal reveal-delay-1">
223
223
  <a href="#stats">Stats</a>
224
+ <a href="#ecosystem">Ecosystem</a>
224
225
  <a href="#platforms">Platforms</a>
225
226
  <a href="#top-posts">Top Posts</a>
226
227
  <a href="#network">&#128300; Network</a>
@@ -240,6 +241,11 @@
240
241
  </div>
241
242
  </section>
242
243
 
244
+ <section id="ecosystem" class="reveal reveal-delay-3">
245
+ <div class="section-title"><div class="icon" style="background:rgba(61,255,160,.1)">&#127760;</div> Ecosystem Peers</div>
246
+ <div class="stats-grid">{{ECOSYSTEM_PEERS}}</div>
247
+ </section>
248
+
243
249
  <section id="platforms" class="reveal reveal-delay-3">
244
250
  <div class="section-title"><div class="icon" style="background:rgba(180,122,255,.1)">&#127760;</div> Platform Distribution</div>
245
251
  <div class="platform-chart">{{PLATFORM_CHART}}</div>
@@ -1,43 +1,30 @@
1
- export declare const c: {
2
- blue: import("chalk").ChalkInstance;
3
- purple: import("chalk").ChalkInstance;
4
- cyan: import("chalk").ChalkInstance;
5
- green: import("chalk").ChalkInstance;
6
- red: import("chalk").ChalkInstance;
7
- orange: import("chalk").ChalkInstance;
8
- dim: import("chalk").ChalkInstance;
9
- dimmer: import("chalk").ChalkInstance;
10
- label: import("chalk").ChalkInstance;
11
- value: import("chalk").ChalkInstance;
12
- heading: import("chalk").ChalkInstance;
13
- success: import("chalk").ChalkInstance;
14
- error: import("chalk").ChalkInstance;
15
- warn: import("chalk").ChalkInstance;
16
- info: import("chalk").ChalkInstance;
17
- };
1
+ import { c, header, keyValue, divider, table, stripAnsi } from '@timmeck/brain-core';
2
+ export { c, header, keyValue, divider, table, stripAnsi };
18
3
  export declare const icons: {
19
4
  megaphone: string;
5
+ post: string;
6
+ campaign: string;
7
+ rule: string;
8
+ template: string;
20
9
  check: string;
21
10
  cross: string;
22
11
  arrow: string;
23
12
  dot: string;
13
+ circle: string;
24
14
  bar: string;
25
15
  barLight: string;
26
16
  dash: string;
17
+ pipe: string;
18
+ corner: string;
19
+ tee: string;
27
20
  star: string;
28
21
  bolt: string;
22
+ gear: string;
29
23
  chart: string;
30
- post: string;
31
- campaign: string;
32
24
  synapse: string;
33
25
  insight: string;
34
- rule: string;
35
- template: string;
36
26
  warn: string;
37
27
  error: string;
38
28
  ok: string;
39
29
  clock: string;
40
30
  };
41
- export declare function header(title: string, icon?: string): string;
42
- export declare function keyValue(key: string, value: string | number, indent?: number): string;
43
- export declare function divider(width?: number): string;
@@ -1,54 +1,11 @@
1
- import chalk from 'chalk';
2
- export const c = {
3
- blue: chalk.hex('#5b9cff'),
4
- purple: chalk.hex('#b47aff'),
5
- cyan: chalk.hex('#47e5ff'),
6
- green: chalk.hex('#3dffa0'),
7
- red: chalk.hex('#ff5577'),
8
- orange: chalk.hex('#ffb347'),
9
- dim: chalk.hex('#8b8fb0'),
10
- dimmer: chalk.hex('#4a4d6e'),
11
- label: chalk.hex('#8b8fb0'),
12
- value: chalk.white.bold,
13
- heading: chalk.hex('#5b9cff').bold,
14
- success: chalk.hex('#3dffa0').bold,
15
- error: chalk.hex('#ff5577').bold,
16
- warn: chalk.hex('#ffb347').bold,
17
- info: chalk.hex('#47e5ff'),
18
- };
1
+ import { c, baseIcons, header, keyValue, divider, table, stripAnsi } from '@timmeck/brain-core';
2
+ export { c, header, keyValue, divider, table, stripAnsi };
19
3
  export const icons = {
4
+ ...baseIcons,
20
5
  megaphone: '📣',
21
- check: '✓',
22
- cross: '✗',
23
- arrow: '→',
24
- dot: '●',
25
- bar: '█',
26
- barLight: '░',
27
- dash: '─',
28
- star: '★',
29
- bolt: '⚡',
30
- chart: '📊',
31
6
  post: '📝',
32
7
  campaign: '🎯',
33
- synapse: '🔗',
34
- insight: '💡',
35
8
  rule: '📏',
36
9
  template: '📋',
37
- warn: '⚠',
38
- error: '❌',
39
- ok: '✅',
40
- clock: '⏱',
41
10
  };
42
- export function header(title, icon) {
43
- const prefix = icon ? `${icon} ` : '';
44
- const line = c.dimmer(icons.dash.repeat(40));
45
- return `\n${line}\n${prefix}${c.heading(title)}\n${line}`;
46
- }
47
- export function keyValue(key, value, indent = 2) {
48
- const pad = ' '.repeat(indent);
49
- return `${pad}${c.label(key + ':')} ${c.value(String(value))}`;
50
- }
51
- export function divider(width = 40) {
52
- return c.dimmer(icons.dash.repeat(width));
53
- }
54
11
  //# sourceMappingURL=colors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAC5B,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAC3B,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IACzB,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAC5B,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IACzB,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAE5B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;IACvB,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI;IAClC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI;IAClC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI;IAChC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI;IAC/B,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,SAAS,EAAE,IAAI;IACf,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,QAAQ,EAAE,GAAG;IACb,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,GAAG;IACV,EAAE,EAAE,GAAG;IACP,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,IAAa;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,OAAO,KAAK,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,KAAsB,EAAE,MAAM,GAAG,CAAC;IACtE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAK,GAAG,EAAE;IAChC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhG,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAE1D,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,GAAG,SAAS;IACZ,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;CACf,CAAC"}
@@ -127,6 +127,21 @@ export function dashboardCommand() {
127
127
  w: e.weight ?? 0.5,
128
128
  }));
129
129
  html = html.replace('{{GRAPH_EDGES}}', JSON.stringify(graphEdges));
130
+ // Ecosystem peers
131
+ let peersHtml = '';
132
+ try {
133
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
134
+ const eco = await client.request('ecosystem.status', {});
135
+ const peers = Array.isArray(eco?.peers) ? eco.peers : [];
136
+ for (const peer of peers) {
137
+ const r = peer.result ?? {};
138
+ peersHtml += `<div class="stat-card green"><div class="stat-number">${escapeHtml(r.version ?? '?')}</div><div class="stat-label">${escapeHtml(peer.name ?? '?')} (${r.methods ?? '?'} methods)</div></div>\n`;
139
+ }
140
+ }
141
+ catch { /* peers not available */ }
142
+ if (!peersHtml)
143
+ peersHtml = '<div class="stat-card"><div class="stat-number">0</div><div class="stat-label">No peers online</div></div>';
144
+ html = html.replace('{{ECOSYSTEM_PEERS}}', peersHtml);
130
145
  // Write output
131
146
  const outputPath = opts.output ?? path.join(process.env['TEMP'] ?? '/tmp', 'marketing-brain-dashboard.html');
132
147
  fs.writeFileSync(outputPath, html, 'utf-8');
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function peersCommand(): Command;
@@ -0,0 +1,38 @@
1
+ import { Command } from 'commander';
2
+ import { CrossBrainClient } from '@timmeck/brain-core';
3
+ import { c, icons, header, keyValue, divider } from '../colors.js';
4
+ export function peersCommand() {
5
+ return new Command('peers')
6
+ .description('Show status of peer brains in the ecosystem')
7
+ .action(async () => {
8
+ console.log(header('Brain Ecosystem', icons.synapse));
9
+ const cross = new CrossBrainClient('marketing-brain');
10
+ const peerNames = cross.getPeerNames();
11
+ console.log(` ${c.dim('Checking')} ${peerNames.length} ${c.dim('peers...')}\n`);
12
+ const available = await cross.getAvailablePeers();
13
+ const statuses = await cross.broadcast('status');
14
+ for (const name of peerNames) {
15
+ const isUp = available.includes(name);
16
+ const status = statuses.find(s => s.name === name);
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ const info = status?.result;
19
+ if (isUp && info) {
20
+ console.log(` ${icons.check} ${c.green.bold(name)} ${c.dim('— running')}`);
21
+ console.log(keyValue('Version', info.version ?? '?', 6));
22
+ console.log(keyValue('Uptime', `${info.uptime ?? 0}s`, 6));
23
+ console.log(keyValue('PID', info.pid ?? '?', 6));
24
+ console.log(keyValue('Methods', info.methods ?? '?', 6));
25
+ }
26
+ else if (isUp) {
27
+ console.log(` ${icons.check} ${c.green.bold(name)} ${c.dim('— running (no status)')}`);
28
+ }
29
+ else {
30
+ console.log(` ${icons.cross} ${c.dim(name)} ${c.red('— offline')}`);
31
+ }
32
+ console.log();
33
+ }
34
+ console.log(` ${c.label('Self:')} ${c.blue.bold('marketing-brain')} ${c.dim('(this instance)')}`);
35
+ console.log(`\n${divider()}`);
36
+ });
37
+ }
38
+ //# sourceMappingURL=peers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peers.js","sourceRoot":"","sources":["../../../src/cli/commands/peers.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import path from 'node:path';
2
- import fs from 'node:fs';
3
2
  import { getDataDir, getPipeName } from './utils/paths.js';
3
+ import { loadConfigFile } from '@timmeck/brain-core';
4
4
  const defaults = {
5
5
  dataDir: getDataDir(),
6
6
  dbPath: path.join(getDataDir(), 'marketing-brain.db'),
@@ -76,35 +76,8 @@ function applyEnvOverrides(config) {
76
76
  if (process.env['MARKETING_BRAIN_API_KEY'])
77
77
  config.api.apiKey = process.env['MARKETING_BRAIN_API_KEY'];
78
78
  }
79
- function deepMerge(target, source) {
80
- for (const key of Object.keys(source)) {
81
- const val = source[key];
82
- if (val && typeof val === 'object' && !Array.isArray(val) && target[key] && typeof target[key] === 'object') {
83
- deepMerge(target[key], val);
84
- }
85
- else if (val !== undefined) {
86
- target[key] = val;
87
- }
88
- }
89
- }
90
79
  export function loadConfig(configPath) {
91
- const config = structuredClone(defaults);
92
- if (configPath) {
93
- const filePath = path.resolve(configPath);
94
- if (fs.existsSync(filePath)) {
95
- const raw = fs.readFileSync(filePath, 'utf-8');
96
- const fileConfig = JSON.parse(raw);
97
- deepMerge(config, fileConfig);
98
- }
99
- }
100
- else {
101
- const defaultConfigPath = path.join(getDataDir(), 'config.json');
102
- if (fs.existsSync(defaultConfigPath)) {
103
- const raw = fs.readFileSync(defaultConfigPath, 'utf-8');
104
- const fileConfig = JSON.parse(raw);
105
- deepMerge(config, fileConfig);
106
- }
107
- }
80
+ const config = loadConfigFile(defaults, configPath, path.join(getDataDir(), 'config.json'));
108
81
  applyEnvOverrides(config);
109
82
  return config;
110
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1 @@
1
- import Database from 'better-sqlite3';
2
- export declare function createConnection(dbPath: string): Database.Database;
1
+ export { createConnection } from '@timmeck/brain-core';
@@ -1,19 +1,2 @@
1
- import Database from 'better-sqlite3';
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
- import { getLogger } from '../utils/logger.js';
5
- export function createConnection(dbPath) {
6
- const logger = getLogger();
7
- const dir = path.dirname(dbPath);
8
- if (!fs.existsSync(dir)) {
9
- fs.mkdirSync(dir, { recursive: true });
10
- }
11
- logger.info(`Opening database at ${dbPath}`);
12
- const db = new Database(dbPath);
13
- db.pragma('journal_mode = WAL');
14
- db.pragma('synchronous = NORMAL');
15
- db.pragma('cache_size = 10000');
16
- db.pragma('foreign_keys = ON');
17
- return db;
18
- }
1
+ export { createConnection } from '@timmeck/brain-core';
19
2
  //# sourceMappingURL=connection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAClC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env node
2
+ // PostToolUse hook for Bash tool — auto-detects marketing outcomes and reports to Marketing Brain
3
+ // Detects: post outcomes (published/failed), engagement metrics, API errors, campaign deployments
4
+ //
5
+ // Configured in .claude/settings.json:
6
+ // { "hooks": { "PostToolUse": [{ "matcher": { "tool_name": "Bash" }, "hooks": [{ "type": "command", "command": "npx tsx C:/Users/mecklenburg/Desktop/marketing-brain/src/hooks/post-tool-use.ts" }] }] } }
7
+ import { IpcClient } from '../ipc/client.js';
8
+ import { getPipeName } from '../utils/paths.js';
9
+ // ── Post Outcome Patterns ──────────────────────────────────
10
+ const POST_PUBLISHED_PATTERNS = [
11
+ // X / Twitter
12
+ /(?:tweet|post)\s+(?:published|posted|sent)\s+(?:successfully|to)\s+(twitter|x\.com|x)/i,
13
+ /(?:twitter|x)\s+post\s+id[:\s]+(\d+)/i,
14
+ // Reddit
15
+ /(?:post|submission)\s+(?:published|posted|created)\s+(?:to|on)\s+(?:r\/)?(\w+)/i,
16
+ /reddit\s+post\s+(?:url|link)[:\s]+(https?:\/\/\S+)/i,
17
+ // LinkedIn
18
+ /(?:post|article)\s+(?:published|shared)\s+(?:to|on)\s+linkedin/i,
19
+ // Generic
20
+ /(?:published|posted)\s+(?:successfully|to)\s+([\w/.]+)/i,
21
+ ];
22
+ const POST_FAILED_PATTERNS = [
23
+ /(?:failed to|couldn't|could not|error)\s+(?:publish|post|tweet|share)/i,
24
+ /rate\s+limit(?:ed)?\s+(?:hit|exceeded|reached)/i,
25
+ /(?:401|403|429)\s+(?:unauthorized|forbidden|too many requests)/i,
26
+ /auth(?:entication)?\s+(?:failed|expired|invalid)/i,
27
+ /token\s+(?:expired|invalid|revoked)/i,
28
+ ];
29
+ // ── Engagement Patterns ────────────────────────────────────
30
+ const ENGAGEMENT_PATTERNS = [
31
+ /(?:likes?|favorites?)[:\s]+(\d+)/i,
32
+ /(?:retweets?|reposts?|shares?)[:\s]+(\d+)/i,
33
+ /(?:replies?|comments?)[:\s]+(\d+)/i,
34
+ /(?:impressions?|views?|reach)[:\s]+(\d[\d,]*)/i,
35
+ /(?:clicks?|link\s+clicks?)[:\s]+(\d+)/i,
36
+ ];
37
+ // ── API Error Patterns ─────────────────────────────────────
38
+ const API_ERROR_PATTERNS = [
39
+ /rate\s+limit/i,
40
+ /auth(?:entication)?\s+(?:error|failed|expired)/i,
41
+ /(?:api|oauth)\s+(?:error|failure)/i,
42
+ /(?:connection|timeout)\s+(?:error|refused|timed out)/i,
43
+ ];
44
+ // ── Campaign Patterns ──────────────────────────────────────
45
+ const CAMPAIGN_PATTERNS = [
46
+ /campaign\s+['"]?([^'"]+)['"]?\s+(?:deployed|launched|started|activated)/i,
47
+ /(?:deployed|launched)\s+campaign\s+['"]?([^'"]+)['"]?/i,
48
+ ];
49
+ function detectPostOutcome(output) {
50
+ for (const pattern of POST_PUBLISHED_PATTERNS) {
51
+ const match = output.match(pattern);
52
+ if (match) {
53
+ const platform = detectPlatform(output, match[1] ?? '');
54
+ return { type: 'published', platform, identifier: match[1] };
55
+ }
56
+ }
57
+ for (const pattern of POST_FAILED_PATTERNS) {
58
+ if (pattern.test(output)) {
59
+ const platform = detectPlatform(output);
60
+ return { type: 'failed', platform };
61
+ }
62
+ }
63
+ return null;
64
+ }
65
+ function detectPlatform(output, hint = '') {
66
+ const text = `${output} ${hint}`.toLowerCase();
67
+ if (text.includes('twitter') || text.includes('x.com') || text.includes('tweet'))
68
+ return 'x';
69
+ if (text.includes('reddit') || text.includes('r/'))
70
+ return 'reddit';
71
+ if (text.includes('linkedin'))
72
+ return 'linkedin';
73
+ return 'unknown';
74
+ }
75
+ function extractEngagement(output) {
76
+ const data = {};
77
+ let found = false;
78
+ for (const pattern of ENGAGEMENT_PATTERNS) {
79
+ const match = output.match(pattern);
80
+ if (!match)
81
+ continue;
82
+ found = true;
83
+ const key = match[0].toLowerCase();
84
+ const value = parseInt(match[1].replace(/,/g, ''), 10);
85
+ if (key.includes('like') || key.includes('favorite'))
86
+ data.likes = value;
87
+ else if (key.includes('retweet') || key.includes('repost') || key.includes('share'))
88
+ data.shares = value;
89
+ else if (key.includes('repl') || key.includes('comment'))
90
+ data.replies = value;
91
+ else if (key.includes('impression') || key.includes('view') || key.includes('reach'))
92
+ data.impressions = value;
93
+ else if (key.includes('click'))
94
+ data.clicks = value;
95
+ }
96
+ return found ? data : null;
97
+ }
98
+ function detectApiError(output) {
99
+ for (const pattern of API_ERROR_PATTERNS) {
100
+ if (pattern.test(output)) {
101
+ const match = output.match(pattern);
102
+ return match?.[0] ?? 'API error detected';
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ function detectCampaign(output) {
108
+ for (const pattern of CAMPAIGN_PATTERNS) {
109
+ const match = output.match(pattern);
110
+ if (match)
111
+ return match[1] ?? null;
112
+ }
113
+ return null;
114
+ }
115
+ function readStdin() {
116
+ return new Promise((resolve) => {
117
+ let data = '';
118
+ process.stdin.setEncoding('utf8');
119
+ process.stdin.on('data', (chunk) => { data += chunk; });
120
+ process.stdin.on('end', () => resolve(data));
121
+ });
122
+ }
123
+ async function main() {
124
+ const raw = await readStdin();
125
+ if (!raw.trim())
126
+ return;
127
+ let input;
128
+ try {
129
+ input = JSON.parse(raw);
130
+ }
131
+ catch {
132
+ return;
133
+ }
134
+ const output = input.tool_output ?? input.tool_response?.stdout ?? '';
135
+ if (!output)
136
+ return;
137
+ // Detect what happened
138
+ const postOutcome = detectPostOutcome(output);
139
+ const engagement = extractEngagement(output);
140
+ const apiError = detectApiError(output);
141
+ const campaign = detectCampaign(output);
142
+ // Nothing interesting detected
143
+ if (!postOutcome && !engagement && !apiError && !campaign)
144
+ return;
145
+ const client = new IpcClient(getPipeName(), 3000);
146
+ try {
147
+ await client.connect();
148
+ // Report post outcome
149
+ if (postOutcome) {
150
+ if (postOutcome.type === 'published') {
151
+ process.stderr.write(`Marketing Brain: Post published on ${postOutcome.platform}\n`);
152
+ }
153
+ else {
154
+ process.stderr.write(`Marketing Brain: Post failed on ${postOutcome.platform}\n`);
155
+ }
156
+ }
157
+ // Report engagement metrics
158
+ if (engagement) {
159
+ const metrics = Object.entries(engagement)
160
+ .filter(([, v]) => v !== undefined)
161
+ .map(([k, v]) => `${k}: ${v}`)
162
+ .join(', ');
163
+ process.stderr.write(`Marketing Brain: Engagement detected (${metrics})\n`);
164
+ }
165
+ // Report API errors
166
+ if (apiError) {
167
+ process.stderr.write(`Marketing Brain: API issue — ${apiError}\n`);
168
+ }
169
+ // Report campaign deployment
170
+ if (campaign) {
171
+ process.stderr.write(`Marketing Brain: Campaign deployed — ${campaign}\n`);
172
+ }
173
+ }
174
+ catch {
175
+ // Hook must never block workflow
176
+ }
177
+ finally {
178
+ client.disconnect();
179
+ }
180
+ }
181
+ main();
182
+ //# sourceMappingURL=post-tool-use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hooks/post-tool-use.ts"],"names":[],"mappings":"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"}