@oh-my-pi/pi-coding-agent 8.1.0 → 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 +21 -1
- 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 +51 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +2 -3
- package/src/capability/extension-module.ts +2 -3
- package/src/capability/extension.ts +2 -3
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +2 -3
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +2 -3
- package/src/capability/mcp.ts +2 -3
- package/src/capability/prompt.ts +2 -3
- package/src/capability/rule.ts +2 -3
- package/src/capability/settings.ts +1 -2
- package/src/capability/skill.ts +2 -3
- package/src/capability/slash-command.ts +2 -3
- package/src/capability/ssh.ts +2 -3
- package/src/capability/system-prompt.ts +2 -3
- package/src/capability/tool.ts +2 -3
- 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 -21
- 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 +21 -23
- package/src/commit/agentic/fallback.ts +9 -9
- package/src/commit/agentic/index.ts +30 -38
- package/src/commit/agentic/state.ts +1 -6
- package/src/commit/agentic/tools/analyze-file.ts +15 -15
- package/src/commit/agentic/tools/git-file-diff.ts +3 -3
- package/src/commit/agentic/tools/git-hunk.ts +7 -7
- package/src/commit/agentic/tools/git-overview.ts +5 -5
- package/src/commit/agentic/tools/index.ts +14 -14
- package/src/commit/agentic/tools/propose-changelog.ts +6 -6
- package/src/commit/agentic/tools/propose-commit.ts +8 -8
- package/src/commit/agentic/tools/recent-commits.ts +2 -2
- package/src/commit/agentic/tools/split-commit.ts +19 -23
- package/src/commit/agentic/topo-sort.ts +1 -1
- package/src/commit/agentic/trivial.ts +3 -3
- package/src/commit/agentic/validation.ts +12 -12
- package/src/commit/analysis/conventional.ts +7 -11
- package/src/commit/analysis/index.ts +4 -4
- package/src/commit/analysis/scope.ts +4 -4
- package/src/commit/analysis/summary.ts +7 -9
- package/src/commit/analysis/validation.ts +1 -1
- package/src/commit/changelog/detect.ts +6 -6
- package/src/commit/changelog/generate.ts +7 -9
- package/src/commit/changelog/index.ts +13 -13
- package/src/commit/changelog/parse.ts +2 -2
- package/src/commit/cli.ts +1 -1
- package/src/commit/git/diff.ts +3 -3
- package/src/commit/git/index.ts +19 -24
- package/src/commit/index.ts +1 -1
- package/src/commit/map-reduce/index.ts +9 -9
- package/src/commit/map-reduce/map-phase.ts +19 -34
- package/src/commit/map-reduce/reduce-phase.ts +9 -11
- package/src/commit/message.ts +2 -2
- package/src/commit/model-selection.ts +3 -7
- package/src/commit/pipeline.ts +20 -22
- package/src/commit/utils/exclusions.ts +3 -3
- package/src/config/file-lock.ts +17 -7
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +55 -37
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +50 -34
- package/src/config.ts +60 -62
- 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 +16 -18
- 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 +17 -14
- package/src/extensibility/custom-commands/types.ts +1 -2
- package/src/extensibility/custom-tools/loader.ts +10 -11
- package/src/extensibility/custom-tools/types.ts +6 -7
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +75 -53
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +19 -26
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +8 -9
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +10 -17
- 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 +46 -46
- 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 +14 -10
- 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 +10 -16
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +55 -34
- 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 +3 -4
- 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 +60 -49
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +6 -6
- 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 +11 -16
- package/src/modes/components/tree-selector.ts +11 -11
- 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 +27 -29
- 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 -25
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +2 -2
- package/src/modes/theme/theme.ts +128 -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 +10 -11
- 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 +12 -13
- package/src/sdk.ts +60 -63
- package/src/session/agent-session.ts +83 -84
- package/src/session/agent-storage.ts +11 -11
- package/src/session/artifacts.ts +8 -9
- package/src/session/auth-storage.ts +25 -29
- 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 +2 -3
- 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 +27 -34
- 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 +33 -36
- package/src/task/output-manager.ts +3 -4
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +19 -20
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +32 -38
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +8 -9
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +19 -18
- package/src/tools/calculator.ts +12 -12
- package/src/tools/complete.ts +3 -4
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +23 -26
- package/src/tools/find.ts +15 -16
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +27 -27
- package/src/tools/index.ts +78 -56
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +7 -7
- package/src/tools/notebook.ts +5 -5
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +1 -1
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +36 -37
- package/src/tools/read.ts +23 -23
- package/src/tools/render-utils.ts +8 -9
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +31 -30
- package/src/tools/todo-write.ts +13 -13
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +11 -16
- package/src/tui/code-cell.ts +3 -9
- package/src/tui/file-list.ts +3 -4
- package/src/tui/output-block.ts +1 -2
- package/src/tui/status-line.ts +2 -3
- package/src/tui/tree-list.ts +2 -3
- package/src/tui/types.ts +1 -2
- package/src/tui/utils.ts +2 -3
- 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 +4 -9
- 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 +16 -18
- package/scripts/generate-wasm-b64.ts +0 -24
- package/src/commit/map-reduce/.map-phase.ts.kate-swp +0 -0
- package/src/task/.executor.ts.kate-swp +0 -0
- package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import analyzeFilePrompt from "@oh-my-pi/pi-coding-agent/commit/agentic/prompts/analyze-file.md" with { type: "text" };
|
|
2
|
-
import type { CommitAgentState } from "@oh-my-pi/pi-coding-agent/commit/agentic/state";
|
|
3
|
-
import { getFilePriority } from "@oh-my-pi/pi-coding-agent/commit/agentic/tools/git-file-diff";
|
|
4
|
-
import type { NumstatEntry } from "@oh-my-pi/pi-coding-agent/commit/types";
|
|
5
|
-
import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
|
|
6
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
7
|
-
import type { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
|
|
8
|
-
import type { CustomTool, CustomToolContext } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
9
|
-
import type { AuthStorage } from "@oh-my-pi/pi-coding-agent/session/auth-storage";
|
|
10
|
-
import { TaskTool } from "@oh-my-pi/pi-coding-agent/task";
|
|
11
|
-
import type { TaskParams } from "@oh-my-pi/pi-coding-agent/task/types";
|
|
12
|
-
import type { ToolSession } from "@oh-my-pi/pi-coding-agent/tools";
|
|
13
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import analyzeFilePrompt from "../../../commit/agentic/prompts/analyze-file.md" with { type: "text" };
|
|
3
|
+
import type { CommitAgentState } from "../../../commit/agentic/state";
|
|
4
|
+
import type { NumstatEntry } from "../../../commit/types";
|
|
5
|
+
import type { ModelRegistry } from "../../../config/model-registry";
|
|
6
|
+
import { renderPromptTemplate } from "../../../config/prompt-templates";
|
|
7
|
+
import type { SettingsManager } from "../../../config/settings-manager";
|
|
8
|
+
import type { CustomTool, CustomToolContext } from "../../../extensibility/custom-tools/types";
|
|
9
|
+
import type { AuthStorage } from "../../../session/auth-storage";
|
|
10
|
+
import { TaskTool } from "../../../task";
|
|
11
|
+
import type { TaskParams } from "../../../task/types";
|
|
12
|
+
import type { ToolSession } from "../../../tools";
|
|
13
|
+
import { getFilePriority } from "./git-file-diff";
|
|
14
14
|
|
|
15
15
|
const analyzeFileSchema = Type.Object({
|
|
16
16
|
files: Type.Array(Type.String({ description: "File path" }), { minItems: 1 }),
|
|
@@ -112,12 +112,12 @@ function inferFileType(path: string): string {
|
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
function formatRelatedFiles(files: string[], currentFile: string, numstat: NumstatEntry[]): string | undefined {
|
|
115
|
-
const others = files.filter(
|
|
115
|
+
const others = files.filter(file => file !== currentFile);
|
|
116
116
|
if (others.length === 0) return undefined;
|
|
117
117
|
|
|
118
|
-
const numstatMap = new Map(numstat.map(
|
|
118
|
+
const numstatMap = new Map(numstat.map(entry => [entry.path, entry]));
|
|
119
119
|
|
|
120
|
-
const lines = others.map(
|
|
120
|
+
const lines = others.map(file => {
|
|
121
121
|
const entry = numstatMap.get(file);
|
|
122
122
|
const fileType = inferFileType(file);
|
|
123
123
|
if (entry) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { CommitAgentState } from "@oh-my-pi/pi-coding-agent/commit/agentic/state";
|
|
2
|
-
import type { ControlledGit } from "@oh-my-pi/pi-coding-agent/commit/git";
|
|
3
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
4
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { CommitAgentState } from "../../../commit/agentic/state";
|
|
3
|
+
import type { ControlledGit } from "../../../commit/git";
|
|
4
|
+
import type { CustomTool } from "../../../extensibility/custom-tools/types";
|
|
5
5
|
|
|
6
6
|
const TARGET_TOKENS = 30000;
|
|
7
7
|
const CHARS_PER_TOKEN = 4;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { ControlledGit } from "@oh-my-pi/pi-coding-agent/commit/git";
|
|
2
|
-
import type { DiffHunk, FileHunks } from "@oh-my-pi/pi-coding-agent/commit/types";
|
|
3
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
4
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { ControlledGit } from "../../../commit/git";
|
|
3
|
+
import type { DiffHunk, FileHunks } from "../../../commit/types";
|
|
4
|
+
import type { CustomTool } from "../../../extensibility/custom-tools/types";
|
|
5
5
|
|
|
6
6
|
const gitHunkSchema = Type.Object({
|
|
7
7
|
file: Type.String({ description: "File path" }),
|
|
@@ -11,8 +11,8 @@ const gitHunkSchema = Type.Object({
|
|
|
11
11
|
|
|
12
12
|
function selectHunks(fileHunks: FileHunks, requested?: number[]): DiffHunk[] {
|
|
13
13
|
if (!requested || requested.length === 0) return fileHunks.hunks;
|
|
14
|
-
const wanted = new Set(requested.map(
|
|
15
|
-
return fileHunks.hunks.filter(
|
|
14
|
+
const wanted = new Set(requested.map(value => Math.max(1, Math.floor(value))));
|
|
15
|
+
return fileHunks.hunks.filter(hunk => wanted.has(hunk.index + 1));
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export function createGitHunkTool(git: ControlledGit): CustomTool<typeof gitHunkSchema> {
|
|
@@ -24,7 +24,7 @@ export function createGitHunkTool(git: ControlledGit): CustomTool<typeof gitHunk
|
|
|
24
24
|
async execute(_toolCallId, params) {
|
|
25
25
|
const staged = params.staged ?? true;
|
|
26
26
|
const hunks = await git.getHunks([params.file], staged);
|
|
27
|
-
const fileHunks = hunks.find(
|
|
27
|
+
const fileHunks = hunks.find(entry => entry.filename === params.file) ?? {
|
|
28
28
|
filename: params.file,
|
|
29
29
|
isBinary: false,
|
|
30
30
|
hunks: [],
|
|
@@ -36,7 +36,7 @@ export function createGitHunkTool(git: ControlledGit): CustomTool<typeof gitHunk
|
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
38
|
const selected = selectHunks(fileHunks, params.hunks);
|
|
39
|
-
const text = selected.length ? selected.map(
|
|
39
|
+
const text = selected.length ? selected.map(hunk => hunk.content).join("\n\n") : "(no matching hunks)";
|
|
40
40
|
return {
|
|
41
41
|
content: [{ type: "text", text }],
|
|
42
42
|
details: {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { CommitAgentState, GitOverviewSnapshot } from "@oh-my-pi/pi-coding-agent/commit/agentic/state";
|
|
2
|
-
import { extractScopeCandidates } from "@oh-my-pi/pi-coding-agent/commit/analysis/scope";
|
|
3
|
-
import type { ControlledGit } from "@oh-my-pi/pi-coding-agent/commit/git";
|
|
4
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
5
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { CommitAgentState, GitOverviewSnapshot } from "../../../commit/agentic/state";
|
|
3
|
+
import { extractScopeCandidates } from "../../../commit/analysis/scope";
|
|
4
|
+
import type { ControlledGit } from "../../../commit/git";
|
|
5
|
+
import type { CustomTool } from "../../../extensibility/custom-tools/types";
|
|
6
6
|
|
|
7
7
|
const EXCLUDED_LOCK_FILES = new Set([
|
|
8
8
|
"Cargo.lock",
|
|
@@ -62,7 +62,7 @@ export function createGitOverviewTool(
|
|
|
62
62
|
const { filtered: files, excluded } = filterExcludedFiles(allFiles);
|
|
63
63
|
const stat = await git.getStat(staged);
|
|
64
64
|
const allNumstat = await git.getNumstat(staged);
|
|
65
|
-
const numstat = allNumstat.filter(
|
|
65
|
+
const numstat = allNumstat.filter(entry => !isExcludedFile(entry.path));
|
|
66
66
|
const scopeResult = extractScopeCandidates(numstat);
|
|
67
67
|
const untrackedFiles = !staged && params.include_untracked ? await git.getUntrackedFiles() : undefined;
|
|
68
68
|
const snapshot: GitOverviewSnapshot = {
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import type { CommitAgentState } from "
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
1
|
+
import type { CommitAgentState } from "../../../commit/agentic/state";
|
|
2
|
+
import type { ControlledGit } from "../../../commit/git";
|
|
3
|
+
import type { ModelRegistry } from "../../../config/model-registry";
|
|
4
|
+
import type { SettingsManager } from "../../../config/settings-manager";
|
|
5
|
+
import type { CustomTool } from "../../../extensibility/custom-tools/types";
|
|
6
|
+
import type { AuthStorage } from "../../../session/auth-storage";
|
|
7
|
+
import { createAnalyzeFileTool } from "./analyze-file";
|
|
8
|
+
import { createGitFileDiffTool } from "./git-file-diff";
|
|
9
|
+
import { createGitHunkTool } from "./git-hunk";
|
|
10
|
+
import { createGitOverviewTool } from "./git-overview";
|
|
11
|
+
import { createProposeChangelogTool } from "./propose-changelog";
|
|
12
|
+
import { createProposeCommitTool } from "./propose-commit";
|
|
13
|
+
import { createRecentCommitsTool } from "./recent-commits";
|
|
14
|
+
import { createSplitCommitTool } from "./split-commit";
|
|
15
15
|
|
|
16
16
|
export interface CommitToolOptions {
|
|
17
17
|
cwd: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { CommitAgentState } from "@oh-my-pi/pi-coding-agent/commit/agentic/state";
|
|
2
|
-
import type { ChangelogCategory } from "@oh-my-pi/pi-coding-agent/commit/types";
|
|
3
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
4
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { CommitAgentState } from "../../../commit/agentic/state";
|
|
3
|
+
import type { ChangelogCategory } from "../../../commit/types";
|
|
4
|
+
import type { CustomTool } from "../../../extensibility/custom-tools/types";
|
|
5
5
|
|
|
6
6
|
const changelogEntrySchema = Type.Object({
|
|
7
7
|
path: Type.String(),
|
|
@@ -48,14 +48,14 @@ export function createProposeChangelogTool(
|
|
|
48
48
|
const targets = new Set(changelogTargets);
|
|
49
49
|
const seen = new Set<string>();
|
|
50
50
|
|
|
51
|
-
const normalized = params.entries.map(
|
|
51
|
+
const normalized = params.entries.map(entry => {
|
|
52
52
|
const cleaned: Record<string, string[]> = {};
|
|
53
53
|
for (const [category, values] of Object.entries(entry.entries ?? {})) {
|
|
54
54
|
if (!allowedCategories.has(category as ChangelogCategory)) {
|
|
55
55
|
errors.push(`Unknown changelog category for ${entry.path}: ${category}`);
|
|
56
56
|
continue;
|
|
57
57
|
}
|
|
58
|
-
const items = values.map(
|
|
58
|
+
const items = values.map(value => value.trim().replace(/\.$/, "")).filter(value => value.length > 0);
|
|
59
59
|
if (items.length > 0) {
|
|
60
60
|
cleaned[category] = Array.from(new Set(items));
|
|
61
61
|
}
|
|
@@ -69,7 +69,7 @@ export function createProposeChangelogTool(
|
|
|
69
69
|
errors.push(`Unknown deletion category for ${entry.path}: ${category}`);
|
|
70
70
|
continue;
|
|
71
71
|
}
|
|
72
|
-
const items = values.map(
|
|
72
|
+
const items = values.map(value => value.trim()).filter(value => value.length > 0);
|
|
73
73
|
if (items.length > 0) {
|
|
74
74
|
cleanedDeletions[category] = Array.from(new Set(items));
|
|
75
75
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { CommitAgentState } from "../../../commit/agentic/state";
|
|
2
3
|
import {
|
|
3
4
|
capDetails,
|
|
4
5
|
MAX_DETAIL_ITEMS,
|
|
@@ -6,12 +7,11 @@ import {
|
|
|
6
7
|
SUMMARY_MAX_CHARS,
|
|
7
8
|
validateSummaryRules,
|
|
8
9
|
validateTypeConsistency,
|
|
9
|
-
} from "
|
|
10
|
-
import { validateAnalysis } from "
|
|
11
|
-
import type { ControlledGit } from "
|
|
12
|
-
import type { CommitType, ConventionalAnalysis, ConventionalDetail } from "
|
|
13
|
-
import type { CustomTool } from "
|
|
14
|
-
import { Type } from "@sinclair/typebox";
|
|
10
|
+
} from "../../../commit/agentic/validation";
|
|
11
|
+
import { validateAnalysis } from "../../../commit/analysis/validation";
|
|
12
|
+
import type { ControlledGit } from "../../../commit/git";
|
|
13
|
+
import type { CommitType, ConventionalAnalysis, ConventionalDetail } from "../../../commit/types";
|
|
14
|
+
import type { CustomTool } from "../../../extensibility/custom-tools/types";
|
|
15
15
|
|
|
16
16
|
const commitTypeSchema = Type.Union([
|
|
17
17
|
Type.Literal("feat"),
|
|
@@ -71,7 +71,7 @@ function normalizeDetails(
|
|
|
71
71
|
user_visible?: boolean;
|
|
72
72
|
}>,
|
|
73
73
|
): ConventionalDetail[] {
|
|
74
|
-
return details.map(
|
|
74
|
+
return details.map(detail => ({
|
|
75
75
|
text: detail.text.trim(),
|
|
76
76
|
changelogCategory: detail.user_visible ? detail.changelog_category : undefined,
|
|
77
77
|
userVisible: detail.user_visible ?? false,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { ControlledGit } from "@oh-my-pi/pi-coding-agent/commit/git";
|
|
2
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
3
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { ControlledGit } from "../../../commit/git";
|
|
3
|
+
import type { CustomTool } from "../../../extensibility/custom-tools/types";
|
|
4
4
|
|
|
5
5
|
const recentCommitsSchema = Type.Object({
|
|
6
6
|
count: Type.Optional(Type.Number({ description: "Number of commits to fetch", minimum: 1, maximum: 50 })),
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
SplitCommitPlan,
|
|
5
|
-
} from "@oh-my-pi/pi-coding-agent/commit/agentic/state";
|
|
6
|
-
import { computeDependencyOrder } from "@oh-my-pi/pi-coding-agent/commit/agentic/topo-sort";
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { CommitAgentState, SplitCommitGroup, SplitCommitPlan } from "../../../commit/agentic/state";
|
|
3
|
+
import { computeDependencyOrder } from "../../../commit/agentic/topo-sort";
|
|
7
4
|
import {
|
|
8
5
|
capDetails,
|
|
9
6
|
MAX_DETAIL_ITEMS,
|
|
@@ -11,12 +8,11 @@ import {
|
|
|
11
8
|
SUMMARY_MAX_CHARS,
|
|
12
9
|
validateSummaryRules,
|
|
13
10
|
validateTypeConsistency,
|
|
14
|
-
} from "
|
|
15
|
-
import { validateScope } from "
|
|
16
|
-
import type { ControlledGit } from "
|
|
17
|
-
import type { ConventionalDetail } from "
|
|
18
|
-
import type { CustomTool } from "
|
|
19
|
-
import { Type } from "@sinclair/typebox";
|
|
11
|
+
} from "../../../commit/agentic/validation";
|
|
12
|
+
import { validateScope } from "../../../commit/analysis/validation";
|
|
13
|
+
import type { ControlledGit } from "../../../commit/git";
|
|
14
|
+
import type { ConventionalDetail } from "../../../commit/types";
|
|
15
|
+
import type { CustomTool } from "../../../extensibility/custom-tools/types";
|
|
20
16
|
|
|
21
17
|
const commitTypeSchema = Type.Union([
|
|
22
18
|
Type.Literal("feat"),
|
|
@@ -89,7 +85,7 @@ function normalizeDetails(
|
|
|
89
85
|
user_visible?: boolean;
|
|
90
86
|
}>,
|
|
91
87
|
): ConventionalDetail[] {
|
|
92
|
-
return details.map(
|
|
88
|
+
return details.map(detail => ({
|
|
93
89
|
text: detail.text.trim(),
|
|
94
90
|
changelogCategory: detail.user_visible ? detail.changelog_category : undefined,
|
|
95
91
|
userVisible: detail.user_visible ?? false,
|
|
@@ -120,14 +116,14 @@ export function createSplitCommitTool(
|
|
|
120
116
|
const summary = normalizeSummary(commit.summary, commit.type, scope);
|
|
121
117
|
const detailInput = normalizeDetails(commit.details ?? []);
|
|
122
118
|
const detailResult = capDetails(detailInput);
|
|
123
|
-
warnings.push(...detailResult.warnings.map(
|
|
119
|
+
warnings.push(...detailResult.warnings.map(warning => `Commit ${index + 1}: ${warning}`));
|
|
124
120
|
const issueRefs = commit.issue_refs ?? [];
|
|
125
|
-
const dependencies = (commit.dependencies ?? []).map(
|
|
126
|
-
const changes = commit.changes.map(
|
|
121
|
+
const dependencies = (commit.dependencies ?? []).map(dep => Math.floor(dep));
|
|
122
|
+
const changes = commit.changes.map(change => ({
|
|
127
123
|
path: change.path,
|
|
128
124
|
hunks: change.hunks,
|
|
129
125
|
}));
|
|
130
|
-
const files = changes.map(
|
|
126
|
+
const files = changes.map(change => change.path);
|
|
131
127
|
|
|
132
128
|
const summaryValidation = validateSummaryRules(summary);
|
|
133
129
|
const scopeValidation = validateScope(scope);
|
|
@@ -138,16 +134,16 @@ export function createSplitCommitTool(
|
|
|
138
134
|
});
|
|
139
135
|
|
|
140
136
|
if (summaryValidation.errors.length > 0) {
|
|
141
|
-
errors.push(...summaryValidation.errors.map(
|
|
137
|
+
errors.push(...summaryValidation.errors.map(error => `Commit ${index + 1}: ${error}`));
|
|
142
138
|
}
|
|
143
139
|
if (!scopeValidation.valid) {
|
|
144
|
-
errors.push(...scopeValidation.errors.map(
|
|
140
|
+
errors.push(...scopeValidation.errors.map(error => `Commit ${index + 1}: ${error}`));
|
|
145
141
|
}
|
|
146
142
|
if (typeValidation.errors.length > 0) {
|
|
147
|
-
errors.push(...typeValidation.errors.map(
|
|
143
|
+
errors.push(...typeValidation.errors.map(error => `Commit ${index + 1}: ${error}`));
|
|
148
144
|
}
|
|
149
|
-
warnings.push(...summaryValidation.warnings.map(
|
|
150
|
-
warnings.push(...typeValidation.warnings.map(
|
|
145
|
+
warnings.push(...summaryValidation.warnings.map(warning => `Commit ${index + 1}: ${warning}`));
|
|
146
|
+
warnings.push(...typeValidation.warnings.map(warning => `Commit ${index + 1}: ${warning}`));
|
|
151
147
|
const hunkValidation = validateHunkSelectors(index, changes, files);
|
|
152
148
|
warnings.push(...hunkValidation.warnings);
|
|
153
149
|
errors.push(...hunkValidation.errors);
|
|
@@ -243,7 +239,7 @@ function validateHunkSelectors(
|
|
|
243
239
|
for (const change of changes) {
|
|
244
240
|
if (change.hunks.type === "indices") {
|
|
245
241
|
const invalid = change.hunks.indices.filter(
|
|
246
|
-
|
|
242
|
+
value => !Number.isFinite(value) || Math.floor(value) !== value || value < 1,
|
|
247
243
|
);
|
|
248
244
|
if (invalid.length > 0) {
|
|
249
245
|
errors.push(`${prefix}: invalid hunk indices for ${change.path}`);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SplitCommitGroup } from "
|
|
1
|
+
import type { SplitCommitGroup } from "./state";
|
|
2
2
|
|
|
3
3
|
export function computeDependencyOrder(groups: SplitCommitGroup[]): number[] | { error: string } {
|
|
4
4
|
const total = groups.length;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CommitType } from "
|
|
1
|
+
import type { CommitType } from "../../commit/types";
|
|
2
2
|
|
|
3
3
|
export interface TrivialChangeResult {
|
|
4
4
|
isTrivial: true;
|
|
@@ -12,9 +12,9 @@ const EMPTY_LINE_PATTERN = /^[-+]\s*$/;
|
|
|
12
12
|
|
|
13
13
|
export function detectTrivialChange(diff: string): TrivialChangeResult | null {
|
|
14
14
|
const lines = diff.split("\n");
|
|
15
|
-
const changeLines = lines.filter(
|
|
15
|
+
const changeLines = lines.filter(line => line.startsWith("+") || line.startsWith("-"));
|
|
16
16
|
const contentLines = changeLines.filter(
|
|
17
|
-
|
|
17
|
+
line => !line.startsWith("+++") && !line.startsWith("---") && !line.startsWith("@@"),
|
|
18
18
|
);
|
|
19
19
|
|
|
20
20
|
if (contentLines.length === 0) return null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { stripTypePrefix } from "
|
|
2
|
-
import { validateSummary } from "
|
|
3
|
-
import type { CommitType, ConventionalDetail } from "
|
|
1
|
+
import { stripTypePrefix } from "../../commit/analysis/summary";
|
|
2
|
+
import { validateSummary } from "../../commit/analysis/validation";
|
|
3
|
+
import type { CommitType, ConventionalDetail } from "../../commit/types";
|
|
4
4
|
|
|
5
5
|
export const SUMMARY_MAX_CHARS = 72;
|
|
6
6
|
export const MAX_DETAIL_ITEMS = 6;
|
|
@@ -129,7 +129,7 @@ export function capDetails(details: ConventionalDetail[]): { details: Convention
|
|
|
129
129
|
}));
|
|
130
130
|
|
|
131
131
|
scored.sort((a, b) => b.score - a.score || a.index - b.index);
|
|
132
|
-
const keep = new Set(scored.slice(0, MAX_DETAIL_ITEMS).map(
|
|
132
|
+
const keep = new Set(scored.slice(0, MAX_DETAIL_ITEMS).map(entry => entry.index));
|
|
133
133
|
const kept = details.filter((_detail, index) => keep.has(index));
|
|
134
134
|
const warnings = [`Capped detail list to ${MAX_DETAIL_ITEMS} items based on priority scoring.`];
|
|
135
135
|
return { details: kept, warnings };
|
|
@@ -155,18 +155,18 @@ export function validateTypeConsistency(
|
|
|
155
155
|
): { errors: string[]; warnings: string[] } {
|
|
156
156
|
const errors: string[] = [];
|
|
157
157
|
const warnings: string[] = [];
|
|
158
|
-
const lowerFiles = files.map(
|
|
159
|
-
const hasDocs = lowerFiles.some(
|
|
158
|
+
const lowerFiles = files.map(file => file.toLowerCase());
|
|
159
|
+
const hasDocs = lowerFiles.some(file => /\.(md|mdx|adoc|rst)$/.test(file));
|
|
160
160
|
const hasTests = lowerFiles.some(
|
|
161
|
-
|
|
161
|
+
file => /(^|\/)(test|tests|__tests__)(\/|$)/.test(file) || /(^|\/).*(_test|\.test|\.spec)\./.test(file),
|
|
162
162
|
);
|
|
163
|
-
const hasCI = lowerFiles.some(
|
|
164
|
-
const hasBuild = lowerFiles.some(
|
|
165
|
-
["cargo.toml", "package.json", "makefile"].some(
|
|
163
|
+
const hasCI = lowerFiles.some(file => file.startsWith(".github/workflows/") || file.startsWith(".gitlab-ci"));
|
|
164
|
+
const hasBuild = lowerFiles.some(file =>
|
|
165
|
+
["cargo.toml", "package.json", "makefile"].some(candidate => file.endsWith(candidate)),
|
|
166
166
|
);
|
|
167
|
-
const hasPerfEvidence = lowerFiles.some(
|
|
167
|
+
const hasPerfEvidence = lowerFiles.some(file => /(bench|benchmark|perf)/.test(file));
|
|
168
168
|
const summary = options.summary?.toLowerCase() ?? "";
|
|
169
|
-
const detailText = options.details?.map(
|
|
169
|
+
const detailText = options.details?.map(detail => detail.text.toLowerCase()).join(" ") ?? "";
|
|
170
170
|
const hasPerfKeywords = /(performance|optimiz|latency|throughput|benchmark)/.test(`${summary} ${detailText}`);
|
|
171
171
|
|
|
172
172
|
switch (type) {
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import type { Api, AssistantMessage, Model, ToolCall } from "@oh-my-pi/pi-ai";
|
|
2
2
|
import { completeSimple, validateToolCall } from "@oh-my-pi/pi-ai";
|
|
3
|
-
import analysisSystemPrompt from "@oh-my-pi/pi-coding-agent/commit/prompts/analysis-system.md" with { type: "text" };
|
|
4
|
-
import analysisUserPrompt from "@oh-my-pi/pi-coding-agent/commit/prompts/analysis-user.md" with { type: "text" };
|
|
5
|
-
import type {
|
|
6
|
-
ChangelogCategory,
|
|
7
|
-
ConventionalAnalysis,
|
|
8
|
-
ConventionalDetail,
|
|
9
|
-
} from "@oh-my-pi/pi-coding-agent/commit/types";
|
|
10
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
11
3
|
import { Type } from "@sinclair/typebox";
|
|
4
|
+
import analysisSystemPrompt from "../../commit/prompts/analysis-system.md" with { type: "text" };
|
|
5
|
+
import analysisUserPrompt from "../../commit/prompts/analysis-user.md" with { type: "text" };
|
|
6
|
+
import type { ChangelogCategory, ConventionalAnalysis, ConventionalDetail } from "../../commit/types";
|
|
7
|
+
import { renderPromptTemplate } from "../../config/prompt-templates";
|
|
12
8
|
|
|
13
9
|
const ConventionalAnalysisTool = {
|
|
14
10
|
name: "create_conventional_analysis",
|
|
@@ -126,7 +122,7 @@ function normalizeAnalysis(parsed: {
|
|
|
126
122
|
details: Array<{ text: string; changelog_category?: ChangelogCategory; user_visible?: boolean }>;
|
|
127
123
|
issue_refs: string[];
|
|
128
124
|
}): ConventionalAnalysis {
|
|
129
|
-
const details: ConventionalDetail[] = parsed.details.map(
|
|
125
|
+
const details: ConventionalDetail[] = parsed.details.map(detail => ({
|
|
130
126
|
text: detail.text.trim(),
|
|
131
127
|
changelogCategory: detail.user_visible ? detail.changelog_category : undefined,
|
|
132
128
|
userVisible: detail.user_visible ?? false,
|
|
@@ -150,8 +146,8 @@ function extractToolCall(message: AssistantMessage, name: string): ToolCall | un
|
|
|
150
146
|
|
|
151
147
|
function extractTextContent(message: AssistantMessage): string {
|
|
152
148
|
return message.content
|
|
153
|
-
.filter(
|
|
154
|
-
.map(
|
|
149
|
+
.filter(content => content.type === "text")
|
|
150
|
+
.map(content => content.text)
|
|
155
151
|
.join("")
|
|
156
152
|
.trim();
|
|
157
153
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { generateConventionalAnalysis } from "
|
|
2
|
-
export { extractScopeCandidates } from "
|
|
3
|
-
export { generateSummary, stripTypePrefix } from "
|
|
4
|
-
export { validateAnalysis, validateScope, validateSummary } from "
|
|
1
|
+
export { generateConventionalAnalysis } from "./conventional";
|
|
2
|
+
export { extractScopeCandidates } from "./scope";
|
|
3
|
+
export { generateSummary, stripTypePrefix } from "./summary";
|
|
4
|
+
export { validateAnalysis, validateScope, validateSummary } from "./validation";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { NumstatEntry } from "
|
|
2
|
-
import { isExcludedFile } from "
|
|
1
|
+
import type { NumstatEntry } from "../../commit/types";
|
|
2
|
+
import { isExcludedFile } from "../../commit/utils/exclusions";
|
|
3
3
|
|
|
4
4
|
interface ScopeCandidate {
|
|
5
5
|
path: string;
|
|
@@ -50,7 +50,7 @@ export function extractScopeCandidates(numstat: NumstatEntry[]): ScopeCandidates
|
|
|
50
50
|
totalLines += linesChanged;
|
|
51
51
|
const components = extractComponentsFromPath(normalizedPath);
|
|
52
52
|
for (const component of components) {
|
|
53
|
-
if (component.split("/").some(
|
|
53
|
+
if (component.split("/").some(segment => segment.includes("."))) {
|
|
54
54
|
continue;
|
|
55
55
|
}
|
|
56
56
|
componentLines.set(component, (componentLines.get(component) ?? 0) + linesChanged);
|
|
@@ -150,7 +150,7 @@ function extractComponentsFromPath(path: string): string[] {
|
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
function extractTopLevelRoot(path: string): string | null {
|
|
153
|
-
const segments = path.split("/").filter(
|
|
153
|
+
const segments = path.split("/").filter(segment => segment.length > 0);
|
|
154
154
|
if (segments.length === 0) return null;
|
|
155
155
|
if (segments.length === 1) {
|
|
156
156
|
return segments[0]!.startsWith(".") ? null : "(root)";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Api, AssistantMessage, Model, ToolCall } from "@oh-my-pi/pi-ai";
|
|
2
2
|
import { completeSimple, validateToolCall } from "@oh-my-pi/pi-ai";
|
|
3
|
-
import summarySystemPrompt from "@oh-my-pi/pi-coding-agent/commit/prompts/summary-system.md" with { type: "text" };
|
|
4
|
-
import summaryUserPrompt from "@oh-my-pi/pi-coding-agent/commit/prompts/summary-user.md" with { type: "text" };
|
|
5
|
-
import type { CommitSummary } from "@oh-my-pi/pi-coding-agent/commit/types";
|
|
6
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
7
3
|
import { Type } from "@sinclair/typebox";
|
|
4
|
+
import summarySystemPrompt from "../../commit/prompts/summary-system.md" with { type: "text" };
|
|
5
|
+
import summaryUserPrompt from "../../commit/prompts/summary-user.md" with { type: "text" };
|
|
6
|
+
import type { CommitSummary } from "../../commit/types";
|
|
7
|
+
import { renderPromptTemplate } from "../../config/prompt-templates";
|
|
8
8
|
|
|
9
9
|
const SummaryTool = {
|
|
10
10
|
name: "create_commit_summary",
|
|
@@ -86,15 +86,13 @@ function parseSummaryFromResponse(message: AssistantMessage, commitType: string,
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
function extractToolCall(message: AssistantMessage, name: string): ToolCall | undefined {
|
|
89
|
-
return message.content.find(
|
|
90
|
-
| ToolCall
|
|
91
|
-
| undefined;
|
|
89
|
+
return message.content.find(content => content.type === "toolCall" && content.name === name) as ToolCall | undefined;
|
|
92
90
|
}
|
|
93
91
|
|
|
94
92
|
function extractTextContent(message: AssistantMessage): string {
|
|
95
93
|
return message.content
|
|
96
|
-
.filter(
|
|
97
|
-
.map(
|
|
94
|
+
.filter(content => content.type === "text")
|
|
95
|
+
.map(content => content.text)
|
|
98
96
|
.join("")
|
|
99
97
|
.trim();
|
|
100
98
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { ChangelogBoundary } from "
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import type { ChangelogBoundary } from "../../commit/types";
|
|
3
3
|
|
|
4
4
|
const CHANGELOG_NAME = "CHANGELOG.md";
|
|
5
5
|
|
|
@@ -21,15 +21,15 @@ export async function detectChangelogBoundaries(cwd: string, stagedFiles: string
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
async function findNearestChangelog(cwd: string, filePath: string): Promise<string | null> {
|
|
24
|
-
let current = resolve(cwd, dirname(filePath));
|
|
25
|
-
const root = resolve(cwd);
|
|
24
|
+
let current = path.resolve(cwd, path.dirname(filePath));
|
|
25
|
+
const root = path.resolve(cwd);
|
|
26
26
|
while (true) {
|
|
27
|
-
const candidate = resolve(current, CHANGELOG_NAME);
|
|
27
|
+
const candidate = path.resolve(current, CHANGELOG_NAME);
|
|
28
28
|
if (await Bun.file(candidate).exists()) {
|
|
29
29
|
return candidate;
|
|
30
30
|
}
|
|
31
31
|
if (current === root) return null;
|
|
32
|
-
const parent = dirname(current);
|
|
32
|
+
const parent = path.dirname(current);
|
|
33
33
|
if (parent === current) return null;
|
|
34
34
|
current = parent;
|
|
35
35
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Api, AssistantMessage, Model, ToolCall } from "@oh-my-pi/pi-ai";
|
|
2
2
|
import { completeSimple, validateToolCall } from "@oh-my-pi/pi-ai";
|
|
3
|
-
import changelogSystemPrompt from "@oh-my-pi/pi-coding-agent/commit/prompts/changelog-system.md" with { type: "text" };
|
|
4
|
-
import changelogUserPrompt from "@oh-my-pi/pi-coding-agent/commit/prompts/changelog-user.md" with { type: "text" };
|
|
5
|
-
import type { ChangelogGenerationResult } from "@oh-my-pi/pi-coding-agent/commit/types";
|
|
6
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
7
3
|
import { Type } from "@sinclair/typebox";
|
|
4
|
+
import changelogSystemPrompt from "../../commit/prompts/changelog-system.md" with { type: "text" };
|
|
5
|
+
import changelogUserPrompt from "../../commit/prompts/changelog-user.md" with { type: "text" };
|
|
6
|
+
import type { ChangelogGenerationResult } from "../../commit/types";
|
|
7
|
+
import { renderPromptTemplate } from "../../config/prompt-templates";
|
|
8
8
|
|
|
9
9
|
const ChangelogTool = {
|
|
10
10
|
name: "create_changelog_entries",
|
|
@@ -67,15 +67,13 @@ function parseChangelogResponse(message: AssistantMessage): ChangelogGenerationR
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
function extractToolCall(message: AssistantMessage, name: string): ToolCall | undefined {
|
|
70
|
-
return message.content.find(
|
|
71
|
-
| ToolCall
|
|
72
|
-
| undefined;
|
|
70
|
+
return message.content.find(content => content.type === "toolCall" && content.name === name) as ToolCall | undefined;
|
|
73
71
|
}
|
|
74
72
|
|
|
75
73
|
function extractTextContent(message: AssistantMessage): string {
|
|
76
74
|
return message.content
|
|
77
|
-
.filter(
|
|
78
|
-
.map(
|
|
75
|
+
.filter(content => content.type === "text")
|
|
76
|
+
.map(content => content.text)
|
|
79
77
|
.join("")
|
|
80
78
|
.trim();
|
|
81
79
|
}
|