@theglitchking/semantic-memory 1.0.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 +71 -0
- package/.claude-plugin/plugin.json +34 -0
- package/CHANGELOG.md +233 -0
- package/LICENSE +21 -0
- package/README.md +91 -0
- package/bin/semantic-memory +2 -0
- package/bin/semantic-sidekick +2 -0
- package/commands/healthcheck.md +6 -0
- package/commands/mode.md +65 -0
- package/commands/normalize-config.md +6 -0
- package/commands/policy.md +16 -0
- package/commands/relink.md +6 -0
- package/commands/status.md +6 -0
- package/commands/update.md +6 -0
- package/commands/vault.md +21 -0
- package/dist/chunk-25EIQWXL.js +651 -0
- package/dist/chunk-25EIQWXL.js.map +1 -0
- package/dist/chunk-CAN2GWUG.js +88 -0
- package/dist/chunk-CAN2GWUG.js.map +1 -0
- package/dist/chunk-CXTRTCIK.js +762 -0
- package/dist/chunk-CXTRTCIK.js.map +1 -0
- package/dist/chunk-E2Z4J4MK.js +180 -0
- package/dist/chunk-E2Z4J4MK.js.map +1 -0
- package/dist/chunk-HODDRXJK.js +169 -0
- package/dist/chunk-HODDRXJK.js.map +1 -0
- package/dist/chunk-JPQHNG3R.js +147 -0
- package/dist/chunk-JPQHNG3R.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +505 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/embed-worker.d.ts +2 -0
- package/dist/core/embed-worker.js +121 -0
- package/dist/core/embed-worker.js.map +1 -0
- package/dist/core/index.d.ts +486 -0
- package/dist/core/index.js +62 -0
- package/dist/core/index.js.map +1 -0
- package/dist/indexer-KD6UTXZB.js +8 -0
- package/dist/indexer-KD6UTXZB.js.map +1 -0
- package/dist/lint-GMXQF4RW.js +11 -0
- package/dist/lint-GMXQF4RW.js.map +1 -0
- package/dist/log-LQXIJXIA.js +10 -0
- package/dist/log-LQXIJXIA.js.map +1 -0
- package/dist/mcp/server.d.ts +16 -0
- package/dist/mcp/server.js +4925 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/schema-F3RTY6SQ.js +12 -0
- package/dist/schema-F3RTY6SQ.js.map +1 -0
- package/dist/search-27WYAI24.js +202 -0
- package/dist/search-27WYAI24.js.map +1 -0
- package/docs/compat-matrix.md +127 -0
- package/docs/corpora-json.md +150 -0
- package/docs/regression-snapshot.md +122 -0
- package/docs/smart-middle-activation.md +97 -0
- package/hooks/hooks.json +39 -0
- package/hooks/reconcile.js +171 -0
- package/hooks/session-start.js +81 -0
- package/hooks/vault-context.js +503 -0
- package/package.json +97 -0
- package/scripts/link-skills.js +25 -0
- package/scripts/pre-commit-lint.sh +42 -0
- package/skills/outage-silence/SKILL.md +72 -0
- package/skills/research-mode/SKILL.md +84 -0
- package/skills/semantic-first/SKILL.md +117 -0
- package/skills/semantic-first/evals/evals.json +37 -0
- package/skills/semantic-first/references/vault-frontmatter.md +133 -0
- package/skills/vault-first/SKILL.md +100 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// src/core/log.ts
|
|
2
|
+
import { readFile, writeFile, appendFile, access } from "fs/promises";
|
|
3
|
+
import { constants } from "fs";
|
|
4
|
+
import { join } from "path";
|
|
5
|
+
var LOG_FILE = "log.md";
|
|
6
|
+
var HEADER = `# Vault Log
|
|
7
|
+
|
|
8
|
+
> Append-only session and ingest log. Machine-readable YAML blocks follow each line.
|
|
9
|
+
|
|
10
|
+
`;
|
|
11
|
+
async function logEvent(vaultPath, input) {
|
|
12
|
+
const path = join(vaultPath, LOG_FILE);
|
|
13
|
+
const ts = input.ts ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
14
|
+
const entry = { ts, kind: input.kind, summary: input.summary };
|
|
15
|
+
if (input.payload) entry.payload = input.payload;
|
|
16
|
+
await ensureLogFile(path);
|
|
17
|
+
const line = `- ${ts} \u2014 ${input.kind}: ${input.summary}
|
|
18
|
+
`;
|
|
19
|
+
const block = renderYamlBlock(entry);
|
|
20
|
+
await appendFile(path, line + block + "\n", "utf-8");
|
|
21
|
+
return entry;
|
|
22
|
+
}
|
|
23
|
+
async function logQuery(vaultPath, opts = {}) {
|
|
24
|
+
const path = join(vaultPath, LOG_FILE);
|
|
25
|
+
let raw = "";
|
|
26
|
+
try {
|
|
27
|
+
raw = await readFile(path, "utf-8");
|
|
28
|
+
} catch {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const entries = parseEntries(raw);
|
|
32
|
+
const filtered = entries.filter((e) => {
|
|
33
|
+
if (opts.kind && e.kind !== opts.kind) return false;
|
|
34
|
+
if (opts.after && new Date(e.ts).getTime() < new Date(opts.after).getTime()) return false;
|
|
35
|
+
if (opts.before && new Date(e.ts).getTime() > new Date(opts.before).getTime()) return false;
|
|
36
|
+
return true;
|
|
37
|
+
});
|
|
38
|
+
if (opts.limit) return filtered.slice(-opts.limit);
|
|
39
|
+
return filtered;
|
|
40
|
+
}
|
|
41
|
+
async function ensureLogFile(path) {
|
|
42
|
+
try {
|
|
43
|
+
await access(path, constants.F_OK);
|
|
44
|
+
} catch {
|
|
45
|
+
await writeFile(path, HEADER, "utf-8");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function renderYamlBlock(entry) {
|
|
49
|
+
const lines = [
|
|
50
|
+
"```yaml event",
|
|
51
|
+
`ts: ${entry.ts}`,
|
|
52
|
+
`kind: ${entry.kind}`,
|
|
53
|
+
`summary: ${yamlInline(entry.summary)}`
|
|
54
|
+
];
|
|
55
|
+
if (entry.payload && Object.keys(entry.payload).length > 0) {
|
|
56
|
+
lines.push(`payload:`);
|
|
57
|
+
for (const [k, v] of Object.entries(entry.payload)) {
|
|
58
|
+
lines.push(` ${k}: ${yamlInline(v)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
lines.push("```");
|
|
62
|
+
return lines.join("\n") + "\n";
|
|
63
|
+
}
|
|
64
|
+
function yamlInline(v) {
|
|
65
|
+
if (v == null) return "null";
|
|
66
|
+
if (typeof v === "number" || typeof v === "boolean") return String(v);
|
|
67
|
+
if (Array.isArray(v)) return "[" + v.map((x) => yamlInline(x)).join(", ") + "]";
|
|
68
|
+
if (typeof v === "object") return JSON.stringify(v);
|
|
69
|
+
const s = String(v);
|
|
70
|
+
if (/[:\-#&*!|>%@`"'{}[\]]|^\s|\s$/.test(s) || /^(true|false|null|\d)/i.test(s)) {
|
|
71
|
+
return JSON.stringify(s);
|
|
72
|
+
}
|
|
73
|
+
return s;
|
|
74
|
+
}
|
|
75
|
+
function parseEntries(raw) {
|
|
76
|
+
const entries = [];
|
|
77
|
+
const blockRe = /```yaml event\n([\s\S]*?)```/g;
|
|
78
|
+
let m;
|
|
79
|
+
while ((m = blockRe.exec(raw)) !== null) {
|
|
80
|
+
const block = m[1];
|
|
81
|
+
const parsed = parseFlatYaml(block);
|
|
82
|
+
if (parsed && typeof parsed.ts === "string" && typeof parsed.kind === "string") {
|
|
83
|
+
entries.push(parsed);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return entries;
|
|
87
|
+
}
|
|
88
|
+
function parseFlatYaml(block) {
|
|
89
|
+
const out = {};
|
|
90
|
+
const lines = block.split(/\r?\n/);
|
|
91
|
+
let i = 0;
|
|
92
|
+
while (i < lines.length) {
|
|
93
|
+
const line = lines[i];
|
|
94
|
+
if (/^\s*$/.test(line)) {
|
|
95
|
+
i++;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const topMatch = line.match(/^([a-z_]+):\s*(.*)$/i);
|
|
99
|
+
if (!topMatch) {
|
|
100
|
+
i++;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const [, key, rhs] = topMatch;
|
|
104
|
+
if (key === "payload") {
|
|
105
|
+
const payload = {};
|
|
106
|
+
i++;
|
|
107
|
+
while (i < lines.length && /^\s{2,}[a-z_]/i.test(lines[i])) {
|
|
108
|
+
const m2 = lines[i].match(/^\s+([a-z_]+):\s*(.*)$/i);
|
|
109
|
+
if (m2) payload[m2[1]] = parseYamlScalar(m2[2]);
|
|
110
|
+
i++;
|
|
111
|
+
}
|
|
112
|
+
out.payload = payload;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
out[key] = parseYamlScalar(rhs);
|
|
116
|
+
i++;
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
function parseYamlScalar(s) {
|
|
121
|
+
const v = s.trim();
|
|
122
|
+
if (v === "") return "";
|
|
123
|
+
if (v === "null") return null;
|
|
124
|
+
if (v === "true") return true;
|
|
125
|
+
if (v === "false") return false;
|
|
126
|
+
if (/^-?\d+(\.\d+)?$/.test(v)) return Number(v);
|
|
127
|
+
if (v.startsWith("[") && v.endsWith("]")) {
|
|
128
|
+
try {
|
|
129
|
+
return JSON.parse(v);
|
|
130
|
+
} catch {
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (v.startsWith('"') && v.endsWith('"') || v.startsWith("'") && v.endsWith("'")) {
|
|
134
|
+
try {
|
|
135
|
+
return JSON.parse(v.replace(/^'|'$/g, '"'));
|
|
136
|
+
} catch {
|
|
137
|
+
return v.slice(1, -1);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return v;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
logEvent,
|
|
145
|
+
logQuery
|
|
146
|
+
};
|
|
147
|
+
//# sourceMappingURL=chunk-JPQHNG3R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/log.ts"],"sourcesContent":["import { readFile, writeFile, appendFile, access } from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Structured append-only log at the vault root.\n *\n * Shape: one markdown bullet per event, each followed by a fenced `yaml event`\n * block carrying the machine-readable payload. Human scrolling and YAML parsing\n * both work on the same file.\n *\n * Example rendered line pair:\n * - 2026-04-22T00:00:00Z — ingest: added 3 notes from RFC-1234\n * ```yaml event\n * ts: 2026-04-22T00:00:00Z\n * kind: ingest\n * payload:\n * source: RFC-1234\n * count: 3\n * ```\n */\n\nconst LOG_FILE = \"log.md\";\nconst HEADER = `# Vault Log\\n\\n> Append-only session and ingest log. Machine-readable YAML blocks follow each line.\\n\\n`;\n\nexport interface LogEventInput {\n kind: string;\n summary: string;\n payload?: Record<string, unknown>;\n ts?: string;\n}\n\nexport interface LogEntry {\n ts: string;\n kind: string;\n summary: string;\n payload?: Record<string, unknown>;\n}\n\nexport interface LogQueryOptions {\n kind?: string;\n after?: string;\n before?: string;\n limit?: number;\n}\n\nexport async function logEvent(vaultPath: string, input: LogEventInput): Promise<LogEntry> {\n const path = join(vaultPath, LOG_FILE);\n const ts = input.ts ?? new Date().toISOString();\n const entry: LogEntry = { ts, kind: input.kind, summary: input.summary };\n if (input.payload) entry.payload = input.payload;\n\n await ensureLogFile(path);\n\n const line = `- ${ts} — ${input.kind}: ${input.summary}\\n`;\n const block = renderYamlBlock(entry);\n await appendFile(path, line + block + \"\\n\", \"utf-8\");\n\n return entry;\n}\n\nexport async function logQuery(vaultPath: string, opts: LogQueryOptions = {}): Promise<LogEntry[]> {\n const path = join(vaultPath, LOG_FILE);\n let raw = \"\";\n try {\n raw = await readFile(path, \"utf-8\");\n } catch {\n return [];\n }\n\n const entries = parseEntries(raw);\n const filtered = entries.filter((e) => {\n if (opts.kind && e.kind !== opts.kind) return false;\n if (opts.after && new Date(e.ts).getTime() < new Date(opts.after).getTime()) return false;\n if (opts.before && new Date(e.ts).getTime() > new Date(opts.before).getTime()) return false;\n return true;\n });\n if (opts.limit) return filtered.slice(-opts.limit);\n return filtered;\n}\n\nasync function ensureLogFile(path: string): Promise<void> {\n try {\n await access(path, constants.F_OK);\n } catch {\n await writeFile(path, HEADER, \"utf-8\");\n }\n}\n\nfunction renderYamlBlock(entry: LogEntry): string {\n const lines = [\n \"```yaml event\",\n `ts: ${entry.ts}`,\n `kind: ${entry.kind}`,\n `summary: ${yamlInline(entry.summary)}`,\n ];\n if (entry.payload && Object.keys(entry.payload).length > 0) {\n lines.push(`payload:`);\n for (const [k, v] of Object.entries(entry.payload)) {\n lines.push(` ${k}: ${yamlInline(v)}`);\n }\n }\n lines.push(\"```\");\n return lines.join(\"\\n\") + \"\\n\";\n}\n\nfunction yamlInline(v: unknown): string {\n if (v == null) return \"null\";\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (Array.isArray(v)) return \"[\" + v.map((x) => yamlInline(x)).join(\", \") + \"]\";\n if (typeof v === \"object\") return JSON.stringify(v);\n const s = String(v);\n // Quote if it contains colons, special chars, or would be parsed as a non-string\n if (/[:\\-#&*!|>%@`\"'{}[\\]]|^\\s|\\s$/.test(s) || /^(true|false|null|\\d)/i.test(s)) {\n return JSON.stringify(s);\n }\n return s;\n}\n\nfunction parseEntries(raw: string): LogEntry[] {\n const entries: LogEntry[] = [];\n const blockRe = /```yaml event\\n([\\s\\S]*?)```/g;\n let m: RegExpExecArray | null;\n while ((m = blockRe.exec(raw)) !== null) {\n const block = m[1];\n const parsed = parseFlatYaml(block);\n if (parsed && typeof parsed.ts === \"string\" && typeof parsed.kind === \"string\") {\n entries.push(parsed as LogEntry);\n }\n }\n return entries;\n}\n\n/**\n * Minimal line-by-line YAML parser for the fixed shape we emit.\n * Accepts: top-level scalars + `payload:` followed by indented `key: value` pairs.\n * Anything more complex than our renderer produces is not guaranteed.\n */\nfunction parseFlatYaml(block: string): Partial<LogEntry> | null {\n const out: any = {};\n const lines = block.split(/\\r?\\n/);\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n if (/^\\s*$/.test(line)) {\n i++;\n continue;\n }\n const topMatch = line.match(/^([a-z_]+):\\s*(.*)$/i);\n if (!topMatch) {\n i++;\n continue;\n }\n const [, key, rhs] = topMatch;\n if (key === \"payload\") {\n const payload: Record<string, unknown> = {};\n i++;\n while (i < lines.length && /^\\s{2,}[a-z_]/i.test(lines[i])) {\n const m2 = lines[i].match(/^\\s+([a-z_]+):\\s*(.*)$/i);\n if (m2) payload[m2[1]] = parseYamlScalar(m2[2]);\n i++;\n }\n out.payload = payload;\n continue;\n }\n out[key] = parseYamlScalar(rhs);\n i++;\n }\n return out;\n}\n\nfunction parseYamlScalar(s: string): unknown {\n const v = s.trim();\n if (v === \"\") return \"\";\n if (v === \"null\") return null;\n if (v === \"true\") return true;\n if (v === \"false\") return false;\n if (/^-?\\d+(\\.\\d+)?$/.test(v)) return Number(v);\n if (v.startsWith(\"[\") && v.endsWith(\"]\")) {\n try {\n return JSON.parse(v);\n } catch {\n /* fall through */\n }\n }\n if ((v.startsWith('\"') && v.endsWith('\"')) || (v.startsWith(\"'\") && v.endsWith(\"'\"))) {\n try {\n return JSON.parse(v.replace(/^'|'$/g, '\"'));\n } catch {\n return v.slice(1, -1);\n }\n }\n return v;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|