@otto-assistant/otto 0.1.1 → 0.7.15

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 (637) hide show
  1. package/bin.js +2 -0
  2. package/dist/agent-model.e2e.test.js +755 -0
  3. package/dist/ai-tool-to-genai.js +233 -0
  4. package/dist/ai-tool-to-genai.test.js +267 -0
  5. package/dist/ai-tool.js +6 -0
  6. package/dist/anthropic-account-identity.js +62 -0
  7. package/dist/anthropic-account-identity.test.js +38 -0
  8. package/dist/anthropic-auth-plugin.js +917 -0
  9. package/dist/anthropic-auth-state.js +303 -0
  10. package/dist/anthropic-auth-state.test.js +150 -0
  11. package/dist/bin.js +152 -0
  12. package/dist/btw-prefix-detection.js +17 -0
  13. package/dist/btw-prefix-detection.test.js +63 -0
  14. package/dist/channel-management.js +259 -0
  15. package/dist/cli-parsing.test.js +142 -0
  16. package/dist/cli-send-thread.e2e.test.js +353 -0
  17. package/dist/cli-telegram-options.test.js +99 -0
  18. package/dist/cli.js +4210 -568
  19. package/dist/commands/abort.js +65 -0
  20. package/dist/commands/action-buttons.js +245 -0
  21. package/dist/commands/add-dir.js +124 -0
  22. package/dist/commands/add-dir.test.js +126 -0
  23. package/dist/commands/add-project.js +113 -0
  24. package/dist/commands/agent.js +355 -0
  25. package/dist/commands/ask-question.js +320 -0
  26. package/dist/commands/ask-question.test.js +92 -0
  27. package/dist/commands/btw.js +121 -0
  28. package/dist/commands/cli-commands-group-a.test.js +728 -0
  29. package/dist/commands/cli-commands-group-b.test.js +695 -0
  30. package/dist/commands/compact.js +120 -0
  31. package/dist/commands/context-usage.js +140 -0
  32. package/dist/commands/create-new-project.js +130 -0
  33. package/dist/commands/diff.js +63 -0
  34. package/dist/commands/discord-commands-group-a.test.js +621 -0
  35. package/dist/commands/discord-commands-group-b.test.js +595 -0
  36. package/dist/commands/discord-commands-group-c.test.js +739 -0
  37. package/dist/commands/file-upload.js +275 -0
  38. package/dist/commands/fork-subagent.js +177 -0
  39. package/dist/commands/fork.js +262 -0
  40. package/dist/commands/gemini-apikey.js +70 -0
  41. package/dist/commands/login.js +887 -0
  42. package/dist/commands/mcp.js +239 -0
  43. package/dist/commands/memory-snapshot.js +24 -0
  44. package/dist/commands/mention-mode.js +44 -0
  45. package/dist/commands/merge-worktree.js +162 -0
  46. package/dist/commands/model-variant.js +366 -0
  47. package/dist/commands/model.js +794 -0
  48. package/dist/commands/new-worktree.js +465 -0
  49. package/dist/commands/paginated-select.js +57 -0
  50. package/dist/commands/permissions.js +274 -0
  51. package/dist/commands/queue.js +223 -0
  52. package/dist/commands/remove-project.js +115 -0
  53. package/dist/commands/restart-opencode-server.js +127 -0
  54. package/dist/commands/resume.js +149 -0
  55. package/dist/commands/run-command.js +79 -0
  56. package/dist/commands/screenshare.js +303 -0
  57. package/dist/commands/screenshare.test.js +20 -0
  58. package/dist/commands/session-id.js +78 -0
  59. package/dist/commands/session.js +176 -0
  60. package/dist/commands/share.js +80 -0
  61. package/dist/commands/tasks.js +205 -0
  62. package/dist/commands/thread-deletion-sync.js +50 -0
  63. package/dist/commands/types.js +2 -0
  64. package/dist/commands/undo-redo.js +305 -0
  65. package/dist/commands/unset-model.js +139 -0
  66. package/dist/commands/upgrade.js +48 -0
  67. package/dist/commands/user-command.js +155 -0
  68. package/dist/commands/verbosity.js +125 -0
  69. package/dist/commands/vscode.js +269 -0
  70. package/dist/commands/worktree-settings.js +43 -0
  71. package/dist/commands/worktrees.js +468 -0
  72. package/dist/condense-memory.js +33 -0
  73. package/dist/config.js +100 -255
  74. package/dist/context-awareness-plugin.js +340 -0
  75. package/dist/context-awareness-plugin.test.js +126 -0
  76. package/dist/critique-utils.js +95 -0
  77. package/dist/database.js +1355 -0
  78. package/dist/db.js +260 -0
  79. package/dist/db.test.js +138 -0
  80. package/dist/debounce-timeout.js +28 -0
  81. package/dist/debounced-process-flush.js +77 -0
  82. package/dist/discord-bot.js +1124 -0
  83. package/dist/discord-command-registration.js +567 -0
  84. package/dist/discord-urls.js +82 -0
  85. package/dist/discord-utils.js +616 -0
  86. package/dist/discord-utils.test.js +134 -0
  87. package/dist/errors.js +157 -0
  88. package/dist/escape-backticks.test.js +429 -0
  89. package/dist/event-stream-real-capture.e2e.test.js +533 -0
  90. package/dist/eventsource-parser.test.js +327 -0
  91. package/dist/exec-async.js +26 -0
  92. package/dist/external-opencode-sync.js +480 -0
  93. package/dist/format-tables.js +491 -0
  94. package/dist/format-tables.test.js +478 -0
  95. package/dist/forum-sync/config.js +79 -0
  96. package/dist/forum-sync/discord-operations.js +154 -0
  97. package/dist/forum-sync/index.js +5 -0
  98. package/dist/forum-sync/markdown.js +113 -0
  99. package/dist/forum-sync/sync-to-discord.js +417 -0
  100. package/dist/forum-sync/sync-to-files.js +190 -0
  101. package/dist/forum-sync/types.js +53 -0
  102. package/dist/forum-sync/watchers.js +307 -0
  103. package/dist/gateway-proxy-reconnect.e2e.test.js +394 -0
  104. package/dist/gateway-proxy.e2e.test.js +485 -0
  105. package/dist/genai-worker-wrapper.js +111 -0
  106. package/dist/genai-worker.js +311 -0
  107. package/dist/genai.js +232 -0
  108. package/dist/generated/browser.js +17 -0
  109. package/dist/generated/client.js +37 -0
  110. package/dist/generated/commonInputTypes.js +10 -0
  111. package/dist/generated/enums.js +58 -0
  112. package/dist/generated/internal/class.js +49 -0
  113. package/dist/generated/internal/prismaNamespace.js +254 -0
  114. package/dist/generated/internal/prismaNamespaceBrowser.js +224 -0
  115. package/dist/generated/models/bot_api_keys.js +1 -0
  116. package/dist/generated/models/bot_tokens.js +1 -0
  117. package/dist/generated/models/channel_agents.js +1 -0
  118. package/dist/generated/models/channel_directories.js +1 -0
  119. package/dist/generated/models/channel_mention_mode.js +1 -0
  120. package/dist/generated/models/channel_models.js +1 -0
  121. package/dist/generated/models/channel_verbosity.js +1 -0
  122. package/dist/generated/models/channel_worktrees.js +1 -0
  123. package/dist/generated/models/forum_sync_configs.js +1 -0
  124. package/dist/generated/models/global_models.js +1 -0
  125. package/dist/generated/models/ipc_requests.js +1 -0
  126. package/dist/generated/models/part_messages.js +1 -0
  127. package/dist/generated/models/scheduled_tasks.js +1 -0
  128. package/dist/generated/models/session_agents.js +1 -0
  129. package/dist/generated/models/session_events.js +1 -0
  130. package/dist/generated/models/session_models.js +1 -0
  131. package/dist/generated/models/session_start_sources.js +1 -0
  132. package/dist/generated/models/thread_sessions.js +1 -0
  133. package/dist/generated/models/thread_worktrees.js +1 -0
  134. package/dist/generated/models.js +1 -0
  135. package/dist/heap-monitor.js +122 -0
  136. package/dist/hrana-server.js +251 -0
  137. package/dist/hrana-server.test.js +370 -0
  138. package/dist/html-actions.js +123 -0
  139. package/dist/html-actions.test.js +70 -0
  140. package/dist/html-components.js +117 -0
  141. package/dist/html-components.test.js +34 -0
  142. package/dist/image-optimizer-plugin.js +153 -0
  143. package/dist/image-utils.js +112 -0
  144. package/dist/interaction-handler.js +420 -0
  145. package/dist/ipc-polling.js +327 -0
  146. package/dist/ipc-tools-plugin.js +193 -0
  147. package/dist/ipc-utils.js +18 -0
  148. package/dist/limit-heading-depth.js +25 -0
  149. package/dist/limit-heading-depth.test.js +105 -0
  150. package/dist/logger.js +171 -0
  151. package/dist/markdown.js +342 -0
  152. package/dist/markdown.test.js +264 -0
  153. package/dist/memory-overview-plugin.js +128 -0
  154. package/dist/message-finish-field.e2e.test.js +168 -0
  155. package/dist/message-formatting.js +415 -0
  156. package/dist/message-formatting.test.js +115 -0
  157. package/dist/message-preprocessing.js +359 -0
  158. package/dist/onboarding-tutorial.js +163 -0
  159. package/dist/onboarding-welcome.js +37 -0
  160. package/dist/openai-realtime.js +224 -0
  161. package/dist/opencode-command-detection.js +65 -0
  162. package/dist/opencode-command-detection.test.js +240 -0
  163. package/dist/opencode-command.js +131 -0
  164. package/dist/opencode-command.test.js +48 -0
  165. package/dist/opencode-interrupt-plugin.js +388 -0
  166. package/dist/opencode-interrupt-plugin.test.js +463 -0
  167. package/dist/opencode.js +1117 -0
  168. package/dist/otto/branding.js +22 -0
  169. package/dist/otto/index.js +21 -0
  170. package/dist/otto-digital-twin.e2e.test.js +161 -0
  171. package/dist/otto-opencode-plugin-loading.e2e.test.js +94 -0
  172. package/dist/otto-opencode-plugin.js +21 -0
  173. package/dist/otto-opencode-plugin.test.js +98 -0
  174. package/dist/parse-permission-rules.test.js +117 -0
  175. package/dist/patch-text-parser.js +97 -0
  176. package/dist/plugin-logger.js +68 -0
  177. package/dist/privacy-sanitizer.js +105 -0
  178. package/dist/queue-advanced-abort.e2e.test.js +293 -0
  179. package/dist/queue-advanced-action-buttons.e2e.test.js +206 -0
  180. package/dist/queue-advanced-e2e-setup.js +790 -0
  181. package/dist/queue-advanced-footer.e2e.test.js +481 -0
  182. package/dist/queue-advanced-model-switch.e2e.test.js +299 -0
  183. package/dist/queue-advanced-permissions-typing.e2e.test.js +179 -0
  184. package/dist/queue-advanced-question.e2e.test.js +261 -0
  185. package/dist/queue-advanced-typing-interrupt.e2e.test.js +114 -0
  186. package/dist/queue-advanced-typing.e2e.test.js +153 -0
  187. package/dist/queue-drain-after-interactive-ui.e2e.test.js +119 -0
  188. package/dist/queue-interrupt-drain.e2e.test.js +135 -0
  189. package/dist/queue-question-select-drain.e2e.test.js +256 -0
  190. package/dist/runtime-idle-sweeper.js +52 -0
  191. package/dist/runtime-lifecycle.e2e.test.js +514 -0
  192. package/dist/sentry.js +23 -0
  193. package/dist/session-handler/agent-utils.js +67 -0
  194. package/dist/session-handler/event-stream-state.js +475 -0
  195. package/dist/session-handler/event-stream-state.test.js +632 -0
  196. package/dist/session-handler/model-utils.js +147 -0
  197. package/dist/session-handler/opencode-session-event-log.js +94 -0
  198. package/dist/session-handler/thread-runtime-state.js +131 -0
  199. package/dist/session-handler/thread-session-runtime.js +3390 -0
  200. package/dist/session-handler.js +9 -0
  201. package/dist/session-search.js +100 -0
  202. package/dist/session-search.test.js +40 -0
  203. package/dist/session-title-rename.test.js +92 -0
  204. package/dist/skill-filter.js +31 -0
  205. package/dist/skill-filter.test.js +65 -0
  206. package/dist/startup-service.js +153 -0
  207. package/dist/startup-time.e2e.test.js +296 -0
  208. package/dist/store.js +19 -0
  209. package/dist/subagent-rate-limit-plugin.js +175 -0
  210. package/dist/system-message.js +702 -0
  211. package/dist/system-message.test.js +697 -0
  212. package/dist/task-runner.js +530 -0
  213. package/dist/task-schedule.js +213 -0
  214. package/dist/task-schedule.test.js +71 -0
  215. package/dist/test-utils.js +313 -0
  216. package/dist/thinking-utils.js +35 -0
  217. package/dist/thread-message-queue.e2e.test.js +1111 -0
  218. package/dist/tools.js +357 -0
  219. package/dist/undo-redo.e2e.test.js +161 -0
  220. package/dist/unnest-code-blocks.js +146 -0
  221. package/dist/unnest-code-blocks.test.js +673 -0
  222. package/dist/upgrade.js +156 -0
  223. package/dist/utils.js +172 -0
  224. package/dist/utils.test.js +130 -0
  225. package/dist/voice-attachment.js +34 -0
  226. package/dist/voice-handler.js +646 -0
  227. package/dist/voice-message.e2e.test.js +1021 -0
  228. package/dist/voice.js +456 -0
  229. package/dist/voice.test.js +235 -0
  230. package/dist/wait-session.js +171 -0
  231. package/dist/websockify.js +69 -0
  232. package/dist/worker-types.js +4 -0
  233. package/dist/worktree-lifecycle.e2e.test.js +311 -0
  234. package/dist/worktree-utils.js +3 -0
  235. package/dist/worktrees.js +991 -0
  236. package/dist/worktrees.test.js +415 -0
  237. package/dist/xml.js +92 -0
  238. package/dist/xml.test.js +32 -0
  239. package/package.json +90 -38
  240. package/schema.prisma +303 -0
  241. package/skills/batch/SKILL.md +87 -0
  242. package/skills/critique/SKILL.md +112 -0
  243. package/skills/egaki/SKILL.md +100 -0
  244. package/skills/errore/SKILL.md +647 -0
  245. package/skills/event-sourcing-state/SKILL.md +252 -0
  246. package/skills/goke/SKILL.md +38 -0
  247. package/skills/jitter/EDITOR.md +219 -0
  248. package/skills/jitter/EXPORT-INTERNALS.md +309 -0
  249. package/skills/jitter/SKILL.md +158 -0
  250. package/skills/jitter/jitter-clipboard.json +1042 -0
  251. package/skills/jitter/package.json +14 -0
  252. package/skills/jitter/tsconfig.json +15 -0
  253. package/skills/jitter/utils/actions.ts +212 -0
  254. package/skills/jitter/utils/export.ts +114 -0
  255. package/skills/jitter/utils/index.ts +141 -0
  256. package/skills/jitter/utils/snapshot.ts +154 -0
  257. package/skills/jitter/utils/traverse.ts +246 -0
  258. package/skills/jitter/utils/types.ts +279 -0
  259. package/skills/jitter/utils/wait.ts +133 -0
  260. package/skills/lintcn/SKILL.md +873 -0
  261. package/skills/manual-kimaki-upstream-adapt/SKILL.md +114 -0
  262. package/skills/new-skill/SKILL.md +237 -0
  263. package/skills/npm-package/SKILL.md +617 -0
  264. package/skills/opensrc/SKILL.md +78 -0
  265. package/skills/otto-publish/SKILL.md +61 -0
  266. package/skills/playwriter/SKILL.md +35 -0
  267. package/skills/profano/SKILL.md +16 -0
  268. package/skills/proxyman/SKILL.md +215 -0
  269. package/skills/security-review/SKILL.md +208 -0
  270. package/skills/sigillo/SKILL.md +101 -0
  271. package/skills/simplify/SKILL.md +58 -0
  272. package/skills/spiceflow/SKILL.md +28 -0
  273. package/skills/termcast/SKILL.md +945 -0
  274. package/skills/tuistory/SKILL.md +98 -0
  275. package/skills/usecomputer/SKILL.md +264 -0
  276. package/skills/x-articles/SKILL.md +554 -0
  277. package/skills/zele/SKILL.md +49 -0
  278. package/skills/zustand-centralized-state/SKILL.md +1004 -0
  279. package/src/agent-model.e2e.test.ts +979 -0
  280. package/src/ai-tool-to-genai.test.ts +296 -0
  281. package/src/ai-tool-to-genai.ts +283 -0
  282. package/src/ai-tool.ts +39 -0
  283. package/src/anthropic-account-identity.test.ts +52 -0
  284. package/src/anthropic-account-identity.ts +77 -0
  285. package/src/anthropic-auth-plugin.ts +1139 -0
  286. package/src/anthropic-auth-state.test.ts +187 -0
  287. package/src/anthropic-auth-state.ts +386 -0
  288. package/src/bin.ts +182 -0
  289. package/src/btw-prefix-detection.test.ts +73 -0
  290. package/src/btw-prefix-detection.ts +23 -0
  291. package/src/channel-management.ts +376 -0
  292. package/src/cli-parsing.test.ts +197 -0
  293. package/src/cli-send-thread.e2e.test.ts +463 -0
  294. package/src/cli-telegram-options.test.ts +114 -0
  295. package/src/cli.ts +5718 -580
  296. package/src/commands/abort.ts +89 -0
  297. package/src/commands/action-buttons.ts +364 -0
  298. package/src/commands/add-dir.test.ts +154 -0
  299. package/src/commands/add-dir.ts +175 -0
  300. package/src/commands/add-project.ts +149 -0
  301. package/src/commands/agent.ts +496 -0
  302. package/src/commands/ask-question.test.ts +111 -0
  303. package/src/commands/ask-question.ts +455 -0
  304. package/src/commands/btw.ts +184 -0
  305. package/src/commands/cli-commands-group-a.test.ts +837 -0
  306. package/src/commands/cli-commands-group-b.test.ts +800 -0
  307. package/src/commands/compact.ts +157 -0
  308. package/src/commands/context-usage.ts +199 -0
  309. package/src/commands/create-new-project.ts +190 -0
  310. package/src/commands/diff.ts +91 -0
  311. package/src/commands/discord-commands-group-a.test.ts +751 -0
  312. package/src/commands/discord-commands-group-b.test.ts +648 -0
  313. package/src/commands/discord-commands-group-c.test.ts +882 -0
  314. package/src/commands/file-upload.ts +389 -0
  315. package/src/commands/fork-subagent.ts +263 -0
  316. package/src/commands/fork.ts +386 -0
  317. package/src/commands/gemini-apikey.ts +104 -0
  318. package/src/commands/login.ts +1175 -0
  319. package/src/commands/mcp.ts +307 -0
  320. package/src/commands/memory-snapshot.ts +30 -0
  321. package/src/commands/mention-mode.ts +68 -0
  322. package/src/commands/merge-worktree.ts +226 -0
  323. package/src/commands/model-variant.ts +485 -0
  324. package/src/commands/model.ts +1078 -0
  325. package/src/commands/new-worktree.ts +645 -0
  326. package/src/commands/paginated-select.ts +81 -0
  327. package/src/commands/permissions.ts +397 -0
  328. package/src/commands/queue.ts +293 -0
  329. package/src/commands/remove-project.ts +155 -0
  330. package/src/commands/restart-opencode-server.ts +162 -0
  331. package/src/commands/resume.ts +230 -0
  332. package/src/commands/run-command.ts +123 -0
  333. package/src/commands/screenshare.test.ts +30 -0
  334. package/src/commands/screenshare.ts +366 -0
  335. package/src/commands/session-id.ts +109 -0
  336. package/src/commands/session.ts +227 -0
  337. package/src/commands/share.ts +106 -0
  338. package/src/commands/tasks.ts +293 -0
  339. package/src/commands/thread-deletion-sync.ts +80 -0
  340. package/src/commands/types.ts +25 -0
  341. package/src/commands/undo-redo.ts +386 -0
  342. package/src/commands/unset-model.ts +174 -0
  343. package/src/commands/upgrade.ts +59 -0
  344. package/src/commands/user-command.ts +198 -0
  345. package/src/commands/verbosity.ts +173 -0
  346. package/src/commands/vscode.ts +342 -0
  347. package/src/commands/worktree-settings.ts +70 -0
  348. package/src/commands/worktrees.ts +645 -0
  349. package/src/condense-memory.ts +36 -0
  350. package/src/config.ts +103 -339
  351. package/src/context-awareness-plugin.test.ts +144 -0
  352. package/src/context-awareness-plugin.ts +469 -0
  353. package/src/critique-utils.ts +139 -0
  354. package/src/database.ts +1949 -0
  355. package/src/db.test.ts +162 -0
  356. package/src/db.ts +295 -0
  357. package/src/debounce-timeout.ts +43 -0
  358. package/src/debounced-process-flush.ts +104 -0
  359. package/src/discord-bot.ts +1505 -0
  360. package/src/discord-command-registration.ts +752 -0
  361. package/src/discord-urls.ts +89 -0
  362. package/src/discord-utils.test.ts +153 -0
  363. package/src/discord-utils.ts +846 -0
  364. package/src/errors.ts +201 -0
  365. package/src/escape-backticks.test.ts +469 -0
  366. package/src/event-stream-real-capture.e2e.test.ts +692 -0
  367. package/src/eventsource-parser.test.ts +351 -0
  368. package/src/exec-async.ts +35 -0
  369. package/src/external-opencode-sync.ts +685 -0
  370. package/src/format-tables.test.ts +515 -0
  371. package/src/format-tables.ts +718 -0
  372. package/src/forum-sync/config.ts +92 -0
  373. package/src/forum-sync/discord-operations.ts +241 -0
  374. package/src/forum-sync/index.ts +9 -0
  375. package/src/forum-sync/markdown.ts +172 -0
  376. package/src/forum-sync/sync-to-discord.ts +595 -0
  377. package/src/forum-sync/sync-to-files.ts +294 -0
  378. package/src/forum-sync/types.ts +175 -0
  379. package/src/forum-sync/watchers.ts +454 -0
  380. package/src/gateway-proxy-reconnect.e2e.test.ts +523 -0
  381. package/src/gateway-proxy.e2e.test.ts +644 -0
  382. package/src/genai-worker-wrapper.ts +164 -0
  383. package/src/genai-worker.ts +386 -0
  384. package/src/genai.ts +321 -0
  385. package/src/generated/browser.ts +114 -0
  386. package/src/generated/client.ts +138 -0
  387. package/src/generated/commonInputTypes.ts +770 -0
  388. package/src/generated/enums.ts +98 -0
  389. package/src/generated/internal/class.ts +384 -0
  390. package/src/generated/internal/prismaNamespace.ts +2394 -0
  391. package/src/generated/internal/prismaNamespaceBrowser.ts +327 -0
  392. package/src/generated/models/bot_api_keys.ts +1288 -0
  393. package/src/generated/models/bot_tokens.ts +1700 -0
  394. package/src/generated/models/channel_agents.ts +1256 -0
  395. package/src/generated/models/channel_directories.ts +1859 -0
  396. package/src/generated/models/channel_mention_mode.ts +1300 -0
  397. package/src/generated/models/channel_models.ts +1288 -0
  398. package/src/generated/models/channel_verbosity.ts +1228 -0
  399. package/src/generated/models/channel_worktrees.ts +1300 -0
  400. package/src/generated/models/forum_sync_configs.ts +1452 -0
  401. package/src/generated/models/global_models.ts +1288 -0
  402. package/src/generated/models/ipc_requests.ts +1485 -0
  403. package/src/generated/models/part_messages.ts +1302 -0
  404. package/src/generated/models/scheduled_tasks.ts +2320 -0
  405. package/src/generated/models/session_agents.ts +1086 -0
  406. package/src/generated/models/session_events.ts +1439 -0
  407. package/src/generated/models/session_models.ts +1114 -0
  408. package/src/generated/models/session_start_sources.ts +1408 -0
  409. package/src/generated/models/thread_sessions.ts +1781 -0
  410. package/src/generated/models/thread_worktrees.ts +1356 -0
  411. package/src/generated/models.ts +30 -0
  412. package/src/heap-monitor.ts +152 -0
  413. package/src/hrana-server.test.ts +434 -0
  414. package/src/hrana-server.ts +299 -0
  415. package/src/html-actions.test.ts +87 -0
  416. package/src/html-actions.ts +174 -0
  417. package/src/html-components.test.ts +38 -0
  418. package/src/html-components.ts +181 -0
  419. package/src/image-optimizer-plugin.ts +194 -0
  420. package/src/image-utils.ts +149 -0
  421. package/src/interaction-handler.ts +610 -0
  422. package/src/ipc-polling.ts +427 -0
  423. package/src/ipc-tools-plugin.ts +236 -0
  424. package/src/ipc-utils.ts +29 -0
  425. package/src/limit-heading-depth.test.ts +116 -0
  426. package/src/limit-heading-depth.ts +26 -0
  427. package/src/logger.ts +215 -0
  428. package/src/markdown.test.ts +315 -0
  429. package/src/markdown.ts +410 -0
  430. package/src/memory-overview-plugin.ts +163 -0
  431. package/src/message-finish-field.e2e.test.ts +195 -0
  432. package/src/message-formatting.test.ts +126 -0
  433. package/src/message-formatting.ts +535 -0
  434. package/src/message-preprocessing.ts +488 -0
  435. package/src/onboarding-tutorial.ts +167 -0
  436. package/src/onboarding-welcome.ts +49 -0
  437. package/src/openai-realtime.ts +358 -0
  438. package/src/opencode-command-detection.test.ts +307 -0
  439. package/src/opencode-command-detection.ts +76 -0
  440. package/src/opencode-command.test.ts +70 -0
  441. package/src/opencode-command.ts +191 -0
  442. package/src/opencode-interrupt-plugin.test.ts +682 -0
  443. package/src/opencode-interrupt-plugin.ts +507 -0
  444. package/src/opencode.ts +1453 -0
  445. package/src/otto/branding.ts +23 -0
  446. package/src/otto/index.ts +22 -0
  447. package/src/otto-digital-twin.e2e.test.ts +199 -0
  448. package/src/otto-opencode-plugin-loading.e2e.test.ts +117 -0
  449. package/src/otto-opencode-plugin.test.ts +108 -0
  450. package/src/otto-opencode-plugin.ts +22 -0
  451. package/src/parse-permission-rules.test.ts +127 -0
  452. package/src/patch-text-parser.ts +107 -0
  453. package/src/plugin-logger.ts +84 -0
  454. package/src/privacy-sanitizer.ts +142 -0
  455. package/src/queue-advanced-abort.e2e.test.ts +382 -0
  456. package/src/queue-advanced-action-buttons.e2e.test.ts +268 -0
  457. package/src/queue-advanced-e2e-setup.ts +877 -0
  458. package/src/queue-advanced-footer.e2e.test.ts +591 -0
  459. package/src/queue-advanced-model-switch.e2e.test.ts +383 -0
  460. package/src/queue-advanced-permissions-typing.e2e.test.ts +246 -0
  461. package/src/queue-advanced-question.e2e.test.ts +316 -0
  462. package/src/queue-advanced-typing-interrupt.e2e.test.ts +146 -0
  463. package/src/queue-advanced-typing.e2e.test.ts +199 -0
  464. package/src/queue-drain-after-interactive-ui.e2e.test.ts +151 -0
  465. package/src/queue-interrupt-drain.e2e.test.ts +166 -0
  466. package/src/queue-question-select-drain.e2e.test.ts +327 -0
  467. package/src/runtime-idle-sweeper.ts +76 -0
  468. package/src/runtime-lifecycle.e2e.test.ts +651 -0
  469. package/src/schema.sql +174 -0
  470. package/src/sentry.ts +26 -0
  471. package/src/session-handler/agent-utils.ts +99 -0
  472. package/src/session-handler/event-stream-fixtures/real-session-action-buttons.jsonl +45 -0
  473. package/src/session-handler/event-stream-fixtures/real-session-footer-suppressed-on-pre-idle-interrupt.jsonl +40 -0
  474. package/src/session-handler/event-stream-fixtures/real-session-permission-external-file.jsonl +23 -0
  475. package/src/session-handler/event-stream-fixtures/real-session-task-normal.jsonl +22 -0
  476. package/src/session-handler/event-stream-fixtures/real-session-task-three-parallel-sleeps.jsonl +277 -0
  477. package/src/session-handler/event-stream-fixtures/real-session-task-user-interruption.jsonl +46 -0
  478. package/src/session-handler/event-stream-fixtures/session-abort-after-idle-race.jsonl +21 -0
  479. package/src/session-handler/event-stream-fixtures/session-concurrent-messages-serialized.jsonl +56 -0
  480. package/src/session-handler/event-stream-fixtures/session-explicit-abort.jsonl +44 -0
  481. package/src/session-handler/event-stream-fixtures/session-normal-completion.jsonl +29 -0
  482. package/src/session-handler/event-stream-fixtures/session-tool-call-noisy-stream.jsonl +29 -0
  483. package/src/session-handler/event-stream-fixtures/session-two-completions-same-session.jsonl +50 -0
  484. package/src/session-handler/event-stream-fixtures/session-user-interruption.jsonl +59 -0
  485. package/src/session-handler/event-stream-fixtures/session-voice-queued-followup.jsonl +52 -0
  486. package/src/session-handler/event-stream-state.test.ts +717 -0
  487. package/src/session-handler/event-stream-state.ts +706 -0
  488. package/src/session-handler/model-utils.ts +217 -0
  489. package/src/session-handler/opencode-session-event-log.ts +130 -0
  490. package/src/session-handler/thread-runtime-state.ts +247 -0
  491. package/src/session-handler/thread-session-runtime.ts +4440 -0
  492. package/src/session-handler.ts +15 -0
  493. package/src/session-search.test.ts +50 -0
  494. package/src/session-search.ts +148 -0
  495. package/src/session-title-rename.test.ts +130 -0
  496. package/src/skill-filter.test.ts +83 -0
  497. package/src/skill-filter.ts +42 -0
  498. package/src/startup-service.ts +200 -0
  499. package/src/startup-time.e2e.test.ts +373 -0
  500. package/src/store.ts +139 -0
  501. package/src/subagent-rate-limit-plugin.ts +218 -0
  502. package/src/system-message.test.ts +710 -0
  503. package/src/system-message.ts +814 -0
  504. package/src/task-runner.ts +725 -0
  505. package/src/task-schedule.test.ts +84 -0
  506. package/src/task-schedule.ts +317 -0
  507. package/src/test-utils.ts +451 -0
  508. package/src/thinking-utils.ts +61 -0
  509. package/src/thread-message-queue.e2e.test.ts +1350 -0
  510. package/src/tools.ts +430 -0
  511. package/src/undici.d.ts +12 -0
  512. package/src/undo-redo.e2e.test.ts +209 -0
  513. package/src/unnest-code-blocks.test.ts +713 -0
  514. package/src/unnest-code-blocks.ts +185 -0
  515. package/src/upgrade.ts +185 -0
  516. package/src/utils.test.ts +155 -0
  517. package/src/utils.ts +265 -0
  518. package/src/voice-attachment.ts +51 -0
  519. package/src/voice-handler.ts +908 -0
  520. package/src/voice-message.e2e.test.ts +1255 -0
  521. package/src/voice.test.ts +281 -0
  522. package/src/voice.ts +638 -0
  523. package/src/wait-session.ts +273 -0
  524. package/src/websockify.ts +101 -0
  525. package/src/worker-types.ts +64 -0
  526. package/src/worktree-lifecycle.e2e.test.ts +396 -0
  527. package/src/worktree-utils.ts +4 -0
  528. package/src/worktrees.test.ts +489 -0
  529. package/src/worktrees.ts +1370 -0
  530. package/src/xml.test.ts +38 -0
  531. package/src/xml.ts +121 -0
  532. package/dist/cli.d.ts +0 -3
  533. package/dist/cli.d.ts.map +0 -1
  534. package/dist/cli.js.map +0 -1
  535. package/dist/config.d.ts +0 -39
  536. package/dist/config.d.ts.map +0 -1
  537. package/dist/config.js.map +0 -1
  538. package/dist/config.test.d.ts +0 -2
  539. package/dist/config.test.d.ts.map +0 -1
  540. package/dist/config.test.js +0 -202
  541. package/dist/config.test.js.map +0 -1
  542. package/dist/detect.d.ts +0 -9
  543. package/dist/detect.d.ts.map +0 -1
  544. package/dist/detect.js +0 -40
  545. package/dist/detect.js.map +0 -1
  546. package/dist/detect.test.d.ts +0 -2
  547. package/dist/detect.test.d.ts.map +0 -1
  548. package/dist/detect.test.js +0 -26
  549. package/dist/detect.test.js.map +0 -1
  550. package/dist/docker.d.ts +0 -7
  551. package/dist/docker.d.ts.map +0 -1
  552. package/dist/docker.js +0 -17
  553. package/dist/docker.js.map +0 -1
  554. package/dist/docker.test.d.ts +0 -2
  555. package/dist/docker.test.d.ts.map +0 -1
  556. package/dist/docker.test.js +0 -12
  557. package/dist/docker.test.js.map +0 -1
  558. package/dist/health.d.ts +0 -31
  559. package/dist/health.d.ts.map +0 -1
  560. package/dist/health.js +0 -117
  561. package/dist/health.js.map +0 -1
  562. package/dist/health.test.d.ts +0 -2
  563. package/dist/health.test.d.ts.map +0 -1
  564. package/dist/health.test.js +0 -52
  565. package/dist/health.test.js.map +0 -1
  566. package/dist/index.d.ts +0 -20
  567. package/dist/index.d.ts.map +0 -1
  568. package/dist/index.js +0 -15
  569. package/dist/index.js.map +0 -1
  570. package/dist/index.test.d.ts +0 -2
  571. package/dist/index.test.d.ts.map +0 -1
  572. package/dist/index.test.js +0 -8
  573. package/dist/index.test.js.map +0 -1
  574. package/dist/installer.d.ts +0 -10
  575. package/dist/installer.d.ts.map +0 -1
  576. package/dist/installer.js +0 -50
  577. package/dist/installer.js.map +0 -1
  578. package/dist/installer.test.d.ts +0 -2
  579. package/dist/installer.test.d.ts.map +0 -1
  580. package/dist/installer.test.js +0 -43
  581. package/dist/installer.test.js.map +0 -1
  582. package/dist/lifecycle.d.ts +0 -10
  583. package/dist/lifecycle.d.ts.map +0 -1
  584. package/dist/lifecycle.js +0 -45
  585. package/dist/lifecycle.js.map +0 -1
  586. package/dist/lifecycle.test.d.ts +0 -2
  587. package/dist/lifecycle.test.d.ts.map +0 -1
  588. package/dist/lifecycle.test.js +0 -20
  589. package/dist/lifecycle.test.js.map +0 -1
  590. package/dist/manifest.d.ts +0 -18
  591. package/dist/manifest.d.ts.map +0 -1
  592. package/dist/manifest.js +0 -30
  593. package/dist/manifest.js.map +0 -1
  594. package/dist/skills-baseline.d.ts +0 -7
  595. package/dist/skills-baseline.d.ts.map +0 -1
  596. package/dist/skills-baseline.js +0 -9
  597. package/dist/skills-baseline.js.map +0 -1
  598. package/dist/skills.d.ts +0 -110
  599. package/dist/skills.d.ts.map +0 -1
  600. package/dist/skills.js +0 -429
  601. package/dist/skills.js.map +0 -1
  602. package/dist/skills.test.d.ts +0 -2
  603. package/dist/skills.test.d.ts.map +0 -1
  604. package/dist/skills.test.js +0 -416
  605. package/dist/skills.test.js.map +0 -1
  606. package/dist/sync.d.ts +0 -10
  607. package/dist/sync.d.ts.map +0 -1
  608. package/dist/sync.js +0 -39
  609. package/dist/sync.js.map +0 -1
  610. package/dist/tenant.d.ts +0 -13
  611. package/dist/tenant.d.ts.map +0 -1
  612. package/dist/tenant.js +0 -105
  613. package/dist/tenant.js.map +0 -1
  614. package/dist/tenant.test.d.ts +0 -2
  615. package/dist/tenant.test.d.ts.map +0 -1
  616. package/dist/tenant.test.js +0 -37
  617. package/dist/tenant.test.js.map +0 -1
  618. package/src/config.test.ts +0 -237
  619. package/src/detect.test.ts +0 -29
  620. package/src/detect.ts +0 -52
  621. package/src/docker.test.ts +0 -12
  622. package/src/docker.ts +0 -23
  623. package/src/health.test.ts +0 -61
  624. package/src/health.ts +0 -158
  625. package/src/index.test.ts +0 -8
  626. package/src/index.ts +0 -62
  627. package/src/installer.test.ts +0 -52
  628. package/src/installer.ts +0 -62
  629. package/src/lifecycle.test.ts +0 -23
  630. package/src/lifecycle.ts +0 -49
  631. package/src/manifest.ts +0 -42
  632. package/src/skills-baseline.ts +0 -14
  633. package/src/skills.test.ts +0 -503
  634. package/src/skills.ts +0 -512
  635. package/src/sync.ts +0 -53
  636. package/src/tenant.test.ts +0 -49
  637. package/src/tenant.ts +0 -120
@@ -0,0 +1,617 @@
1
+ ---
2
+ name: npm-package
3
+ description: >
4
+ Opinionated TypeScript npm package template for ESM packages. Enforces
5
+ src→dist builds with tsc, strict TypeScript defaults, explicit exports, and
6
+ publish-safe package metadata. Use this when creating or updating any npm
7
+ package in this repo.
8
+ version: 0.0.1
9
+ ---
10
+
11
+ <!-- Purpose: canonical checklist for TypeScript npm package layout and publish config. -->
12
+
13
+ # npm-package
14
+
15
+ Use this skill when scaffolding or fixing npm packages.
16
+
17
+ ## Package.json rules
18
+
19
+ 1. Always set `"type": "module"`.
20
+ 2. Always fill `"description"`.
21
+ 3. Always include GitHub metadata:
22
+ - `repository` with `type`, `url`, and `directory`
23
+ - `homepage`
24
+ - `bugs`
25
+ 4. Always include meaningful `keywords`.
26
+ 5. Always export `./package.json`.
27
+ 6. Exports structure must include:
28
+ - `"."` for runtime entrypoint (`dist`)
29
+ - `"./src"` and `"./src/*"` pointing to `.ts` source files
30
+ 7. In every export object, put `types` first.
31
+ - For runtime exports (for example `"."`), point `types` to emitted
32
+ declaration files in `dist`.
33
+ - For source exports (`"./src"`, `"./src/*"`), point `types` to source
34
+ files in `src` (not `./dist/*.d.ts`).
35
+ 8. Always include `default` in exports.
36
+ 9. `files` must include at least:
37
+ - `src`
38
+ - `dist`
39
+ - any runtime-required extra files (for example `schema.prisma`)
40
+ - `skills/` directory if the package ships an agent skill (see "Agent
41
+ skill" section below). Skill files live at `skills/<name>/SKILL.md`,
42
+ never at the package root.
43
+ - if tests are inside src and gets included in dist, it's fine. don't try to exclude them
44
+ - **Do NOT create package-level README.md files.** In workspaces, keep one
45
+ README at the repository root. Package READMEs don't get read by anyone.
46
+ The root README is the single source of truth for the whole project.
47
+ 10. `scripts.build` should be `tsc && chmod +x dist/cli.js` (skip the chmod if
48
+ the package has no bin). No bundling. Do not delete `dist/` in `build` by
49
+ default because forcing a clean build on every local build can cause
50
+ issues. Optionally include running scripts with `tsx` if needed to
51
+ generate build artifacts.
52
+ 11. `prepublishOnly` must always do the cleanup before `build` (optionally run
53
+ generation before build when required). Always add this script:
54
+ ```json
55
+ { "prepublishOnly": "rimraf dist \"*.tsbuildinfo\" && pnpm build" }
56
+ ```
57
+ This ensures `dist/` is fresh before every `npm publish`, so deleted files
58
+ do not accidentally stay in the published package. Use `rimraf` here
59
+ instead of bare shell globs so the script behaves the same in zsh, bash,
60
+ and Windows shells even when no `.tsbuildinfo` file exists.
61
+
62
+ ## bin field
63
+
64
+ Use `bin` as a plain string pointing to the compiled entrypoint, not an object:
65
+
66
+ ```json
67
+ { "bin": "dist/cli.js" }
68
+ ```
69
+
70
+ The bin file must be executable and start with a shebang. After creating or
71
+ building it, always run:
72
+
73
+ ```bash
74
+ chmod +x dist/cli.js
75
+ ```
76
+
77
+ Add the shebang as the first line of the source file (`src/cli.ts`):
78
+
79
+ ```ts
80
+ #!/usr/bin/env node
81
+ ```
82
+
83
+ `tsc` preserves the shebang in the emitted `.js` file. The `chmod +x` is
84
+ already part of the `build` script, so `prepublishOnly` still gets it through
85
+ `pnpm build` after the cleanup step.
86
+
87
+ ## Reading package version at runtime
88
+
89
+ When Node code needs the package version, prefer reading it from `package.json`
90
+ via `createRequire`. This works cleanly in ESM packages without adding a JSON
91
+ import assertion.
92
+
93
+ ```ts
94
+ import { createRequire } from "node:module";
95
+
96
+ const require = createRequire(import.meta.url);
97
+ const packageJson = require("../package.json") as {
98
+ version: string;
99
+ };
100
+
101
+ export const packageVersion = packageJson.version;
102
+ ```
103
+
104
+ - Use a relative path from the current file to `package.json`.
105
+ - Read only the fields you need, usually `version`.
106
+ - Prefer this over hardcoding the version or duplicating it in source files.
107
+
108
+ ## Resolving paths relative to the package
109
+
110
+ ESM does not have `__dirname`. Derive it from `import.meta.url` with the
111
+ `node:url` and `node:path` modules, then resolve relative paths from there.
112
+
113
+ ```ts
114
+ import url from "node:url";
115
+ import path from "node:path";
116
+
117
+ const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
118
+
119
+ // e.g. from src/cli.ts → read SKILL.md under skills/<name>/SKILL.md
120
+ // (skill files always live in skills/<name>/SKILL.md, never at the package root)
121
+ const skillPath = path.resolve(__dirname, "../skills/mypkg/SKILL.md");
122
+
123
+ // from dist/cli.js (after tsc) → reach back to src/
124
+ const srcFile = path.resolve(__dirname, "../src/template.md");
125
+ ```
126
+
127
+ - Remember that `tsc` compiles `src/` → `dist/`. At runtime the file lives in
128
+ `dist/`, so one `..` gets you back to the package root.
129
+ - From a file in `src/` during dev (running with `tsx`), `..` also reaches the
130
+ package root since `src/` is one level deep.
131
+ - Use `path.resolve(__dirname, ...)` instead of string concatenation so it
132
+ works on all platforms.
133
+
134
+ ## Detecting development mode
135
+
136
+ Check whether `import.meta.url` ends with `.ts` or `.tsx`. In dev you run
137
+ source files directly (via `tsx` or `bun`), so the URL points to a `.ts` file.
138
+ After `tsc` builds to `dist/`, the URL ends with `.js`.
139
+
140
+ ```ts
141
+ const isDev =
142
+ import.meta.url.endsWith(".ts") || import.meta.url.endsWith(".tsx");
143
+ ```
144
+
145
+ This is useful for conditionally resolving paths that differ between `src/` and
146
+ `dist/`, or enabling dev-only logging without relying on `NODE_ENV`.
147
+
148
+ ## tsconfig rules
149
+
150
+ Use Node ESM-compatible compiler settings:
151
+
152
+ ```json
153
+ {
154
+ "compilerOptions": {
155
+ "allowImportingTsExtensions": true,
156
+ "rewriteRelativeImportExtensions": true,
157
+ "rootDir": "src",
158
+ "outDir": "dist",
159
+ "module": "nodenext",
160
+ "moduleResolution": "nodenext",
161
+ "target": "ESNext",
162
+ "lib": ["ESNext"],
163
+ "declaration": true,
164
+ "declarationMap": true,
165
+ "noEmit": false,
166
+ "strict": true,
167
+ "noImplicitAny": false,
168
+ "noUncheckedIndexedAccess": true,
169
+ "skipLibCheck": true,
170
+ "useUnknownInCatchVariables": false
171
+ },
172
+ "include": ["src"]
173
+ }
174
+ ```
175
+
176
+ - Always use "rootDir": "src"
177
+ - Add `"DOM"` to `lib` only when browser globals are needed.
178
+ - Use `.ts` and `.tsx` extensions in source imports. `tsc` rewrites them to
179
+ `.js` in the emitted `dist/` output automatically via
180
+ `rewriteRelativeImportExtensions`. This means source code works directly in
181
+ runtimes like `tsx`, `bun`, and frameworks like Next.js that expect `.ts`
182
+ extensions, while the published `dist/` has correct `.js` imports that Node.js
183
+ and other consumers resolve without issues.
184
+
185
+ ```ts
186
+ // source (src/index.ts) — use .ts/.tsx extensions
187
+ import { helper } from "./utils.ts";
188
+ import { Button } from "./button.tsx";
189
+
190
+ // emitted output (dist/index.js) — tsc rewrites to .js
191
+ // import { helper } from './utils.js'
192
+ // import { Button } from './button.js'
193
+ ```
194
+
195
+ - Only relative imports are rewritten. Path aliases (`paths` in tsconfig) are
196
+ not supported by `rewriteRelativeImportExtensions` — this is fine since npm
197
+ packages should use relative imports anyway.
198
+ - Requires TypeScript 5.7+.
199
+ - Install `@types/node` as a dev dependency whenever Node APIs are used.
200
+ - If generation is required, keep generators in `scripts/*.ts` and invoke them
201
+ from package scripts before build/publish.
202
+
203
+ > IMPORTANT! always use rootDir src. if there are other root level folders that should be type checked you should create other tsconfig.json files inside those folder. DO NOT add other folders inside src or the dist/ will contain dist/src, dist/other-folder. which breaks imports. the tsconfig.json inside these other folders can be minimal, using noEmit true, declaration false. Because usually these folders do not need to be emitted or compiled. just type checked. tests should still be put inside src. other folders can be things like `scripts` or `fixtures`.
204
+
205
+ ## Preferred exports template
206
+
207
+ ```json
208
+ {
209
+ "type": "module",
210
+ "main": "./dist/index.js",
211
+ "types": "./dist/index.d.ts",
212
+ "exports": {
213
+ "./package.json": "./package.json",
214
+ ".": {
215
+ "types": "./dist/index.d.ts",
216
+ "default": "./dist/index.js"
217
+ },
218
+ "./src": {
219
+ "types": "./src/index.ts",
220
+ "default": "./src/index.ts"
221
+ },
222
+ "./src/*": {
223
+ "types": "./src/*.ts",
224
+ "default": "./src/*.ts" // or .tsx for packages that export React components. if so all files should end with .tsx
225
+ }
226
+ }
227
+ }
228
+ ```
229
+
230
+ ## Package.json `imports` map (internal `#` aliases)
231
+
232
+ Use `imports` when you need a package to swap between different implementations
233
+ based on runtime (Node vs Bun vs browser vs SQLite vs better-sqlite3, etc.).
234
+ Internal imports are `#`-prefixed, scoped to the package itself, and never
235
+ leak to consumers. Consumers resolve through `exports`, not `imports`.
236
+
237
+ ### Point `types` at `dist`, not `src`
238
+
239
+ The TypeScript docs are explicit about this:
240
+
241
+ > If the package.json is part of the local project, an additional remapping
242
+ > step is performed in order to find the **input** TypeScript implementation
243
+ > file... This remapping uses the `outDir`/`declarationDir` and `rootDir`
244
+ > from the tsconfig.json, so using `"imports"` usually requires an explicit
245
+ > `rootDir` to be set.
246
+ >
247
+ > This variation allows package authors to write `"imports"` and `"exports"`
248
+ > fields that reference only the compilation outputs that will be published
249
+ > to npm, while still allowing local development to use the original
250
+ > TypeScript source files.
251
+
252
+ In other words, TypeScript automatically walks from `./dist/foo.d.ts` back
253
+ to `./src/foo.ts` using `outDir` → `rootDir` during compilation. You do not
254
+ need to point `types` at `src` manually — **let TypeScript remap it**.
255
+
256
+ ```json
257
+ {
258
+ "imports": {
259
+ "#sqlite": {
260
+ "bun": "./src/platform/bun/sqlite.ts",
261
+ "node": {
262
+ "types": "./dist/platform/node/sqlite.d.ts",
263
+ "default": "./dist/platform/node/sqlite.js"
264
+ },
265
+ "default": {
266
+ "types": "./dist/platform/node/sqlite.d.ts",
267
+ "default": "./dist/platform/node/sqlite.js"
268
+ }
269
+ }
270
+ }
271
+ }
272
+ ```
273
+
274
+ Resolution flow when `tsc` sees `import db from '#sqlite'`:
275
+
276
+ 1. `imports["#sqlite"].node.types` → `./dist/platform/node/sqlite.d.ts`
277
+ 2. package.json is in the local project → apply the remap.
278
+ 3. Replace `outDir` (`dist`) with `rootDir` (`src`) → `./src/platform/node/sqlite.d.ts`
279
+ 4. Replace `.d.ts` with the source extension `.ts` → `./src/platform/node/sqlite.ts`
280
+ 5. Return `./src/platform/node/sqlite.ts` (it exists on a fresh clone, no build needed).
281
+ 6. Otherwise fall back to `./dist/platform/node/sqlite.d.ts`.
282
+
283
+ ### Why dist-first is correct
284
+
285
+ - **No chicken-and-egg.** The remap is compile-time, so `tsc` works on a fresh
286
+ clone without `dist/` existing yet.
287
+ - **Published map describes shipped files.** Every `imports` entry points at
288
+ something that will actually be in the npm tarball. No stale src paths
289
+ leaking into the published package.json.
290
+ - **Works under plain Node.** If the package is loaded by Node without
291
+ TypeScript involvement, Node reads the same `imports` map at runtime and
292
+ resolves to real `dist/*.js` files that exist.
293
+ - **Bun / browser runtime conditions can still point at `src`**, because
294
+ those runtimes execute `.ts` directly and skip the build step.
295
+
296
+ ### Requirements
297
+
298
+ This only works when:
299
+
300
+ - `moduleResolution` is `node16`, `nodenext`, or `bundler`
301
+ - `rootDir` is set explicitly in `tsconfig.json` (the skill's tsconfig rules
302
+ already require `"rootDir": "src"`)
303
+ - `outDir` is set (already in the template)
304
+ - `resolvePackageJsonImports` is not disabled (it is on by default for the
305
+ supported `moduleResolution` modes)
306
+
307
+ ### Anti-pattern: pointing `types` at `src` manually
308
+
309
+ ```json
310
+ {
311
+ "imports": {
312
+ "#sqlite": {
313
+ "node": {
314
+ "types": "./src/platform/node/sqlite.ts", // ❌ don't do this
315
+ "default": "./dist/platform/node/sqlite.js"
316
+ }
317
+ }
318
+ }
319
+ }
320
+ ```
321
+
322
+ This works but:
323
+
324
+ 1. The published `package.json` advertises `src/*.ts` paths that may or may
325
+ not exist depending on what you include in `files`.
326
+ 2. It bypasses TypeScript's built-in remapping, which is the whole point of
327
+ the local-project `imports` feature.
328
+ 3. It is inconsistent with `default` — mixing source (for types) and dist
329
+ (for runtime) paths in the same entry is easy to get wrong.
330
+
331
+ Source of truth: [TypeScript Modules Reference — package.json "imports" and self-name imports](https://www.typescriptlang.org/docs/handbook/modules/reference.html#packagejson-imports-and-self-name-imports).
332
+
333
+ ## tests location
334
+
335
+ test files should be close with the associated source files. for example if you have an utils.ts file you will create utils.test.ts file next to it. with tests, importing from utils. preferred testing framework is vitest (or bun if project already using `bun test` or depends on bun APIs, rare)
336
+
337
+ ## Agent skill
338
+
339
+ If the package ships an agent skill (SKILL.md for AI coding agents), place it
340
+ at:
341
+
342
+ ```
343
+ skills/<package-name>/SKILL.md
344
+ ```
345
+
346
+ Never put `SKILL.md` at the package root. The `skills/<name>/SKILL.md` layout
347
+ matches the convention used by the [`skills`](https://skills.sh) CLI so users
348
+ can install it with:
349
+
350
+ ```bash
351
+ npx -y skills add owner/repo
352
+ ```
353
+
354
+ Add this installation snippet to the README so users know how to get the skill:
355
+
356
+ ```markdown
357
+ ## Agent Skill
358
+
359
+ This package ships a skill file that teaches AI coding agents how and when to
360
+ use it. Install it with:
361
+
362
+ \`\`\`bash
363
+ npx -y skills add owner/repo
364
+ \`\`\`
365
+ ```
366
+
367
+ Remember to add `skills` to the `files` array in `package.json` so the skill
368
+ directory is included when publishing.
369
+
370
+ ### Keep the SKILL.md thin
371
+
372
+ The SKILL.md body should be a **few lines**, not a full docs dump. Put all
373
+ real documentation in `README.md` (which already lives in `files`) and have
374
+ the skill tell the agent to fetch it. This way agents always read the latest
375
+ docs and the skill never goes stale.
376
+
377
+ The body stays thin, but the **frontmatter `description` must be rich**. It
378
+ is what the agent sees in its main context, and it is the only signal the
379
+ agent uses to decide whether to load the skill. Make it long enough to
380
+ cover: what the package is, the core concepts and APIs, concrete trigger
381
+ phrases the user might say, and explicit "ALWAYS load this skill when..."
382
+ conditions. A one-sentence description is almost always too short. See the
383
+ `new-skill` skill for full guidance on writing descriptions.
384
+
385
+ **CLI package template:**
386
+
387
+ ```md
388
+ ---
389
+ name: mypkg
390
+ description: |
391
+ mypkg is <what it does and the core concepts>. It exposes <main commands
392
+ or APIs> and is used for <typical tasks>. ALWAYS load this skill when
393
+ the user mentions mypkg, runs <binary>, edits files that import mypkg,
394
+ or asks about <trigger keywords>. Load it before writing any code that
395
+ touches mypkg so you know the correct usage patterns and gotchas.
396
+ ---
397
+
398
+ # mypkg
399
+
400
+ Every time you use mypkg, you MUST run:
401
+
402
+ \`\`\`bash
403
+ mypkg --help # NEVER pipe to head/tail, read the full output
404
+ \`\`\`
405
+ ```
406
+
407
+ **Library package template:**
408
+
409
+ ```md
410
+ ---
411
+ name: mypkg
412
+ description: |
413
+ mypkg is <what it does and the core concepts>. It exports <main APIs>
414
+ and is used for <typical tasks>. ALWAYS load this skill when the user
415
+ mentions mypkg, imports from mypkg, edits files that depend on it, or
416
+ asks about <trigger keywords>. Load it before writing any code that
417
+ touches mypkg so you know the correct usage patterns and gotchas.
418
+ ---
419
+
420
+ # mypkg
421
+
422
+ Every time you work with mypkg, you MUST fetch the latest README:
423
+
424
+ \`\`\`bash
425
+ curl -s https://raw.githubusercontent.com/owner/repo/main/README.md # NEVER pipe to head/tail
426
+ \`\`\`
427
+ ```
428
+
429
+ Because the SKILL.md body points at the README, the README must contain
430
+ everything the agent needs: API reference, examples, gotchas, and rules.
431
+ See the `new-skill` skill for the full pattern.
432
+
433
+ ## pnpm workspaces
434
+
435
+ When the project is a monorepo, use pnpm workspaces with flat `./*` glob paths
436
+ in `pnpm-workspace.yaml`. All packages live at the repo root as siblings, no
437
+ nested `packages/` directory:
438
+
439
+ ```yaml
440
+ packages:
441
+ - ./*
442
+ ```
443
+
444
+ This means the repo looks like:
445
+
446
+ ```
447
+ my-monorepo/
448
+ package.json # root (private: true)
449
+ pnpm-workspace.yaml
450
+ cli/ # workspace package
451
+ website/ # workspace package
452
+ db/ # workspace package
453
+ errore/ # workspace package (submodule)
454
+ ```
455
+
456
+ ### Common dev dependencies at root
457
+
458
+ Install shared dev tooling **only at the root** `package.json` so every
459
+ workspace package uses the same version without duplicating installs:
460
+
461
+ ```json
462
+ {
463
+ "private": true,
464
+ "devDependencies": {
465
+ "typescript": "^5.9.2",
466
+ "tsx": "^4.20.5",
467
+ "vitest": "^3.2.4",
468
+ "oxfmt": "^0.24.0"
469
+ }
470
+ }
471
+ ```
472
+
473
+ Packages that need these tools (like `tsc` or `vitest`) will resolve them
474
+ from the root `node_modules` via pnpm's hoisting. Do **not** add
475
+ `typescript`, `tsx`, `vitest`, or `oxfmt` as devDependencies in individual
476
+ workspace packages — only add them at root.
477
+
478
+ Package-specific dev dependencies (for example `@types/node`, `rimraf`,
479
+ `prisma`) still go in each package's own `devDependencies`.
480
+
481
+ ### Cross-workspace dependencies
482
+
483
+ Use `workspace:^` (not `workspace:*`) for local package versions so that
484
+ when published, the dependency resolves to a caret range instead of a pinned
485
+ version:
486
+
487
+ ```json
488
+ {
489
+ "dependencies": {
490
+ "my-utils": "workspace:^"
491
+ }
492
+ }
493
+ ```
494
+
495
+ Use `pnpm install package@workspace:^` to add a workspace dependency, or
496
+ add it to `package.json` manually with the `workspace:^` protocol.
497
+
498
+ ## CI (GitHub Actions)
499
+
500
+ Standard CI workflow for pnpm workspace monorepos. Key points:
501
+
502
+ - **Checkout submodules** with `submodules: recursive` if the repo uses git
503
+ submodules (common for shared libraries like errore).
504
+ - **Use `pnpm/action-setup@v4`** with the pnpm version matching your lockfile.
505
+ - **Use Node 24** (or latest LTS) via `actions/setup-node@v4` with `cache: pnpm`.
506
+ - **Build workspace packages** that export from `dist/` before running tests,
507
+ since submodules and some packages have `dist/` gitignored.
508
+ - **Run tests from the package directory**, not root.
509
+
510
+ Example `.github/workflows/ci.yml`:
511
+
512
+ ```yaml
513
+ name: CI
514
+
515
+ on:
516
+ push:
517
+ branches: [main]
518
+ pull_request:
519
+ branches: [main]
520
+
521
+ jobs:
522
+ test:
523
+ name: Tests
524
+ runs-on: ubuntu-latest
525
+ timeout-minutes: 30
526
+
527
+ steps:
528
+ - uses: actions/checkout@v4
529
+ with:
530
+ submodules: recursive
531
+
532
+ - uses: pnpm/action-setup@v4
533
+ with:
534
+ version: 9
535
+
536
+ - uses: actions/setup-node@v4
537
+ with:
538
+ node-version: 24
539
+ cache: pnpm
540
+
541
+ - name: Install dependencies
542
+ run: pnpm install
543
+
544
+ # Submodules and workspace packages with dist/ gitignored
545
+ # need to be built after checkout before anything can import them.
546
+ - name: Build workspace packages with dist/ exports
547
+ run: |
548
+ pnpm --filter my-lib run build
549
+ pnpm --filter my-utils run build
550
+
551
+ - name: Run tests
552
+ run: pnpm test -- --run
553
+ working-directory: cli
554
+ ```
555
+
556
+ If the repo has Prisma schemas, add generate steps before tests:
557
+
558
+ ```yaml
559
+ - name: Generate Prisma client
560
+ run: pnpm generate
561
+ working-directory: cli
562
+ ```
563
+
564
+ ## README
565
+
566
+ for the first section of readme use markup like this
567
+
568
+ ```md
569
+ <div align='center'>
570
+ <br/>
571
+ <br/>
572
+ <h3>projectname</h3>
573
+ <p>8-12 words description of the project. tagline.</p>
574
+ <br/>
575
+ <br/>
576
+ </div>
577
+ ```
578
+ there cannot be markdown inside the html.
579
+
580
+ or a variant with a logo image:
581
+
582
+ ```md
583
+ <div align='center'>
584
+ <br/>
585
+ <br/>
586
+ <img src='https://genql.dev/banner.png' width='380px'>
587
+ <br/>
588
+ <br/>
589
+ <h3>Type safe Graphql query builder</h3>
590
+ <h4>Write Graphql queries with type validation and auto completion</h4>
591
+ <br/>
592
+ <br/>
593
+ </div>
594
+ ```
595
+
596
+ > Notice the use of h3, not h1. and h4 for the tagline
597
+
598
+ ## .gitignore
599
+
600
+ For non-workspace (standalone) packages, always create a `.gitignore` with:
601
+
602
+ ```
603
+ node_modules
604
+ dist
605
+ *.tsbuildinfo
606
+ .DS_Store
607
+ ```
608
+
609
+ Workspace packages inside a monorepo inherit the root `.gitignore`, so this only applies to standalone packages.
610
+
611
+ ## common mistakes
612
+
613
+ - if you need to use zod always use latest version
614
+ - always install packages as dev dependencies if used only for scripts, testing or types only
615
+ - if the package uses `rimraf` in scripts, install it as a dev dependency instead of relying on platform-specific shell behavior
616
+ - never use em-dashes (—) or dashes as inline separators (like `word - word`) in README or documentation. instead restructure the sentence: use periods to split into two sentences, colons, commas, or parentheses
617
+ - never add badge images (shields.io, etc.) or any images you don't have locally in the repo. don't invent image URLs
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: opensrc
3
+ description: Fetch dependency source code to give AI agents deeper implementation context. Use when the agent needs to understand how a library works internally, read source code for a package, fetch implementation details for a dependency, or explore how an npm/PyPI/crates.io package is built. Triggers include "fetch source for", "read the source of", "how does X work internally", "get the implementation of", "opensrc path", or any task requiring access to dependency source code beyond types and docs.
4
+ allowed-tools: Bash(opensrc:*)
5
+ ---
6
+
7
+ # Source Code Fetching with opensrc
8
+
9
+ Fetches dependency source code so agents can read implementations, not just types. Clones repositories at the correct version tag and caches them globally at `~/.opensrc/`.
10
+
11
+ ## Core Pattern
12
+
13
+ ```bash
14
+ rg "parse" $(opensrc path zod)
15
+ cat $(opensrc path zod)/src/types.ts
16
+ find $(opensrc path zod) -name "*.test.ts"
17
+ ```
18
+
19
+ `opensrc path <pkg>` prints the absolute path to cached source. If not cached, it fetches automatically. Progress goes to stderr, path to stdout, so `$(opensrc path ...)` works in subshells.
20
+
21
+ ## Fetching Source Code
22
+
23
+ ```bash
24
+ opensrc path zod
25
+ opensrc path pypi:requests
26
+ opensrc path crates:serde
27
+ opensrc path facebook/react
28
+
29
+ # Multiple packages at once
30
+ opensrc path zod react next
31
+ opensrc path pypi:requests pypi:flask
32
+ opensrc path crates:serde crates:tokio
33
+
34
+ # Specific versions
35
+ opensrc path zod@3.22.0
36
+ opensrc path pypi:flask@3.0.0
37
+ opensrc path owner/repo@v1.0.0
38
+ opensrc path owner/repo#main
39
+ ```
40
+
41
+ ### Version Resolution
42
+
43
+ For npm packages, opensrc auto-detects the installed version from lockfiles (`package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`). Use `--cwd` to resolve from a different project:
44
+
45
+ ```bash
46
+ opensrc path zod --cwd /path/to/project
47
+ ```
48
+
49
+ For PyPI and crates.io, explicit versions or latest are used. For repos, use `@ref` or `#ref` to pin a branch, tag, or commit.
50
+
51
+ ## Managing the Cache
52
+
53
+ Source is cached globally at `~/.opensrc/` (override with `OPENSRC_HOME`).
54
+
55
+ ```bash
56
+ opensrc list # show all cached sources
57
+ opensrc list --json # JSON output
58
+
59
+ opensrc remove zod # remove a package
60
+ opensrc remove facebook/react # remove a repo
61
+
62
+ opensrc clean # remove everything
63
+ opensrc clean --npm # only npm packages
64
+ opensrc clean --pypi # only PyPI packages
65
+ opensrc clean --crates # only crates.io packages
66
+ opensrc clean --packages # all packages, keep repos
67
+ opensrc clean --repos # all repos, keep packages
68
+ ```
69
+
70
+ ## When to Fetch Source
71
+
72
+ Fetch source when you need to:
73
+ - Understand internal behavior that types don't reveal
74
+ - Debug unexpected library behavior
75
+ - Learn patterns from well-known implementations
76
+ - Verify how a function handles edge cases
77
+
78
+ Don't fetch source for simple API usage questions that docs or types can answer.