@repomem/memory 0.0.0-stage → 0.1.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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +204 -2
  3. package/assets/kiro/hooks/repomem-validate.sh +10 -0
  4. package/assets/kiro/skills/repomem-distill/SKILL.md +56 -0
  5. package/assets/kiro/skills/repomem-memory/SKILL.md +41 -0
  6. package/dist/cli.d.ts +11 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +183 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/index.d.ts +7 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +35 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/schema.d.ts +97 -0
  15. package/dist/schema.d.ts.map +1 -0
  16. package/dist/schema.js +86 -0
  17. package/dist/schema.js.map +1 -0
  18. package/dist/search.d.ts +55 -0
  19. package/dist/search.d.ts.map +1 -0
  20. package/dist/search.js +160 -0
  21. package/dist/search.js.map +1 -0
  22. package/dist/server.d.ts +26 -0
  23. package/dist/server.d.ts.map +1 -0
  24. package/dist/server.js +176 -0
  25. package/dist/server.js.map +1 -0
  26. package/dist/setup/spec.d.ts +11 -0
  27. package/dist/setup/spec.d.ts.map +1 -0
  28. package/dist/setup/spec.js +44 -0
  29. package/dist/setup/spec.js.map +1 -0
  30. package/dist/store.d.ts +119 -0
  31. package/dist/store.d.ts.map +1 -0
  32. package/dist/store.js +350 -0
  33. package/dist/store.js.map +1 -0
  34. package/dist/validate.d.ts +42 -0
  35. package/dist/validate.d.ts.map +1 -0
  36. package/dist/validate.js +164 -0
  37. package/dist/validate.js.map +1 -0
  38. package/package.json +66 -4
  39. package/templates/context.md +25 -0
  40. package/templates/convention.md +16 -0
  41. package/templates/decision.md +20 -0
  42. package/templates/learning.md +16 -0
  43. package/templates/limitation.md +16 -0
@@ -0,0 +1,164 @@
1
+ /**
2
+ * validate.ts — pure validation logic for `repomem validate`.
3
+ *
4
+ * Checks performed:
5
+ * 1. Every `.md` entry under the memory root has valid frontmatter.
6
+ * 2. Every `supersedes` reference points at an existing entry id.
7
+ * 3. No obvious secrets (API keys, tokens, private keys) appear in any entry.
8
+ *
9
+ * This module is I/O-light and returns a structured report; the CLI decides
10
+ * the process exit code. Nothing here writes to stdout.
11
+ */
12
+ import { promises as fs } from "node:fs";
13
+ import path from "node:path";
14
+ import matter from "gray-matter";
15
+ import { frontmatterSchema, TYPE_DIRS, ENTRY_TYPES, } from "./schema.js";
16
+ /**
17
+ * High-confidence secret patterns. Tuned to minimize false positives; this is
18
+ * a safety net, not a replacement for a dedicated secret scanner.
19
+ */
20
+ export const SECRET_PATTERNS = [
21
+ { rule: "aws-access-key-id", re: /\bAKIA[0-9A-Z]{16}\b/ },
22
+ { rule: "github-token", re: /\bgh[pousr]_[A-Za-z0-9]{36,}\b/ },
23
+ { rule: "slack-token", re: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/ },
24
+ { rule: "google-api-key", re: /\bAIza[0-9A-Za-z_\-]{35}\b/ },
25
+ { rule: "private-key-block", re: /-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----/ },
26
+ {
27
+ rule: "generic-secret-assignment",
28
+ // key-like name = long opaque value (>= 16 chars, no spaces)
29
+ re: /\b(?:api[_-]?key|secret|token|passwd|password|access[_-]?key)\b\s*[:=]\s*["']?[A-Za-z0-9+/_\-]{16,}["']?/i,
30
+ },
31
+ ];
32
+ /** Scan a block of text for secrets, returning one finding per match line. */
33
+ export function scanSecrets(text, file) {
34
+ const findings = [];
35
+ const lines = text.split(/\r?\n/);
36
+ lines.forEach((lineText, idx) => {
37
+ for (const { rule, re } of SECRET_PATTERNS) {
38
+ if (re.test(lineText)) {
39
+ findings.push({
40
+ severity: "error",
41
+ file,
42
+ line: idx + 1,
43
+ rule: `secret:${rule}`,
44
+ message: `possible secret detected (${rule})`,
45
+ });
46
+ }
47
+ }
48
+ });
49
+ return findings;
50
+ }
51
+ /** Collect every .md file under the memory root, grouped by its folder type. */
52
+ async function collectFiles(root) {
53
+ const out = [];
54
+ for (const type of ENTRY_TYPES) {
55
+ const dir = path.join(root, TYPE_DIRS[type]);
56
+ let names;
57
+ try {
58
+ names = await fs.readdir(dir);
59
+ }
60
+ catch {
61
+ continue;
62
+ }
63
+ for (const name of names) {
64
+ if (name.endsWith(".md"))
65
+ out.push({ file: path.join(dir, name), type });
66
+ }
67
+ }
68
+ return out;
69
+ }
70
+ /**
71
+ * Validate every entry under `root`. Returns a structured report. `ok` is true
72
+ * only when there are no error-severity findings.
73
+ */
74
+ export async function validateRoot(root) {
75
+ const findings = [];
76
+ const files = await collectFiles(root);
77
+ const validEntries = [];
78
+ const knownIds = new Set();
79
+ for (const { file, type } of files) {
80
+ const id = path.basename(file, ".md");
81
+ let raw;
82
+ try {
83
+ raw = await fs.readFile(file, "utf8");
84
+ }
85
+ catch (err) {
86
+ findings.push({
87
+ severity: "error",
88
+ file,
89
+ rule: "io",
90
+ message: `could not read file: ${err.message}`,
91
+ });
92
+ continue;
93
+ }
94
+ // Secret scan runs over the whole file regardless of frontmatter validity.
95
+ findings.push(...scanSecrets(raw, file));
96
+ let parsed;
97
+ try {
98
+ parsed = matter(raw);
99
+ }
100
+ catch (err) {
101
+ findings.push({
102
+ severity: "error",
103
+ file,
104
+ rule: "frontmatter",
105
+ message: `unparseable frontmatter: ${err.message}`,
106
+ });
107
+ continue;
108
+ }
109
+ const result = frontmatterSchema.safeParse(parsed.data);
110
+ if (!result.success) {
111
+ for (const issue of result.error.issues) {
112
+ findings.push({
113
+ severity: "error",
114
+ file,
115
+ rule: "frontmatter",
116
+ message: `${issue.path.join(".") || "(root)"}: ${issue.message}`,
117
+ });
118
+ }
119
+ continue;
120
+ }
121
+ if (result.data.type !== type) {
122
+ findings.push({
123
+ severity: "error",
124
+ file,
125
+ rule: "type-folder-mismatch",
126
+ message: `declared type "${result.data.type}" does not match folder "${TYPE_DIRS[type]}"`,
127
+ });
128
+ continue;
129
+ }
130
+ knownIds.add(id);
131
+ validEntries.push({ file, id, type, data: result.data, raw });
132
+ }
133
+ // supersedes references must resolve to a known id.
134
+ for (const entry of validEntries) {
135
+ const supersedes = entry.data.supersedes;
136
+ if (supersedes && !knownIds.has(supersedes)) {
137
+ findings.push({
138
+ severity: "error",
139
+ file: entry.file,
140
+ rule: "dangling-supersedes",
141
+ message: `supersedes "${supersedes}" does not match any existing entry id`,
142
+ });
143
+ }
144
+ }
145
+ const ok = !findings.some((f) => f.severity === "error");
146
+ return { findings, checked: files.length, ok };
147
+ }
148
+ /** Format a report as human-readable lines (for stderr/stdout in the CLI). */
149
+ export function formatReport(report, root) {
150
+ const lines = [];
151
+ lines.push(`Validated ${report.checked} entr${report.checked === 1 ? "y" : "ies"} under ${root}`);
152
+ if (report.findings.length === 0) {
153
+ lines.push("No issues found.");
154
+ return lines.join("\n");
155
+ }
156
+ for (const f of report.findings) {
157
+ const where = f.line ? `${f.file}:${f.line}` : f.file;
158
+ lines.push(` [${f.severity}] ${where} (${f.rule}): ${f.message}`);
159
+ }
160
+ const errors = report.findings.filter((f) => f.severity === "error").length;
161
+ lines.push(`${errors} error(s), ${report.findings.length - errors} warning(s).`);
162
+ return lines.join("\n");
163
+ }
164
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,68 @@
1
1
  {
2
2
  "name": "@repomem/memory",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Your repo's memory, available to every AI tool your team uses. A local MCP server that turns a memory/ folder into searchable shared context.",
5
+ "license": "MIT",
6
+ "author": "Nicolás Rickert",
7
+ "type": "module",
8
+ "engines": {
9
+ "node": ">=22"
10
+ },
11
+ "bin": {
12
+ "repomem": "dist/cli.js"
13
+ },
14
+ "main": "dist/index.js",
15
+ "exports": {
16
+ ".": "./dist/index.js"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "templates",
21
+ "assets",
22
+ "README.md",
23
+ "LICENSE"
24
+ ],
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/nicorickert/repomem.git",
31
+ "directory": "packages/memory"
32
+ },
33
+ "homepage": "https://github.com/nicorickert/repomem/tree/main/packages/memory#readme",
34
+ "bugs": {
35
+ "url": "https://github.com/nicorickert/repomem/issues"
36
+ },
37
+ "keywords": [
38
+ "repomem",
39
+ "mcp",
40
+ "memory",
41
+ "ai",
42
+ "context",
43
+ "model-context-protocol"
44
+ ],
45
+ "scripts": {
46
+ "build": "tsc",
47
+ "clean": "rm -rf dist",
48
+ "start": "node dist/index.js",
49
+ "test": "vitest run",
50
+ "test:watch": "vitest",
51
+ "typecheck": "tsc --noEmit"
52
+ },
53
+ "dependencies": {
54
+ "@modelcontextprotocol/sdk": "^1.32.0",
55
+ "@repomem/core": "^0.1.0",
56
+ "fast-glob": "^3.3.2",
57
+ "gray-matter": "^4.0.3",
58
+ "minisearch": "^7.1.0",
59
+ "picomatch": "^4.0.2",
60
+ "zod": "^4.6.5"
61
+ },
62
+ "devDependencies": {
63
+ "@types/node": "^22.0.0",
64
+ "@types/picomatch": "^3.0.1",
65
+ "typescript": "^5.6.0",
66
+ "vitest": "^4.1.11"
67
+ }
68
+ }
@@ -0,0 +1,25 @@
1
+ ---
2
+ type: context
3
+ title: Short context title
4
+ status: draft
5
+ date: 2026-01-01
6
+ scope: project
7
+ tags: []
8
+ related_paths: []
9
+ ---
10
+
11
+ ## What this is
12
+
13
+ The project or module this entry describes, in a sentence or two.
14
+
15
+ ## Why it exists
16
+
17
+ The purpose, the problem it solves, and who it serves.
18
+
19
+ ## How it works
20
+
21
+ The shape of the thing: main components, flows, and how they fit together.
22
+
23
+ ## Key constraints
24
+
25
+ Boundaries, assumptions, and things to keep in mind when working here.
@@ -0,0 +1,16 @@
1
+ ---
2
+ type: convention
3
+ title: Short convention title
4
+ status: draft
5
+ date: 2026-01-01
6
+ tags: []
7
+ related_paths: []
8
+ ---
9
+
10
+ ## Rule
11
+
12
+ State the convention as a clear, actionable rule.
13
+
14
+ ## Rationale
15
+
16
+ Why this convention exists and what it prevents.
@@ -0,0 +1,20 @@
1
+ ---
2
+ type: decision
3
+ title: Short decision title
4
+ status: draft
5
+ date: 2026-01-01
6
+ tags: []
7
+ related_paths: []
8
+ ---
9
+
10
+ ## Context
11
+
12
+ What problem or situation prompted this decision?
13
+
14
+ ## Decision
15
+
16
+ What did we decide, stated plainly?
17
+
18
+ ## Consequences
19
+
20
+ What follows from this — tradeoffs, follow-ups, things to watch.
@@ -0,0 +1,16 @@
1
+ ---
2
+ type: learning
3
+ title: Short learning title
4
+ status: draft
5
+ date: 2026-01-01
6
+ tags: []
7
+ related_paths: []
8
+ ---
9
+
10
+ ## What happened
11
+
12
+ The situation and what surprised us.
13
+
14
+ ## Takeaway
15
+
16
+ The durable lesson worth remembering.
@@ -0,0 +1,16 @@
1
+ ---
2
+ type: limitation
3
+ title: Short limitation title
4
+ status: draft
5
+ date: 2026-01-01
6
+ tags: []
7
+ related_paths: []
8
+ ---
9
+
10
+ ## Limitation
11
+
12
+ What the system cannot (currently) do, or where it breaks down.
13
+
14
+ ## Impact / Workaround
15
+
16
+ Who it affects and how to work around it, if at all.