@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.
- package/CHANGELOG.md +1961 -0
- package/README.md +1392 -0
- package/dist/cli/args.d.ts +42 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +248 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +79 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +92 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/session-picker.d.ts +9 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +32 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +61 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +141 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +523 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +1795 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-storage.d.ts +112 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +297 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +47 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +211 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +84 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +235 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +110 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +559 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +35 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +138 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +71 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/export-html/index.d.ts +17 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +193 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +910 -0
- package/dist/core/export-html/template.html +54 -0
- package/dist/core/export-html/template.js +1329 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.d.ts +10 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +25 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +383 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +89 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +406 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +654 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +32 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +27 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +102 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +25 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +121 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +59 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +151 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +123 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +57 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +314 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +76 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +308 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +40 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +197 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/sdk.d.ts +181 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +466 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-manager.d.ts +313 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +996 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +138 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +327 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +50 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +338 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/system-prompt.d.ts +48 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +224 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/timings.d.ts +7 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +25 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +42 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +223 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +33 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +171 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +37 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +143 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/find.d.ts +37 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +206 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +43 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +239 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +70 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +56 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +38 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +118 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +8 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +53 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +37 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +165 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +205 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +27 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +78 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +8 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +354 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +261 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +9 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +333 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +15 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +89 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +35 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +161 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +12 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +30 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +15 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +39 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +15 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +40 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +69 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +19 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +84 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +15 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +96 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +20 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +51 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +73 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +26 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +207 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +29 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +30 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +39 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +135 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +35 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +211 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +98 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +46 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +258 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +44 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +311 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +43 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +219 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +35 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +46 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +47 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +70 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +606 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +52 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +745 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +113 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +8 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +16 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +261 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +3194 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +84 -0
- package/dist/modes/interactive/theme/theme-schema.json +308 -0
- package/dist/modes/interactive/theme/theme.d.ts +71 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +893 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +140 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +209 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +392 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +486 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +372 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/utils/changelog.d.ts +21 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +87 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +129 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +73 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/image-convert.d.ts +9 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +31 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize.d.ts +36 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +188 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/mime.d.ts +2 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +26 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/shell.d.ts +26 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +151 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +187 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/vips.d.ts +11 -0
- package/dist/utils/vips.d.ts.map +1 -0
- package/dist/utils/vips.js +35 -0
- package/dist/utils/vips.js.map +1 -0
- package/docs/compaction.md +388 -0
- package/docs/extensions.md +1524 -0
- package/docs/rpc.md +1046 -0
- package/docs/sdk.md +1024 -0
- package/docs/session.md +255 -0
- package/docs/skills.md +317 -0
- package/docs/theme.md +617 -0
- package/docs/tree.md +201 -0
- package/docs/tui.md +797 -0
- package/examples/README.md +24 -0
- package/examples/extensions/README.md +168 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/chalk-logger.ts +26 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +114 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +72 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/handoff.ts +150 -0
- package/examples/extensions/hello.ts +25 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +25 -0
- package/examples/extensions/overlay-qa-tests.ts +881 -0
- package/examples/extensions/overlay-test.ts +145 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +340 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +398 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/qna.ts +119 -0
- package/examples/extensions/question.ts +277 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +95 -0
- package/examples/extensions/sandbox/index.ts +318 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +40 -0
- package/examples/extensions/subagent/README.md +172 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +156 -0
- package/examples/extensions/subagent/index.ts +963 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +195 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/todo.ts +299 -0
- package/examples/extensions/tool-override.ts +143 -0
- package/examples/extensions/tools.ts +146 -0
- package/examples/extensions/truncated-tool.ts +192 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/sdk/01-minimal.ts +22 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +44 -0
- package/examples/sdk/04-skills.ts +47 -0
- package/examples/sdk/05-tools.ts +56 -0
- package/examples/sdk/06-extensions.ts +79 -0
- package/examples/sdk/07-context-files.ts +36 -0
- package/examples/sdk/08-prompt-templates.ts +42 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +55 -0
- package/examples/sdk/10-settings.ts +38 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +72 -0
- package/examples/sdk/README.md +150 -0
- package/package.json +88 -0
package/docs/session.md
ADDED
|
@@ -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`).
|