@vaclav-synacek/pi-coding-agent-termux 0.45.7

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 (478) hide show
  1. package/CHANGELOG.md +1961 -0
  2. package/README.md +1392 -0
  3. package/dist/cli/args.d.ts +42 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +248 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/file-processor.d.ts +15 -0
  8. package/dist/cli/file-processor.d.ts.map +1 -0
  9. package/dist/cli/file-processor.js +79 -0
  10. package/dist/cli/file-processor.js.map +1 -0
  11. package/dist/cli/list-models.d.ts +9 -0
  12. package/dist/cli/list-models.d.ts.map +1 -0
  13. package/dist/cli/list-models.js +92 -0
  14. package/dist/cli/list-models.js.map +1 -0
  15. package/dist/cli/session-picker.d.ts +9 -0
  16. package/dist/cli/session-picker.d.ts.map +1 -0
  17. package/dist/cli/session-picker.js +32 -0
  18. package/dist/cli/session-picker.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +10 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config.d.ts +61 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +141 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/core/agent-session.d.ts +523 -0
  28. package/dist/core/agent-session.d.ts.map +1 -0
  29. package/dist/core/agent-session.js +1795 -0
  30. package/dist/core/agent-session.js.map +1 -0
  31. package/dist/core/auth-storage.d.ts +112 -0
  32. package/dist/core/auth-storage.d.ts.map +1 -0
  33. package/dist/core/auth-storage.js +297 -0
  34. package/dist/core/auth-storage.js.map +1 -0
  35. package/dist/core/bash-executor.d.ts +47 -0
  36. package/dist/core/bash-executor.d.ts.map +1 -0
  37. package/dist/core/bash-executor.js +211 -0
  38. package/dist/core/bash-executor.js.map +1 -0
  39. package/dist/core/compaction/branch-summarization.d.ts +84 -0
  40. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  41. package/dist/core/compaction/branch-summarization.js +235 -0
  42. package/dist/core/compaction/branch-summarization.js.map +1 -0
  43. package/dist/core/compaction/compaction.d.ts +110 -0
  44. package/dist/core/compaction/compaction.d.ts.map +1 -0
  45. package/dist/core/compaction/compaction.js +559 -0
  46. package/dist/core/compaction/compaction.js.map +1 -0
  47. package/dist/core/compaction/index.d.ts +7 -0
  48. package/dist/core/compaction/index.d.ts.map +1 -0
  49. package/dist/core/compaction/index.js +7 -0
  50. package/dist/core/compaction/index.js.map +1 -0
  51. package/dist/core/compaction/utils.d.ts +35 -0
  52. package/dist/core/compaction/utils.d.ts.map +1 -0
  53. package/dist/core/compaction/utils.js +138 -0
  54. package/dist/core/compaction/utils.js.map +1 -0
  55. package/dist/core/event-bus.d.ts +9 -0
  56. package/dist/core/event-bus.d.ts.map +1 -0
  57. package/dist/core/event-bus.js +25 -0
  58. package/dist/core/event-bus.js.map +1 -0
  59. package/dist/core/exec.d.ts +29 -0
  60. package/dist/core/exec.d.ts.map +1 -0
  61. package/dist/core/exec.js +71 -0
  62. package/dist/core/exec.js.map +1 -0
  63. package/dist/core/export-html/index.d.ts +17 -0
  64. package/dist/core/export-html/index.d.ts.map +1 -0
  65. package/dist/core/export-html/index.js +193 -0
  66. package/dist/core/export-html/index.js.map +1 -0
  67. package/dist/core/export-html/template.css +910 -0
  68. package/dist/core/export-html/template.html +54 -0
  69. package/dist/core/export-html/template.js +1329 -0
  70. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  71. package/dist/core/export-html/vendor/marked.min.js +6 -0
  72. package/dist/core/extensions/index.d.ts +10 -0
  73. package/dist/core/extensions/index.d.ts.map +1 -0
  74. package/dist/core/extensions/index.js +9 -0
  75. package/dist/core/extensions/index.js.map +1 -0
  76. package/dist/core/extensions/loader.d.ts +25 -0
  77. package/dist/core/extensions/loader.d.ts.map +1 -0
  78. package/dist/core/extensions/loader.js +383 -0
  79. package/dist/core/extensions/loader.js.map +1 -0
  80. package/dist/core/extensions/runner.d.ts +89 -0
  81. package/dist/core/extensions/runner.d.ts.map +1 -0
  82. package/dist/core/extensions/runner.js +406 -0
  83. package/dist/core/extensions/runner.js.map +1 -0
  84. package/dist/core/extensions/types.d.ts +654 -0
  85. package/dist/core/extensions/types.d.ts.map +1 -0
  86. package/dist/core/extensions/types.js +32 -0
  87. package/dist/core/extensions/types.js.map +1 -0
  88. package/dist/core/extensions/wrapper.d.ts +27 -0
  89. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  90. package/dist/core/extensions/wrapper.js +102 -0
  91. package/dist/core/extensions/wrapper.js.map +1 -0
  92. package/dist/core/footer-data-provider.d.ts +25 -0
  93. package/dist/core/footer-data-provider.d.ts.map +1 -0
  94. package/dist/core/footer-data-provider.js +121 -0
  95. package/dist/core/footer-data-provider.js.map +1 -0
  96. package/dist/core/index.d.ts +9 -0
  97. package/dist/core/index.d.ts.map +1 -0
  98. package/dist/core/index.js +9 -0
  99. package/dist/core/index.js.map +1 -0
  100. package/dist/core/keybindings.d.ts +59 -0
  101. package/dist/core/keybindings.d.ts.map +1 -0
  102. package/dist/core/keybindings.js +151 -0
  103. package/dist/core/keybindings.js.map +1 -0
  104. package/dist/core/messages.d.ts +77 -0
  105. package/dist/core/messages.d.ts.map +1 -0
  106. package/dist/core/messages.js +123 -0
  107. package/dist/core/messages.js.map +1 -0
  108. package/dist/core/model-registry.d.ts +57 -0
  109. package/dist/core/model-registry.d.ts.map +1 -0
  110. package/dist/core/model-registry.js +314 -0
  111. package/dist/core/model-registry.js.map +1 -0
  112. package/dist/core/model-resolver.d.ts +76 -0
  113. package/dist/core/model-resolver.d.ts.map +1 -0
  114. package/dist/core/model-resolver.js +308 -0
  115. package/dist/core/model-resolver.js.map +1 -0
  116. package/dist/core/prompt-templates.d.ts +40 -0
  117. package/dist/core/prompt-templates.d.ts.map +1 -0
  118. package/dist/core/prompt-templates.js +197 -0
  119. package/dist/core/prompt-templates.js.map +1 -0
  120. package/dist/core/sdk.d.ts +181 -0
  121. package/dist/core/sdk.d.ts.map +1 -0
  122. package/dist/core/sdk.js +466 -0
  123. package/dist/core/sdk.js.map +1 -0
  124. package/dist/core/session-manager.d.ts +313 -0
  125. package/dist/core/session-manager.d.ts.map +1 -0
  126. package/dist/core/session-manager.js +996 -0
  127. package/dist/core/session-manager.js.map +1 -0
  128. package/dist/core/settings-manager.d.ts +138 -0
  129. package/dist/core/settings-manager.d.ts.map +1 -0
  130. package/dist/core/settings-manager.js +327 -0
  131. package/dist/core/settings-manager.js.map +1 -0
  132. package/dist/core/skills.d.ts +50 -0
  133. package/dist/core/skills.d.ts.map +1 -0
  134. package/dist/core/skills.js +338 -0
  135. package/dist/core/skills.js.map +1 -0
  136. package/dist/core/system-prompt.d.ts +48 -0
  137. package/dist/core/system-prompt.d.ts.map +1 -0
  138. package/dist/core/system-prompt.js +224 -0
  139. package/dist/core/system-prompt.js.map +1 -0
  140. package/dist/core/timings.d.ts +7 -0
  141. package/dist/core/timings.d.ts.map +1 -0
  142. package/dist/core/timings.js +25 -0
  143. package/dist/core/timings.js.map +1 -0
  144. package/dist/core/tools/bash.d.ts +42 -0
  145. package/dist/core/tools/bash.d.ts.map +1 -0
  146. package/dist/core/tools/bash.js +223 -0
  147. package/dist/core/tools/bash.js.map +1 -0
  148. package/dist/core/tools/edit-diff.d.ts +33 -0
  149. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  150. package/dist/core/tools/edit-diff.js +171 -0
  151. package/dist/core/tools/edit-diff.js.map +1 -0
  152. package/dist/core/tools/edit.d.ts +37 -0
  153. package/dist/core/tools/edit.d.ts.map +1 -0
  154. package/dist/core/tools/edit.js +143 -0
  155. package/dist/core/tools/edit.js.map +1 -0
  156. package/dist/core/tools/find.d.ts +37 -0
  157. package/dist/core/tools/find.d.ts.map +1 -0
  158. package/dist/core/tools/find.js +206 -0
  159. package/dist/core/tools/find.js.map +1 -0
  160. package/dist/core/tools/grep.d.ts +43 -0
  161. package/dist/core/tools/grep.d.ts.map +1 -0
  162. package/dist/core/tools/grep.js +239 -0
  163. package/dist/core/tools/grep.js.map +1 -0
  164. package/dist/core/tools/index.d.ts +70 -0
  165. package/dist/core/tools/index.d.ts.map +1 -0
  166. package/dist/core/tools/index.js +56 -0
  167. package/dist/core/tools/index.js.map +1 -0
  168. package/dist/core/tools/ls.d.ts +38 -0
  169. package/dist/core/tools/ls.d.ts.map +1 -0
  170. package/dist/core/tools/ls.js +118 -0
  171. package/dist/core/tools/ls.js.map +1 -0
  172. package/dist/core/tools/path-utils.d.ts +8 -0
  173. package/dist/core/tools/path-utils.d.ts.map +1 -0
  174. package/dist/core/tools/path-utils.js +53 -0
  175. package/dist/core/tools/path-utils.js.map +1 -0
  176. package/dist/core/tools/read.d.ts +37 -0
  177. package/dist/core/tools/read.d.ts.map +1 -0
  178. package/dist/core/tools/read.js +165 -0
  179. package/dist/core/tools/read.js.map +1 -0
  180. package/dist/core/tools/truncate.d.ts +70 -0
  181. package/dist/core/tools/truncate.d.ts.map +1 -0
  182. package/dist/core/tools/truncate.js +205 -0
  183. package/dist/core/tools/truncate.js.map +1 -0
  184. package/dist/core/tools/write.d.ts +27 -0
  185. package/dist/core/tools/write.d.ts.map +1 -0
  186. package/dist/core/tools/write.js +78 -0
  187. package/dist/core/tools/write.js.map +1 -0
  188. package/dist/index.d.ts +19 -0
  189. package/dist/index.d.ts.map +1 -0
  190. package/dist/index.js +35 -0
  191. package/dist/index.js.map +1 -0
  192. package/dist/main.d.ts +8 -0
  193. package/dist/main.d.ts.map +1 -0
  194. package/dist/main.js +354 -0
  195. package/dist/main.js.map +1 -0
  196. package/dist/migrations.d.ts +33 -0
  197. package/dist/migrations.d.ts.map +1 -0
  198. package/dist/migrations.js +261 -0
  199. package/dist/migrations.js.map +1 -0
  200. package/dist/modes/index.d.ts +9 -0
  201. package/dist/modes/index.d.ts.map +1 -0
  202. package/dist/modes/index.js +8 -0
  203. package/dist/modes/index.js.map +1 -0
  204. package/dist/modes/interactive/components/armin.d.ts +34 -0
  205. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  206. package/dist/modes/interactive/components/armin.js +333 -0
  207. package/dist/modes/interactive/components/armin.js.map +1 -0
  208. package/dist/modes/interactive/components/assistant-message.d.ts +15 -0
  209. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  210. package/dist/modes/interactive/components/assistant-message.js +89 -0
  211. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  212. package/dist/modes/interactive/components/bash-execution.d.ts +35 -0
  213. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  214. package/dist/modes/interactive/components/bash-execution.js +161 -0
  215. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  216. package/dist/modes/interactive/components/bordered-loader.d.ts +12 -0
  217. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  218. package/dist/modes/interactive/components/bordered-loader.js +30 -0
  219. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  220. package/dist/modes/interactive/components/branch-summary-message.d.ts +15 -0
  221. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  222. package/dist/modes/interactive/components/branch-summary-message.js +39 -0
  223. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  224. package/dist/modes/interactive/components/compaction-summary-message.d.ts +15 -0
  225. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  226. package/dist/modes/interactive/components/compaction-summary-message.js +40 -0
  227. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  228. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  229. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  230. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  231. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  232. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  233. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  234. package/dist/modes/interactive/components/custom-editor.js +69 -0
  235. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  236. package/dist/modes/interactive/components/custom-message.d.ts +19 -0
  237. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  238. package/dist/modes/interactive/components/custom-message.js +84 -0
  239. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  240. package/dist/modes/interactive/components/diff.d.ts +12 -0
  241. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  242. package/dist/modes/interactive/components/diff.js +133 -0
  243. package/dist/modes/interactive/components/diff.js.map +1 -0
  244. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  245. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  246. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  247. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  248. package/dist/modes/interactive/components/extension-editor.d.ts +15 -0
  249. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  250. package/dist/modes/interactive/components/extension-editor.js +96 -0
  251. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  252. package/dist/modes/interactive/components/extension-input.d.ts +20 -0
  253. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  254. package/dist/modes/interactive/components/extension-input.js +51 -0
  255. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  256. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  257. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  258. package/dist/modes/interactive/components/extension-selector.js +73 -0
  259. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  260. package/dist/modes/interactive/components/footer.d.ts +26 -0
  261. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  262. package/dist/modes/interactive/components/footer.js +207 -0
  263. package/dist/modes/interactive/components/footer.js.map +1 -0
  264. package/dist/modes/interactive/components/index.d.ts +29 -0
  265. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  266. package/dist/modes/interactive/components/index.js +30 -0
  267. package/dist/modes/interactive/components/index.js.map +1 -0
  268. package/dist/modes/interactive/components/login-dialog.d.ts +39 -0
  269. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  270. package/dist/modes/interactive/components/login-dialog.js +135 -0
  271. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  272. package/dist/modes/interactive/components/model-selector.d.ts +35 -0
  273. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  274. package/dist/modes/interactive/components/model-selector.js +211 -0
  275. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  276. package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
  277. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  278. package/dist/modes/interactive/components/oauth-selector.js +98 -0
  279. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  280. package/dist/modes/interactive/components/scoped-models-selector.d.ts +46 -0
  281. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  282. package/dist/modes/interactive/components/scoped-models-selector.js +258 -0
  283. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  284. package/dist/modes/interactive/components/session-selector.d.ts +44 -0
  285. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  286. package/dist/modes/interactive/components/session-selector.js +311 -0
  287. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  288. package/dist/modes/interactive/components/settings-selector.d.ts +43 -0
  289. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  290. package/dist/modes/interactive/components/settings-selector.js +219 -0
  291. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  292. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  293. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  294. package/dist/modes/interactive/components/show-images-selector.js +35 -0
  295. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  296. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  297. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  298. package/dist/modes/interactive/components/theme-selector.js +46 -0
  299. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  300. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  301. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  302. package/dist/modes/interactive/components/thinking-selector.js +47 -0
  303. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  304. package/dist/modes/interactive/components/tool-execution.d.ts +70 -0
  305. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  306. package/dist/modes/interactive/components/tool-execution.js +606 -0
  307. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  308. package/dist/modes/interactive/components/tree-selector.d.ts +52 -0
  309. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  310. package/dist/modes/interactive/components/tree-selector.js +745 -0
  311. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  312. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  313. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  314. package/dist/modes/interactive/components/user-message-selector.js +113 -0
  315. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  316. package/dist/modes/interactive/components/user-message.d.ts +8 -0
  317. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  318. package/dist/modes/interactive/components/user-message.js +16 -0
  319. package/dist/modes/interactive/components/user-message.js.map +1 -0
  320. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  321. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  322. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  323. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  324. package/dist/modes/interactive/interactive-mode.d.ts +261 -0
  325. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  326. package/dist/modes/interactive/interactive-mode.js +3194 -0
  327. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  328. package/dist/modes/interactive/theme/dark.json +85 -0
  329. package/dist/modes/interactive/theme/light.json +84 -0
  330. package/dist/modes/interactive/theme/theme-schema.json +308 -0
  331. package/dist/modes/interactive/theme/theme.d.ts +71 -0
  332. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  333. package/dist/modes/interactive/theme/theme.js +893 -0
  334. package/dist/modes/interactive/theme/theme.js.map +1 -0
  335. package/dist/modes/print-mode.d.ts +28 -0
  336. package/dist/modes/print-mode.d.ts.map +1 -0
  337. package/dist/modes/print-mode.js +140 -0
  338. package/dist/modes/print-mode.js.map +1 -0
  339. package/dist/modes/rpc/rpc-client.d.ts +209 -0
  340. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  341. package/dist/modes/rpc/rpc-client.js +392 -0
  342. package/dist/modes/rpc/rpc-client.js.map +1 -0
  343. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  344. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  345. package/dist/modes/rpc/rpc-mode.js +486 -0
  346. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  347. package/dist/modes/rpc/rpc-types.d.ts +372 -0
  348. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  349. package/dist/modes/rpc/rpc-types.js +8 -0
  350. package/dist/modes/rpc/rpc-types.js.map +1 -0
  351. package/dist/utils/changelog.d.ts +21 -0
  352. package/dist/utils/changelog.d.ts.map +1 -0
  353. package/dist/utils/changelog.js +87 -0
  354. package/dist/utils/changelog.js.map +1 -0
  355. package/dist/utils/clipboard-image.d.ts +11 -0
  356. package/dist/utils/clipboard-image.d.ts.map +1 -0
  357. package/dist/utils/clipboard-image.js +129 -0
  358. package/dist/utils/clipboard-image.js.map +1 -0
  359. package/dist/utils/clipboard.d.ts +2 -0
  360. package/dist/utils/clipboard.d.ts.map +1 -0
  361. package/dist/utils/clipboard.js +73 -0
  362. package/dist/utils/clipboard.js.map +1 -0
  363. package/dist/utils/image-convert.d.ts +9 -0
  364. package/dist/utils/image-convert.d.ts.map +1 -0
  365. package/dist/utils/image-convert.js +31 -0
  366. package/dist/utils/image-convert.js.map +1 -0
  367. package/dist/utils/image-resize.d.ts +36 -0
  368. package/dist/utils/image-resize.d.ts.map +1 -0
  369. package/dist/utils/image-resize.js +188 -0
  370. package/dist/utils/image-resize.js.map +1 -0
  371. package/dist/utils/mime.d.ts +2 -0
  372. package/dist/utils/mime.d.ts.map +1 -0
  373. package/dist/utils/mime.js +26 -0
  374. package/dist/utils/mime.js.map +1 -0
  375. package/dist/utils/shell.d.ts +26 -0
  376. package/dist/utils/shell.d.ts.map +1 -0
  377. package/dist/utils/shell.js +151 -0
  378. package/dist/utils/shell.js.map +1 -0
  379. package/dist/utils/tools-manager.d.ts +3 -0
  380. package/dist/utils/tools-manager.d.ts.map +1 -0
  381. package/dist/utils/tools-manager.js +187 -0
  382. package/dist/utils/tools-manager.js.map +1 -0
  383. package/dist/utils/vips.d.ts +11 -0
  384. package/dist/utils/vips.d.ts.map +1 -0
  385. package/dist/utils/vips.js +35 -0
  386. package/dist/utils/vips.js.map +1 -0
  387. package/docs/compaction.md +388 -0
  388. package/docs/extensions.md +1524 -0
  389. package/docs/rpc.md +1046 -0
  390. package/docs/sdk.md +1024 -0
  391. package/docs/session.md +255 -0
  392. package/docs/skills.md +317 -0
  393. package/docs/theme.md +617 -0
  394. package/docs/tree.md +201 -0
  395. package/docs/tui.md +797 -0
  396. package/examples/README.md +24 -0
  397. package/examples/extensions/README.md +168 -0
  398. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  399. package/examples/extensions/chalk-logger.ts +26 -0
  400. package/examples/extensions/claude-rules.ts +86 -0
  401. package/examples/extensions/confirm-destructive.ts +59 -0
  402. package/examples/extensions/custom-compaction.ts +114 -0
  403. package/examples/extensions/custom-footer.ts +64 -0
  404. package/examples/extensions/custom-header.ts +72 -0
  405. package/examples/extensions/dirty-repo-guard.ts +56 -0
  406. package/examples/extensions/doom-overlay/README.md +46 -0
  407. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  408. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  409. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  410. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  411. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  412. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  413. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  414. package/examples/extensions/doom-overlay/index.ts +74 -0
  415. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  416. package/examples/extensions/file-trigger.ts +41 -0
  417. package/examples/extensions/git-checkpoint.ts +53 -0
  418. package/examples/extensions/handoff.ts +150 -0
  419. package/examples/extensions/hello.ts +25 -0
  420. package/examples/extensions/interactive-shell.ts +196 -0
  421. package/examples/extensions/mac-system-theme.ts +47 -0
  422. package/examples/extensions/modal-editor.ts +85 -0
  423. package/examples/extensions/model-status.ts +31 -0
  424. package/examples/extensions/notify.ts +25 -0
  425. package/examples/extensions/overlay-qa-tests.ts +881 -0
  426. package/examples/extensions/overlay-test.ts +145 -0
  427. package/examples/extensions/permission-gate.ts +34 -0
  428. package/examples/extensions/pirate.ts +47 -0
  429. package/examples/extensions/plan-mode/README.md +65 -0
  430. package/examples/extensions/plan-mode/index.ts +340 -0
  431. package/examples/extensions/plan-mode/utils.ts +168 -0
  432. package/examples/extensions/preset.ts +398 -0
  433. package/examples/extensions/protected-paths.ts +30 -0
  434. package/examples/extensions/qna.ts +119 -0
  435. package/examples/extensions/question.ts +277 -0
  436. package/examples/extensions/questionnaire.ts +427 -0
  437. package/examples/extensions/rainbow-editor.ts +95 -0
  438. package/examples/extensions/sandbox/index.ts +318 -0
  439. package/examples/extensions/sandbox/package-lock.json +92 -0
  440. package/examples/extensions/sandbox/package.json +19 -0
  441. package/examples/extensions/send-user-message.ts +97 -0
  442. package/examples/extensions/shutdown-command.ts +63 -0
  443. package/examples/extensions/snake.ts +343 -0
  444. package/examples/extensions/ssh.ts +220 -0
  445. package/examples/extensions/status-line.ts +40 -0
  446. package/examples/extensions/subagent/README.md +172 -0
  447. package/examples/extensions/subagent/agents/planner.md +37 -0
  448. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  449. package/examples/extensions/subagent/agents/scout.md +50 -0
  450. package/examples/extensions/subagent/agents/worker.md +24 -0
  451. package/examples/extensions/subagent/agents.ts +156 -0
  452. package/examples/extensions/subagent/index.ts +963 -0
  453. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  454. package/examples/extensions/subagent/prompts/implement.md +10 -0
  455. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  456. package/examples/extensions/summarize.ts +195 -0
  457. package/examples/extensions/timed-confirm.ts +70 -0
  458. package/examples/extensions/todo.ts +299 -0
  459. package/examples/extensions/tool-override.ts +143 -0
  460. package/examples/extensions/tools.ts +146 -0
  461. package/examples/extensions/truncated-tool.ts +192 -0
  462. package/examples/extensions/with-deps/index.ts +36 -0
  463. package/examples/extensions/with-deps/package-lock.json +31 -0
  464. package/examples/extensions/with-deps/package.json +22 -0
  465. package/examples/sdk/01-minimal.ts +22 -0
  466. package/examples/sdk/02-custom-model.ts +49 -0
  467. package/examples/sdk/03-custom-prompt.ts +44 -0
  468. package/examples/sdk/04-skills.ts +47 -0
  469. package/examples/sdk/05-tools.ts +56 -0
  470. package/examples/sdk/06-extensions.ts +79 -0
  471. package/examples/sdk/07-context-files.ts +36 -0
  472. package/examples/sdk/08-prompt-templates.ts +42 -0
  473. package/examples/sdk/09-api-keys-and-oauth.ts +55 -0
  474. package/examples/sdk/10-settings.ts +38 -0
  475. package/examples/sdk/11-sessions.ts +48 -0
  476. package/examples/sdk/12-full-control.ts +72 -0
  477. package/examples/sdk/README.md +150 -0
  478. package/package.json +88 -0
@@ -0,0 +1,255 @@
1
+ # Session File Format
2
+
3
+ Sessions are stored as JSONL (JSON Lines) files. Each line is a JSON object with a `type` field. Session entries form a tree structure via `id`/`parentId` fields, enabling in-place branching without creating new files.
4
+
5
+ ## File Location
6
+
7
+ ```
8
+ ~/.pi/agent/sessions/--<path>--/<timestamp>_<uuid>.jsonl
9
+ ```
10
+
11
+ Where `<path>` is the working directory with `/` replaced by `-`.
12
+
13
+ ## Session Version
14
+
15
+ Sessions have a version field in the header:
16
+
17
+ - **Version 1**: Linear entry sequence (legacy, auto-migrated on load)
18
+ - **Version 2**: Tree structure with `id`/`parentId` linking
19
+ - **Version 3**: Renamed `hookMessage` role to `custom` (extensions unification)
20
+
21
+ Existing sessions are automatically migrated to the current version (v3) when loaded.
22
+
23
+ ## Type Definitions
24
+
25
+ - [`src/core/session-manager.ts`](../src/core/session-manager.ts) - Session entry types
26
+ - [`packages/agent-core/src/types.ts`](../../agent-core/src/types.ts) - `AgentMessage`
27
+ - [`packages/ai/src/types.ts`](../../ai/src/types.ts) - `UserMessage`, `AssistantMessage`, `ToolResultMessage`, `Usage`, `ToolCall`, `ImageContent`, `TextContent`
28
+
29
+ ## Entry Base
30
+
31
+ All entries (except `SessionHeader`) extend `SessionEntryBase`:
32
+
33
+ ```typescript
34
+ interface SessionEntryBase {
35
+ type: string;
36
+ id: string; // 8-char hex ID
37
+ parentId: string | null; // Parent entry ID (null for first entry)
38
+ timestamp: string; // ISO timestamp
39
+ }
40
+ ```
41
+
42
+ ## Entry Types
43
+
44
+ ### SessionHeader
45
+
46
+ First line of the file. Metadata only, not part of the tree (no `id`/`parentId`).
47
+
48
+ ```json
49
+ {"type":"session","version":3,"id":"uuid","timestamp":"2024-12-03T14:00:00.000Z","cwd":"/path/to/project"}
50
+ ```
51
+
52
+ For sessions with a parent (created via `/fork` or `newSession({ parentSession })`):
53
+
54
+ ```json
55
+ {"type":"session","version":3,"id":"uuid","timestamp":"2024-12-03T14:00:00.000Z","cwd":"/path/to/project","parentSession":"/path/to/original/session.jsonl"}
56
+ ```
57
+
58
+ ### SessionMessageEntry
59
+
60
+ A message in the conversation. The `message` field contains an `AgentMessage`.
61
+
62
+ ```json
63
+ {"type":"message","id":"a1b2c3d4","parentId":"prev1234","timestamp":"2024-12-03T14:00:01.000Z","message":{"role":"user","content":"Hello"}}
64
+ {"type":"message","id":"b2c3d4e5","parentId":"a1b2c3d4","timestamp":"2024-12-03T14:00:02.000Z","message":{"role":"assistant","content":[{"type":"text","text":"Hi!"}],"provider":"anthropic","model":"claude-sonnet-4-5","usage":{...},"stopReason":"stop"}}
65
+ {"type":"message","id":"c3d4e5f6","parentId":"b2c3d4e5","timestamp":"2024-12-03T14:00:03.000Z","message":{"role":"toolResult","toolCallId":"call_123","toolName":"bash","content":[{"type":"text","text":"output"}],"isError":false}}
66
+ ```
67
+
68
+ ### ModelChangeEntry
69
+
70
+ Emitted when the user switches models mid-session.
71
+
72
+ ```json
73
+ {"type":"model_change","id":"d4e5f6g7","parentId":"c3d4e5f6","timestamp":"2024-12-03T14:05:00.000Z","provider":"openai","modelId":"gpt-4o"}
74
+ ```
75
+
76
+ ### ThinkingLevelChangeEntry
77
+
78
+ Emitted when the user changes the thinking/reasoning level.
79
+
80
+ ```json
81
+ {"type":"thinking_level_change","id":"e5f6g7h8","parentId":"d4e5f6g7","timestamp":"2024-12-03T14:06:00.000Z","thinkingLevel":"high"}
82
+ ```
83
+
84
+ ### CompactionEntry
85
+
86
+ Created when context is compacted. Stores a summary of earlier messages.
87
+
88
+ ```json
89
+ {"type":"compaction","id":"f6g7h8i9","parentId":"e5f6g7h8","timestamp":"2024-12-03T14:10:00.000Z","summary":"User discussed X, Y, Z...","firstKeptEntryId":"c3d4e5f6","tokensBefore":50000}
90
+ ```
91
+
92
+ Optional fields:
93
+ - `details`: Compaction-implementation specific data (e.g., file operations for default implementation, or custom data for extension implementations)
94
+ - `fromHook`: `true` if generated by an extension, `false`/`undefined` if pi-generated
95
+
96
+ ### BranchSummaryEntry
97
+
98
+ Created when switching branches via `/tree` with an LLM generated summary of the left branch up to the common ancestor. Captures context from the abandoned path.
99
+
100
+ ```json
101
+ {"type":"branch_summary","id":"g7h8i9j0","parentId":"a1b2c3d4","timestamp":"2024-12-03T14:15:00.000Z","fromId":"f6g7h8i9","summary":"Branch explored approach A..."}
102
+ ```
103
+
104
+ Optional fields:
105
+ - `details`: File tracking data (`{ readFiles: string[], modifiedFiles: string[] }`) for default implementation, arbitrary for custom implementation
106
+ - `fromHook`: `true` if generated by an extension
107
+
108
+ ### CustomEntry
109
+
110
+ Extension state persistence. Does NOT participate in LLM context.
111
+
112
+ ```json
113
+ {"type":"custom","id":"h8i9j0k1","parentId":"g7h8i9j0","timestamp":"2024-12-03T14:20:00.000Z","customType":"my-extension","data":{"count":42}}
114
+ ```
115
+
116
+ Use `customType` to identify your extension's entries on reload.
117
+
118
+ ### CustomMessageEntry
119
+
120
+ Extension-injected messages that DO participate in LLM context.
121
+
122
+ ```json
123
+ {"type":"custom_message","id":"i9j0k1l2","parentId":"h8i9j0k1","timestamp":"2024-12-03T14:25:00.000Z","customType":"my-extension","content":"Injected context...","display":true}
124
+ ```
125
+
126
+ Fields:
127
+ - `content`: String or `(TextContent | ImageContent)[]` (same as UserMessage)
128
+ - `display`: `true` = show in TUI with distinct styling, `false` = hidden
129
+ - `details`: Optional extension-specific metadata (not sent to LLM)
130
+
131
+ ### LabelEntry
132
+
133
+ User-defined bookmark/marker on an entry.
134
+
135
+ ```json
136
+ {"type":"label","id":"j0k1l2m3","parentId":"i9j0k1l2","timestamp":"2024-12-03T14:30:00.000Z","targetId":"a1b2c3d4","label":"checkpoint-1"}
137
+ ```
138
+
139
+ Set `label` to `undefined` to clear a label.
140
+
141
+ ### SessionInfoEntry
142
+
143
+ Session metadata (e.g., user-defined display name). Set via `/name` command or `pi.setSessionName()` in extensions.
144
+
145
+ ```json
146
+ {"type":"session_info","id":"k1l2m3n4","parentId":"j0k1l2m3","timestamp":"2024-12-03T14:35:00.000Z","name":"Refactor auth module"}
147
+ ```
148
+
149
+ The session name is displayed in the session selector (`/resume`) instead of the first message when set.
150
+
151
+ ## Tree Structure
152
+
153
+ Entries form a tree:
154
+ - First entry has `parentId: null`
155
+ - Each subsequent entry points to its parent via `parentId`
156
+ - Branching creates new children from an earlier entry
157
+ - The "leaf" is the current position in the tree
158
+
159
+ ```
160
+ [user msg] ─── [assistant] ─── [user msg] ─── [assistant] ─┬─ [user msg] ← current leaf
161
+
162
+ └─ [branch_summary] ─── [user msg] ← alternate branch
163
+ ```
164
+
165
+ ## Context Building
166
+
167
+ `buildSessionContext()` walks from the current leaf to the root, producing the message list for the LLM:
168
+
169
+ 1. Collects all entries on the path
170
+ 2. Extracts current model and thinking level settings
171
+ 3. If a `CompactionEntry` is on the path:
172
+ - Emits the summary first
173
+ - Then messages from `firstKeptEntryId` to compaction
174
+ - Then messages after compaction
175
+ 4. Converts `BranchSummaryEntry` and `CustomMessageEntry` to appropriate message formats
176
+
177
+ ## Parsing Example
178
+
179
+ ```typescript
180
+ import { readFileSync } from "fs";
181
+
182
+ const lines = readFileSync("session.jsonl", "utf8").trim().split("\n");
183
+
184
+ for (const line of lines) {
185
+ const entry = JSON.parse(line);
186
+
187
+ switch (entry.type) {
188
+ case "session":
189
+ console.log(`Session v${entry.version ?? 1}: ${entry.id}`);
190
+ break;
191
+ case "message":
192
+ console.log(`[${entry.id}] ${entry.message.role}: ${JSON.stringify(entry.message.content)}`);
193
+ break;
194
+ case "compaction":
195
+ console.log(`[${entry.id}] Compaction: ${entry.tokensBefore} tokens summarized`);
196
+ break;
197
+ case "branch_summary":
198
+ console.log(`[${entry.id}] Branch from ${entry.fromId}`);
199
+ break;
200
+ case "custom":
201
+ console.log(`[${entry.id}] Custom (${entry.customType}): ${JSON.stringify(entry.data)}`);
202
+ break;
203
+ case "custom_message":
204
+ console.log(`[${entry.id}] Extension message (${entry.customType}): ${entry.content}`);
205
+ break;
206
+ case "label":
207
+ console.log(`[${entry.id}] Label "${entry.label}" on ${entry.targetId}`);
208
+ break;
209
+ case "model_change":
210
+ console.log(`[${entry.id}] Model: ${entry.provider}/${entry.modelId}`);
211
+ break;
212
+ case "thinking_level_change":
213
+ console.log(`[${entry.id}] Thinking: ${entry.thinkingLevel}`);
214
+ break;
215
+ }
216
+ }
217
+ ```
218
+
219
+ ## SessionManager API
220
+
221
+ Key methods for working with sessions programmatically:
222
+
223
+ ### Creation
224
+ - `SessionManager.create(cwd, sessionDir?)` - New session
225
+ - `SessionManager.open(path, sessionDir?)` - Open existing
226
+ - `SessionManager.continueRecent(cwd, sessionDir?)` - Continue most recent or create new
227
+ - `SessionManager.inMemory(cwd?)` - No file persistence
228
+
229
+ ### Appending (all return entry ID)
230
+ - `appendMessage(message)` - Add message
231
+ - `appendThinkingLevelChange(level)` - Record thinking change
232
+ - `appendModelChange(provider, modelId)` - Record model change
233
+ - `appendCompaction(summary, firstKeptEntryId, tokensBefore, details?, fromHook?)` - Add compaction
234
+ - `appendCustomEntry(customType, data?)` - Extension state (not in context)
235
+ - `appendSessionInfo(name)` - Set session display name
236
+ - `appendCustomMessageEntry(customType, content, display, details?)` - Extension message (in context)
237
+ - `appendLabelChange(targetId, label)` - Set/clear label
238
+
239
+ ### Tree Navigation
240
+ - `getLeafId()` - Current position
241
+ - `getLeafEntry()` - Get current leaf entry
242
+ - `getEntry(id)` - Get entry by ID
243
+ - `getBranch(fromId?)` - Walk from entry to root
244
+ - `getTree()` - Get full tree structure
245
+ - `getChildren(parentId)` - Get direct children
246
+ - `getLabel(id)` - Get label for entry
247
+ - `branch(entryId)` - Move leaf to earlier entry
248
+ - `resetLeaf()` - Reset leaf to null (before any entries)
249
+ - `branchWithSummary(entryId, summary, details?, fromHook?)` - Branch with context summary
250
+
251
+ ### Context
252
+ - `buildSessionContext()` - Get messages for LLM
253
+ - `getEntries()` - All entries (excluding header)
254
+ - `getHeader()` - Session metadata
255
+ - `getSessionName()` - Get display name from latest session_info entry
package/docs/skills.md ADDED
@@ -0,0 +1,317 @@
1
+ > pi can create skills. Ask it to build one for your use case.
2
+
3
+ # Skills
4
+
5
+ Skills are self-contained capability packages that the agent loads on-demand. A skill provides specialized workflows, setup instructions, helper scripts, and reference documentation for specific tasks.
6
+
7
+ Pi implements the [Agent Skills standard](https://agentskills.io/specification).
8
+
9
+ **Example use cases:**
10
+ - Web search and content extraction (Brave Search API)
11
+ - Browser automation via Chrome DevTools Protocol
12
+ - Google Calendar, Gmail, Drive integration
13
+ - PDF/DOCX processing and creation
14
+ - Speech-to-text transcription
15
+ - YouTube transcript extraction
16
+
17
+ See [Skill Repositories](#skill-repositories) for ready-to-use skills.
18
+
19
+ ## When to Use Skills
20
+
21
+ | Need | Solution |
22
+ |------|----------|
23
+ | Always-needed context (conventions, commands) | AGENTS.md |
24
+ | User triggers a specific prompt template | Slash command |
25
+ | Additional tool directly callable by the LLM (like read/write/edit/bash) | Custom tool |
26
+ | On-demand capability package (workflows, scripts, setup) | Skill |
27
+
28
+ Skills are loaded when:
29
+ - The agent decides the task matches a skill's description
30
+ - The user explicitly asks to use a skill (e.g., "use the pdf skill to extract tables")
31
+
32
+ **Good skill examples:**
33
+ - Browser automation with helper scripts and CDP workflow
34
+ - Google Calendar CLI with setup instructions and usage patterns
35
+ - PDF processing with multiple tools and extraction patterns
36
+ - Speech-to-text transcription with API setup
37
+
38
+ **Not a good fit for skills:**
39
+ - "Always use TypeScript strict mode" → put in AGENTS.md
40
+ - "Review my code" → make a prompt template
41
+ - Need user confirmation dialogs or custom TUI rendering → make a custom tool
42
+
43
+ ## Skill Structure
44
+
45
+ A skill is a directory with a `SKILL.md` file. Everything else is freeform. Example structure:
46
+
47
+ ```
48
+ my-skill/
49
+ ├── SKILL.md # Required: frontmatter + instructions
50
+ ├── scripts/ # Helper scripts (bash, python, node)
51
+ │ └── process.sh
52
+ ├── references/ # Detailed docs loaded on-demand
53
+ │ └── api-reference.md
54
+ └── assets/ # Templates, images, etc.
55
+ └── template.json
56
+ ```
57
+
58
+ ### SKILL.md Format
59
+
60
+ ```markdown
61
+ ---
62
+ name: my-skill
63
+ description: What this skill does and when to use it. Be specific.
64
+ ---
65
+
66
+ # My Skill
67
+
68
+ ## Setup
69
+
70
+ Run once before first use:
71
+ \`\`\`bash
72
+ cd /path/to/skill && npm install
73
+ \`\`\`
74
+
75
+ ## Usage
76
+
77
+ \`\`\`bash
78
+ ./scripts/process.sh <input>
79
+ \`\`\`
80
+
81
+ ## Workflow
82
+
83
+ 1. First step
84
+ 2. Second step
85
+ 3. Third step
86
+ ```
87
+
88
+ ### Frontmatter Fields
89
+
90
+ Per the [Agent Skills specification](https://agentskills.io/specification#frontmatter-required):
91
+
92
+ | Field | Required | Constraints |
93
+ |-------|----------|-------------|
94
+ | `name` | Yes | Max 64 chars. Lowercase a-z, 0-9, hyphens only. Must match parent directory name. |
95
+ | `description` | Yes | Max 1024 chars. What the skill does and when to use it. |
96
+ | `license` | No | License name or reference to bundled license file. |
97
+ | `compatibility` | No | Max 500 chars. Environment requirements (system packages, network access, etc.). |
98
+ | `metadata` | No | Arbitrary key-value mapping for additional metadata. |
99
+ | `allowed-tools` | No | Space-delimited list of pre-approved tools (experimental). |
100
+
101
+ #### Name Validation
102
+
103
+ The `name` field must:
104
+ - Be 1-64 characters
105
+ - Contain only lowercase letters (a-z), numbers (0-9), and hyphens
106
+ - Not start or end with a hyphen
107
+ - Not contain consecutive hyphens (--)
108
+ - Match the parent directory name exactly
109
+
110
+ Valid: `pdf-processing`, `data-analysis`, `code-review`
111
+ Invalid: `PDF-Processing`, `-pdf`, `pdf--processing`
112
+
113
+ #### Description Best Practices
114
+
115
+ The `description` is critical. It determines when the agent loads the skill. Be specific about both what it does and when to use it.
116
+
117
+ Good:
118
+ ```yaml
119
+ description: Extracts text and tables from PDF files, fills PDF forms, and merges multiple PDFs. Use when working with PDF documents or when the user mentions PDFs, forms, or document extraction.
120
+ ```
121
+
122
+ Poor:
123
+ ```yaml
124
+ description: Helps with PDFs.
125
+ ```
126
+
127
+ ### File References
128
+
129
+ Use relative paths from the skill directory:
130
+
131
+ ```markdown
132
+ See [the reference guide](references/REFERENCE.md) for details.
133
+
134
+ Run the extraction script:
135
+ \`\`\`bash
136
+ ./scripts/extract.py input.pdf
137
+ \`\`\`
138
+ ```
139
+
140
+ ## Skill Locations
141
+
142
+ Skills are discovered from these locations (later wins on name collision):
143
+
144
+ 1. `~/.codex/skills/**/SKILL.md` (Codex CLI, recursive)
145
+ 2. `~/.claude/skills/*/SKILL.md` (Claude Code user, one level)
146
+ 3. `<cwd>/.claude/skills/*/SKILL.md` (Claude Code project, one level)
147
+ 4. `~/.pi/agent/skills/**/SKILL.md` (Pi user, recursive)
148
+ 5. `<cwd>/.pi/skills/**/SKILL.md` (Pi project, recursive)
149
+
150
+ ## Configuration
151
+
152
+ Configure skill loading in `~/.pi/agent/settings.json`:
153
+
154
+ ```json
155
+ {
156
+ "skills": {
157
+ "enabled": true,
158
+ "enableCodexUser": true,
159
+ "enableClaudeUser": true,
160
+ "enableClaudeProject": true,
161
+ "enablePiUser": true,
162
+ "enablePiProject": true,
163
+ "enableSkillCommands": true,
164
+ "customDirectories": ["~/my-skills-repo"],
165
+ "ignoredSkills": ["deprecated-skill"],
166
+ "includeSkills": ["git-*", "docker"]
167
+ }
168
+ }
169
+ ```
170
+
171
+ | Setting | Default | Description |
172
+ |---------|---------|-------------|
173
+ | `enabled` | `true` | Master toggle for all skills |
174
+ | `enableCodexUser` | `true` | Load from `~/.codex/skills/` |
175
+ | `enableClaudeUser` | `true` | Load from `~/.claude/skills/` |
176
+ | `enableClaudeProject` | `true` | Load from `<cwd>/.claude/skills/` |
177
+ | `enablePiUser` | `true` | Load from `~/.pi/agent/skills/` |
178
+ | `enablePiProject` | `true` | Load from `<cwd>/.pi/skills/` |
179
+ | `enableSkillCommands` | `true` | Register skills as `/skill:name` commands |
180
+ | `customDirectories` | `[]` | Additional directories to scan (supports `~` expansion) |
181
+ | `ignoredSkills` | `[]` | Glob patterns to exclude (e.g., `["deprecated-*", "test-skill"]`) |
182
+ | `includeSkills` | `[]` | Glob patterns to include (empty = all; e.g., `["git-*", "docker"]`) |
183
+
184
+ **Note:** `ignoredSkills` takes precedence over both `includeSkills` in settings and the `--skills` CLI flag. A skill matching any ignore pattern will be excluded regardless of include patterns.
185
+
186
+ ### CLI Filtering
187
+
188
+ Use `--skills` to filter skills for a specific invocation:
189
+
190
+ ```bash
191
+ # Only load specific skills
192
+ pi --skills git,docker
193
+
194
+ # Glob patterns
195
+ pi --skills "git-*,docker-*"
196
+
197
+ # All skills matching a prefix
198
+ pi --skills "aws-*"
199
+ ```
200
+
201
+ This overrides the `includeSkills` setting for the current session.
202
+
203
+ ## How Skills Work
204
+
205
+ 1. At startup, pi scans skill locations and extracts names + descriptions
206
+ 2. The system prompt includes available skills in XML format
207
+ 3. When a task matches, the agent uses `read` to load the full SKILL.md
208
+ 4. The agent follows the instructions, using relative paths to reference scripts/assets
209
+
210
+ This is progressive disclosure: only descriptions are always in context, full instructions load on-demand.
211
+
212
+ ## Skill Commands
213
+
214
+ Skills are automatically registered as slash commands with a `/skill:` prefix:
215
+
216
+ ```bash
217
+ /skill:brave-search # Load and execute the brave-search skill
218
+ /skill:pdf-tools extract # Load skill with arguments
219
+ ```
220
+
221
+ Arguments after the command name are appended to the skill content as `User: <args>`.
222
+
223
+ Toggle skill commands via `/settings` or in `settings.json`:
224
+
225
+ ```json
226
+ {
227
+ "skills": {
228
+ "enableSkillCommands": true
229
+ }
230
+ }
231
+ ```
232
+
233
+ | Setting | Default | Description |
234
+ |---------|---------|-------------|
235
+ | `enableSkillCommands` | `true` | Register skills as `/skill:name` commands |
236
+
237
+ ## Validation Warnings
238
+
239
+ Pi validates skills against the Agent Skills standard and warns (but still loads) non-compliant skills:
240
+
241
+ - Name doesn't match parent directory
242
+ - Name exceeds 64 characters
243
+ - Name contains invalid characters
244
+ - Name starts/ends with hyphen or has consecutive hyphens
245
+ - Description missing or exceeds 1024 characters
246
+ - Unknown frontmatter fields
247
+
248
+ Name collisions (same name from different locations) warn and keep the first skill found.
249
+
250
+ ## Example: Web Search Skill
251
+
252
+ ```
253
+ brave-search/
254
+ ├── SKILL.md
255
+ ├── search.js
256
+ └── content.js
257
+ ```
258
+
259
+ **SKILL.md:**
260
+ ```markdown
261
+ ---
262
+ name: brave-search
263
+ description: Web search and content extraction via Brave Search API. Use for searching documentation, facts, or any web content.
264
+ ---
265
+
266
+ # Brave Search
267
+
268
+ ## Setup
269
+
270
+ \`\`\`bash
271
+ cd /path/to/brave-search && npm install
272
+ \`\`\`
273
+
274
+ ## Search
275
+
276
+ \`\`\`bash
277
+ ./search.js "query" # Basic search
278
+ ./search.js "query" --content # Include page content
279
+ \`\`\`
280
+
281
+ ## Extract Page Content
282
+
283
+ \`\`\`bash
284
+ ./content.js https://example.com
285
+ \`\`\`
286
+ ```
287
+
288
+ ## Compatibility
289
+
290
+ **Claude Code**: Pi reads skills from `~/.claude/skills/*/SKILL.md`. The `allowed-tools` and `model` frontmatter fields are ignored.
291
+
292
+ **Codex CLI**: Pi reads skills from `~/.codex/skills/` recursively. Hidden files/directories and symlinks are skipped.
293
+
294
+ ## Skill Repositories
295
+
296
+ For inspiration and ready-to-use skills:
297
+
298
+ - [Anthropic Skills](https://github.com/anthropics/skills) - Official skills for document processing (docx, pdf, pptx, xlsx), web development, and more
299
+ - [Pi Skills](https://github.com/badlogic/pi-skills) - Skills for web search, browser automation, Google APIs, transcription
300
+
301
+ ## Disabling Skills
302
+
303
+ CLI:
304
+ ```bash
305
+ pi --no-skills
306
+ ```
307
+
308
+ Settings (`~/.pi/agent/settings.json`):
309
+ ```json
310
+ {
311
+ "skills": {
312
+ "enabled": false
313
+ }
314
+ }
315
+ ```
316
+
317
+ Use the granular `enable*` flags to disable individual sources (e.g., `enableClaudeUser: false` to skip `~/.claude/skills`).