@oh-my-pi/pi-coding-agent 8.0.20 → 8.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.
- package/CHANGELOG.md +125 -0
- package/docs/session.md +111 -46
- package/examples/custom-tools/hello/index.ts +1 -1
- package/examples/custom-tools/todo/index.ts +3 -4
- package/examples/extensions/api-demo.ts +0 -1
- package/examples/extensions/chalk-logger.ts +2 -3
- package/examples/extensions/hello.ts +0 -1
- package/examples/extensions/pirate.ts +0 -1
- package/examples/extensions/plan-mode.ts +15 -16
- package/examples/extensions/todo.ts +3 -4
- package/examples/extensions/tools.ts +1 -2
- package/examples/extensions/with-deps/index.ts +0 -1
- package/examples/hooks/auto-commit-on-exit.ts +1 -2
- package/examples/hooks/confirm-destructive.ts +0 -1
- package/examples/hooks/custom-compaction.ts +1 -2
- package/examples/hooks/dirty-repo-guard.ts +0 -1
- package/examples/hooks/file-trigger.ts +3 -4
- package/examples/hooks/git-checkpoint.ts +0 -1
- package/examples/hooks/handoff.ts +3 -4
- package/examples/hooks/permission-gate.ts +1 -2
- package/examples/hooks/protected-paths.ts +1 -2
- package/examples/hooks/qna.ts +2 -3
- package/examples/hooks/snake.ts +4 -5
- package/examples/hooks/status-line.ts +0 -1
- package/examples/sdk/01-minimal.ts +2 -3
- package/examples/sdk/02-custom-model.ts +2 -3
- package/examples/sdk/03-custom-prompt.ts +3 -4
- package/examples/sdk/04-skills.ts +2 -3
- package/examples/sdk/06-extensions.ts +1 -2
- package/examples/sdk/06-hooks.ts +6 -7
- package/examples/sdk/07-context-files.ts +0 -1
- package/examples/sdk/08-prompt-templates.ts +0 -1
- package/examples/sdk/08-slash-commands.ts +0 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
- package/examples/sdk/10-settings.ts +0 -1
- package/examples/sdk/11-sessions.ts +0 -1
- package/package.json +54 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +3 -4
- package/src/capability/extension-module.ts +3 -4
- package/src/capability/extension.ts +3 -4
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +3 -4
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +3 -4
- package/src/capability/mcp.ts +3 -4
- package/src/capability/prompt.ts +3 -4
- package/src/capability/rule.ts +3 -4
- package/src/capability/settings.ts +2 -3
- package/src/capability/skill.ts +3 -4
- package/src/capability/slash-command.ts +3 -4
- package/src/capability/ssh.ts +3 -4
- package/src/capability/system-prompt.ts +3 -4
- package/src/capability/tool.ts +3 -4
- package/src/cli/args.ts +5 -6
- package/src/cli/config-cli.ts +6 -7
- package/src/cli/file-processor.ts +19 -17
- package/src/cli/jupyter-cli.ts +105 -0
- package/src/cli/list-models.ts +10 -11
- package/src/cli/plugin-cli.ts +20 -25
- package/src/cli/session-picker.ts +2 -3
- package/src/cli/setup-cli.ts +2 -3
- package/src/cli/stats-cli.ts +2 -3
- package/src/cli/update-cli.ts +25 -22
- package/src/commit/agentic/agent.ts +307 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +351 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +26 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +40 -0
- package/src/commit/agentic/state.ts +69 -0
- package/src/commit/agentic/tools/analyze-file.ts +131 -0
- package/src/commit/agentic/tools/git-file-diff.ts +194 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +84 -0
- package/src/commit/agentic/tools/index.ts +56 -0
- package/src/commit/agentic/tools/propose-changelog.ts +128 -0
- package/src/commit/agentic/tools/propose-commit.ts +154 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/split-commit.ts +280 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +200 -0
- package/src/commit/analysis/conventional.ts +165 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +112 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +36 -0
- package/src/commit/changelog/generate.ts +110 -0
- package/src/commit/changelog/index.ts +233 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +93 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/git/errors.ts +11 -0
- package/src/commit/git/index.ts +212 -0
- package/src/commit/git/operations.ts +53 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +63 -0
- package/src/commit/map-reduce/map-phase.ts +178 -0
- package/src/commit/map-reduce/reduce-phase.ts +145 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +80 -0
- package/src/commit/pipeline.ts +240 -0
- package/src/commit/prompts/analysis-system.md +155 -0
- package/src/commit/prompts/analysis-user.md +41 -0
- package/src/commit/prompts/changelog-system.md +56 -0
- package/src/commit/prompts/changelog-user.md +19 -0
- package/src/commit/prompts/file-observer-system.md +26 -0
- package/src/commit/prompts/file-observer-user.md +9 -0
- package/src/commit/prompts/reduce-system.md +60 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +4 -0
- package/src/commit/prompts/summary-system.md +52 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/types.ts +109 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/config/file-lock.ts +121 -0
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +65 -38
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +141 -50
- package/src/config.ts +64 -66
- package/src/cursor.ts +11 -9
- package/src/discovery/agents-md.ts +11 -12
- package/src/discovery/builtin.ts +68 -73
- package/src/discovery/claude.ts +41 -42
- package/src/discovery/cline.ts +11 -12
- package/src/discovery/codex.ts +52 -53
- package/src/discovery/cursor.ts +9 -10
- package/src/discovery/gemini.ts +17 -22
- package/src/discovery/github.ts +13 -14
- package/src/discovery/helpers.ts +35 -34
- package/src/discovery/index.ts +22 -24
- package/src/discovery/mcp-json.ts +8 -9
- package/src/discovery/ssh.ts +8 -9
- package/src/discovery/vscode.ts +4 -5
- package/src/discovery/windsurf.ts +6 -7
- package/src/exa/company.ts +1 -2
- package/src/exa/index.ts +2 -3
- package/src/exa/linkedin.ts +1 -2
- package/src/exa/mcp-client.ts +14 -16
- package/src/exa/render.ts +10 -11
- package/src/exa/researcher.ts +1 -2
- package/src/exa/search.ts +1 -2
- package/src/exa/types.ts +0 -1
- package/src/exa/websets.ts +1 -2
- package/src/exec/bash-executor.ts +3 -4
- package/src/exec/exec.ts +0 -1
- package/src/export/custom-share.ts +5 -6
- package/src/export/html/index.ts +24 -21
- package/src/export/ttsr.ts +2 -3
- package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
- package/src/extensibility/custom-commands/loader.ts +18 -15
- package/src/extensibility/custom-commands/types.ts +2 -3
- package/src/extensibility/custom-tools/loader.ts +11 -12
- package/src/extensibility/custom-tools/types.ts +7 -8
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +76 -54
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +20 -27
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +9 -10
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +11 -18
- package/src/extensibility/plugins/doctor.ts +3 -3
- package/src/extensibility/plugins/installer.ts +27 -27
- package/src/extensibility/plugins/loader.ts +59 -56
- package/src/extensibility/plugins/manager.ts +211 -171
- package/src/extensibility/plugins/parser.ts +1 -1
- package/src/extensibility/plugins/paths.ts +8 -8
- package/src/extensibility/skills.ts +63 -60
- package/src/extensibility/slash-commands.ts +10 -10
- package/src/index.ts +54 -54
- package/src/internal-urls/agent-protocol.ts +21 -11
- package/src/internal-urls/artifact-protocol.ts +17 -13
- package/src/internal-urls/router.ts +1 -2
- package/src/internal-urls/rule-protocol.ts +3 -4
- package/src/internal-urls/skill-protocol.ts +3 -4
- package/src/ipy/executor.ts +109 -9
- package/src/ipy/gateway-coordinator.ts +79 -90
- package/src/ipy/kernel.ts +32 -30
- package/src/ipy/modules.ts +13 -13
- package/src/lsp/client.ts +21 -10
- package/src/lsp/clients/biome-client.ts +1 -2
- package/src/lsp/clients/index.ts +3 -3
- package/src/lsp/clients/lsp-linter-client.ts +4 -5
- package/src/lsp/config.ts +15 -15
- package/src/lsp/edits.ts +4 -5
- package/src/lsp/index.ts +43 -44
- package/src/lsp/lspmux.ts +8 -8
- package/src/lsp/render.ts +99 -61
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +71 -37
- package/src/mcp/client.ts +2 -3
- package/src/mcp/config.ts +5 -6
- package/src/mcp/json-rpc.ts +0 -1
- package/src/mcp/loader.ts +6 -7
- package/src/mcp/manager.ts +17 -18
- package/src/mcp/tool-bridge.ts +4 -9
- package/src/mcp/tool-cache.ts +2 -3
- package/src/mcp/transports/http.ts +2 -4
- package/src/mcp/transports/stdio.ts +1 -2
- package/src/migrations.ts +63 -52
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +33 -5
- package/src/modes/components/bash-execution.ts +7 -8
- package/src/modes/components/bordered-loader.ts +3 -3
- package/src/modes/components/branch-summary-message.ts +3 -3
- package/src/modes/components/compaction-summary-message.ts +3 -3
- package/src/modes/components/countdown-timer.ts +0 -1
- package/src/modes/components/custom-message.ts +5 -5
- package/src/modes/components/diff.ts +1 -1
- package/src/modes/components/dynamic-border.ts +2 -2
- package/src/modes/components/extensions/extension-dashboard.ts +6 -7
- package/src/modes/components/extensions/extension-list.ts +2 -3
- package/src/modes/components/extensions/inspector-panel.ts +3 -4
- package/src/modes/components/extensions/state-manager.ts +25 -26
- package/src/modes/components/extensions/types.ts +1 -2
- package/src/modes/components/footer.ts +47 -43
- package/src/modes/components/history-search.ts +2 -2
- package/src/modes/components/hook-editor.ts +3 -4
- package/src/modes/components/hook-input.ts +2 -3
- package/src/modes/components/hook-message.ts +5 -5
- package/src/modes/components/hook-selector.ts +2 -3
- package/src/modes/components/keybinding-hints.ts +2 -3
- package/src/modes/components/login-dialog.ts +2 -2
- package/src/modes/components/model-selector.ts +12 -12
- package/src/modes/components/oauth-selector.ts +2 -2
- package/src/modes/components/plugin-settings.ts +20 -20
- package/src/modes/components/python-execution.ts +7 -8
- package/src/modes/components/queue-mode-selector.ts +3 -3
- package/src/modes/components/read-tool-group.ts +2 -2
- package/src/modes/components/session-selector.ts +4 -4
- package/src/modes/components/settings-defs.ts +77 -69
- package/src/modes/components/settings-selector.ts +16 -16
- package/src/modes/components/show-images-selector.ts +2 -2
- package/src/modes/components/status-line/segments.ts +4 -4
- package/src/modes/components/status-line/separators.ts +1 -1
- package/src/modes/components/status-line/types.ts +2 -2
- package/src/modes/components/status-line-segment-editor.ts +7 -8
- package/src/modes/components/status-line.ts +12 -12
- package/src/modes/components/theme-selector.ts +8 -7
- package/src/modes/components/thinking-selector.ts +4 -4
- package/src/modes/components/todo-display.ts +2 -2
- package/src/modes/components/todo-reminder.ts +4 -4
- package/src/modes/components/tool-execution.ts +16 -19
- package/src/modes/components/tree-selector.ts +12 -12
- package/src/modes/components/ttsr-notification.ts +5 -5
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +1 -1
- package/src/modes/components/visual-truncate.ts +0 -1
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +46 -47
- package/src/modes/controllers/event-controller.ts +16 -20
- package/src/modes/controllers/extension-ui-controller.ts +40 -46
- package/src/modes/controllers/input-controller.ts +17 -18
- package/src/modes/controllers/selector-controller.ts +103 -91
- package/src/modes/index.ts +3 -3
- package/src/modes/interactive-mode.ts +31 -31
- package/src/modes/print-mode.ts +12 -13
- package/src/modes/rpc/rpc-client.ts +7 -8
- package/src/modes/rpc/rpc-mode.ts +24 -28
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +89 -0
- package/src/modes/theme/theme.ts +130 -53
- package/src/modes/types.ts +10 -10
- package/src/modes/utils/ui-helpers.ts +17 -17
- package/src/patch/applicator.ts +18 -19
- package/src/patch/diff.ts +1 -2
- package/src/patch/fuzzy.ts +1 -2
- package/src/patch/index.ts +11 -18
- package/src/patch/normalize.ts +4 -4
- package/src/patch/normative.ts +1 -2
- package/src/patch/parser.ts +8 -9
- package/src/patch/shared.ts +43 -16
- package/src/prompts/tools/task.md +2 -0
- package/src/sdk.ts +100 -65
- package/src/session/agent-session.ts +84 -85
- package/src/session/agent-storage.ts +43 -39
- package/src/session/artifacts.ts +32 -10
- package/src/session/auth-storage.ts +50 -39
- package/src/session/compaction/branch-summarization.ts +7 -10
- package/src/session/compaction/compaction.ts +8 -19
- package/src/session/compaction/utils.ts +6 -9
- package/src/session/history-storage.ts +10 -10
- package/src/session/messages.ts +4 -5
- package/src/session/session-manager.ts +76 -65
- package/src/session/session-storage.ts +57 -69
- package/src/session/storage-migration.ts +14 -56
- package/src/session/streaming-output.ts +2 -2
- package/src/ssh/connection-manager.ts +43 -50
- package/src/ssh/ssh-executor.ts +2 -2
- package/src/ssh/sshfs-mount.ts +11 -18
- package/src/system-prompt.ts +28 -35
- package/src/task/agents.ts +45 -30
- package/src/task/commands.ts +6 -7
- package/src/task/discovery.ts +39 -76
- package/src/task/executor.ts +14 -15
- package/src/task/index.ts +40 -34
- package/src/task/output-manager.ts +93 -0
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +24 -30
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +33 -39
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +41 -20
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +91 -97
- package/src/tools/calculator.ts +49 -47
- package/src/tools/complete.ts +4 -5
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +84 -124
- package/src/tools/find.ts +94 -98
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +100 -116
- package/src/tools/index.ts +80 -55
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +44 -70
- package/src/tools/notebook.ts +51 -67
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +2 -2
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +104 -217
- package/src/tools/read.ts +92 -33
- package/src/tools/render-utils.ts +8 -23
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +69 -49
- package/src/tools/todo-write.ts +37 -25
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +99 -75
- package/src/tui/code-cell.ts +109 -0
- package/src/tui/file-list.ts +47 -0
- package/src/tui/index.ts +11 -0
- package/src/tui/output-block.ts +72 -0
- package/src/tui/status-line.ts +39 -0
- package/src/tui/tree-list.ts +55 -0
- package/src/tui/types.ts +16 -0
- package/src/tui/utils.ts +48 -0
- package/src/utils/changelog.ts +9 -10
- package/src/utils/clipboard.ts +11 -11
- package/src/utils/file-mentions.ts +4 -10
- package/src/utils/frontmatter.ts +6 -3
- package/src/utils/fuzzy.ts +2 -2
- package/src/utils/image-convert.ts +1 -1
- package/src/utils/image-resize.ts +1 -1
- package/src/utils/mime.ts +2 -2
- package/src/utils/shell-snapshot.ts +11 -13
- package/src/utils/shell.ts +4 -5
- package/src/utils/title-generator.ts +8 -9
- package/src/utils/tools-manager.ts +23 -23
- package/src/vendor/photon/index.js +1099 -1059
- package/src/vendor/photon/photon_rs_bg.wasm +0 -0
- package/src/web/scrapers/artifacthub.ts +1 -1
- package/src/web/scrapers/arxiv.ts +2 -2
- package/src/web/scrapers/bluesky.ts +2 -2
- package/src/web/scrapers/cheatsh.ts +1 -1
- package/src/web/scrapers/chocolatey.ts +2 -2
- package/src/web/scrapers/choosealicense.ts +5 -5
- package/src/web/scrapers/cisa-kev.ts +1 -1
- package/src/web/scrapers/crossref.ts +2 -2
- package/src/web/scrapers/devto.ts +3 -3
- package/src/web/scrapers/discogs.ts +3 -4
- package/src/web/scrapers/discourse.ts +1 -1
- package/src/web/scrapers/dockerhub.ts +1 -1
- package/src/web/scrapers/fdroid.ts +2 -2
- package/src/web/scrapers/firefox-addons.ts +3 -3
- package/src/web/scrapers/flathub.ts +1 -1
- package/src/web/scrapers/github.ts +3 -3
- package/src/web/scrapers/gitlab.ts +4 -4
- package/src/web/scrapers/hackernews.ts +2 -2
- package/src/web/scrapers/huggingface.ts +1 -1
- package/src/web/scrapers/iacr.ts +2 -2
- package/src/web/scrapers/index.ts +0 -1
- package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
- package/src/web/scrapers/lemmy.ts +2 -2
- package/src/web/scrapers/maven.ts +2 -2
- package/src/web/scrapers/mdn.ts +2 -4
- package/src/web/scrapers/metacpan.ts +2 -2
- package/src/web/scrapers/musicbrainz.ts +1 -2
- package/src/web/scrapers/npm.ts +1 -1
- package/src/web/scrapers/nuget.ts +2 -2
- package/src/web/scrapers/nvd.ts +3 -3
- package/src/web/scrapers/ollama.ts +7 -9
- package/src/web/scrapers/opencorporates.ts +2 -2
- package/src/web/scrapers/openlibrary.ts +6 -6
- package/src/web/scrapers/orcid.ts +0 -1
- package/src/web/scrapers/osv.ts +2 -2
- package/src/web/scrapers/packagist.ts +1 -1
- package/src/web/scrapers/pubmed.ts +1 -2
- package/src/web/scrapers/rawg.ts +2 -2
- package/src/web/scrapers/readthedocs.ts +1 -2
- package/src/web/scrapers/repology.ts +2 -2
- package/src/web/scrapers/rfc.ts +1 -1
- package/src/web/scrapers/searchcode.ts +2 -2
- package/src/web/scrapers/semantic-scholar.ts +1 -1
- package/src/web/scrapers/snapcraft.ts +2 -2
- package/src/web/scrapers/sourcegraph.ts +1 -1
- package/src/web/scrapers/spdx.ts +3 -3
- package/src/web/scrapers/spotify.ts +0 -1
- package/src/web/scrapers/twitter.ts +1 -1
- package/src/web/scrapers/types.ts +1 -2
- package/src/web/scrapers/utils.ts +5 -5
- package/src/web/scrapers/wikidata.ts +3 -3
- package/src/web/scrapers/youtube.ts +9 -14
- package/src/web/search/auth.ts +5 -10
- package/src/web/search/index.ts +11 -21
- package/src/web/search/providers/anthropic.ts +3 -9
- package/src/web/search/providers/exa.ts +6 -10
- package/src/web/search/providers/perplexity.ts +5 -5
- package/src/web/search/render.ts +129 -175
- package/tsconfig.json +0 -42
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Gemini-style extensions that provide MCP servers, tools, and context.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { defineCapability } from "./index";
|
|
6
|
+
import { defineCapability } from ".";
|
|
8
7
|
import type { MCPServer } from "./mcp";
|
|
9
8
|
import type { SourceMeta } from "./types";
|
|
10
9
|
|
|
@@ -39,8 +38,8 @@ export const extensionCapability = defineCapability<Extension>({
|
|
|
39
38
|
id: "extensions",
|
|
40
39
|
displayName: "Extensions",
|
|
41
40
|
description: "Gemini-style extensions providing MCP servers, tools, and context",
|
|
42
|
-
key:
|
|
43
|
-
validate:
|
|
41
|
+
key: ext => ext.name,
|
|
42
|
+
validate: ext => {
|
|
44
43
|
if (!ext.name) return "Missing extension name";
|
|
45
44
|
if (!ext.path) return "Missing extension path";
|
|
46
45
|
return undefined;
|
package/src/capability/fs.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { dirname, join, resolve } from "node:path";
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
4
3
|
|
|
5
4
|
const contentCache = new Map<string, string | null>();
|
|
6
|
-
const dirCache = new Map<string, Dirent[]>();
|
|
5
|
+
const dirCache = new Map<string, fs.Dirent[]>();
|
|
7
6
|
|
|
8
|
-
function resolvePath(
|
|
9
|
-
return resolve(
|
|
7
|
+
function resolvePath(filePath: string): string {
|
|
8
|
+
return path.resolve(filePath);
|
|
10
9
|
}
|
|
11
10
|
|
|
12
|
-
export async function readFile(
|
|
13
|
-
const abs = resolvePath(
|
|
11
|
+
export async function readFile(filePath: string): Promise<string | null> {
|
|
12
|
+
const abs = resolvePath(filePath);
|
|
14
13
|
if (contentCache.has(abs)) {
|
|
15
14
|
return contentCache.get(abs) ?? null;
|
|
16
15
|
}
|
|
@@ -25,14 +24,14 @@ export async function readFile(path: string): Promise<string | null> {
|
|
|
25
24
|
}
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
export async function readDirEntries(
|
|
29
|
-
const abs = resolvePath(
|
|
27
|
+
export async function readDirEntries(dirPath: string): Promise<fs.Dirent[]> {
|
|
28
|
+
const abs = resolvePath(dirPath);
|
|
30
29
|
if (dirCache.has(abs)) {
|
|
31
30
|
return dirCache.get(abs) ?? [];
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
try {
|
|
35
|
-
const entries = await readdir(abs, { withFileTypes: true });
|
|
34
|
+
const entries = await fs.promises.readdir(abs, { withFileTypes: true });
|
|
36
35
|
dirCache.set(abs, entries);
|
|
37
36
|
return entries;
|
|
38
37
|
} catch {
|
|
@@ -41,9 +40,9 @@ export async function readDirEntries(path: string): Promise<Dirent[]> {
|
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
42
|
|
|
44
|
-
export async function readDir(
|
|
45
|
-
const entries = await readDirEntries(
|
|
46
|
-
return entries.map(
|
|
43
|
+
export async function readDir(dirPath: string): Promise<string[]> {
|
|
44
|
+
const entries = await readDirEntries(dirPath);
|
|
45
|
+
return entries.map(entry => entry.name);
|
|
47
46
|
}
|
|
48
47
|
|
|
49
48
|
export async function walkUp(
|
|
@@ -56,12 +55,12 @@ export async function walkUp(
|
|
|
56
55
|
|
|
57
56
|
while (true) {
|
|
58
57
|
const entries = await readDirEntries(current);
|
|
59
|
-
const entry = entries.find(
|
|
58
|
+
const entry = entries.find(e => e.name === name);
|
|
60
59
|
if (entry) {
|
|
61
|
-
if (file && entry.isFile()) return join(current, name);
|
|
62
|
-
if (dir && entry.isDirectory()) return join(current, name);
|
|
60
|
+
if (file && entry.isFile()) return path.join(current, name);
|
|
61
|
+
if (dir && entry.isDirectory()) return path.join(current, name);
|
|
63
62
|
}
|
|
64
|
-
const parent = dirname(current);
|
|
63
|
+
const parent = path.dirname(current);
|
|
65
64
|
if (parent === current) return null;
|
|
66
65
|
current = parent;
|
|
67
66
|
}
|
|
@@ -79,11 +78,11 @@ export function clearCache(): void {
|
|
|
79
78
|
dirCache.clear();
|
|
80
79
|
}
|
|
81
80
|
|
|
82
|
-
export function invalidate(
|
|
83
|
-
const abs = resolvePath(
|
|
81
|
+
export function invalidate(filePath: string): void {
|
|
82
|
+
const abs = resolvePath(filePath);
|
|
84
83
|
contentCache.delete(abs);
|
|
85
84
|
dirCache.delete(abs);
|
|
86
|
-
const parent = dirname(abs);
|
|
85
|
+
const parent = path.dirname(abs);
|
|
87
86
|
if (parent !== abs) {
|
|
88
87
|
dirCache.delete(parent);
|
|
89
88
|
}
|
package/src/capability/hook.ts
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Pre/post tool execution hooks defined as shell scripts.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { defineCapability } from "./index";
|
|
6
|
+
import { defineCapability } from ".";
|
|
8
7
|
import type { SourceMeta } from "./types";
|
|
9
8
|
|
|
10
9
|
/**
|
|
@@ -29,8 +28,8 @@ export const hookCapability = defineCapability<Hook>({
|
|
|
29
28
|
id: "hooks",
|
|
30
29
|
displayName: "Hooks",
|
|
31
30
|
description: "Pre/post tool execution hooks",
|
|
32
|
-
key:
|
|
33
|
-
validate:
|
|
31
|
+
key: hook => `${hook.type}:${hook.tool}:${hook.name}`,
|
|
32
|
+
validate: hook => {
|
|
34
33
|
if (!hook.name) return "Missing name";
|
|
35
34
|
if (!hook.path) return "Missing path";
|
|
36
35
|
if (hook.type !== "pre" && hook.type !== "post") return "Invalid type (must be 'pre' or 'post')";
|
package/src/capability/index.ts
CHANGED
|
@@ -6,9 +6,8 @@
|
|
|
6
6
|
* - Registering providers (where to find it)
|
|
7
7
|
* - Loading items for a capability across all providers
|
|
8
8
|
*/
|
|
9
|
-
|
|
10
|
-
import
|
|
11
|
-
import { resolve } from "node:path";
|
|
9
|
+
import * as os from "node:os";
|
|
10
|
+
import * as path from "node:path";
|
|
12
11
|
import { clearCache as clearFsCache, cacheStats as fsCacheStats, invalidate as invalidateFs } from "./fs";
|
|
13
12
|
import type {
|
|
14
13
|
Capability,
|
|
@@ -81,7 +80,7 @@ export function registerProvider<T>(capabilityId: string, provider: Provider<T>)
|
|
|
81
80
|
|
|
82
81
|
// Insert in priority order (highest first)
|
|
83
82
|
const providers = capability.providers as Provider<T>[];
|
|
84
|
-
const idx = providers.findIndex(
|
|
83
|
+
const idx = providers.findIndex(p => p.priority < provider.priority);
|
|
85
84
|
if (idx === -1) {
|
|
86
85
|
providers.push(provider);
|
|
87
86
|
} else {
|
|
@@ -107,7 +106,7 @@ async function loadImpl<T>(
|
|
|
107
106
|
const contributingProviders: string[] = [];
|
|
108
107
|
|
|
109
108
|
const results = await Promise.all(
|
|
110
|
-
providers.map(async
|
|
109
|
+
providers.map(async provider => {
|
|
111
110
|
try {
|
|
112
111
|
const result = await provider.load(ctx);
|
|
113
112
|
return { provider, result };
|
|
@@ -128,7 +127,7 @@ async function loadImpl<T>(
|
|
|
128
127
|
if (!result) continue;
|
|
129
128
|
|
|
130
129
|
if (result.warnings) {
|
|
131
|
-
allWarnings.push(...result.warnings.map(
|
|
130
|
+
allWarnings.push(...result.warnings.map(w => `[${provider.displayName}] ${w}`));
|
|
132
131
|
}
|
|
133
132
|
|
|
134
133
|
if (result.items.length > 0) {
|
|
@@ -190,15 +189,15 @@ async function loadImpl<T>(
|
|
|
190
189
|
* Filter providers based on options and disabled state.
|
|
191
190
|
*/
|
|
192
191
|
function filterProviders<T>(capability: Capability<T>, options: LoadOptions): Provider<T>[] {
|
|
193
|
-
let providers = (capability.providers as Provider<T>[]).filter(
|
|
192
|
+
let providers = (capability.providers as Provider<T>[]).filter(p => !disabledProviders.has(p.id));
|
|
194
193
|
|
|
195
194
|
if (options.providers) {
|
|
196
195
|
const allowed = new Set(options.providers);
|
|
197
|
-
providers = providers.filter(
|
|
196
|
+
providers = providers.filter(p => allowed.has(p.id));
|
|
198
197
|
}
|
|
199
198
|
if (options.excludeProviders) {
|
|
200
199
|
const excluded = new Set(options.excludeProviders);
|
|
201
|
-
providers = providers.filter(
|
|
200
|
+
providers = providers.filter(p => !excluded.has(p.id));
|
|
202
201
|
}
|
|
203
202
|
|
|
204
203
|
return providers;
|
|
@@ -214,7 +213,7 @@ export async function loadCapability<T>(capabilityId: string, options: LoadOptio
|
|
|
214
213
|
}
|
|
215
214
|
|
|
216
215
|
const cwd = options.cwd ?? process.cwd();
|
|
217
|
-
const home = homedir();
|
|
216
|
+
const home = os.homedir();
|
|
218
217
|
const ctx: LoadContext = { cwd, home };
|
|
219
218
|
const providers = filterProviders(capability, options);
|
|
220
219
|
|
|
@@ -321,7 +320,7 @@ export function getCapabilityInfo(capabilityId: string): CapabilityInfo | undefi
|
|
|
321
320
|
id: capability.id,
|
|
322
321
|
displayName: capability.displayName,
|
|
323
322
|
description: capability.description,
|
|
324
|
-
providers: capability.providers.map(
|
|
323
|
+
providers: capability.providers.map(p => ({
|
|
325
324
|
id: p.id,
|
|
326
325
|
displayName: p.displayName,
|
|
327
326
|
description: p.description,
|
|
@@ -335,7 +334,7 @@ export function getCapabilityInfo(capabilityId: string): CapabilityInfo | undefi
|
|
|
335
334
|
* Get all capabilities info for UI display.
|
|
336
335
|
*/
|
|
337
336
|
export function getAllCapabilitiesInfo(): CapabilityInfo[] {
|
|
338
|
-
return listCapabilities().map(
|
|
337
|
+
return listCapabilities().map(id => getCapabilityInfo(id)!);
|
|
339
338
|
}
|
|
340
339
|
|
|
341
340
|
/**
|
|
@@ -350,7 +349,7 @@ export function getProviderInfo(providerId: string): ProviderInfo | undefined {
|
|
|
350
349
|
let priority = 0;
|
|
351
350
|
for (const capId of caps) {
|
|
352
351
|
const cap = capabilities.get(capId);
|
|
353
|
-
const provider = cap?.providers.find(
|
|
352
|
+
const provider = cap?.providers.find(p => p.id === providerId);
|
|
354
353
|
if (provider) {
|
|
355
354
|
priority = provider.priority;
|
|
356
355
|
break;
|
|
@@ -399,10 +398,10 @@ export function reset(): void {
|
|
|
399
398
|
|
|
400
399
|
/**
|
|
401
400
|
* Invalidate cache for a specific path.
|
|
402
|
-
* @param
|
|
401
|
+
* @param filePath - Absolute or relative path to invalidate
|
|
403
402
|
*/
|
|
404
|
-
export function invalidate(
|
|
405
|
-
const resolved = cwd ? resolve(cwd,
|
|
403
|
+
export function invalidate(filePath: string, cwd?: string): void {
|
|
404
|
+
const resolved = cwd ? path.resolve(cwd, filePath) : filePath;
|
|
406
405
|
invalidateFs(resolved);
|
|
407
406
|
}
|
|
408
407
|
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* GitHub Copilot-style instructions with optional file pattern matching.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { defineCapability } from "./index";
|
|
6
|
+
import { defineCapability } from ".";
|
|
8
7
|
import type { SourceMeta } from "./types";
|
|
9
8
|
|
|
10
9
|
/**
|
|
@@ -27,8 +26,8 @@ export const instructionCapability = defineCapability<Instruction>({
|
|
|
27
26
|
id: "instructions",
|
|
28
27
|
displayName: "Instructions",
|
|
29
28
|
description: "File-specific instructions with glob pattern matching (GitHub Copilot format)",
|
|
30
|
-
key:
|
|
31
|
-
validate:
|
|
29
|
+
key: inst => inst.name,
|
|
30
|
+
validate: inst => {
|
|
32
31
|
if (!inst.name) return "Missing name";
|
|
33
32
|
if (!inst.path) return "Missing path";
|
|
34
33
|
if (inst.content === undefined) return "Missing content";
|
package/src/capability/mcp.ts
CHANGED
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
* Canonical shape for MCP server configurations, regardless of source format.
|
|
5
5
|
* All providers translate their native format to this shape.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import { defineCapability } from "./index";
|
|
7
|
+
import { defineCapability } from ".";
|
|
9
8
|
import type { SourceMeta } from "./types";
|
|
10
9
|
|
|
11
10
|
/**
|
|
@@ -34,8 +33,8 @@ export const mcpCapability = defineCapability<MCPServer>({
|
|
|
34
33
|
id: "mcps",
|
|
35
34
|
displayName: "MCP Servers",
|
|
36
35
|
description: "Model Context Protocol server configurations for external tool integrations",
|
|
37
|
-
key:
|
|
38
|
-
validate:
|
|
36
|
+
key: server => server.name,
|
|
37
|
+
validate: server => {
|
|
39
38
|
if (!server.name) return "Missing server name";
|
|
40
39
|
if (!server.command && !server.url) return "Must have command or url";
|
|
41
40
|
|
package/src/capability/prompt.ts
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Reusable prompt templates (Codex format) available via /prompts: menu.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { defineCapability } from "./index";
|
|
6
|
+
import { defineCapability } from ".";
|
|
8
7
|
import type { SourceMeta } from "./types";
|
|
9
8
|
|
|
10
9
|
/**
|
|
@@ -25,8 +24,8 @@ export const promptCapability = defineCapability<Prompt>({
|
|
|
25
24
|
id: "prompts",
|
|
26
25
|
displayName: "Prompts",
|
|
27
26
|
description: "Reusable prompt templates available via /prompts: menu",
|
|
28
|
-
key:
|
|
29
|
-
validate:
|
|
27
|
+
key: prompt => prompt.name,
|
|
28
|
+
validate: prompt => {
|
|
30
29
|
if (!prompt.name) return "Missing name";
|
|
31
30
|
if (!prompt.path) return "Missing path";
|
|
32
31
|
if (prompt.content === undefined) return "Missing content";
|
package/src/capability/rule.ts
CHANGED
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
* Project-specific rules from Cursor (.mdc), Windsurf (.md), and Cline formats.
|
|
5
5
|
* Translated to a canonical shape regardless of source format.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import { defineCapability } from "./index";
|
|
7
|
+
import { defineCapability } from ".";
|
|
9
8
|
import type { SourceMeta } from "./types";
|
|
10
9
|
|
|
11
10
|
/**
|
|
@@ -46,8 +45,8 @@ export const ruleCapability = defineCapability<Rule>({
|
|
|
46
45
|
id: "rules",
|
|
47
46
|
displayName: "Rules",
|
|
48
47
|
description: "Project-specific rules and constraints (Cursor MDC, Windsurf, Cline formats)",
|
|
49
|
-
key:
|
|
50
|
-
validate:
|
|
48
|
+
key: rule => rule.name,
|
|
49
|
+
validate: rule => {
|
|
51
50
|
if (!rule.name) return "Missing rule name";
|
|
52
51
|
if (!rule.path) return "Missing rule path";
|
|
53
52
|
if (!rule.content || typeof rule.content !== "string") return "Rule must have content";
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Configuration settings from various sources (JSON, TOML, etc.)
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { defineCapability } from "./index";
|
|
6
|
+
import { defineCapability } from ".";
|
|
8
7
|
import type { SourceMeta } from "./types";
|
|
9
8
|
|
|
10
9
|
/**
|
|
@@ -27,7 +26,7 @@ export const settingsCapability = defineCapability<Settings>({
|
|
|
27
26
|
description: "Configuration settings from various sources",
|
|
28
27
|
// Settings are merged, not deduplicated by key
|
|
29
28
|
key: () => undefined,
|
|
30
|
-
validate:
|
|
29
|
+
validate: settings => {
|
|
31
30
|
if (!settings.path) return "Missing path";
|
|
32
31
|
if (!settings.data || typeof settings.data !== "object") return "Missing or invalid data";
|
|
33
32
|
return undefined;
|
package/src/capability/skill.ts
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Skills provide specialized knowledge or workflows that extend agent capabilities.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { defineCapability } from "./index";
|
|
6
|
+
import { defineCapability } from ".";
|
|
8
7
|
import type { SourceMeta } from "./types";
|
|
9
8
|
|
|
10
9
|
/**
|
|
@@ -40,8 +39,8 @@ export const skillCapability = defineCapability<Skill>({
|
|
|
40
39
|
id: "skills",
|
|
41
40
|
displayName: "Skills",
|
|
42
41
|
description: "Specialized knowledge and workflow files that extend agent capabilities",
|
|
43
|
-
key:
|
|
44
|
-
validate:
|
|
42
|
+
key: skill => skill.name,
|
|
43
|
+
validate: skill => {
|
|
45
44
|
if (!skill.name) return "Missing skill name";
|
|
46
45
|
if (!skill.path) return "Missing skill path";
|
|
47
46
|
return undefined;
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* File-based slash commands defined as markdown files.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { defineCapability } from "./index";
|
|
6
|
+
import { defineCapability } from ".";
|
|
8
7
|
import type { SourceMeta } from "./types";
|
|
9
8
|
|
|
10
9
|
/**
|
|
@@ -27,8 +26,8 @@ export const slashCommandCapability = defineCapability<SlashCommand>({
|
|
|
27
26
|
id: "slash-commands",
|
|
28
27
|
displayName: "Slash Commands",
|
|
29
28
|
description: "Custom slash commands defined as markdown files",
|
|
30
|
-
key:
|
|
31
|
-
validate:
|
|
29
|
+
key: cmd => cmd.name,
|
|
30
|
+
validate: cmd => {
|
|
32
31
|
if (!cmd.name) return "Missing name";
|
|
33
32
|
if (!cmd.path) return "Missing path";
|
|
34
33
|
if (cmd.content === undefined) return "Missing content";
|
package/src/capability/ssh.ts
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Canonical shape for SSH host entries, regardless of source format.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { defineCapability } from "./index";
|
|
6
|
+
import { defineCapability } from ".";
|
|
8
7
|
import type { SourceMeta } from "./types";
|
|
9
8
|
|
|
10
9
|
/**
|
|
@@ -33,8 +32,8 @@ export const sshCapability = defineCapability<SSHHost>({
|
|
|
33
32
|
id: "ssh",
|
|
34
33
|
displayName: "SSH Hosts",
|
|
35
34
|
description: "SSH host entries for remote command execution",
|
|
36
|
-
key:
|
|
37
|
-
validate:
|
|
35
|
+
key: host => host.name,
|
|
36
|
+
validate: host => {
|
|
38
37
|
if (!host.name) return "Missing name";
|
|
39
38
|
if (!host.host) return "Missing host";
|
|
40
39
|
return undefined;
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
* Custom system prompt files (SYSTEM.md) that modify the agent's base system prompt.
|
|
5
5
|
* Distinct from context-files which are user instructions shown in conversation.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import { defineCapability } from "./index";
|
|
7
|
+
import { defineCapability } from ".";
|
|
9
8
|
import type { SourceMeta } from "./types";
|
|
10
9
|
|
|
11
10
|
/**
|
|
@@ -26,8 +25,8 @@ export const systemPromptCapability = defineCapability<SystemPrompt>({
|
|
|
26
25
|
id: "system-prompt",
|
|
27
26
|
displayName: "System Prompt",
|
|
28
27
|
description: "Custom system prompt files (SYSTEM.md) that modify agent behavior",
|
|
29
|
-
key:
|
|
30
|
-
validate:
|
|
28
|
+
key: sp => sp.level,
|
|
29
|
+
validate: sp => {
|
|
31
30
|
if (!sp.path) return "Missing path";
|
|
32
31
|
if (sp.content === undefined) return "Missing content";
|
|
33
32
|
return undefined;
|
package/src/capability/tool.ts
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* User-defined tools that extend agent capabilities.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { defineCapability } from "./index";
|
|
6
|
+
import { defineCapability } from ".";
|
|
8
7
|
import type { SourceMeta } from "./types";
|
|
9
8
|
|
|
10
9
|
/**
|
|
@@ -29,8 +28,8 @@ export const toolCapability = defineCapability<CustomTool>({
|
|
|
29
28
|
id: "tools",
|
|
30
29
|
displayName: "Custom Tools",
|
|
31
30
|
description: "User-defined tools that extend agent capabilities",
|
|
32
|
-
key:
|
|
33
|
-
validate:
|
|
31
|
+
key: tool => tool.name,
|
|
32
|
+
validate: tool => {
|
|
34
33
|
if (!tool.name) return "Missing name";
|
|
35
34
|
if (!tool.path) return "Missing path";
|
|
36
35
|
return undefined;
|
package/src/cli/args.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CLI argument parsing and help display
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
6
|
-
import { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR } from "@oh-my-pi/pi-coding-agent/config";
|
|
7
|
-
import { BUILTIN_TOOLS } from "@oh-my-pi/pi-coding-agent/tools/index";
|
|
8
5
|
import chalk from "chalk";
|
|
6
|
+
import { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR } from "../config";
|
|
7
|
+
import { BUILTIN_TOOLS } from "../tools";
|
|
9
8
|
|
|
10
9
|
export type Mode = "text" | "json" | "rpc";
|
|
11
10
|
|
|
@@ -99,13 +98,13 @@ export function parseArgs(args: string[], extensionFlags?: Map<string, { type: "
|
|
|
99
98
|
} else if (arg === "--session-dir" && i + 1 < args.length) {
|
|
100
99
|
result.sessionDir = args[++i];
|
|
101
100
|
} else if (arg === "--models" && i + 1 < args.length) {
|
|
102
|
-
result.models = args[++i].split(",").map(
|
|
101
|
+
result.models = args[++i].split(",").map(s => s.trim());
|
|
103
102
|
} else if (arg === "--no-tools") {
|
|
104
103
|
result.noTools = true;
|
|
105
104
|
} else if (arg === "--no-lsp") {
|
|
106
105
|
result.noLsp = true;
|
|
107
106
|
} else if (arg === "--tools" && i + 1 < args.length) {
|
|
108
|
-
const toolNames = args[++i].split(",").map(
|
|
107
|
+
const toolNames = args[++i].split(",").map(s => s.trim());
|
|
109
108
|
const validTools: string[] = [];
|
|
110
109
|
for (const name of toolNames) {
|
|
111
110
|
if (name in BUILTIN_TOOLS) {
|
|
@@ -148,7 +147,7 @@ export function parseArgs(args: string[], extensionFlags?: Map<string, { type: "
|
|
|
148
147
|
result.noTitle = true;
|
|
149
148
|
} else if (arg === "--skills" && i + 1 < args.length) {
|
|
150
149
|
// Comma-separated glob patterns for skill filtering
|
|
151
|
-
result.skills = args[++i].split(",").map(
|
|
150
|
+
result.skills = args[++i].split(",").map(s => s.trim());
|
|
152
151
|
} else if (arg === "--list-models") {
|
|
153
152
|
// Check if next arg is a search pattern (not a flag or file arg)
|
|
154
153
|
if (i + 1 < args.length && !args[i + 1].startsWith("-") && !args[i + 1].startsWith("@")) {
|
package/src/cli/config-cli.ts
CHANGED
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
* Handles `omp config <command>` subcommands for managing settings.
|
|
5
5
|
* Uses SETTINGS_DEFS as the source of truth for available settings.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import { APP_NAME, getAgentDir } from "@oh-my-pi/pi-coding-agent/config";
|
|
9
|
-
import { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
|
|
10
|
-
import { SETTINGS_DEFS, type SettingDef } from "@oh-my-pi/pi-coding-agent/modes/components/settings-defs";
|
|
11
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
12
7
|
import chalk from "chalk";
|
|
8
|
+
import { APP_NAME, getAgentDir } from "../config";
|
|
9
|
+
import { SettingsManager } from "../config/settings-manager";
|
|
10
|
+
import { SETTINGS_DEFS, type SettingDef } from "../modes/components/settings-defs";
|
|
11
|
+
import { theme } from "../modes/theme/theme";
|
|
13
12
|
|
|
14
13
|
// =============================================================================
|
|
15
14
|
// Types
|
|
@@ -32,7 +31,7 @@ export interface ConfigCommandArgs {
|
|
|
32
31
|
|
|
33
32
|
/** Find setting definition by ID */
|
|
34
33
|
function findSettingDef(id: string): SettingDef | undefined {
|
|
35
|
-
return SETTINGS_DEFS.find(
|
|
34
|
+
return SETTINGS_DEFS.find(def => def.id === id);
|
|
36
35
|
}
|
|
37
36
|
|
|
38
37
|
/** Get available values for a setting */
|
|
@@ -43,7 +42,7 @@ function getSettingValues(def: SettingDef, sm: SettingsManager): readonly string
|
|
|
43
42
|
if (def.type === "submenu") {
|
|
44
43
|
const options = def.getOptions(sm);
|
|
45
44
|
if (options.length > 0) {
|
|
46
|
-
return options.map(
|
|
45
|
+
return options.map(o => o.value);
|
|
47
46
|
}
|
|
48
47
|
}
|
|
49
48
|
return undefined;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Process @file CLI arguments into text content and image attachments
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
import { resolve } from "node:path";
|
|
4
|
+
import * as fs from "node:fs/promises";
|
|
5
|
+
import * as path from "node:path";
|
|
7
6
|
import type { ImageContent } from "@oh-my-pi/pi-ai";
|
|
8
|
-
import {
|
|
9
|
-
import { formatDimensionNote, resizeImage } from "@oh-my-pi/pi-coding-agent/utils/image-resize";
|
|
10
|
-
import { detectSupportedImageMimeTypeFromFile } from "@oh-my-pi/pi-coding-agent/utils/mime";
|
|
7
|
+
import { isEnoent } from "@oh-my-pi/pi-utils";
|
|
11
8
|
import chalk from "chalk";
|
|
9
|
+
import { resolveReadPath } from "../tools/path-utils";
|
|
10
|
+
import { formatDimensionNote, resizeImage } from "../utils/image-resize";
|
|
11
|
+
import { detectSupportedImageMimeTypeFromFile } from "../utils/mime";
|
|
12
12
|
|
|
13
13
|
export interface ProcessedFiles {
|
|
14
14
|
text: string;
|
|
@@ -28,16 +28,20 @@ export async function processFileArguments(fileArgs: string[], options?: Process
|
|
|
28
28
|
|
|
29
29
|
for (const fileArg of fileArgs) {
|
|
30
30
|
// Expand and resolve path (handles ~ expansion and macOS screenshot Unicode spaces)
|
|
31
|
-
const absolutePath = resolve(resolveReadPath(fileArg, process.cwd()));
|
|
31
|
+
const absolutePath = path.resolve(resolveReadPath(fileArg, process.cwd()));
|
|
32
32
|
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
// Read file, handling not-found gracefully
|
|
34
|
+
let buffer: Buffer;
|
|
35
|
+
try {
|
|
36
|
+
buffer = await fs.readFile(absolutePath);
|
|
37
|
+
} catch (err) {
|
|
38
|
+
if (isEnoent(err)) {
|
|
39
|
+
console.error(chalk.red(`Error: File not found: ${absolutePath}`));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
throw err;
|
|
37
43
|
}
|
|
38
|
-
|
|
39
|
-
if (stats.size === 0) {
|
|
40
|
-
// Skip empty files
|
|
44
|
+
if (buffer.length === 0) {
|
|
41
45
|
continue;
|
|
42
46
|
}
|
|
43
47
|
|
|
@@ -45,9 +49,7 @@ export async function processFileArguments(fileArgs: string[], options?: Process
|
|
|
45
49
|
|
|
46
50
|
if (mimeType) {
|
|
47
51
|
// Handle image file
|
|
48
|
-
const buffer = readFileSync(absolutePath);
|
|
49
52
|
const base64Content = buffer.toString("base64");
|
|
50
|
-
|
|
51
53
|
let attachment: ImageContent;
|
|
52
54
|
let dimensionNote: string | undefined;
|
|
53
55
|
|
|
@@ -87,7 +89,7 @@ export async function processFileArguments(fileArgs: string[], options?: Process
|
|
|
87
89
|
} else {
|
|
88
90
|
// Handle text file
|
|
89
91
|
try {
|
|
90
|
-
const content =
|
|
92
|
+
const content = buffer.toString("utf-8");
|
|
91
93
|
text += `<file name="${absolutePath}">\n${content}\n</file>\n`;
|
|
92
94
|
} catch (error: unknown) {
|
|
93
95
|
const message = error instanceof Error ? error.message : String(error);
|