memorylink 2.1.1 → 2.2.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/README.md +50 -46
- package/dist/cli/commands/delete.d.ts +7 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +106 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/gate.d.ts +1 -1
- package/dist/cli/commands/gate.d.ts.map +1 -1
- package/dist/cli/commands/gate.js +14 -0
- package/dist/cli/commands/gate.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +17 -75
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/list.d.ts +7 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +129 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/remember.d.ts +3 -0
- package/dist/cli/commands/remember.d.ts.map +1 -0
- package/dist/cli/commands/remember.js +61 -0
- package/dist/cli/commands/remember.js.map +1 -0
- package/dist/cli/commands/retrieve.d.ts +3 -0
- package/dist/cli/commands/retrieve.d.ts.map +1 -0
- package/dist/cli/commands/retrieve.js +32 -0
- package/dist/cli/commands/retrieve.js.map +1 -0
- package/dist/cli/commands/scaffold.d.ts +6 -0
- package/dist/cli/commands/scaffold.d.ts.map +1 -0
- package/dist/cli/commands/scaffold.js +132 -0
- package/dist/cli/commands/scaffold.js.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/memory/gates.d.ts +17 -0
- package/dist/core/memory/gates.d.ts.map +1 -0
- package/dist/core/memory/gates.js +75 -0
- package/dist/core/memory/gates.js.map +1 -0
- package/dist/core/memory/git.d.ts +9 -0
- package/dist/core/memory/git.d.ts.map +1 -0
- package/dist/core/memory/git.js +57 -0
- package/dist/core/memory/git.js.map +1 -0
- package/dist/core/memory/storage.d.ts +11 -0
- package/dist/core/memory/storage.d.ts.map +1 -0
- package/dist/core/memory/storage.js +63 -0
- package/dist/core/memory/storage.js.map +1 -0
- package/dist/core/memory/structure.d.ts +10 -0
- package/dist/core/memory/structure.d.ts.map +1 -0
- package/dist/core/memory/structure.js +51 -0
- package/dist/core/memory/structure.js.map +1 -0
- package/dist/core/types.d.ts +13 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/gate/rules/valid-syntax.d.ts +16 -0
- package/dist/gate/rules/valid-syntax.d.ts.map +1 -0
- package/dist/gate/rules/valid-syntax.js +76 -0
- package/dist/gate/rules/valid-syntax.js.map +1 -0
- package/dist/tools/pointer-generator.d.ts.map +1 -1
- package/dist/tools/pointer-generator.js +2 -2
- package/dist/tools/pointer-generator.js.map +1 -1
- package/docs/USER_GUIDE.md +181 -0
- package/package.json +2 -2
- package/docs/COMPARISONS.md +0 -229
- package/docs/FAQ.md +0 -230
- package/docs/GETTING_STARTED.md +0 -185
- package/docs/PATTERNS.md +0 -206
- package/docs/QUICK_REFERENCE.md +0 -209
- package/docs/REMEDIATION.md +0 -332
- package/docs/THREAT_MODEL.md +0 -279
- package/docs/TROUBLESHOOTING.md +0 -280
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
export class Git {
|
|
3
|
+
basePath;
|
|
4
|
+
constructor(basePath = process.cwd()) {
|
|
5
|
+
this.basePath = basePath;
|
|
6
|
+
}
|
|
7
|
+
async getHeadHash() {
|
|
8
|
+
try {
|
|
9
|
+
const { stdout } = await execa('git', ['rev-parse', 'HEAD'], { cwd: this.basePath });
|
|
10
|
+
return stdout.trim();
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
return '0000000000000000000000000000000000000000'; // No commit yet
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async getDiff(target, filePath) {
|
|
17
|
+
const args = ['diff'];
|
|
18
|
+
if (target === 'staged')
|
|
19
|
+
args.push('--cached');
|
|
20
|
+
if (target === 'last-commit')
|
|
21
|
+
args.push('HEAD^', 'HEAD');
|
|
22
|
+
// Minimal context to save tokens, but enough to apply
|
|
23
|
+
args.push('--minimal');
|
|
24
|
+
if (filePath) {
|
|
25
|
+
args.push('--', filePath);
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const { stdout } = await execa('git', args, { cwd: this.basePath });
|
|
29
|
+
return stdout;
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async getFileStatus(filePath) {
|
|
36
|
+
// Check status using git status --porcelain
|
|
37
|
+
try {
|
|
38
|
+
const { stdout } = await execa('git', ['status', '--porcelain', filePath], { cwd: this.basePath });
|
|
39
|
+
if (!stdout)
|
|
40
|
+
return 'unknown'; // Unchanged or untracked (if ignored)
|
|
41
|
+
const code = stdout.substring(0, 2);
|
|
42
|
+
if (code.includes('M'))
|
|
43
|
+
return 'modified';
|
|
44
|
+
if (code.includes('A') || code.includes('?'))
|
|
45
|
+
return 'added'; // ? is untracked
|
|
46
|
+
if (code.includes('D'))
|
|
47
|
+
return 'deleted';
|
|
48
|
+
if (code.includes('R'))
|
|
49
|
+
return 'renamed';
|
|
50
|
+
return 'unknown';
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
return 'unknown';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/core/memory/git.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAI9B,MAAM,OAAO,GAAG;IACZ,QAAQ,CAAS;IAEjB,YAAY,WAAmB,OAAO,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,WAAW;QACb,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,0CAA0C,CAAC,CAAC,gBAAgB;QACvE,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAA4C,EAAE,QAAiB;QACzE,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAEtB,IAAI,MAAM,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,MAAM,KAAK,aAAa;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEzD,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvB,IAAI,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpE,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAChC,4CAA4C;QAC5C,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnG,IAAI,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC,CAAC,sCAAsC;YAErE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,UAAU,CAAC;YAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC,CAAC,iBAAiB;YAC/E,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAC;YACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAC;YACzC,OAAO,SAAS,CAAC;QACrB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MemoryEntry } from '../types.js';
|
|
2
|
+
export declare class MemoryStorage {
|
|
3
|
+
basePath: string;
|
|
4
|
+
constructor(basePath?: string);
|
|
5
|
+
get memoryPath(): string;
|
|
6
|
+
get configPath(): string;
|
|
7
|
+
init(): Promise<boolean>;
|
|
8
|
+
append(entry: MemoryEntry): Promise<void>;
|
|
9
|
+
readAll(): Promise<MemoryEntry[]>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/core/memory/storage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM1C,qBAAa,aAAa;IACtB,QAAQ,EAAE,MAAM,CAAC;gBAEL,QAAQ,GAAE,MAAsB;IAI5C,IAAI,UAAU,WAEb;IAED,IAAI,UAAU,WAEb;IAEK,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IA2BxB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAe1C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const MEMORY_DIR = '.memorylink';
|
|
4
|
+
const MEMORY_FILE = 'memory.jsonl';
|
|
5
|
+
const CONFIG_FILE = 'config.json';
|
|
6
|
+
export class MemoryStorage {
|
|
7
|
+
basePath;
|
|
8
|
+
constructor(basePath = process.cwd()) {
|
|
9
|
+
this.basePath = basePath;
|
|
10
|
+
}
|
|
11
|
+
get memoryPath() {
|
|
12
|
+
return path.join(this.basePath, MEMORY_DIR, MEMORY_FILE);
|
|
13
|
+
}
|
|
14
|
+
get configPath() {
|
|
15
|
+
return path.join(this.basePath, MEMORY_DIR, CONFIG_FILE);
|
|
16
|
+
}
|
|
17
|
+
async init() {
|
|
18
|
+
const dir = path.join(this.basePath, MEMORY_DIR);
|
|
19
|
+
if (await fs.pathExists(dir)) {
|
|
20
|
+
// Check if memory file exists, if not create it
|
|
21
|
+
if (!await fs.pathExists(this.memoryPath)) {
|
|
22
|
+
await fs.ensureFile(this.memoryPath);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
return false; // Already initialized fully
|
|
26
|
+
}
|
|
27
|
+
await fs.ensureDir(dir);
|
|
28
|
+
await fs.ensureFile(this.memoryPath);
|
|
29
|
+
// Default Config
|
|
30
|
+
const defaultConfig = {
|
|
31
|
+
version: "1.6.0",
|
|
32
|
+
policies: ["no-secrets", "no-large-files"],
|
|
33
|
+
gates: {
|
|
34
|
+
stale_threshold_hours: 24
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
await fs.writeJson(this.configPath, defaultConfig, { spaces: 2 });
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
async append(entry) {
|
|
41
|
+
// Append as single line JSON
|
|
42
|
+
const line = JSON.stringify(entry) + '\n';
|
|
43
|
+
await fs.appendFile(this.memoryPath, line);
|
|
44
|
+
}
|
|
45
|
+
async readAll() {
|
|
46
|
+
if (!await fs.pathExists(this.memoryPath))
|
|
47
|
+
return [];
|
|
48
|
+
const content = await fs.readFile(this.memoryPath, 'utf8');
|
|
49
|
+
return content
|
|
50
|
+
.split('\n')
|
|
51
|
+
.filter(line => line.trim())
|
|
52
|
+
.map(line => {
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(line);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
.filter(e => e !== null);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/core/memory/storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,UAAU,GAAG,aAAa,CAAC;AACjC,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,OAAO,aAAa;IACtB,QAAQ,CAAS;IAEjB,YAAY,WAAmB,OAAO,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,gDAAgD;YAChD,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrC,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,OAAO,KAAK,CAAC,CAAC,4BAA4B;QAC9C,CAAC;QAED,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAErC,iBAAiB;QACjB,MAAM,aAAa,GAAG;YAClB,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC;YAC1C,KAAK,EAAE;gBACH,qBAAqB,EAAE,EAAE;aAC5B;SACJ,CAAC;QAEF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC3B,6BAA6B;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAC1C,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO;QACT,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,OAAO;aACT,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC3B,GAAG,CAAC,IAAI,CAAC,EAAE;YACR,IAAI,CAAC;gBACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAkB,CAAC;IAClD,CAAC;CACJ"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface CodeSymbol {
|
|
2
|
+
name: string;
|
|
3
|
+
type: 'class' | 'function' | 'interface' | 'variable' | 'method';
|
|
4
|
+
line: number;
|
|
5
|
+
signature?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class StructureAnalyzer {
|
|
8
|
+
analyze(filePath: string): Promise<CodeSymbol[]>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=structure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../src/core/memory/structure.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,iBAAiB;IAEpB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAqDzD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
export class StructureAnalyzer {
|
|
4
|
+
async analyze(filePath) {
|
|
5
|
+
if (!await fs.pathExists(filePath))
|
|
6
|
+
return [];
|
|
7
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
8
|
+
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
9
|
+
if (sourceFile.parseDiagnostics && sourceFile.parseDiagnostics.length > 0) {
|
|
10
|
+
const diags = sourceFile.parseDiagnostics;
|
|
11
|
+
throw new Error(`Parse error: ${diags[0].messageText}`);
|
|
12
|
+
}
|
|
13
|
+
const symbols = [];
|
|
14
|
+
const visit = (node) => {
|
|
15
|
+
if (ts.isClassDeclaration(node) && node.name) {
|
|
16
|
+
symbols.push({
|
|
17
|
+
name: node.name.text,
|
|
18
|
+
type: 'class',
|
|
19
|
+
line: sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
else if (ts.isFunctionDeclaration(node) && node.name) {
|
|
23
|
+
symbols.push({
|
|
24
|
+
name: node.name.text,
|
|
25
|
+
type: 'function',
|
|
26
|
+
line: sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1,
|
|
27
|
+
signature: content.substring(node.getStart(), node.body?.getStart() || node.getEnd()).trim()
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
else if (ts.isInterfaceDeclaration(node) && node.name) {
|
|
31
|
+
symbols.push({
|
|
32
|
+
name: node.name.text,
|
|
33
|
+
type: 'interface',
|
|
34
|
+
line: sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else if (ts.isMethodDeclaration(node) && ts.isIdentifier(node.name)) {
|
|
38
|
+
symbols.push({
|
|
39
|
+
name: node.name.text,
|
|
40
|
+
type: 'method',
|
|
41
|
+
line: sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Add more types as needed (variables, enums)
|
|
45
|
+
ts.forEachChild(node, visit);
|
|
46
|
+
};
|
|
47
|
+
visit(sourceFile);
|
|
48
|
+
return symbols;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../../../src/core/memory/structure.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -91,7 +91,7 @@ export interface AuditEvent {
|
|
|
91
91
|
/**
|
|
92
92
|
* Gate rule types
|
|
93
93
|
*/
|
|
94
|
-
export type GateRule = 'block-quarantined' | 'require-e2-for-topics';
|
|
94
|
+
export type GateRule = 'block-quarantined' | 'require-e2-for-topics' | 'valid-syntax';
|
|
95
95
|
/**
|
|
96
96
|
* Gate result
|
|
97
97
|
*/
|
|
@@ -143,4 +143,16 @@ export type Result<T, E = Error> = {
|
|
|
143
143
|
*/
|
|
144
144
|
export declare function Ok<T>(value: T): Result<T, never>;
|
|
145
145
|
export declare function Err<E>(error: E): Result<never, E>;
|
|
146
|
+
export type MemoryGate = 'GREEN' | 'YELLOW' | 'RED';
|
|
147
|
+
export interface MemoryEntry {
|
|
148
|
+
id: string;
|
|
149
|
+
path: string;
|
|
150
|
+
summary: string;
|
|
151
|
+
diff_ref: string;
|
|
152
|
+
status: MemoryStatus;
|
|
153
|
+
gate: MemoryGate;
|
|
154
|
+
policies: string[];
|
|
155
|
+
agent_id: string;
|
|
156
|
+
timestamp: string;
|
|
157
|
+
}
|
|
146
158
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAC;AAEnE;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAE3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,aAAa,CAAC;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IAGzB,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IAGF,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,CAAC;IACpD,UAAU,CAAC,EAAE;QACX,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,SAAS,GACT,YAAY,GACZ,MAAM,GACN,OAAO,GACP,WAAW,GACX,aAAa,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,cAAc,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,mBAAmB,GAAG,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* valid-syntax gate rule (Blue Gate)
|
|
3
|
+
* Week 3: Deep Logic
|
|
4
|
+
* Based on SPEC.md v4.3.10
|
|
5
|
+
*
|
|
6
|
+
* Rule: FAIL if code has Syntax Errors (AST Parse Failures)
|
|
7
|
+
*/
|
|
8
|
+
import type { Scope, GateResult } from '../../core/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Check for syntax errors in staged/project files
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkValidSyntax(cwd: string, _scope?: Scope, options?: {
|
|
13
|
+
diff?: boolean;
|
|
14
|
+
files?: string[];
|
|
15
|
+
}): Promise<GateResult>;
|
|
16
|
+
//# sourceMappingURL=valid-syntax.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valid-syntax.d.ts","sourceRoot":"","sources":["../../../src/gate/rules/valid-syntax.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAiB,MAAM,qBAAqB,CAAC;AAW5E;;GAEG;AACH,wBAAsB,gBAAgB,CAClC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,KAAK,EACd,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GACnD,OAAO,CAAC,UAAU,CAAC,CA6DrB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* valid-syntax gate rule (Blue Gate)
|
|
3
|
+
* Week 3: Deep Logic
|
|
4
|
+
* Based on SPEC.md v4.3.10
|
|
5
|
+
*
|
|
6
|
+
* Rule: FAIL if code has Syntax Errors (AST Parse Failures)
|
|
7
|
+
*/
|
|
8
|
+
import { EXIT_CODES } from '../../core/exit-codes.js';
|
|
9
|
+
import { readFile } from 'fs/promises';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import ts from 'typescript';
|
|
12
|
+
// @ts-ignore - glob types missing
|
|
13
|
+
import glob from 'glob';
|
|
14
|
+
import { promisify } from 'util';
|
|
15
|
+
const globAsync = promisify(glob);
|
|
16
|
+
/**
|
|
17
|
+
* Check for syntax errors in staged/project files
|
|
18
|
+
*/
|
|
19
|
+
export async function checkValidSyntax(cwd, _scope, options = {}) {
|
|
20
|
+
const violations = [];
|
|
21
|
+
const filesToCheck = [];
|
|
22
|
+
try {
|
|
23
|
+
// 1. Determine files to check
|
|
24
|
+
if (options.files && options.files.length > 0) {
|
|
25
|
+
filesToCheck.push(...options.files);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Scan all .ts/.js files in src needed
|
|
29
|
+
// Production: specific focus on source code to save time
|
|
30
|
+
const matches = await globAsync('src/**/*.{ts,js,tsx,jsx}', { cwd, ignore: ['node_modules/**'] });
|
|
31
|
+
filesToCheck.push(...matches);
|
|
32
|
+
}
|
|
33
|
+
// 2. Parse each file
|
|
34
|
+
for (const file of filesToCheck) {
|
|
35
|
+
const fullPath = join(cwd, file);
|
|
36
|
+
try {
|
|
37
|
+
const content = await readFile(fullPath, 'utf-8');
|
|
38
|
+
// Better approach for speed:
|
|
39
|
+
// Use transpileModule to check for syntax errors
|
|
40
|
+
const result = ts.transpileModule(content, {
|
|
41
|
+
compilerOptions: { noEmit: true, skipLibCheck: true },
|
|
42
|
+
reportDiagnostics: true
|
|
43
|
+
});
|
|
44
|
+
if (result.diagnostics && result.diagnostics.length > 0) {
|
|
45
|
+
// Found syntax errors
|
|
46
|
+
violations.push({
|
|
47
|
+
record_id: 'syntax-error',
|
|
48
|
+
conflict_key: file,
|
|
49
|
+
created_at: new Date().toISOString(),
|
|
50
|
+
quarantine_ref: result.diagnostics[0].messageText.toString()
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
// file reading error or general failure
|
|
56
|
+
console.warn(`Skipping syntax check for ${file}: ${e.message}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const passed = violations.length === 0;
|
|
60
|
+
return {
|
|
61
|
+
passed,
|
|
62
|
+
rule: 'valid-syntax',
|
|
63
|
+
violations,
|
|
64
|
+
exitCode: passed ? EXIT_CODES.SUCCESS : EXIT_CODES.FAILURE,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return {
|
|
69
|
+
passed: false,
|
|
70
|
+
rule: 'valid-syntax',
|
|
71
|
+
violations: [],
|
|
72
|
+
exitCode: EXIT_CODES.ERROR
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=valid-syntax.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valid-syntax.js","sourceRoot":"","sources":["../../../src/gate/rules/valid-syntax.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,kCAAkC;AAClC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAClC,GAAW,EACX,MAAc,EACd,UAAgD,EAAE;IAElD,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,IAAI,CAAC;QACD,8BAA8B;QAC9B,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACJ,uCAAuC;YACvC,yDAAyD;YACzD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,0BAA0B,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAClG,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAClC,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAElD,6BAA6B;gBAC7B,iDAAiD;gBACjD,MAAM,MAAM,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE;oBACvC,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE;oBACrD,iBAAiB,EAAE,IAAI;iBAC1B,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtD,sBAAsB;oBACtB,UAAU,CAAC,IAAI,CAAC;wBACZ,SAAS,EAAE,cAAc;wBACzB,YAAY,EAAE,IAAI;wBAClB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACpC,cAAc,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE;qBAC/D,CAAC,CAAC;gBACP,CAAC;YAEL,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,wCAAwC;gBACxC,OAAO,CAAC,IAAI,CAAC,6BAA6B,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;QAEvC,OAAO;YACH,MAAM;YACN,IAAI,EAAE,cAAc;YACpB,UAAU;YACV,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO;SAC7D,CAAC;IAEN,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,OAAO;YACH,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,cAAc;YACpB,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,UAAU,CAAC,KAAK;SAC7B,CAAC;IACN,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer-generator.d.ts","sourceRoot":"","sources":["../../src/tools/pointer-generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,MAAsB,EAC3B,OAAO,GAAE,MAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAsBrC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,GAAE,MAAsB,EAC3B,OAAO,GAAE,
|
|
1
|
+
{"version":3,"file":"pointer-generator.d.ts","sourceRoot":"","sources":["../../src/tools/pointer-generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,MAAsB,EAC3B,OAAO,GAAE,MAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAsBrC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,GAAE,MAAsB,EAC3B,OAAO,GAAE,MAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAsBrC;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,GAAE,MAAsB,EAC3B,OAAO,GAAE,MAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CA6BrC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAoBrC"}
|
|
@@ -37,7 +37,7 @@ This file points to the universal hub to ensure consistency across all AI tools.
|
|
|
37
37
|
/**
|
|
38
38
|
* Generate CLAUDE.md file
|
|
39
39
|
*/
|
|
40
|
-
export async function generateClaudeMd(cwd = process.cwd(), hubName = '
|
|
40
|
+
export async function generateClaudeMd(cwd = process.cwd(), hubName = 'AGENT.md') {
|
|
41
41
|
try {
|
|
42
42
|
const claudePath = resolve(cwd, 'CLAUDE.md');
|
|
43
43
|
const content = `# Claude Code Configuration
|
|
@@ -60,7 +60,7 @@ This file points to the universal hub to ensure consistency across all AI tools.
|
|
|
60
60
|
/**
|
|
61
61
|
* Generate GitHub Copilot instructions
|
|
62
62
|
*/
|
|
63
|
-
export async function generateCopilotInstructions(cwd = process.cwd(), hubName = '
|
|
63
|
+
export async function generateCopilotInstructions(cwd = process.cwd(), hubName = 'AGENT.md') {
|
|
64
64
|
try {
|
|
65
65
|
const copilotDir = resolve(cwd, '.github');
|
|
66
66
|
if (!existsSync(copilotDir)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer-generator.js","sourceRoot":"","sources":["../../src/tools/pointer-generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,UAAkB,WAAW;IAE7B,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG;;OAEb,OAAO;;;;;;yBAMW,OAAO;CAC/B,CAAC;QAEE,MAAM,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,IAAI,YAAY,CACzB,oCAAoC,KAAK,CAAC,OAAO,EAAE,EACnD,oBAAoB,CACrB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,UAAkB,
|
|
1
|
+
{"version":3,"file":"pointer-generator.js","sourceRoot":"","sources":["../../src/tools/pointer-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# MemoryLink User Guide
|
|
2
|
+
|
|
3
|
+
> **The Active Gatekeeper for AI Agents**
|
|
4
|
+
> Version 1.7.0
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## What is MemoryLink?
|
|
9
|
+
|
|
10
|
+
MemoryLink is a **governance layer** for AI coding assistants. It provides:
|
|
11
|
+
|
|
12
|
+
1. **Memory** - Persistent knowledge that survives across sessions
|
|
13
|
+
2. **Gates** - Security checks that block dangerous code before commit
|
|
14
|
+
|
|
15
|
+
### Why You Need This
|
|
16
|
+
|
|
17
|
+
| Problem | Solution |
|
|
18
|
+
|:---|:---|
|
|
19
|
+
| AI forgets fixes after 20 days | `ml capture` stores rules permanently |
|
|
20
|
+
| AI commits API keys accidentally | **Red Gate** blocks secrets |
|
|
21
|
+
| AI writes code with syntax errors | **Blue Gate** blocks broken code |
|
|
22
|
+
| Different AI tools have different rules | `.agent/constitution.md` = single truth |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install -g memorylink
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Quick Start
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
cd your-project
|
|
36
|
+
ml init # Initialize MemoryLink
|
|
37
|
+
ml scan # Scan for existing secrets
|
|
38
|
+
ml hooks --install # Install Git hooks (blocks bad commits)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Core Commands
|
|
44
|
+
|
|
45
|
+
### Memory Commands
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Capture a memory
|
|
49
|
+
ml capture -t "api_guidelines" -c "Always use environment variables for API keys"
|
|
50
|
+
|
|
51
|
+
# Query a memory
|
|
52
|
+
ml query -t "api_guidelines"
|
|
53
|
+
|
|
54
|
+
# List all memories
|
|
55
|
+
ml list
|
|
56
|
+
ml list --since 7d # Only recent
|
|
57
|
+
ml list --before 30d # Only old
|
|
58
|
+
|
|
59
|
+
# Delete a memory
|
|
60
|
+
ml delete -t "api_guidelines" -f
|
|
61
|
+
ml delete --id "mem_abc123" -f
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Gate Commands
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Check for secrets (Red Gate)
|
|
68
|
+
ml gate --rule block-quarantined
|
|
69
|
+
|
|
70
|
+
# Check for syntax errors (Blue Gate)
|
|
71
|
+
ml gate --rule valid-syntax
|
|
72
|
+
|
|
73
|
+
# Scan entire project
|
|
74
|
+
ml scan
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Management Commands
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
ml mode active # Block mode (strict)
|
|
81
|
+
ml mode inactive # Warn mode (permissive)
|
|
82
|
+
ml self-check # Verify installation
|
|
83
|
+
ml doctor # Health check
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## How Memory Works
|
|
89
|
+
|
|
90
|
+
**The Recency Rule:** If you have multiple memories for the same topic, the newest one wins.
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# Day 1
|
|
94
|
+
ml capture -t "framework" -c "Use React Class components"
|
|
95
|
+
|
|
96
|
+
# Day 30
|
|
97
|
+
ml capture -t "framework" -c "Use React Hooks"
|
|
98
|
+
|
|
99
|
+
# Query returns "Use React Hooks" (newer)
|
|
100
|
+
ml query -t "framework"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Update:** Just capture again with the same topic.
|
|
104
|
+
**Delete:** Use `ml delete -t "topic" -f`
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## How Gates Work
|
|
109
|
+
|
|
110
|
+
### Red Gate (Secrets)
|
|
111
|
+
- Detects API keys, passwords, private keys
|
|
112
|
+
- Blocks commits with `ml gate --rule block-quarantined`
|
|
113
|
+
- Installed automatically via `ml hooks --install`
|
|
114
|
+
|
|
115
|
+
### Blue Gate (Syntax)
|
|
116
|
+
- Detects broken code (parse errors)
|
|
117
|
+
- Blocks commits with `ml gate --rule valid-syntax`
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Universal Context (.agent/ folder)
|
|
122
|
+
|
|
123
|
+
Create a `.agent/` folder in your project root:
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
.agent/
|
|
127
|
+
├── memory/
|
|
128
|
+
│ └── constitution.md # Project rules (ALL agents read this)
|
|
129
|
+
└── context.md # Current project context
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
All AI tools (Cursor, Antigravity, VS Code) will read these files automatically.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Time-Based Memory Management
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# See memories from last week
|
|
140
|
+
ml list --since 7d
|
|
141
|
+
|
|
142
|
+
# Clean up old memories (older than 60 days)
|
|
143
|
+
ml delete --before 60d -f
|
|
144
|
+
|
|
145
|
+
# Delete all memories for old project
|
|
146
|
+
ml delete -t "old_project_name" -f
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Troubleshooting
|
|
152
|
+
|
|
153
|
+
### "No memories found"
|
|
154
|
+
- Run `ml init` first
|
|
155
|
+
- Check that `.memorylink/` folder exists
|
|
156
|
+
|
|
157
|
+
### "Gate fails but I want to commit anyway"
|
|
158
|
+
- Use `git commit --no-verify` (emergency bypass)
|
|
159
|
+
- Or run `ml mode inactive` to switch to warn-only mode
|
|
160
|
+
|
|
161
|
+
### "False positive on secret detection"
|
|
162
|
+
- Run `ml gate --mark-false <id>` to whitelist it
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Summary
|
|
167
|
+
|
|
168
|
+
| Command | Purpose |
|
|
169
|
+
|:---|:---|
|
|
170
|
+
| `ml init` | Setup MemoryLink |
|
|
171
|
+
| `ml capture` | Save a memory |
|
|
172
|
+
| `ml query` | Retrieve a memory |
|
|
173
|
+
| `ml list` | Show all memories |
|
|
174
|
+
| `ml delete` | Remove a memory |
|
|
175
|
+
| `ml gate` | Run security checks |
|
|
176
|
+
| `ml scan` | Scan for secrets |
|
|
177
|
+
| `ml mode` | Switch active/inactive |
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
**Built with love for the AI-First Developer.** 🚀
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memorylink",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "MemoryLink - Prevent secret leaks in AI-assisted development. 127 patterns including India-specific (Aadhaar, PAN, UPI).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -72,4 +72,4 @@
|
|
|
72
72
|
"engines": {
|
|
73
73
|
"node": ">=18.0.0"
|
|
74
74
|
}
|
|
75
|
-
}
|
|
75
|
+
}
|