mindlink 1.1.4 → 1.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 +28 -7
- package/dist/cli.js +33 -7
- package/dist/cli.js.map +1 -1
- package/dist/templates/agents/.clinerules +41 -9
- package/dist/templates/agents/.windsurfrules +41 -9
- package/dist/templates/agents/AGENTS.md +44 -9
- package/dist/templates/agents/CLAUDE.md +73 -13
- package/dist/templates/agents/CONVENTIONS.md +41 -9
- package/dist/templates/agents/CURSOR.md +44 -9
- package/dist/templates/agents/GEMINI.md +44 -9
- package/dist/templates/agents/copilot-instructions.md +39 -9
- package/dist/templates/brain/MEMORY.md +12 -0
- package/dist/templates/hooks/claude-settings.json +13 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,15 +12,17 @@ Three things break AI-assisted development:
|
|
|
12
12
|
|
|
13
13
|
MindLink fixes all three. One command per project.
|
|
14
14
|
|
|
15
|
+
Git gave every developer a shared version history. MindLink gives your AI team a shared memory — persistent, version-controlled, and not locked inside any one tool.
|
|
16
|
+
|
|
15
17
|
[](https://www.npmjs.com/package/mindlink)
|
|
16
18
|
[](LICENSE)
|
|
17
19
|
[](#installation)
|
|
18
20
|
|
|
19
21
|
---
|
|
20
22
|
|
|
21
|
-
> ### ◉ Latest — v1.1.
|
|
22
|
-
> **
|
|
23
|
-
> [→ Full release notes](https://github.com/404-not-found/mindlink/releases/tag/v1.1.
|
|
23
|
+
> ### ◉ Latest — v1.1.5
|
|
24
|
+
> **Stronger memory enforcement · MEMORY.md trigger checklist · mtime-based session verification · "git for AI memory" positioning · Claude Code best-in-class section**
|
|
25
|
+
> [→ Full release notes](https://github.com/404-not-found/mindlink/releases/tag/v1.1.5)
|
|
24
26
|
|
|
25
27
|
---
|
|
26
28
|
|
|
@@ -32,7 +34,7 @@ MindLink fixes all three. One command per project.
|
|
|
32
34
|
- [Supported Agents](#supported-agents)
|
|
33
35
|
- [Commands](#commands)
|
|
34
36
|
- [Can My AI Run These Commands?](#can-my-ai-run-these-commands-itself)
|
|
35
|
-
- [
|
|
37
|
+
- [Best with Claude Code](#best-with-claude-code)
|
|
36
38
|
- [License](#license)
|
|
37
39
|
- [Contributing](#contributing)
|
|
38
40
|
|
|
@@ -90,7 +92,7 @@ Close any AI session whenever you want — Claude Code, Cursor, Codex, whatever
|
|
|
90
92
|
|
|
91
93
|
**One memory, every agent** — use Claude Code in the morning, switch to Cursor in the afternoon — both read the exact same `.brain/` folder. No syncing. No duplicating context. No "but I told the other AI this already." Every agent you use shares one brain, because the memory lives in your project, not inside any particular tool. This is something no AI vendor can replicate — they each only know their own product.
|
|
92
94
|
|
|
93
|
-
**Team memory
|
|
95
|
+
**Team memory, like git** — commit `.brain/` to git and your whole team shares the same AI context, automatically. New developer joins, does `git pull` — their AI is already fully briefed. Two developers in the same project? Their agents share context in real time, just like working off the same branch. No onboarding session, no copying notes, no "let me catch you up." This is what git did for code history — MindLink does for AI memory.
|
|
94
96
|
|
|
95
97
|
**Plug in, not lock in** — works with Claude Code, Cursor, Codex, Gemini CLI, GitHub Copilot, Windsurf, Cline, Aider, and more. Because MindLink just writes files that agents read — no APIs, no SDKs, no version dependencies — it works with whatever version you have installed today and every version that comes after.
|
|
96
98
|
|
|
@@ -179,9 +181,28 @@ The one exception: `mindlink sync` in watch mode runs continuously — keep it i
|
|
|
179
181
|
|
|
180
182
|
---
|
|
181
183
|
|
|
182
|
-
##
|
|
184
|
+
## Best with Claude Code
|
|
185
|
+
|
|
186
|
+
MindLink works with every agent listed above. But Claude Code users get something the others don't: **a second enforcement layer**.
|
|
187
|
+
|
|
188
|
+
Every other agent reads the instruction file at startup and follows it as best it can. That's the instruction layer — guidance, not guarantees. The agent can skip a step, misread a section, or forget to write after a long session.
|
|
189
|
+
|
|
190
|
+
Claude Code gets both the instruction file **and** an OS-level hook that fires before every single message — outside the AI's control. This hook:
|
|
191
|
+
|
|
192
|
+
- Scans for memory triggers and reminds the agent to write `MEMORY.md` before answering
|
|
193
|
+
- Forces `SESSION.md` to be updated as the last action of every response
|
|
194
|
+
- Runs a shell-level check after every response: if `MEMORY.md` still contains only placeholders, the agent is immediately flagged and must fill it in before continuing
|
|
195
|
+
|
|
196
|
+
**The practical difference:**
|
|
197
|
+
|
|
198
|
+
| | All other agents | Claude Code |
|
|
199
|
+
|---|---|---|
|
|
200
|
+
| Persistent memory | ✓ instruction file | ✓ instruction file + hook |
|
|
201
|
+
| Enforced on every message | ✗ | ✓ OS-level hook |
|
|
202
|
+
| Post-response memory verification | ✗ | ✓ shell check |
|
|
203
|
+
| Context compaction recovery | ✓ instruction | ✓ instruction + hook |
|
|
183
204
|
|
|
184
|
-
|
|
205
|
+
If you're choosing an agent specifically to use with MindLink, Claude Code gives you the most reliable memory behavior. Other agents work well — Claude Code works harder.
|
|
185
206
|
|
|
186
207
|
---
|
|
187
208
|
|
package/dist/cli.js
CHANGED
|
@@ -5,7 +5,7 @@ import { Command as Command15 } from "commander";
|
|
|
5
5
|
import chalk16 from "chalk";
|
|
6
6
|
|
|
7
7
|
// src/utils/version.ts
|
|
8
|
-
var VERSION = "1.1.
|
|
8
|
+
var VERSION = "1.1.5";
|
|
9
9
|
|
|
10
10
|
// src/commands/init.ts
|
|
11
11
|
import { Command } from "commander";
|
|
@@ -582,7 +582,7 @@ Examples:
|
|
|
582
582
|
// src/commands/clear.ts
|
|
583
583
|
import { Command as Command4 } from "commander";
|
|
584
584
|
import chalk5 from "chalk";
|
|
585
|
-
import { existsSync as existsSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync3 } from "fs";
|
|
585
|
+
import { existsSync as existsSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync3, unlinkSync } from "fs";
|
|
586
586
|
import { join as join6, resolve as resolve4 } from "path";
|
|
587
587
|
var clearCommand = new Command4("clear").description("Reset SESSION.md for a fresh session start").option("-y, --yes", "Skip confirmation prompt").addHelpText("after", `
|
|
588
588
|
What it does:
|
|
@@ -611,6 +611,8 @@ Examples:
|
|
|
611
611
|
const templatePath = join6(BRAIN_TEMPLATES_DIR, "SESSION.md");
|
|
612
612
|
const destPath = join6(brainDir, "SESSION.md");
|
|
613
613
|
writeFileSync3(destPath, readFileSync5(templatePath, "utf8"));
|
|
614
|
+
const tsDest = join6(brainDir, ".session_ts");
|
|
615
|
+
if (existsSync5(tsDest)) unlinkSync(tsDest);
|
|
614
616
|
} catch (err) {
|
|
615
617
|
console.log(` ${chalk5.red("\u2717")} ${err instanceof Error ? err.message : String(err)}`);
|
|
616
618
|
console.log("");
|
|
@@ -699,7 +701,7 @@ import {
|
|
|
699
701
|
writeFileSync as writeFileSync5,
|
|
700
702
|
appendFileSync as appendFileSync2,
|
|
701
703
|
mkdirSync as mkdirSync3,
|
|
702
|
-
unlinkSync
|
|
704
|
+
unlinkSync as unlinkSync2
|
|
703
705
|
} from "fs";
|
|
704
706
|
import { join as join8, resolve as resolve6, dirname as dirname3 } from "path";
|
|
705
707
|
function readConfig(brainDir) {
|
|
@@ -739,7 +741,7 @@ function removeAgentFile(projectPath, agentValue) {
|
|
|
739
741
|
if (!agent) return null;
|
|
740
742
|
const destPath = join8(projectPath, agent.destFile);
|
|
741
743
|
if (!existsSync7(destPath)) return null;
|
|
742
|
-
|
|
744
|
+
unlinkSync2(destPath);
|
|
743
745
|
return agent.destFile;
|
|
744
746
|
}
|
|
745
747
|
function addClaudeHook(projectPath) {
|
|
@@ -1171,6 +1173,30 @@ Examples:
|
|
|
1171
1173
|
} catch {
|
|
1172
1174
|
}
|
|
1173
1175
|
}
|
|
1176
|
+
const memoryPath = join10(projectPath, BRAIN_DIR, "MEMORY.md");
|
|
1177
|
+
if (existsSync9(memoryPath)) {
|
|
1178
|
+
try {
|
|
1179
|
+
const content = readFileSync9(memoryPath, "utf8");
|
|
1180
|
+
if (!content.includes("## User Profile") && content.includes("## Important Context")) {
|
|
1181
|
+
const userProfileBlock = `## User Profile <!-- READ EVERY SESSION \u2014 personal facts about the user -->
|
|
1182
|
+
|
|
1183
|
+
<!-- Job, company, level, years of experience, immigration status -->
|
|
1184
|
+
<!-- Age, health, physical details -->
|
|
1185
|
+
<!-- Family, relationships, major life events -->
|
|
1186
|
+
<!-- Long-term goals: career, financial, personal -->
|
|
1187
|
+
<!-- Strong opinions, values, preferences -->
|
|
1188
|
+
<!-- Update in place \u2014 do not append; consolidate when it grows -->
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
---
|
|
1192
|
+
|
|
1193
|
+
`;
|
|
1194
|
+
writeFileSync6(memoryPath, content.replace("## Important Context", userProfileBlock + "## Important Context"));
|
|
1195
|
+
refreshed.push(".brain/MEMORY.md");
|
|
1196
|
+
}
|
|
1197
|
+
} catch {
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1174
1200
|
console.log(` ${chalk9.bold(projectPath)}`);
|
|
1175
1201
|
for (const f of refreshed) {
|
|
1176
1202
|
console.log(` ${chalk9.green("\u2713")} ${f}`);
|
|
@@ -1301,7 +1327,7 @@ to get a full briefing on the current project state.
|
|
|
1301
1327
|
import { Command as Command10 } from "commander";
|
|
1302
1328
|
import { select as select4, isCancel as isCancel5, cancel as cancel5 } from "@clack/prompts";
|
|
1303
1329
|
import chalk11 from "chalk";
|
|
1304
|
-
import { existsSync as existsSync11, readFileSync as readFileSync11, rmSync, unlinkSync as
|
|
1330
|
+
import { existsSync as existsSync11, readFileSync as readFileSync11, rmSync, unlinkSync as unlinkSync3 } from "fs";
|
|
1305
1331
|
import { join as join12, resolve as resolve9 } from "path";
|
|
1306
1332
|
var uninstallCommand = new Command10("uninstall").description("Remove MindLink from the current project").option("-y, --yes", "Skip confirmation and remove all project files").addHelpText("after", `
|
|
1307
1333
|
What gets removed:
|
|
@@ -1383,7 +1409,7 @@ Examples:
|
|
|
1383
1409
|
const destPath = join12(projectPath, agent.destFile);
|
|
1384
1410
|
if (existsSync11(destPath)) {
|
|
1385
1411
|
try {
|
|
1386
|
-
|
|
1412
|
+
unlinkSync3(destPath);
|
|
1387
1413
|
removed.push(agent.destFile);
|
|
1388
1414
|
} catch (err) {
|
|
1389
1415
|
errors.push(`${agent.destFile}: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1394,7 +1420,7 @@ Examples:
|
|
|
1394
1420
|
const hookPath = join12(projectPath, ".claude", "settings.json");
|
|
1395
1421
|
if (existsSync11(hookPath)) {
|
|
1396
1422
|
try {
|
|
1397
|
-
|
|
1423
|
+
unlinkSync3(hookPath);
|
|
1398
1424
|
removed.push(".claude/settings.json");
|
|
1399
1425
|
} catch {
|
|
1400
1426
|
}
|