shortcutxl 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. package/README.md +59 -0
  2. package/agent-docs/README.md +397 -0
  3. package/agent-docs/docs/compaction.md +390 -0
  4. package/agent-docs/docs/custom-provider.md +580 -0
  5. package/agent-docs/docs/development.md +69 -0
  6. package/agent-docs/docs/extensions.md +1971 -0
  7. package/agent-docs/docs/json.md +79 -0
  8. package/agent-docs/docs/keybindings.md +174 -0
  9. package/agent-docs/docs/models.md +293 -0
  10. package/agent-docs/docs/packages.md +209 -0
  11. package/agent-docs/docs/prompt-templates.md +67 -0
  12. package/agent-docs/docs/providers.md +186 -0
  13. package/agent-docs/docs/rpc.md +1317 -0
  14. package/agent-docs/docs/sdk.md +962 -0
  15. package/agent-docs/docs/session.md +412 -0
  16. package/agent-docs/docs/settings.md +223 -0
  17. package/agent-docs/docs/shell-aliases.md +13 -0
  18. package/agent-docs/docs/skills.md +231 -0
  19. package/agent-docs/docs/terminal-setup.md +70 -0
  20. package/agent-docs/docs/termux.md +127 -0
  21. package/agent-docs/docs/themes.md +295 -0
  22. package/agent-docs/docs/tree.md +219 -0
  23. package/agent-docs/docs/tui.md +887 -0
  24. package/agent-docs/docs/windows.md +17 -0
  25. package/agent-docs/examples/README.md +25 -0
  26. package/agent-docs/examples/extensions/README.md +205 -0
  27. package/agent-docs/examples/extensions/antigravity-image-gen.ts +447 -0
  28. package/agent-docs/examples/extensions/auto-commit-on-exit.ts +49 -0
  29. package/agent-docs/examples/extensions/bash-spawn-hook.ts +30 -0
  30. package/agent-docs/examples/extensions/bookmark.ts +50 -0
  31. package/agent-docs/examples/extensions/built-in-tool-renderer.ts +256 -0
  32. package/agent-docs/examples/extensions/claude-rules.ts +86 -0
  33. package/agent-docs/examples/extensions/commands.ts +75 -0
  34. package/agent-docs/examples/extensions/confirm-destructive.ts +59 -0
  35. package/agent-docs/examples/extensions/custom-compaction.ts +126 -0
  36. package/agent-docs/examples/extensions/custom-footer.ts +63 -0
  37. package/agent-docs/examples/extensions/custom-header.ts +73 -0
  38. package/agent-docs/examples/extensions/custom-provider-anthropic/index.ts +660 -0
  39. package/agent-docs/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  40. package/agent-docs/examples/extensions/custom-provider-anthropic/package.json +19 -0
  41. package/agent-docs/examples/extensions/custom-provider-gitlab-duo/index.ts +362 -0
  42. package/agent-docs/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  43. package/agent-docs/examples/extensions/custom-provider-gitlab-duo/test.ts +88 -0
  44. package/agent-docs/examples/extensions/custom-provider-qwen-cli/index.ts +349 -0
  45. package/agent-docs/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
  46. package/agent-docs/examples/extensions/dirty-repo-guard.ts +56 -0
  47. package/agent-docs/examples/extensions/doom-overlay/README.md +46 -0
  48. package/agent-docs/examples/extensions/doom-overlay/doom/build.sh +152 -0
  49. package/agent-docs/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  50. package/agent-docs/examples/extensions/doom-overlay/doom-component.ts +133 -0
  51. package/agent-docs/examples/extensions/doom-overlay/doom-engine.ts +186 -0
  52. package/agent-docs/examples/extensions/doom-overlay/doom-keys.ts +108 -0
  53. package/agent-docs/examples/extensions/doom-overlay/index.ts +74 -0
  54. package/agent-docs/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  55. package/agent-docs/examples/extensions/dynamic-resources/SKILL.md +8 -0
  56. package/agent-docs/examples/extensions/dynamic-resources/dynamic.json +79 -0
  57. package/agent-docs/examples/extensions/dynamic-resources/dynamic.md +5 -0
  58. package/agent-docs/examples/extensions/dynamic-resources/index.ts +15 -0
  59. package/agent-docs/examples/extensions/dynamic-tools.ts +77 -0
  60. package/agent-docs/examples/extensions/event-bus.ts +43 -0
  61. package/agent-docs/examples/extensions/file-trigger.ts +41 -0
  62. package/agent-docs/examples/extensions/git-checkpoint.ts +53 -0
  63. package/agent-docs/examples/extensions/handoff.ts +155 -0
  64. package/agent-docs/examples/extensions/hello.ts +25 -0
  65. package/agent-docs/examples/extensions/inline-bash.ts +94 -0
  66. package/agent-docs/examples/extensions/input-transform.ts +43 -0
  67. package/agent-docs/examples/extensions/interactive-shell.ts +209 -0
  68. package/agent-docs/examples/extensions/mac-system-theme.ts +47 -0
  69. package/agent-docs/examples/extensions/message-renderer.ts +59 -0
  70. package/agent-docs/examples/extensions/minimal-mode.ts +430 -0
  71. package/agent-docs/examples/extensions/modal-editor.ts +90 -0
  72. package/agent-docs/examples/extensions/model-status.ts +31 -0
  73. package/agent-docs/examples/extensions/notify.ts +55 -0
  74. package/agent-docs/examples/extensions/overlay-qa-tests.ts +936 -0
  75. package/agent-docs/examples/extensions/overlay-test.ts +159 -0
  76. package/agent-docs/examples/extensions/permission-gate.ts +37 -0
  77. package/agent-docs/examples/extensions/pirate.ts +47 -0
  78. package/agent-docs/examples/extensions/plan-mode/README.md +65 -0
  79. package/agent-docs/examples/extensions/plan-mode/index.ts +363 -0
  80. package/agent-docs/examples/extensions/plan-mode/utils.ts +173 -0
  81. package/agent-docs/examples/extensions/preset.ts +418 -0
  82. package/agent-docs/examples/extensions/protected-paths.ts +30 -0
  83. package/agent-docs/examples/extensions/qna.ts +122 -0
  84. package/agent-docs/examples/extensions/question.ts +278 -0
  85. package/agent-docs/examples/extensions/questionnaire.ts +440 -0
  86. package/agent-docs/examples/extensions/rainbow-editor.ts +90 -0
  87. package/agent-docs/examples/extensions/reload-runtime.ts +37 -0
  88. package/agent-docs/examples/extensions/rpc-demo.ts +124 -0
  89. package/agent-docs/examples/extensions/sandbox/index.ts +324 -0
  90. package/agent-docs/examples/extensions/sandbox/package-lock.json +92 -0
  91. package/agent-docs/examples/extensions/sandbox/package.json +19 -0
  92. package/agent-docs/examples/extensions/send-user-message.ts +97 -0
  93. package/agent-docs/examples/extensions/session-name.ts +27 -0
  94. package/agent-docs/examples/extensions/shutdown-command.ts +69 -0
  95. package/agent-docs/examples/extensions/snake.ts +343 -0
  96. package/agent-docs/examples/extensions/space-invaders.ts +566 -0
  97. package/agent-docs/examples/extensions/ssh.ts +233 -0
  98. package/agent-docs/examples/extensions/status-line.ts +40 -0
  99. package/agent-docs/examples/extensions/subagent/README.md +172 -0
  100. package/agent-docs/examples/extensions/subagent/agents/planner.md +37 -0
  101. package/agent-docs/examples/extensions/subagent/agents/reviewer.md +35 -0
  102. package/agent-docs/examples/extensions/subagent/agents/scout.md +50 -0
  103. package/agent-docs/examples/extensions/subagent/agents/worker.md +24 -0
  104. package/agent-docs/examples/extensions/subagent/agents.ts +130 -0
  105. package/agent-docs/examples/extensions/subagent/index.ts +1068 -0
  106. package/agent-docs/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  107. package/agent-docs/examples/extensions/subagent/prompts/implement.md +10 -0
  108. package/agent-docs/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  109. package/agent-docs/examples/extensions/summarize.ts +206 -0
  110. package/agent-docs/examples/extensions/system-prompt-header.ts +17 -0
  111. package/agent-docs/examples/extensions/timed-confirm.ts +72 -0
  112. package/agent-docs/examples/extensions/titlebar-spinner.ts +58 -0
  113. package/agent-docs/examples/extensions/todo.ts +314 -0
  114. package/agent-docs/examples/extensions/tool-override.ts +146 -0
  115. package/agent-docs/examples/extensions/tools.ts +145 -0
  116. package/agent-docs/examples/extensions/trigger-compact.ts +40 -0
  117. package/agent-docs/examples/extensions/truncated-tool.ts +194 -0
  118. package/agent-docs/examples/extensions/widget-placement.ts +17 -0
  119. package/agent-docs/examples/extensions/with-deps/index.ts +37 -0
  120. package/agent-docs/examples/extensions/with-deps/package-lock.json +31 -0
  121. package/agent-docs/examples/extensions/with-deps/package.json +22 -0
  122. package/agent-docs/examples/rpc-extension-ui.ts +654 -0
  123. package/agent-docs/examples/sdk/01-minimal.ts +22 -0
  124. package/agent-docs/examples/sdk/02-custom-model.ts +48 -0
  125. package/agent-docs/examples/sdk/03-custom-prompt.ts +55 -0
  126. package/agent-docs/examples/sdk/04-skills.ts +53 -0
  127. package/agent-docs/examples/sdk/05-tools.ts +56 -0
  128. package/agent-docs/examples/sdk/06-extensions.ts +88 -0
  129. package/agent-docs/examples/sdk/07-context-files.ts +40 -0
  130. package/agent-docs/examples/sdk/08-prompt-templates.ts +47 -0
  131. package/agent-docs/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  132. package/agent-docs/examples/sdk/10-settings.ts +54 -0
  133. package/agent-docs/examples/sdk/11-sessions.ts +48 -0
  134. package/agent-docs/examples/sdk/12-full-control.ts +82 -0
  135. package/agent-docs/examples/sdk/README.md +144 -0
  136. package/agent-docs/xll-skill.md +61 -0
  137. package/agent-docs/xll-spec.md +110 -0
  138. package/dist/cli/args.js +290 -0
  139. package/dist/cli/config-selector.js +31 -0
  140. package/dist/cli/file-processor.js +79 -0
  141. package/dist/cli/list-models.js +92 -0
  142. package/dist/cli/package-commands.js +210 -0
  143. package/dist/cli/report-settings-errors.js +11 -0
  144. package/dist/cli/session-picker.js +34 -0
  145. package/dist/cli.js +19 -0
  146. package/dist/config.js +288 -0
  147. package/dist/core/abort.js +15 -0
  148. package/dist/core/agent-loop.js +352 -0
  149. package/dist/core/agent-session.js +2019 -0
  150. package/dist/core/agent.js +410 -0
  151. package/dist/core/auth-storage.js +456 -0
  152. package/dist/core/bash-executor.js +222 -0
  153. package/dist/core/compaction/branch-summarization.js +242 -0
  154. package/dist/core/compaction/compaction.js +610 -0
  155. package/dist/core/compaction/index.js +7 -0
  156. package/dist/core/compaction/utils.js +139 -0
  157. package/dist/core/defaults.js +6 -0
  158. package/dist/core/diagnostics.js +2 -0
  159. package/dist/core/event-bus.js +25 -0
  160. package/dist/core/exec.js +71 -0
  161. package/dist/core/export-html/ansi-to-html.js +256 -0
  162. package/dist/core/export-html/index.js +238 -0
  163. package/dist/core/export-html/session-view-model.js +342 -0
  164. package/dist/core/export-html/template.css +1110 -0
  165. package/dist/core/export-html/template.html +76 -0
  166. package/dist/core/export-html/template.js +1990 -0
  167. package/dist/core/export-html/tool-renderer.js +63 -0
  168. package/dist/core/export-html/vendor/highlight.min.js +7725 -0
  169. package/dist/core/export-html/vendor/marked.min.js +1803 -0
  170. package/dist/core/extensions/index.js +9 -0
  171. package/dist/core/extensions/loader.js +422 -0
  172. package/dist/core/extensions/runner.js +651 -0
  173. package/dist/core/extensions/types.js +35 -0
  174. package/dist/core/extensions/wrapper.js +102 -0
  175. package/dist/core/footer-data-provider.js +162 -0
  176. package/dist/core/index.js +9 -0
  177. package/dist/core/keybindings.js +153 -0
  178. package/dist/core/messages.js +133 -0
  179. package/dist/core/model-registry.js +539 -0
  180. package/dist/core/model-resolver.js +370 -0
  181. package/dist/core/package-manager.js +1485 -0
  182. package/dist/core/prompt-templates.js +253 -0
  183. package/dist/core/resolve-config-value.js +59 -0
  184. package/dist/core/resource-loader.js +700 -0
  185. package/dist/core/sdk.js +197 -0
  186. package/dist/core/session-bash.js +99 -0
  187. package/dist/core/session-compaction.js +165 -0
  188. package/dist/core/session-manager.js +1153 -0
  189. package/dist/core/session-models.js +99 -0
  190. package/dist/core/session-retry.js +155 -0
  191. package/dist/core/settings-manager.js +572 -0
  192. package/dist/core/skills.js +382 -0
  193. package/dist/core/slash-commands.js +31 -0
  194. package/dist/core/system-prompt.js +161 -0
  195. package/dist/core/theme.js +770 -0
  196. package/dist/core/timings.js +26 -0
  197. package/dist/core/tools/bash.js +258 -0
  198. package/dist/core/tools/edit-diff.js +245 -0
  199. package/dist/core/tools/edit.js +148 -0
  200. package/dist/core/tools/find.js +208 -0
  201. package/dist/core/tools/grep.js +246 -0
  202. package/dist/core/tools/index.js +67 -0
  203. package/dist/core/tools/ls.js +123 -0
  204. package/dist/core/tools/path-utils.js +81 -0
  205. package/dist/core/tools/read.js +160 -0
  206. package/dist/core/tools/truncate.js +70 -0
  207. package/dist/core/tools/write.js +82 -0
  208. package/dist/custom/agents/action.js +13 -0
  209. package/dist/custom/agents/document-reader.js +70 -0
  210. package/dist/custom/agents/general.js +26 -0
  211. package/dist/custom/agents/index.js +49 -0
  212. package/dist/custom/agents/installation.js +13 -0
  213. package/dist/custom/agents/types.js +7 -0
  214. package/dist/custom/auth/refresh-timer.js +33 -0
  215. package/dist/custom/auth/shortcut-oauth.js +145 -0
  216. package/dist/custom/constants.js +21 -0
  217. package/dist/custom/context/workbook-summary.js +73 -0
  218. package/dist/custom/credits/shortcut-credits.js +29 -0
  219. package/dist/custom/cron/cron-daemon-entry.js +18 -0
  220. package/dist/custom/cron/daemon-ipc.js +131 -0
  221. package/dist/custom/cron/daemon.js +224 -0
  222. package/dist/custom/cron/jobs.js +226 -0
  223. package/dist/custom/cron/run-log.js +51 -0
  224. package/dist/custom/cron/schedule.js +72 -0
  225. package/dist/custom/cron/status-line.js +98 -0
  226. package/dist/custom/cron/store.js +87 -0
  227. package/dist/custom/cron/types.js +8 -0
  228. package/dist/custom/dev/index.js +59 -0
  229. package/dist/custom/dev/trace-export.js +58 -0
  230. package/dist/custom/ensure-excel.js +63 -0
  231. package/dist/custom/excel-config.js +36 -0
  232. package/dist/custom/preflight.js +422 -0
  233. package/dist/custom/prompts/action.js +100 -0
  234. package/dist/custom/prompts/api.js +66 -0
  235. package/dist/custom/prompts/installation.js +124 -0
  236. package/dist/custom/prompts/shared.js +138 -0
  237. package/dist/custom/providers/llm-usage.js +42 -0
  238. package/dist/custom/providers/message-converter.js +74 -0
  239. package/dist/custom/providers/provider-ids.js +9 -0
  240. package/dist/custom/providers/register-openai-codex-provider.js +27 -0
  241. package/dist/custom/providers/register-shortcut-provider.js +52 -0
  242. package/dist/custom/providers/shortcut-invoke.js +117 -0
  243. package/dist/custom/providers/shortcut-stream.js +252 -0
  244. package/dist/custom/providers/sse-protocol.js +38 -0
  245. package/dist/custom/sync-xll.js +130 -0
  246. package/dist/custom/tools/cron.js +413 -0
  247. package/dist/custom/tools/excel-exec.js +167 -0
  248. package/dist/custom/tools/excel-range.js +50 -0
  249. package/dist/custom/tools/llm-analysis.js +265 -0
  250. package/dist/custom/tools/render-helpers.js +38 -0
  251. package/dist/custom/tools/switch-mode.js +94 -0
  252. package/dist/custom/tools/task/agents.js +6 -0
  253. package/dist/custom/tools/task/index.js +8 -0
  254. package/dist/custom/tools/task/render.js +348 -0
  255. package/dist/custom/tools/task/subprocess.js +320 -0
  256. package/dist/custom/tools/task/task.js +205 -0
  257. package/dist/custom/tools/todo-list.js +195 -0
  258. package/dist/custom/tracing/session-upload.js +93 -0
  259. package/dist/index.js +45 -0
  260. package/dist/main.js +613 -0
  261. package/dist/migrations.js +265 -0
  262. package/dist/modes/index.js +8 -0
  263. package/dist/modes/interactive/components/armin.js +337 -0
  264. package/dist/modes/interactive/components/assistant-message.js +94 -0
  265. package/dist/modes/interactive/components/bash-execution.js +171 -0
  266. package/dist/modes/interactive/components/bordered-loader.js +51 -0
  267. package/dist/modes/interactive/components/branch-summary-message.js +45 -0
  268. package/dist/modes/interactive/components/compaction-summary-message.js +46 -0
  269. package/dist/modes/interactive/components/config-selector.js +488 -0
  270. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  271. package/dist/modes/interactive/components/custom-editor.js +93 -0
  272. package/dist/modes/interactive/components/custom-message.js +81 -0
  273. package/dist/modes/interactive/components/daxnuts.js +140 -0
  274. package/dist/modes/interactive/components/diff.js +133 -0
  275. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  276. package/dist/modes/interactive/components/extension-editor.js +105 -0
  277. package/dist/modes/interactive/components/extension-input.js +61 -0
  278. package/dist/modes/interactive/components/extension-selector.js +78 -0
  279. package/dist/modes/interactive/components/footer.js +309 -0
  280. package/dist/modes/interactive/components/index.js +33 -0
  281. package/dist/modes/interactive/components/keybinding-hints.js +61 -0
  282. package/dist/modes/interactive/components/layout.js +64 -0
  283. package/dist/modes/interactive/components/login-dialog.js +148 -0
  284. package/dist/modes/interactive/components/model-selector.js +237 -0
  285. package/dist/modes/interactive/components/oauth-selector.js +111 -0
  286. package/dist/modes/interactive/components/session-selector-search.js +157 -0
  287. package/dist/modes/interactive/components/session-selector.js +860 -0
  288. package/dist/modes/interactive/components/settings-selector.js +123 -0
  289. package/dist/modes/interactive/components/show-images-selector.js +35 -0
  290. package/dist/modes/interactive/components/skill-invocation-message.js +48 -0
  291. package/dist/modes/interactive/components/theme-selector.js +47 -0
  292. package/dist/modes/interactive/components/thinking-selector.js +47 -0
  293. package/dist/modes/interactive/components/tool-execution.js +789 -0
  294. package/dist/modes/interactive/components/tool-group.js +106 -0
  295. package/dist/modes/interactive/components/tree-selector.js +962 -0
  296. package/dist/modes/interactive/components/user-message-selector.js +115 -0
  297. package/dist/modes/interactive/components/user-message.js +48 -0
  298. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  299. package/dist/modes/interactive/file-attachments.js +135 -0
  300. package/dist/modes/interactive/interactive-mode.js +3775 -0
  301. package/dist/modes/interactive/theme/dark.json +85 -0
  302. package/dist/modes/interactive/theme/light.json +85 -0
  303. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  304. package/dist/modes/interactive/theme/theme.js +177 -0
  305. package/dist/modes/print-mode.js +101 -0
  306. package/dist/modes/rpc/rpc-client.js +387 -0
  307. package/dist/modes/rpc/rpc-mode.js +509 -0
  308. package/dist/modes/rpc/rpc-types.js +8 -0
  309. package/dist/subagent-entry.js +145 -0
  310. package/dist/tool-names.js +34 -0
  311. package/dist/tui/autocomplete.js +596 -0
  312. package/dist/tui/components/box.js +104 -0
  313. package/dist/tui/components/cancellable-loader.js +35 -0
  314. package/dist/tui/components/editor.js +1679 -0
  315. package/dist/tui/components/image.js +69 -0
  316. package/dist/tui/components/input.js +433 -0
  317. package/dist/tui/components/loader.js +49 -0
  318. package/dist/tui/components/markdown.js +629 -0
  319. package/dist/tui/components/select-list.js +152 -0
  320. package/dist/tui/components/settings-list.js +185 -0
  321. package/dist/tui/components/spacer.js +23 -0
  322. package/dist/tui/components/text.js +89 -0
  323. package/dist/tui/components/truncated-text.js +51 -0
  324. package/dist/tui/editor-component.js +2 -0
  325. package/dist/tui/fuzzy.js +107 -0
  326. package/dist/tui/get-east-asian-width/index.js +32 -0
  327. package/dist/tui/get-east-asian-width/lookup.js +404 -0
  328. package/dist/tui/index.js +32 -0
  329. package/dist/tui/keybindings.js +114 -0
  330. package/dist/tui/keys.js +959 -0
  331. package/dist/tui/kill-ring.js +44 -0
  332. package/dist/tui/stdin-buffer.js +317 -0
  333. package/dist/tui/terminal-image.js +288 -0
  334. package/dist/tui/terminal.js +249 -0
  335. package/dist/tui/tui/autocomplete.js +596 -0
  336. package/dist/tui/tui/components/box.js +106 -0
  337. package/dist/tui/tui/components/cancellable-loader.js +35 -0
  338. package/dist/tui/tui/components/editor.js +1679 -0
  339. package/dist/tui/tui/components/image.js +69 -0
  340. package/dist/tui/tui/components/input.js +433 -0
  341. package/dist/tui/tui/components/loader.js +49 -0
  342. package/dist/tui/tui/components/markdown.js +629 -0
  343. package/dist/tui/tui/components/select-list.js +152 -0
  344. package/dist/tui/tui/components/settings-list.js +185 -0
  345. package/dist/tui/tui/components/spacer.js +23 -0
  346. package/dist/tui/tui/components/text.js +91 -0
  347. package/dist/tui/tui/components/truncated-text.js +51 -0
  348. package/dist/tui/tui/editor-component.js +2 -0
  349. package/dist/tui/tui/fuzzy.js +107 -0
  350. package/dist/tui/tui/get-east-asian-width/index.js +32 -0
  351. package/dist/tui/tui/get-east-asian-width/lookup.js +404 -0
  352. package/dist/tui/tui/index.js +32 -0
  353. package/dist/tui/tui/keybindings.js +114 -0
  354. package/dist/tui/tui/keys.js +959 -0
  355. package/dist/tui/tui/kill-ring.js +44 -0
  356. package/dist/tui/tui/stdin-buffer.js +317 -0
  357. package/dist/tui/tui/terminal-image.js +288 -0
  358. package/dist/tui/tui/terminal.js +249 -0
  359. package/dist/tui/tui/tui.js +955 -0
  360. package/dist/tui/tui/undo-stack.js +25 -0
  361. package/dist/tui/tui/utils.js +800 -0
  362. package/dist/tui/tui.js +955 -0
  363. package/dist/tui/undo-stack.js +25 -0
  364. package/dist/tui/utils.js +800 -0
  365. package/dist/utils/changelog.js +87 -0
  366. package/dist/utils/clipboard-image.js +164 -0
  367. package/dist/utils/clipboard-native.js +14 -0
  368. package/dist/utils/clipboard.js +67 -0
  369. package/dist/utils/frontmatter.js +26 -0
  370. package/dist/utils/git.js +166 -0
  371. package/dist/utils/image-convert.js +35 -0
  372. package/dist/utils/image-resize.js +183 -0
  373. package/dist/utils/mime.js +26 -0
  374. package/dist/utils/photon.js +121 -0
  375. package/dist/utils/shell.js +217 -0
  376. package/dist/utils/sleep.js +17 -0
  377. package/dist/utils/tools-manager.js +259 -0
  378. package/package.json +78 -0
  379. package/skills/excel-com-api/SKILL.md +74 -0
  380. package/skills/excel-com-api/excel-type-library.py +27767 -0
  381. package/skills/excel-com-api/office-type-library.py +10867 -0
  382. package/skills/integrations/SKILL.md +138 -0
  383. package/skills/integrations/alphasense.md +457 -0
  384. package/skills/integrations/bloomberg.md +803 -0
  385. package/skills/integrations/calcbench.md +315 -0
  386. package/skills/integrations/capiq.md +848 -0
  387. package/skills/integrations/dynamics-365-finance.md +354 -0
  388. package/skills/integrations/earnings_transcripts.md +387 -0
  389. package/skills/integrations/factset.md +758 -0
  390. package/skills/integrations/ice-fixed-income.md +344 -0
  391. package/skills/integrations/moodys-analytics.md +313 -0
  392. package/skills/integrations/morningstar.md +433 -0
  393. package/skills/integrations/nasdaq-data-link.md +249 -0
  394. package/skills/integrations/pitchbook.md +413 -0
  395. package/skills/integrations/preqin.md +422 -0
  396. package/skills/integrations/quickbooks.md +289 -0
  397. package/skills/integrations/quickfs.md +314 -0
  398. package/skills/integrations/refinitiv.md +473 -0
  399. package/skills/integrations/sage-intacct.md +401 -0
  400. package/skills/integrations/visible-alpha.md +320 -0
  401. package/skills/integrations/xero.md +393 -0
  402. package/skills/integrations/ycharts.md +306 -0
  403. package/skills/pdf-creation/SKILL.md +93 -0
  404. package/skills/pdf-extraction/SKILL.md +32 -0
  405. package/skills/powerpoint-creation/SKILL.md +110 -0
  406. package/skills/sec-edgar/SKILL.md +127 -0
  407. package/skills/sec-edgar/sec_to_pdf.py +109 -0
  408. package/xll/ShortcutXL.xll +0 -0
  409. package/xll/modules/debug_render.py +272 -0
  410. package/xll/modules/gameboy.py +241 -0
  411. package/xll/modules/pong.py +188 -0
  412. package/xll/modules/shortcut_xl/__init__.py +18 -0
  413. package/xll/modules/shortcut_xl/_categorize.py +200 -0
  414. package/xll/modules/shortcut_xl/_com.py +108 -0
  415. package/xll/modules/shortcut_xl/_format.py +252 -0
  416. package/xll/modules/shortcut_xl/_log.py +12 -0
  417. package/xll/modules/shortcut_xl/_managed.py +116 -0
  418. package/xll/modules/shortcut_xl/_registry.py +44 -0
  419. package/xll/modules/shortcut_xl/_threading.py +161 -0
  420. package/xll/modules/shortcut_xl/_tracking.py +283 -0
  421. package/xll/modules/stocks.py +100 -0
  422. package/xll/python3.dll +0 -0
  423. package/xll/python312.dll +0 -0
@@ -0,0 +1,382 @@
1
+ import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from 'fs';
2
+ import ignore from 'ignore';
3
+ import { homedir } from 'os';
4
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'path';
5
+ import { CONFIG_DIR_NAME, getAgentDir } from '../config.js';
6
+ import { parseFrontmatter } from '../utils/frontmatter.js';
7
+ /** Max name length per spec */
8
+ const MAX_NAME_LENGTH = 64;
9
+ /** Max description length per spec */
10
+ const MAX_DESCRIPTION_LENGTH = 1024;
11
+ const IGNORE_FILE_NAMES = ['.gitignore', '.ignore', '.fdignore'];
12
+ function toPosixPath(p) {
13
+ return p.split(sep).join('/');
14
+ }
15
+ function prefixIgnorePattern(line, prefix) {
16
+ const trimmed = line.trim();
17
+ if (!trimmed)
18
+ return null;
19
+ if (trimmed.startsWith('#') && !trimmed.startsWith('\\#'))
20
+ return null;
21
+ let pattern = line;
22
+ let negated = false;
23
+ if (pattern.startsWith('!')) {
24
+ negated = true;
25
+ pattern = pattern.slice(1);
26
+ }
27
+ else if (pattern.startsWith('\\!')) {
28
+ pattern = pattern.slice(1);
29
+ }
30
+ if (pattern.startsWith('/')) {
31
+ pattern = pattern.slice(1);
32
+ }
33
+ const prefixed = prefix ? `${prefix}${pattern}` : pattern;
34
+ return negated ? `!${prefixed}` : prefixed;
35
+ }
36
+ function addIgnoreRules(ig, dir, rootDir) {
37
+ const relativeDir = relative(rootDir, dir);
38
+ const prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : '';
39
+ for (const filename of IGNORE_FILE_NAMES) {
40
+ const ignorePath = join(dir, filename);
41
+ if (!existsSync(ignorePath))
42
+ continue;
43
+ try {
44
+ const content = readFileSync(ignorePath, 'utf-8');
45
+ const patterns = content
46
+ .split(/\r?\n/)
47
+ .map((line) => prefixIgnorePattern(line, prefix))
48
+ .filter((line) => Boolean(line));
49
+ if (patterns.length > 0) {
50
+ ig.add(patterns);
51
+ }
52
+ }
53
+ catch { }
54
+ }
55
+ }
56
+ /**
57
+ * Parse a skill block from message text.
58
+ * Returns null if the text doesn't contain a skill block.
59
+ */
60
+ export function parseSkillBlock(text) {
61
+ const match = text.match(/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/);
62
+ if (!match)
63
+ return null;
64
+ return {
65
+ name: match[1],
66
+ location: match[2],
67
+ content: match[3],
68
+ userMessage: match[4]?.trim() || undefined
69
+ };
70
+ }
71
+ /**
72
+ * Validate skill name per Agent Skills spec.
73
+ * Returns array of validation error messages (empty if valid).
74
+ */
75
+ function validateName(name, parentDirName) {
76
+ const errors = [];
77
+ if (name !== parentDirName) {
78
+ errors.push(`name "${name}" does not match parent directory "${parentDirName}"`);
79
+ }
80
+ if (name.length > MAX_NAME_LENGTH) {
81
+ errors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);
82
+ }
83
+ if (!/^[a-z0-9-]+$/.test(name)) {
84
+ errors.push(`name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)`);
85
+ }
86
+ if (name.startsWith('-') || name.endsWith('-')) {
87
+ errors.push(`name must not start or end with a hyphen`);
88
+ }
89
+ if (name.includes('--')) {
90
+ errors.push(`name must not contain consecutive hyphens`);
91
+ }
92
+ return errors;
93
+ }
94
+ /**
95
+ * Validate description per Agent Skills spec.
96
+ */
97
+ function validateDescription(description) {
98
+ const errors = [];
99
+ if (!description || description.trim() === '') {
100
+ errors.push('description is required');
101
+ }
102
+ else if (description.length > MAX_DESCRIPTION_LENGTH) {
103
+ errors.push(`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`);
104
+ }
105
+ return errors;
106
+ }
107
+ /**
108
+ * Load skills from a directory.
109
+ *
110
+ * Discovery rules:
111
+ * - direct .md children in the root
112
+ * - recursive SKILL.md under subdirectories
113
+ */
114
+ export function loadSkillsFromDir(options) {
115
+ const { dir, source } = options;
116
+ return loadSkillsFromDirInternal(dir, source, true);
117
+ }
118
+ function loadSkillsFromDirInternal(dir, source, includeRootFiles, ignoreMatcher, rootDir) {
119
+ const skills = [];
120
+ const diagnostics = [];
121
+ if (!existsSync(dir)) {
122
+ return { skills, diagnostics };
123
+ }
124
+ const root = rootDir ?? dir;
125
+ const ig = ignoreMatcher ?? ignore();
126
+ addIgnoreRules(ig, dir, root);
127
+ try {
128
+ const entries = readdirSync(dir, { withFileTypes: true });
129
+ for (const entry of entries) {
130
+ if (entry.name.startsWith('.')) {
131
+ continue;
132
+ }
133
+ // Skip node_modules to avoid scanning dependencies
134
+ if (entry.name === 'node_modules') {
135
+ continue;
136
+ }
137
+ const fullPath = join(dir, entry.name);
138
+ // For symlinks, check if they point to a directory and follow them
139
+ let isDirectory = entry.isDirectory();
140
+ let isFile = entry.isFile();
141
+ if (entry.isSymbolicLink()) {
142
+ try {
143
+ const stats = statSync(fullPath);
144
+ isDirectory = stats.isDirectory();
145
+ isFile = stats.isFile();
146
+ }
147
+ catch {
148
+ // Broken symlink, skip it
149
+ continue;
150
+ }
151
+ }
152
+ const relPath = toPosixPath(relative(root, fullPath));
153
+ const ignorePath = isDirectory ? `${relPath}/` : relPath;
154
+ if (ig.ignores(ignorePath)) {
155
+ continue;
156
+ }
157
+ if (isDirectory) {
158
+ const subResult = loadSkillsFromDirInternal(fullPath, source, false, ig, root);
159
+ skills.push(...subResult.skills);
160
+ diagnostics.push(...subResult.diagnostics);
161
+ continue;
162
+ }
163
+ if (!isFile) {
164
+ continue;
165
+ }
166
+ const isRootMd = includeRootFiles && entry.name.endsWith('.md');
167
+ const isSkillMd = !includeRootFiles && entry.name === 'SKILL.md';
168
+ if (!isRootMd && !isSkillMd) {
169
+ continue;
170
+ }
171
+ const result = loadSkillFromFile(fullPath, source);
172
+ if (result.skill) {
173
+ skills.push(result.skill);
174
+ }
175
+ diagnostics.push(...result.diagnostics);
176
+ }
177
+ }
178
+ catch { }
179
+ return { skills, diagnostics };
180
+ }
181
+ function loadSkillFromFile(filePath, source) {
182
+ const diagnostics = [];
183
+ try {
184
+ const rawContent = readFileSync(filePath, 'utf-8');
185
+ const { frontmatter } = parseFrontmatter(rawContent);
186
+ const skillDir = dirname(filePath);
187
+ const parentDirName = basename(skillDir);
188
+ // Validate description
189
+ const descErrors = validateDescription(frontmatter.description);
190
+ for (const error of descErrors) {
191
+ diagnostics.push({ type: 'warning', message: error, path: filePath });
192
+ }
193
+ // Use name from frontmatter, or fall back to parent directory name
194
+ const name = frontmatter.name || parentDirName;
195
+ // Validate name
196
+ const nameErrors = validateName(name, parentDirName);
197
+ for (const error of nameErrors) {
198
+ diagnostics.push({ type: 'warning', message: error, path: filePath });
199
+ }
200
+ // Still load the skill even with warnings (unless description is completely missing)
201
+ if (!frontmatter.description || frontmatter.description.trim() === '') {
202
+ return { skill: null, diagnostics };
203
+ }
204
+ return {
205
+ skill: {
206
+ name,
207
+ description: frontmatter.description,
208
+ filePath,
209
+ baseDir: skillDir,
210
+ source,
211
+ disableModelInvocation: frontmatter['disable-model-invocation'] === true
212
+ },
213
+ diagnostics
214
+ };
215
+ }
216
+ catch (error) {
217
+ const message = error instanceof Error ? error.message : 'failed to parse skill file';
218
+ diagnostics.push({ type: 'warning', message, path: filePath });
219
+ return { skill: null, diagnostics };
220
+ }
221
+ }
222
+ /**
223
+ * Format skills for inclusion in a system prompt.
224
+ * Uses XML format per Agent Skills standard.
225
+ * See: https://agentskills.io/integrate-skills
226
+ *
227
+ * Skills with disableModelInvocation=true are excluded from the prompt
228
+ * (they can only be invoked explicitly via /skill:name commands).
229
+ */
230
+ export function formatSkillsForPrompt(skills) {
231
+ const visibleSkills = skills.filter((s) => !s.disableModelInvocation);
232
+ if (visibleSkills.length === 0) {
233
+ return '';
234
+ }
235
+ const lines = [
236
+ '\n\nThe following skills provide specialized instructions for specific tasks.',
237
+ "Use the read tool to load a skill's file when the task matches its description.",
238
+ 'When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.',
239
+ ''
240
+ ];
241
+ for (const skill of visibleSkills) {
242
+ lines.push(`${skill.name}: ${skill.description}`);
243
+ lines.push(`\t${skill.filePath}`);
244
+ }
245
+ return lines.join('\n');
246
+ }
247
+ function _escapeXml(str) {
248
+ return str
249
+ .replace(/&/g, '&amp;')
250
+ .replace(/</g, '&lt;')
251
+ .replace(/>/g, '&gt;')
252
+ .replace(/"/g, '&quot;')
253
+ .replace(/'/g, '&apos;');
254
+ }
255
+ function normalizePath(input) {
256
+ const trimmed = input.trim();
257
+ if (trimmed === '~')
258
+ return homedir();
259
+ if (trimmed.startsWith('~/'))
260
+ return join(homedir(), trimmed.slice(2));
261
+ if (trimmed.startsWith('~'))
262
+ return join(homedir(), trimmed.slice(1));
263
+ return trimmed;
264
+ }
265
+ function resolveSkillPath(p, cwd) {
266
+ const normalized = normalizePath(p);
267
+ return isAbsolute(normalized) ? normalized : resolve(cwd, normalized);
268
+ }
269
+ /**
270
+ * Load skills from all configured locations.
271
+ * Returns skills and any validation diagnostics.
272
+ */
273
+ export function loadSkills(options = {}) {
274
+ const { cwd = process.cwd(), agentDir, skillPaths = [], includeDefaults = true } = options;
275
+ // Resolve agentDir - if not provided, use default from config
276
+ const resolvedAgentDir = agentDir ?? getAgentDir();
277
+ const skillMap = new Map();
278
+ const realPathSet = new Set();
279
+ const allDiagnostics = [];
280
+ const collisionDiagnostics = [];
281
+ function addSkills(result) {
282
+ allDiagnostics.push(...result.diagnostics);
283
+ for (const skill of result.skills) {
284
+ // Resolve symlinks to detect duplicate files
285
+ let realPath;
286
+ try {
287
+ realPath = realpathSync(skill.filePath);
288
+ }
289
+ catch {
290
+ realPath = skill.filePath;
291
+ }
292
+ // Skip silently if we've already loaded this exact file (via symlink)
293
+ if (realPathSet.has(realPath)) {
294
+ continue;
295
+ }
296
+ const existing = skillMap.get(skill.name);
297
+ if (existing) {
298
+ collisionDiagnostics.push({
299
+ type: 'collision',
300
+ message: `name "${skill.name}" collision`,
301
+ path: skill.filePath,
302
+ collision: {
303
+ resourceType: 'skill',
304
+ name: skill.name,
305
+ winnerPath: existing.filePath,
306
+ loserPath: skill.filePath
307
+ }
308
+ });
309
+ }
310
+ else {
311
+ skillMap.set(skill.name, skill);
312
+ realPathSet.add(realPath);
313
+ }
314
+ }
315
+ }
316
+ if (includeDefaults) {
317
+ addSkills(loadSkillsFromDirInternal(join(resolvedAgentDir, 'skills'), 'user', true));
318
+ addSkills(loadSkillsFromDirInternal(resolve(cwd, CONFIG_DIR_NAME, 'skills'), 'project', true));
319
+ }
320
+ const userSkillsDir = join(resolvedAgentDir, 'skills');
321
+ const projectSkillsDir = resolve(cwd, CONFIG_DIR_NAME, 'skills');
322
+ const isUnderPath = (target, root) => {
323
+ const normalizedRoot = resolve(root);
324
+ if (target === normalizedRoot) {
325
+ return true;
326
+ }
327
+ const prefix = normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`;
328
+ return target.startsWith(prefix);
329
+ };
330
+ const getSource = (resolvedPath) => {
331
+ if (!includeDefaults) {
332
+ if (isUnderPath(resolvedPath, userSkillsDir))
333
+ return 'user';
334
+ if (isUnderPath(resolvedPath, projectSkillsDir))
335
+ return 'project';
336
+ }
337
+ return 'path';
338
+ };
339
+ for (const rawPath of skillPaths) {
340
+ const resolvedPath = resolveSkillPath(rawPath, cwd);
341
+ if (!existsSync(resolvedPath)) {
342
+ allDiagnostics.push({
343
+ type: 'warning',
344
+ message: 'skill path does not exist',
345
+ path: resolvedPath
346
+ });
347
+ continue;
348
+ }
349
+ try {
350
+ const stats = statSync(resolvedPath);
351
+ const source = getSource(resolvedPath);
352
+ if (stats.isDirectory()) {
353
+ addSkills(loadSkillsFromDirInternal(resolvedPath, source, true));
354
+ }
355
+ else if (stats.isFile() && resolvedPath.endsWith('.md')) {
356
+ const result = loadSkillFromFile(resolvedPath, source);
357
+ if (result.skill) {
358
+ addSkills({ skills: [result.skill], diagnostics: result.diagnostics });
359
+ }
360
+ else {
361
+ allDiagnostics.push(...result.diagnostics);
362
+ }
363
+ }
364
+ else {
365
+ allDiagnostics.push({
366
+ type: 'warning',
367
+ message: 'skill path is not a markdown file',
368
+ path: resolvedPath
369
+ });
370
+ }
371
+ }
372
+ catch (error) {
373
+ const message = error instanceof Error ? error.message : 'failed to read skill path';
374
+ allDiagnostics.push({ type: 'warning', message, path: resolvedPath });
375
+ }
376
+ }
377
+ return {
378
+ skills: Array.from(skillMap.values()),
379
+ diagnostics: [...allDiagnostics, ...collisionDiagnostics]
380
+ };
381
+ }
382
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1,31 @@
1
+ const ALL_BUILTIN_SLASH_COMMANDS = [
2
+ // Auth
3
+ { name: 'login', description: 'Login with OAuth provider' },
4
+ { name: 'logout', description: 'Logout from OAuth provider' },
5
+ // Session
6
+ { name: 'clear', description: 'Start a new session' },
7
+ { name: 'quit', description: 'Quit' },
8
+ // Model
9
+ { name: 'model', description: 'Select model' },
10
+ { name: 'thinking', description: 'Select thinking level' },
11
+ { name: 'hide-thinking', description: 'Toggle visibility of thinking blocks' },
12
+ // Checkpointing
13
+ { name: 'resume', description: 'Resume a different session' },
14
+ { name: 'tree', description: 'Navigate session tree (go back to previous messages)' },
15
+ { name: 'session', description: 'Show session info and stats' },
16
+ // Everything else
17
+ { name: 'settings', description: 'Open settings menu' },
18
+ { name: 'trace', description: 'Open session traces in browser' },
19
+ { name: 'hotkeys', description: 'Show all keyboard shortcuts' },
20
+ { name: 'skills', description: 'Show loaded skills' },
21
+ { name: 'reload', description: 'Reload extensions, skills, prompts, and themes' }
22
+ ];
23
+ /** Dev-only slash commands, consumed by custom/dev/ to keep env checks out of vendor code. */
24
+ export const ALL_DEV_SLASH_COMMANDS = ALL_BUILTIN_SLASH_COMMANDS.filter((cmd) => cmd.dev);
25
+ /** All builtin command names (including dev), used to prevent extension collisions. */
26
+ export const ALL_BUILTIN_SLASH_COMMAND_NAMES = new Set(ALL_BUILTIN_SLASH_COMMANDS.map((cmd) => cmd.name));
27
+ /** Returns the base (non-dev) slash commands. Dev commands are added via custom/dev/. */
28
+ export function getBuiltinSlashCommands() {
29
+ return ALL_BUILTIN_SLASH_COMMANDS.filter((cmd) => !cmd.dev);
30
+ }
31
+ //# sourceMappingURL=slash-commands.js.map
@@ -0,0 +1,161 @@
1
+ /**
2
+ * System prompt construction and project context loading
3
+ */
4
+ import { getDocsPath, getExamplesPath, getReadmePath } from '../config.js';
5
+ import { BASH, EDIT, FIND, GREP, LS, READ, WRITE } from '../tool-names.js';
6
+ import { formatSkillsForPrompt } from './skills.js';
7
+ /** Tool descriptions for system prompt */
8
+ const toolDescriptions = {
9
+ [READ]: 'Read file contents',
10
+ [BASH]: 'Execute bash commands (ls, grep, find, etc.)',
11
+ [EDIT]: 'Make surgical edits to files (find exact text and replace)',
12
+ [WRITE]: 'Create or overwrite files',
13
+ [GREP]: 'Search file contents for patterns (respects .gitignore)',
14
+ [FIND]: 'Find files by glob pattern (respects .gitignore)',
15
+ [LS]: 'List directory contents'
16
+ };
17
+ /** Build the system prompt with tools, guidelines, and context */
18
+ export function buildSystemPrompt(options = {}) {
19
+ const { customPrompt, selectedTools, toolSnippets, promptGuidelines, appendSystemPrompt, cwd, contextFiles: providedContextFiles, skills: providedSkills } = options;
20
+ const resolvedCwd = cwd ?? process.cwd();
21
+ const now = new Date();
22
+ const dateTime = now.toLocaleString('en-US', {
23
+ weekday: 'long',
24
+ year: 'numeric',
25
+ month: 'long',
26
+ day: 'numeric',
27
+ hour: '2-digit',
28
+ minute: '2-digit',
29
+ second: '2-digit',
30
+ timeZoneName: 'short'
31
+ });
32
+ const appendSection = appendSystemPrompt ? `\n\n${appendSystemPrompt}` : '';
33
+ const contextFiles = providedContextFiles ?? [];
34
+ const skills = providedSkills ?? [];
35
+ if (customPrompt) {
36
+ let prompt = customPrompt;
37
+ if (appendSection) {
38
+ prompt += appendSection;
39
+ }
40
+ // Append project context files
41
+ if (contextFiles.length > 0) {
42
+ prompt += '\n\n# Project Context\n\n';
43
+ prompt += 'Project-specific instructions and guidelines:\n\n';
44
+ for (const { path: filePath, content } of contextFiles) {
45
+ prompt += `## ${filePath}\n\n${content}\n\n`;
46
+ }
47
+ }
48
+ // Append skills section (only if read tool is available)
49
+ const customPromptHasRead = !selectedTools || selectedTools.includes(READ);
50
+ if (customPromptHasRead && skills.length > 0) {
51
+ prompt += formatSkillsForPrompt(skills);
52
+ }
53
+ // Add date/time and working directory last
54
+ prompt += `\nCurrent date and time: ${dateTime}`;
55
+ prompt += `\nCurrent working directory: ${resolvedCwd}`;
56
+ return prompt;
57
+ }
58
+ // Get absolute paths to documentation and examples
59
+ const readmePath = getReadmePath();
60
+ const docsPath = getDocsPath();
61
+ const examplesPath = getExamplesPath();
62
+ // Build tools list based on selected tools.
63
+ // Built-ins use toolDescriptions. Custom tools can provide one-line snippets.
64
+ // SHORTCUT PATCH: no default tools — empty if none specified
65
+ const tools = selectedTools || [];
66
+ const toolsList = tools.length > 0
67
+ ? tools
68
+ .map((name) => {
69
+ const snippet = toolSnippets?.[name] ?? toolDescriptions[name] ?? name;
70
+ return `- ${name}: ${snippet}`;
71
+ })
72
+ .join('\n')
73
+ : '(none)';
74
+ // Build guidelines based on which tools are actually available
75
+ const guidelinesList = [];
76
+ const guidelinesSet = new Set();
77
+ const addGuideline = (guideline) => {
78
+ if (guidelinesSet.has(guideline)) {
79
+ return;
80
+ }
81
+ guidelinesSet.add(guideline);
82
+ guidelinesList.push(guideline);
83
+ };
84
+ const hasBash = tools.includes(BASH);
85
+ const hasEdit = tools.includes(EDIT);
86
+ const hasWrite = tools.includes(WRITE);
87
+ const hasGrep = tools.includes(GREP);
88
+ const hasFind = tools.includes(FIND);
89
+ const hasLs = tools.includes(LS);
90
+ const hasRead = tools.includes(READ);
91
+ // File exploration guidelines
92
+ if (hasBash && !hasGrep && !hasFind && !hasLs) {
93
+ addGuideline('Use bash for file operations like ls, rg, find');
94
+ }
95
+ else if (hasBash && (hasGrep || hasFind || hasLs)) {
96
+ addGuideline('Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)');
97
+ }
98
+ // Read before edit guideline
99
+ if (hasRead && hasEdit) {
100
+ addGuideline('Use read to examine files before editing. You must use this tool instead of cat or sed.');
101
+ }
102
+ // Edit guideline
103
+ if (hasEdit) {
104
+ addGuideline('Use edit for precise changes (old text must match exactly)');
105
+ }
106
+ // Write guideline
107
+ if (hasWrite) {
108
+ addGuideline('Use write only for new files or complete rewrites');
109
+ }
110
+ // Output guideline (only when actually writing or executing)
111
+ if (hasEdit || hasWrite) {
112
+ addGuideline('When summarizing your actions, output plain text directly - do NOT use cat or bash to display what you did');
113
+ }
114
+ for (const guideline of promptGuidelines ?? []) {
115
+ const normalized = guideline.trim();
116
+ if (normalized.length > 0) {
117
+ addGuideline(normalized);
118
+ }
119
+ }
120
+ // Always include these
121
+ addGuideline('Be concise in your responses');
122
+ addGuideline('Show file paths clearly when working with files');
123
+ const guidelines = guidelinesList.map((g) => `- ${g}`).join('\n');
124
+ let prompt = `You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.
125
+
126
+ Available tools:
127
+ ${toolsList}
128
+
129
+ In addition to the tools above, you may have access to other custom tools depending on the project.
130
+
131
+ Guidelines:
132
+ ${guidelines}
133
+
134
+ Pi documentation (read only when the user asks about pi itself, its SDK, extensions, themes, skills, or TUI):
135
+ - Main documentation: ${readmePath}
136
+ - Additional docs: ${docsPath}
137
+ - Examples: ${examplesPath} (extensions, custom tools, SDK)
138
+ - When asked about: extensions (docs/extensions.md, examples/extensions/), themes (docs/themes.md), skills (docs/skills.md), prompt templates (docs/prompt-templates.md), TUI components (docs/tui.md), keybindings (docs/keybindings.md), SDK integrations (docs/sdk.md), custom providers (docs/custom-provider.md), adding models (docs/models.md), pi packages (docs/packages.md)
139
+ - When working on pi topics, read the docs and examples, and follow .md cross-references before implementing
140
+ - Always read pi .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;
141
+ if (appendSection) {
142
+ prompt += appendSection;
143
+ }
144
+ // Append project context files
145
+ if (contextFiles.length > 0) {
146
+ prompt += '\n\n# Project Context\n\n';
147
+ prompt += 'Project-specific instructions and guidelines:\n\n';
148
+ for (const { path: filePath, content } of contextFiles) {
149
+ prompt += `## ${filePath}\n\n${content}\n\n`;
150
+ }
151
+ }
152
+ // Append skills section (only if read tool is available)
153
+ if (hasRead && skills.length > 0) {
154
+ prompt += formatSkillsForPrompt(skills);
155
+ }
156
+ // Add date/time and working directory last
157
+ prompt += `\nCurrent date and time: ${dateTime}`;
158
+ prompt += `\nCurrent working directory: ${resolvedCwd}`;
159
+ return prompt;
160
+ }
161
+ //# sourceMappingURL=system-prompt.js.map