mewkit 1.10.1 → 1.10.3
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/dist/commands/doctor-memory-checks.d.ts +3 -0
- package/dist/commands/doctor-memory-checks.d.ts.map +1 -0
- package/dist/commands/doctor-memory-checks.js +39 -0
- package/dist/commands/doctor-memory-checks.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +67 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/memory.d.ts +3 -1
- package/dist/commands/memory.d.ts.map +1 -1
- package/dist/commands/memory.js +97 -19
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +11 -6
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/verdict-gate.d.ts +4 -0
- package/dist/commands/verdict-gate.d.ts.map +1 -0
- package/dist/commands/verdict-gate.js +29 -0
- package/dist/commands/verdict-gate.js.map +1 -0
- package/dist/core/compute-checksums.d.ts +7 -0
- package/dist/core/compute-checksums.d.ts.map +1 -1
- package/dist/core/compute-checksums.js +12 -3
- package/dist/core/compute-checksums.js.map +1 -1
- package/dist/core/file-lock.d.ts +3 -0
- package/dist/core/file-lock.d.ts.map +1 -0
- package/dist/core/file-lock.js +84 -0
- package/dist/core/file-lock.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/install-metadata-backref.d.ts +14 -0
- package/dist/core/install-metadata-backref.d.ts.map +1 -0
- package/dist/core/install-metadata-backref.js +39 -0
- package/dist/core/install-metadata-backref.js.map +1 -0
- package/dist/core/install-metadata-writer.d.ts +4 -0
- package/dist/core/install-metadata-writer.d.ts.map +1 -0
- package/dist/core/install-metadata-writer.js +31 -0
- package/dist/core/install-metadata-writer.js.map +1 -0
- package/dist/core/install-metadata.d.ts +158 -0
- package/dist/core/install-metadata.d.ts.map +1 -0
- package/dist/core/install-metadata.js +180 -0
- package/dist/core/install-metadata.js.map +1 -0
- package/dist/core/release-metadata.d.ts +80 -0
- package/dist/core/release-metadata.d.ts.map +1 -0
- package/dist/core/release-metadata.js +70 -0
- package/dist/core/release-metadata.js.map +1 -0
- package/dist/core/smart-update.d.ts +8 -0
- package/dist/core/smart-update.d.ts.map +1 -1
- package/dist/core/smart-update.js +170 -47
- package/dist/core/smart-update.js.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/render-views.d.ts +18 -0
- package/dist/memory/render-views.d.ts.map +1 -0
- package/dist/memory/render-views.js +114 -0
- package/dist/memory/render-views.js.map +1 -0
- package/dist/memory/schemas.d.ts +642 -0
- package/dist/memory/schemas.d.ts.map +1 -0
- package/dist/memory/schemas.js +94 -0
- package/dist/memory/schemas.js.map +1 -0
- package/dist/memory/seed-from-md.d.ts +7 -0
- package/dist/memory/seed-from-md.d.ts.map +1 -0
- package/dist/memory/seed-from-md.js +167 -0
- package/dist/memory/seed-from-md.js.map +1 -0
- package/dist/memory/validate.d.ts +26 -0
- package/dist/memory/validate.d.ts.map +1 -0
- package/dist/memory/validate.js +102 -0
- package/dist/memory/validate.js.map +1 -0
- package/dist/memory/verdict-schema.d.ts +86 -0
- package/dist/memory/verdict-schema.d.ts.map +1 -0
- package/dist/memory/verdict-schema.js +71 -0
- package/dist/memory/verdict-schema.js.map +1 -0
- package/dist/migrate/migrate-orchestrator.d.ts.map +1 -1
- package/dist/migrate/migrate-orchestrator.js +6 -2
- package/dist/migrate/migrate-orchestrator.js.map +1 -1
- package/dist/migrate/portable-installer.d.ts +3 -0
- package/dist/migrate/portable-installer.d.ts.map +1 -1
- package/dist/migrate/portable-installer.js +3 -0
- package/dist/migrate/portable-installer.js.map +1 -1
- package/dist/migrate/reconcile/portable-registry-lock.d.ts.map +1 -1
- package/dist/migrate/reconcile/portable-registry-lock.js +6 -78
- package/dist/migrate/reconcile/portable-registry-lock.js.map +1 -1
- package/dist/migrate/reconcile/portable-registry.d.ts +24 -6
- package/dist/migrate/reconcile/portable-registry.d.ts.map +1 -1
- package/dist/migrate/reconcile/portable-registry.js +7 -1
- package/dist/migrate/reconcile/portable-registry.js.map +1 -1
- package/dist/migrate/skill-directory-installer.d.ts +2 -0
- package/dist/migrate/skill-directory-installer.d.ts.map +1 -1
- package/dist/migrate/skill-directory-installer.js +3 -0
- package/dist/migrate/skill-directory-installer.js.map +1 -1
- package/dist/migrate/types.d.ts +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { CURATED_STORES } from "./schemas.js";
|
|
4
|
+
import { loadContentValidator } from "./validate.js";
|
|
5
|
+
// Deterministic JSON→Markdown renderer. Generates human-readable views/*.md from
|
|
6
|
+
// the canonical curated JSON stores. Pure transform (no LLM). Output is stable
|
|
7
|
+
// (entries sorted by id) for clean diffs, idempotent, and stamped with a banner
|
|
8
|
+
// declaring the file generated + non-authoritative. Re-runs validate-content per
|
|
9
|
+
// text field (defense-in-depth) and annotates flagged entries inline.
|
|
10
|
+
const GENERATED_BANNER = (storeFile) => `<!-- GENERATED from ${storeFile} by 'mewkit memory render-views' — do not edit; edits are overwritten. Append new entries to ${storeFile} (the canonical source). -->`;
|
|
11
|
+
const LEGACY_MARKER = (storeFile, viewFile) => `<!-- NON-AUTHORITATIVE: canonical source is ${storeFile}; generated human view is ${viewFile} (regenerate via 'mewkit memory render-views'). -->`;
|
|
12
|
+
function renderScalar(value) {
|
|
13
|
+
if (Array.isArray(value))
|
|
14
|
+
return value.map((v) => String(v)).join(", ");
|
|
15
|
+
return String(value);
|
|
16
|
+
}
|
|
17
|
+
// Render one entry as a `## ` section. Order fields deterministically: title field
|
|
18
|
+
// first, then the remaining keys in a fixed order, then any extra keys sorted.
|
|
19
|
+
function renderEntry(entry, spec, validator) {
|
|
20
|
+
const id = String(entry.id ?? "<no-id>");
|
|
21
|
+
const lines = [`## ${id}`, ""];
|
|
22
|
+
// Inline injection-recheck annotation (audit trail — kept, not dropped).
|
|
23
|
+
if (validator) {
|
|
24
|
+
for (const field of spec.textFields) {
|
|
25
|
+
const text = entry[field];
|
|
26
|
+
if (typeof text === "string" && !validator(text).valid) {
|
|
27
|
+
lines.push(`<!-- WARN: entry ${id} field '${field}' matched an injection pattern — verify manually -->`, "");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const skip = new Set(["id"]);
|
|
32
|
+
const ordered = Object.keys(entry)
|
|
33
|
+
.filter((k) => !skip.has(k))
|
|
34
|
+
.sort((a, b) => a.localeCompare(b));
|
|
35
|
+
for (const key of ordered) {
|
|
36
|
+
const value = entry[key];
|
|
37
|
+
if (value === undefined || value === null || value === "")
|
|
38
|
+
continue;
|
|
39
|
+
lines.push(`- **${key}:** ${renderScalar(value)}`);
|
|
40
|
+
}
|
|
41
|
+
lines.push("");
|
|
42
|
+
return lines.join("\n");
|
|
43
|
+
}
|
|
44
|
+
export function renderStore(data, spec, validator) {
|
|
45
|
+
const items = (data[spec.itemsKey] ?? [])
|
|
46
|
+
.slice()
|
|
47
|
+
.sort((a, b) => String(a.id).localeCompare(String(b.id)));
|
|
48
|
+
const flagged = [];
|
|
49
|
+
if (validator) {
|
|
50
|
+
for (const item of items) {
|
|
51
|
+
for (const field of spec.textFields) {
|
|
52
|
+
const text = item[field];
|
|
53
|
+
if (typeof text === "string" && !validator(text).valid)
|
|
54
|
+
flagged.push(String(item.id));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const header = [
|
|
59
|
+
GENERATED_BANNER(spec.file),
|
|
60
|
+
"",
|
|
61
|
+
`# ${spec.scope} — generated view`,
|
|
62
|
+
"",
|
|
63
|
+
`> ${items.length} entr${items.length === 1 ? "y" : "ies"} from \`${spec.file}\`. This file is non-authoritative; edit the JSON and re-run \`mewkit memory render-views\`.`,
|
|
64
|
+
"",
|
|
65
|
+
];
|
|
66
|
+
const body = items.map((it) => renderEntry(it, spec, validator)).join("\n");
|
|
67
|
+
return { md: header.join("\n") + "\n" + body, flagged: [...new Set(flagged)] };
|
|
68
|
+
}
|
|
69
|
+
// Idempotently prepend a non-authoritative marker to a legacy topic MD file.
|
|
70
|
+
function stampLegacyMarker(memoryDir, spec) {
|
|
71
|
+
const mdName = spec.file.replace(/\.json$/, ".md");
|
|
72
|
+
const mdPath = path.join(memoryDir, mdName);
|
|
73
|
+
if (!fs.existsSync(mdPath))
|
|
74
|
+
return;
|
|
75
|
+
const content = fs.readFileSync(mdPath, "utf-8");
|
|
76
|
+
if (content.includes("NON-AUTHORITATIVE:"))
|
|
77
|
+
return;
|
|
78
|
+
const marker = LEGACY_MARKER(spec.file, `views/${mdName}`);
|
|
79
|
+
fs.writeFileSync(mdPath, `${marker}\n${content}`, "utf-8");
|
|
80
|
+
}
|
|
81
|
+
export function renderViews(memoryDir, opts = {}) {
|
|
82
|
+
const validator = loadContentValidator(memoryDir);
|
|
83
|
+
const viewsDir = path.join(memoryDir, "views");
|
|
84
|
+
if (!opts.check)
|
|
85
|
+
fs.mkdirSync(viewsDir, { recursive: true });
|
|
86
|
+
const results = [];
|
|
87
|
+
for (const spec of CURATED_STORES) {
|
|
88
|
+
const jsonPath = path.join(memoryDir, spec.file);
|
|
89
|
+
if (!fs.existsSync(jsonPath))
|
|
90
|
+
continue;
|
|
91
|
+
let data;
|
|
92
|
+
try {
|
|
93
|
+
data = JSON.parse(fs.readFileSync(jsonPath, "utf-8"));
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
continue; // invalid JSON is the validator's concern, not the renderer's
|
|
97
|
+
}
|
|
98
|
+
const { md, flagged } = renderStore(data, spec, validator);
|
|
99
|
+
const viewPath = path.join(viewsDir, spec.file.replace(/\.json$/, ".md"));
|
|
100
|
+
const exists = fs.existsSync(viewPath);
|
|
101
|
+
const current = exists ? fs.readFileSync(viewPath, "utf-8") : "";
|
|
102
|
+
const stale = current !== md;
|
|
103
|
+
let wrote = false;
|
|
104
|
+
if (!opts.check && stale) {
|
|
105
|
+
fs.writeFileSync(viewPath, md, "utf-8");
|
|
106
|
+
wrote = true;
|
|
107
|
+
}
|
|
108
|
+
if (!opts.check)
|
|
109
|
+
stampLegacyMarker(memoryDir, spec);
|
|
110
|
+
results.push({ file: spec.file, viewPath, exists, stale, flagged, wrote });
|
|
111
|
+
}
|
|
112
|
+
return results;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=render-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-views.js","sourceRoot":"","sources":["../../src/memory/render-views.ts"],"names":[],"mappings":"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"}
|