memgrid 0.5.1 → 0.5.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/CHANGELOG.md +11 -0
- package/README.md +33 -0
- package/dist/claude-md.d.ts +4 -0
- package/dist/claude-md.d.ts.map +1 -0
- package/dist/claude-md.js +58 -0
- package/dist/claude-md.js.map +1 -0
- package/dist/hooks.d.ts +18 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +138 -0
- package/dist/hooks.js.map +1 -0
- package/dist/serve/cli.js +15 -1
- package/dist/serve/cli.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to MemGrid.
|
|
4
4
|
|
|
5
|
+
## v0.5.2 — Auto-Sync Hooks (unreleased)
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- `memgrid init` auto-configures memory sync hooks:
|
|
9
|
+
- **Claude Code PostCompletion** → runs `memgrid sync` after each task
|
|
10
|
+
- **Git post-commit** → runs `memgrid sync` after each commit
|
|
11
|
+
- All injections are non-destructive (merges with existing config)
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- README: added Auto-Sync Hooks section + CLAUDE.md integration template
|
|
15
|
+
|
|
5
16
|
## v0.5.1 — Search Bug Fix (2026-06-28)
|
|
6
17
|
|
|
7
18
|
### Fixed
|
package/README.md
CHANGED
|
@@ -246,6 +246,39 @@ MemGrid outputs **standardized Markdown context** consumable by any AI coding to
|
|
|
246
246
|
memgrid serve
|
|
247
247
|
```
|
|
248
248
|
|
|
249
|
+
## 🔄 Auto-Sync Hooks
|
|
250
|
+
|
|
251
|
+
`memgrid init` automatically configures hooks so your memory grid stays up to date without manual effort:
|
|
252
|
+
|
|
253
|
+
| Hook | Trigger | What it does |
|
|
254
|
+
|------|---------|--------------|
|
|
255
|
+
| **PostCompletion** | Claude Code finishes a task | Runs `memgrid sync` automatically |
|
|
256
|
+
| **post-commit** | `git commit` | Runs `memgrid sync` (covers non-Claude changes) |
|
|
257
|
+
|
|
258
|
+
All injections are **non-destructive** — existing config is merged, never overwritten.
|
|
259
|
+
|
|
260
|
+
## 📝 CLAUDE.md Integration (optional)
|
|
261
|
+
|
|
262
|
+
To make your AI agent proactive about memory, add these sections to your CLAUDE.md:
|
|
263
|
+
|
|
264
|
+
```markdown
|
|
265
|
+
## MemGrid
|
|
266
|
+
|
|
267
|
+
Before any task, search the memory grid for relevant context:
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
npx memgrid search "<what you're about to do>" --max 10
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
After completing code changes, sync the grid back:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
npx memgrid sync
|
|
277
|
+
```
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
> ⚠️ MemGrid won't touch your CLAUDE.md. The hooks above handle automatic sync. This snippet is just a recommendation — add it if you want your AI agent to actively *search* the grid before starting.
|
|
281
|
+
|
|
249
282
|
## License
|
|
250
283
|
|
|
251
284
|
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../src/claude-md.ts"],"names":[],"mappings":"AA4BA,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,GAClB;IAAE,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE,CAqChD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
const STARTUP_SECTION = `## 启动流程
|
|
4
|
+
|
|
5
|
+
**每次任务开始时,必须先执行:**
|
|
6
|
+
|
|
7
|
+
\`\`\`bash
|
|
8
|
+
npx memgrid search "<任务关键词>" --max 10
|
|
9
|
+
\`\`\`
|
|
10
|
+
|
|
11
|
+
这会从项目的记忆网格中检索最相关的上下文:
|
|
12
|
+
|
|
13
|
+
- 方法签名与实现
|
|
14
|
+
- 设计模式与规则
|
|
15
|
+
- 代码哲学与决策
|
|
16
|
+
- 项目结构与配置`;
|
|
17
|
+
const END_SECTION = `## 结束流程
|
|
18
|
+
|
|
19
|
+
**每次代码变更完成后,必须执行:**
|
|
20
|
+
|
|
21
|
+
\`\`\`bash
|
|
22
|
+
npx memgrid sync
|
|
23
|
+
\`\`\`
|
|
24
|
+
|
|
25
|
+
这不是可选的——是任务结束的强制步骤。MemGrid 会增量分析代码变更,将新的方法签名、设计模式、决策等写入记忆网格,确保下一次任务启动时知识是最新的。`;
|
|
26
|
+
export function injectMemGridFlow(projectRoot) {
|
|
27
|
+
const claudeMdPath = path.join(projectRoot, 'CLAUDE.md');
|
|
28
|
+
if (!fs.existsSync(claudeMdPath)) {
|
|
29
|
+
const content = `# Project\n\n${STARTUP_SECTION}\n\n${END_SECTION}\n`;
|
|
30
|
+
fs.writeFileSync(claudeMdPath, content, 'utf-8');
|
|
31
|
+
return { action: 'created' };
|
|
32
|
+
}
|
|
33
|
+
const existing = fs.readFileSync(claudeMdPath, 'utf-8');
|
|
34
|
+
const hasSearch = existing.includes('memgrid search');
|
|
35
|
+
const hasSync = existing.includes('memgrid sync');
|
|
36
|
+
if (hasSearch && hasSync) {
|
|
37
|
+
return { action: 'skipped' };
|
|
38
|
+
}
|
|
39
|
+
let modified = existing;
|
|
40
|
+
// Inject startup section after the first # heading line
|
|
41
|
+
if (!hasSearch) {
|
|
42
|
+
const headingMatch = modified.match(/^# .+$/m);
|
|
43
|
+
if (headingMatch && headingMatch.index !== undefined) {
|
|
44
|
+
const insertAt = headingMatch.index + headingMatch[0].length;
|
|
45
|
+
modified = modified.slice(0, insertAt) + '\n\n' + STARTUP_SECTION + '\n' + modified.slice(insertAt);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
modified = STARTUP_SECTION + '\n\n' + modified;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Append end section
|
|
52
|
+
if (!hasSync) {
|
|
53
|
+
modified = modified.trimEnd() + '\n\n' + END_SECTION + '\n';
|
|
54
|
+
}
|
|
55
|
+
fs.writeFileSync(claudeMdPath, modified, 'utf-8');
|
|
56
|
+
return { action: 'injected' };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=claude-md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../src/claude-md.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,eAAe,GAAG;;;;;;;;;;;;;UAad,CAAC;AAEX,MAAM,WAAW,GAAG;;;;;;;;8EAQ0D,CAAC;AAE/E,MAAM,UAAU,iBAAiB,CAC/B,WAAmB;IAEnB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAEzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,gBAAgB,eAAe,OAAO,WAAW,IAAI,CAAC;QACtE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAElD,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,QAAQ,GAAG,QAAQ,CAAC;IAExB,wDAAwD;IACxD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,YAAY,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7D,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,GAAG,eAAe,GAAG,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtG,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC;QACjD,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;IAC9D,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface InjectResult {
|
|
2
|
+
/** Which hooks were configured */
|
|
3
|
+
actions: string[];
|
|
4
|
+
/** Per-hook status */
|
|
5
|
+
details: {
|
|
6
|
+
claudeSettings?: 'created' | 'merged' | 'already_exists';
|
|
7
|
+
postCommit?: 'created' | 'already_exists' | 'not_hooky_project';
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Inject MemGrid sync hooks into the project.
|
|
12
|
+
*
|
|
13
|
+
* Two hooks:
|
|
14
|
+
* 1. .claude/settings.json → PostCompletion: auto-sync after Claude finishes a task
|
|
15
|
+
* 2. .git/hooks/post-commit → auto-sync after git commit (covers non-Claude changes)
|
|
16
|
+
*/
|
|
17
|
+
export declare function injectHooks(projectRoot: string): InjectResult;
|
|
18
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sBAAsB;IACtB,OAAO,EAAE;QACP,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,gBAAgB,CAAC;QACzD,UAAU,CAAC,EAAE,SAAS,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;KACjE,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAqB7D"}
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Inject MemGrid sync hooks into the project.
|
|
5
|
+
*
|
|
6
|
+
* Two hooks:
|
|
7
|
+
* 1. .claude/settings.json → PostCompletion: auto-sync after Claude finishes a task
|
|
8
|
+
* 2. .git/hooks/post-commit → auto-sync after git commit (covers non-Claude changes)
|
|
9
|
+
*/
|
|
10
|
+
export function injectHooks(projectRoot) {
|
|
11
|
+
const result = {
|
|
12
|
+
actions: [],
|
|
13
|
+
details: {},
|
|
14
|
+
};
|
|
15
|
+
// 1. Claude PostCompletion hook
|
|
16
|
+
const claudeResult = injectClaudeHook(projectRoot);
|
|
17
|
+
result.details.claudeSettings = claudeResult;
|
|
18
|
+
if (claudeResult !== 'already_exists') {
|
|
19
|
+
result.actions.push('claude-post-completion');
|
|
20
|
+
}
|
|
21
|
+
// 2. Git post-commit hook
|
|
22
|
+
const gitResult = injectGitHook(projectRoot);
|
|
23
|
+
result.details.postCommit = gitResult;
|
|
24
|
+
if (gitResult === 'created') {
|
|
25
|
+
result.actions.push('git-post-commit');
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Inject PostCompletion hook into .claude/settings.json.
|
|
31
|
+
* Non-destructive: merges with existing config.
|
|
32
|
+
*/
|
|
33
|
+
function injectClaudeHook(projectRoot) {
|
|
34
|
+
const settingsPath = path.join(projectRoot, '.claude', 'settings.json');
|
|
35
|
+
// Existing settings?
|
|
36
|
+
if (fs.existsSync(settingsPath)) {
|
|
37
|
+
try {
|
|
38
|
+
const existing = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
39
|
+
// Already has PostCompletion with memgrid sync?
|
|
40
|
+
if (existing.hooks?.PostCompletion?.some((h) => h.hooks.some((hook) => hook.command.includes('memgrid sync')))) {
|
|
41
|
+
return 'already_exists';
|
|
42
|
+
}
|
|
43
|
+
// Merge: add PostCompletion hook
|
|
44
|
+
if (!existing.hooks)
|
|
45
|
+
existing.hooks = {};
|
|
46
|
+
if (!existing.hooks.PostCompletion)
|
|
47
|
+
existing.hooks.PostCompletion = [];
|
|
48
|
+
existing.hooks.PostCompletion.push({
|
|
49
|
+
hooks: [
|
|
50
|
+
{
|
|
51
|
+
type: 'command',
|
|
52
|
+
command: 'npx memgrid sync --quiet 2>/dev/null || echo "memgrid sync skipped (memgrid not installed)"',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
});
|
|
56
|
+
fs.writeFileSync(settingsPath, JSON.stringify(existing, null, 2) + '\n', 'utf-8');
|
|
57
|
+
return 'merged';
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Invalid JSON — skip
|
|
61
|
+
return 'already_exists';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Create fresh .claude/settings.json
|
|
65
|
+
const dir = path.dirname(settingsPath);
|
|
66
|
+
if (!fs.existsSync(dir))
|
|
67
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
68
|
+
const settings = {
|
|
69
|
+
$schema: 'https://json.schemastore.org/claude-code-settings.json',
|
|
70
|
+
hooks: {
|
|
71
|
+
PostCompletion: [
|
|
72
|
+
{
|
|
73
|
+
hooks: [
|
|
74
|
+
{
|
|
75
|
+
type: 'command',
|
|
76
|
+
command: 'npx memgrid sync 2>/dev/null || echo "⚠️ memgrid sync failed — run memgrid init to set up"',
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
84
|
+
return 'created';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Inject post-commit hook for non-Claude changes (git commit by human or other tools).
|
|
88
|
+
*
|
|
89
|
+
* Creates .git/hooks/post-commit if it doesn't exist.
|
|
90
|
+
* If husky is detected, creates .husky/post-commit instead.
|
|
91
|
+
*/
|
|
92
|
+
function injectGitHook(projectRoot) {
|
|
93
|
+
const huskyDir = path.join(projectRoot, '.husky');
|
|
94
|
+
const gitHookPath = path.join(projectRoot, '.git', 'hooks', 'post-commit');
|
|
95
|
+
// Check husky first
|
|
96
|
+
if (fs.existsSync(huskyDir)) {
|
|
97
|
+
const huskyHookPath = path.join(huskyDir, 'post-commit');
|
|
98
|
+
if (fs.existsSync(huskyHookPath)) {
|
|
99
|
+
return 'already_exists';
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const hookContent = [
|
|
103
|
+
'#!/usr/bin/env sh',
|
|
104
|
+
'',
|
|
105
|
+
'# MemGrid: auto-sync memory grid after commit',
|
|
106
|
+
'npx memgrid sync --quiet 2>/dev/null || true',
|
|
107
|
+
'',
|
|
108
|
+
].join('\n');
|
|
109
|
+
fs.writeFileSync(huskyHookPath, hookContent, { mode: 0o755 });
|
|
110
|
+
return 'created';
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return 'not_hooky_project';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Fallback: native git hook
|
|
117
|
+
const hooksDir = path.dirname(gitHookPath);
|
|
118
|
+
if (!fs.existsSync(hooksDir))
|
|
119
|
+
return 'not_hooky_project';
|
|
120
|
+
if (fs.existsSync(gitHookPath)) {
|
|
121
|
+
return 'already_exists';
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const hookContent = [
|
|
125
|
+
'#!/bin/sh',
|
|
126
|
+
'',
|
|
127
|
+
'# MemGrid: auto-sync memory grid after commit',
|
|
128
|
+
'npx memgrid sync --quiet 2>/dev/null || true',
|
|
129
|
+
'',
|
|
130
|
+
].join('\n');
|
|
131
|
+
fs.writeFileSync(gitHookPath, hookContent, { mode: 0o755 });
|
|
132
|
+
return 'created';
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return 'not_hooky_project';
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/serve/cli.js
CHANGED
|
@@ -3,11 +3,12 @@ import { Command } from 'commander';
|
|
|
3
3
|
import { MemGrid } from '../memgrid.js';
|
|
4
4
|
import { TypeScriptScanner, JavaScriptScanner, PythonScanner, GoScanner, RustScanner, MarkdownScanner, RulesScanner, ConfigScanner, } from '../scanner/index.js';
|
|
5
5
|
import { startMCPServer } from './mcp-server.js';
|
|
6
|
+
import { injectHooks } from '../hooks.js';
|
|
6
7
|
const program = new Command();
|
|
7
8
|
program
|
|
8
9
|
.name('memgrid')
|
|
9
10
|
.description('Project-level semantic memory for AI coding agents')
|
|
10
|
-
.version('0.5.
|
|
11
|
+
.version('0.5.2');
|
|
11
12
|
program
|
|
12
13
|
.command('init')
|
|
13
14
|
.description('Scan project and generate initial memory grid')
|
|
@@ -52,6 +53,19 @@ program
|
|
|
52
53
|
}
|
|
53
54
|
console.log(`\nTotal: ${stats.totalUnits} units`);
|
|
54
55
|
console.log(`Storage: .claude/memory-grid/`);
|
|
56
|
+
// Auto-configure memory sync hooks
|
|
57
|
+
const hookResult = injectHooks(root);
|
|
58
|
+
if (hookResult.actions.length > 0) {
|
|
59
|
+
console.log('\n🔗 Auto-sync hooks:');
|
|
60
|
+
if (hookResult.actions.includes('claude-post-completion')) {
|
|
61
|
+
const status = hookResult.details.claudeSettings === 'created' ? 'created' : 'merged';
|
|
62
|
+
console.log(` .claude/settings.json: ${status} PostCompletion hook`);
|
|
63
|
+
}
|
|
64
|
+
if (hookResult.actions.includes('git-post-commit')) {
|
|
65
|
+
console.log(' post-commit hook: created');
|
|
66
|
+
}
|
|
67
|
+
console.log('\n ✅ Memory grid will auto-sync on task completion & git commit');
|
|
68
|
+
}
|
|
55
69
|
});
|
|
56
70
|
program
|
|
57
71
|
.command('sync')
|
package/dist/serve/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/serve/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,WAAW,EACX,eAAe,EACf,YAAY,EACZ,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/serve/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memgrid",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Project-level semantic memory system for AI coding agents. Replaces full-codebase context loading with a self-evolving knowledge-mesh.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|