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 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EACL,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,cAAc,GAGf,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEnF,MAAM,gBAAgB,GAAmB,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AAE3E,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qDAAqD,CAAC,CAAA;IAErE,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;SAC9D,MAAM,CAAC,aAAa,EAAE,kBAAkB,EAAE,IAAI,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,IAAsD,EAAE,EAAE;QACvE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,CAAA;QACpF,MAAM,QAAQ,GAAG,QAAQ;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;aAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;aAClD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aACtD,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CACT,OAAO,CACL,0BAA0B,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,SAAS,CACpF,CACF,CAAA;YACD,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;YACtB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI;SACvE,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CACT,GAAG,CACD,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,EAC/D,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,CACtE,CACF,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mDAAmD,CAAC;SAChE,QAAQ,CAAC,MAAM,EAAE,mCAAmC,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;QACxF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAA;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,OAAO,CAAC,GAAG,CACT,GAAG,CACD,OAAO,CAAC;YACN,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YAC5C,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;YACpC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;YACtC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpF,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YACnD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACvD,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;YACvE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU;gBAC7B,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3E,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS;gBAC5B,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzE,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,EACF,QAAQ,CACT,CACF,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEJ,MAAM;SACH,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,cAAc,CAAC,eAAe,EAAE,gBAAgB,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;SAChF,MAAM,CAAC,aAAa,EAAE,wDAAwD,CAAC;SAC/E,MAAM,CAAC,mBAAmB,EAAE,kCAAkC,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,IAAqD,EAAE,EAAE;QACtE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAoB,CAAC,EAAE,CAAC;YAC1D,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,qBAAqB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAClD,KAAK,IAAI,EAAE,CACT,eAAe,CAAC;YACd,IAAI,EAAE,IAAI,CAAC,IAAoB;YAC/B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CACL,CAAA;QACD,OAAO,CAAC,GAAG,CACT,GAAG,CACD,OAAO,CAAC;YACN,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtD,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACzD,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;YACzE,EAAE,KAAK,EAAE,2BAA2B,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;SACjF,CAAC,EACF,kBAAkB,CACnB,CACF,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2CAA2C,CAAC;SACxD,QAAQ,CAAC,YAAY,EAAE,4BAA4B,CAAC;SACpD,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,IAAsC,EAAE,EAAE;QACxE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAChC,MAAM,WAAW,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAA;QAC9E,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE,CACjF,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CACxD,CAAA;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;YAC3D,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI;YAC7D,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAClC,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CACT,GAAG,CACD,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,EACjE,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CACvD,CACF,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0DAA0D,CAAC;SACvE,cAAc,CACb,aAAa,EACb,4EAA4E,CAC7E;SACA,MAAM,CAAC,eAAe,EAAE,kBAAkB,EAAE,QAAQ,CAAC;SACrD,MAAM,CAAC,aAAa,EAAE,iEAAiE,CAAC;SACxF,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC;SAClD,MAAM,CAAC,WAAW,EAAE,8BAA8B,EAAE,KAAK,CAAC;SAC1D,MAAM,CACL,KAAK,EAAE,IAON,EAAE,EAAE;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAkB,CAAA;QACpC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5C,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,8BAA8B,CAAC,CAAA;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,MAAM,YAAY,EAAE,CAAA;YAChC,MAAM,QAAQ,GAAG,GAAG;iBACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;iBAClD,MAAM,CAAC,CAAC,CAAC,EAAE;gBACV,IAAI,CAAC,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,CAAA;gBAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;qBACjB,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBAClB,MAAM,CAAC,OAAO,CAAC,CAAA;gBAClB,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;YAC3D,CAAC,CAAC,CAAA;YACJ,OAAO,CAAC,GAAG,CACT,GAAG,CACD,OAAO,CAAC;gBACN,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAC/C,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE;gBACxC,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;aAChE,CAAC,EACF,cAAc,CACf,CACF,CAAA;YACD,OAAM;QACR,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,wBAAwB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,EACvD,KAAK,IAAI,EAAE,CACT,cAAc,CAAC;YACb,UAAU,EAAE,IAAI,CAAC,EAAE;YACnB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI;YACJ,GAAG,CAAC,IAAI,CAAC,GAAG;gBACV,CAAC,CAAC;oBACE,GAAG,EAAE,IAAI,CAAC,GAAG;yBACV,KAAK,CAAC,GAAG,CAAC;yBACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;yBAClB,MAAM,CAAC,OAAO,CAAC;iBACnB;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAA6B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3C,CAAC,CACL,CAAA;QACD,OAAO,CAAC,GAAG,CACT,GAAG,CACD,OAAO,CAAC;YACN,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YACpD,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE;YAC/C;gBACE,KAAK,EAAE,gBAAgB;gBACvB,KAAK,EACH,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,aAAa;oBAClC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC;oBACnC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,aAAa,aAAa,CAAC;aACzD;YACD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;YACrD,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS;gBAC/B,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACtE,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS;gBAC9B,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACpF,CAAC,CAAC,EAAE,CAAC;YACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;YACxD,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS;gBACnC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClE,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,EACF,iBAAiB,CAClB,CACF,CAAA;QACD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACf,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC,CACF,CAAA;AACL,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC/F,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerMigrate(program: Command): void;
@@ -0,0 +1,102 @@
1
+ import chalk from 'chalk';
2
+ import { resolve } from 'node:path';
3
+ import { profileFromReader, mergeReports } from '../adapters/base.js';
4
+ import { getAdapterOrThrow } from '../adapters/registry.js';
5
+ import { Profile } from '../ir/index.js';
6
+ import { log } from '../util/log.js';
7
+ import { getToolPaths } from '../util/paths.js';
8
+ import { box, kvTable, warnBox, withSpinner } from '../ui/index.js';
9
+ export function registerMigrate(program) {
10
+ program
11
+ .command('migrate')
12
+ .description('one-shot profile migration between tools')
13
+ .requiredOption('--from <tool>', 'source tool')
14
+ .requiredOption('--to <tool>', 'target tool')
15
+ .option('--project <path>', 'project path for project-scoped artifacts')
16
+ .option('--dry-run', 'do not write files', false)
17
+ .action(async (opts) => {
18
+ const from = getAdapterOrThrow(opts.from);
19
+ const to = getAdapterOrThrow(opts.to);
20
+ if (!from.reader) {
21
+ log.error(`Adapter "${from.id}" has no reader`);
22
+ process.exit(1);
23
+ }
24
+ if (!to.writer) {
25
+ log.error(`Adapter "${to.id}" has no writer`);
26
+ process.exit(1);
27
+ }
28
+ const paths = getToolPaths();
29
+ const readCtx = {
30
+ homeDir: paths.homeDir,
31
+ ...(opts.project ? { projectPath: resolve(opts.project) } : {}),
32
+ };
33
+ const profileObj = await withSpinner(`Reading ${chalk.cyan(from.name)}`, async () => {
34
+ const manifest = await profileFromReader(from.reader, from.id, readCtx);
35
+ return Profile.fromManifest(manifest).withProvenance({
36
+ sourceTool: from.id,
37
+ capturedAt: new Date().toISOString(),
38
+ });
39
+ });
40
+ const writeCtx = {
41
+ homeDir: paths.homeDir,
42
+ ...(opts.project ? { projectPath: resolve(opts.project) } : {}),
43
+ dryRun: opts.dryRun,
44
+ };
45
+ const action = opts.dryRun ? chalk.yellow('dry-run') : chalk.green('live');
46
+ const report = await withSpinner(`Writing to ${chalk.cyan(to.name)} (${action})`, async () => apply(to.writer, profileObj, writeCtx));
47
+ const s = profileObj.summary();
48
+ console.log(box(kvTable([
49
+ { label: 'From', value: chalk.cyan(from.name) },
50
+ { label: 'To', value: chalk.cyan(to.name) },
51
+ { label: 'Mode', value: opts.dryRun ? chalk.yellow('dry-run') : chalk.green('live') },
52
+ { label: '─────────', value: '' },
53
+ { label: 'Rules read', value: String(s.rules) },
54
+ { label: 'Agents read', value: String(s.agents) },
55
+ { label: 'Commands read', value: String(s.commands) },
56
+ { label: 'Skills read', value: String(s.skills) },
57
+ { label: 'MCP read', value: String(s.mcpServers) },
58
+ { label: 'Hooks read', value: String(s.hooks) },
59
+ { label: '─────────', value: '' },
60
+ { label: 'Files written', value: chalk.green(String(report.written.length)) },
61
+ { label: 'Skipped', value: chalk.yellow(String(report.skipped.length)) },
62
+ { label: 'Warnings', value: chalk.yellow(String(report.warnings.length)) },
63
+ ]), opts.dryRun ? 'Migration preview' : 'Migration complete'));
64
+ const unique = dedupe(report.warnings);
65
+ if (unique.length > 0) {
66
+ console.log('');
67
+ console.log(warnBox(unique
68
+ .map(w => `· ${w.message}${w.count > 1 ? chalk.dim(` (×${w.count})`) : ''}`)
69
+ .join('\n')));
70
+ }
71
+ });
72
+ }
73
+ function dedupe(messages) {
74
+ const seen = new Map();
75
+ for (const m of messages) {
76
+ const normalized = m.replace(/"[^"]+"/g, '"…"');
77
+ seen.set(normalized, (seen.get(normalized) ?? 0) + 1);
78
+ }
79
+ return [...seen.entries()].map(([message, count]) => ({ message, count }));
80
+ }
81
+ async function apply(writer, profileObj, ctx) {
82
+ const m = profileObj.manifest;
83
+ let report = { written: [], skipped: [], warnings: [] };
84
+ if (m.rules.length && writer.writeRules)
85
+ report = mergeReports(report, await writer.writeRules(m.rules, ctx));
86
+ if (m.agents.length && writer.writeAgents)
87
+ report = mergeReports(report, await writer.writeAgents(m.agents, ctx));
88
+ if (m.commands.length && writer.writeCommands)
89
+ report = mergeReports(report, await writer.writeCommands(m.commands, ctx));
90
+ if (m.skills.length && writer.writeSkills)
91
+ report = mergeReports(report, await writer.writeSkills(m.skills, ctx));
92
+ if (m.mcpServers.length && writer.writeMcpServers)
93
+ report = mergeReports(report, await writer.writeMcpServers(m.mcpServers, ctx));
94
+ if (m.hooks.length && writer.writeHooks)
95
+ report = mergeReports(report, await writer.writeHooks(m.hooks, ctx));
96
+ if (m.permissions && writer.writePermissions)
97
+ report = mergeReports(report, await writer.writePermissions(m.permissions, ctx));
98
+ if (m.models && writer.writeModels)
99
+ report = mergeReports(report, await writer.writeModels(m.models, ctx));
100
+ return report;
101
+ }
102
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerProfile(program: Command): void;
@@ -0,0 +1,183 @@
1
+ import chalk from 'chalk';
2
+ import { join, resolve } from 'node:path';
3
+ import { promises as fs } from 'node:fs';
4
+ import { profileFromReader } from '../adapters/base.js';
5
+ import { mergeReports } from '../adapters/base.js';
6
+ import { getAdapterOrThrow, ADAPTERS } from '../adapters/registry.js';
7
+ import { Profile } from '../ir/index.js';
8
+ import { ensureDir, writeFileAtomic } from '../util/fs.js';
9
+ import { log } from '../util/log.js';
10
+ import { getToolPaths, SKEIN_SUBDIRS } from '../util/paths.js';
11
+ import { box, kvTable, withSpinner, infoBox, warnBox } from '../ui/index.js';
12
+ export function registerProfile(program) {
13
+ const profile = program.command('profile').description('export, import, diff, and list profiles');
14
+ profile
15
+ .command('export')
16
+ .description('export profile from a source tool')
17
+ .option('--from <tool>', 'source tool', 'claude-code')
18
+ .option('--project <path>', 'project path for project-scoped artifacts')
19
+ .option('--out <file>', 'output file (default ~/.skein/profile/<tool>.yaml)')
20
+ .action(async (opts) => {
21
+ const adapter = getAdapterOrThrow(opts.from);
22
+ if (!adapter.reader) {
23
+ log.error(`Adapter "${adapter.id}" has no reader`);
24
+ process.exit(1);
25
+ }
26
+ const paths = getToolPaths();
27
+ const ctx = {
28
+ homeDir: paths.homeDir,
29
+ ...(opts.project ? { projectPath: resolve(opts.project) } : {}),
30
+ };
31
+ const manifest = await withSpinner(`Reading ${chalk.cyan(adapter.name)} configuration`, async () => profileFromReader(adapter.reader, adapter.id, ctx));
32
+ const profileObj = Profile.fromManifest(manifest).withProvenance({
33
+ sourceTool: adapter.id,
34
+ capturedAt: new Date().toISOString(),
35
+ });
36
+ const outPath = opts.out
37
+ ? resolve(opts.out)
38
+ : join(paths.skeinDir, SKEIN_SUBDIRS.profile, `${adapter.id}.yaml`);
39
+ await withSpinner(`Writing ${chalk.dim(outPath)}`, async () => {
40
+ await ensureDir(join(outPath, '..'));
41
+ await writeFileAtomic(outPath, profileObj.toYaml());
42
+ });
43
+ const s = profileObj.summary();
44
+ console.log(box(kvTable([
45
+ {
46
+ label: 'Source',
47
+ value: `${chalk.cyan(s.sourceTool)} ${chalk.dim(s.sourceVersion ?? '')}`,
48
+ },
49
+ { label: 'Output', value: outPath },
50
+ { label: '─────────', value: '' },
51
+ { label: 'Rules', value: String(s.rules) },
52
+ { label: 'Agents', value: String(s.agents) },
53
+ { label: 'Commands', value: String(s.commands) },
54
+ { label: 'Skills', value: String(s.skills) },
55
+ { label: 'MCP servers', value: String(s.mcpServers) },
56
+ { label: 'Hooks', value: String(s.hooks) },
57
+ { label: 'Identity', value: s.hasIdentity ? chalk.green('yes') : chalk.dim('—') },
58
+ { label: 'Permissions', value: s.hasPermissions ? chalk.green('yes') : chalk.dim('—') },
59
+ { label: 'Models', value: s.hasModels ? chalk.green('yes') : chalk.dim('—') },
60
+ ]), 'Profile snapshot'));
61
+ });
62
+ profile
63
+ .command('import')
64
+ .description('import profile into a target tool')
65
+ .requiredOption('--to <tool>', 'target tool')
66
+ .option('--in <file>', 'profile file', defaultProfileIn())
67
+ .option('--project <path>', 'project path for project-scoped artifacts')
68
+ .option('--dry-run', 'do not write files', false)
69
+ .action(async (opts) => {
70
+ const adapter = getAdapterOrThrow(opts.to);
71
+ if (!adapter.writer) {
72
+ log.error(`Adapter "${adapter.id}" has no writer`);
73
+ process.exit(1);
74
+ }
75
+ const profileObj = await withSpinner(`Reading profile from ${chalk.dim(resolve(opts.in))}`, async () => {
76
+ const raw = await fs.readFile(resolve(opts.in), 'utf8');
77
+ return Profile.fromYaml(raw);
78
+ });
79
+ const paths = getToolPaths();
80
+ const ctx = {
81
+ homeDir: paths.homeDir,
82
+ ...(opts.project ? { projectPath: resolve(opts.project) } : {}),
83
+ dryRun: opts.dryRun,
84
+ };
85
+ const action = opts.dryRun ? chalk.yellow('(dry-run)') : chalk.green('(live)');
86
+ const report = await withSpinner(`Applying ${chalk.cyan(profileObj.sourceTool)} → ${chalk.cyan(adapter.name)} ${action}`, async () => applyManifest(adapter.writer, profileObj, ctx));
87
+ console.log(box(kvTable([
88
+ { label: 'Wrote', value: chalk.green(String(report.written.length)) },
89
+ { label: 'Skipped', value: chalk.yellow(String(report.skipped.length)) },
90
+ { label: 'Warnings', value: chalk.yellow(String(report.warnings.length)) },
91
+ ]), opts.dryRun ? 'Import preview' : 'Import complete'));
92
+ const unique = dedupeWarnings(report.warnings);
93
+ if (unique.length > 0) {
94
+ console.log('');
95
+ console.log(warnBox(unique
96
+ .map(w => `· ${w.message}${w.count > 1 ? chalk.dim(` (×${w.count})`) : ''}`)
97
+ .join('\n')));
98
+ }
99
+ if (report.skipped.length > 0) {
100
+ console.log('');
101
+ console.log(infoBox(report.skipped.map(s => `${chalk.dim(s.item)} ${s.reason}`).join('\n'), 'Skipped'));
102
+ }
103
+ });
104
+ profile
105
+ .command('list')
106
+ .description('list local profile snapshots')
107
+ .action(async () => {
108
+ const paths = getToolPaths();
109
+ const dir = join(paths.skeinDir, SKEIN_SUBDIRS.profile);
110
+ const files = (await fs.readdir(dir).catch(() => [])).filter(f => f.endsWith('.yaml'));
111
+ if (files.length === 0) {
112
+ console.log(infoBox(`No profiles yet — run ${chalk.cyan('skein profile export --from claude-code')}`));
113
+ return;
114
+ }
115
+ console.log(box(files.map(f => `${chalk.cyan('▸')} ${f}`).join('\n'), 'Snapshots'));
116
+ });
117
+ profile
118
+ .command('adapters')
119
+ .description('list adapters with capability and homepage')
120
+ .action(() => {
121
+ const rows = ADAPTERS.map(a => [chalk.bold(a.name), chalk.dim(a.id), a.homepage ?? '']);
122
+ console.log(box(rows.map(r => `${r[0]}\n ${r[1]}${r[2] ? ` · ${chalk.dim(r[2])}` : ''}`).join('\n\n'), 'Adapters'));
123
+ });
124
+ profile
125
+ .command('diff')
126
+ .description('diff two profile snapshots by artifact ID')
127
+ .requiredOption('--a <file>')
128
+ .requiredOption('--b <file>')
129
+ .action(async (opts) => {
130
+ const [a, b] = await Promise.all([
131
+ fs.readFile(resolve(opts.a), 'utf8').then(Profile.fromYaml),
132
+ fs.readFile(resolve(opts.b), 'utf8').then(Profile.fromYaml),
133
+ ]);
134
+ const diff = a.diff(b);
135
+ console.log(box(kvTable([
136
+ { label: 'a', value: `${a.sourceTool} ${chalk.dim(`(${a.itemCount} items)`)}` },
137
+ { label: 'b', value: `${b.sourceTool} ${chalk.dim(`(${b.itemCount} items)`)}` },
138
+ { label: '─────────', value: '' },
139
+ { label: 'Added', value: chalk.green(`+${sumDiff(diff.added)}`) },
140
+ { label: 'Removed', value: chalk.red(`-${sumDiff(diff.removed)}`) },
141
+ { label: 'Unchanged', value: chalk.dim(String(sumDiff(diff.unchanged))) },
142
+ ]), 'Profile diff'));
143
+ });
144
+ }
145
+ function sumDiff(s) {
146
+ return s.rules + s.agents + s.commands + s.skills + s.mcpServers + s.hooks;
147
+ }
148
+ function dedupeWarnings(messages) {
149
+ const seen = new Map();
150
+ for (const m of messages) {
151
+ const normalized = m.replace(/"[^"]+"/g, '"…"');
152
+ seen.set(normalized, (seen.get(normalized) ?? 0) + 1);
153
+ }
154
+ return [...seen.entries()].map(([message, count]) => ({ message, count }));
155
+ }
156
+ function defaultProfileIn() {
157
+ const paths = getToolPaths();
158
+ return join(paths.skeinDir, SKEIN_SUBDIRS.profile, 'claude-code.yaml');
159
+ }
160
+ async function applyManifest(writer, profileObj, ctx) {
161
+ const manifest = profileObj.manifest;
162
+ let report = { written: [], skipped: [], warnings: [] };
163
+ if (manifest.identity && writer.writeIdentity)
164
+ report = mergeReports(report, await writer.writeIdentity(manifest.identity, ctx));
165
+ if (manifest.rules.length && writer.writeRules)
166
+ report = mergeReports(report, await writer.writeRules(manifest.rules, ctx));
167
+ if (manifest.agents.length && writer.writeAgents)
168
+ report = mergeReports(report, await writer.writeAgents(manifest.agents, ctx));
169
+ if (manifest.commands.length && writer.writeCommands)
170
+ report = mergeReports(report, await writer.writeCommands(manifest.commands, ctx));
171
+ if (manifest.skills.length && writer.writeSkills)
172
+ report = mergeReports(report, await writer.writeSkills(manifest.skills, ctx));
173
+ if (manifest.mcpServers.length && writer.writeMcpServers)
174
+ report = mergeReports(report, await writer.writeMcpServers(manifest.mcpServers, ctx));
175
+ if (manifest.hooks.length && writer.writeHooks)
176
+ report = mergeReports(report, await writer.writeHooks(manifest.hooks, ctx));
177
+ if (manifest.permissions && writer.writePermissions)
178
+ report = mergeReports(report, await writer.writePermissions(manifest.permissions, ctx));
179
+ if (manifest.models && writer.writeModels)
180
+ report = mergeReports(report, await writer.writeModels(manifest.models, ctx));
181
+ return report;
182
+ }
183
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerRedact(program: Command): void;
@@ -0,0 +1,73 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import { redact, lastNerError } from '../redactor/index.js';
5
+ import { log } from '../util/log.js';
6
+ import { box, infoBox, kvTable, withSpinner } from '../ui/index.js';
7
+ export function registerRedact(program) {
8
+ program
9
+ .command('redact')
10
+ .description('redact secrets and PII from a file or stdin')
11
+ .argument('[file]', 'input file (omit to read from stdin)')
12
+ .option('--ml', 'enable optional ML PII detection via Transformers.js', false)
13
+ .option('--no-entropy', 'disable Shannon-entropy detector')
14
+ .option('--no-pii', 'disable PII regex detector')
15
+ .option('--no-secrets', 'disable secret regex detector (dangerous)')
16
+ .option('--json', 'emit structured JSON report instead of redacted text', false)
17
+ .option('-o, --out <file>', 'write redacted output to a file')
18
+ .action(async (file, opts) => {
19
+ const input = file ? await fs.readFile(resolve(file), 'utf8') : await readStdin();
20
+ const result = await withSpinner('Redacting', async () => redact(input, {
21
+ ml: Boolean(opts.ml),
22
+ tiers: {
23
+ secrets: opts.secrets !== false,
24
+ entropy: opts.entropy !== false,
25
+ 'pii-regex': opts.pii !== false,
26
+ },
27
+ }));
28
+ if (opts.out) {
29
+ await fs.writeFile(resolve(opts.out), result.text, 'utf8');
30
+ log.ok(`Wrote ${resolve(opts.out)}`);
31
+ }
32
+ else if (opts.json) {
33
+ console.log(JSON.stringify(result, null, 2));
34
+ return;
35
+ }
36
+ else {
37
+ process.stdout.write(result.text);
38
+ if (!result.text.endsWith('\n'))
39
+ process.stdout.write('\n');
40
+ }
41
+ const groups = groupByTier(result.hits);
42
+ if (result.hits.length === 0) {
43
+ console.log(infoBox(chalk.dim('No secrets or PII detected.')));
44
+ return;
45
+ }
46
+ console.log(box(kvTable([
47
+ { label: 'Total hits', value: chalk.green(String(result.hits.length)) },
48
+ ...[...groups.entries()].map(([tier, count]) => ({
49
+ label: ` ${tier}`,
50
+ value: chalk.dim(String(count)),
51
+ })),
52
+ ]), 'Redaction summary'));
53
+ if (opts.ml && lastNerError()) {
54
+ console.log('');
55
+ console.log(infoBox(`ML PII tier unavailable: ${chalk.dim(lastNerError() ?? '')}\n` +
56
+ chalk.dim('Install @huggingface/transformers in your project to enable it.'), 'ML tier'));
57
+ }
58
+ });
59
+ }
60
+ async function readStdin() {
61
+ const chunks = [];
62
+ for await (const chunk of process.stdin) {
63
+ chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
64
+ }
65
+ return Buffer.concat(chunks).toString('utf8');
66
+ }
67
+ function groupByTier(hits) {
68
+ const out = new Map();
69
+ for (const hit of hits)
70
+ out.set(hit.tier, (out.get(hit.tier) ?? 0) + 1);
71
+ return out;
72
+ }
73
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/commands/redact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTrace(program: Command): void;
@@ -0,0 +1,181 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import { TRACE_COLUMNS } from '../schema/trace.js';
5
+ import { hasConsent, readConsent, recordConsent } from '../trace/consent.js';
6
+ import { buildTraceRows, pushTraces, TRACE_REPO } from '../trace/push.js';
7
+ import { resolveTraceFormat, serializeJsonl, serializeTraces, TRACE_FORMATS, } from '../trace/serialize.js';
8
+ import { box, infoBox, kvTable, withSpinner } from '../ui/index.js';
9
+ import { ensureDir } from '../util/fs.js';
10
+ import { log } from '../util/log.js';
11
+ import { getToolPaths } from '../util/paths.js';
12
+ function nowIso() {
13
+ return new Date().toISOString();
14
+ }
15
+ /** Default for `--ml-pii`, so the ML tier is also env-configurable. */
16
+ function envMlPii() {
17
+ const v = (process.env['SKEIN_TRACE_ML_PII'] ?? '').toLowerCase();
18
+ return v === '1' || v === 'true' || v === 'yes' || v === 'on';
19
+ }
20
+ /** One-line status describing the ML PII tier outcome for a build/push. */
21
+ function mlPiiStatus(s) {
22
+ if (!s.requested)
23
+ return chalk.dim('regex tiers only (--ml-pii to add ML)');
24
+ return s.available
25
+ ? chalk.green('ML tier applied')
26
+ : chalk.yellow('requested but UNAVAILABLE — model not loaded');
27
+ }
28
+ export function registerTrace(program) {
29
+ const trace = program
30
+ .command('trace')
31
+ .description('build and publish conversation traces (content redacted before push)');
32
+ trace
33
+ .command('build')
34
+ .description('extract redacted-content trace rows from captured conversations')
35
+ .option('--ml-pii', 'also run the ML PII tier (names/addresses); env: SKEIN_TRACE_ML_PII', envMlPii())
36
+ .action(async (opts) => {
37
+ const result = await withSpinner('Building trace rows', async () => buildTraceRows({ builtAt: nowIso(), mlPii: Boolean(opts.mlPii) }));
38
+ const dir = join(getToolPaths().skeinDir, 'trace');
39
+ await ensureDir(dir);
40
+ const outPath = join(dir, 'rows.jsonl');
41
+ await fs.writeFile(outPath, serializeJsonl(result.rows), 'utf8');
42
+ console.log(box(kvTable([
43
+ { label: 'Sessions', value: String(result.sessions) },
44
+ { label: 'Trace rows', value: chalk.green(String(result.rows.length)) },
45
+ { label: 'Columns', value: String(TRACE_COLUMNS.length) },
46
+ { label: 'ML PII', value: mlPiiStatus(result.mlPii) },
47
+ { label: 'Output', value: chalk.dim(outPath) },
48
+ ]), 'Trace build'));
49
+ if (result.mlPii.requested && !result.mlPii.available) {
50
+ log.warn('ML PII tier requested but unavailable — rows use regex redaction only. ' +
51
+ 'Install `@huggingface/transformers` (and allow the model to download) to enable it.');
52
+ }
53
+ });
54
+ trace
55
+ .command('export')
56
+ .description('export redacted trace rows as jsonl | json | csv (preview when no --out)')
57
+ .option('--dry-run', 'print to stdout instead of writing a file', false)
58
+ .option('-o, --out <file>', 'write rows to a file (format inferred from extension)')
59
+ .option('-f, --format <fmt>', `output format: ${TRACE_FORMATS.join(' | ')}`)
60
+ .option('--ml-pii', 'also run the ML PII tier (names/addresses); env: SKEIN_TRACE_ML_PII', envMlPii())
61
+ .action(async (opts) => {
62
+ let format;
63
+ try {
64
+ format = resolveTraceFormat(opts.format, opts.out);
65
+ }
66
+ catch (err) {
67
+ log.error(err instanceof Error ? err.message : String(err));
68
+ process.exit(1);
69
+ }
70
+ const result = await buildTraceRows({ builtAt: nowIso(), mlPii: Boolean(opts.mlPii) });
71
+ if (result.mlPii.requested && !result.mlPii.available) {
72
+ log.warn('ML PII tier requested but unavailable — output uses regex redaction only.');
73
+ }
74
+ if (opts.out && !opts.dryRun) {
75
+ await fs.writeFile(resolve(opts.out), serializeTraces(result.rows, format), 'utf8');
76
+ log.ok(`Wrote ${resolve(opts.out)} (${result.rows.length} rows, ${format})`);
77
+ return;
78
+ }
79
+ // Preview: render up to the first 5 rows in the chosen format.
80
+ const PREVIEW_LIMIT = 5;
81
+ const previewRows = result.rows.slice(0, PREVIEW_LIMIT);
82
+ const body = result.rows.length
83
+ ? chalk.dim(serializeTraces(previewRows, format).toString('utf8').trimEnd())
84
+ : chalk.dim('No rows yet — capture conversations first.');
85
+ const truncated = result.rows.length > PREVIEW_LIMIT
86
+ ? chalk.dim(`\n… ${result.rows.length - PREVIEW_LIMIT} more row(s) not shown`)
87
+ : '';
88
+ console.log(box([
89
+ `${chalk.bold('Format:')} ${format} ${chalk.bold('Columns:')} ${TRACE_COLUMNS.length}`,
90
+ '',
91
+ body + truncated,
92
+ ].join('\n'), `Trace export (${opts.dryRun ? 'dry-run · ' : ''}${result.rows.length} rows)`));
93
+ });
94
+ trace
95
+ .command('consent')
96
+ .description('record opt-in consent to publish your (redacted) conversation traces')
97
+ .option('--handle <handle>', 'optional pseudonymous contributor handle')
98
+ .option('--accept', 'record acceptance of the trace publishing terms', false)
99
+ .action(async (opts) => {
100
+ if (!opts.accept) {
101
+ const existing = await readConsent();
102
+ console.log(box([
103
+ existing
104
+ ? chalk.green(`Consent on file (accepted ${existing.acceptedAt}).`)
105
+ : chalk.yellow('No consent recorded yet.'),
106
+ '',
107
+ 'By accepting, you confirm these traces are derived from your own captured',
108
+ 'sessions and may be published under ODC-BY. They include your prompts,',
109
+ 'outputs, and tool I/O, redacted for secrets/PII (best-effort, not',
110
+ 'anonymization). You can request deletion later using your local key map',
111
+ '(~/.skein/trace/keymap.jsonl).',
112
+ '',
113
+ `Run ${chalk.cyan('skein trace consent --accept')} to record consent.`,
114
+ ].join('\n'), 'Trace consent'));
115
+ return;
116
+ }
117
+ const consent = await recordConsent({
118
+ acceptedAt: nowIso(),
119
+ ...(opts.handle ? { handle: opts.handle } : {}),
120
+ });
121
+ console.log(box(kvTable([
122
+ { label: 'Accepted at', value: chalk.green(consent.acceptedAt) },
123
+ { label: 'Terms version', value: consent.termsVersion },
124
+ ...(consent.handle ? [{ label: 'Handle', value: consent.handle }] : []),
125
+ ]), 'Consent recorded'));
126
+ });
127
+ trace
128
+ .command('push')
129
+ .description(`push redacted-content traces to ${TRACE_REPO}`)
130
+ .option('--dry-run', 'plan only; touch nothing', false)
131
+ .option('--yes', 'confirm a real push (required without --dry-run)', false)
132
+ .option('--only-new', 'skip sessions already pushed to the trace repo', false)
133
+ .option('--ml-pii', 'also run the ML PII tier; a real push FAILS CLOSED if it is unavailable; env: SKEIN_TRACE_ML_PII', envMlPii())
134
+ .action(async (opts) => {
135
+ const consented = await hasConsent();
136
+ if (!opts.dryRun) {
137
+ if (!consented) {
138
+ log.error('No consent on file. Run `skein trace consent --accept` first.');
139
+ process.exit(1);
140
+ }
141
+ if (!opts.yes) {
142
+ log.error('Refusing to push without --yes.');
143
+ process.exit(1);
144
+ }
145
+ }
146
+ let plan;
147
+ try {
148
+ plan = await withSpinner(opts.dryRun ? 'Planning trace push' : 'Pushing traces', async () => pushTraces({
149
+ builtAt: nowIso(),
150
+ dryRun: Boolean(opts.dryRun),
151
+ confirm: Boolean(opts.yes),
152
+ skipAlreadyPushed: Boolean(opts.onlyNew),
153
+ mlPii: Boolean(opts.mlPii),
154
+ }));
155
+ }
156
+ catch (err) {
157
+ log.error(err instanceof Error ? err.message : String(err));
158
+ process.exit(1);
159
+ }
160
+ console.log(box(kvTable([
161
+ { label: 'Repo', value: chalk.cyan(plan.repo) },
162
+ { label: 'Dataset path', value: chalk.dim(plan.datasetPath) },
163
+ { label: 'Format', value: chalk.dim('JSONL (Hub auto-generates Parquet view)') },
164
+ { label: 'Sessions', value: String(plan.sessions) },
165
+ { label: 'Trace rows', value: chalk.green(String(plan.rows)) },
166
+ { label: 'Skipped (already pushed)', value: String(plan.skippedSessions) },
167
+ { label: 'ML PII', value: mlPiiStatus(plan.mlPii) },
168
+ { label: 'Bytes', value: String(plan.bytes) },
169
+ ]), opts.dryRun ? 'Trace push (dry-run)' : 'Trace push'));
170
+ console.log('');
171
+ console.log(box(chalk.dim(plan.columns.join(', ')), 'Allowlisted columns'));
172
+ if (opts.dryRun && plan.mlPii.requested && !plan.mlPii.available) {
173
+ log.warn('ML PII tier requested but unavailable — a real push would FAIL CLOSED.');
174
+ }
175
+ if (opts.dryRun) {
176
+ console.log('');
177
+ console.log(infoBox(`Dry-run only — nothing sent. ${consented ? '' : 'No consent on file (run `skein trace consent --accept`). '}A real push also needs --yes.`));
178
+ }
179
+ });
180
+ }
181
+ //# sourceMappingURL=trace.js.map