@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.
Files changed (402) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/docs/session.md +111 -46
  3. package/examples/custom-tools/hello/index.ts +1 -1
  4. package/examples/custom-tools/todo/index.ts +3 -4
  5. package/examples/extensions/api-demo.ts +0 -1
  6. package/examples/extensions/chalk-logger.ts +2 -3
  7. package/examples/extensions/hello.ts +0 -1
  8. package/examples/extensions/pirate.ts +0 -1
  9. package/examples/extensions/plan-mode.ts +15 -16
  10. package/examples/extensions/todo.ts +3 -4
  11. package/examples/extensions/tools.ts +1 -2
  12. package/examples/extensions/with-deps/index.ts +0 -1
  13. package/examples/hooks/auto-commit-on-exit.ts +1 -2
  14. package/examples/hooks/confirm-destructive.ts +0 -1
  15. package/examples/hooks/custom-compaction.ts +1 -2
  16. package/examples/hooks/dirty-repo-guard.ts +0 -1
  17. package/examples/hooks/file-trigger.ts +3 -4
  18. package/examples/hooks/git-checkpoint.ts +0 -1
  19. package/examples/hooks/handoff.ts +3 -4
  20. package/examples/hooks/permission-gate.ts +1 -2
  21. package/examples/hooks/protected-paths.ts +1 -2
  22. package/examples/hooks/qna.ts +2 -3
  23. package/examples/hooks/snake.ts +4 -5
  24. package/examples/hooks/status-line.ts +0 -1
  25. package/examples/sdk/01-minimal.ts +2 -3
  26. package/examples/sdk/02-custom-model.ts +2 -3
  27. package/examples/sdk/03-custom-prompt.ts +3 -4
  28. package/examples/sdk/04-skills.ts +2 -3
  29. package/examples/sdk/06-extensions.ts +1 -2
  30. package/examples/sdk/06-hooks.ts +6 -7
  31. package/examples/sdk/07-context-files.ts +0 -1
  32. package/examples/sdk/08-prompt-templates.ts +0 -1
  33. package/examples/sdk/08-slash-commands.ts +0 -1
  34. package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
  35. package/examples/sdk/10-settings.ts +0 -1
  36. package/examples/sdk/11-sessions.ts +0 -1
  37. package/package.json +51 -23
  38. package/scripts/format-prompts.ts +0 -1
  39. package/src/capability/context-file.ts +2 -3
  40. package/src/capability/extension-module.ts +2 -3
  41. package/src/capability/extension.ts +2 -3
  42. package/src/capability/fs.ts +20 -21
  43. package/src/capability/hook.ts +2 -3
  44. package/src/capability/index.ts +15 -16
  45. package/src/capability/instruction.ts +2 -3
  46. package/src/capability/mcp.ts +2 -3
  47. package/src/capability/prompt.ts +2 -3
  48. package/src/capability/rule.ts +2 -3
  49. package/src/capability/settings.ts +1 -2
  50. package/src/capability/skill.ts +2 -3
  51. package/src/capability/slash-command.ts +2 -3
  52. package/src/capability/ssh.ts +2 -3
  53. package/src/capability/system-prompt.ts +2 -3
  54. package/src/capability/tool.ts +2 -3
  55. package/src/cli/args.ts +5 -6
  56. package/src/cli/config-cli.ts +6 -7
  57. package/src/cli/file-processor.ts +19 -17
  58. package/src/cli/jupyter-cli.ts +105 -0
  59. package/src/cli/list-models.ts +10 -11
  60. package/src/cli/plugin-cli.ts +20 -21
  61. package/src/cli/session-picker.ts +2 -3
  62. package/src/cli/setup-cli.ts +2 -3
  63. package/src/cli/stats-cli.ts +2 -3
  64. package/src/cli/update-cli.ts +25 -22
  65. package/src/commit/agentic/agent.ts +21 -23
  66. package/src/commit/agentic/fallback.ts +9 -9
  67. package/src/commit/agentic/index.ts +30 -38
  68. package/src/commit/agentic/state.ts +1 -6
  69. package/src/commit/agentic/tools/analyze-file.ts +15 -15
  70. package/src/commit/agentic/tools/git-file-diff.ts +3 -3
  71. package/src/commit/agentic/tools/git-hunk.ts +7 -7
  72. package/src/commit/agentic/tools/git-overview.ts +5 -5
  73. package/src/commit/agentic/tools/index.ts +14 -14
  74. package/src/commit/agentic/tools/propose-changelog.ts +6 -6
  75. package/src/commit/agentic/tools/propose-commit.ts +8 -8
  76. package/src/commit/agentic/tools/recent-commits.ts +2 -2
  77. package/src/commit/agentic/tools/split-commit.ts +19 -23
  78. package/src/commit/agentic/topo-sort.ts +1 -1
  79. package/src/commit/agentic/trivial.ts +3 -3
  80. package/src/commit/agentic/validation.ts +12 -12
  81. package/src/commit/analysis/conventional.ts +7 -11
  82. package/src/commit/analysis/index.ts +4 -4
  83. package/src/commit/analysis/scope.ts +4 -4
  84. package/src/commit/analysis/summary.ts +7 -9
  85. package/src/commit/analysis/validation.ts +1 -1
  86. package/src/commit/changelog/detect.ts +6 -6
  87. package/src/commit/changelog/generate.ts +7 -9
  88. package/src/commit/changelog/index.ts +13 -13
  89. package/src/commit/changelog/parse.ts +2 -2
  90. package/src/commit/cli.ts +1 -1
  91. package/src/commit/git/diff.ts +3 -3
  92. package/src/commit/git/index.ts +19 -24
  93. package/src/commit/index.ts +1 -1
  94. package/src/commit/map-reduce/index.ts +9 -9
  95. package/src/commit/map-reduce/map-phase.ts +19 -34
  96. package/src/commit/map-reduce/reduce-phase.ts +9 -11
  97. package/src/commit/message.ts +2 -2
  98. package/src/commit/model-selection.ts +3 -7
  99. package/src/commit/pipeline.ts +20 -22
  100. package/src/commit/utils/exclusions.ts +3 -3
  101. package/src/config/file-lock.ts +17 -7
  102. package/src/config/keybindings.ts +6 -8
  103. package/src/config/model-registry.ts +55 -37
  104. package/src/config/model-resolver.ts +18 -19
  105. package/src/config/prompt-templates.ts +11 -11
  106. package/src/config/settings-manager.ts +50 -34
  107. package/src/config.ts +60 -62
  108. package/src/cursor.ts +11 -9
  109. package/src/discovery/agents-md.ts +11 -12
  110. package/src/discovery/builtin.ts +68 -73
  111. package/src/discovery/claude.ts +41 -42
  112. package/src/discovery/cline.ts +11 -12
  113. package/src/discovery/codex.ts +52 -53
  114. package/src/discovery/cursor.ts +9 -10
  115. package/src/discovery/gemini.ts +17 -22
  116. package/src/discovery/github.ts +13 -14
  117. package/src/discovery/helpers.ts +35 -34
  118. package/src/discovery/index.ts +16 -18
  119. package/src/discovery/mcp-json.ts +8 -9
  120. package/src/discovery/ssh.ts +8 -9
  121. package/src/discovery/vscode.ts +4 -5
  122. package/src/discovery/windsurf.ts +6 -7
  123. package/src/exa/company.ts +1 -2
  124. package/src/exa/index.ts +2 -3
  125. package/src/exa/linkedin.ts +1 -2
  126. package/src/exa/mcp-client.ts +14 -16
  127. package/src/exa/render.ts +10 -11
  128. package/src/exa/researcher.ts +1 -2
  129. package/src/exa/search.ts +1 -2
  130. package/src/exa/types.ts +0 -1
  131. package/src/exa/websets.ts +1 -2
  132. package/src/exec/bash-executor.ts +3 -4
  133. package/src/exec/exec.ts +0 -1
  134. package/src/export/custom-share.ts +5 -6
  135. package/src/export/html/index.ts +24 -21
  136. package/src/export/ttsr.ts +2 -3
  137. package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
  138. package/src/extensibility/custom-commands/loader.ts +17 -14
  139. package/src/extensibility/custom-commands/types.ts +1 -2
  140. package/src/extensibility/custom-tools/loader.ts +10 -11
  141. package/src/extensibility/custom-tools/types.ts +6 -7
  142. package/src/extensibility/custom-tools/wrapper.ts +2 -3
  143. package/src/extensibility/extensions/loader.ts +75 -53
  144. package/src/extensibility/extensions/runner.ts +11 -12
  145. package/src/extensibility/extensions/types.ts +19 -26
  146. package/src/extensibility/extensions/wrapper.ts +3 -4
  147. package/src/extensibility/hooks/index.ts +1 -1
  148. package/src/extensibility/hooks/loader.ts +8 -9
  149. package/src/extensibility/hooks/runner.ts +7 -8
  150. package/src/extensibility/hooks/tool-wrapper.ts +0 -1
  151. package/src/extensibility/hooks/types.ts +10 -17
  152. package/src/extensibility/plugins/doctor.ts +3 -3
  153. package/src/extensibility/plugins/installer.ts +27 -27
  154. package/src/extensibility/plugins/loader.ts +59 -56
  155. package/src/extensibility/plugins/manager.ts +211 -171
  156. package/src/extensibility/plugins/parser.ts +1 -1
  157. package/src/extensibility/plugins/paths.ts +8 -8
  158. package/src/extensibility/skills.ts +63 -60
  159. package/src/extensibility/slash-commands.ts +10 -10
  160. package/src/index.ts +46 -46
  161. package/src/internal-urls/agent-protocol.ts +21 -11
  162. package/src/internal-urls/artifact-protocol.ts +17 -13
  163. package/src/internal-urls/router.ts +1 -2
  164. package/src/internal-urls/rule-protocol.ts +3 -4
  165. package/src/internal-urls/skill-protocol.ts +3 -4
  166. package/src/ipy/executor.ts +14 -10
  167. package/src/ipy/gateway-coordinator.ts +79 -90
  168. package/src/ipy/kernel.ts +32 -30
  169. package/src/ipy/modules.ts +13 -13
  170. package/src/lsp/client.ts +21 -10
  171. package/src/lsp/clients/biome-client.ts +1 -2
  172. package/src/lsp/clients/index.ts +3 -3
  173. package/src/lsp/clients/lsp-linter-client.ts +4 -5
  174. package/src/lsp/config.ts +15 -15
  175. package/src/lsp/edits.ts +4 -5
  176. package/src/lsp/index.ts +43 -44
  177. package/src/lsp/lspmux.ts +8 -8
  178. package/src/lsp/render.ts +10 -16
  179. package/src/lsp/utils.ts +3 -3
  180. package/src/main.ts +55 -34
  181. package/src/mcp/client.ts +2 -3
  182. package/src/mcp/config.ts +5 -6
  183. package/src/mcp/json-rpc.ts +0 -1
  184. package/src/mcp/loader.ts +3 -4
  185. package/src/mcp/manager.ts +17 -18
  186. package/src/mcp/tool-bridge.ts +4 -9
  187. package/src/mcp/tool-cache.ts +2 -3
  188. package/src/mcp/transports/http.ts +2 -4
  189. package/src/mcp/transports/stdio.ts +1 -2
  190. package/src/migrations.ts +60 -49
  191. package/src/modes/components/armin.ts +4 -5
  192. package/src/modes/components/assistant-message.ts +6 -6
  193. package/src/modes/components/bash-execution.ts +7 -8
  194. package/src/modes/components/bordered-loader.ts +3 -3
  195. package/src/modes/components/branch-summary-message.ts +3 -3
  196. package/src/modes/components/compaction-summary-message.ts +3 -3
  197. package/src/modes/components/countdown-timer.ts +0 -1
  198. package/src/modes/components/custom-message.ts +5 -5
  199. package/src/modes/components/diff.ts +1 -1
  200. package/src/modes/components/dynamic-border.ts +2 -2
  201. package/src/modes/components/extensions/extension-dashboard.ts +6 -7
  202. package/src/modes/components/extensions/extension-list.ts +2 -3
  203. package/src/modes/components/extensions/inspector-panel.ts +3 -4
  204. package/src/modes/components/extensions/state-manager.ts +25 -26
  205. package/src/modes/components/extensions/types.ts +1 -2
  206. package/src/modes/components/footer.ts +47 -43
  207. package/src/modes/components/history-search.ts +2 -2
  208. package/src/modes/components/hook-editor.ts +3 -4
  209. package/src/modes/components/hook-input.ts +2 -3
  210. package/src/modes/components/hook-message.ts +5 -5
  211. package/src/modes/components/hook-selector.ts +2 -3
  212. package/src/modes/components/keybinding-hints.ts +2 -3
  213. package/src/modes/components/login-dialog.ts +2 -2
  214. package/src/modes/components/model-selector.ts +12 -12
  215. package/src/modes/components/oauth-selector.ts +2 -2
  216. package/src/modes/components/plugin-settings.ts +20 -20
  217. package/src/modes/components/python-execution.ts +7 -8
  218. package/src/modes/components/queue-mode-selector.ts +3 -3
  219. package/src/modes/components/read-tool-group.ts +2 -2
  220. package/src/modes/components/session-selector.ts +4 -4
  221. package/src/modes/components/settings-defs.ts +77 -69
  222. package/src/modes/components/settings-selector.ts +16 -16
  223. package/src/modes/components/show-images-selector.ts +2 -2
  224. package/src/modes/components/status-line/segments.ts +4 -4
  225. package/src/modes/components/status-line/separators.ts +1 -1
  226. package/src/modes/components/status-line/types.ts +2 -2
  227. package/src/modes/components/status-line-segment-editor.ts +7 -8
  228. package/src/modes/components/status-line.ts +12 -12
  229. package/src/modes/components/theme-selector.ts +8 -7
  230. package/src/modes/components/thinking-selector.ts +4 -4
  231. package/src/modes/components/todo-display.ts +2 -2
  232. package/src/modes/components/todo-reminder.ts +4 -4
  233. package/src/modes/components/tool-execution.ts +11 -16
  234. package/src/modes/components/tree-selector.ts +11 -11
  235. package/src/modes/components/ttsr-notification.ts +5 -5
  236. package/src/modes/components/user-message-selector.ts +1 -1
  237. package/src/modes/components/user-message.ts +1 -1
  238. package/src/modes/components/visual-truncate.ts +0 -1
  239. package/src/modes/components/welcome.ts +4 -4
  240. package/src/modes/controllers/command-controller.ts +46 -47
  241. package/src/modes/controllers/event-controller.ts +16 -20
  242. package/src/modes/controllers/extension-ui-controller.ts +40 -46
  243. package/src/modes/controllers/input-controller.ts +17 -18
  244. package/src/modes/controllers/selector-controller.ts +103 -91
  245. package/src/modes/index.ts +3 -3
  246. package/src/modes/interactive-mode.ts +27 -29
  247. package/src/modes/print-mode.ts +12 -13
  248. package/src/modes/rpc/rpc-client.ts +7 -8
  249. package/src/modes/rpc/rpc-mode.ts +24 -25
  250. package/src/modes/rpc/rpc-types.ts +3 -4
  251. package/src/modes/theme/mermaid-cache.ts +2 -2
  252. package/src/modes/theme/theme.ts +128 -53
  253. package/src/modes/types.ts +10 -10
  254. package/src/modes/utils/ui-helpers.ts +17 -17
  255. package/src/patch/applicator.ts +18 -19
  256. package/src/patch/diff.ts +1 -2
  257. package/src/patch/fuzzy.ts +1 -2
  258. package/src/patch/index.ts +10 -11
  259. package/src/patch/normalize.ts +4 -4
  260. package/src/patch/normative.ts +1 -2
  261. package/src/patch/parser.ts +8 -9
  262. package/src/patch/shared.ts +12 -13
  263. package/src/sdk.ts +60 -63
  264. package/src/session/agent-session.ts +83 -84
  265. package/src/session/agent-storage.ts +11 -11
  266. package/src/session/artifacts.ts +8 -9
  267. package/src/session/auth-storage.ts +25 -29
  268. package/src/session/compaction/branch-summarization.ts +7 -10
  269. package/src/session/compaction/compaction.ts +8 -19
  270. package/src/session/compaction/utils.ts +6 -9
  271. package/src/session/history-storage.ts +10 -10
  272. package/src/session/messages.ts +4 -5
  273. package/src/session/session-manager.ts +76 -65
  274. package/src/session/session-storage.ts +57 -69
  275. package/src/session/storage-migration.ts +2 -3
  276. package/src/session/streaming-output.ts +2 -2
  277. package/src/ssh/connection-manager.ts +43 -50
  278. package/src/ssh/ssh-executor.ts +2 -2
  279. package/src/ssh/sshfs-mount.ts +11 -18
  280. package/src/system-prompt.ts +27 -34
  281. package/src/task/agents.ts +45 -30
  282. package/src/task/commands.ts +6 -7
  283. package/src/task/discovery.ts +39 -76
  284. package/src/task/executor.ts +14 -15
  285. package/src/task/index.ts +33 -36
  286. package/src/task/output-manager.ts +3 -4
  287. package/src/task/parallel.ts +0 -1
  288. package/src/task/render.ts +19 -20
  289. package/src/task/subprocess-tool-registry.ts +1 -2
  290. package/src/task/worker-protocol.ts +3 -3
  291. package/src/task/worker.ts +32 -38
  292. package/src/task/worktree.ts +19 -19
  293. package/src/tools/ask.ts +8 -9
  294. package/src/tools/bash-interceptor.ts +1 -5
  295. package/src/tools/bash.ts +19 -18
  296. package/src/tools/calculator.ts +12 -12
  297. package/src/tools/complete.ts +3 -4
  298. package/src/tools/context.ts +2 -2
  299. package/src/tools/fetch.ts +23 -26
  300. package/src/tools/find.ts +15 -16
  301. package/src/tools/gemini-image.ts +14 -14
  302. package/src/tools/grep.ts +27 -27
  303. package/src/tools/index.ts +78 -56
  304. package/src/tools/list-limit.ts +1 -1
  305. package/src/tools/ls.ts +7 -7
  306. package/src/tools/notebook.ts +5 -5
  307. package/src/tools/output-meta.ts +3 -4
  308. package/src/tools/output-utils.ts +1 -1
  309. package/src/tools/path-utils.ts +5 -5
  310. package/src/tools/python.ts +36 -37
  311. package/src/tools/read.ts +23 -23
  312. package/src/tools/render-utils.ts +8 -9
  313. package/src/tools/renderers.ts +6 -7
  314. package/src/tools/review.ts +8 -11
  315. package/src/tools/ssh.ts +31 -30
  316. package/src/tools/todo-write.ts +13 -13
  317. package/src/tools/tool-errors.ts +3 -3
  318. package/src/tools/tool-result.ts +3 -8
  319. package/src/tools/write.ts +11 -16
  320. package/src/tui/code-cell.ts +3 -9
  321. package/src/tui/file-list.ts +3 -4
  322. package/src/tui/output-block.ts +1 -2
  323. package/src/tui/status-line.ts +2 -3
  324. package/src/tui/tree-list.ts +2 -3
  325. package/src/tui/types.ts +1 -2
  326. package/src/tui/utils.ts +2 -3
  327. package/src/utils/changelog.ts +9 -10
  328. package/src/utils/clipboard.ts +11 -11
  329. package/src/utils/file-mentions.ts +4 -10
  330. package/src/utils/frontmatter.ts +6 -3
  331. package/src/utils/fuzzy.ts +2 -2
  332. package/src/utils/image-convert.ts +1 -1
  333. package/src/utils/image-resize.ts +1 -1
  334. package/src/utils/mime.ts +2 -2
  335. package/src/utils/shell-snapshot.ts +11 -13
  336. package/src/utils/shell.ts +4 -5
  337. package/src/utils/title-generator.ts +8 -9
  338. package/src/utils/tools-manager.ts +23 -23
  339. package/src/vendor/photon/index.js +1099 -1059
  340. package/src/vendor/photon/photon_rs_bg.wasm +0 -0
  341. package/src/web/scrapers/artifacthub.ts +1 -1
  342. package/src/web/scrapers/arxiv.ts +2 -2
  343. package/src/web/scrapers/bluesky.ts +2 -2
  344. package/src/web/scrapers/cheatsh.ts +1 -1
  345. package/src/web/scrapers/chocolatey.ts +2 -2
  346. package/src/web/scrapers/choosealicense.ts +5 -5
  347. package/src/web/scrapers/cisa-kev.ts +1 -1
  348. package/src/web/scrapers/crossref.ts +2 -2
  349. package/src/web/scrapers/devto.ts +3 -3
  350. package/src/web/scrapers/discogs.ts +3 -4
  351. package/src/web/scrapers/discourse.ts +1 -1
  352. package/src/web/scrapers/dockerhub.ts +1 -1
  353. package/src/web/scrapers/fdroid.ts +2 -2
  354. package/src/web/scrapers/firefox-addons.ts +3 -3
  355. package/src/web/scrapers/flathub.ts +1 -1
  356. package/src/web/scrapers/github.ts +3 -3
  357. package/src/web/scrapers/gitlab.ts +4 -4
  358. package/src/web/scrapers/hackernews.ts +2 -2
  359. package/src/web/scrapers/huggingface.ts +1 -1
  360. package/src/web/scrapers/iacr.ts +2 -2
  361. package/src/web/scrapers/index.ts +0 -1
  362. package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
  363. package/src/web/scrapers/lemmy.ts +2 -2
  364. package/src/web/scrapers/maven.ts +2 -2
  365. package/src/web/scrapers/mdn.ts +2 -4
  366. package/src/web/scrapers/metacpan.ts +2 -2
  367. package/src/web/scrapers/musicbrainz.ts +1 -2
  368. package/src/web/scrapers/npm.ts +1 -1
  369. package/src/web/scrapers/nuget.ts +2 -2
  370. package/src/web/scrapers/nvd.ts +3 -3
  371. package/src/web/scrapers/ollama.ts +7 -9
  372. package/src/web/scrapers/opencorporates.ts +2 -2
  373. package/src/web/scrapers/openlibrary.ts +6 -6
  374. package/src/web/scrapers/orcid.ts +0 -1
  375. package/src/web/scrapers/osv.ts +2 -2
  376. package/src/web/scrapers/packagist.ts +1 -1
  377. package/src/web/scrapers/pubmed.ts +1 -2
  378. package/src/web/scrapers/rawg.ts +2 -2
  379. package/src/web/scrapers/readthedocs.ts +1 -2
  380. package/src/web/scrapers/repology.ts +2 -2
  381. package/src/web/scrapers/rfc.ts +1 -1
  382. package/src/web/scrapers/searchcode.ts +2 -2
  383. package/src/web/scrapers/semantic-scholar.ts +1 -1
  384. package/src/web/scrapers/snapcraft.ts +2 -2
  385. package/src/web/scrapers/sourcegraph.ts +1 -1
  386. package/src/web/scrapers/spdx.ts +3 -3
  387. package/src/web/scrapers/spotify.ts +0 -1
  388. package/src/web/scrapers/twitter.ts +1 -1
  389. package/src/web/scrapers/types.ts +1 -2
  390. package/src/web/scrapers/utils.ts +5 -5
  391. package/src/web/scrapers/wikidata.ts +3 -3
  392. package/src/web/scrapers/youtube.ts +9 -14
  393. package/src/web/search/auth.ts +4 -9
  394. package/src/web/search/index.ts +11 -21
  395. package/src/web/search/providers/anthropic.ts +3 -9
  396. package/src/web/search/providers/exa.ts +6 -10
  397. package/src/web/search/providers/perplexity.ts +5 -5
  398. package/src/web/search/render.ts +16 -18
  399. package/scripts/generate-wasm-b64.ts +0 -24
  400. package/src/commit/map-reduce/.map-phase.ts.kate-swp +0 -0
  401. package/src/task/.executor.ts.kate-swp +0 -0
  402. 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((file) => file !== currentFile);
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((entry) => [entry.path, entry]));
118
+ const numstatMap = new Map(numstat.map(entry => [entry.path, entry]));
119
119
 
120
- const lines = others.map((file) => {
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((value) => Math.max(1, Math.floor(value))));
15
- return fileHunks.hunks.filter((hunk) => wanted.has(hunk.index + 1));
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((entry) => entry.filename === params.file) ?? {
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((hunk) => hunk.content).join("\n\n") : "(no matching hunks)";
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((entry) => !isExcludedFile(entry.path));
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 "@oh-my-pi/pi-coding-agent/commit/agentic/state";
2
- import { createAnalyzeFileTool } from "@oh-my-pi/pi-coding-agent/commit/agentic/tools/analyze-file";
3
- import { createGitFileDiffTool } from "@oh-my-pi/pi-coding-agent/commit/agentic/tools/git-file-diff";
4
- import { createGitHunkTool } from "@oh-my-pi/pi-coding-agent/commit/agentic/tools/git-hunk";
5
- import { createGitOverviewTool } from "@oh-my-pi/pi-coding-agent/commit/agentic/tools/git-overview";
6
- import { createProposeChangelogTool } from "@oh-my-pi/pi-coding-agent/commit/agentic/tools/propose-changelog";
7
- import { createProposeCommitTool } from "@oh-my-pi/pi-coding-agent/commit/agentic/tools/propose-commit";
8
- import { createRecentCommitsTool } from "@oh-my-pi/pi-coding-agent/commit/agentic/tools/recent-commits";
9
- import { createSplitCommitTool } from "@oh-my-pi/pi-coding-agent/commit/agentic/tools/split-commit";
10
- import type { ControlledGit } from "@oh-my-pi/pi-coding-agent/commit/git";
11
- import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
12
- import type { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
13
- import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
14
- import type { AuthStorage } from "@oh-my-pi/pi-coding-agent/session/auth-storage";
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((entry) => {
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((value) => value.trim().replace(/\.$/, "")).filter((value) => value.length > 0);
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((value) => value.trim()).filter((value) => value.length > 0);
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 type { CommitAgentState } from "@oh-my-pi/pi-coding-agent/commit/agentic/state";
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 "@oh-my-pi/pi-coding-agent/commit/agentic/validation";
10
- import { validateAnalysis } from "@oh-my-pi/pi-coding-agent/commit/analysis/validation";
11
- import type { ControlledGit } from "@oh-my-pi/pi-coding-agent/commit/git";
12
- import type { CommitType, ConventionalAnalysis, ConventionalDetail } from "@oh-my-pi/pi-coding-agent/commit/types";
13
- import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
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((detail) => ({
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 type {
2
- CommitAgentState,
3
- SplitCommitGroup,
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 "@oh-my-pi/pi-coding-agent/commit/agentic/validation";
15
- import { validateScope } from "@oh-my-pi/pi-coding-agent/commit/analysis/validation";
16
- import type { ControlledGit } from "@oh-my-pi/pi-coding-agent/commit/git";
17
- import type { ConventionalDetail } from "@oh-my-pi/pi-coding-agent/commit/types";
18
- import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
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((detail) => ({
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((warning) => `Commit ${index + 1}: ${warning}`));
119
+ warnings.push(...detailResult.warnings.map(warning => `Commit ${index + 1}: ${warning}`));
124
120
  const issueRefs = commit.issue_refs ?? [];
125
- const dependencies = (commit.dependencies ?? []).map((dep) => Math.floor(dep));
126
- const changes = commit.changes.map((change) => ({
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((change) => change.path);
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((error) => `Commit ${index + 1}: ${error}`));
137
+ errors.push(...summaryValidation.errors.map(error => `Commit ${index + 1}: ${error}`));
142
138
  }
143
139
  if (!scopeValidation.valid) {
144
- errors.push(...scopeValidation.errors.map((error) => `Commit ${index + 1}: ${error}`));
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((error) => `Commit ${index + 1}: ${error}`));
143
+ errors.push(...typeValidation.errors.map(error => `Commit ${index + 1}: ${error}`));
148
144
  }
149
- warnings.push(...summaryValidation.warnings.map((warning) => `Commit ${index + 1}: ${warning}`));
150
- warnings.push(...typeValidation.warnings.map((warning) => `Commit ${index + 1}: ${warning}`));
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
- (value) => !Number.isFinite(value) || Math.floor(value) !== value || value < 1,
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 "@oh-my-pi/pi-coding-agent/commit/agentic/state";
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 "@oh-my-pi/pi-coding-agent/commit/types";
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((line) => line.startsWith("+") || line.startsWith("-"));
15
+ const changeLines = lines.filter(line => line.startsWith("+") || line.startsWith("-"));
16
16
  const contentLines = changeLines.filter(
17
- (line) => !line.startsWith("+++") && !line.startsWith("---") && !line.startsWith("@@"),
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 "@oh-my-pi/pi-coding-agent/commit/analysis/summary";
2
- import { validateSummary } from "@oh-my-pi/pi-coding-agent/commit/analysis/validation";
3
- import type { CommitType, ConventionalDetail } from "@oh-my-pi/pi-coding-agent/commit/types";
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((entry) => entry.index));
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((file) => file.toLowerCase());
159
- const hasDocs = lowerFiles.some((file) => /\.(md|mdx|adoc|rst)$/.test(file));
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
- (file) => /(^|\/)(test|tests|__tests__)(\/|$)/.test(file) || /(^|\/).*(_test|\.test|\.spec)\./.test(file),
161
+ file => /(^|\/)(test|tests|__tests__)(\/|$)/.test(file) || /(^|\/).*(_test|\.test|\.spec)\./.test(file),
162
162
  );
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)),
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((file) => /(bench|benchmark|perf)/.test(file));
167
+ const hasPerfEvidence = lowerFiles.some(file => /(bench|benchmark|perf)/.test(file));
168
168
  const summary = options.summary?.toLowerCase() ?? "";
169
- const detailText = options.details?.map((detail) => detail.text.toLowerCase()).join(" ") ?? "";
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((detail) => ({
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((content) => content.type === "text")
154
- .map((content) => content.text)
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 "@oh-my-pi/pi-coding-agent/commit/analysis/conventional";
2
- export { extractScopeCandidates } from "@oh-my-pi/pi-coding-agent/commit/analysis/scope";
3
- export { generateSummary, stripTypePrefix } from "@oh-my-pi/pi-coding-agent/commit/analysis/summary";
4
- export { validateAnalysis, validateScope, validateSummary } from "@oh-my-pi/pi-coding-agent/commit/analysis/validation";
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 "@oh-my-pi/pi-coding-agent/commit/types";
2
- import { isExcludedFile } from "@oh-my-pi/pi-coding-agent/commit/utils/exclusions";
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((segment) => segment.includes("."))) {
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((segment) => segment.length > 0);
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((content) => content.type === "toolCall" && content.name === name) as
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((content) => content.type === "text")
97
- .map((content) => content.text)
94
+ .filter(content => content.type === "text")
95
+ .map(content => content.text)
98
96
  .join("")
99
97
  .trim();
100
98
  }
@@ -1,4 +1,4 @@
1
- import type { ConventionalAnalysis } from "@oh-my-pi/pi-coding-agent/commit/types";
1
+ import type { ConventionalAnalysis } from "../../commit/types";
2
2
 
3
3
  export interface ValidationResult {
4
4
  valid: boolean;
@@ -1,5 +1,5 @@
1
- import { dirname, resolve } from "node:path";
2
- import type { ChangelogBoundary } from "@oh-my-pi/pi-coding-agent/commit/types";
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((content) => content.type === "toolCall" && content.name === name) as
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((content) => content.type === "text")
78
- .map((content) => content.text)
75
+ .filter(content => content.type === "text")
76
+ .map(content => content.text)
79
77
  .join("")
80
78
  .trim();
81
79
  }