cfsa-antigravity 3.0.0 → 3.0.2
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 +31 -3
- package/bin/cli.mjs +17 -89
- package/package.json +1 -1
- package/template/.agent/kit-sync.md +3 -3
- package/template/.claude/README.md +6 -5
- package/template/.claude/kit-sync.md +3 -3
- package/template/.factory/kit-sync.md +3 -3
- package/template/.memory/mcp-server/README.md +9 -0
- package/template/.memory/pipeline/compile.mjs +76 -11
- package/template/docs/README.md +12 -2
- package/template/docs/kit-architecture.md +4 -2
package/README.md
CHANGED
|
@@ -57,7 +57,33 @@ Every install now scaffolds a shared `.memory/` root at the project level. It is
|
|
|
57
57
|
└── migrate/ # legacy memory import helpers
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
The installer
|
|
60
|
+
The installer ships the shared memory runtime into `.memory/`, including the project-local MCP server under `.memory/mcp-server/`. Tool-specific MCP client config is intentionally **not** managed by the kit — users wire their own `.mcp.json` / editor settings for the tools they actually use. The daemon writes runtime state into `.memory/runtime/`, and the semantic index writes retrieval artifacts into `.memory/schema/semantic-index.json` plus `.memory/schema/semantic-manifest.json`.
|
|
61
|
+
|
|
62
|
+
### MCP client setup and first graph compile
|
|
63
|
+
|
|
64
|
+
The kit installs the **server/runtime** only. You must configure your tool's MCP client yourself.
|
|
65
|
+
|
|
66
|
+
For tools that use a workspace `.mcp.json`, point the tool at the shared server entrypoint:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"mcpServers": {
|
|
71
|
+
"cfsa-memory": {
|
|
72
|
+
"command": "node",
|
|
73
|
+
"args": [".memory/mcp-server/client.mjs"],
|
|
74
|
+
"env": {
|
|
75
|
+
"MEMORY_ROOT": ".memory",
|
|
76
|
+
"CFSA_MEMORY_HOST": "127.0.0.1",
|
|
77
|
+
"CFSA_MEMORY_PORT": "4317",
|
|
78
|
+
"CFSA_MEMORY_URL": "http://127.0.0.1:4317/mcp",
|
|
79
|
+
"CFSA_MEMORY_HEALTH_URL": "http://127.0.0.1:4317/health"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
For an existing project, after wiring your MCP client, trigger the initial graph/index build by running the memory compile path (`memory_compile` via MCP, or the direct compile script fallback) before opening Obsidian. Verify files like `.memory/schema/spec-graph.json` and `.memory/wiki/hubs/spec-graph.md` exist, then open Obsidian at `.memory/`.
|
|
61
87
|
|
|
62
88
|
This replaces fragmented runtime-local memory as the canonical project memory layer. Runtime-local memory files remain legacy inputs for migration.
|
|
63
89
|
|
|
@@ -101,8 +127,10 @@ A fresh `init` now installs:
|
|
|
101
127
|
- your selected runtime directories (`.agent/`, `.claude/`, `.factory/`)
|
|
102
128
|
- `docs/`
|
|
103
129
|
- shared `.memory/`
|
|
104
|
-
-
|
|
105
|
-
-
|
|
130
|
+
- the shared memory MCP server/runtime under `.memory/mcp-server/`
|
|
131
|
+
- the rest of the `.memory` scaffold needed to compile graph/index artifacts locally
|
|
132
|
+
|
|
133
|
+
Tool-specific MCP client config (such as `.mcp.json`) is user-managed and documented above.
|
|
106
134
|
|
|
107
135
|
Use `--migrate-memory` when upgrading an older installation that still has runtime-local memory you want imported into `.memory/`.
|
|
108
136
|
|
package/bin/cli.mjs
CHANGED
|
@@ -403,7 +403,7 @@ function installMemoryScaffold(targetDir, opts) {
|
|
|
403
403
|
|
|
404
404
|
if (opts.dryRun) {
|
|
405
405
|
info(`Would copy ${c.bold}.memory/${c.reset} (${countFiles(srcMemoryDir)} files)`);
|
|
406
|
-
info(`Would
|
|
406
|
+
info(`Would install the shared memory runtime only; MCP client config remains user-managed`);
|
|
407
407
|
return;
|
|
408
408
|
}
|
|
409
409
|
|
|
@@ -419,82 +419,8 @@ function installMemoryScaffold(targetDir, opts) {
|
|
|
419
419
|
info(`Merged ${c.bold}.memory/${c.reset}`);
|
|
420
420
|
}
|
|
421
421
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
const nextMcp = {
|
|
425
|
-
...currentMcp,
|
|
426
|
-
mcpServers: {
|
|
427
|
-
...(currentMcp.mcpServers || {}),
|
|
428
|
-
"cfsa-memory": {
|
|
429
|
-
command: "node",
|
|
430
|
-
args: [".memory/mcp-server/client.mjs"],
|
|
431
|
-
env: {
|
|
432
|
-
MEMORY_ROOT: ".memory",
|
|
433
|
-
CFSA_MEMORY_HOST: "127.0.0.1",
|
|
434
|
-
CFSA_MEMORY_PORT: "4317",
|
|
435
|
-
CFSA_MEMORY_URL: "http://127.0.0.1:4317/mcp",
|
|
436
|
-
CFSA_MEMORY_HEALTH_URL: "http://127.0.0.1:4317/health"
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
};
|
|
441
|
-
writeJsonFile(mcpPath, nextMcp);
|
|
442
|
-
info(`Updated ${c.bold}.mcp.json${c.reset}`);
|
|
443
|
-
|
|
444
|
-
const claudeSettingsPath = join(targetDir, ".claude", "settings.json");
|
|
445
|
-
const currentClaudeSettings = readJsonFile(claudeSettingsPath, {});
|
|
446
|
-
const memoryHooks = {
|
|
447
|
-
SessionStart: [
|
|
448
|
-
{
|
|
449
|
-
hooks: [
|
|
450
|
-
{
|
|
451
|
-
type: "command",
|
|
452
|
-
command: "node .memory/hooks/session-start.mjs"
|
|
453
|
-
}
|
|
454
|
-
]
|
|
455
|
-
}
|
|
456
|
-
],
|
|
457
|
-
PreCompact: [
|
|
458
|
-
{
|
|
459
|
-
matcher: "manual|auto",
|
|
460
|
-
hooks: [
|
|
461
|
-
{
|
|
462
|
-
type: "command",
|
|
463
|
-
command: "node .memory/hooks/pre-compact.mjs"
|
|
464
|
-
}
|
|
465
|
-
]
|
|
466
|
-
}
|
|
467
|
-
],
|
|
468
|
-
Stop: [
|
|
469
|
-
{
|
|
470
|
-
hooks: [
|
|
471
|
-
{
|
|
472
|
-
type: "command",
|
|
473
|
-
command: "node .memory/hooks/session-end.mjs"
|
|
474
|
-
}
|
|
475
|
-
]
|
|
476
|
-
}
|
|
477
|
-
]
|
|
478
|
-
};
|
|
479
|
-
const daemonHooks = {
|
|
480
|
-
SessionStart: [
|
|
481
|
-
{
|
|
482
|
-
hooks: [
|
|
483
|
-
{
|
|
484
|
-
type: "command",
|
|
485
|
-
command: "node .memory/mcp-server/start.mjs"
|
|
486
|
-
}
|
|
487
|
-
]
|
|
488
|
-
}
|
|
489
|
-
]
|
|
490
|
-
};
|
|
491
|
-
|
|
492
|
-
const nextClaudeSettings = {
|
|
493
|
-
...currentClaudeSettings,
|
|
494
|
-
hooks: mergeHookConfig(mergeHookConfig(currentClaudeSettings.hooks || {}, daemonHooks), memoryHooks)
|
|
495
|
-
};
|
|
496
|
-
writeJsonFile(claudeSettingsPath, nextClaudeSettings);
|
|
497
|
-
info(`Updated ${c.bold}.claude/settings.json${c.reset}`);
|
|
422
|
+
info(`Installed ${c.bold}.memory/${c.reset} runtime scaffold`);
|
|
423
|
+
info(`MCP client configuration is user-managed; see the README for tool-specific setup and the initial graph compile step.`);
|
|
498
424
|
}
|
|
499
425
|
|
|
500
426
|
async function migrateMemory(targetDir) {
|
|
@@ -664,7 +590,7 @@ async function cmdInit(opts) {
|
|
|
664
590
|
log("");
|
|
665
591
|
log(`${c.bold}Next steps:${c.reset}`);
|
|
666
592
|
log(` 1. Open your project in your agent of choice`);
|
|
667
|
-
log(` 2. Verify ${c.cyan}.memory/${c.reset}
|
|
593
|
+
log(` 2. Verify ${c.cyan}.memory/${c.reset} and configure your tool-specific MCP client manually if needed (see README)`);
|
|
668
594
|
log(` 3. Run ${c.cyan}/ideate${c.reset} to start the pipeline`);
|
|
669
595
|
log("");
|
|
670
596
|
log(`${c.dim}Documentation: https://github.com/RepairYourTech/cfsa-antigravity${c.reset}`);
|
|
@@ -814,7 +740,6 @@ function cmdStatus() {
|
|
|
814
740
|
{ path: ".memory/wiki/hubs/phases.md", label: "Phase graph hub" },
|
|
815
741
|
{ path: ".memory/wiki/hubs/operations.md", label: "Operations graph hub" },
|
|
816
742
|
{ path: ".memory/wiki/hubs/surfaces.md", label: "Surface graph hub" },
|
|
817
|
-
{ path: ".mcp.json", label: "MCP config" },
|
|
818
743
|
];
|
|
819
744
|
|
|
820
745
|
if (!args.json) {
|
|
@@ -869,24 +794,27 @@ function cmdStatus() {
|
|
|
869
794
|
const mcpConfig = JSON.parse(readFileSync(mcpPath, "utf-8"));
|
|
870
795
|
if (mcpConfig.mcpServers?.["cfsa-memory"]?.args?.includes(".memory/mcp-server/client.mjs")) {
|
|
871
796
|
if (!args.json) {
|
|
872
|
-
info(` MCP
|
|
797
|
+
info(` MCP client config ${c.dim}(cfsa-memory configured)${c.reset}`);
|
|
873
798
|
}
|
|
874
|
-
statusJson.memoryHealth.push({ label: "MCP
|
|
799
|
+
statusJson.memoryHealth.push({ label: "MCP client config", status: "present", detail: "cfsa-memory configured" });
|
|
875
800
|
totalInstalled++;
|
|
876
801
|
} else {
|
|
877
802
|
if (!args.json) {
|
|
878
|
-
warn(" MCP
|
|
803
|
+
warn(" MCP client config — present but cfsa-memory is not configured");
|
|
879
804
|
}
|
|
880
|
-
statusJson.memoryHealth.push({ label: "MCP
|
|
881
|
-
totalMissing++;
|
|
805
|
+
statusJson.memoryHealth.push({ label: "MCP client config", status: "partial", detail: "present but cfsa-memory is not configured" });
|
|
882
806
|
}
|
|
883
807
|
} catch {
|
|
884
808
|
if (!args.json) {
|
|
885
|
-
warn(" MCP config — invalid JSON");
|
|
809
|
+
warn(" MCP client config — invalid JSON");
|
|
886
810
|
}
|
|
887
|
-
statusJson.memoryHealth.push({ label: "MCP config", status: "invalid" });
|
|
888
|
-
|
|
811
|
+
statusJson.memoryHealth.push({ label: "MCP client config", status: "invalid" });
|
|
812
|
+
}
|
|
813
|
+
} else {
|
|
814
|
+
if (!args.json) {
|
|
815
|
+
warn(" MCP client config — user-managed (not configured here)");
|
|
889
816
|
}
|
|
817
|
+
statusJson.memoryHealth.push({ label: "MCP client config", status: "user-managed", detail: "configure your tool manually if needed" });
|
|
890
818
|
}
|
|
891
819
|
|
|
892
820
|
const claudeSettingsPath = join(targetDir, ".claude", "settings.json");
|
|
@@ -896,9 +824,9 @@ function cmdStatus() {
|
|
|
896
824
|
const hasHooks = Boolean(claudeSettings.hooks?.SessionStart?.length);
|
|
897
825
|
if (hasHooks) {
|
|
898
826
|
if (!args.json) {
|
|
899
|
-
info(` Claude
|
|
827
|
+
info(` Claude settings ${c.dim}(hooks configured)${c.reset}`);
|
|
900
828
|
}
|
|
901
|
-
statusJson.memoryHealth.push({ label: "Claude
|
|
829
|
+
statusJson.memoryHealth.push({ label: "Claude settings", status: "present", detail: "hooks configured" });
|
|
902
830
|
totalInstalled++;
|
|
903
831
|
} else {
|
|
904
832
|
if (!args.json) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Kit Sync State
|
|
2
2
|
|
|
3
3
|
upstream: https://github.com/RepairYourTech/cfsa-antigravity
|
|
4
|
-
last_synced_commit:
|
|
5
|
-
last_synced_at: 2026-04-
|
|
6
|
-
kit_version: 3.0.
|
|
4
|
+
last_synced_commit: 63c31d9113ccb3f828aeb5c8a4902483cbbc2e8a
|
|
5
|
+
last_synced_at: 2026-04-15T09:10:27Z
|
|
6
|
+
kit_version: 3.0.2
|
|
@@ -30,11 +30,12 @@ Project root canonical memory / Obsidian vault:
|
|
|
30
30
|
|
|
31
31
|
The `.memory/` directory is the canonical project memory layer and is designed to function as an Obsidian-friendly vault inside the project. `.claude/memory/` exists only for Claude-native bridge guidance and session-specific conventions.
|
|
32
32
|
|
|
33
|
-
A Claude install also gets:
|
|
34
|
-
-
|
|
35
|
-
- `.
|
|
36
|
-
-
|
|
37
|
-
|
|
33
|
+
A Claude install also gets the shared `.memory/` runtime scaffold, including:
|
|
34
|
+
- the `cfsa-memory` server under `.memory/mcp-server/`
|
|
35
|
+
- daemon startup helpers under `.memory/mcp-server/start.mjs`
|
|
36
|
+
- compile/runtime helpers under `.memory/pipeline/` and `.memory/hooks/`
|
|
37
|
+
|
|
38
|
+
Tool-specific MCP client config and Claude hook wiring are user-managed. If you want Claude to talk to the shared memory daemon, add the appropriate MCP client config yourself and then run the initial compile before opening Obsidian at `.memory/`.
|
|
38
39
|
|
|
39
40
|
All runtimes should read and write shared project memory through `.memory/` and the MCP bridge.
|
|
40
41
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Kit Sync State
|
|
2
2
|
|
|
3
3
|
upstream: https://github.com/RepairYourTech/cfsa-antigravity
|
|
4
|
-
last_synced_commit:
|
|
5
|
-
last_synced_at: 2026-04-
|
|
6
|
-
kit_version: 3.0.
|
|
4
|
+
last_synced_commit: 63c31d9113ccb3f828aeb5c8a4902483cbbc2e8a
|
|
5
|
+
last_synced_at: 2026-04-15T09:10:27Z
|
|
6
|
+
kit_version: 3.0.2
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Kit Sync State
|
|
2
2
|
|
|
3
3
|
upstream: https://github.com/RepairYourTech/cfsa-antigravity
|
|
4
|
-
last_synced_commit:
|
|
5
|
-
last_synced_at: 2026-04-
|
|
6
|
-
kit_version: 3.0.
|
|
4
|
+
last_synced_commit: 63c31d9113ccb3f828aeb5c8a4902483cbbc2e8a
|
|
5
|
+
last_synced_at: 2026-04-15T09:10:27Z
|
|
6
|
+
kit_version: 3.0.2
|
|
@@ -6,5 +6,14 @@ Stdio MCP server for the unified `.memory/` system.
|
|
|
6
6
|
- `index.mjs` — stdio JSON-RPC MCP entrypoint
|
|
7
7
|
- `tools/` — individual tool adapters that call the pipeline
|
|
8
8
|
|
|
9
|
+
## Ownership boundary
|
|
10
|
+
The kit installs the MCP **server/runtime** into the workspace. Tool-specific MCP client configuration (for example `.mcp.json` or editor-specific MCP settings) is user-managed.
|
|
11
|
+
|
|
12
|
+
## Initial bootstrap
|
|
13
|
+
For an existing project:
|
|
14
|
+
1. wire your tool's MCP client to this server entrypoint
|
|
15
|
+
2. run the initial memory compile (`memory_compile` or the direct compile fallback)
|
|
16
|
+
3. verify graph/index artifacts exist under `.memory/schema/` and `.memory/wiki/`
|
|
17
|
+
|
|
9
18
|
## Extension pattern
|
|
10
19
|
Expose new memory capabilities by adding a tool file under `tools/` and wiring it into `index.mjs`.
|
|
@@ -2,6 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
import {
|
|
3
3
|
chunkText,
|
|
4
4
|
ensureMemoryScaffold,
|
|
5
|
+
getFileText,
|
|
5
6
|
getMemoryRoot,
|
|
6
7
|
listFilesRecursively,
|
|
7
8
|
readJsonl,
|
|
@@ -84,8 +85,64 @@ export function compileMemory(options = {}) {
|
|
|
84
85
|
const knowledge = records.filter((record) => !["pattern", "decision", "blocker"].includes(record.type));
|
|
85
86
|
|
|
86
87
|
const knowledgeDir = join(memoryRoot, "wiki", "knowledge");
|
|
88
|
+
const specsRoot = join(memoryRoot, "wiki", "specs");
|
|
87
89
|
const indexEntries = [];
|
|
88
90
|
const chunkEntries = [];
|
|
91
|
+
const specFiles = listFilesRecursively(specsRoot)
|
|
92
|
+
.filter((filePath) => filePath.endsWith(".md"))
|
|
93
|
+
.filter((filePath) => !filePath.endsWith("README.md"))
|
|
94
|
+
.filter((filePath) => !filePath.endsWith(".gitkeep"));
|
|
95
|
+
|
|
96
|
+
const specTypeForPath = (relativePath) => {
|
|
97
|
+
if (relativePath.includes('/specs/ia/')) return 'ia-spec';
|
|
98
|
+
if (relativePath.includes('/specs/be/')) return 'be-spec';
|
|
99
|
+
if (relativePath.includes('/specs/fe/')) return 'fe-spec';
|
|
100
|
+
if (relativePath.includes('/specs/phases/')) return 'phase-plan';
|
|
101
|
+
if (relativePath.includes('/specs/ideation/')) return 'ideation';
|
|
102
|
+
if (relativePath.includes('/specs/audits/')) return 'audit';
|
|
103
|
+
if (relativePath.includes('/specs/architecture/')) return 'architecture';
|
|
104
|
+
return 'spec';
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const specTitleForText = (relativePath, text) => {
|
|
108
|
+
const heading = text.split("\n").find((line) => line.startsWith("# "));
|
|
109
|
+
if (heading) {
|
|
110
|
+
return heading.replace(/^#\s+/, '').trim();
|
|
111
|
+
}
|
|
112
|
+
return relativePath.split('/').at(-1)?.replace(/\.md$/, '') ?? relativePath;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
for (const filePath of specFiles) {
|
|
116
|
+
const text = getFileText(filePath, '');
|
|
117
|
+
if (!text.trim()) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const relativePath = toRelativePath(projectRoot, filePath);
|
|
121
|
+
const type = specTypeForPath(relativePath);
|
|
122
|
+
const title = specTitleForText(relativePath, text);
|
|
123
|
+
indexEntries.push({
|
|
124
|
+
id: `spec:${relativePath.replace(/^\.memory\/wiki\/specs\//, '').replace(/\.md$/, '')}`,
|
|
125
|
+
type,
|
|
126
|
+
title,
|
|
127
|
+
path: relativePath,
|
|
128
|
+
source: relativePath,
|
|
129
|
+
agent: 'spec-vault',
|
|
130
|
+
timestamp: 'spec-vault',
|
|
131
|
+
excerpt: text.slice(0, 240),
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
for (const [index, chunk] of chunkText(text).entries()) {
|
|
135
|
+
chunkEntries.push({
|
|
136
|
+
id: `spec:${relativePath}:${index + 1}`,
|
|
137
|
+
parentId: `spec:${relativePath.replace(/^\.memory\/wiki\/specs\//, '').replace(/\.md$/, '')}`,
|
|
138
|
+
path: relativePath,
|
|
139
|
+
text: chunk,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const seenIndexEntryIds = new Set(indexEntries.map((entry) => entry.id));
|
|
145
|
+
const seenChunkEntryIds = new Set(chunkEntries.map((entry) => entry.id));
|
|
89
146
|
|
|
90
147
|
const getRecordPath = (record) => {
|
|
91
148
|
if (record.type === "pattern") {
|
|
@@ -111,24 +168,32 @@ export function compileMemory(options = {}) {
|
|
|
111
168
|
|
|
112
169
|
for (const record of records) {
|
|
113
170
|
const absolutePath = getRecordPath(record);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
171
|
+
if (!seenIndexEntryIds.has(record.id)) {
|
|
172
|
+
indexEntries.push({
|
|
173
|
+
id: record.id,
|
|
174
|
+
type: record.type,
|
|
175
|
+
title: record.title ?? record.id,
|
|
176
|
+
path: toRelativePath(projectRoot, absolutePath),
|
|
177
|
+
source: record.source,
|
|
178
|
+
agent: record.agent,
|
|
179
|
+
timestamp: record.timestamp,
|
|
180
|
+
excerpt: record.text.slice(0, 240),
|
|
181
|
+
});
|
|
182
|
+
seenIndexEntryIds.add(record.id);
|
|
183
|
+
}
|
|
124
184
|
|
|
125
185
|
for (const [index, chunk] of chunkText(record.text).entries()) {
|
|
186
|
+
const chunkId = `${record.id}:${index + 1}`;
|
|
187
|
+
if (seenChunkEntryIds.has(chunkId)) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
126
190
|
chunkEntries.push({
|
|
127
|
-
id:
|
|
191
|
+
id: chunkId,
|
|
128
192
|
parentId: record.id,
|
|
129
193
|
path: toRelativePath(projectRoot, absolutePath),
|
|
130
194
|
text: chunk,
|
|
131
195
|
});
|
|
196
|
+
seenChunkEntryIds.add(chunkId);
|
|
132
197
|
}
|
|
133
198
|
}
|
|
134
199
|
|
package/template/docs/README.md
CHANGED
|
@@ -165,15 +165,25 @@ npx cfsa-antigravity init
|
|
|
165
165
|
|
|
166
166
|
### Unified memory scaffold
|
|
167
167
|
|
|
168
|
-
`init` now
|
|
168
|
+
`init` now installs a shared `.memory/` directory. The `.memory/` directory is designed to function as an Obsidian vault inside the project.
|
|
169
169
|
|
|
170
170
|
- `.memory/raw/` stores append-only session and event captures
|
|
171
171
|
- `.memory/wiki/` stores compiled patterns, decisions, blockers, and knowledge pages
|
|
172
172
|
- `.memory/schema/` stores machine-readable retrieval artifacts, including semantic index/manifests
|
|
173
|
-
- `.memory/mcp-server/client.mjs` is the
|
|
173
|
+
- `.memory/mcp-server/client.mjs` is the MCP bridge entrypoint for the shared daemon
|
|
174
174
|
- `.memory/mcp-server/daemon.mjs` is the shared project-local MCP daemon
|
|
175
175
|
- `.memory/hooks/` contains Claude-oriented hook entrypoints
|
|
176
176
|
|
|
177
|
+
The kit installs the memory **server/runtime** only. `.mcp.json` and other tool-specific MCP client settings are user-managed.
|
|
178
|
+
|
|
179
|
+
### Initial graph compile for existing projects
|
|
180
|
+
|
|
181
|
+
After installing or updating the `.memory` runtime in an existing project:
|
|
182
|
+
1. Configure your tool's MCP client manually.
|
|
183
|
+
2. Trigger the first memory compile (`memory_compile` via MCP, or the direct compile script fallback).
|
|
184
|
+
3. Verify graph/index artifacts exist under `.memory/schema/` and `.memory/wiki/`.
|
|
185
|
+
4. Open Obsidian at `.memory/`.
|
|
186
|
+
|
|
177
187
|
If you are upgrading an older project with siloed runtime-local memory, run:
|
|
178
188
|
|
|
179
189
|
```bash
|
|
@@ -274,8 +274,10 @@ The kit now separates runtime execution state from shared project memory:
|
|
|
274
274
|
|
|
275
275
|
- Runtime progress still lives under `.agent/progress/`, `.claude/progress/`, and `.factory/progress/`
|
|
276
276
|
- Canonical cross-runtime memory lives under `.memory/`
|
|
277
|
-
- Claude
|
|
278
|
-
- All runtimes can access the same memory through
|
|
277
|
+
- Claude can use hooks in `.claude/settings.json` to flush and compile memory automatically when the user chooses to wire them
|
|
278
|
+
- All runtimes can access the same memory through their own MCP client config -> `cfsa-memory` -> `.memory/mcp-server/client.mjs` -> shared daemon `.memory/mcp-server/daemon.mjs`
|
|
279
|
+
|
|
280
|
+
The kit ships the server/runtime. Tool-specific MCP client configuration (for example `.mcp.json`) remains user-managed.
|
|
279
281
|
|
|
280
282
|
This lets Claude, Antigravity, Factory, Codex, and future runtimes query the same project memory without each runtime owning a separate canonical store.
|
|
281
283
|
|