fastrmemory 0.5.0 → 0.6.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +2 -2
- package/.cursor/skills/skills.json +1 -1
- package/README.md +40 -30
- package/dist/bin/fastr.js +122 -14
- package/dist/bin/fastr.js.map +1 -1
- package/dist/src/bench/harness.d.ts.map +1 -1
- package/dist/src/bench/harness.js +4 -0
- package/dist/src/bench/harness.js.map +1 -1
- package/dist/src/bench/marker-corpus.d.ts +98 -0
- package/dist/src/bench/marker-corpus.d.ts.map +1 -0
- package/dist/src/bench/marker-corpus.js +306 -0
- package/dist/src/bench/marker-corpus.js.map +1 -0
- package/dist/src/bench/mcp-stdio.d.ts +55 -0
- package/dist/src/bench/mcp-stdio.d.ts.map +1 -0
- package/dist/src/bench/mcp-stdio.js +146 -0
- package/dist/src/bench/mcp-stdio.js.map +1 -0
- package/dist/src/bench/public-datasets.d.ts +2 -0
- package/dist/src/bench/public-datasets.d.ts.map +1 -1
- package/dist/src/bench/public-datasets.js +2 -1
- package/dist/src/bench/public-datasets.js.map +1 -1
- package/dist/src/bench/public-harness.d.ts +14 -0
- package/dist/src/bench/public-harness.d.ts.map +1 -1
- package/dist/src/bench/public-harness.js +83 -8
- package/dist/src/bench/public-harness.js.map +1 -1
- package/dist/src/bench/public-pins.js +5 -5
- package/dist/src/bench/public-pins.js.map +1 -1
- package/dist/src/bench/split.d.ts +33 -0
- package/dist/src/bench/split.d.ts.map +1 -0
- package/dist/src/bench/split.js +56 -0
- package/dist/src/bench/split.js.map +1 -0
- package/dist/src/bench/stats.d.ts +40 -0
- package/dist/src/bench/stats.d.ts.map +1 -0
- package/dist/src/bench/stats.js +99 -0
- package/dist/src/bench/stats.js.map +1 -0
- package/dist/src/bench/vs-engines.d.ts +51 -0
- package/dist/src/bench/vs-engines.d.ts.map +1 -0
- package/dist/src/bench/vs-engines.js +121 -0
- package/dist/src/bench/vs-engines.js.map +1 -0
- package/dist/src/config.d.ts +33 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +84 -1
- package/dist/src/config.js.map +1 -1
- package/dist/src/db/doctor.d.ts +8 -0
- package/dist/src/db/doctor.d.ts.map +1 -1
- package/dist/src/db/doctor.js +65 -1
- package/dist/src/db/doctor.js.map +1 -1
- package/dist/src/db/fts-queue.d.ts +35 -0
- package/dist/src/db/fts-queue.d.ts.map +1 -0
- package/dist/src/db/fts-queue.js +78 -0
- package/dist/src/db/fts-queue.js.map +1 -0
- package/dist/src/db/repository.d.ts +63 -1
- package/dist/src/db/repository.d.ts.map +1 -1
- package/dist/src/db/repository.js +244 -50
- package/dist/src/db/repository.js.map +1 -1
- package/dist/src/db/schema.d.ts +1 -1
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +63 -2
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/installer/copilot.d.ts +21 -0
- package/dist/src/installer/copilot.d.ts.map +1 -1
- package/dist/src/installer/copilot.js +72 -1
- package/dist/src/installer/copilot.js.map +1 -1
- package/dist/src/installer/gemini.d.ts +13 -0
- package/dist/src/installer/gemini.d.ts.map +1 -1
- package/dist/src/installer/gemini.js +64 -1
- package/dist/src/installer/gemini.js.map +1 -1
- package/dist/src/installer/hooks.d.ts +42 -5
- package/dist/src/installer/hooks.d.ts.map +1 -1
- package/dist/src/installer/hooks.js +270 -62
- package/dist/src/installer/hooks.js.map +1 -1
- package/dist/src/installer/json-config.d.ts +25 -1
- package/dist/src/installer/json-config.d.ts.map +1 -1
- package/dist/src/installer/json-config.js +95 -2
- package/dist/src/installer/json-config.js.map +1 -1
- package/dist/src/installer/mcp-init.d.ts.map +1 -1
- package/dist/src/installer/mcp-init.js +5 -6
- package/dist/src/installer/mcp-init.js.map +1 -1
- package/dist/src/installer/opencode.d.ts +18 -0
- package/dist/src/installer/opencode.d.ts.map +1 -1
- package/dist/src/installer/opencode.js +81 -1
- package/dist/src/installer/opencode.js.map +1 -1
- package/dist/src/installer/setup.d.ts +7 -0
- package/dist/src/installer/setup.d.ts.map +1 -1
- package/dist/src/installer/setup.js +32 -0
- package/dist/src/installer/setup.js.map +1 -1
- package/dist/src/mcp/profiles.d.ts +9 -6
- package/dist/src/mcp/profiles.d.ts.map +1 -1
- package/dist/src/mcp/profiles.js +12 -9
- package/dist/src/mcp/profiles.js.map +1 -1
- package/dist/src/mcp/server.d.ts +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +80 -0
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/search/aggregate.d.ts +24 -0
- package/dist/src/search/aggregate.d.ts.map +1 -0
- package/dist/src/search/aggregate.js +59 -0
- package/dist/src/search/aggregate.js.map +1 -0
- package/dist/src/search/backfill.d.ts.map +1 -1
- package/dist/src/search/backfill.js +7 -2
- package/dist/src/search/backfill.js.map +1 -1
- package/dist/src/search/budget.d.ts +2 -0
- package/dist/src/search/budget.d.ts.map +1 -1
- package/dist/src/search/budget.js.map +1 -1
- package/dist/src/search/embeddings.d.ts +35 -2
- package/dist/src/search/embeddings.d.ts.map +1 -1
- package/dist/src/search/embeddings.js +128 -5
- package/dist/src/search/embeddings.js.map +1 -1
- package/dist/src/search/hybrid-rrf.d.ts +45 -0
- package/dist/src/search/hybrid-rrf.d.ts.map +1 -1
- package/dist/src/search/hybrid-rrf.js +212 -56
- package/dist/src/search/hybrid-rrf.js.map +1 -1
- package/dist/src/search/static-model-install.d.ts +43 -0
- package/dist/src/search/static-model-install.d.ts.map +1 -0
- package/dist/src/search/static-model-install.js +112 -0
- package/dist/src/search/static-model-install.js.map +1 -0
- package/dist/src/search/static-model.d.ts +63 -0
- package/dist/src/search/static-model.d.ts.map +1 -0
- package/dist/src/search/static-model.js +244 -0
- package/dist/src/search/static-model.js.map +1 -0
- package/dist/src/search/temporal.d.ts +32 -0
- package/dist/src/search/temporal.d.ts.map +1 -0
- package/dist/src/search/temporal.js +164 -0
- package/dist/src/search/temporal.js.map +1 -0
- package/llms-install.md +3 -3
- package/package.json +5 -1
- package/server.json +1 -1
- package/skills/skills.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
1
2
|
import * as path from 'node:path';
|
|
2
3
|
import { buildHookCommand } from './commands.js';
|
|
3
|
-
import { isFastrHookCommand, updateJsonConfig, upsertMcpServer } from './json-config.js';
|
|
4
|
+
import { deleteJsonConfigIfTrivial, isFastrHookCommand, removeMcpServer, updateJsonConfig, upsertMcpServer } from './json-config.js';
|
|
4
5
|
/**
|
|
5
6
|
* Gemini CLI's project settings contract: MCP servers live under `mcpServers`, while lifecycle
|
|
6
7
|
* hooks live under `hooks.<Event>` with `{ matcher, hooks: [{ type, command }] }` groups.
|
|
@@ -85,4 +86,66 @@ export function installGemini(projectRoot, mcpEntry) {
|
|
|
85
86
|
mergeGeminiHooks(config, geminiHookSpecs());
|
|
86
87
|
});
|
|
87
88
|
}
|
|
89
|
+
/** True for a hook entry this installer owns, matched by command or by its `fastrmemory-*` name. */
|
|
90
|
+
export function isFastrGeminiHook(hook) {
|
|
91
|
+
if (isFastrHookCommand(hook?.command))
|
|
92
|
+
return true;
|
|
93
|
+
return /^fastrmemory(?:[-_:]|$)/i.test(String(hook?.name ?? ''));
|
|
94
|
+
}
|
|
95
|
+
/** Removes this installer's Gemini hooks and prunes empty events. Returns hooks removed. */
|
|
96
|
+
export function removeGeminiHooks(config) {
|
|
97
|
+
const hooks = config.hooks;
|
|
98
|
+
if (!hooks || typeof hooks !== 'object' || Array.isArray(hooks))
|
|
99
|
+
return 0;
|
|
100
|
+
let removed = 0;
|
|
101
|
+
for (const event of Object.keys(hooks)) {
|
|
102
|
+
const current = hooks[event];
|
|
103
|
+
if (typeof current === 'string') {
|
|
104
|
+
if (isFastrHookCommand(current)) {
|
|
105
|
+
delete hooks[event];
|
|
106
|
+
removed++;
|
|
107
|
+
}
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (!Array.isArray(current))
|
|
111
|
+
continue;
|
|
112
|
+
const keptGroups = [];
|
|
113
|
+
for (const group of current) {
|
|
114
|
+
if (!group || !Array.isArray(group.hooks)) {
|
|
115
|
+
keptGroups.push(group);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const kept = group.hooks.filter((hook) => {
|
|
119
|
+
if (!isFastrGeminiHook(hook))
|
|
120
|
+
return true;
|
|
121
|
+
removed++;
|
|
122
|
+
return false;
|
|
123
|
+
});
|
|
124
|
+
if (kept.length > 0)
|
|
125
|
+
keptGroups.push({ ...group, hooks: kept });
|
|
126
|
+
}
|
|
127
|
+
if (keptGroups.length === 0)
|
|
128
|
+
delete hooks[event];
|
|
129
|
+
else
|
|
130
|
+
hooks[event] = keptGroups;
|
|
131
|
+
}
|
|
132
|
+
if (Object.keys(hooks).length === 0)
|
|
133
|
+
delete config.hooks;
|
|
134
|
+
return removed;
|
|
135
|
+
}
|
|
136
|
+
/** Removes the FastrMemory MCP server and hooks from Gemini CLI project settings. */
|
|
137
|
+
export function uninstallGemini(projectRoot) {
|
|
138
|
+
const filePath = path.join(projectRoot, '.gemini', 'settings.json');
|
|
139
|
+
if (!fs.existsSync(filePath)) {
|
|
140
|
+
return { filePath, changed: false, removedHooks: 0, removedMcp: false, fileDeleted: false };
|
|
141
|
+
}
|
|
142
|
+
let removedHooks = 0;
|
|
143
|
+
let removedMcp = false;
|
|
144
|
+
const result = updateJsonConfig(filePath, (config) => {
|
|
145
|
+
removedMcp = removeMcpServer(config, 'fastrmemory');
|
|
146
|
+
removedHooks = removeGeminiHooks(config);
|
|
147
|
+
}, { backup: false });
|
|
148
|
+
const fileDeleted = deleteJsonConfigIfTrivial(filePath);
|
|
149
|
+
return { filePath, changed: result.changed, removedHooks, removedMcp, fileDeleted };
|
|
150
|
+
}
|
|
88
151
|
//# sourceMappingURL=gemini.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/installer/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/installer/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import { ClaudeHookSpec } from './json-config.js';
|
|
2
2
|
export { buildHookCommand } from './commands.js';
|
|
3
|
+
/**
|
|
4
|
+
* The five project-scoped clients `fastr hook install` can wire up. Each one is installed and
|
|
5
|
+
* removed by the same registry entry, so an uninstall cannot drift away from what install wrote.
|
|
6
|
+
*/
|
|
7
|
+
export type HookClient = 'claude' | 'cursor' | 'opencode' | 'gemini' | 'copilot';
|
|
8
|
+
export declare const HOOK_CLIENTS: HookClient[];
|
|
9
|
+
export type HookStatus = 'updated' | 'present' | 'removed' | 'absent' | 'skipped' | 'error';
|
|
10
|
+
export interface HookClientReport {
|
|
11
|
+
client: HookClient;
|
|
12
|
+
status: HookStatus;
|
|
13
|
+
/** Every file this client's install or uninstall touched, relative to the project root. */
|
|
14
|
+
files: string[];
|
|
15
|
+
details: string[];
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
3
18
|
export interface HookInstallResult {
|
|
4
19
|
claudeCodeUpdated: boolean;
|
|
5
20
|
cursorUpdated: boolean;
|
|
@@ -8,17 +23,39 @@ export interface HookInstallResult {
|
|
|
8
23
|
openCodeUpdated: boolean;
|
|
9
24
|
agentsMdUpdated: boolean;
|
|
10
25
|
details: string[];
|
|
26
|
+
clients: HookClientReport[];
|
|
27
|
+
}
|
|
28
|
+
export interface HookUninstallResult {
|
|
29
|
+
/** True when at least one client file changed. */
|
|
30
|
+
changed: boolean;
|
|
31
|
+
agentsMdRemoved: boolean;
|
|
32
|
+
details: string[];
|
|
33
|
+
clients: HookClientReport[];
|
|
11
34
|
}
|
|
12
35
|
export declare function claudeHookSpecs(platform?: NodeJS.Platform): ClaudeHookSpec[];
|
|
36
|
+
/** Parses `--client claude,cursor` / `--client all`. Throws on an unknown id instead of ignoring it. */
|
|
37
|
+
export declare function parseHookClients(spec: string | undefined): HookClient[];
|
|
13
38
|
/**
|
|
14
|
-
* Wires FastrMemory into the
|
|
15
|
-
* and
|
|
39
|
+
* Wires FastrMemory into the selected project-scoped clients. Re-running is idempotent: every
|
|
40
|
+
* file is merged, not replaced, and a run that changes nothing reports `present`.
|
|
16
41
|
*
|
|
17
42
|
* Claude Code reads project MCP servers from `.mcp.json` and hooks from `.claude/settings.json`;
|
|
18
43
|
* Gemini CLI reads both from `.gemini/settings.json`; Copilot CLI reads `.github/mcp.json` and
|
|
19
|
-
* `.github/hooks/*.json
|
|
20
|
-
|
|
21
|
-
|
|
44
|
+
* `.github/hooks/*.json`; OpenCode reads `opencode.json(c)` plus a managed plugin.
|
|
45
|
+
*/
|
|
46
|
+
export declare function installHookClients(projectRoot?: string, clients?: HookClient[], options?: {
|
|
47
|
+
agentsMd?: boolean;
|
|
48
|
+
}): HookInstallResult;
|
|
49
|
+
/**
|
|
50
|
+
* Removes exactly what `installHookClients` added: the `fastrmemory` MCP entry, every hook
|
|
51
|
+
* command this installer wrote, the managed OpenCode plugin, and the AGENTS.md discipline block.
|
|
52
|
+
* Files and directories that end up empty are removed. User entries in the same files survive.
|
|
53
|
+
*
|
|
54
|
+
* Idempotent: a second run reports `absent` and writes nothing.
|
|
22
55
|
*/
|
|
56
|
+
export declare function uninstallHookClients(projectRoot?: string, clients?: HookClient[], options?: {
|
|
57
|
+
agentsMd?: boolean;
|
|
58
|
+
}): HookUninstallResult;
|
|
59
|
+
/** Backwards-compatible wrapper used by the setup wizard. Installs every client plus AGENTS.md. */
|
|
23
60
|
export declare function installAgentHooks(projectRoot?: string): HookInstallResult;
|
|
24
61
|
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/installer/hooks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/installer/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EAQf,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjF,eAAO,MAAM,YAAY,EAAE,UAAU,EAA0D,CAAC;AAEhG,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5F,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,2FAA2F;IAC3F,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,cAAc,EAAE,CAU9F;AAED,wGAAwG;AACxG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,EAAE,CASvE;AA0MD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,GAAE,MAAsB,EACnC,OAAO,GAAE,UAAU,EAAsB,EACzC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,iBAAiB,CAqCnB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,GAAE,MAAsB,EACnC,OAAO,GAAE,UAAU,EAAsB,EACzC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,mBAAmB,CA6BrB;AAED,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAsB,GAAG,iBAAiB,CAExF"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
1
2
|
import * as path from 'node:path';
|
|
2
|
-
import { mergeClaudeHooks, updateJsonConfig, upsertMcpServer } from './json-config.js';
|
|
3
|
-
import { ensureAgentsDiscipline, resolveMcpCommand } from './setup.js';
|
|
4
|
-
import { installOpenCode } from './opencode.js';
|
|
5
|
-
import { installGemini } from './gemini.js';
|
|
6
|
-
import { installCopilot } from './copilot.js';
|
|
3
|
+
import { deleteJsonConfigIfTrivial, mergeClaudeHooks, removeClaudeHooks, removeMcpServer, updateJsonConfig, upsertMcpServer } from './json-config.js';
|
|
4
|
+
import { ensureAgentsDiscipline, removeAgentsDiscipline, resolveMcpCommand } from './setup.js';
|
|
5
|
+
import { installOpenCode, uninstallOpenCode } from './opencode.js';
|
|
6
|
+
import { installGemini, uninstallGemini } from './gemini.js';
|
|
7
|
+
import { installCopilot, uninstallCopilot } from './copilot.js';
|
|
7
8
|
import { buildHookCommand } from './commands.js';
|
|
8
9
|
export { buildHookCommand } from './commands.js';
|
|
10
|
+
export const HOOK_CLIENTS = ['claude', 'cursor', 'opencode', 'gemini', 'copilot'];
|
|
9
11
|
export function claudeHookSpecs(platform = process.platform) {
|
|
10
12
|
return [
|
|
11
13
|
// Plain stdout from SessionStart is added to Claude's context (prior handoff, frontier tasks).
|
|
@@ -17,97 +19,303 @@ export function claudeHookSpecs(platform = process.platform) {
|
|
|
17
19
|
{ event: 'SessionEnd', command: buildHookCommand('SessionEnd', platform), timeout: 15 },
|
|
18
20
|
];
|
|
19
21
|
}
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
/** Parses `--client claude,cursor` / `--client all`. Throws on an unknown id instead of ignoring it. */
|
|
23
|
+
export function parseHookClients(spec) {
|
|
24
|
+
const raw = (spec ?? 'all').trim().toLowerCase();
|
|
25
|
+
if (raw === 'all' || raw === '')
|
|
26
|
+
return [...HOOK_CLIENTS];
|
|
27
|
+
const parts = raw.split(',').map((part) => part.trim()).filter(Boolean);
|
|
28
|
+
const unknown = parts.filter((part) => !HOOK_CLIENTS.includes(part));
|
|
29
|
+
if (unknown.length > 0) {
|
|
30
|
+
throw new Error(`unknown client ${unknown.join(', ')}; expected ${HOOK_CLIENTS.join(', ')}, or all`);
|
|
31
|
+
}
|
|
32
|
+
return [...new Set(parts)];
|
|
33
|
+
}
|
|
34
|
+
function relative(projectRoot, filePath) {
|
|
35
|
+
return path.relative(projectRoot, filePath) || path.basename(filePath);
|
|
36
|
+
}
|
|
37
|
+
function describe(projectRoot, label, res) {
|
|
38
|
+
const rel = relative(projectRoot, res.filePath);
|
|
39
|
+
if (!res.changed)
|
|
40
|
+
return `${label}: already up to date (${rel})`;
|
|
41
|
+
return `${label}: updated ${rel}${res.backupPath ? ` (backup: ${path.basename(res.backupPath)})` : ''}`;
|
|
42
|
+
}
|
|
43
|
+
/** Removes empty directories that install may have created, deepest first. */
|
|
44
|
+
function pruneEmptyDirs(dirs) {
|
|
45
|
+
const removed = [];
|
|
46
|
+
for (const dir of dirs) {
|
|
47
|
+
try {
|
|
48
|
+
if (fs.existsSync(dir) && fs.statSync(dir).isDirectory() && fs.readdirSync(dir).length === 0) {
|
|
49
|
+
fs.rmdirSync(dir);
|
|
50
|
+
removed.push(dir);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// A non-empty or locked directory is not an uninstall failure.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return removed;
|
|
58
|
+
}
|
|
59
|
+
/** Removes FastrMemory entries from one JSON file, then deletes the file if nothing is left. */
|
|
60
|
+
function removeFromJsonFile(filePath, mutate) {
|
|
61
|
+
if (!fs.existsSync(filePath))
|
|
62
|
+
return { changed: false, removed: false, deleted: false, filePath };
|
|
63
|
+
let removed = false;
|
|
64
|
+
const res = updateJsonConfig(filePath, (config) => {
|
|
65
|
+
removed = mutate(config);
|
|
66
|
+
}, { backup: false });
|
|
67
|
+
const deleted = deleteJsonConfigIfTrivial(filePath);
|
|
68
|
+
return { changed: res.changed || deleted, removed, deleted, filePath };
|
|
69
|
+
}
|
|
70
|
+
function installClaude(projectRoot, mcpEntry) {
|
|
31
71
|
const details = [];
|
|
32
|
-
|
|
33
|
-
let
|
|
34
|
-
let geminiUpdated = false;
|
|
35
|
-
let copilotUpdated = false;
|
|
36
|
-
let openCodeUpdated = false;
|
|
37
|
-
let agentsMdUpdated = false;
|
|
38
|
-
const mcpEntry = resolveMcpCommand();
|
|
39
|
-
const describe = (label, res) => {
|
|
40
|
-
const rel = path.relative(projectRoot, res.filePath) || res.filePath;
|
|
41
|
-
if (!res.changed)
|
|
42
|
-
return `${label}: already up to date (${rel})`;
|
|
43
|
-
return `${label}: updated ${rel}${res.backupPath ? ` (backup: ${path.basename(res.backupPath)})` : ''}`;
|
|
44
|
-
};
|
|
45
|
-
// 1. Claude Code: project-scoped MCP server + lifecycle hooks
|
|
72
|
+
const files = ['.mcp.json', path.join('.claude', 'settings.json')];
|
|
73
|
+
let changed = false;
|
|
46
74
|
try {
|
|
47
75
|
const mcp = updateJsonConfig(path.join(projectRoot, '.mcp.json'), (config) => upsertMcpServer(config, 'fastrmemory', mcpEntry));
|
|
48
|
-
details.push(describe('Claude Code MCP server', mcp));
|
|
76
|
+
details.push(describe(projectRoot, 'Claude Code MCP server', mcp));
|
|
77
|
+
changed ||= mcp.changed;
|
|
49
78
|
const hooks = updateJsonConfig(path.join(projectRoot, '.claude', 'settings.json'), (config) => mergeClaudeHooks(config, claudeHookSpecs()));
|
|
50
|
-
details.push(describe('Claude Code hooks', hooks));
|
|
51
|
-
|
|
79
|
+
details.push(describe(projectRoot, 'Claude Code hooks', hooks));
|
|
80
|
+
changed ||= hooks.changed;
|
|
81
|
+
return { client: 'claude', status: changed ? 'updated' : 'present', files, details };
|
|
52
82
|
}
|
|
53
83
|
catch (err) {
|
|
54
|
-
details
|
|
84
|
+
return { client: 'claude', status: 'error', files, details: [...details, `Failed to update Claude Code: ${err.message}`], error: err.message };
|
|
55
85
|
}
|
|
56
|
-
|
|
86
|
+
}
|
|
87
|
+
function uninstallClaude(projectRoot) {
|
|
88
|
+
const files = ['.mcp.json', path.join('.claude', 'settings.json')];
|
|
89
|
+
const details = [];
|
|
90
|
+
let changed = false;
|
|
91
|
+
try {
|
|
92
|
+
const mcp = removeFromJsonFile(path.join(projectRoot, '.mcp.json'), (config) => removeMcpServer(config, 'fastrmemory'));
|
|
93
|
+
changed ||= mcp.changed;
|
|
94
|
+
details.push(mcp.removed ? 'Claude Code MCP server: removed' : 'Claude Code MCP server: not configured');
|
|
95
|
+
const hooks = removeFromJsonFile(path.join(projectRoot, '.claude', 'settings.json'), (config) => removeClaudeHooks(config) > 0);
|
|
96
|
+
changed ||= hooks.changed;
|
|
97
|
+
details.push(hooks.removed ? 'Claude Code hooks: removed' : 'Claude Code hooks: not configured');
|
|
98
|
+
const pruned = pruneEmptyDirs([path.join(projectRoot, '.claude')]);
|
|
99
|
+
for (const dir of pruned)
|
|
100
|
+
details.push(`Removed empty directory ${relative(projectRoot, dir)}`);
|
|
101
|
+
return { client: 'claude', status: changed ? 'removed' : 'absent', files, details };
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
return { client: 'claude', status: 'error', files, details: [`Failed to clean Claude Code: ${err.message}`], error: err.message };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function installCursor(projectRoot, mcpEntry) {
|
|
108
|
+
const files = [path.join('.cursor', 'mcp.json')];
|
|
57
109
|
try {
|
|
58
110
|
const cursor = updateJsonConfig(path.join(projectRoot, '.cursor', 'mcp.json'), (config) => upsertMcpServer(config, 'fastrmemory', mcpEntry));
|
|
59
|
-
|
|
60
|
-
|
|
111
|
+
return {
|
|
112
|
+
client: 'cursor',
|
|
113
|
+
status: cursor.changed ? 'updated' : 'present',
|
|
114
|
+
files,
|
|
115
|
+
details: [describe(projectRoot, 'Cursor MCP server', cursor)]
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
return { client: 'cursor', status: 'error', files, details: [`Failed to update Cursor MCP: ${err.message}`], error: err.message };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function uninstallCursor(projectRoot) {
|
|
123
|
+
const files = [path.join('.cursor', 'mcp.json')];
|
|
124
|
+
try {
|
|
125
|
+
const cursor = removeFromJsonFile(path.join(projectRoot, '.cursor', 'mcp.json'), (config) => removeMcpServer(config, 'fastrmemory'));
|
|
126
|
+
const details = [cursor.removed ? 'Cursor MCP server: removed' : 'Cursor MCP server: not configured'];
|
|
127
|
+
const pruned = pruneEmptyDirs([path.join(projectRoot, '.cursor')]);
|
|
128
|
+
for (const dir of pruned)
|
|
129
|
+
details.push(`Removed empty directory ${relative(projectRoot, dir)}`);
|
|
130
|
+
return { client: 'cursor', status: cursor.changed ? 'removed' : 'absent', files, details };
|
|
61
131
|
}
|
|
62
132
|
catch (err) {
|
|
63
|
-
details
|
|
133
|
+
return { client: 'cursor', status: 'error', files, details: [`Failed to clean Cursor MCP: ${err.message}`], error: err.message };
|
|
64
134
|
}
|
|
65
|
-
|
|
135
|
+
}
|
|
136
|
+
function installGeminiClient(projectRoot, mcpEntry) {
|
|
137
|
+
const files = [path.join('.gemini', 'settings.json')];
|
|
66
138
|
try {
|
|
67
139
|
const gemini = installGemini(projectRoot, mcpEntry);
|
|
68
|
-
|
|
69
|
-
|
|
140
|
+
return {
|
|
141
|
+
client: 'gemini',
|
|
142
|
+
status: gemini.changed ? 'updated' : 'present',
|
|
143
|
+
files,
|
|
144
|
+
details: [describe(projectRoot, 'Gemini CLI MCP + hooks', gemini)]
|
|
145
|
+
};
|
|
70
146
|
}
|
|
71
147
|
catch (err) {
|
|
72
|
-
details
|
|
148
|
+
return { client: 'gemini', status: 'error', files, details: [`Failed to update Gemini CLI: ${err.message}`], error: err.message };
|
|
73
149
|
}
|
|
74
|
-
|
|
150
|
+
}
|
|
151
|
+
function uninstallGeminiClient(projectRoot) {
|
|
152
|
+
const files = [path.join('.gemini', 'settings.json')];
|
|
153
|
+
try {
|
|
154
|
+
const res = uninstallGemini(projectRoot);
|
|
155
|
+
const details = [
|
|
156
|
+
res.removedMcp ? 'Gemini CLI MCP server: removed' : 'Gemini CLI MCP server: not configured',
|
|
157
|
+
res.removedHooks > 0 ? `Gemini CLI hooks: removed ${res.removedHooks}` : 'Gemini CLI hooks: not configured'
|
|
158
|
+
];
|
|
159
|
+
const pruned = pruneEmptyDirs([path.join(projectRoot, '.gemini')]);
|
|
160
|
+
for (const dir of pruned)
|
|
161
|
+
details.push(`Removed empty directory ${relative(projectRoot, dir)}`);
|
|
162
|
+
return { client: 'gemini', status: res.changed ? 'removed' : 'absent', files, details };
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
return { client: 'gemini', status: 'error', files, details: [`Failed to clean Gemini CLI: ${err.message}`], error: err.message };
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function installCopilotClient(projectRoot, mcpEntry) {
|
|
169
|
+
const files = [path.join('.github', 'mcp.json'), path.join('.github', 'hooks', 'fastrmemory.json')];
|
|
75
170
|
try {
|
|
76
171
|
const copilot = installCopilot(projectRoot, mcpEntry);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
172
|
+
return {
|
|
173
|
+
client: 'copilot',
|
|
174
|
+
status: copilot.changed ? 'updated' : 'present',
|
|
175
|
+
files,
|
|
176
|
+
details: [
|
|
177
|
+
describe(projectRoot, 'Copilot CLI MCP', copilot.mcp),
|
|
178
|
+
describe(projectRoot, 'Copilot CLI hooks', copilot.hooks)
|
|
179
|
+
]
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
return { client: 'copilot', status: 'error', files, details: [`Failed to update Copilot CLI: ${err.message}`], error: err.message };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function uninstallCopilotClient(projectRoot) {
|
|
187
|
+
const files = [path.join('.github', 'mcp.json'), path.join('.github', 'hooks', 'fastrmemory.json')];
|
|
188
|
+
try {
|
|
189
|
+
const res = uninstallCopilot(projectRoot);
|
|
190
|
+
const details = [
|
|
191
|
+
res.removedMcp ? 'Copilot CLI MCP: removed' : 'Copilot CLI MCP: not configured',
|
|
192
|
+
res.removedHooks > 0 ? `Copilot CLI hooks: removed ${res.removedHooks}` : 'Copilot CLI hooks: not configured'
|
|
193
|
+
];
|
|
194
|
+
const pruned = pruneEmptyDirs([path.join(projectRoot, '.github', 'hooks'), path.join(projectRoot, '.github')]);
|
|
195
|
+
for (const dir of pruned)
|
|
196
|
+
details.push(`Removed empty directory ${relative(projectRoot, dir)}`);
|
|
197
|
+
return { client: 'copilot', status: res.changed ? 'removed' : 'absent', files, details };
|
|
80
198
|
}
|
|
81
199
|
catch (err) {
|
|
82
|
-
details
|
|
200
|
+
return { client: 'copilot', status: 'error', files, details: [`Failed to clean Copilot CLI: ${err.message}`], error: err.message };
|
|
83
201
|
}
|
|
84
|
-
|
|
202
|
+
}
|
|
203
|
+
function installOpenCodeClient(projectRoot, mcpEntry) {
|
|
204
|
+
const files = ['opencode.json', path.join('.opencode', 'plugins', 'fastrmemory', 'index.ts')];
|
|
85
205
|
try {
|
|
86
206
|
const openCode = installOpenCode(projectRoot, mcpEntry);
|
|
87
|
-
|
|
88
|
-
|
|
207
|
+
return {
|
|
208
|
+
client: 'opencode',
|
|
209
|
+
status: openCode.changed ? 'updated' : 'present',
|
|
210
|
+
files,
|
|
211
|
+
details: openCode.details
|
|
212
|
+
};
|
|
89
213
|
}
|
|
90
214
|
catch (err) {
|
|
91
|
-
details
|
|
215
|
+
return { client: 'opencode', status: 'error', files, details: [`Failed to update OpenCode: ${err.message}`], error: err.message };
|
|
92
216
|
}
|
|
93
|
-
|
|
217
|
+
}
|
|
218
|
+
function uninstallOpenCodeClient(projectRoot) {
|
|
219
|
+
const files = ['opencode.json', path.join('.opencode', 'plugins', 'fastrmemory', 'index.ts')];
|
|
94
220
|
try {
|
|
95
|
-
|
|
96
|
-
details.
|
|
97
|
-
? 'Appended Autonomous Memory Discipline block to AGENTS.md'
|
|
98
|
-
: 'AGENTS.md already contains FastrMemory autonomous discipline block');
|
|
221
|
+
const res = uninstallOpenCode(projectRoot);
|
|
222
|
+
return { client: 'opencode', status: res.changed ? 'removed' : 'absent', files, details: res.details };
|
|
99
223
|
}
|
|
100
224
|
catch (err) {
|
|
101
|
-
details
|
|
225
|
+
return { client: 'opencode', status: 'error', files, details: [`Failed to clean OpenCode: ${err.message}`], error: err.message };
|
|
102
226
|
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Wires FastrMemory into the selected project-scoped clients. Re-running is idempotent: every
|
|
230
|
+
* file is merged, not replaced, and a run that changes nothing reports `present`.
|
|
231
|
+
*
|
|
232
|
+
* Claude Code reads project MCP servers from `.mcp.json` and hooks from `.claude/settings.json`;
|
|
233
|
+
* Gemini CLI reads both from `.gemini/settings.json`; Copilot CLI reads `.github/mcp.json` and
|
|
234
|
+
* `.github/hooks/*.json`; OpenCode reads `opencode.json(c)` plus a managed plugin.
|
|
235
|
+
*/
|
|
236
|
+
export function installHookClients(projectRoot = process.cwd(), clients = [...HOOK_CLIENTS], options = {}) {
|
|
237
|
+
const mcpEntry = resolveMcpCommand();
|
|
238
|
+
const reports = [];
|
|
239
|
+
for (const client of clients) {
|
|
240
|
+
if (client === 'claude')
|
|
241
|
+
reports.push(installClaude(projectRoot, mcpEntry));
|
|
242
|
+
else if (client === 'cursor')
|
|
243
|
+
reports.push(installCursor(projectRoot, mcpEntry));
|
|
244
|
+
else if (client === 'opencode')
|
|
245
|
+
reports.push(installOpenCodeClient(projectRoot, mcpEntry));
|
|
246
|
+
else if (client === 'gemini')
|
|
247
|
+
reports.push(installGeminiClient(projectRoot, mcpEntry));
|
|
248
|
+
else
|
|
249
|
+
reports.push(installCopilotClient(projectRoot, mcpEntry));
|
|
250
|
+
}
|
|
251
|
+
const details = reports.flatMap((report) => report.details);
|
|
252
|
+
let agentsMdUpdated = false;
|
|
253
|
+
if (options.agentsMd !== false) {
|
|
254
|
+
try {
|
|
255
|
+
agentsMdUpdated = ensureAgentsDiscipline(projectRoot) === 'added';
|
|
256
|
+
details.push(agentsMdUpdated
|
|
257
|
+
? 'Appended Autonomous Memory Discipline block to AGENTS.md'
|
|
258
|
+
: 'AGENTS.md already contains FastrMemory autonomous discipline block');
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
details.push(`Failed to update AGENTS.md: ${err.message}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const statusOf = (client) => reports.find((report) => report.client === client)?.status === 'updated';
|
|
103
265
|
return {
|
|
104
|
-
claudeCodeUpdated,
|
|
105
|
-
cursorUpdated,
|
|
106
|
-
geminiUpdated,
|
|
107
|
-
copilotUpdated,
|
|
108
|
-
openCodeUpdated,
|
|
266
|
+
claudeCodeUpdated: statusOf('claude'),
|
|
267
|
+
cursorUpdated: statusOf('cursor'),
|
|
268
|
+
geminiUpdated: statusOf('gemini'),
|
|
269
|
+
copilotUpdated: statusOf('copilot'),
|
|
270
|
+
openCodeUpdated: statusOf('opencode'),
|
|
109
271
|
agentsMdUpdated,
|
|
110
272
|
details,
|
|
273
|
+
clients: reports
|
|
111
274
|
};
|
|
112
275
|
}
|
|
276
|
+
/**
|
|
277
|
+
* Removes exactly what `installHookClients` added: the `fastrmemory` MCP entry, every hook
|
|
278
|
+
* command this installer wrote, the managed OpenCode plugin, and the AGENTS.md discipline block.
|
|
279
|
+
* Files and directories that end up empty are removed. User entries in the same files survive.
|
|
280
|
+
*
|
|
281
|
+
* Idempotent: a second run reports `absent` and writes nothing.
|
|
282
|
+
*/
|
|
283
|
+
export function uninstallHookClients(projectRoot = process.cwd(), clients = [...HOOK_CLIENTS], options = {}) {
|
|
284
|
+
const reports = [];
|
|
285
|
+
for (const client of clients) {
|
|
286
|
+
if (client === 'claude')
|
|
287
|
+
reports.push(uninstallClaude(projectRoot));
|
|
288
|
+
else if (client === 'cursor')
|
|
289
|
+
reports.push(uninstallCursor(projectRoot));
|
|
290
|
+
else if (client === 'opencode')
|
|
291
|
+
reports.push(uninstallOpenCodeClient(projectRoot));
|
|
292
|
+
else if (client === 'gemini')
|
|
293
|
+
reports.push(uninstallGeminiClient(projectRoot));
|
|
294
|
+
else
|
|
295
|
+
reports.push(uninstallCopilotClient(projectRoot));
|
|
296
|
+
}
|
|
297
|
+
const details = reports.flatMap((report) => report.details);
|
|
298
|
+
let agentsMdRemoved = false;
|
|
299
|
+
if (options.agentsMd !== false) {
|
|
300
|
+
try {
|
|
301
|
+
agentsMdRemoved = removeAgentsDiscipline(projectRoot);
|
|
302
|
+
details.push(agentsMdRemoved
|
|
303
|
+
? 'Removed Autonomous Memory Discipline block from AGENTS.md'
|
|
304
|
+
: 'AGENTS.md contains no FastrMemory discipline block');
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
details.push(`Failed to clean AGENTS.md: ${err.message}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
changed: agentsMdRemoved || reports.some((report) => report.status === 'removed'),
|
|
312
|
+
agentsMdRemoved,
|
|
313
|
+
details,
|
|
314
|
+
clients: reports
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
/** Backwards-compatible wrapper used by the setup wizard. Installs every client plus AGENTS.md. */
|
|
318
|
+
export function installAgentHooks(projectRoot = process.cwd()) {
|
|
319
|
+
return installHookClients(projectRoot, [...HOOK_CLIENTS]);
|
|
320
|
+
}
|
|
113
321
|
//# sourceMappingURL=hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/installer/hooks.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/installer/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,9 @@ export interface JsonUpdateResult {
|
|
|
16
16
|
* - Writes atomically (temp file + rename) so a concurrent reader never sees a half-written file.
|
|
17
17
|
* - Skips the write entirely when the mutation produces no change.
|
|
18
18
|
*/
|
|
19
|
-
export declare function updateJsonConfig(filePath: string, mutate: (config: Record<string, any>) => void
|
|
19
|
+
export declare function updateJsonConfig(filePath: string, mutate: (config: Record<string, any>) => void, options?: {
|
|
20
|
+
backup?: boolean;
|
|
21
|
+
}): JsonUpdateResult;
|
|
20
22
|
export interface McpServerEntry {
|
|
21
23
|
command: string;
|
|
22
24
|
args: string[];
|
|
@@ -24,6 +26,12 @@ export interface McpServerEntry {
|
|
|
24
26
|
}
|
|
25
27
|
/** Adds or replaces the `fastrmemory` entry under `mcpServers`, leaving every other server untouched. */
|
|
26
28
|
export declare function upsertMcpServer(config: Record<string, any>, name: string, entry: McpServerEntry): void;
|
|
29
|
+
/**
|
|
30
|
+
* Removes one server entry and prunes the containers it leaves empty, so an uninstall returns
|
|
31
|
+
* the file to the shape the user had before install instead of leaving `{"mcpServers": {}}`.
|
|
32
|
+
* Returns true when an entry was actually removed.
|
|
33
|
+
*/
|
|
34
|
+
export declare function removeMcpServer(config: Record<string, any>, name: string): boolean;
|
|
27
35
|
export interface ClaudeHookSpec {
|
|
28
36
|
event: string;
|
|
29
37
|
command: string;
|
|
@@ -44,4 +52,20 @@ export declare function isFastrHookCommand(command: unknown): boolean;
|
|
|
44
52
|
* invalid bare-string form written by older versions) are replaced, so re-running is idempotent.
|
|
45
53
|
*/
|
|
46
54
|
export declare function mergeClaudeHooks(config: Record<string, any>, specs: ClaudeHookSpec[]): void;
|
|
55
|
+
/**
|
|
56
|
+
* Removes every hook group this installer wrote and prunes the events and the `hooks` object
|
|
57
|
+
* that are left empty. User hooks in the same file survive untouched.
|
|
58
|
+
*
|
|
59
|
+
* Returns the number of command hooks removed.
|
|
60
|
+
*/
|
|
61
|
+
export declare function removeClaudeHooks(config: Record<string, any>): number;
|
|
62
|
+
/**
|
|
63
|
+
* Deletes a JSON file when the mutation left nothing of the user's own in it, so an uninstall
|
|
64
|
+
* does not leave a `{}` file behind in a project that had no such config before install.
|
|
65
|
+
*
|
|
66
|
+
* Deliberately does not touch the one-time `.fastr.bak` that install may have written: the
|
|
67
|
+
* backup is a recovery point, and restoring it here could resurrect keys the user deleted
|
|
68
|
+
* after installing.
|
|
69
|
+
*/
|
|
70
|
+
export declare function deleteJsonConfigIfTrivial(filePath: string, isTrivial?: (config: Record<string, any>) => boolean): boolean;
|
|
47
71
|
//# sourceMappingURL=json-config.d.ts.map
|