@namzu/cli 29.0.1 → 29.1.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 (384) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +20 -0
  3. package/dist/browser/commands.d.ts +29 -0
  4. package/dist/browser/commands.d.ts.map +1 -0
  5. package/dist/browser/commands.js +361 -0
  6. package/dist/browser/commands.js.map +1 -0
  7. package/dist/browser/control.d.ts +79 -0
  8. package/dist/browser/control.d.ts.map +1 -0
  9. package/dist/browser/control.js +140 -0
  10. package/dist/browser/control.js.map +1 -0
  11. package/dist/browser/describe.d.ts +12 -0
  12. package/dist/browser/describe.d.ts.map +1 -0
  13. package/dist/browser/describe.js +27 -0
  14. package/dist/browser/describe.js.map +1 -0
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +29 -2
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/acp.d.ts.map +1 -1
  19. package/dist/commands/acp.js +1 -0
  20. package/dist/commands/acp.js.map +1 -1
  21. package/dist/commands/browser.d.ts +7 -0
  22. package/dist/commands/browser.d.ts.map +1 -0
  23. package/dist/commands/browser.js +16 -0
  24. package/dist/commands/browser.js.map +1 -0
  25. package/dist/commands/drain.d.ts +2 -1
  26. package/dist/commands/drain.d.ts.map +1 -1
  27. package/dist/commands/drain.js +6 -3
  28. package/dist/commands/drain.js.map +1 -1
  29. package/dist/commands/exec-flags.d.ts +2 -1
  30. package/dist/commands/exec-flags.d.ts.map +1 -1
  31. package/dist/commands/exec-flags.js +6 -3
  32. package/dist/commands/exec-flags.js.map +1 -1
  33. package/dist/commands/exec-json.d.ts.map +1 -1
  34. package/dist/commands/exec-json.js +2 -1
  35. package/dist/commands/exec-json.js.map +1 -1
  36. package/dist/commands/exec.d.ts.map +1 -1
  37. package/dist/commands/exec.js +2 -1
  38. package/dist/commands/exec.js.map +1 -1
  39. package/dist/commands/host-queries.d.ts.map +1 -1
  40. package/dist/commands/host-queries.js +10 -3
  41. package/dist/commands/host-queries.js.map +1 -1
  42. package/dist/commands/schedule.d.ts +9 -0
  43. package/dist/commands/schedule.d.ts.map +1 -0
  44. package/dist/commands/schedule.js +126 -0
  45. package/dist/commands/schedule.js.map +1 -0
  46. package/dist/commands/serve.d.ts +3 -1
  47. package/dist/commands/serve.d.ts.map +1 -1
  48. package/dist/commands/serve.js +5 -3
  49. package/dist/commands/serve.js.map +1 -1
  50. package/dist/commands/skills.d.ts +10 -0
  51. package/dist/commands/skills.d.ts.map +1 -1
  52. package/dist/commands/skills.js +23 -7
  53. package/dist/commands/skills.js.map +1 -1
  54. package/dist/commands/upgrade.d.ts +5 -0
  55. package/dist/commands/upgrade.d.ts.map +1 -1
  56. package/dist/commands/upgrade.js +11 -0
  57. package/dist/commands/upgrade.js.map +1 -1
  58. package/dist/config/load.d.ts +39 -0
  59. package/dist/config/load.d.ts.map +1 -1
  60. package/dist/config/load.js +232 -1
  61. package/dist/config/load.js.map +1 -1
  62. package/dist/config/schema.d.ts +78 -0
  63. package/dist/config/schema.d.ts.map +1 -1
  64. package/dist/config/schema.js.map +1 -1
  65. package/dist/config/user-config.d.ts +23 -0
  66. package/dist/config/user-config.d.ts.map +1 -0
  67. package/dist/config/user-config.js +48 -0
  68. package/dist/config/user-config.js.map +1 -0
  69. package/dist/context/capabilities.d.ts +1 -1
  70. package/dist/context/capabilities.d.ts.map +1 -1
  71. package/dist/context/capabilities.js +1 -0
  72. package/dist/context/capabilities.js.map +1 -1
  73. package/dist/doctor/checks/browser.d.ts +15 -0
  74. package/dist/doctor/checks/browser.d.ts.map +1 -0
  75. package/dist/doctor/checks/browser.js +63 -0
  76. package/dist/doctor/checks/browser.js.map +1 -0
  77. package/dist/doctor/checks/index.d.ts +4 -1
  78. package/dist/doctor/checks/index.d.ts.map +1 -1
  79. package/dist/doctor/checks/index.js +8 -1
  80. package/dist/doctor/checks/index.js.map +1 -1
  81. package/dist/doctor/checks/scheduler.d.ts +10 -0
  82. package/dist/doctor/checks/scheduler.d.ts.map +1 -0
  83. package/dist/doctor/checks/scheduler.js +74 -0
  84. package/dist/doctor/checks/scheduler.js.map +1 -0
  85. package/dist/index.d.ts +1 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +1 -1
  88. package/dist/index.js.map +1 -1
  89. package/dist/integrations/notifications/desktop/freedesktop.d.ts +10 -0
  90. package/dist/integrations/notifications/desktop/freedesktop.d.ts.map +1 -0
  91. package/dist/integrations/notifications/desktop/freedesktop.js +33 -0
  92. package/dist/integrations/notifications/desktop/freedesktop.js.map +1 -0
  93. package/dist/integrations/notifications/desktop/macos.d.ts +6 -0
  94. package/dist/integrations/notifications/desktop/macos.d.ts.map +1 -0
  95. package/dist/integrations/notifications/desktop/macos.js +17 -0
  96. package/dist/integrations/notifications/desktop/macos.js.map +1 -0
  97. package/dist/integrations/notifications/desktop/sanitize.d.ts +16 -0
  98. package/dist/integrations/notifications/desktop/sanitize.d.ts.map +1 -0
  99. package/dist/integrations/notifications/desktop/sanitize.js +49 -0
  100. package/dist/integrations/notifications/desktop/sanitize.js.map +1 -0
  101. package/dist/integrations/notifications/desktop/throttle.d.ts +10 -0
  102. package/dist/integrations/notifications/desktop/throttle.d.ts.map +1 -0
  103. package/dist/integrations/notifications/desktop/throttle.js +39 -0
  104. package/dist/integrations/notifications/desktop/throttle.js.map +1 -0
  105. package/dist/integrations/notifications/desktop/windows-toast.d.ts +23 -0
  106. package/dist/integrations/notifications/desktop/windows-toast.d.ts.map +1 -0
  107. package/dist/integrations/notifications/desktop/windows-toast.js +56 -0
  108. package/dist/integrations/notifications/desktop/windows-toast.js.map +1 -0
  109. package/dist/integrations/notifications/desktop.d.ts +82 -0
  110. package/dist/integrations/notifications/desktop.d.ts.map +1 -0
  111. package/dist/integrations/notifications/desktop.js +198 -0
  112. package/dist/integrations/notifications/desktop.js.map +1 -0
  113. package/dist/integrations/resident/session-step.d.ts.map +1 -1
  114. package/dist/integrations/resident/session-step.js +1 -0
  115. package/dist/integrations/resident/session-step.js.map +1 -1
  116. package/dist/integrations/subagents/runtime.d.ts +6 -0
  117. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  118. package/dist/integrations/subagents/runtime.js +14 -5
  119. package/dist/integrations/subagents/runtime.js.map +1 -1
  120. package/dist/permissions/browser-sites.d.ts +95 -0
  121. package/dist/permissions/browser-sites.d.ts.map +1 -0
  122. package/dist/permissions/browser-sites.js +270 -0
  123. package/dist/permissions/browser-sites.js.map +1 -0
  124. package/dist/schedule/build.d.ts +79 -0
  125. package/dist/schedule/build.d.ts.map +1 -0
  126. package/dist/schedule/build.js +246 -0
  127. package/dist/schedule/build.js.map +1 -0
  128. package/dist/schedule/changes.d.ts +22 -0
  129. package/dist/schedule/changes.d.ts.map +1 -0
  130. package/dist/schedule/changes.js +55 -0
  131. package/dist/schedule/changes.js.map +1 -0
  132. package/dist/schedule/commands/add.d.ts +24 -0
  133. package/dist/schedule/commands/add.d.ts.map +1 -0
  134. package/dist/schedule/commands/add.js +459 -0
  135. package/dist/schedule/commands/add.js.map +1 -0
  136. package/dist/schedule/commands/args.d.ts +22 -0
  137. package/dist/schedule/commands/args.d.ts.map +1 -0
  138. package/dist/schedule/commands/args.js +80 -0
  139. package/dist/schedule/commands/args.js.map +1 -0
  140. package/dist/schedule/commands/confirm-prompt.d.ts +6 -0
  141. package/dist/schedule/commands/confirm-prompt.d.ts.map +1 -0
  142. package/dist/schedule/commands/confirm-prompt.js +21 -0
  143. package/dist/schedule/commands/confirm-prompt.js.map +1 -0
  144. package/dist/schedule/commands/lifecycle.d.ts +39 -0
  145. package/dist/schedule/commands/lifecycle.d.ts.map +1 -0
  146. package/dist/schedule/commands/lifecycle.js +585 -0
  147. package/dist/schedule/commands/lifecycle.js.map +1 -0
  148. package/dist/schedule/commands/list.d.ts +33 -0
  149. package/dist/schedule/commands/list.d.ts.map +1 -0
  150. package/dist/schedule/commands/list.js +202 -0
  151. package/dist/schedule/commands/list.js.map +1 -0
  152. package/dist/schedule/commands/logs.d.ts +7 -0
  153. package/dist/schedule/commands/logs.d.ts.map +1 -0
  154. package/dist/schedule/commands/logs.js +106 -0
  155. package/dist/schedule/commands/logs.js.map +1 -0
  156. package/dist/schedule/commands/service.d.ts +16 -0
  157. package/dist/schedule/commands/service.d.ts.map +1 -0
  158. package/dist/schedule/commands/service.js +458 -0
  159. package/dist/schedule/commands/service.js.map +1 -0
  160. package/dist/schedule/daemon/daemon.d.ts +156 -0
  161. package/dist/schedule/daemon/daemon.d.ts.map +1 -0
  162. package/dist/schedule/daemon/daemon.js +1248 -0
  163. package/dist/schedule/daemon/daemon.js.map +1 -0
  164. package/dist/schedule/daemon/endpoint.d.ts +38 -0
  165. package/dist/schedule/daemon/endpoint.d.ts.map +1 -0
  166. package/dist/schedule/daemon/endpoint.js +158 -0
  167. package/dist/schedule/daemon/endpoint.js.map +1 -0
  168. package/dist/schedule/daemon/exit.d.ts +8 -0
  169. package/dist/schedule/daemon/exit.d.ts.map +1 -0
  170. package/dist/schedule/daemon/exit.js +8 -0
  171. package/dist/schedule/daemon/exit.js.map +1 -0
  172. package/dist/schedule/daemon/log.d.ts +12 -0
  173. package/dist/schedule/daemon/log.d.ts.map +1 -0
  174. package/dist/schedule/daemon/log.js +53 -0
  175. package/dist/schedule/daemon/log.js.map +1 -0
  176. package/dist/schedule/daemon/notify.d.ts +31 -0
  177. package/dist/schedule/daemon/notify.d.ts.map +1 -0
  178. package/dist/schedule/daemon/notify.js +89 -0
  179. package/dist/schedule/daemon/notify.js.map +1 -0
  180. package/dist/schedule/daemon/retention.d.ts +16 -0
  181. package/dist/schedule/daemon/retention.d.ts.map +1 -0
  182. package/dist/schedule/daemon/retention.js +46 -0
  183. package/dist/schedule/daemon/retention.js.map +1 -0
  184. package/dist/schedule/daemon/sessions.d.ts +23 -0
  185. package/dist/schedule/daemon/sessions.d.ts.map +1 -0
  186. package/dist/schedule/daemon/sessions.js +52 -0
  187. package/dist/schedule/daemon/sessions.js.map +1 -0
  188. package/dist/schedule/env.d.ts +28 -0
  189. package/dist/schedule/env.d.ts.map +1 -0
  190. package/dist/schedule/env.js +99 -0
  191. package/dist/schedule/env.js.map +1 -0
  192. package/dist/schedule/fire/browser-preflight.d.ts +41 -0
  193. package/dist/schedule/fire/browser-preflight.d.ts.map +1 -0
  194. package/dist/schedule/fire/browser-preflight.js +73 -0
  195. package/dist/schedule/fire/browser-preflight.js.map +1 -0
  196. package/dist/schedule/fire/fire.d.ts +78 -0
  197. package/dist/schedule/fire/fire.d.ts.map +1 -0
  198. package/dist/schedule/fire/fire.js +482 -0
  199. package/dist/schedule/fire/fire.js.map +1 -0
  200. package/dist/schedule/fire/result.d.ts +13 -0
  201. package/dist/schedule/fire/result.d.ts.map +1 -0
  202. package/dist/schedule/fire/result.js +18 -0
  203. package/dist/schedule/fire/result.js.map +1 -0
  204. package/dist/schedule/fire/unattended-note.d.ts +22 -0
  205. package/dist/schedule/fire/unattended-note.d.ts.map +1 -0
  206. package/dist/schedule/fire/unattended-note.js +46 -0
  207. package/dist/schedule/fire/unattended-note.js.map +1 -0
  208. package/dist/schedule/floor.d.ts +116 -0
  209. package/dist/schedule/floor.d.ts.map +1 -0
  210. package/dist/schedule/floor.js +1051 -0
  211. package/dist/schedule/floor.js.map +1 -0
  212. package/dist/schedule/folder.d.ts +34 -0
  213. package/dist/schedule/folder.d.ts.map +1 -0
  214. package/dist/schedule/folder.js +84 -0
  215. package/dist/schedule/folder.js.map +1 -0
  216. package/dist/schedule/paths.d.ts +49 -0
  217. package/dist/schedule/paths.d.ts.map +1 -0
  218. package/dist/schedule/paths.js +53 -0
  219. package/dist/schedule/paths.js.map +1 -0
  220. package/dist/schedule/policy.d.ts +141 -0
  221. package/dist/schedule/policy.d.ts.map +1 -0
  222. package/dist/schedule/policy.js +378 -0
  223. package/dist/schedule/policy.js.map +1 -0
  224. package/dist/schedule/resume-command.d.ts +36 -0
  225. package/dist/schedule/resume-command.d.ts.map +1 -0
  226. package/dist/schedule/resume-command.js +72 -0
  227. package/dist/schedule/resume-command.js.map +1 -0
  228. package/dist/schedule/service/detect.d.ts +22 -0
  229. package/dist/schedule/service/detect.d.ts.map +1 -0
  230. package/dist/schedule/service/detect.js +29 -0
  231. package/dist/schedule/service/detect.js.map +1 -0
  232. package/dist/schedule/service/index.d.ts +48 -0
  233. package/dist/schedule/service/index.d.ts.map +1 -0
  234. package/dist/schedule/service/index.js +352 -0
  235. package/dist/schedule/service/index.js.map +1 -0
  236. package/dist/schedule/service/launchd.d.ts +24 -0
  237. package/dist/schedule/service/launchd.d.ts.map +1 -0
  238. package/dist/schedule/service/launchd.js +84 -0
  239. package/dist/schedule/service/launchd.js.map +1 -0
  240. package/dist/schedule/service/manifest.d.ts +44 -0
  241. package/dist/schedule/service/manifest.d.ts.map +1 -0
  242. package/dist/schedule/service/manifest.js +16 -0
  243. package/dist/schedule/service/manifest.js.map +1 -0
  244. package/dist/schedule/service/names.d.ts +9 -0
  245. package/dist/schedule/service/names.d.ts.map +1 -0
  246. package/dist/schedule/service/names.js +22 -0
  247. package/dist/schedule/service/names.js.map +1 -0
  248. package/dist/schedule/service/quote.d.ts +24 -0
  249. package/dist/schedule/service/quote.d.ts.map +1 -0
  250. package/dist/schedule/service/quote.js +64 -0
  251. package/dist/schedule/service/quote.js.map +1 -0
  252. package/dist/schedule/service/runner.d.ts +17 -0
  253. package/dist/schedule/service/runner.d.ts.map +1 -0
  254. package/dist/schedule/service/runner.js +31 -0
  255. package/dist/schedule/service/runner.js.map +1 -0
  256. package/dist/schedule/service/systemd.d.ts +37 -0
  257. package/dist/schedule/service/systemd.d.ts.map +1 -0
  258. package/dist/schedule/service/systemd.js +96 -0
  259. package/dist/schedule/service/systemd.js.map +1 -0
  260. package/dist/schedule/service/windows-task.d.ts +51 -0
  261. package/dist/schedule/service/windows-task.d.ts.map +1 -0
  262. package/dist/schedule/service/windows-task.js +134 -0
  263. package/dist/schedule/service/windows-task.js.map +1 -0
  264. package/dist/schedule/service/wsl.d.ts +57 -0
  265. package/dist/schedule/service/wsl.d.ts.map +1 -0
  266. package/dist/schedule/service/wsl.js +111 -0
  267. package/dist/schedule/service/wsl.js.map +1 -0
  268. package/dist/schedule/store/atomic.d.ts +43 -0
  269. package/dist/schedule/store/atomic.d.ts.map +1 -0
  270. package/dist/schedule/store/atomic.js +135 -0
  271. package/dist/schedule/store/atomic.js.map +1 -0
  272. package/dist/schedule/store/claims.d.ts +26 -0
  273. package/dist/schedule/store/claims.d.ts.map +1 -0
  274. package/dist/schedule/store/claims.js +57 -0
  275. package/dist/schedule/store/claims.js.map +1 -0
  276. package/dist/schedule/store/digest.d.ts +18 -0
  277. package/dist/schedule/store/digest.d.ts.map +1 -0
  278. package/dist/schedule/store/digest.js +139 -0
  279. package/dist/schedule/store/digest.js.map +1 -0
  280. package/dist/schedule/store/history.d.ts +21 -0
  281. package/dist/schedule/store/history.d.ts.map +1 -0
  282. package/dist/schedule/store/history.js +114 -0
  283. package/dist/schedule/store/history.js.map +1 -0
  284. package/dist/schedule/store/jobs.d.ts +61 -0
  285. package/dist/schedule/store/jobs.d.ts.map +1 -0
  286. package/dist/schedule/store/jobs.js +210 -0
  287. package/dist/schedule/store/jobs.js.map +1 -0
  288. package/dist/schedule/store/state.d.ts +19 -0
  289. package/dist/schedule/store/state.d.ts.map +1 -0
  290. package/dist/schedule/store/state.js +38 -0
  291. package/dist/schedule/store/state.js.map +1 -0
  292. package/dist/schedule/types.d.ts +256 -0
  293. package/dist/schedule/types.d.ts.map +1 -0
  294. package/dist/schedule/types.js +9 -0
  295. package/dist/schedule/types.js.map +1 -0
  296. package/dist/skills/catalog.d.ts +96 -0
  297. package/dist/skills/catalog.d.ts.map +1 -0
  298. package/dist/skills/catalog.js +226 -0
  299. package/dist/skills/catalog.js.map +1 -0
  300. package/dist/skills/save.d.ts +148 -0
  301. package/dist/skills/save.d.ts.map +1 -0
  302. package/dist/skills/save.js +344 -0
  303. package/dist/skills/save.js.map +1 -0
  304. package/dist/skills/store.d.ts +103 -16
  305. package/dist/skills/store.d.ts.map +1 -1
  306. package/dist/skills/store.js +227 -30
  307. package/dist/skills/store.js.map +1 -1
  308. package/dist/tui/App.d.ts.map +1 -1
  309. package/dist/tui/App.js +591 -72
  310. package/dist/tui/App.js.map +1 -1
  311. package/dist/tui/LiveActivity.d.ts +8 -1
  312. package/dist/tui/LiveActivity.d.ts.map +1 -1
  313. package/dist/tui/LiveActivity.js +20 -4
  314. package/dist/tui/LiveActivity.js.map +1 -1
  315. package/dist/tui/PermissionOverlay.d.ts +24 -4
  316. package/dist/tui/PermissionOverlay.d.ts.map +1 -1
  317. package/dist/tui/PermissionOverlay.js +113 -15
  318. package/dist/tui/PermissionOverlay.js.map +1 -1
  319. package/dist/tui/SaveSkillOverlay.d.ts +33 -0
  320. package/dist/tui/SaveSkillOverlay.d.ts.map +1 -0
  321. package/dist/tui/SaveSkillOverlay.js +118 -0
  322. package/dist/tui/SaveSkillOverlay.js.map +1 -0
  323. package/dist/tui/agent.d.ts +185 -5
  324. package/dist/tui/agent.d.ts.map +1 -1
  325. package/dist/tui/agent.js +325 -54
  326. package/dist/tui/agent.js.map +1 -1
  327. package/dist/tui/browser-notices.d.ts +33 -0
  328. package/dist/tui/browser-notices.d.ts.map +1 -0
  329. package/dist/tui/browser-notices.js +102 -0
  330. package/dist/tui/browser-notices.js.map +1 -0
  331. package/dist/tui/permission-review.d.ts.map +1 -1
  332. package/dist/tui/permission-review.js +53 -4
  333. package/dist/tui/permission-review.js.map +1 -1
  334. package/dist/tui/schedule/host-commands.d.ts +34 -0
  335. package/dist/tui/schedule/host-commands.d.ts.map +1 -0
  336. package/dist/tui/schedule/host-commands.js +309 -0
  337. package/dist/tui/schedule/host-commands.js.map +1 -0
  338. package/dist/tui/schedule/integration.d.ts +62 -0
  339. package/dist/tui/schedule/integration.d.ts.map +1 -0
  340. package/dist/tui/schedule/integration.js +145 -0
  341. package/dist/tui/schedule/integration.js.map +1 -0
  342. package/dist/tui/schedule/loop-host.d.ts +42 -0
  343. package/dist/tui/schedule/loop-host.d.ts.map +1 -0
  344. package/dist/tui/schedule/loop-host.js +153 -0
  345. package/dist/tui/schedule/loop-host.js.map +1 -0
  346. package/dist/tui/schedule/resume.d.ts +122 -0
  347. package/dist/tui/schedule/resume.d.ts.map +1 -0
  348. package/dist/tui/schedule/resume.js +324 -0
  349. package/dist/tui/schedule/resume.js.map +1 -0
  350. package/dist/tui/schedule/startup.d.ts +11 -0
  351. package/dist/tui/schedule/startup.d.ts.map +1 -0
  352. package/dist/tui/schedule/startup.js +121 -0
  353. package/dist/tui/schedule/startup.js.map +1 -0
  354. package/dist/tui/schedule/tool-host.d.ts +44 -0
  355. package/dist/tui/schedule/tool-host.d.ts.map +1 -0
  356. package/dist/tui/schedule/tool-host.js +294 -0
  357. package/dist/tui/schedule/tool-host.js.map +1 -0
  358. package/dist/tui/skills/learning.d.ts +74 -0
  359. package/dist/tui/skills/learning.d.ts.map +1 -0
  360. package/dist/tui/skills/learning.js +131 -0
  361. package/dist/tui/skills/learning.js.map +1 -0
  362. package/dist/tui/skills/suggest-setting.d.ts +22 -0
  363. package/dist/tui/skills/suggest-setting.d.ts.map +1 -0
  364. package/dist/tui/skills/suggest-setting.js +55 -0
  365. package/dist/tui/skills/suggest-setting.js.map +1 -0
  366. package/dist/tui/skills/suggestion-ledger.d.ts +35 -0
  367. package/dist/tui/skills/suggestion-ledger.d.ts.map +1 -0
  368. package/dist/tui/skills/suggestion-ledger.js +52 -0
  369. package/dist/tui/skills/suggestion-ledger.js.map +1 -0
  370. package/dist/tui/slashCommands.d.ts +20 -0
  371. package/dist/tui/slashCommands.d.ts.map +1 -1
  372. package/dist/tui/slashCommands.js +76 -2
  373. package/dist/tui/slashCommands.js.map +1 -1
  374. package/dist/tui/turn-interruption.d.ts +20 -1
  375. package/dist/tui/turn-interruption.d.ts.map +1 -1
  376. package/dist/tui/turn-interruption.js +43 -0
  377. package/dist/tui/turn-interruption.js.map +1 -1
  378. package/dist/tui/types.d.ts +9 -1
  379. package/dist/tui/types.d.ts.map +1 -1
  380. package/package.json +6 -4
  381. package/skills/README.md +15 -0
  382. package/skills/browser-automation/SKILL.md +84 -0
  383. package/skills/schedule-task/SKILL.md +140 -0
  384. package/skills/skill-creator/SKILL.md +101 -0
@@ -0,0 +1,148 @@
1
+ /**
2
+ * `save_skill`: the model proposes a `SKILL.md`, the operator decides.
3
+ *
4
+ * The tool exists only in the interactive TUI (the App hands it to its own
5
+ * session through `extraTools`; `exec`, `drain`, a scheduled run and every
6
+ * sub-agent build their registries without it). Nothing is written until a
7
+ * person picks a target on a screen drawn from what this module computes —
8
+ * the exact file, with invisible characters shown, where it would go, and
9
+ * which existing skill it would replace or be hidden by. That question is
10
+ * the host's own (`SaveSkillHost.confirm`), not the permission gate's, so no
11
+ * permission mode answers it: `auto` still asks.
12
+ *
13
+ * A saved skill is a single `SKILL.md`, written atomically (a temporary
14
+ * beside it, then `rename`). The session catalog discovers again every turn,
15
+ * so the model is offered it from the next turn on.
16
+ */
17
+ import { type ToolDefinition } from '@namzu/sdk';
18
+ import type { SkillsConfig } from '../config/schema.js';
19
+ export declare const SAVE_SKILL_TOOL_NAME = "save_skill";
20
+ /** The built-in skill that interviews the operator and drafts a skill. */
21
+ export declare const SKILL_CREATOR_SKILL = "skill-creator";
22
+ /** What `/skills new [idea]` sends as the operator's prompt. */
23
+ export declare function newSkillPrompt(idea: string): string;
24
+ /**
25
+ * What `/skills save [name]` sends: one turn, in the conversation whose work
26
+ * it saves, that ends on the `save_skill` screen. The screen shows the whole
27
+ * file and saves nothing until the operator picks a place, so the model is
28
+ * told to go straight to it rather than ask in a reply first.
29
+ */
30
+ export declare function learnSkillPrompt(name?: string): string;
31
+ /** The kernel loader's own limits, checked here so the operator is never shown a file it would refuse. */
32
+ export declare const SKILL_NAME_MAX_CHARS = 64;
33
+ export declare const SKILL_DESCRIPTION_MAX_CHARS = 1024;
34
+ /** A skill body is instructions, not a document store. */
35
+ export declare const SKILL_BODY_MAX_BYTES: number;
36
+ export declare const SKILL_NAME_PATTERN: RegExp;
37
+ export type SkillSaveScope = 'user' | 'project';
38
+ export type SkillOrigin = 'created' | 'learned';
39
+ /** What the model proposed, after validation. */
40
+ export interface SkillDraft {
41
+ readonly name: string;
42
+ readonly description: string;
43
+ readonly body: string;
44
+ readonly origin: SkillOrigin;
45
+ }
46
+ /** Another `SKILL.md` of the same name, and what saving here does to it. */
47
+ export interface SkillCollision {
48
+ /**
49
+ * `replaces`: the new file takes its place — the same path (overwritten)
50
+ * or a lower tier (shadowed). `hidden-by`: a higher tier's file keeps
51
+ * winning, so the saved skill would not be the one used.
52
+ */
53
+ readonly effect: 'replaces' | 'hidden-by';
54
+ /** The existing file's tier in the operator's words (`built-in`, `~/.namzu/skills`, …). */
55
+ readonly where: string;
56
+ readonly path: string;
57
+ /** True when it is the very file this save would overwrite. */
58
+ readonly overwrite: boolean;
59
+ }
60
+ export interface SkillSaveTarget {
61
+ readonly scope: SkillSaveScope;
62
+ /** The `SKILL.md` this choice writes. */
63
+ readonly path: string;
64
+ /** The same path as the operator would type it (`~/…`, `./…`). */
65
+ readonly displayPath: string;
66
+ readonly collisions: readonly SkillCollision[];
67
+ }
68
+ /** Everything the confirmation shows. Computed by the host, never taken from the model's words. */
69
+ export interface SaveSkillRequest {
70
+ readonly draft: SkillDraft;
71
+ /** The file exactly as it would be written. */
72
+ readonly markdown: string;
73
+ /** `markdown` with invisible and control characters shown as `<U+XXXX>`. */
74
+ readonly revealed: string;
75
+ readonly targets: {
76
+ readonly user: SkillSaveTarget;
77
+ readonly project: SkillSaveTarget;
78
+ };
79
+ /** Where the model suggested it go; the screen marks it, nothing preselects it. */
80
+ readonly suggested: SkillSaveScope;
81
+ /** The conversation it came from, when there is one. */
82
+ readonly sessionId?: string;
83
+ /** Hidden characters, instructions to ignore instructions, secrets, exfiltration. */
84
+ readonly warnings: readonly string[];
85
+ }
86
+ export type SaveSkillAnswer = SkillSaveScope | 'cancel';
87
+ export interface SaveSkillHost {
88
+ /** The session's working directory: the project tier is `<cwd>/.namzu/skills`. */
89
+ readonly cwd: () => string;
90
+ /** The operator's home directory. Absent: `NAMZU_HOME` and the OS home, as discovery reads them. */
91
+ readonly home?: () => string | undefined;
92
+ readonly config?: () => SkillsConfig | undefined;
93
+ readonly sessionId: () => string | undefined;
94
+ /**
95
+ * Ask the person. Anything but `user` or `project` — `cancel`, a thrown
96
+ * error, an aborted turn — writes nothing.
97
+ */
98
+ readonly confirm: (request: SaveSkillRequest, signal?: AbortSignal) => Promise<SaveSkillAnswer>;
99
+ /** Told after a file was written. */
100
+ readonly saved?: (result: {
101
+ readonly name: string;
102
+ readonly path: string;
103
+ }) => void;
104
+ /** The clock, for `namzu-created`. */
105
+ readonly now?: () => Date;
106
+ }
107
+ export declare class SkillDraftError extends Error {
108
+ readonly name = "SkillDraftError";
109
+ }
110
+ /**
111
+ * Normalise and check what the model proposed. Throws {@link SkillDraftError}
112
+ * naming the first problem.
113
+ */
114
+ export declare function validateSkillDraft(input: {
115
+ readonly name: string;
116
+ readonly description: string;
117
+ readonly body: string;
118
+ readonly origin?: SkillOrigin;
119
+ }): SkillDraft;
120
+ /** The `SKILL.md` for a draft. Round-tripped through the reader before anyone sees it. */
121
+ export declare function composeSkillMarkdown(draft: SkillDraft, meta: {
122
+ readonly sessionId?: string;
123
+ readonly createdAt: Date;
124
+ }): string;
125
+ /** Where each choice writes, and what already holds that name. */
126
+ export declare function planSkillTargets(name: string, options: {
127
+ readonly cwd: string;
128
+ readonly home?: string;
129
+ readonly config?: SkillsConfig;
130
+ }): {
131
+ readonly user: SkillSaveTarget;
132
+ readonly project: SkillSaveTarget;
133
+ };
134
+ /** One line per collision, as the confirmation and the tool result say it. */
135
+ export declare function describeCollision(collision: SkillCollision, cwd: string): string;
136
+ /** The prompt tripwire, worded for a skill. */
137
+ export declare function skillWarnings(markdown: string): string[];
138
+ /**
139
+ * Write `text` to `path` so a reader sees the old file or the new one, never
140
+ * part of either: a temporary beside it, flushed, then renamed over it.
141
+ */
142
+ export declare function writeFileAtomically(path: string, text: string): void;
143
+ /**
144
+ * The `save_skill` tool over a {@link SaveSkillHost}. Register it only where a
145
+ * person is present to confirm — the interactive TUI's own session.
146
+ */
147
+ export declare function buildSaveSkillTool(host: SaveSkillHost): ToolDefinition;
148
+ //# sourceMappingURL=save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/skills/save.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,344 @@
1
+ /**
2
+ * `save_skill`: the model proposes a `SKILL.md`, the operator decides.
3
+ *
4
+ * The tool exists only in the interactive TUI (the App hands it to its own
5
+ * session through `extraTools`; `exec`, `drain`, a scheduled run and every
6
+ * sub-agent build their registries without it). Nothing is written until a
7
+ * person picks a target on a screen drawn from what this module computes —
8
+ * the exact file, with invisible characters shown, where it would go, and
9
+ * which existing skill it would replace or be hidden by. That question is
10
+ * the host's own (`SaveSkillHost.confirm`), not the permission gate's, so no
11
+ * permission mode answers it: `auto` still asks.
12
+ *
13
+ * A saved skill is a single `SKILL.md`, written atomically (a temporary
14
+ * beside it, then `rename`). The session catalog discovers again every turn,
15
+ * so the model is offered it from the next turn on.
16
+ */
17
+ import { randomBytes } from 'node:crypto';
18
+ import { closeSync, fsyncSync, mkdirSync, openSync, renameSync, rmSync, writeSync } from 'node:fs';
19
+ import { homedir } from 'node:os';
20
+ import { dirname, join, relative, sep } from 'node:path';
21
+ import { defineTool, mcpJsonSchemaToZod, revealHiddenCharacters, scanSchedulePrompt, } from '@namzu/sdk';
22
+ import { SKILL_TIERS, discoverSkillRoster, parseSkillMarkdown, projectSkillsDir, skillTierLabel, userSkillsDir, } from './store.js';
23
+ export const SAVE_SKILL_TOOL_NAME = 'save_skill';
24
+ /** The built-in skill that interviews the operator and drafts a skill. */
25
+ export const SKILL_CREATOR_SKILL = 'skill-creator';
26
+ /** What `/skills new [idea]` sends as the operator's prompt. */
27
+ export function newSkillPrompt(idea) {
28
+ const what = idea.trim();
29
+ return [
30
+ `Help me create a new skill. Load the ${SKILL_CREATOR_SKILL} skill with the skill tool and follow it: interview me, show me the draft, and save it with save_skill only after I agree. Write the skill in the language of my own messages, not in English by default (namzu writes this request in English; it does not count).`,
31
+ what ? `What the skill should do: ${what}` : 'Start by asking what the skill should do.',
32
+ ].join(' ');
33
+ }
34
+ /**
35
+ * What `/skills save [name]` sends: one turn, in the conversation whose work
36
+ * it saves, that ends on the `save_skill` screen. The screen shows the whole
37
+ * file and saves nothing until the operator picks a place, so the model is
38
+ * told to go straight to it rather than ask in a reply first.
39
+ */
40
+ export function learnSkillPrompt(name) {
41
+ return [
42
+ `Save what we just did in this conversation as a reusable skill. Load the ${SKILL_CREATOR_SKILL} skill with the skill tool and follow its "from this conversation" mode: generalise the task, replace this run's names, paths, values and dates with placeholders, leave out secrets and personal data, and never copy tool, file or page output into it.`,
43
+ name
44
+ ? `Name it ${name}.`
45
+ : 'Choose a short name for the kind of task, not for this instance of it.',
46
+ 'Write the description and instructions in the language of my own earlier messages in this conversation, not in English by default (namzu writes this request in English; it does not count). The name stays lowercase ASCII with dashes.',
47
+ 'The save_skill confirmation screen is my review of the draft: call save_skill with origin "learned" in this turn, without asking me in a reply first. If I cancel, ask what to change.',
48
+ ].join(' ');
49
+ }
50
+ /** The kernel loader's own limits, checked here so the operator is never shown a file it would refuse. */
51
+ export const SKILL_NAME_MAX_CHARS = 64;
52
+ export const SKILL_DESCRIPTION_MAX_CHARS = 1024;
53
+ /** A skill body is instructions, not a document store. */
54
+ export const SKILL_BODY_MAX_BYTES = 64 * 1024;
55
+ export const SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
56
+ export class SkillDraftError extends Error {
57
+ name = 'SkillDraftError';
58
+ }
59
+ /**
60
+ * Normalise and check what the model proposed. Throws {@link SkillDraftError}
61
+ * naming the first problem.
62
+ */
63
+ export function validateSkillDraft(input) {
64
+ const name = input.name.trim();
65
+ if (name.length === 0 || name.length > SKILL_NAME_MAX_CHARS || !SKILL_NAME_PATTERN.test(name)) {
66
+ throw new SkillDraftError(`name "${name}" must be 1–${SKILL_NAME_MAX_CHARS} lowercase letters, digits and single hyphens (like "release-notes").`);
67
+ }
68
+ // One line: the frontmatter holds a single-line value, and a description
69
+ // is read by the model as one sentence or two anyway.
70
+ const description = input.description.replace(/\s+/g, ' ').trim();
71
+ if (description.length === 0)
72
+ throw new SkillDraftError('description must not be empty.');
73
+ if (description.length > SKILL_DESCRIPTION_MAX_CHARS) {
74
+ throw new SkillDraftError(`description is ${description.length} characters; at most ${SKILL_DESCRIPTION_MAX_CHARS}.`);
75
+ }
76
+ const body = input.body.replace(/\r\n?/g, '\n').trim();
77
+ if (body.length === 0)
78
+ throw new SkillDraftError('body must not be empty.');
79
+ const bytes = Buffer.byteLength(body, 'utf8');
80
+ if (bytes > SKILL_BODY_MAX_BYTES) {
81
+ throw new SkillDraftError(`body is ${bytes} bytes; at most ${SKILL_BODY_MAX_BYTES}.`);
82
+ }
83
+ if (/^---[ \t]*$/m.test(body.split('\n', 1)[0] ?? '')) {
84
+ throw new SkillDraftError('body must be the instructions only; pass name and description as fields, not as frontmatter.');
85
+ }
86
+ return { name, description, body, origin: input.origin ?? 'created' };
87
+ }
88
+ /** The `SKILL.md` for a draft. Round-tripped through the reader before anyone sees it. */
89
+ export function composeSkillMarkdown(draft, meta) {
90
+ const lines = [
91
+ '---',
92
+ `name: ${draft.name}`,
93
+ `description: "${draft.description}"`,
94
+ 'metadata:',
95
+ ` namzu-origin: ${draft.origin}`,
96
+ ...(meta.sessionId ? [` namzu-session: "${meta.sessionId}"`] : []),
97
+ ` namzu-created: "${meta.createdAt.toISOString()}"`,
98
+ '---',
99
+ '',
100
+ draft.body,
101
+ '',
102
+ ];
103
+ const markdown = lines.join('\n');
104
+ let parsed;
105
+ try {
106
+ parsed = parseSkillMarkdown(markdown);
107
+ }
108
+ catch (error) {
109
+ throw new SkillDraftError(`the file would not load: ${error instanceof Error ? error.message : String(error)}`);
110
+ }
111
+ if (parsed.name !== draft.name || parsed.description !== draft.description) {
112
+ throw new SkillDraftError('the description would read back differently from what was written; drop leading or trailing quotes and brackets.');
113
+ }
114
+ return markdown;
115
+ }
116
+ function displayPath(path, cwd) {
117
+ const rel = relative(cwd, path);
118
+ if (rel && !rel.startsWith('..') && !rel.startsWith(sep))
119
+ return `./${rel.split(sep).join('/')}`;
120
+ const home = homedir();
121
+ const fromHome = relative(home, path);
122
+ if (fromHome && !fromHome.startsWith('..'))
123
+ return `~/${fromHome.split(sep).join('/')}`;
124
+ return path;
125
+ }
126
+ /** Where each choice writes, and what already holds that name. */
127
+ export function planSkillTargets(name, options) {
128
+ const roster = discoverSkillRoster({
129
+ cwd: options.cwd,
130
+ ...(options.home !== undefined ? { home: options.home } : {}),
131
+ // Every tier, the built-in one included even when the config turns it
132
+ // off: "replaces" is about files, and the file is there.
133
+ config: { ...(options.config ?? {}), builtin: true, disabled: [] },
134
+ });
135
+ const existing = [
136
+ ...roster.skills.filter((skill) => skill.name === name),
137
+ ...roster.shadowed.filter((skill) => skill.name === name),
138
+ ];
139
+ const target = (scope) => {
140
+ const tier = scope;
141
+ const dir = scope === 'user' ? userSkillsDir(options.home) : projectSkillsDir(options.cwd);
142
+ const path = join(dir, name, 'SKILL.md');
143
+ const rank = SKILL_TIERS.indexOf(tier);
144
+ const collisions = existing
145
+ .map((skill) => {
146
+ const overwrite = skill.path === path;
147
+ const higher = !overwrite && SKILL_TIERS.indexOf(skill.tier) > rank;
148
+ return {
149
+ effect: higher ? 'hidden-by' : 'replaces',
150
+ where: skillTierLabel(skill.tier),
151
+ path: skill.path,
152
+ overwrite,
153
+ };
154
+ })
155
+ .sort((a, b) => Number(b.overwrite) - Number(a.overwrite));
156
+ return { scope, path, displayPath: displayPath(path, options.cwd), collisions };
157
+ };
158
+ return { user: target('user'), project: target('project') };
159
+ }
160
+ /** One line per collision, as the confirmation and the tool result say it. */
161
+ export function describeCollision(collision, cwd) {
162
+ const where = displayPath(collision.path, cwd);
163
+ if (collision.overwrite)
164
+ return `replaces ${collision.where} skill ${where} (overwrites it)`;
165
+ return collision.effect === 'replaces'
166
+ ? `replaces ${collision.where} skill ${where}`
167
+ : `hidden by ${collision.where} skill ${where}, which keeps winning`;
168
+ }
169
+ /** The prompt tripwire, worded for a skill. */
170
+ export function skillWarnings(markdown) {
171
+ return scanSchedulePrompt(markdown).map((finding) => finding.replace(/^The prompt/, 'The skill'));
172
+ }
173
+ /**
174
+ * Write `text` to `path` so a reader sees the old file or the new one, never
175
+ * part of either: a temporary beside it, flushed, then renamed over it.
176
+ */
177
+ export function writeFileAtomically(path, text) {
178
+ mkdirSync(dirname(path), { recursive: true });
179
+ const temporary = join(dirname(path), `.SKILL.md.${process.pid}.${randomBytes(6).toString('hex')}.tmp`);
180
+ try {
181
+ const fd = openSync(temporary, 'wx', 0o644);
182
+ try {
183
+ writeSync(fd, text);
184
+ fsyncSync(fd);
185
+ }
186
+ finally {
187
+ closeSync(fd);
188
+ }
189
+ renameSync(temporary, path);
190
+ }
191
+ catch (error) {
192
+ rmSync(temporary, { force: true });
193
+ throw error;
194
+ }
195
+ }
196
+ const inputSchema = mcpJsonSchemaToZod({
197
+ type: 'object',
198
+ properties: {
199
+ name: {
200
+ type: 'string',
201
+ minLength: 1,
202
+ maxLength: 128,
203
+ description: 'Directory and skill name: lowercase letters, digits and single hyphens, at most 64.',
204
+ },
205
+ description: {
206
+ type: 'string',
207
+ minLength: 1,
208
+ maxLength: 4096,
209
+ description: 'One or two sentences saying WHEN to use the skill (the task and the words a user would use), at most 1024 characters. The model decides to load a skill from this alone.',
210
+ },
211
+ body: {
212
+ type: 'string',
213
+ minLength: 1,
214
+ maxLength: 200_000,
215
+ description: 'The instructions: markdown, no frontmatter. Steps, constraints, examples.',
216
+ },
217
+ scope: {
218
+ type: 'string',
219
+ enum: ['user', 'project'],
220
+ description: 'Where you suggest it go: user (~/.namzu/skills, every project) or project (./.namzu/skills). The operator chooses.',
221
+ },
222
+ replaces: {
223
+ type: 'string',
224
+ description: 'The name of the existing skill this updates, when it is one. Must equal name.',
225
+ },
226
+ origin: {
227
+ type: 'string',
228
+ enum: ['created', 'learned'],
229
+ description: 'created: written with the operator; learned: generalised from this conversation.',
230
+ },
231
+ },
232
+ required: ['name', 'description', 'body'],
233
+ additionalProperties: false,
234
+ });
235
+ function refuse(error) {
236
+ return { success: false, output: '', error };
237
+ }
238
+ /**
239
+ * The `save_skill` tool over a {@link SaveSkillHost}. Register it only where a
240
+ * person is present to confirm — the interactive TUI's own session.
241
+ */
242
+ export function buildSaveSkillTool(host) {
243
+ return defineTool({
244
+ name: SAVE_SKILL_TOOL_NAME,
245
+ description: 'Propose a reusable skill (a SKILL.md: name, description, instructions) for the operator to save. The operator sees the whole file and where it would go, and picks user, project or cancel; nothing is written without that. Use it only when the operator asked for a skill (the skill-creator skill describes how to draft one).',
246
+ inputSchema,
247
+ category: 'custom',
248
+ permissions: ['file_write'],
249
+ readOnly: false,
250
+ destructive: false,
251
+ concurrencySafe: false,
252
+ // A person reads the whole file before answering; the default two
253
+ // minutes would close the question on them.
254
+ timeoutMs: 30 * 60_000,
255
+ presentCall: (input) => ({
256
+ kind: 'generic',
257
+ label: `Propose skill ${typeof input.name === 'string' ? input.name : ''}`.trim(),
258
+ presentation: 'activity',
259
+ }),
260
+ // The operator's No on the tool's own screen is not a failure.
261
+ presentResult: (_input, result) => !result.success && result.data?.cancelled === true
262
+ ? { kind: 'generic', label: 'Cancelled — nothing was saved', outcome: 'cancelled' }
263
+ : undefined,
264
+ async execute(raw, context) {
265
+ const input = raw;
266
+ let draft;
267
+ try {
268
+ draft = validateSkillDraft({
269
+ name: input.name,
270
+ description: input.description,
271
+ body: input.body,
272
+ ...(input.origin ? { origin: input.origin } : {}),
273
+ });
274
+ }
275
+ catch (error) {
276
+ return refuse(`save_skill: ${error instanceof Error ? error.message : String(error)}`);
277
+ }
278
+ if (input.replaces !== undefined && input.replaces.trim() !== draft.name) {
279
+ return refuse(`save_skill: replaces "${input.replaces}" must equal name "${draft.name}"; a skill is updated under its own name, not renamed.`);
280
+ }
281
+ const sessionId = host.sessionId();
282
+ let markdown;
283
+ try {
284
+ markdown = composeSkillMarkdown(draft, {
285
+ ...(sessionId ? { sessionId } : {}),
286
+ createdAt: (host.now ?? (() => new Date()))(),
287
+ });
288
+ }
289
+ catch (error) {
290
+ return refuse(`save_skill: ${error instanceof Error ? error.message : String(error)}`);
291
+ }
292
+ const cwd = host.cwd();
293
+ const home = host.home?.();
294
+ const config = host.config?.();
295
+ const targets = planSkillTargets(draft.name, {
296
+ cwd,
297
+ ...(home !== undefined ? { home } : {}),
298
+ ...(config ? { config } : {}),
299
+ });
300
+ const request = {
301
+ draft,
302
+ markdown,
303
+ revealed: revealHiddenCharacters(markdown),
304
+ targets,
305
+ suggested: input.scope ?? 'user',
306
+ ...(sessionId ? { sessionId } : {}),
307
+ warnings: skillWarnings(markdown),
308
+ };
309
+ let answer;
310
+ try {
311
+ answer = await host.confirm(request, context.abortSignal);
312
+ }
313
+ catch {
314
+ answer = 'cancel';
315
+ }
316
+ if (context.abortSignal?.aborted)
317
+ answer = 'cancel';
318
+ if (answer !== 'user' && answer !== 'project') {
319
+ return {
320
+ ...refuse('The operator cancelled; nothing was written. Ask what to change, or leave it.'),
321
+ data: { cancelled: true },
322
+ };
323
+ }
324
+ const target = targets[answer];
325
+ try {
326
+ writeFileAtomically(target.path, markdown);
327
+ }
328
+ catch (error) {
329
+ return refuse(`save_skill: could not write ${target.path}: ${error instanceof Error ? error.message : String(error)}`);
330
+ }
331
+ host.saved?.({ name: draft.name, path: target.path });
332
+ const notes = target.collisions.map((c) => describeCollision(c, cwd));
333
+ return {
334
+ success: true,
335
+ output: [
336
+ `Saved skill "${draft.name}" to ${target.displayPath}.${notes.length > 0 ? ` It ${notes.join('; ')}.` : ''}`,
337
+ `It is offered to the model from the next turn; the operator can activate it now with /skills ${draft.name}.`,
338
+ ].join(' '),
339
+ data: { name: draft.name, path: target.path, scope: answer },
340
+ };
341
+ },
342
+ });
343
+ }
344
+ //# sourceMappingURL=save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/skills/save.ts"],"names":[],"mappings":"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"}