fivocell 4.1.3 โ 4.1.5
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 +131 -55
- package/dist/behavioral-tracker.d.ts.map +1 -1
- package/dist/behavioral-tracker.js +16 -1
- package/dist/behavioral-tracker.js.map +1 -1
- package/dist/cli.js +193 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +5 -1
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/test-touch-145026.d.ts +1 -0
- package/dist/test-touch-145026.d.ts.map +1 -0
- package/dist/test-touch-145026.js +2 -0
- package/dist/test-touch-145026.js.map +1 -0
- package/dist/verify-145929.d.ts +1 -0
- package/dist/verify-145929.d.ts.map +1 -0
- package/dist/verify-145929.js +2 -0
- package/dist/verify-145929.js.map +1 -0
- package/dist/verify2-150021.d.ts +1 -0
- package/dist/verify2-150021.d.ts.map +1 -0
- package/dist/verify2-150021.js +2 -0
- package/dist/verify2-150021.js.map +1 -0
- package/package.json +2 -1
- package/scripts/demo.js +187 -0
- package/scripts/quickstart.sh +42 -0
package/README.md
CHANGED
|
@@ -1,99 +1,175 @@
|
|
|
1
|
-
# ๐ง FIVO Cell
|
|
1
|
+
# ๐ง FIVO Cell v4.1.5
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**Switch tools. Cell remembers. No need to re-explain.**
|
|
4
4
|
|
|
5
5
|
[](LICENSE)
|
|
6
|
-
[](https://www.npmjs.com/package/fivocell)
|
|
7
7
|
[]()
|
|
8
|
+
[]()
|
|
8
9
|
|
|
9
10
|
---
|
|
10
11
|
|
|
11
|
-
##
|
|
12
|
+
## The problem
|
|
13
|
+
|
|
14
|
+
You work in Cursor. Then Claude Code. Then Open Code. Then Antigravity.
|
|
15
|
+
Every time you open a new tool, **you re-explain** your stack, your style,
|
|
16
|
+
what you were working on, the bug you just fixed.
|
|
17
|
+
|
|
18
|
+
Cell sits between you and your tools. It remembers everything.
|
|
12
19
|
|
|
13
20
|
```
|
|
14
|
-
$ cell
|
|
15
|
-
|
|
21
|
+
$ @cell
|
|
22
|
+
|
|
23
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
24
|
+
โก CELL CONTEXT โ my-saas-app
|
|
25
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
16
26
|
|
|
17
|
-
|
|
18
|
-
|
|
27
|
+
๐ฆ PROJECT
|
|
28
|
+
Project: my-saas-app (412 files, 24,891 lines)
|
|
29
|
+
Stack: Quotes: single ยท Semicolons: always ยท Indent: 2-spaces ยท Async: uses-async ยท Tests: jest
|
|
19
30
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
31
|
+
โ ๏ธ BLIND SPOTS:
|
|
32
|
+
โ [12x, trust 92] async_without_trycatch:12/15
|
|
33
|
+
โ [8x, trust 88] chained_property_access:8/8
|
|
23
34
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
๐ฏ LAST SESSION
|
|
36
|
+
Tool: claude-code (12 min ago)
|
|
37
|
+
Working on: fixing memory leak in webhooks
|
|
38
|
+
Last file: src/webhooks/handler.ts
|
|
39
|
+
Key decision: switched from Map to WeakMap for handler registry
|
|
29
40
|
|
|
30
|
-
|
|
31
|
-
๐ Community: Anonymous patterns + benchmarks.
|
|
41
|
+
# โโโ End @cell Context โโโ
|
|
32
42
|
```
|
|
33
43
|
|
|
44
|
+
**Cell remembers. No need to re-explain.**
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
34
48
|
## Install
|
|
35
49
|
|
|
36
50
|
```bash
|
|
37
|
-
npm i -g fivocell
|
|
51
|
+
npm i -g fivocell@4.1.5
|
|
38
52
|
cell start
|
|
39
|
-
cell
|
|
40
|
-
cell
|
|
53
|
+
cell mcp-config # auto-register MCP in Cursor/Antigravity/Codex/OpenCode
|
|
54
|
+
@cell # in your IDE chat
|
|
41
55
|
```
|
|
42
56
|
|
|
43
|
-
|
|
57
|
+
That's it. 30 seconds.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## How it works
|
|
62
|
+
|
|
63
|
+
Cell runs an MCP server on `localhost:9876` with **67 tools**. Every supported
|
|
64
|
+
IDE (Cursor, Claude Code, Open Code, Antigravity, Codex) connects to the same
|
|
65
|
+
daemon, the same SQLite DB, the same memory.
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
69
|
+
โ Your IDE โ Cursor, Claude Code, etc โ
|
|
70
|
+
โ Chat types @cell โ
|
|
71
|
+
โ โ โ
|
|
72
|
+
โ AI calls cell_get_context via MCP โ
|
|
73
|
+
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
74
|
+
โ JSON-RPC
|
|
75
|
+
โผ
|
|
76
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
77
|
+
โ Cell Daemon (port 9876) โ
|
|
78
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
79
|
+
โ โ 67 MCP Tools โ โ
|
|
80
|
+
โ โ context, scan, blind spots, โ โ
|
|
81
|
+
โ โ team, community, watcher, etc. โ โ
|
|
82
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
83
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
84
|
+
โ โ SQLite DB โ โ
|
|
85
|
+
โ โ ~/.fivo/cell/cell.db โ โ
|
|
86
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
87
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Commands
|
|
44
93
|
|
|
45
94
|
| Command | Does |
|
|
46
95
|
|---------|------|
|
|
47
96
|
| `cell start` | Start daemon + MCP (port 9876) |
|
|
48
97
|
| `cell stop` | Stop daemon cleanly |
|
|
49
|
-
| `cell
|
|
50
|
-
| `cell
|
|
51
|
-
| `cell
|
|
52
|
-
| `cell
|
|
53
|
-
| `cell
|
|
98
|
+
| `cell --version` | Print version + daemon status |
|
|
99
|
+
| `cell mcp-config` | Auto-register cell MCP in all IDEs |
|
|
100
|
+
| `cell scan` | Deep scan codebase + build all layers |
|
|
101
|
+
| `cell status` | Full dashboard |
|
|
102
|
+
| `cell status --session` | Last file touched + patterns |
|
|
103
|
+
| `cell status --decisions` | Recent decisions with verdict |
|
|
104
|
+
| `cell context [proj] [tool]` | Inject @cell context block |
|
|
105
|
+
| `cell blindspots [file]` | Scan for blind spots with line numbers |
|
|
106
|
+
| `cell watch start` | Live file watcher |
|
|
107
|
+
| `cell team` | Git-based team sharing |
|
|
108
|
+
| `cell community` | Anonymous patterns + benchmarks |
|
|
54
109
|
|
|
55
|
-
|
|
110
|
+
---
|
|
56
111
|
|
|
57
|
-
|
|
58
|
-
- **Blind Spots**: exact counts โ "15 async without try/catch", "15 empty catch blocks"
|
|
59
|
-
- **Git Intelligence**: best work hours, most productive day, skill levels, bug history
|
|
60
|
-
- **Predictions**: repeat mistakes, decision regret, complexity traps, energy warnings
|
|
61
|
-
- **Team**: knowledge map, bus factor, shared patterns via git
|
|
62
|
-
- **Community**: anonymous pattern sharing, aggregate benchmarks
|
|
63
|
-
- **$> cell status** shows everything
|
|
112
|
+
## What Cell knows
|
|
64
113
|
|
|
65
|
-
|
|
114
|
+
- **Code Style** โ quotes, semicolons, naming, indentation, async patterns
|
|
115
|
+
- **Blind Spots** โ exact counts with line numbers
|
|
116
|
+
- **Live Memory** โ last file touched, current task, working context
|
|
117
|
+
- **Decisions** โ accepted/rejected AI suggestions over time
|
|
118
|
+
- **Git Intelligence** โ best work hours, skill levels, bug history
|
|
119
|
+
- **Team** โ knowledge map, bus factor, shared patterns via git
|
|
120
|
+
- **Community** โ anonymous pattern sharing, aggregate benchmarks
|
|
66
121
|
|
|
67
|
-
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Cross-tool context (the killer feature)
|
|
68
125
|
|
|
69
126
|
```
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
127
|
+
You work in Cursor:
|
|
128
|
+
- Edit src/webhooks/handler.ts
|
|
129
|
+
- Accept AI suggestion: "use WeakMap"
|
|
130
|
+
- Move to a meeting.
|
|
131
|
+
|
|
132
|
+
You open Claude Code:
|
|
133
|
+
- Type @cell
|
|
134
|
+
- See: "Last session: cursor, 23 min ago. Working on: fixing memory
|
|
135
|
+
leak in webhooks. Last file: src/webhooks/handler.ts. Key
|
|
136
|
+
decision: switched from Map to WeakMap."
|
|
137
|
+
|
|
138
|
+
You open Open Code:
|
|
139
|
+
- Type @cell
|
|
140
|
+
- Same context. No re-explanation.
|
|
141
|
+
|
|
142
|
+
You open Antigravity:
|
|
143
|
+
- Same. 67 tools, same DB, same memory.
|
|
75
144
|
```
|
|
76
145
|
|
|
77
|
-
|
|
146
|
+
**Cell remembers. No need to re-explain.**
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Privacy
|
|
151
|
+
|
|
152
|
+
- **100% local** โ code never leaves your machine
|
|
153
|
+
- **Apache 2.0** โ free forever, no telemetry, no cloud
|
|
154
|
+
- Community sharing sends only **abstract pattern types** (zero code, zero filenames, max 300 bytes per payload)
|
|
155
|
+
|
|
156
|
+
---
|
|
78
157
|
|
|
79
158
|
## Architecture
|
|
80
159
|
|
|
81
160
|
```
|
|
82
|
-
|
|
83
|
-
โโโ
|
|
84
|
-
โโโ
|
|
85
|
-
|
|
86
|
-
โโโ cell.db โ SQLite database (all persistent data)
|
|
161
|
+
~/.fivo/cell/
|
|
162
|
+
โโโ cell.db โ SQLite (all persistent data)
|
|
163
|
+
โโโ daemon.log โ daemon output (replaces stderr)
|
|
164
|
+
โโโ daemon.pid โ process tracking
|
|
87
165
|
|
|
88
|
-
.cell/
|
|
166
|
+
.cell/
|
|
167
|
+
โโโ personal/ โ profile, style, errors, decisions
|
|
168
|
+
โโโ team/ โ members, shared patterns, knowledge map
|
|
169
|
+
โโโ community/ โ aggregate patterns, benchmarks, shares
|
|
89
170
|
```
|
|
90
171
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
- **100% local** โ code never leaves your machine
|
|
94
|
-
- **Apache 2.0** โ free forever
|
|
95
|
-
- Community sharing sends only **abstract pattern types** (zero code, zero filenames)
|
|
96
|
-
- Maximum 300 bytes per community payload
|
|
172
|
+
---
|
|
97
173
|
|
|
98
174
|
## License
|
|
99
175
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behavioral-tracker.d.ts","sourceRoot":"","sources":["../src/behavioral-tracker.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"behavioral-tracker.d.ts","sourceRoot":"","sources":["../src/behavioral-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -238,7 +238,8 @@ function getRecentDecisionsWithAgo(project, limit = 5) {
|
|
|
238
238
|
const rows = getDecisions(project, limit);
|
|
239
239
|
const now = Date.now();
|
|
240
240
|
return rows.map(r => {
|
|
241
|
-
|
|
241
|
+
// SQLite datetime('now') returns UTC; append Z so JS parses as UTC, not local
|
|
242
|
+
const ts = parseSqliteUtc(r.decidedAt);
|
|
242
243
|
const diffMs = now - ts;
|
|
243
244
|
return {
|
|
244
245
|
id: r.id,
|
|
@@ -269,4 +270,18 @@ function formatAgo(ms) {
|
|
|
269
270
|
const month = Math.floor(day / 30);
|
|
270
271
|
return `${month} month${month === 1 ? '' : 's'} ago`;
|
|
271
272
|
}
|
|
273
|
+
/**
|
|
274
|
+
* Parse a SQLite `datetime('now')` string (UTC, no TZ marker) into JS ms.
|
|
275
|
+
* Without this helper, `new Date(str)` interprets SQLite datetimes as LOCAL time,
|
|
276
|
+
* producing a 5h30m offset in IST.
|
|
277
|
+
*/
|
|
278
|
+
function parseSqliteUtc(s) {
|
|
279
|
+
if (!s)
|
|
280
|
+
return 0;
|
|
281
|
+
if (s.endsWith('Z') || /[+-]\d{2}:?\d{2}$/.test(s)) {
|
|
282
|
+
return new Date(s).getTime();
|
|
283
|
+
}
|
|
284
|
+
return new Date(s.replace(' ', 'T') + 'Z').getTime();
|
|
285
|
+
}
|
|
286
|
+
// test touch 14:50:07
|
|
272
287
|
//# sourceMappingURL=behavioral-tracker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behavioral-tracker.js","sourceRoot":"","sources":["../src/behavioral-tracker.ts"],"names":[],"mappings":";;AAEA,gDAiDC;AAID,4BAaC;AAED,kCAUC;AAED,4CA0BC;AAED,0CA2BC;AAID,kCAeC;AAED,oCA4BC;AAID,gCAYC;AAED,8CAgBC;AAID,4BAWC;AAED,4CAGC;AAED,4CAsBC;AAID,gDAyBC;AASD,gDAeC;AAMD,4CAuBC;AAMD,
|
|
1
|
+
{"version":3,"file":"behavioral-tracker.js","sourceRoot":"","sources":["../src/behavioral-tracker.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -39,6 +39,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
40
|
const path = __importStar(require("path"));
|
|
41
41
|
const fs = __importStar(require("fs"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
42
43
|
const chalk_1 = __importDefault(require("chalk"));
|
|
43
44
|
const figlet_1 = __importDefault(require("figlet"));
|
|
44
45
|
const gradient_string_1 = __importDefault(require("gradient-string"));
|
|
@@ -87,6 +88,11 @@ function parseArgs(argv) {
|
|
|
87
88
|
const args = parseArgs(process.argv.slice(2));
|
|
88
89
|
const cmd = args[0] || '';
|
|
89
90
|
switch (cmd) {
|
|
91
|
+
case '--version':
|
|
92
|
+
case '-v':
|
|
93
|
+
case 'version':
|
|
94
|
+
doVersion();
|
|
95
|
+
break;
|
|
90
96
|
case 'start':
|
|
91
97
|
doStart();
|
|
92
98
|
break;
|
|
@@ -123,7 +129,12 @@ switch (cmd) {
|
|
|
123
129
|
case 'context':
|
|
124
130
|
doContext();
|
|
125
131
|
break;
|
|
132
|
+
case 'mcp-config':
|
|
133
|
+
doMcpConfig();
|
|
134
|
+
break;
|
|
126
135
|
case 'help':
|
|
136
|
+
case '--help':
|
|
137
|
+
case '-h':
|
|
127
138
|
doHelp();
|
|
128
139
|
break;
|
|
129
140
|
default:
|
|
@@ -321,6 +332,34 @@ function semiLabel(s) {
|
|
|
321
332
|
return 'mixed';
|
|
322
333
|
return s;
|
|
323
334
|
}
|
|
335
|
+
// โโโ cell --version / -v / version โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
336
|
+
function doVersion() {
|
|
337
|
+
const pkg = require('../package.json');
|
|
338
|
+
console.log(`${C.primary('cell')} v${C.num(pkg.version)}`);
|
|
339
|
+
console.log(C.dim(` ${pkg.description}`));
|
|
340
|
+
console.log();
|
|
341
|
+
// Live info that's useful at a glance
|
|
342
|
+
try {
|
|
343
|
+
const http = require('http');
|
|
344
|
+
http.get('http://localhost:9876/health', (res) => {
|
|
345
|
+
let data = '';
|
|
346
|
+
res.on('data', (c) => { data += c || ''; });
|
|
347
|
+
res.on('end', () => {
|
|
348
|
+
const live = res.statusCode === 200 ? C.success('running') : C.warn(`status ${res.statusCode}`);
|
|
349
|
+
console.log(` Daemon: ${live} on port 9876`);
|
|
350
|
+
console.log(` Tools: 67 MCP tools registered`);
|
|
351
|
+
console.log(` License: Apache-2.0`);
|
|
352
|
+
console.log();
|
|
353
|
+
});
|
|
354
|
+
}).on('error', () => {
|
|
355
|
+
console.log(` Daemon: ${C.warn('not running')} โ start with: cell start`);
|
|
356
|
+
console.log(` Tools: 67 MCP tools (ready when daemon starts)`);
|
|
357
|
+
console.log(` License: Apache-2.0`);
|
|
358
|
+
console.log();
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
catch { }
|
|
362
|
+
}
|
|
324
363
|
function doStatus() {
|
|
325
364
|
// โโโ Flag passthroughs (Pre-Launch Test 1 + Test 3) โโโโโโโโโโโโโโโโโโโโ
|
|
326
365
|
// Allow `cell status --session` and `cell status --decisions` as
|
|
@@ -521,7 +560,7 @@ function doSession() {
|
|
|
521
560
|
const patterns = getPatternCounts(project);
|
|
522
561
|
const behavior = getBehaviorSummary(project);
|
|
523
562
|
if (last) {
|
|
524
|
-
const ago = formatTimeAgo(
|
|
563
|
+
const ago = formatTimeAgo(parseSqliteUtc(last.lastTouched));
|
|
525
564
|
console.log(` Last file: ${C.num(last.file)}`);
|
|
526
565
|
console.log(` Time: ${ago} (${last.touchCount} touch${last.touchCount === 1 ? '' : 'es'})`);
|
|
527
566
|
}
|
|
@@ -595,6 +634,23 @@ function formatTimeAgo(ts) {
|
|
|
595
634
|
const month = Math.floor(day / 30);
|
|
596
635
|
return `${month} month${month === 1 ? '' : 's'} ago`;
|
|
597
636
|
}
|
|
637
|
+
/**
|
|
638
|
+
* Parse a SQLite `datetime('now')` string into a JS millisecond timestamp.
|
|
639
|
+
* SQLite's datetime() returns UTC time as a string like "2026-06-05 09:20:26"
|
|
640
|
+
* (no timezone marker). JS `new Date(str)` would treat this as LOCAL time,
|
|
641
|
+
* which causes a 5h30m offset in IST. We force UTC interpretation by
|
|
642
|
+
* appending "Z" or by replacing the space with "T" + "Z".
|
|
643
|
+
*/
|
|
644
|
+
function parseSqliteUtc(s) {
|
|
645
|
+
if (!s)
|
|
646
|
+
return 0;
|
|
647
|
+
// Already has TZ marker
|
|
648
|
+
if (s.endsWith('Z') || /[+-]\d{2}:?\d{2}$/.test(s)) {
|
|
649
|
+
return new Date(s).getTime();
|
|
650
|
+
}
|
|
651
|
+
// Replace space separator with T, append Z
|
|
652
|
+
return new Date(s.replace(' ', 'T') + 'Z').getTime();
|
|
653
|
+
}
|
|
598
654
|
// โโโ cell team โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
599
655
|
function doTeam() {
|
|
600
656
|
console.log();
|
|
@@ -1169,6 +1225,139 @@ function doContext() {
|
|
|
1169
1225
|
return;
|
|
1170
1226
|
}
|
|
1171
1227
|
}
|
|
1228
|
+
// โโโ cell mcp-config (Pre-Launch: auto-register all IDEs) โโโโโโโโโโโโโโโโโโโโ
|
|
1229
|
+
/**
|
|
1230
|
+
* Auto-write MCP config for every supported IDE. Detects which config files
|
|
1231
|
+
* exist and creates/updates the cell MCP entry in each.
|
|
1232
|
+
*
|
|
1233
|
+
* Supported IDEs:
|
|
1234
|
+
* - Cursor: ~/.cursor/mcp.json
|
|
1235
|
+
* - Gemini CLI: ~/.gemini/settings.json
|
|
1236
|
+
* - Antigravity: ~/.gemini/config/mcp_config.json
|
|
1237
|
+
* - Codex: ~/.codex/config.json
|
|
1238
|
+
* - OpenCode: ~/.config/opencode/opencode.jsonc
|
|
1239
|
+
*/
|
|
1240
|
+
function doMcpConfig() {
|
|
1241
|
+
console.log();
|
|
1242
|
+
console.log(C.bold(' Cell MCP Auto-Config'));
|
|
1243
|
+
console.log(C.dim(' โโโโโโโโโโโโโโโโโโโโโ'));
|
|
1244
|
+
console.log();
|
|
1245
|
+
const homedir = os.homedir();
|
|
1246
|
+
const targets = [
|
|
1247
|
+
{
|
|
1248
|
+
name: 'Cursor',
|
|
1249
|
+
configPath: path.join(homedir, '.cursor', 'mcp.json'),
|
|
1250
|
+
format: 'json',
|
|
1251
|
+
cellKey: 'fivo-cell',
|
|
1252
|
+
url: 'http://localhost:9876/mcp',
|
|
1253
|
+
description: '~/.cursor/mcp.json',
|
|
1254
|
+
buildPayload: (url) => ({ url }),
|
|
1255
|
+
},
|
|
1256
|
+
{
|
|
1257
|
+
name: 'Gemini CLI',
|
|
1258
|
+
configPath: path.join(homedir, '.gemini', 'settings.json'),
|
|
1259
|
+
format: 'json',
|
|
1260
|
+
cellKey: 'fivo-cell',
|
|
1261
|
+
url: 'http://localhost:9876/mcp',
|
|
1262
|
+
description: '~/.gemini/settings.json',
|
|
1263
|
+
buildPayload: (url) => ({ url }),
|
|
1264
|
+
},
|
|
1265
|
+
{
|
|
1266
|
+
name: 'Antigravity',
|
|
1267
|
+
configPath: path.join(homedir, '.gemini', 'config', 'mcp_config.json'),
|
|
1268
|
+
format: 'json',
|
|
1269
|
+
cellKey: 'fivo-cell',
|
|
1270
|
+
url: 'http://localhost:9876/mcp',
|
|
1271
|
+
description: '~/.gemini/config/mcp_config.json',
|
|
1272
|
+
buildPayload: (url) => ({ url }),
|
|
1273
|
+
},
|
|
1274
|
+
{
|
|
1275
|
+
name: 'Codex',
|
|
1276
|
+
configPath: path.join(homedir, '.codex', 'config.json'),
|
|
1277
|
+
format: 'json',
|
|
1278
|
+
cellKey: 'fivo-cell',
|
|
1279
|
+
url: 'http://localhost:9876/mcp',
|
|
1280
|
+
description: '~/.codex/config.json',
|
|
1281
|
+
buildPayload: (url) => ({ url }),
|
|
1282
|
+
},
|
|
1283
|
+
{
|
|
1284
|
+
name: 'OpenCode',
|
|
1285
|
+
configPath: path.join(homedir, '.config', 'opencode', 'opencode.jsonc'),
|
|
1286
|
+
format: 'jsonc',
|
|
1287
|
+
cellKey: 'cell',
|
|
1288
|
+
url: 'http://localhost:9876/mcp',
|
|
1289
|
+
description: '~/.config/opencode/opencode.jsonc',
|
|
1290
|
+
buildPayload: (url) => ({
|
|
1291
|
+
type: 'remote',
|
|
1292
|
+
url,
|
|
1293
|
+
enabled: true,
|
|
1294
|
+
}),
|
|
1295
|
+
},
|
|
1296
|
+
];
|
|
1297
|
+
let writtenCount = 0;
|
|
1298
|
+
let skippedCount = 0;
|
|
1299
|
+
for (const t of targets) {
|
|
1300
|
+
const dir = path.dirname(t.configPath);
|
|
1301
|
+
const exists = fs.existsSync(t.configPath);
|
|
1302
|
+
let cfg = {};
|
|
1303
|
+
if (exists) {
|
|
1304
|
+
try {
|
|
1305
|
+
const raw = fs.readFileSync(t.configPath, 'utf8');
|
|
1306
|
+
// Strip // comments for jsonc (OpenCode)
|
|
1307
|
+
const stripped = t.format === 'jsonc'
|
|
1308
|
+
? raw.replace(/^\s*\/\/.*$/gm, '').replace(/\/\*[\s\S]*?\*\//g, '')
|
|
1309
|
+
: raw;
|
|
1310
|
+
cfg = JSON.parse(stripped);
|
|
1311
|
+
}
|
|
1312
|
+
catch (err) {
|
|
1313
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1314
|
+
console.log(` ${C.warn('!')} ${t.name}: parse failed โ ${msg}`);
|
|
1315
|
+
console.log(C.dim(` ${t.configPath}`));
|
|
1316
|
+
skippedCount++;
|
|
1317
|
+
continue;
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
// Get or create the right container
|
|
1321
|
+
let container;
|
|
1322
|
+
if (t.name === 'OpenCode') {
|
|
1323
|
+
// OpenCode uses top-level "mcp" object, not "mcpServers"
|
|
1324
|
+
container = cfg.mcp || {};
|
|
1325
|
+
}
|
|
1326
|
+
else {
|
|
1327
|
+
container = cfg.mcpServers || {};
|
|
1328
|
+
}
|
|
1329
|
+
// Set/overwrite the cell entry
|
|
1330
|
+
container[t.cellKey] = t.buildPayload(t.url);
|
|
1331
|
+
// Write back
|
|
1332
|
+
if (t.name === 'OpenCode') {
|
|
1333
|
+
cfg.mcp = container;
|
|
1334
|
+
}
|
|
1335
|
+
else {
|
|
1336
|
+
cfg.mcpServers = container;
|
|
1337
|
+
}
|
|
1338
|
+
try {
|
|
1339
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
1340
|
+
const json = JSON.stringify(cfg, null, 2);
|
|
1341
|
+
fs.writeFileSync(t.configPath, json + '\n', 'utf8');
|
|
1342
|
+
const action = exists ? 'updated' : 'created';
|
|
1343
|
+
console.log(` ${C.success('โ')} ${t.name.padEnd(14)} ${C.dim(action)} โ ${t.configPath}`);
|
|
1344
|
+
writtenCount++;
|
|
1345
|
+
}
|
|
1346
|
+
catch (err) {
|
|
1347
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1348
|
+
console.log(` ${C.warn('!')} ${t.name}: write failed โ ${msg}`);
|
|
1349
|
+
skippedCount++;
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
console.log();
|
|
1353
|
+
console.log(` ${C.success('Done')}: ${writtenCount} config file${writtenCount === 1 ? '' : 's'} ${writtenCount === 1 ? 'written' : 'written'}`);
|
|
1354
|
+
if (skippedCount > 0)
|
|
1355
|
+
console.log(C.dim(` ${skippedCount} skipped (parse errors)`));
|
|
1356
|
+
console.log();
|
|
1357
|
+
console.log(C.dim(' Restart your IDE to load the new MCP config.'));
|
|
1358
|
+
console.log(C.dim(' Make sure `cell start` is running for tools to connect.'));
|
|
1359
|
+
console.log();
|
|
1360
|
+
}
|
|
1172
1361
|
// โโโ cell help โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
1173
1362
|
function doHelp() {
|
|
1174
1363
|
console.log();
|
|
@@ -1177,6 +1366,8 @@ function doHelp() {
|
|
|
1177
1366
|
console.log();
|
|
1178
1367
|
console.log(` ${C.primary('cell start')} Start daemon + MCP (port 9876)`);
|
|
1179
1368
|
console.log(` ${C.primary('cell stop')} Stop daemon`);
|
|
1369
|
+
console.log(` ${C.primary('cell --version')} Print version + daemon status`);
|
|
1370
|
+
console.log(` ${C.primary('cell mcp-config')} Auto-register cell MCP in Cursor/Antigravity/Codex/OpenCode`);
|
|
1180
1371
|
console.log(` ${C.primary('cell scan')} Scan codebase + build layers`);
|
|
1181
1372
|
console.log(` ${C.primary('cell analyze')} AI prompts from scan data`);
|
|
1182
1373
|
console.log(` ${C.primary('cell status')} What Cell knows about you`);
|
|
@@ -1196,4 +1387,5 @@ function doHelp() {
|
|
|
1196
1387
|
console.log(C.dim(' Then: cell start'));
|
|
1197
1388
|
console.log();
|
|
1198
1389
|
}
|
|
1390
|
+
// test touch 14:40:59
|
|
1199
1391
|
//# sourceMappingURL=cli.js.map
|