@jcode.labs/mimir 0.2.0 → 0.3.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/CHANGELOG.md +28 -0
- package/README.md +68 -2
- package/SECURITY-HARDENING.md +156 -0
- package/SECURITY.md +21 -0
- package/dist/access-log.d.ts +10 -0
- package/dist/access-log.d.ts.map +1 -0
- package/dist/access-log.js +29 -0
- package/dist/access-log.js.map +1 -0
- package/dist/cli.js +53 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -1
- package/dist/destroy.d.ts +3 -0
- package/dist/destroy.d.ts.map +1 -0
- package/dist/destroy.js +16 -0
- package/dist/destroy.js.map +1 -0
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +2 -0
- package/dist/embeddings.js.map +1 -1
- package/dist/files.js +1 -1
- package/dist/files.js.map +1 -1
- package/dist/gitignore.d.ts +3 -0
- package/dist/gitignore.d.ts.map +1 -0
- package/dist/gitignore.js +34 -0
- package/dist/gitignore.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/ingest.d.ts.map +1 -1
- package/dist/ingest.js +12 -1
- package/dist/ingest.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +13 -7
- package/dist/init.js.map +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +15 -4
- package/dist/mcp.js.map +1 -1
- package/dist/network.d.ts +4 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +59 -0
- package/dist/network.js.map +1 -0
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +17 -1
- package/dist/query.js.map +1 -1
- package/dist/redaction.d.ts +7 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +63 -0
- package/dist/redaction.js.map +1 -0
- package/dist/security.d.ts +3 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +86 -0
- package/dist/security.js.map +1 -0
- package/dist/skill.d.ts.map +1 -1
- package/dist/skill.js +11 -5
- package/dist/skill.js.map +1 -1
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -3
- package/skills/mimir/SKILL.md +12 -2
package/dist/security.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { loadConfig } from "./config.js";
|
|
5
|
+
import { classifyHost } from "./network.js";
|
|
6
|
+
export async function securityAudit(cwd = process.cwd()) {
|
|
7
|
+
const config = await loadConfig(cwd);
|
|
8
|
+
const gitignore = await readGitignore(config.projectRoot);
|
|
9
|
+
const network = classifyHost(config.ollamaHost);
|
|
10
|
+
const warnings = [];
|
|
11
|
+
const kbIgnored = hasGitignoreEntry(gitignore, ".kb/");
|
|
12
|
+
const mimirIgnored = hasGitignoreEntry(gitignore, ".mimir/");
|
|
13
|
+
const privateIgnored = hasGitignoreEntry(gitignore, "private/**");
|
|
14
|
+
if (config.networkPolicy === "allow-any") {
|
|
15
|
+
warnings.push("networkPolicy is allow-any; document text can be sent to a remote Ollama host.");
|
|
16
|
+
}
|
|
17
|
+
if (config.networkPolicy === "local-only" && network.kind !== "loopback") {
|
|
18
|
+
warnings.push("networkPolicy is local-only but ollamaHost is not loopback.");
|
|
19
|
+
}
|
|
20
|
+
if (!config.redaction.enabled) {
|
|
21
|
+
warnings.push("Redaction is disabled; secrets and identifiers may be embedded in the index.");
|
|
22
|
+
}
|
|
23
|
+
if (!kbIgnored) {
|
|
24
|
+
warnings.push(".kb/ is not ignored by Git.");
|
|
25
|
+
}
|
|
26
|
+
if (!mimirIgnored) {
|
|
27
|
+
warnings.push(".mimir/ is not ignored by Git.");
|
|
28
|
+
}
|
|
29
|
+
if (!privateIgnored) {
|
|
30
|
+
warnings.push("private/** is not ignored by Git.");
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
projectRoot: config.projectRoot,
|
|
34
|
+
zeroTelemetry: true,
|
|
35
|
+
network: {
|
|
36
|
+
policy: config.networkPolicy,
|
|
37
|
+
ollamaHost: config.ollamaHost,
|
|
38
|
+
host: network.host,
|
|
39
|
+
classification: network.kind,
|
|
40
|
+
},
|
|
41
|
+
redaction: {
|
|
42
|
+
enabled: config.redaction.enabled,
|
|
43
|
+
builtIn: config.redaction.builtIn,
|
|
44
|
+
customPatterns: config.redaction.patterns.map((pattern) => pattern.name),
|
|
45
|
+
},
|
|
46
|
+
accessLog: {
|
|
47
|
+
enabled: config.accessLog,
|
|
48
|
+
path: config.accessLogPath,
|
|
49
|
+
storesRawQueries: false,
|
|
50
|
+
},
|
|
51
|
+
storage: {
|
|
52
|
+
path: config.storageDir,
|
|
53
|
+
gitIgnored: kbIgnored,
|
|
54
|
+
encryptedAtRest: "external-required",
|
|
55
|
+
},
|
|
56
|
+
mcp: {
|
|
57
|
+
maxTopK: config.mcpMaxTopK,
|
|
58
|
+
destructiveToolsExposed: false,
|
|
59
|
+
},
|
|
60
|
+
gitignore: {
|
|
61
|
+
kbIgnored,
|
|
62
|
+
mimirIgnored,
|
|
63
|
+
privateIgnored,
|
|
64
|
+
},
|
|
65
|
+
recommendations: [
|
|
66
|
+
"Run Mimir inside an encrypted disk, VM, or container volume for at-rest encryption.",
|
|
67
|
+
"Use npm provenance, release checksums, and the generated SBOM for release verification.",
|
|
68
|
+
"Use one repository checkout per trust boundary; Mimir does not implement multi-user RBAC.",
|
|
69
|
+
],
|
|
70
|
+
warnings,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function readGitignore(projectRoot) {
|
|
74
|
+
const gitignorePath = path.join(projectRoot, ".gitignore");
|
|
75
|
+
if (!existsSync(gitignorePath)) {
|
|
76
|
+
return new Set();
|
|
77
|
+
}
|
|
78
|
+
return new Set((await readFile(gitignorePath, "utf8"))
|
|
79
|
+
.split(/\r?\n/)
|
|
80
|
+
.map((line) => line.trim())
|
|
81
|
+
.filter(Boolean));
|
|
82
|
+
}
|
|
83
|
+
function hasGitignoreEntry(lines, entry) {
|
|
84
|
+
return lines.has(entry);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
|
package/dist/skill.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAKD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgCjG"}
|
package/dist/skill.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { cp, mkdir, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { ensureMimirGitignore } from "./gitignore.js";
|
|
4
5
|
const PACKAGE_ROOT = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
|
|
5
6
|
const SKILL_NAME = "mimir";
|
|
6
7
|
export function bundledSkillPath() {
|
|
@@ -18,15 +19,20 @@ export async function installSkill(options = {}) {
|
|
|
18
19
|
await cp(bundledSkillPath(), skillPath, { recursive: true, force: true });
|
|
19
20
|
await writeFile(mcpConfigPath, `${JSON.stringify(mcpConfig(cwd), null, 2)}\n`, "utf8");
|
|
20
21
|
await writeFile(readmePath, agentKitReadme(skillPath, mcpConfigPath), "utf8");
|
|
22
|
+
const wroteGitignore = await ensureMimirGitignore(cwd);
|
|
23
|
+
const written = [
|
|
24
|
+
path.relative(cwd, skillPath),
|
|
25
|
+
path.relative(cwd, mcpConfigPath),
|
|
26
|
+
path.relative(cwd, readmePath),
|
|
27
|
+
];
|
|
28
|
+
if (wroteGitignore) {
|
|
29
|
+
written.push(".gitignore");
|
|
30
|
+
}
|
|
21
31
|
return {
|
|
22
32
|
skillPath,
|
|
23
33
|
mcpConfigPath,
|
|
24
34
|
readmePath,
|
|
25
|
-
written
|
|
26
|
-
path.relative(cwd, skillPath),
|
|
27
|
-
path.relative(cwd, mcpConfigPath),
|
|
28
|
-
path.relative(cwd, readmePath),
|
|
29
|
-
],
|
|
35
|
+
written,
|
|
30
36
|
};
|
|
31
37
|
}
|
|
32
38
|
function mcpConfig(cwd) {
|
package/dist/skill.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAcrD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAC/E,MAAM,UAAU,GAAG,OAAO,CAAA;AAE1B,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAA+B,EAAE;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,IAAI,eAAe,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAEnD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1C,MAAM,EAAE,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAEzE,MAAM,SAAS,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACtF,MAAM,SAAS,CAAC,UAAU,EAAE,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAA;IAC7E,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAEtD,MAAM,OAAO,GAAG;QACd,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;KAC/B,CAAA;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC5B,CAAC;IAED,OAAO;QACL,SAAS;QACT,aAAa;QACb,UAAU;QACV,OAAO;KACR,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO;QACL,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC;gBACjC,GAAG;aACJ;SACF;KACF,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,aAAqB;IAC9D,OAAO;;;;;;;;;EASP,SAAS;;;;;;;;;;EAUT,aAAa;;;;;;;;;CASd,CAAA;AACD,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -4,14 +4,39 @@ export interface Config {
|
|
|
4
4
|
rawDir: string;
|
|
5
5
|
storageDir: string;
|
|
6
6
|
sourcesFile: string;
|
|
7
|
+
accessLogPath: string;
|
|
7
8
|
tableName: string;
|
|
8
9
|
ollamaHost: string;
|
|
10
|
+
networkPolicy: NetworkPolicy;
|
|
9
11
|
embedModel: string;
|
|
10
12
|
llmModel: string;
|
|
13
|
+
redaction: RedactionConfig;
|
|
14
|
+
accessLog: boolean;
|
|
15
|
+
mcpMaxTopK: number;
|
|
11
16
|
topK: number;
|
|
12
17
|
chunkSize: number;
|
|
13
18
|
chunkOverlap: number;
|
|
14
19
|
}
|
|
20
|
+
export type NetworkPolicy = "local-only" | "allow-private" | "allow-any";
|
|
21
|
+
export interface RedactionConfig {
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
builtIn: boolean;
|
|
24
|
+
patterns: RedactionPattern[];
|
|
25
|
+
}
|
|
26
|
+
export interface RedactionPattern {
|
|
27
|
+
name: string;
|
|
28
|
+
pattern: string;
|
|
29
|
+
flags?: string | undefined;
|
|
30
|
+
replacement?: string | undefined;
|
|
31
|
+
}
|
|
32
|
+
export interface RedactionCount {
|
|
33
|
+
name: string;
|
|
34
|
+
count: number;
|
|
35
|
+
}
|
|
36
|
+
export interface HostClassification {
|
|
37
|
+
kind: "loopback" | "private" | "remote" | "invalid";
|
|
38
|
+
host: string;
|
|
39
|
+
}
|
|
15
40
|
export interface SourceFile {
|
|
16
41
|
absolutePath: string;
|
|
17
42
|
relativePath: string;
|
|
@@ -46,6 +71,7 @@ export interface IngestResult {
|
|
|
46
71
|
indexedFiles: number;
|
|
47
72
|
chunks: number;
|
|
48
73
|
skippedFiles: number;
|
|
74
|
+
redactions: number;
|
|
49
75
|
errors: Array<{
|
|
50
76
|
path: string;
|
|
51
77
|
message: string;
|
|
@@ -76,4 +102,45 @@ export interface AuditReport {
|
|
|
76
102
|
staleInIndex: string[];
|
|
77
103
|
totalChunks: number;
|
|
78
104
|
}
|
|
105
|
+
export interface DestroyIndexResult {
|
|
106
|
+
storageDir: string;
|
|
107
|
+
removed: boolean;
|
|
108
|
+
note: string;
|
|
109
|
+
}
|
|
110
|
+
export interface SecurityAuditReport {
|
|
111
|
+
projectRoot: string;
|
|
112
|
+
zeroTelemetry: true;
|
|
113
|
+
network: {
|
|
114
|
+
policy: NetworkPolicy;
|
|
115
|
+
ollamaHost: string;
|
|
116
|
+
host: string;
|
|
117
|
+
classification: HostClassification["kind"];
|
|
118
|
+
};
|
|
119
|
+
redaction: {
|
|
120
|
+
enabled: boolean;
|
|
121
|
+
builtIn: boolean;
|
|
122
|
+
customPatterns: string[];
|
|
123
|
+
};
|
|
124
|
+
accessLog: {
|
|
125
|
+
enabled: boolean;
|
|
126
|
+
path: string;
|
|
127
|
+
storesRawQueries: false;
|
|
128
|
+
};
|
|
129
|
+
storage: {
|
|
130
|
+
path: string;
|
|
131
|
+
gitIgnored: boolean;
|
|
132
|
+
encryptedAtRest: "external-required";
|
|
133
|
+
};
|
|
134
|
+
mcp: {
|
|
135
|
+
maxTopK: number;
|
|
136
|
+
destructiveToolsExposed: false;
|
|
137
|
+
};
|
|
138
|
+
gitignore: {
|
|
139
|
+
kbIgnored: boolean;
|
|
140
|
+
mimirIgnored: boolean;
|
|
141
|
+
privateIgnored: boolean;
|
|
142
|
+
};
|
|
143
|
+
recommendations: string[];
|
|
144
|
+
warnings: string[];
|
|
145
|
+
}
|
|
79
146
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,QAAQ,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACjD;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,QAAQ,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,YAAY,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACvD,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACpB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.3.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = "0.
|
|
1
|
+
export const VERSION = "0.3.0";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jcode.labs/mimir",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Mimir: open-source local-first memory and retrieval for private project knowledge.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,7 +42,10 @@
|
|
|
42
42
|
"files": [
|
|
43
43
|
"dist",
|
|
44
44
|
"skills",
|
|
45
|
-
"README.md"
|
|
45
|
+
"README.md",
|
|
46
|
+
"SECURITY-HARDENING.md",
|
|
47
|
+
"CHANGELOG.md",
|
|
48
|
+
"SECURITY.md"
|
|
46
49
|
],
|
|
47
50
|
"publishConfig": {
|
|
48
51
|
"access": "public"
|
|
@@ -55,9 +58,10 @@
|
|
|
55
58
|
"lint": "biome ci .",
|
|
56
59
|
"lint:fix": "biome check --write .",
|
|
57
60
|
"package:check": "publint",
|
|
61
|
+
"release:artifacts": "node scripts/release-artifacts.mjs",
|
|
58
62
|
"smoke": "node scripts/smoke.mjs",
|
|
59
63
|
"test": "vitest run",
|
|
60
|
-
"validate": "pnpm lint && pnpm check && pnpm test && pnpm build && pnpm smoke && pnpm package:check"
|
|
64
|
+
"validate": "pnpm lint && pnpm check && pnpm test && pnpm build && pnpm smoke && pnpm package:check && pnpm release:artifacts"
|
|
61
65
|
},
|
|
62
66
|
"dependencies": {
|
|
63
67
|
"@lancedb/lancedb": "^0.30.0",
|
package/skills/mimir/SKILL.md
CHANGED
|
@@ -20,12 +20,15 @@ private/ # raw documents to ingest
|
|
|
20
20
|
.kb/config.json # local Mimir config
|
|
21
21
|
.kb/sources.txt # optional extra source paths
|
|
22
22
|
.kb/storage/ # generated local index
|
|
23
|
+
.kb/access.log # metadata-only access log
|
|
23
24
|
```
|
|
24
25
|
|
|
25
26
|
## Data Safety
|
|
26
27
|
|
|
27
28
|
- Do not commit raw documents, secrets, tax IDs, scans, bank documents, tokens, or generated vector stores.
|
|
28
|
-
- Keep `private
|
|
29
|
+
- Keep `private/**`, `.kb/`, and `.mimir/` ignored by Git.
|
|
30
|
+
- Treat `kb search`, `kb ask`, and MCP results as sensitive because they can contain private
|
|
31
|
+
source passages even when redaction is enabled.
|
|
29
32
|
- Prefer summaries and citations over dumping long private passages into the chat.
|
|
30
33
|
- If the user asks for a high-stakes answer, identify which facts came from Mimir and which still require professional or official verification.
|
|
31
34
|
|
|
@@ -35,6 +38,7 @@ From the repository root:
|
|
|
35
38
|
|
|
36
39
|
```bash
|
|
37
40
|
pnpm exec kb status
|
|
41
|
+
pnpm exec kb security-audit
|
|
38
42
|
```
|
|
39
43
|
|
|
40
44
|
If Mimir is not installed:
|
|
@@ -58,10 +62,12 @@ After documents are added or changed:
|
|
|
58
62
|
```bash
|
|
59
63
|
pnpm exec kb ingest
|
|
60
64
|
pnpm exec kb audit
|
|
65
|
+
pnpm exec kb security-audit
|
|
61
66
|
pnpm exec kb status
|
|
62
67
|
```
|
|
63
68
|
|
|
64
|
-
The audit must show no missing or stale supported files before relying on the index.
|
|
69
|
+
The audit must show no missing or stale supported files before relying on the index. The security
|
|
70
|
+
audit should not show warnings before relying on Mimir for sensitive work.
|
|
65
71
|
|
|
66
72
|
## Query Workflow
|
|
67
73
|
|
|
@@ -101,9 +107,13 @@ Available MCP tools:
|
|
|
101
107
|
- `mimir_search`: retrieve source passages.
|
|
102
108
|
- `mimir_ask`: synthesize an answer with local citations.
|
|
103
109
|
- `mimir_audit`: compare source files with the current index.
|
|
110
|
+
- `mimir_security_audit`: inspect local privacy, network, redaction, MCP, and gitignore posture.
|
|
104
111
|
|
|
105
112
|
Prefer MCP tools over shell commands when the agent runtime provides them. Use shell commands when MCP is unavailable.
|
|
106
113
|
|
|
114
|
+
MCP is read-focused and intentionally does not expose index deletion. Use `pnpm exec kb
|
|
115
|
+
destroy-index --yes` from the shell when the user explicitly wants to remove the generated index.
|
|
116
|
+
|
|
107
117
|
## Installing This Skill Into A Repository
|
|
108
118
|
|
|
109
119
|
Run:
|