@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.
- package/README.md +28 -13
- package/dist/cli/colors.d.ts +11 -24
- package/dist/cli/colors.js +3 -46
- package/dist/cli/colors.js.map +1 -1
- package/dist/cli/commands/dashboard.js +1 -1
- package/dist/cli/commands/peers.d.ts +2 -0
- package/dist/cli/commands/peers.js +38 -0
- package/dist/cli/commands/peers.js.map +1 -0
- package/dist/config.js +3 -3
- package/dist/db/connection.d.ts +1 -2
- package/dist/db/connection.js +1 -18
- package/dist/db/connection.js.map +1 -1
- package/dist/hooks/post-tool-use.d.ts +2 -0
- package/dist/hooks/post-tool-use.js +182 -0
- package/dist/hooks/post-tool-use.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/ipc/__tests__/protocol.test.d.ts +1 -0
- package/dist/ipc/__tests__/protocol.test.js +129 -0
- package/dist/ipc/__tests__/protocol.test.js.map +1 -0
- package/dist/ipc/client.d.ts +1 -13
- package/dist/ipc/client.js +1 -92
- package/dist/ipc/client.js.map +1 -1
- package/dist/ipc/protocol.d.ts +1 -8
- package/dist/ipc/protocol.js +1 -28
- package/dist/ipc/protocol.js.map +1 -1
- package/dist/ipc/router.js +8 -0
- package/dist/ipc/router.js.map +1 -1
- package/dist/ipc/server.d.ts +1 -14
- package/dist/ipc/server.js +1 -129
- package/dist/ipc/server.js.map +1 -1
- package/dist/marketing-core.d.ts +1 -0
- package/dist/marketing-core.js +6 -1
- package/dist/marketing-core.js.map +1 -1
- package/dist/mcp/server.js +5 -60
- package/dist/mcp/server.js.map +1 -1
- package/dist/types/ipc.types.d.ts +1 -11
- package/dist/utils/__tests__/hash.test.d.ts +1 -0
- package/dist/utils/__tests__/hash.test.js +30 -0
- package/dist/utils/__tests__/hash.test.js.map +1 -0
- package/dist/utils/__tests__/paths.test.d.ts +1 -0
- package/dist/utils/__tests__/paths.test.js +63 -0
- package/dist/utils/__tests__/paths.test.js.map +1 -0
- package/dist/utils/events.d.ts +4 -8
- package/dist/utils/events.js +2 -14
- package/dist/utils/events.js.map +1 -1
- package/dist/utils/hash.d.ts +1 -1
- package/dist/utils/hash.js +1 -4
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/logger.d.ts +3 -2
- package/dist/utils/logger.js +8 -35
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/paths.d.ts +2 -1
- package/dist/utils/paths.js +4 -13
- package/dist/utils/paths.js.map +1 -1
- package/package.json +2 -1
- package/.mcp.json +0 -9
- package/src/api/server.ts +0 -86
- package/src/cli/colors.ts +0 -59
- package/src/cli/commands/campaign.ts +0 -66
- package/src/cli/commands/config.ts +0 -168
- package/src/cli/commands/dashboard.ts +0 -165
- package/src/cli/commands/doctor.ts +0 -110
- package/src/cli/commands/export.ts +0 -40
- package/src/cli/commands/import.ts +0 -84
- package/src/cli/commands/insights.ts +0 -44
- package/src/cli/commands/learn.ts +0 -24
- package/src/cli/commands/network.ts +0 -71
- package/src/cli/commands/post.ts +0 -47
- package/src/cli/commands/query.ts +0 -108
- package/src/cli/commands/rules.ts +0 -27
- package/src/cli/commands/start.ts +0 -100
- package/src/cli/commands/status.ts +0 -73
- package/src/cli/commands/stop.ts +0 -33
- package/src/cli/commands/suggest.ts +0 -64
- package/src/cli/ipc-helper.ts +0 -22
- package/src/cli/update-check.ts +0 -63
- package/src/config.ts +0 -110
- package/src/dashboard/renderer.ts +0 -136
- package/src/dashboard/server.ts +0 -140
- package/src/db/connection.ts +0 -22
- package/src/db/migrations/001_core_schema.ts +0 -63
- package/src/db/migrations/002_learning_schema.ts +0 -46
- package/src/db/migrations/003_synapse_schema.ts +0 -27
- package/src/db/migrations/004_insights_schema.ts +0 -38
- package/src/db/migrations/005_fts_indexes.ts +0 -77
- package/src/db/migrations/index.ts +0 -62
- package/src/db/repositories/audience.repository.ts +0 -53
- package/src/db/repositories/campaign.repository.ts +0 -72
- package/src/db/repositories/engagement.repository.ts +0 -108
- package/src/db/repositories/insight.repository.ts +0 -100
- package/src/db/repositories/post.repository.ts +0 -123
- package/src/db/repositories/rule.repository.ts +0 -87
- package/src/db/repositories/strategy.repository.ts +0 -82
- package/src/db/repositories/synapse.repository.ts +0 -148
- package/src/db/repositories/template.repository.ts +0 -76
- package/src/index.ts +0 -69
- package/src/ipc/client.ts +0 -110
- package/src/ipc/protocol.ts +0 -35
- package/src/ipc/router.ts +0 -126
- package/src/ipc/server.ts +0 -140
- package/src/learning/confidence-scorer.ts +0 -36
- package/src/learning/learning-engine.ts +0 -254
- package/src/marketing-core.ts +0 -285
- package/src/mcp/server.ts +0 -72
- package/src/mcp/tools.ts +0 -216
- package/src/research/research-engine.ts +0 -226
- package/src/services/analytics.service.ts +0 -73
- package/src/services/audience.service.ts +0 -40
- package/src/services/campaign.service.ts +0 -80
- package/src/services/insight.service.ts +0 -54
- package/src/services/post.service.ts +0 -116
- package/src/services/rule.service.ts +0 -90
- package/src/services/strategy.service.ts +0 -53
- package/src/services/synapse.service.ts +0 -32
- package/src/services/template.service.ts +0 -50
- package/src/synapses/activation.ts +0 -80
- package/src/synapses/decay.ts +0 -38
- package/src/synapses/hebbian.ts +0 -68
- package/src/synapses/pathfinder.ts +0 -81
- package/src/synapses/synapse-manager.ts +0 -115
- package/src/types/config.types.ts +0 -79
- package/src/types/ipc.types.ts +0 -8
- package/src/types/post.types.ts +0 -156
- package/src/types/synapse.types.ts +0 -43
- package/src/utils/events.ts +0 -44
- package/src/utils/hash.ts +0 -5
- package/src/utils/logger.ts +0 -48
- package/src/utils/paths.ts +0 -19
- package/tsconfig.json +0 -18
package/README.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Marketing Brain
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@timmeck/marketing-brain)
|
|
4
|
+
[](https://www.npmjs.com/package/@timmeck/marketing-brain)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](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
|
|
197
|
+
Marketing Brain includes a REST API on port 7781 (default).
|
|
193
198
|
|
|
194
199
|
```bash
|
|
195
200
|
# Health check
|
|
196
|
-
curl http://localhost:
|
|
201
|
+
curl http://localhost:7781/api/v1/health
|
|
197
202
|
|
|
198
203
|
# List all available methods
|
|
199
|
-
curl http://localhost:
|
|
204
|
+
curl http://localhost:7781/api/v1/methods
|
|
200
205
|
|
|
201
206
|
# Call any method via RPC
|
|
202
|
-
curl -X POST http://localhost:
|
|
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
|
|
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:
|
|
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
|
|
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` | `
|
|
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 |
|
|
324
|
-
| MCP HTTP |
|
|
325
|
-
| Dashboard |
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
|
package/dist/cli/colors.d.ts
CHANGED
|
@@ -1,43 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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;
|
package/dist/cli/colors.js
CHANGED
|
@@ -1,54 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
export
|
|
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
|
package/dist/cli/colors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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', '
|
|
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,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:
|
|
12
|
+
port: 7781,
|
|
13
13
|
enabled: true,
|
|
14
14
|
},
|
|
15
15
|
mcpHttp: {
|
|
16
|
-
port:
|
|
16
|
+
port: 7782,
|
|
17
17
|
enabled: true,
|
|
18
18
|
},
|
|
19
19
|
dashboard: {
|
|
20
|
-
port:
|
|
20
|
+
port: 7783,
|
|
21
21
|
enabled: true,
|
|
22
22
|
},
|
|
23
23
|
learning: {
|
package/dist/db/connection.d.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function createConnection(dbPath: string): Database.Database;
|
|
1
|
+
export { createConnection } from '@timmeck/brain-core';
|
package/dist/db/connection.js
CHANGED
|
@@ -1,19 +1,2 @@
|
|
|
1
|
-
|
|
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,
|
|
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,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":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAEhC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|