@timmeck/marketing-brain 0.2.0 → 0.3.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 (130) hide show
  1. package/README.md +28 -13
  2. package/dist/cli/colors.d.ts +11 -24
  3. package/dist/cli/colors.js +3 -46
  4. package/dist/cli/colors.js.map +1 -1
  5. package/dist/cli/commands/dashboard.js +1 -1
  6. package/dist/cli/commands/peers.d.ts +2 -0
  7. package/dist/cli/commands/peers.js +38 -0
  8. package/dist/cli/commands/peers.js.map +1 -0
  9. package/dist/config.js +3 -3
  10. package/dist/db/connection.d.ts +1 -2
  11. package/dist/db/connection.js +1 -18
  12. package/dist/db/connection.js.map +1 -1
  13. package/dist/hooks/post-tool-use.d.ts +2 -0
  14. package/dist/hooks/post-tool-use.js +182 -0
  15. package/dist/hooks/post-tool-use.js.map +1 -0
  16. package/dist/index.js +2 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/ipc/__tests__/protocol.test.d.ts +1 -0
  19. package/dist/ipc/__tests__/protocol.test.js +129 -0
  20. package/dist/ipc/__tests__/protocol.test.js.map +1 -0
  21. package/dist/ipc/client.d.ts +1 -13
  22. package/dist/ipc/client.js +1 -92
  23. package/dist/ipc/client.js.map +1 -1
  24. package/dist/ipc/protocol.d.ts +1 -8
  25. package/dist/ipc/protocol.js +1 -28
  26. package/dist/ipc/protocol.js.map +1 -1
  27. package/dist/ipc/router.js +8 -0
  28. package/dist/ipc/router.js.map +1 -1
  29. package/dist/ipc/server.d.ts +1 -14
  30. package/dist/ipc/server.js +1 -129
  31. package/dist/ipc/server.js.map +1 -1
  32. package/dist/marketing-core.d.ts +1 -0
  33. package/dist/marketing-core.js +6 -1
  34. package/dist/marketing-core.js.map +1 -1
  35. package/dist/mcp/server.js +5 -60
  36. package/dist/mcp/server.js.map +1 -1
  37. package/dist/types/ipc.types.d.ts +1 -11
  38. package/dist/utils/__tests__/hash.test.d.ts +1 -0
  39. package/dist/utils/__tests__/hash.test.js +30 -0
  40. package/dist/utils/__tests__/hash.test.js.map +1 -0
  41. package/dist/utils/__tests__/paths.test.d.ts +1 -0
  42. package/dist/utils/__tests__/paths.test.js +63 -0
  43. package/dist/utils/__tests__/paths.test.js.map +1 -0
  44. package/dist/utils/events.d.ts +4 -8
  45. package/dist/utils/events.js +2 -14
  46. package/dist/utils/events.js.map +1 -1
  47. package/dist/utils/hash.d.ts +1 -1
  48. package/dist/utils/hash.js +1 -4
  49. package/dist/utils/hash.js.map +1 -1
  50. package/dist/utils/logger.d.ts +3 -2
  51. package/dist/utils/logger.js +8 -35
  52. package/dist/utils/logger.js.map +1 -1
  53. package/dist/utils/paths.d.ts +2 -1
  54. package/dist/utils/paths.js +4 -13
  55. package/dist/utils/paths.js.map +1 -1
  56. package/package.json +2 -1
  57. package/.mcp.json +0 -9
  58. package/src/api/server.ts +0 -86
  59. package/src/cli/colors.ts +0 -59
  60. package/src/cli/commands/campaign.ts +0 -66
  61. package/src/cli/commands/config.ts +0 -168
  62. package/src/cli/commands/dashboard.ts +0 -165
  63. package/src/cli/commands/doctor.ts +0 -110
  64. package/src/cli/commands/export.ts +0 -40
  65. package/src/cli/commands/import.ts +0 -84
  66. package/src/cli/commands/insights.ts +0 -44
  67. package/src/cli/commands/learn.ts +0 -24
  68. package/src/cli/commands/network.ts +0 -71
  69. package/src/cli/commands/post.ts +0 -47
  70. package/src/cli/commands/query.ts +0 -108
  71. package/src/cli/commands/rules.ts +0 -27
  72. package/src/cli/commands/start.ts +0 -100
  73. package/src/cli/commands/status.ts +0 -73
  74. package/src/cli/commands/stop.ts +0 -33
  75. package/src/cli/commands/suggest.ts +0 -64
  76. package/src/cli/ipc-helper.ts +0 -22
  77. package/src/cli/update-check.ts +0 -63
  78. package/src/config.ts +0 -110
  79. package/src/dashboard/renderer.ts +0 -136
  80. package/src/dashboard/server.ts +0 -140
  81. package/src/db/connection.ts +0 -22
  82. package/src/db/migrations/001_core_schema.ts +0 -63
  83. package/src/db/migrations/002_learning_schema.ts +0 -46
  84. package/src/db/migrations/003_synapse_schema.ts +0 -27
  85. package/src/db/migrations/004_insights_schema.ts +0 -38
  86. package/src/db/migrations/005_fts_indexes.ts +0 -77
  87. package/src/db/migrations/index.ts +0 -62
  88. package/src/db/repositories/audience.repository.ts +0 -53
  89. package/src/db/repositories/campaign.repository.ts +0 -72
  90. package/src/db/repositories/engagement.repository.ts +0 -108
  91. package/src/db/repositories/insight.repository.ts +0 -100
  92. package/src/db/repositories/post.repository.ts +0 -123
  93. package/src/db/repositories/rule.repository.ts +0 -87
  94. package/src/db/repositories/strategy.repository.ts +0 -82
  95. package/src/db/repositories/synapse.repository.ts +0 -148
  96. package/src/db/repositories/template.repository.ts +0 -76
  97. package/src/index.ts +0 -69
  98. package/src/ipc/client.ts +0 -110
  99. package/src/ipc/protocol.ts +0 -35
  100. package/src/ipc/router.ts +0 -126
  101. package/src/ipc/server.ts +0 -140
  102. package/src/learning/confidence-scorer.ts +0 -36
  103. package/src/learning/learning-engine.ts +0 -254
  104. package/src/marketing-core.ts +0 -285
  105. package/src/mcp/server.ts +0 -72
  106. package/src/mcp/tools.ts +0 -216
  107. package/src/research/research-engine.ts +0 -226
  108. package/src/services/analytics.service.ts +0 -73
  109. package/src/services/audience.service.ts +0 -40
  110. package/src/services/campaign.service.ts +0 -80
  111. package/src/services/insight.service.ts +0 -54
  112. package/src/services/post.service.ts +0 -116
  113. package/src/services/rule.service.ts +0 -90
  114. package/src/services/strategy.service.ts +0 -53
  115. package/src/services/synapse.service.ts +0 -32
  116. package/src/services/template.service.ts +0 -50
  117. package/src/synapses/activation.ts +0 -80
  118. package/src/synapses/decay.ts +0 -38
  119. package/src/synapses/hebbian.ts +0 -68
  120. package/src/synapses/pathfinder.ts +0 -81
  121. package/src/synapses/synapse-manager.ts +0 -115
  122. package/src/types/config.types.ts +0 -79
  123. package/src/types/ipc.types.ts +0 -8
  124. package/src/types/post.types.ts +0 -156
  125. package/src/types/synapse.types.ts +0 -43
  126. package/src/utils/events.ts +0 -44
  127. package/src/utils/hash.ts +0 -5
  128. package/src/utils/logger.ts +0 -48
  129. package/src/utils/paths.ts +0 -19
  130. package/tsconfig.json +0 -18
package/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Marketing Brain
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@timmeck/marketing-brain)](https://www.npmjs.com/package/@timmeck/marketing-brain)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@timmeck/marketing-brain)](https://www.npmjs.com/package/@timmeck/marketing-brain)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
+ [![GitHub stars](https://img.shields.io/github/stars/timmeck/marketing-brain)](https://github.com/timmeck/marketing-brain)
7
+
3
8
  **Self-Learning Marketing Intelligence System for Claude Code**
4
9
 
5
10
  Marketing Brain is an MCP server that gives Claude Code a persistent marketing memory. It tracks every post you publish, learns what works across platforms, and builds a Hebbian synapse network connecting posts, campaigns, strategies, templates, and insights. Over time, it learns your best-performing patterns and proactively suggests what to post, when, and where.
@@ -189,31 +194,31 @@ These tools are available to Claude Code when Marketing Brain is configured:
189
194
 
190
195
  ## REST API
191
196
 
192
- Marketing Brain includes a REST API on port 7780 (default).
197
+ Marketing Brain includes a REST API on port 7781 (default).
193
198
 
194
199
  ```bash
195
200
  # Health check
196
- curl http://localhost:7780/api/v1/health
201
+ curl http://localhost:7781/api/v1/health
197
202
 
198
203
  # List all available methods
199
- curl http://localhost:7780/api/v1/methods
204
+ curl http://localhost:7781/api/v1/methods
200
205
 
201
206
  # Call any method via RPC
202
- curl -X POST http://localhost:7780/api/v1/rpc \
207
+ curl -X POST http://localhost:7781/api/v1/rpc \
203
208
  -H "Content-Type: application/json" \
204
209
  -d '{"method": "analytics.summary", "params": {}}'
205
210
  ```
206
211
 
207
212
  ## Dashboard Server
208
213
 
209
- The daemon starts a live dashboard server on port 7782 (default).
214
+ The daemon starts a live dashboard server on port 7783 (default).
210
215
 
211
216
  ```bash
212
217
  # Open the dashboard in your browser
213
218
  marketing dashboard
214
219
 
215
220
  # Or visit directly while the daemon is running
216
- open http://localhost:7782
221
+ open http://localhost:7783
217
222
  ```
218
223
 
219
224
  Features:
@@ -235,7 +240,7 @@ Features:
235
240
  v v v
236
241
  +--------+---------+ +--------+---------+ +--------+---------+
237
242
  | MCP Server | | REST API | | Dashboard Server |
238
- | (stdio) | | (port 7780) | | (port 7782) |
243
+ | (stdio) | | (port 7781) | | (port 7783) |
239
244
  +--------+---------+ +--------+---------+ +--------+---------+
240
245
  | | |
241
246
  +----------+-------------+----------+-------------+
@@ -312,7 +317,7 @@ marketing config delete learning.intervalMs
312
317
  |---|---|---|
313
318
  | `MARKETING_BRAIN_DATA_DIR` | `~/.marketing-brain` | Data directory |
314
319
  | `MARKETING_BRAIN_LOG_LEVEL` | `info` | Log level |
315
- | `MARKETING_BRAIN_API_PORT` | `7780` | REST API port |
320
+ | `MARKETING_BRAIN_API_PORT` | `7781` | REST API port |
316
321
  | `MARKETING_BRAIN_API_KEY` | — | API authentication key |
317
322
  | `MARKETING_BRAIN_DB_PATH` | `~/.marketing-brain/marketing-brain.db` | Database path |
318
323
 
@@ -320,9 +325,9 @@ marketing config delete learning.intervalMs
320
325
 
321
326
  | Service | Default Port | Description |
322
327
  |---|---|---|
323
- | REST API | 7780 | JSON-RPC endpoint for integrations |
324
- | MCP HTTP | 7781 | MCP HTTP transport (optional) |
325
- | Dashboard | 7782 | Live dashboard with SSE |
328
+ | REST API | 7781 | JSON-RPC endpoint for integrations |
329
+ | MCP HTTP | 7782 | MCP HTTP transport (optional) |
330
+ | Dashboard | 7783 | Live dashboard with SSE |
326
331
 
327
332
  ## Tech Stack
328
333
 
@@ -333,9 +338,19 @@ marketing config delete learning.intervalMs
333
338
  - **Chalk** — Colored terminal output
334
339
  - **Winston** — Structured logging
335
340
 
336
- ## Related
341
+ ## Brain Ecosystem
342
+
343
+ Marketing Brain is part of the **Brain Ecosystem** — a family of standalone MCP servers that give Claude Code persistent, self-learning memory.
344
+
345
+ | Brain | Purpose | Ports |
346
+ |-------|---------|-------|
347
+ | [Brain](https://github.com/timmeck/brain) | Error memory & code intelligence | 7777 / 7778 |
348
+ | [Trading Brain](https://github.com/timmeck/trading-brain) | Adaptive trading intelligence | 7779 / 7780 |
349
+ | **Marketing Brain** | Content strategy & engagement | **7781** / 7782 / 7783 |
350
+ | [Brain Core](https://github.com/timmeck/brain-core) | Shared infrastructure (optional) | — |
351
+ | [Brain Hub](https://timmeck.github.io/brain-hub/) | Ecosystem landing page | — |
337
352
 
338
- - [Brain](https://github.com/timmeck/brain) Adaptive error memory & code intelligence (same architecture, applied to debugging)
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.
339
354
 
340
355
  ## License
341
356
 
@@ -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"}
@@ -15,7 +15,7 @@ export function dashboardCommand() {
15
15
  .option('-o, --output <path>', 'Output HTML file path')
16
16
  .option('--no-open', 'Generate HTML but do not open in browser')
17
17
  .option('-l, --live', 'Enable live mode (SSE updates from daemon)')
18
- .option('-p, --port <n>', 'Dashboard server port for live mode', '7781')
18
+ .option('-p, --port <n>', 'Dashboard server port for live mode', '7783')
19
19
  .action(async (opts) => {
20
20
  await withIpc(async (client) => {
21
21
  console.log(`${icons.chart} ${c.info('Generating dashboard...')}`);
@@ -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
@@ -9,15 +9,15 @@ const defaults = {
9
9
  timeout: 5000,
10
10
  },
11
11
  api: {
12
- port: 7780,
12
+ port: 7781,
13
13
  enabled: true,
14
14
  },
15
15
  mcpHttp: {
16
- port: 7781,
16
+ port: 7782,
17
17
  enabled: true,
18
18
  },
19
19
  dashboard: {
20
- port: 7782,
20
+ port: 7783,
21
21
  enabled: true,
22
22
  },
23
23
  learning: {
@@ -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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"}
package/dist/index.js CHANGED
@@ -16,6 +16,7 @@ import { learnCommand } from './cli/commands/learn.js';
16
16
  import { networkCommand } from './cli/commands/network.js';
17
17
  import { queryCommand } from './cli/commands/query.js';
18
18
  import { configCommand } from './cli/commands/config.js';
19
+ import { peersCommand } from './cli/commands/peers.js';
19
20
  import { checkForUpdate, getCurrentVersion } from './cli/update-check.js';
20
21
  const program = new Command();
21
22
  program
@@ -38,6 +39,7 @@ program.addCommand(learnCommand());
38
39
  program.addCommand(networkCommand());
39
40
  program.addCommand(queryCommand());
40
41
  program.addCommand(configCommand());
42
+ program.addCommand(peersCommand());
41
43
  // Hidden: MCP server (called by Claude Code)
42
44
  program
43
45
  .command('mcp-server')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};