skein-cli 0.1.0-alpha.1

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 (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +180 -0
  3. package/bin/skein.mjs +7 -0
  4. package/dist/adapters/aider/conv-reader.d.ts +7 -0
  5. package/dist/adapters/aider/conv-reader.js +203 -0
  6. package/dist/adapters/aider/conv-reader.js.map +1 -0
  7. package/dist/adapters/aider/index.d.ts +2 -0
  8. package/dist/adapters/aider/index.js +123 -0
  9. package/dist/adapters/aider/index.js.map +1 -0
  10. package/dist/adapters/base.d.ts +71 -0
  11. package/dist/adapters/base.js +38 -0
  12. package/dist/adapters/base.js.map +1 -0
  13. package/dist/adapters/claude-code/conv-reader.d.ts +2 -0
  14. package/dist/adapters/claude-code/conv-reader.js +155 -0
  15. package/dist/adapters/claude-code/conv-reader.js.map +1 -0
  16. package/dist/adapters/claude-code/index.d.ts +3 -0
  17. package/dist/adapters/claude-code/index.js +517 -0
  18. package/dist/adapters/claude-code/index.js.map +1 -0
  19. package/dist/adapters/claude-desktop/index.d.ts +2 -0
  20. package/dist/adapters/claude-desktop/index.js +95 -0
  21. package/dist/adapters/claude-desktop/index.js.map +1 -0
  22. package/dist/adapters/codex/index.d.ts +2 -0
  23. package/dist/adapters/codex/index.js +472 -0
  24. package/dist/adapters/codex/index.js.map +1 -0
  25. package/dist/adapters/cursor/index.d.ts +2 -0
  26. package/dist/adapters/cursor/index.js +255 -0
  27. package/dist/adapters/cursor/index.js.map +1 -0
  28. package/dist/adapters/opencode/conv-reader.d.ts +3 -0
  29. package/dist/adapters/opencode/conv-reader.js +190 -0
  30. package/dist/adapters/opencode/conv-reader.js.map +1 -0
  31. package/dist/adapters/opencode/index.d.ts +2 -0
  32. package/dist/adapters/opencode/index.js +349 -0
  33. package/dist/adapters/opencode/index.js.map +1 -0
  34. package/dist/adapters/registry.d.ts +4 -0
  35. package/dist/adapters/registry.js +26 -0
  36. package/dist/adapters/registry.js.map +1 -0
  37. package/dist/cli.d.ts +3 -0
  38. package/dist/cli.js +54 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/commands/conv.d.ts +2 -0
  41. package/dist/commands/conv.js +261 -0
  42. package/dist/commands/conv.js.map +1 -0
  43. package/dist/commands/doctor.d.ts +2 -0
  44. package/dist/commands/doctor.js +85 -0
  45. package/dist/commands/doctor.js.map +1 -0
  46. package/dist/commands/init.d.ts +2 -0
  47. package/dist/commands/init.js +38 -0
  48. package/dist/commands/init.js.map +1 -0
  49. package/dist/commands/memory.d.ts +2 -0
  50. package/dist/commands/memory.js +197 -0
  51. package/dist/commands/memory.js.map +1 -0
  52. package/dist/commands/migrate.d.ts +2 -0
  53. package/dist/commands/migrate.js +102 -0
  54. package/dist/commands/migrate.js.map +1 -0
  55. package/dist/commands/profile.d.ts +2 -0
  56. package/dist/commands/profile.js +183 -0
  57. package/dist/commands/profile.js.map +1 -0
  58. package/dist/commands/redact.d.ts +2 -0
  59. package/dist/commands/redact.js +73 -0
  60. package/dist/commands/redact.js.map +1 -0
  61. package/dist/commands/trace.d.ts +2 -0
  62. package/dist/commands/trace.js +181 -0
  63. package/dist/commands/trace.js.map +1 -0
  64. package/dist/commands/view.d.ts +13 -0
  65. package/dist/commands/view.js +184 -0
  66. package/dist/commands/view.js.map +1 -0
  67. package/dist/commands/watch.d.ts +6 -0
  68. package/dist/commands/watch.js +61 -0
  69. package/dist/commands/watch.js.map +1 -0
  70. package/dist/commands/wrap.d.ts +2 -0
  71. package/dist/commands/wrap.js +131 -0
  72. package/dist/commands/wrap.js.map +1 -0
  73. package/dist/conv/chatgpt-import.d.ts +33 -0
  74. package/dist/conv/chatgpt-import.js +145 -0
  75. package/dist/conv/chatgpt-import.js.map +1 -0
  76. package/dist/conv/cursor.d.ts +12 -0
  77. package/dist/conv/cursor.js +55 -0
  78. package/dist/conv/cursor.js.map +1 -0
  79. package/dist/conv/export.d.ts +40 -0
  80. package/dist/conv/export.js +215 -0
  81. package/dist/conv/export.js.map +1 -0
  82. package/dist/conv/replay/aider.d.ts +24 -0
  83. package/dist/conv/replay/aider.js +56 -0
  84. package/dist/conv/replay/aider.js.map +1 -0
  85. package/dist/conv/replay/claude-code.d.ts +38 -0
  86. package/dist/conv/replay/claude-code.js +80 -0
  87. package/dist/conv/replay/claude-code.js.map +1 -0
  88. package/dist/conv/replay/context.d.ts +25 -0
  89. package/dist/conv/replay/context.js +63 -0
  90. package/dist/conv/replay/context.js.map +1 -0
  91. package/dist/conv/replay/index.d.ts +22 -0
  92. package/dist/conv/replay/index.js +84 -0
  93. package/dist/conv/replay/index.js.map +1 -0
  94. package/dist/conv/search.d.ts +67 -0
  95. package/dist/conv/search.js +379 -0
  96. package/dist/conv/search.js.map +1 -0
  97. package/dist/conv/sink.d.ts +26 -0
  98. package/dist/conv/sink.js +76 -0
  99. package/dist/conv/sink.js.map +1 -0
  100. package/dist/conv/sources/aider.d.ts +13 -0
  101. package/dist/conv/sources/aider.js +95 -0
  102. package/dist/conv/sources/aider.js.map +1 -0
  103. package/dist/conv/sources/claude-code.d.ts +13 -0
  104. package/dist/conv/sources/claude-code.js +189 -0
  105. package/dist/conv/sources/claude-code.js.map +1 -0
  106. package/dist/conv/sources/codex.d.ts +15 -0
  107. package/dist/conv/sources/codex.js +175 -0
  108. package/dist/conv/sources/codex.js.map +1 -0
  109. package/dist/conv/sources/opencode.d.ts +12 -0
  110. package/dist/conv/sources/opencode.js +92 -0
  111. package/dist/conv/sources/opencode.js.map +1 -0
  112. package/dist/conv/store.d.ts +10 -0
  113. package/dist/conv/store.js +75 -0
  114. package/dist/conv/store.js.map +1 -0
  115. package/dist/conv/title.d.ts +9 -0
  116. package/dist/conv/title.js +74 -0
  117. package/dist/conv/title.js.map +1 -0
  118. package/dist/conv/watcher.d.ts +28 -0
  119. package/dist/conv/watcher.js +75 -0
  120. package/dist/conv/watcher.js.map +1 -0
  121. package/dist/conv/zip.d.ts +11 -0
  122. package/dist/conv/zip.js +82 -0
  123. package/dist/conv/zip.js.map +1 -0
  124. package/dist/hf/client.d.ts +41 -0
  125. package/dist/hf/client.js +87 -0
  126. package/dist/hf/client.js.map +1 -0
  127. package/dist/index.d.ts +5 -0
  128. package/dist/index.js +6 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/ir/index.d.ts +24 -0
  131. package/dist/ir/index.js +23 -0
  132. package/dist/ir/index.js.map +1 -0
  133. package/dist/ir/profile.d.ts +55 -0
  134. package/dist/ir/profile.js +177 -0
  135. package/dist/ir/profile.js.map +1 -0
  136. package/dist/memory/index.d.ts +41 -0
  137. package/dist/memory/index.js +109 -0
  138. package/dist/memory/index.js.map +1 -0
  139. package/dist/memory/search.d.ts +24 -0
  140. package/dist/memory/search.js +114 -0
  141. package/dist/memory/search.js.map +1 -0
  142. package/dist/memory/sinks/claude-mem.d.ts +13 -0
  143. package/dist/memory/sinks/claude-mem.js +100 -0
  144. package/dist/memory/sinks/claude-mem.js.map +1 -0
  145. package/dist/memory/sinks/codex.d.ts +12 -0
  146. package/dist/memory/sinks/codex.js +82 -0
  147. package/dist/memory/sinks/codex.js.map +1 -0
  148. package/dist/memory/sinks/context.d.ts +21 -0
  149. package/dist/memory/sinks/context.js +42 -0
  150. package/dist/memory/sinks/context.js.map +1 -0
  151. package/dist/memory/sources/chatgpt.d.ts +22 -0
  152. package/dist/memory/sources/chatgpt.js +98 -0
  153. package/dist/memory/sources/chatgpt.js.map +1 -0
  154. package/dist/memory/sources/claude-mem.d.ts +8 -0
  155. package/dist/memory/sources/claude-mem.js +104 -0
  156. package/dist/memory/sources/claude-mem.js.map +1 -0
  157. package/dist/memory/sources/codex.d.ts +8 -0
  158. package/dist/memory/sources/codex.js +77 -0
  159. package/dist/memory/sources/codex.js.map +1 -0
  160. package/dist/memory/store.d.ts +19 -0
  161. package/dist/memory/store.js +82 -0
  162. package/dist/memory/store.js.map +1 -0
  163. package/dist/proxy/http.d.ts +21 -0
  164. package/dist/proxy/http.js +205 -0
  165. package/dist/proxy/http.js.map +1 -0
  166. package/dist/proxy/recorder.d.ts +35 -0
  167. package/dist/proxy/recorder.js +221 -0
  168. package/dist/proxy/recorder.js.map +1 -0
  169. package/dist/proxy/streaming.d.ts +33 -0
  170. package/dist/proxy/streaming.js +185 -0
  171. package/dist/proxy/streaming.js.map +1 -0
  172. package/dist/redactor/entropy.d.ts +29 -0
  173. package/dist/redactor/entropy.js +98 -0
  174. package/dist/redactor/entropy.js.map +1 -0
  175. package/dist/redactor/index.d.ts +52 -0
  176. package/dist/redactor/index.js +152 -0
  177. package/dist/redactor/index.js.map +1 -0
  178. package/dist/redactor/ner.d.ts +53 -0
  179. package/dist/redactor/ner.js +97 -0
  180. package/dist/redactor/ner.js.map +1 -0
  181. package/dist/redactor/pii-patterns.d.ts +22 -0
  182. package/dist/redactor/pii-patterns.js +187 -0
  183. package/dist/redactor/pii-patterns.js.map +1 -0
  184. package/dist/redactor/secret-patterns.d.ts +27 -0
  185. package/dist/redactor/secret-patterns.js +475 -0
  186. package/dist/redactor/secret-patterns.js.map +1 -0
  187. package/dist/schema/conv.d.ts +698 -0
  188. package/dist/schema/conv.js +85 -0
  189. package/dist/schema/conv.js.map +1 -0
  190. package/dist/schema/index.d.ts +2 -0
  191. package/dist/schema/index.js +3 -0
  192. package/dist/schema/index.js.map +1 -0
  193. package/dist/schema/manifest.d.ts +1531 -0
  194. package/dist/schema/manifest.js +179 -0
  195. package/dist/schema/manifest.js.map +1 -0
  196. package/dist/schema/memory.d.ts +107 -0
  197. package/dist/schema/memory.js +45 -0
  198. package/dist/schema/memory.js.map +1 -0
  199. package/dist/schema/trace.d.ts +164 -0
  200. package/dist/schema/trace.js +89 -0
  201. package/dist/schema/trace.js.map +1 -0
  202. package/dist/trace/consent.d.ts +30 -0
  203. package/dist/trace/consent.js +60 -0
  204. package/dist/trace/consent.js.map +1 -0
  205. package/dist/trace/extract.d.ts +22 -0
  206. package/dist/trace/extract.js +168 -0
  207. package/dist/trace/extract.js.map +1 -0
  208. package/dist/trace/ml-pii.d.ts +33 -0
  209. package/dist/trace/ml-pii.js +35 -0
  210. package/dist/trace/ml-pii.js.map +1 -0
  211. package/dist/trace/push.d.ts +59 -0
  212. package/dist/trace/push.js +141 -0
  213. package/dist/trace/push.js.map +1 -0
  214. package/dist/trace/serialize.d.ts +23 -0
  215. package/dist/trace/serialize.js +67 -0
  216. package/dist/trace/serialize.js.map +1 -0
  217. package/dist/ui/banner.d.ts +2 -0
  218. package/dist/ui/banner.js +17 -0
  219. package/dist/ui/banner.js.map +1 -0
  220. package/dist/ui/box.d.ts +4 -0
  221. package/dist/ui/box.js +38 -0
  222. package/dist/ui/box.js.map +1 -0
  223. package/dist/ui/index.d.ts +5 -0
  224. package/dist/ui/index.js +5 -0
  225. package/dist/ui/index.js.map +1 -0
  226. package/dist/ui/spinner.d.ts +10 -0
  227. package/dist/ui/spinner.js +44 -0
  228. package/dist/ui/spinner.js.map +1 -0
  229. package/dist/ui/table.d.ts +9 -0
  230. package/dist/ui/table.js +55 -0
  231. package/dist/ui/table.js.map +1 -0
  232. package/dist/util/frontmatter.d.ts +6 -0
  233. package/dist/util/frontmatter.js +20 -0
  234. package/dist/util/frontmatter.js.map +1 -0
  235. package/dist/util/fs.d.ts +5 -0
  236. package/dist/util/fs.js +41 -0
  237. package/dist/util/fs.js.map +1 -0
  238. package/dist/util/ids.d.ts +3 -0
  239. package/dist/util/ids.js +16 -0
  240. package/dist/util/ids.js.map +1 -0
  241. package/dist/util/log.d.ts +13 -0
  242. package/dist/util/log.js +33 -0
  243. package/dist/util/log.js.map +1 -0
  244. package/dist/util/paths.d.ts +18 -0
  245. package/dist/util/paths.js +36 -0
  246. package/dist/util/paths.js.map +1 -0
  247. package/dist/version.d.ts +5 -0
  248. package/dist/version.js +32 -0
  249. package/dist/version.js.map +1 -0
  250. package/package.json +86 -0
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Skein Intermediate Representation (IR)
3
+ * ─────────────────────────────────────
4
+ *
5
+ * Every harness configuration is converted INTO this IR by a reader,
6
+ * and converted OUT of this IR by a writer. Adapters never talk to each
7
+ * other directly — they only know the IR.
8
+ *
9
+ * source tool ─→ reader ─→ Profile (IR) ─→ writer ─→ target tool
10
+ *
11
+ * This is hub-and-spoke: N tools need only 2N adapters instead of N²
12
+ * direct converters. Adding a new tool means writing one reader and
13
+ * one writer; it instantly speaks to every other tool through the IR.
14
+ *
15
+ * Likewise for conversations: every transcript is normalized to
16
+ * `ConvEvent` (skein-conv/1), and replayers convert the IR into any
17
+ * target tool's session format.
18
+ */
19
+ export type { Identity, Rule, RuleScopeSchema, RuleActivationSchema, Agent, AgentRoleSchema, Command, Skill, SkillTriggerSchema, McpServer, McpTransportSchema, Hook, HookEventSchema, Permission, ModelConfig, ProfileManifest, Provenance, } from '../schema/manifest.js';
20
+ export { IdentitySchema, RuleSchema, AgentSchema, CommandSchema, SkillSchema, McpServerSchema, HookSchema, PermissionSchema, ModelConfigSchema, ProfileManifestSchema, ProvenanceSchema, emptyProfile, } from '../schema/manifest.js';
21
+ export type { ContentBlock, ConvEvent, ConvSessionSummary, Message, SessionStart, } from '../schema/conv.js';
22
+ export { ContentBlockSchema, ConvEventSchema, MessageEvent, SessionStartEvent, SessionEndEvent, MetaEvent, } from '../schema/conv.js';
23
+ export { Profile } from './profile.js';
24
+ export type { ProfileSummary, ProfileDiff, ProfileItem, ArtifactKind } from './profile.js';
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Skein Intermediate Representation (IR)
3
+ * ─────────────────────────────────────
4
+ *
5
+ * Every harness configuration is converted INTO this IR by a reader,
6
+ * and converted OUT of this IR by a writer. Adapters never talk to each
7
+ * other directly — they only know the IR.
8
+ *
9
+ * source tool ─→ reader ─→ Profile (IR) ─→ writer ─→ target tool
10
+ *
11
+ * This is hub-and-spoke: N tools need only 2N adapters instead of N²
12
+ * direct converters. Adding a new tool means writing one reader and
13
+ * one writer; it instantly speaks to every other tool through the IR.
14
+ *
15
+ * Likewise for conversations: every transcript is normalized to
16
+ * `ConvEvent` (skein-conv/1), and replayers convert the IR into any
17
+ * target tool's session format.
18
+ */
19
+ export { IdentitySchema, RuleSchema, AgentSchema, CommandSchema, SkillSchema, McpServerSchema, HookSchema, PermissionSchema, ModelConfigSchema, ProfileManifestSchema, ProvenanceSchema, emptyProfile, } from '../schema/manifest.js';
20
+ export { ContentBlockSchema, ConvEventSchema, MessageEvent, SessionStartEvent, SessionEndEvent, MetaEvent, } from '../schema/conv.js';
21
+ // Profile class — the fluent IR API
22
+ export { Profile } from './profile.js';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ir/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAuBH,OAAO,EACL,cAAc,EACd,UAAU,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,GACb,MAAM,uBAAuB,CAAA;AAW9B,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,SAAS,GACV,MAAM,mBAAmB,CAAA;AAE1B,oCAAoC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,55 @@
1
+ import { type ProfileManifest, type Provenance } from '../schema/manifest.js';
2
+ export interface ProfileSummary {
3
+ sourceTool: string;
4
+ sourceVersion?: string;
5
+ rules: number;
6
+ agents: number;
7
+ commands: number;
8
+ skills: number;
9
+ mcpServers: number;
10
+ hooks: number;
11
+ hasIdentity: boolean;
12
+ hasPermissions: boolean;
13
+ hasModels: boolean;
14
+ }
15
+ export interface ProfileDiff {
16
+ added: ProfileSummary;
17
+ removed: ProfileSummary;
18
+ unchanged: ProfileSummary;
19
+ }
20
+ export type ArtifactKind = 'identity' | 'rules' | 'agents' | 'commands' | 'skills' | 'mcpServers' | 'hooks' | 'permissions' | 'models';
21
+ export interface ProfileItem<Kind extends ArtifactKind = ArtifactKind, T = unknown> {
22
+ kind: Kind;
23
+ id: string;
24
+ item: T;
25
+ }
26
+ /**
27
+ * Profile is the canonical Intermediate Representation for a harness configuration.
28
+ *
29
+ * Every adapter reader produces a Profile; every adapter writer consumes a Profile.
30
+ * Adapters never call each other — all cross-tool migration goes through this class.
31
+ *
32
+ * The hub-and-spoke design means N tools need only 2N adapters (one reader, one writer)
33
+ * instead of N² direct converters.
34
+ */
35
+ export declare class Profile {
36
+ readonly manifest: ProfileManifest;
37
+ constructor(manifest: ProfileManifest);
38
+ static fromManifest(manifest: ProfileManifest): Profile;
39
+ static fromYaml(raw: string): Profile;
40
+ static empty(sourceTool: string): Profile;
41
+ get sourceTool(): string;
42
+ /** Total artifacts across all categories (excluding identity/permissions/models). */
43
+ get itemCount(): number;
44
+ summary(): ProfileSummary;
45
+ /** Iterate every artifact tagged with its kind and id. */
46
+ items(): IterableIterator<ProfileItem>;
47
+ /** Stamp provenance into every artifact that doesn't already have it. */
48
+ withProvenance(provenance: Provenance): Profile;
49
+ /** Filter artifacts in-place by predicate; identity/permissions/models pass through. */
50
+ filter(predicate: (item: ProfileItem) => boolean): Profile;
51
+ /** Pure diff: which IDs in `other` are added/removed/unchanged relative to `this`. */
52
+ diff(other: Profile): ProfileDiff;
53
+ toYaml(): string;
54
+ toJSON(): ProfileManifest;
55
+ }
@@ -0,0 +1,177 @@
1
+ import { emptyProfile, ProfileManifestSchema, } from '../schema/manifest.js';
2
+ import { stringify as stringifyYaml, parse as parseYaml } from 'yaml';
3
+ /**
4
+ * Profile is the canonical Intermediate Representation for a harness configuration.
5
+ *
6
+ * Every adapter reader produces a Profile; every adapter writer consumes a Profile.
7
+ * Adapters never call each other — all cross-tool migration goes through this class.
8
+ *
9
+ * The hub-and-spoke design means N tools need only 2N adapters (one reader, one writer)
10
+ * instead of N² direct converters.
11
+ */
12
+ export class Profile {
13
+ manifest;
14
+ constructor(manifest) {
15
+ this.manifest = manifest;
16
+ }
17
+ static fromManifest(manifest) {
18
+ return new Profile(ProfileManifestSchema.parse(manifest));
19
+ }
20
+ static fromYaml(raw) {
21
+ return Profile.fromManifest(parseYaml(raw));
22
+ }
23
+ static empty(sourceTool) {
24
+ return new Profile(emptyProfile(sourceTool));
25
+ }
26
+ get sourceTool() {
27
+ return this.manifest.sourceTool;
28
+ }
29
+ /** Total artifacts across all categories (excluding identity/permissions/models). */
30
+ get itemCount() {
31
+ const m = this.manifest;
32
+ return (m.rules.length +
33
+ m.agents.length +
34
+ m.commands.length +
35
+ m.skills.length +
36
+ m.mcpServers.length +
37
+ m.hooks.length);
38
+ }
39
+ summary() {
40
+ const m = this.manifest;
41
+ return {
42
+ sourceTool: m.sourceTool,
43
+ ...(m.sourceVersion ? { sourceVersion: m.sourceVersion } : {}),
44
+ rules: m.rules.length,
45
+ agents: m.agents.length,
46
+ commands: m.commands.length,
47
+ skills: m.skills.length,
48
+ mcpServers: m.mcpServers.length,
49
+ hooks: m.hooks.length,
50
+ hasIdentity: m.identity !== undefined,
51
+ hasPermissions: m.permissions !== undefined,
52
+ hasModels: m.models !== undefined,
53
+ };
54
+ }
55
+ /** Iterate every artifact tagged with its kind and id. */
56
+ *items() {
57
+ for (const r of this.manifest.rules)
58
+ yield { kind: 'rules', id: r.id, item: r };
59
+ for (const a of this.manifest.agents)
60
+ yield { kind: 'agents', id: a.id, item: a };
61
+ for (const c of this.manifest.commands)
62
+ yield { kind: 'commands', id: c.id, item: c };
63
+ for (const s of this.manifest.skills)
64
+ yield { kind: 'skills', id: s.id, item: s };
65
+ for (const m of this.manifest.mcpServers)
66
+ yield { kind: 'mcpServers', id: m.id, item: m };
67
+ for (const h of this.manifest.hooks)
68
+ yield { kind: 'hooks', id: `${h.event}:${h.matcher ?? '*'}`, item: h };
69
+ }
70
+ /** Stamp provenance into every artifact that doesn't already have it. */
71
+ withProvenance(provenance) {
72
+ const stamp = (item) => {
73
+ const existing = item.provenance;
74
+ return { ...item, provenance: existing ?? provenance };
75
+ };
76
+ const m = this.manifest;
77
+ return new Profile({
78
+ ...m,
79
+ ...(m.identity ? { identity: stamp(m.identity) } : {}),
80
+ rules: m.rules.map(r => stamp(r)),
81
+ agents: m.agents.map(a => stamp(a)),
82
+ commands: m.commands.map(c => stamp(c)),
83
+ skills: m.skills.map(s => stamp(s)),
84
+ mcpServers: m.mcpServers.map(srv => stamp(srv)),
85
+ hooks: m.hooks.map(h => stamp(h)),
86
+ });
87
+ }
88
+ /** Filter artifacts in-place by predicate; identity/permissions/models pass through. */
89
+ filter(predicate) {
90
+ const m = this.manifest;
91
+ return new Profile({
92
+ ...m,
93
+ rules: m.rules.filter(r => predicate({ kind: 'rules', id: r.id, item: r })),
94
+ agents: m.agents.filter(a => predicate({ kind: 'agents', id: a.id, item: a })),
95
+ commands: m.commands.filter(c => predicate({ kind: 'commands', id: c.id, item: c })),
96
+ skills: m.skills.filter(s => predicate({ kind: 'skills', id: s.id, item: s })),
97
+ mcpServers: m.mcpServers.filter(srv => predicate({ kind: 'mcpServers', id: srv.id, item: srv })),
98
+ hooks: m.hooks.filter(h => predicate({ kind: 'hooks', id: `${h.event}:${h.matcher ?? '*'}`, item: h })),
99
+ });
100
+ }
101
+ /** Pure diff: which IDs in `other` are added/removed/unchanged relative to `this`. */
102
+ diff(other) {
103
+ const myIds = collectIds(this);
104
+ const theirIds = collectIds(other);
105
+ return {
106
+ added: countDiff(theirIds, myIds, 'added'),
107
+ removed: countDiff(myIds, theirIds, 'removed'),
108
+ unchanged: countIntersection(myIds, theirIds),
109
+ };
110
+ }
111
+ toYaml() {
112
+ return stringifyYaml(ProfileManifestSchema.parse(this.manifest));
113
+ }
114
+ toJSON() {
115
+ return this.manifest;
116
+ }
117
+ }
118
+ function collectIds(profile) {
119
+ const out = new Map();
120
+ for (const { kind, id } of profile.items()) {
121
+ if (!out.has(kind))
122
+ out.set(kind, new Set());
123
+ out.get(kind).add(id);
124
+ }
125
+ return out;
126
+ }
127
+ function countDiff(base, other, _kind) {
128
+ const get = (k) => {
129
+ const s = base.get(k);
130
+ if (!s)
131
+ return 0;
132
+ const o = other.get(k) ?? new Set();
133
+ let n = 0;
134
+ for (const id of s)
135
+ if (!o.has(id))
136
+ n++;
137
+ return n;
138
+ };
139
+ return {
140
+ sourceTool: '',
141
+ rules: get('rules'),
142
+ agents: get('agents'),
143
+ commands: get('commands'),
144
+ skills: get('skills'),
145
+ mcpServers: get('mcpServers'),
146
+ hooks: get('hooks'),
147
+ hasIdentity: false,
148
+ hasPermissions: false,
149
+ hasModels: false,
150
+ };
151
+ }
152
+ function countIntersection(base, other) {
153
+ const get = (k) => {
154
+ const s = base.get(k);
155
+ if (!s)
156
+ return 0;
157
+ const o = other.get(k) ?? new Set();
158
+ let n = 0;
159
+ for (const id of s)
160
+ if (o.has(id))
161
+ n++;
162
+ return n;
163
+ };
164
+ return {
165
+ sourceTool: '',
166
+ rules: get('rules'),
167
+ agents: get('agents'),
168
+ commands: get('commands'),
169
+ skills: get('skills'),
170
+ mcpServers: get('mcpServers'),
171
+ hooks: get('hooks'),
172
+ hasIdentity: false,
173
+ hasPermissions: false,
174
+ hasModels: false,
175
+ };
176
+ }
177
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/ir/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Memory } from '../schema/memory.js';
2
+ export type MemorySource = 'claude-mem' | 'codex' | 'chatgpt';
3
+ export interface CaptureInput {
4
+ tool: MemorySource;
5
+ homeDir: string;
6
+ /** Path to a fixture / explicit data dir / export ZIP. */
7
+ inPath?: string;
8
+ dataDir?: string;
9
+ }
10
+ export interface CaptureResult {
11
+ read: number;
12
+ written: number;
13
+ skipped: number;
14
+ }
15
+ export declare function captureMemories(input: CaptureInput): Promise<CaptureResult>;
16
+ export declare function readSource(input: CaptureInput): Promise<Memory[]>;
17
+ export type ReplayMode = 'native' | 'context';
18
+ export interface ReplayInput {
19
+ targetTool: string;
20
+ homeDir: string;
21
+ mode?: ReplayMode;
22
+ ids?: string[];
23
+ scope?: 'global' | 'project';
24
+ outPath?: string;
25
+ createIfMissing?: boolean;
26
+ dataDir?: string;
27
+ dbPath?: string;
28
+ }
29
+ export interface ReplayResult {
30
+ mode: ReplayMode;
31
+ effectiveMode: ReplayMode;
32
+ inserted?: number;
33
+ skipped?: number;
34
+ bytesWritten?: number;
35
+ outputPath: string;
36
+ fallbackReason?: string;
37
+ selected: number;
38
+ }
39
+ export declare function replayMemories(input: ReplayInput): Promise<ReplayResult>;
40
+ export { readMemories } from './store.js';
41
+ export { searchMemories, rebuildMemoryIndex } from './search.js';
@@ -0,0 +1,109 @@
1
+ import { readClaudeMemMemories } from './sources/claude-mem.js';
2
+ import { readCodexMemories } from './sources/codex.js';
3
+ import { readChatgptMemories } from './sources/chatgpt.js';
4
+ import { importIntoClaudeMem } from './sinks/claude-mem.js';
5
+ import { importIntoCodex } from './sinks/codex.js';
6
+ import { renderContextBrief } from './sinks/context.js';
7
+ import { appendMemories, readMemories } from './store.js';
8
+ import { rebuildMemoryIndex } from './search.js';
9
+ export async function captureMemories(input) {
10
+ const memories = await readSource(input);
11
+ const existing = await readMemories();
12
+ const existingIds = new Set(existing.map(m => m.id));
13
+ const fresh = memories.filter(m => !existingIds.has(m.id));
14
+ const stats = await appendMemories(fresh);
15
+ await rebuildMemoryIndex();
16
+ return {
17
+ read: memories.length,
18
+ written: stats.appended,
19
+ skipped: memories.length - stats.appended,
20
+ };
21
+ }
22
+ export async function readSource(input) {
23
+ if (input.tool === 'claude-mem') {
24
+ return readClaudeMemMemories({
25
+ homeDir: input.homeDir,
26
+ ...(input.dataDir ? { dataDir: input.dataDir } : {}),
27
+ });
28
+ }
29
+ if (input.tool === 'codex') {
30
+ return readCodexMemories({
31
+ homeDir: input.homeDir,
32
+ ...(input.inPath ? { dbPath: input.inPath } : {}),
33
+ });
34
+ }
35
+ if (input.tool === 'chatgpt') {
36
+ if (!input.inPath) {
37
+ throw new Error('chatgpt source requires --in <export.zip>');
38
+ }
39
+ return readChatgptMemories({ zipPath: input.inPath });
40
+ }
41
+ throw new Error(`Unknown memory source: ${input.tool}`);
42
+ }
43
+ const NATIVE_TARGETS = new Set(['claude-mem', 'codex']);
44
+ export async function replayMemories(input) {
45
+ const requested = input.mode ?? 'native';
46
+ let effective = requested;
47
+ let fallbackReason;
48
+ if (effective === 'native' && !NATIVE_TARGETS.has(input.targetTool)) {
49
+ effective = 'context';
50
+ fallbackReason = `Native mode is not supported for ${input.targetTool} (cloud-only or unsupported memory store); rendered a markdown brief instead.`;
51
+ }
52
+ const all = await readMemories();
53
+ const filtered = all.filter(memory => {
54
+ if (input.scope && memory.scope !== input.scope)
55
+ return false;
56
+ if (input.ids && input.ids.length > 0) {
57
+ const matchesPrefix = input.ids.some(id => memory.id === id || memory.id.startsWith(id));
58
+ if (!matchesPrefix)
59
+ return false;
60
+ }
61
+ return true;
62
+ });
63
+ if (effective === 'native' && input.targetTool === 'claude-mem') {
64
+ const result = await importIntoClaudeMem(filtered, {
65
+ homeDir: input.homeDir,
66
+ ...(input.dataDir ? { dataDir: input.dataDir } : {}),
67
+ createIfMissing: input.createIfMissing ?? true,
68
+ });
69
+ return {
70
+ mode: requested,
71
+ effectiveMode: effective,
72
+ inserted: result.inserted,
73
+ skipped: result.skipped,
74
+ outputPath: result.path,
75
+ selected: filtered.length,
76
+ };
77
+ }
78
+ if (effective === 'native' && input.targetTool === 'codex') {
79
+ const result = await importIntoCodex(filtered, {
80
+ homeDir: input.homeDir,
81
+ ...(input.dbPath ? { dbPath: input.dbPath } : {}),
82
+ createIfMissing: input.createIfMissing ?? true,
83
+ });
84
+ return {
85
+ mode: requested,
86
+ effectiveMode: effective,
87
+ inserted: result.inserted,
88
+ skipped: result.skipped,
89
+ outputPath: result.path,
90
+ selected: filtered.length,
91
+ };
92
+ }
93
+ const brief = await renderContextBrief({
94
+ memories: filtered,
95
+ targetTool: input.targetTool,
96
+ ...(input.outPath ? { outPath: input.outPath } : {}),
97
+ });
98
+ return {
99
+ mode: requested,
100
+ effectiveMode: effective,
101
+ outputPath: brief.path,
102
+ bytesWritten: brief.bytesWritten,
103
+ ...(fallbackReason ? { fallbackReason } : {}),
104
+ selected: filtered.length,
105
+ };
106
+ }
107
+ export { readMemories } from './store.js';
108
+ export { searchMemories, rebuildMemoryIndex } from './search.js';
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAA8B,MAAM,uBAAuB,CAAA;AACvF,OAAO,EAAE,eAAe,EAA0B,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAA4B,MAAM,oBAAoB,CAAA;AACjF,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAkBhD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAmB;IACvD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;IACxC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;IACrC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAA;IACzC,MAAM,kBAAkB,EAAE,CAAA;IAC1B,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,MAAM;QACrB,OAAO,EAAE,KAAK,CAAC,QAAQ;QACvB,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ;KAC1C,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAmB;IAClD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChC,OAAO,qBAAqB,CAAC;YAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CAAC;YACvB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,mBAAmB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;IACvD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;AACzD,CAAC;AAGD,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAA;AAyB5E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAkB;IACrD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAA;IACxC,IAAI,SAAS,GAAe,SAAS,CAAA;IACrC,IAAI,cAAkC,CAAA;IACtC,IAAI,SAAS,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,SAAS,GAAG,SAAS,CAAA;QACrB,cAAc,GAAG,oCAAoC,KAAK,CAAC,UAAU,+EAA+E,CAAA;IACtJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,YAAY,EAAE,CAAA;IAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;QACnC,IAAI,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QAC7D,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;YACxF,IAAI,CAAC,aAAa;gBAAE,OAAO,KAAK,CAAA;QAClC,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,IAAI,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,YAAY,EAAE,CAAC;QAChE,MAAM,MAAM,GAA0B,MAAM,mBAAmB,CAAC,QAAQ,EAAE;YACxE,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;SAC/C,CAAC,CAAA;QACF,OAAO;YACL,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,SAAS;YACxB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,QAAQ,EAAE,QAAQ,CAAC,MAAM;SAC1B,CAAA;IACH,CAAC;IACD,IAAI,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAsB,MAAM,eAAe,CAAC,QAAQ,EAAE;YAChE,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;SAC/C,CAAC,CAAA;QACF,OAAO;YACL,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,SAAS;YACxB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,QAAQ,EAAE,QAAQ,CAAC,MAAM;SAC1B,CAAA;IACH,CAAC;IAED,MAAM,KAAK,GAAwB,MAAM,kBAAkB,CAAC;QAC1D,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC,CAAA;IACF,OAAO;QACL,IAAI,EAAE,SAAS;QACf,aAAa,EAAE,SAAS;QACxB,UAAU,EAAE,KAAK,CAAC,IAAI;QACtB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,QAAQ,EAAE,QAAQ,CAAC,MAAM;KAC1B,CAAA;AACH,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,24 @@
1
+ import type { Memory } from '../schema/memory.js';
2
+ interface SqliteDatabase {
3
+ exec(sql: string): void;
4
+ prepare(sql: string): SqliteStatement;
5
+ close(): void;
6
+ }
7
+ interface SqliteStatement {
8
+ all(...params: unknown[]): unknown[];
9
+ run(...params: unknown[]): {
10
+ changes: number;
11
+ lastInsertRowid: number | bigint;
12
+ };
13
+ }
14
+ export declare function memoryIndexPath(): string;
15
+ export declare function openMemoryIndex(): Promise<SqliteDatabase>;
16
+ export declare function rebuildMemoryIndex(): Promise<{
17
+ indexed: number;
18
+ }>;
19
+ export interface SearchHit extends Memory {
20
+ snippet: string;
21
+ rank: number;
22
+ }
23
+ export declare function searchMemories(query: string, limit?: number, tool?: string): Promise<SearchHit[]>;
24
+ export {};
@@ -0,0 +1,114 @@
1
+ import { createRequire } from 'node:module';
2
+ import { dirname, join } from 'node:path';
3
+ import { ensureDir } from '../util/fs.js';
4
+ import { getToolPaths } from '../util/paths.js';
5
+ import { readMemories } from './store.js';
6
+ const SCHEMA = `
7
+ CREATE TABLE IF NOT EXISTS memories (
8
+ id TEXT PRIMARY KEY,
9
+ tool TEXT,
10
+ scope TEXT,
11
+ project TEXT,
12
+ fact TEXT,
13
+ tags TEXT,
14
+ added_at TEXT,
15
+ updated_at TEXT
16
+ );
17
+
18
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5(
19
+ memory_id UNINDEXED,
20
+ fact,
21
+ tags,
22
+ tokenize='unicode61'
23
+ );
24
+
25
+ CREATE INDEX IF NOT EXISTS memories_updated_at ON memories(updated_at);
26
+ CREATE INDEX IF NOT EXISTS memories_tool ON memories(tool);
27
+ CREATE INDEX IF NOT EXISTS memories_scope ON memories(scope);
28
+ `;
29
+ const requireSqlite = createRequire(import.meta.url);
30
+ let cachedSqlite;
31
+ function loadSqlite() {
32
+ if (!cachedSqlite) {
33
+ cachedSqlite = requireSqlite('node:sqlite');
34
+ }
35
+ return cachedSqlite;
36
+ }
37
+ export function memoryIndexPath() {
38
+ const paths = getToolPaths();
39
+ return join(paths.skeinDir, 'memory', 'index.sqlite');
40
+ }
41
+ export async function openMemoryIndex() {
42
+ const path = memoryIndexPath();
43
+ await ensureDir(dirname(path));
44
+ const { DatabaseSync } = loadSqlite();
45
+ const db = new DatabaseSync(path);
46
+ db.exec(SCHEMA);
47
+ return db;
48
+ }
49
+ export async function rebuildMemoryIndex() {
50
+ const memories = await readMemories();
51
+ const db = await openMemoryIndex();
52
+ try {
53
+ db.exec('DELETE FROM memories; DELETE FROM memory_fts;');
54
+ const insert = db.prepare('INSERT INTO memories (id, tool, scope, project, fact, tags, added_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
55
+ const insertFts = db.prepare('INSERT INTO memory_fts (memory_id, fact, tags) VALUES (?, ?, ?)');
56
+ for (const memory of memories) {
57
+ insert.run(memory.id, memory.tool, memory.scope, memory.project ?? null, memory.fact, memory.tags.join(' '), memory.addedAt, memory.updatedAt);
58
+ insertFts.run(memory.id, memory.fact, memory.tags.join(' '));
59
+ }
60
+ return { indexed: memories.length };
61
+ }
62
+ finally {
63
+ db.close();
64
+ }
65
+ }
66
+ export async function searchMemories(query, limit = 20, tool) {
67
+ const db = await openMemoryIndex();
68
+ try {
69
+ const filterTool = tool ? 'AND m.tool = ?' : '';
70
+ const sql = `
71
+ SELECT m.id AS id, m.tool AS tool, m.scope AS scope, m.project AS project,
72
+ m.fact AS fact, m.tags AS tags, m.added_at AS added_at,
73
+ m.updated_at AS updated_at,
74
+ snippet(memory_fts, 1, '«', '»', '…', 12) AS snippet,
75
+ rank AS rank
76
+ FROM memory_fts
77
+ JOIN memories m ON m.id = memory_fts.memory_id
78
+ WHERE memory_fts MATCH ? ${filterTool}
79
+ ORDER BY rank
80
+ LIMIT ?
81
+ `;
82
+ const params = tool ? [escapeFts(query), tool, limit] : [escapeFts(query), limit];
83
+ const rows = db.prepare(sql).all(...params);
84
+ return rows.map(r => ({
85
+ schema: 'skein-memory/1',
86
+ id: r.id,
87
+ tool: r.tool,
88
+ scope: r.scope,
89
+ ...(r.project ? { project: r.project } : {}),
90
+ fact: r.fact,
91
+ tags: r.tags.split(' ').filter(Boolean),
92
+ provenance: { sourceTool: r.tool, capturedAt: r.added_at },
93
+ addedAt: r.added_at,
94
+ updatedAt: r.updated_at,
95
+ snippet: r.snippet,
96
+ rank: r.rank,
97
+ }));
98
+ }
99
+ finally {
100
+ db.close();
101
+ }
102
+ }
103
+ function escapeFts(query) {
104
+ const trimmed = query.trim();
105
+ if (!trimmed)
106
+ return '';
107
+ if (/^["{].*["}]$/.test(trimmed))
108
+ return trimmed;
109
+ return trimmed
110
+ .split(/\s+/)
111
+ .map(t => `"${t.replace(/"/g, '""')}"`)
112
+ .join(' ');
113
+ }
114
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/memory/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Memory } from '../../schema/memory.js';
2
+ export interface ClaudeMemSinkOptions {
3
+ homeDir: string;
4
+ dataDir?: string;
5
+ /** When the target db doesn't exist, create it with the minimal schema. */
6
+ createIfMissing?: boolean;
7
+ }
8
+ export interface ClaudeMemImportResult {
9
+ inserted: number;
10
+ skipped: number;
11
+ path: string;
12
+ }
13
+ export declare function importIntoClaudeMem(memories: Memory[], opts: ClaudeMemSinkOptions): Promise<ClaudeMemImportResult>;