@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.
Files changed (63) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +68 -2
  3. package/SECURITY-HARDENING.md +156 -0
  4. package/SECURITY.md +21 -0
  5. package/dist/access-log.d.ts +10 -0
  6. package/dist/access-log.d.ts.map +1 -0
  7. package/dist/access-log.js +29 -0
  8. package/dist/access-log.js.map +1 -0
  9. package/dist/cli.js +53 -1
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +49 -0
  13. package/dist/config.js.map +1 -1
  14. package/dist/destroy.d.ts +3 -0
  15. package/dist/destroy.d.ts.map +1 -0
  16. package/dist/destroy.js +16 -0
  17. package/dist/destroy.js.map +1 -0
  18. package/dist/embeddings.d.ts.map +1 -1
  19. package/dist/embeddings.js +2 -0
  20. package/dist/embeddings.js.map +1 -1
  21. package/dist/files.js +1 -1
  22. package/dist/files.js.map +1 -1
  23. package/dist/gitignore.d.ts +3 -0
  24. package/dist/gitignore.d.ts.map +1 -0
  25. package/dist/gitignore.js +34 -0
  26. package/dist/gitignore.js.map +1 -0
  27. package/dist/index.d.ts +4 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +3 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/ingest.d.ts.map +1 -1
  32. package/dist/ingest.js +12 -1
  33. package/dist/ingest.js.map +1 -1
  34. package/dist/init.d.ts.map +1 -1
  35. package/dist/init.js +13 -7
  36. package/dist/init.js.map +1 -1
  37. package/dist/mcp.d.ts.map +1 -1
  38. package/dist/mcp.js +15 -4
  39. package/dist/mcp.js.map +1 -1
  40. package/dist/network.d.ts +4 -0
  41. package/dist/network.d.ts.map +1 -0
  42. package/dist/network.js +59 -0
  43. package/dist/network.js.map +1 -0
  44. package/dist/query.d.ts.map +1 -1
  45. package/dist/query.js +17 -1
  46. package/dist/query.js.map +1 -1
  47. package/dist/redaction.d.ts +7 -0
  48. package/dist/redaction.d.ts.map +1 -0
  49. package/dist/redaction.js +63 -0
  50. package/dist/redaction.js.map +1 -0
  51. package/dist/security.d.ts +3 -0
  52. package/dist/security.d.ts.map +1 -0
  53. package/dist/security.js +86 -0
  54. package/dist/security.js.map +1 -0
  55. package/dist/skill.d.ts.map +1 -1
  56. package/dist/skill.js +11 -5
  57. package/dist/skill.js.map +1 -1
  58. package/dist/types.d.ts +67 -0
  59. package/dist/types.d.ts.map +1 -1
  60. package/dist/version.d.ts +1 -1
  61. package/dist/version.js +1 -1
  62. package/package.json +7 -3
  63. package/skills/mimir/SKILL.md +12 -2
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG3C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACrD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACtD,MAAM,YAAY,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IAC5D,MAAM,cAAc,GAAG,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IAEjE,IAAI,MAAM,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAA;IACjG,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,KAAK,YAAY,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACzE,QAAQ,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;IAC9E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAA;IAC/F,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;IAC9C,CAAC;IACD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IACjD,CAAC;IACD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;IACpD,CAAC;IAED,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,aAAa,EAAE,IAAI;QACnB,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC,aAAa;YAC5B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,cAAc,EAAE,OAAO,CAAC,IAAI;SAC7B;QACD,SAAS,EAAE;YACT,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO;YACjC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO;YACjC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;SACzE;QACD,SAAS,EAAE;YACT,OAAO,EAAE,MAAM,CAAC,SAAS;YACzB,IAAI,EAAE,MAAM,CAAC,aAAa;YAC1B,gBAAgB,EAAE,KAAK;SACxB;QACD,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC,UAAU;YACvB,UAAU,EAAE,SAAS;YACrB,eAAe,EAAE,mBAAmB;SACrC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,MAAM,CAAC,UAAU;YAC1B,uBAAuB,EAAE,KAAK;SAC/B;QACD,SAAS,EAAE;YACT,SAAS;YACT,YAAY;YACZ,cAAc;SACf;QACD,eAAe,EAAE;YACf,qFAAqF;YACrF,yFAAyF;YACzF,2FAA2F;SAC5F;QACD,QAAQ;KACT,CAAA;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,WAAmB;IAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;IAC1D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,GAAG,EAAE,CAAA;IAClB,CAAC;IAED,OAAO,IAAI,GAAG,CACZ,CAAC,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;SACpC,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CACnB,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAkB,EAAE,KAAa;IAC1D,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACzB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAIA,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,CAyBjG"}
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;AAcxC,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;IAE7E,OAAO;QACL,SAAS;QACT,aAAa;QACb,UAAU;QACV,OAAO,EAAE;YACP,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;SAC/B;KACF,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"}
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"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"}
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
@@ -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.2.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.2.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.2.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",
@@ -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/**` and `.kb/storage/**` ignored by Git.
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: