@pi-unipi/unipi 3.0.0-alpha.2 → 3.0.0-alpha.21

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 (359) hide show
  1. package/CHANGELOG.md +292 -0
  2. package/README.md +8 -11
  3. package/docs/prefix-cache-architecture.md +14 -0
  4. package/package.json +22 -24
  5. package/packages/ask-user/README.md +55 -107
  6. package/packages/ask-user/ask-ui.ts +306 -732
  7. package/packages/ask-user/clipboard.ts +50 -0
  8. package/packages/ask-user/config.ts +74 -78
  9. package/packages/ask-user/package.json +2 -2
  10. package/packages/ask-user/questions.ts +151 -0
  11. package/packages/ask-user/skills/ask-user/SKILL.md +59 -133
  12. package/packages/ask-user/tools.ts +198 -432
  13. package/packages/autocomplete/package.json +1 -1
  14. package/packages/autocomplete/src/constants.ts +38 -43
  15. package/packages/autocomplete/src/sorting.ts +8 -0
  16. package/packages/background-tasks/package.json +2 -2
  17. package/packages/background-tasks/src/config.ts +0 -73
  18. package/packages/background-tasks/src/index.ts +20 -16
  19. package/packages/background-tasks/src/registry.ts +1 -171
  20. package/packages/background-tasks/src/types.ts +0 -32
  21. package/packages/btw/README.md +13 -56
  22. package/packages/btw/extensions/btw.ts +403 -1796
  23. package/packages/btw/package.json +5 -2
  24. package/packages/btw/skills/btw/SKILL.md +7 -143
  25. package/packages/compactor/README.md +56 -287
  26. package/packages/compactor/package.json +5 -9
  27. package/packages/compactor/skills/compactor/SKILL.md +13 -20
  28. package/packages/compactor/src/card.ts +90 -0
  29. package/packages/compactor/src/commands/index.ts +73 -130
  30. package/packages/compactor/src/compaction/compact-args.ts +5 -3
  31. package/packages/compactor/src/compaction/filter-noise.ts +1 -1
  32. package/packages/compactor/src/compaction/hooks.ts +487 -311
  33. package/packages/compactor/src/compaction/source.ts +178 -0
  34. package/packages/compactor/src/compaction/summarize.ts +586 -52
  35. package/packages/compactor/src/config/manager.ts +130 -127
  36. package/packages/compactor/src/config/schema.ts +32 -48
  37. package/packages/compactor/src/index.ts +40 -431
  38. package/packages/compactor/src/info-screen.ts +44 -190
  39. package/packages/compactor/src/session/recall-blocks.ts +1 -1
  40. package/packages/compactor/src/stats.ts +76 -0
  41. package/packages/compactor/src/tools/context-budget.ts +17 -34
  42. package/packages/compactor/src/tools/ctx-doctor.ts +45 -36
  43. package/packages/compactor/src/tools/register.ts +29 -269
  44. package/packages/compactor/src/types.ts +47 -186
  45. package/packages/core/README.md +25 -0
  46. package/packages/core/child-agent.ts +1 -0
  47. package/packages/core/command-echo.ts +63 -0
  48. package/packages/core/compaction-context.ts +41 -0
  49. package/packages/core/constants.ts +8 -38
  50. package/packages/core/events.ts +0 -53
  51. package/packages/core/fusion-status.ts +4 -0
  52. package/packages/core/global.d.ts +10 -0
  53. package/packages/core/harness-messages.ts +392 -0
  54. package/packages/core/index.ts +14 -0
  55. package/packages/core/kanboard-status.ts +49 -0
  56. package/packages/core/long-horizon-owner-status.ts +46 -0
  57. package/packages/core/model-cache.ts +81 -7
  58. package/packages/core/package.json +6 -3
  59. package/packages/core/src/attach/detect.ts +163 -0
  60. package/packages/core/src/child-agent/child-args.ts +31 -0
  61. package/packages/core/src/child-agent/delivery.ts +41 -0
  62. package/packages/core/src/child-agent/index.ts +5 -0
  63. package/packages/core/src/child-agent/readers.ts +203 -0
  64. package/packages/core/src/child-agent/runtime.ts +584 -0
  65. package/packages/core/src/evidence.ts +78 -0
  66. package/packages/core/src/hints/browser.ts +278 -0
  67. package/packages/core/src/hints/crab-data.ts +19 -0
  68. package/packages/core/src/hints/index.ts +865 -0
  69. package/packages/core/src/hints/lines.ts +607 -0
  70. package/packages/core/src/hints/store.ts +120 -0
  71. package/packages/core/src/jev/chatter.ts +24 -0
  72. package/packages/core/src/jev/settings.ts +177 -14
  73. package/packages/core/src/package-colors.ts +2 -0
  74. package/packages/core/src/settings/catalog.ts +39 -15
  75. package/packages/core/src/settings/engine.ts +48 -2
  76. package/packages/core/src/settings/hub.ts +83 -20
  77. package/packages/core/src/settings/open.ts +49 -0
  78. package/packages/core/src/settings/schema.ts +27 -7
  79. package/packages/core/src/tui/hub-kit.ts +18 -5
  80. package/packages/core/src/tui/kit.ts +198 -0
  81. package/packages/core/src/tui/progress.ts +73 -0
  82. package/packages/core/src/turn/arbiter.ts +290 -0
  83. package/packages/footer/README.md +4 -6
  84. package/packages/footer/package.json +3 -3
  85. package/packages/footer/src/glance-editor.ts +19 -11
  86. package/packages/footer/src/help.ts +1 -1
  87. package/packages/footer/src/index.ts +36 -3
  88. package/packages/footer/src/presets.ts +3 -4
  89. package/packages/footer/src/rendering/icons.ts +0 -20
  90. package/packages/footer/src/segments/compactor.ts +52 -142
  91. package/packages/footer/src/segments/status-ext.ts +0 -1
  92. package/packages/fusion/README.md +14 -4
  93. package/packages/fusion/package.json +4 -3
  94. package/packages/fusion/src/child-args.ts +1 -0
  95. package/packages/fusion/src/index.ts +161 -8
  96. package/packages/fusion/src/pi-settings.ts +57 -0
  97. package/packages/fusion/src/picker.ts +186 -51
  98. package/packages/fusion/src/preset.ts +56 -2
  99. package/packages/fusion/src/prompts.ts +1 -1
  100. package/packages/fusion/src/sidekick-runtime.ts +1 -420
  101. package/packages/fusion/src/tools.ts +107 -128
  102. package/packages/fusion/src/transcript.ts +27 -85
  103. package/packages/info-screen/package.json +2 -2
  104. package/packages/input-shortcuts/README.md +18 -30
  105. package/packages/input-shortcuts/package.json +2 -2
  106. package/packages/input-shortcuts/src/burst.ts +88 -0
  107. package/packages/input-shortcuts/src/chord-overlay.ts +20 -70
  108. package/packages/input-shortcuts/src/cleared-input.ts +97 -0
  109. package/packages/input-shortcuts/src/index.ts +99 -193
  110. package/packages/input-shortcuts/src/last-response.ts +40 -0
  111. package/packages/input-shortcuts/src/registers.ts +8 -23
  112. package/packages/input-shortcuts/src/types.ts +4 -16
  113. package/packages/input-shortcuts/src/undo-redo.ts +59 -47
  114. package/packages/kanboard/README.md +51 -47
  115. package/packages/kanboard/index.ts +293 -55
  116. package/packages/kanboard/package.json +8 -8
  117. package/packages/kanboard/skills/kanboard/SKILL.md +61 -27
  118. package/packages/kanboard/src/badges.ts +93 -0
  119. package/packages/kanboard/src/bin.ts +4 -2
  120. package/packages/kanboard/src/commands.ts +218 -84
  121. package/packages/kanboard/src/debug.ts +20 -0
  122. package/packages/kanboard/src/guard.ts +267 -109
  123. package/packages/kanboard/src/monitor.ts +330 -0
  124. package/packages/kanboard/src/notice-buffer.ts +74 -0
  125. package/packages/kanboard/src/progress.ts +27 -0
  126. package/packages/kanboard/src/reminders.ts +234 -0
  127. package/packages/kanboard/src/settings.ts +69 -15
  128. package/packages/kanboard/src/shapes.ts +5 -0
  129. package/packages/long-horizon/index.ts +190 -13
  130. package/packages/long-horizon/package.json +3 -3
  131. package/packages/long-horizon/src/commands.ts +103 -7
  132. package/packages/long-horizon/src/compaction-brief.ts +35 -0
  133. package/packages/long-horizon/src/engine/continuation.ts +84 -15
  134. package/packages/long-horizon/src/engine/goal-state.ts +64 -13
  135. package/packages/long-horizon/src/engine/nudge-stash.ts +71 -0
  136. package/packages/long-horizon/src/engine/ralph.ts +3 -2
  137. package/packages/long-horizon/src/engine/runaway.ts +68 -11
  138. package/packages/long-horizon/src/engine/verifier.ts +19 -0
  139. package/packages/long-horizon/src/gate.ts +37 -12
  140. package/packages/long-horizon/src/judge/resolve.ts +1 -0
  141. package/packages/long-horizon/src/owner.ts +35 -2
  142. package/packages/long-horizon/src/progress.ts +87 -0
  143. package/packages/long-horizon/src/prompts/goal.ts +1 -1
  144. package/packages/long-horizon/src/runtime.ts +172 -18
  145. package/packages/long-horizon/src/settings.ts +54 -39
  146. package/packages/long-horizon/src/tools/goal.ts +6 -0
  147. package/packages/long-horizon/src/tools/graph.ts +1 -1
  148. package/packages/long-horizon/src/tools/swarm.ts +3 -3
  149. package/packages/mcp/package.json +2 -2
  150. package/packages/memory/commands.ts +7 -2
  151. package/packages/memory/index.ts +210 -32
  152. package/packages/memory/package.json +3 -3
  153. package/packages/memory/save-session.ts +264 -0
  154. package/packages/memory/settings.ts +17 -0
  155. package/packages/memory/tools.ts +253 -203
  156. package/packages/notify/package.json +2 -2
  157. package/packages/skill-registry/README.md +53 -16
  158. package/packages/skill-registry/index.ts +230 -0
  159. package/packages/skill-registry/package.json +19 -8
  160. package/packages/skill-registry/src/editor.ts +206 -0
  161. package/packages/skill-registry/src/judge.ts +289 -0
  162. package/packages/skill-registry/src/registry.ts +87 -0
  163. package/packages/skill-registry/src/settings.ts +259 -0
  164. package/packages/skill-registry/src/vault.ts +80 -0
  165. package/packages/subagents/README.md +39 -119
  166. package/packages/subagents/package.json +6 -13
  167. package/packages/subagents/skills/subagents/SKILL.md +18 -42
  168. package/packages/subagents/src/agents.ts +213 -0
  169. package/packages/subagents/src/cards.ts +182 -0
  170. package/packages/subagents/src/index.ts +609 -1084
  171. package/packages/subagents/src/manager.ts +429 -0
  172. package/packages/subagents/src/profiles.ts +130 -0
  173. package/packages/subagents/src/transcript.ts +154 -0
  174. package/packages/subagents/src/ui.ts +389 -0
  175. package/packages/unipi/bundled.js +39756 -45569
  176. package/packages/unipi/index.ts +55 -10
  177. package/packages/updater/package.json +2 -2
  178. package/packages/utility/README.md +76 -69
  179. package/packages/utility/package.json +2 -2
  180. package/packages/utility/skills/image/SKILL.md +37 -0
  181. package/packages/utility/skills/utility/SKILL.md +17 -60
  182. package/packages/utility/src/answer/extract.ts +128 -0
  183. package/packages/utility/src/answer/index.ts +213 -0
  184. package/packages/utility/src/answer/reply.ts +133 -0
  185. package/packages/utility/src/answer/web.ts +167 -0
  186. package/packages/utility/src/attach/index.ts +205 -0
  187. package/packages/utility/src/commands.ts +38 -142
  188. package/packages/utility/src/diagnostics/engine.ts +50 -5
  189. package/packages/utility/src/image/index.ts +33 -0
  190. package/packages/utility/src/image/models.ts +221 -0
  191. package/packages/{image/src → utility/src/image}/recognize.ts +2 -2
  192. package/packages/utility/src/image/settings.ts +178 -0
  193. package/packages/{image/src/image-source.ts → utility/src/image/source.ts} +1 -1
  194. package/packages/utility/src/image/tools.ts +168 -0
  195. package/packages/utility/src/image/transports.ts +186 -0
  196. package/packages/utility/src/index.ts +68 -389
  197. package/packages/utility/src/lifecycle/cleanup.ts +116 -311
  198. package/packages/utility/src/rename/gate.ts +102 -0
  199. package/packages/utility/src/rename/index.ts +191 -0
  200. package/packages/utility/src/rename/session.ts +170 -0
  201. package/packages/utility/src/render/delegated.ts +285 -0
  202. package/packages/utility/src/render/harness.ts +683 -0
  203. package/packages/utility/src/render/parse.ts +156 -0
  204. package/packages/utility/src/render/pi-settings.ts +38 -0
  205. package/packages/utility/src/render/reply-bg.ts +307 -0
  206. package/packages/utility/src/render/simple.ts +724 -0
  207. package/packages/utility/src/render/spacing.ts +235 -0
  208. package/packages/utility/src/render/styled.ts +251 -0
  209. package/packages/utility/src/render/tools.ts +353 -0
  210. package/packages/utility/src/settings.ts +166 -233
  211. package/packages/utility/src/types.ts +1 -222
  212. package/packages/watchdog/index.ts +17 -6
  213. package/packages/watchdog/package.json +3 -3
  214. package/packages/watchdog/src/config.ts +3 -2
  215. package/packages/web-api/package.json +2 -2
  216. package/packages/workflow/README.md +3 -0
  217. package/packages/workflow/index.ts +0 -2
  218. package/packages/workflow/package.json +2 -2
  219. package/packages/workflow/src/permission/decide.ts +6 -4
  220. package/packages/workflow/src/permission/index.ts +17 -7
  221. package/packages/workflow/src/permission/settings.ts +39 -4
  222. package/packages/workflow/src/plan/index.ts +19 -4
  223. package/packages/background-tasks/extensions/delegate-child.ts +0 -1
  224. package/packages/background-tasks/src/context-parent-snapshot.ts +0 -142
  225. package/packages/background-tasks/src/context-token-budget.ts +0 -903
  226. package/packages/background-tasks/src/context-visible-conversation-v2.ts +0 -551
  227. package/packages/background-tasks/src/delegate/artifacts.ts +0 -487
  228. package/packages/background-tasks/src/delegate/budget.ts +0 -415
  229. package/packages/background-tasks/src/delegate/hook-contract-evidence.json +0 -18
  230. package/packages/background-tasks/src/delegate/hook-contract.ts +0 -154
  231. package/packages/background-tasks/src/delegate/launch.ts +0 -484
  232. package/packages/background-tasks/src/delegate/result-package.ts +0 -459
  233. package/packages/background-tasks/src/delegate/runner.ts +0 -430
  234. package/packages/background-tasks/src/delegate/seed.ts +0 -423
  235. package/packages/background-tasks/src/delegate/types.ts +0 -323
  236. package/packages/background-tasks/src/delegate-child-extension.ts +0 -978
  237. package/packages/background-tasks/src/delegate-extension.ts +0 -654
  238. package/packages/background-tasks/src/fixtures/delegate-context-incident.json +0 -17
  239. package/packages/compactor/skills/compactor-detail/SKILL.md +0 -116
  240. package/packages/compactor/skills/compactor-doctor/SKILL.md +0 -71
  241. package/packages/compactor/skills/compactor-stats/SKILL.md +0 -51
  242. package/packages/compactor/src/compaction/build-sections.ts +0 -76
  243. package/packages/compactor/src/compaction/extract/goals.ts +0 -36
  244. package/packages/compactor/src/compaction/extract/preferences.ts +0 -40
  245. package/packages/compactor/src/compaction/format.ts +0 -53
  246. package/packages/compactor/src/compaction/merge.ts +0 -143
  247. package/packages/compactor/src/config/presets.ts +0 -160
  248. package/packages/compactor/src/executor/executor.ts +0 -233
  249. package/packages/compactor/src/executor/runtime.ts +0 -115
  250. package/packages/compactor/src/security/evaluator.ts +0 -89
  251. package/packages/compactor/src/security/policy.ts +0 -96
  252. package/packages/compactor/src/security/scanner.ts +0 -65
  253. package/packages/compactor/src/session/auto-inject.ts +0 -60
  254. package/packages/compactor/src/session/db.ts +0 -325
  255. package/packages/compactor/src/session/extract.ts +0 -144
  256. package/packages/compactor/src/session/resume-inject.ts +0 -64
  257. package/packages/compactor/src/session/snapshot.ts +0 -327
  258. package/packages/compactor/src/tools/ctx-batch-execute.ts +0 -41
  259. package/packages/compactor/src/tools/ctx-execute-file.ts +0 -23
  260. package/packages/compactor/src/tools/ctx-execute.ts +0 -23
  261. package/packages/compactor/src/tools/ctx-stats.ts +0 -96
  262. package/packages/image/README.md +0 -99
  263. package/packages/image/package.json +0 -61
  264. package/packages/image/skills/image/SKILL.md +0 -76
  265. package/packages/image/src/generate.ts +0 -256
  266. package/packages/image/src/index.ts +0 -135
  267. package/packages/image/src/models.ts +0 -519
  268. package/packages/image/src/openai-images-api.ts +0 -282
  269. package/packages/image/src/register-providers.ts +0 -209
  270. package/packages/image/src/settings.ts +0 -173
  271. package/packages/image/src/tools.ts +0 -326
  272. package/packages/input-shortcuts/src/clipboard.ts +0 -119
  273. package/packages/kanboard/src/runner.ts +0 -817
  274. package/packages/skill-registry/skills/auto/SKILL.md +0 -465
  275. package/packages/skill-registry/skills/brainstorm/SKILL.md +0 -219
  276. package/packages/skill-registry/skills/chore-create/SKILL.md +0 -315
  277. package/packages/skill-registry/skills/chore-execute/SKILL.md +0 -314
  278. package/packages/skill-registry/skills/consolidate/SKILL.md +0 -142
  279. package/packages/skill-registry/skills/consultant/SKILL.md +0 -97
  280. package/packages/skill-registry/skills/debug/SKILL.md +0 -228
  281. package/packages/skill-registry/skills/document/SKILL.md +0 -120
  282. package/packages/skill-registry/skills/fix/SKILL.md +0 -212
  283. package/packages/skill-registry/skills/gather-context/SKILL.md +0 -145
  284. package/packages/skill-registry/skills/plan/SKILL.md +0 -231
  285. package/packages/skill-registry/skills/quick-fix/SKILL.md +0 -135
  286. package/packages/skill-registry/skills/quick-work/SKILL.md +0 -110
  287. package/packages/skill-registry/skills/research/SKILL.md +0 -251
  288. package/packages/skill-registry/skills/review-work/SKILL.md +0 -187
  289. package/packages/skill-registry/skills/scan-issues/SKILL.md +0 -195
  290. package/packages/skill-registry/skills/work/SKILL.md +0 -218
  291. package/packages/skill-registry/skills/worktree-create/SKILL.md +0 -69
  292. package/packages/skill-registry/skills/worktree-list/SKILL.md +0 -78
  293. package/packages/skill-registry/skills/worktree-merge/SKILL.md +0 -89
  294. package/packages/subagents/agents/delegate.md +0 -14
  295. package/packages/subagents/agents/oracle.md +0 -78
  296. package/packages/subagents/agents/researcher.md +0 -52
  297. package/packages/subagents/agents/reviewer.md +0 -80
  298. package/packages/subagents/agents/scout.md +0 -50
  299. package/packages/subagents/agents/worker.md +0 -59
  300. package/packages/subagents/prompts/council.md +0 -48
  301. package/packages/subagents/prompts/gather-context-and-clarify.md +0 -13
  302. package/packages/subagents/prompts/parallel-cleanup.md +0 -59
  303. package/packages/subagents/prompts/parallel-research.md +0 -50
  304. package/packages/subagents/prompts/parallel-review.md +0 -54
  305. package/packages/subagents/prompts/review-loop.md +0 -43
  306. package/packages/subagents/skills/council-mode/SKILL.md +0 -230
  307. package/packages/subagents/skills/subagents/references/constraints-and-recipes.md +0 -259
  308. package/packages/subagents/skills/subagents/references/execution-controls.md +0 -454
  309. package/packages/subagents/skills/subagents/references/management-authoring-rpc.md +0 -161
  310. package/packages/subagents/skills/subagents/references/multi-lane-orchestration.md +0 -39
  311. package/packages/subagents/skills/subagents/references/prompting-and-roles.md +0 -267
  312. package/packages/subagents/src/acceptance.ts +0 -331
  313. package/packages/subagents/src/agent-manager.ts +0 -405
  314. package/packages/subagents/src/agent-memory.ts +0 -300
  315. package/packages/subagents/src/agent-overrides.ts +0 -183
  316. package/packages/subagents/src/agent-runner.ts +0 -271
  317. package/packages/subagents/src/async-runner.ts +0 -422
  318. package/packages/subagents/src/authority-policy.ts +0 -47
  319. package/packages/subagents/src/budgets.ts +0 -285
  320. package/packages/subagents/src/child-safety.ts +0 -140
  321. package/packages/subagents/src/config.ts +0 -249
  322. package/packages/subagents/src/conversation-viewer.ts +0 -281
  323. package/packages/subagents/src/core-compat.ts +0 -94
  324. package/packages/subagents/src/custom-agents.ts +0 -343
  325. package/packages/subagents/src/file-system-retry.ts +0 -50
  326. package/packages/subagents/src/fleet-data.ts +0 -105
  327. package/packages/subagents/src/fleet-view.ts +0 -322
  328. package/packages/subagents/src/foreground-detach.ts +0 -59
  329. package/packages/subagents/src/fork-context.ts +0 -285
  330. package/packages/subagents/src/global.d.ts +0 -7
  331. package/packages/subagents/src/guide.ts +0 -129
  332. package/packages/subagents/src/mission-state.ts +0 -133
  333. package/packages/subagents/src/mission-store.ts +0 -436
  334. package/packages/subagents/src/output-limits.ts +0 -142
  335. package/packages/subagents/src/parity-types.ts +0 -315
  336. package/packages/subagents/src/pi-args.ts +0 -167
  337. package/packages/subagents/src/result-files.ts +0 -232
  338. package/packages/subagents/src/result-watcher.ts +0 -221
  339. package/packages/subagents/src/retained-children.ts +0 -176
  340. package/packages/subagents/src/run-fanout-budget.ts +0 -356
  341. package/packages/subagents/src/scheduled-runs.ts +0 -349
  342. package/packages/subagents/src/schemas.ts +0 -263
  343. package/packages/subagents/src/slash-commands.ts +0 -80
  344. package/packages/subagents/src/supervisor-channel.ts +0 -249
  345. package/packages/subagents/src/tool-handler.ts +0 -1144
  346. package/packages/subagents/src/types.ts +0 -238
  347. package/packages/subagents/src/widget.ts +0 -457
  348. package/packages/subagents/src/workflow-script.ts +0 -737
  349. package/packages/subagents/src/workflow-worker.ts +0 -384
  350. package/packages/subagents/src/worktree.ts +0 -614
  351. package/packages/utility/src/analytics/collector.ts +0 -293
  352. package/packages/utility/src/info-screen.ts +0 -80
  353. package/packages/utility/src/lifecycle/process.ts +0 -162
  354. package/packages/utility/src/prefix-cache.ts +0 -263
  355. package/packages/utility/src/skill-discovery.ts +0 -542
  356. package/packages/utility/src/tools/env.ts +0 -113
  357. package/packages/utility/src/tui/name-badge-state.ts +0 -315
  358. package/packages/utility/src/tui/name-badge.ts +0 -109
  359. /package/packages/{subagents/src → core/src/child-agent}/pi-spawn.ts +0 -0
@@ -1,305 +1,238 @@
1
1
  /**
2
- * @pi-unipi/utility — Settings Manager
2
+ * @pi-unipi/utility — Settings
3
3
  *
4
- * Manages badge settings in `.unipi/config/util-settings.json`.
5
- * Migrates from legacy `badge.json` on first read.
4
+ * Namespace `utility` in the settings hub. Sections:
5
+ * rename — automatic session naming (jev-gated, isolated one-tool session)
6
+ * decisionModel — inherit | custom Decision Model override
7
+ * (Skill exposure moved to @pi-unipi/skill-registry, namespace `skills`.)
8
+ *
9
+ * Legacy inputs migrated on read: `badge.*` (v2/v3-alpha badge overlay),
10
+ * `<cwd>/.unipi/config/util-settings.json` and `.unipi/config/badge.json`.
6
11
  */
7
12
 
8
13
  import * as fs from "node:fs";
9
- import * as os from "node:os";
10
14
  import * as path from "node:path";
11
- import { getSettings, globalSettingsPath, projectSettingsPath, registerSettings, setSettings, settingsLayers } from "@pi-unipi/core";
12
-
13
- /** Badge settings */
14
- export interface BadgeSettingsSection {
15
- autoGen: boolean;
16
- badgeEnabled: boolean;
17
- agentTool: boolean;
18
- generationModel: string;
19
- /** Sync session name to herdr pane title + tab label (when running inside herdr). */
15
+ import { getSettings, globalSettingsPath, projectSettingsPath, registerSettings, setSettings, settingsLayers, decisionModelSection, DEFAULT_DECISION_OVERRIDE } from "@pi-unipi/core";
16
+
17
+ /** Automatic session naming. */
18
+ export interface RenameSettings {
19
+ /** Rename after confirmed rounds that start or change the topic. */
20
+ auto: boolean;
21
+ /** Model for the rename session; "" / "inherit" = the session model. */
22
+ model: string;
23
+ /** Mirror the session name to the Herdr pane title / tab label. */
20
24
  herdrSync: boolean;
21
25
  }
22
26
 
23
- /**
24
- * Skill exposure (migrated from the unipi.skills.discovery boolean):
25
- * judged \u2014 jev decides which skills stay in the system-prompt catalog
26
- * all \u2014 every discovered skill stays (no judging)
27
- * off \u2014 old "false" behavior (bundled skills stripped)
28
- */
29
- export type SkillExposureMode = "judged" | "all" | "off";
27
+ /** /unipi:answer defaults. */
28
+ export interface AnswerSettings {
29
+ /** reply = fixed input under the scrollable reply; questions = Q/A template; web = browser form. */
30
+ method: "reply" | "questions" | "web";
31
+ /** Show "N questions in the reply — /unipi:answer questions…" above the editor. */
32
+ hint: boolean;
33
+ /** Web form port; 0 = any free port (47321 is tried first over SSH). */
34
+ port: number;
35
+ }
30
36
 
31
- export interface SkillDiscoverySection {
32
- mode: SkillExposureMode;
33
- /** Minimum jev relevance (noul 0\u20131) for a skill to stay exposed. */
34
- threshold: number;
35
- /** Hard cap on exposed skills; above this the catalog gets judged. */
36
- maxSkills: number;
37
- /** Suggest newly relevant hidden skills on later prompts. */
38
- recheck: boolean;
37
+ /** Pasted / dropped file handling. */
38
+ export interface AttachmentSettings {
39
+ /** Turn pasted image/file paths into [Image #N] / [File #N] attachments. */
40
+ enabled: boolean;
41
+ /** Small inline previews where the terminal can draw images. */
42
+ preview: boolean;
43
+ }
44
+
45
+ /** How pi's built-in read/bash/edit/write results are drawn. */
46
+ export interface RenderSettings {
47
+ style: "simple" | "regular" | "advanced";
39
48
  }
40
49
 
41
- /** Unified utility settings */
42
50
  export interface UtilSettings {
43
- badge: BadgeSettingsSection;
44
- skills: SkillDiscoverySection;
51
+ rename: RenameSettings;
52
+ answer: AnswerSettings;
53
+ attachments: AttachmentSettings;
54
+ render: RenderSettings;
45
55
  }
46
56
 
47
- /** Default badge settings */
48
- const DEFAULT_BADGE_SETTINGS: BadgeSettingsSection = {
49
- autoGen: true,
50
- badgeEnabled: true,
51
- agentTool: true,
52
- generationModel: "inherit",
57
+ export const DEFAULT_RENAME_SETTINGS: RenameSettings = {
58
+ auto: true,
59
+ model: "",
53
60
  herdrSync: true,
54
61
  };
55
62
 
56
- /** Default skill discovery settings */
57
- const DEFAULT_SKILL_DISCOVERY: SkillDiscoverySection = {
58
- mode: "judged",
59
- threshold: 0.3,
60
- maxSkills: 12,
61
- recheck: true,
62
- };
63
63
 
64
- /** Default unified settings */
64
+ export const DEFAULT_ANSWER_SETTINGS: AnswerSettings = { method: "reply", hint: true, port: 0 };
65
+
66
+ export const DEFAULT_ATTACHMENT_SETTINGS: AttachmentSettings = { enabled: true, preview: true };
67
+
68
+ export const DEFAULT_RENDER_SETTINGS: RenderSettings = { style: "regular" };
69
+
65
70
  const DEFAULT_SETTINGS: UtilSettings = {
66
- badge: { ...DEFAULT_BADGE_SETTINGS },
67
- skills: { ...DEFAULT_SKILL_DISCOVERY },
71
+ rename: { ...DEFAULT_RENAME_SETTINGS },
72
+ answer: { ...DEFAULT_ANSWER_SETTINGS },
73
+ attachments: { ...DEFAULT_ATTACHMENT_SETTINGS },
74
+ render: { ...DEFAULT_RENDER_SETTINGS },
68
75
  };
69
76
 
70
- /** Config file paths */
71
77
  const UTIL_SETTINGS_FILE = ".unipi/config/util-settings.json";
72
78
  const BADGE_CONFIG_FILE = ".unipi/config/badge.json";
73
79
 
74
- function getConfigPath(file: string): string {
75
- return path.resolve(process.cwd(), file);
76
- }
77
-
78
- /**
79
- * Read badge.json for migration purposes.
80
- * Returns null if file doesn't exist or is malformed.
81
- */
82
- function readLegacyBadgeSettings(): BadgeSettingsSection | null {
83
- try {
84
- const configPath = getConfigPath(BADGE_CONFIG_FILE);
85
- if (!fs.existsSync(configPath)) return null;
86
- const parsed = JSON.parse(fs.readFileSync(configPath, "utf-8"));
87
- return {
88
- autoGen: typeof parsed.autoGen === "boolean" ? parsed.autoGen : DEFAULT_BADGE_SETTINGS.autoGen,
89
- badgeEnabled: typeof parsed.badgeEnabled === "boolean" ? parsed.badgeEnabled : DEFAULT_BADGE_SETTINGS.badgeEnabled,
90
- agentTool: typeof parsed.agentTool === "boolean" ? parsed.agentTool : DEFAULT_BADGE_SETTINGS.agentTool,
91
- generationModel: typeof parsed.generationModel === "string" ? parsed.generationModel : DEFAULT_BADGE_SETTINGS.generationModel,
92
- herdrSync: typeof parsed.herdrSync === "boolean" ? parsed.herdrSync : DEFAULT_BADGE_SETTINGS.herdrSync,
93
- };
94
- } catch {
95
- return null;
96
- }
97
- }
98
-
99
- function atomicWrite(filePath: string, data: string): void {
100
- const tmpPath = filePath + ".tmp";
101
- fs.writeFileSync(tmpPath, data, "utf-8");
102
- fs.renameSync(tmpPath, filePath);
103
- }
104
-
105
- // Registered with the unified settings hub. Badge settings are project-scoped
106
- // (they live with the repo), so the hub's project scope is the primary target.
107
80
  registerSettings({
108
81
  namespace: "utility",
109
82
  label: "Utility",
110
- defaults: DEFAULT_SETTINGS as unknown as Record<string, unknown>,
83
+ defaults: { ...DEFAULT_SETTINGS, decisionModel: DEFAULT_DECISION_OVERRIDE } as unknown as Record<string, unknown>,
111
84
  schema: [
112
85
  {
113
- title: "Badge",
114
- description: "Session name badge",
86
+ title: "Session name",
87
+ description: "Automatic naming after rounds that start or change the topic",
115
88
  fields: [
116
- { key: "badge.badgeEnabled", type: "boolean", label: "Show name badge", description: "Show the session-name badge overlay" },
117
- { key: "badge.autoGen", type: "boolean", label: "Auto-generate name", description: "Generate a session name on demand" },
118
- { key: "badge.agentTool", type: "boolean", label: "Agent tool", description: "Expose the badge tool to the agent" },
119
- { key: "badge.herdrSync", type: "boolean", label: "Herdr sync", description: "Sync session name to herdr pane title" },
120
- { key: "badge.generationModel", type: "model", label: "Generation model", emptyLabel: "inherit (session model)", capability: "text", emptyOption: "inherit (session model)" },
121
- { key: "badge.setName", type: "action", label: "Set session name…", description: "Prompt for a name and show the badge", command: "unipi:badge-set-name" },
122
- { key: "badge.generate", type: "action", label: "Generate session name", description: "Invent a name via the generation model", command: "unipi:badge-generate" },
89
+ { key: "rename.auto", type: "boolean", label: "Auto-rename", description: "Name the session when a real request starts or changes the topic (greetings and short replies are skipped)" },
90
+ { key: "rename.model", type: "model", label: "Naming model", capability: "text", emptyLabel: "inherit (session model)", emptyOption: "inherit (session model)" },
91
+ { key: "rename.herdrSync", type: "boolean", label: "Herdr sync", description: "Show the session name as the Herdr pane title and tab label" },
92
+ { key: "rename.now", type: "action", label: "Rename now", description: "Name the session from the recent requests", command: "unipi:rename-now" },
123
93
  ],
124
94
  },
125
95
  {
126
- title: "Skills",
127
- description: "Skill startup discovery",
96
+ title: "Answer",
97
+ description: "/unipi:answer — answer the last reply's questions without scrolling",
128
98
  fields: [
129
99
  {
130
- key: "skills.mode",
100
+ key: "answer.method",
131
101
  type: "enum",
132
- label: "Skill exposure",
102
+ label: "Default method",
133
103
  options: [
134
- { value: "judged", label: "judged (jev decides)" },
135
- { value: "all", label: "all (no judging)" },
136
- { value: "off", label: "off (bundled stripped)" },
104
+ { value: "reply", label: "reply (fixed input under the scrollable reply)" },
105
+ { value: "questions", label: "questions (one answer per question)" },
106
+ { value: "web", label: "web form (browser)" },
137
107
  ],
138
- description: "judged = jev picks the skills exposed per session",
108
+ description: "/unipi:answer reply|questions|web overrides it per use",
139
109
  },
140
- { key: "skills.threshold", type: "number", label: "Relevance threshold", min: 0, max: 1, description: "Minimum jev relevance for a skill to stay exposed" },
141
- { key: "skills.maxSkills", type: "number", label: "Max skills exposed", min: 1 },
142
- { key: "skills.recheck", type: "boolean", label: "Suggest newly relevant skills on later prompts" },
110
+ { key: "answer.hint", type: "boolean", label: "Questions hint", description: "After a reply that asks questions, show a hint above the editor" },
111
+ { key: "answer.port", type: "number", label: "Web form port", min: 0, max: 65535, zeroLabel: "any free port (47321 over SSH)", description: "Fix it to keep one ssh -L forward working" },
112
+ ],
113
+ },
114
+ {
115
+ title: "Response formatting",
116
+ description: "How tool calls look in the transcript (applies after /reload)",
117
+ fields: [
118
+ {
119
+ key: "render.style",
120
+ type: "enum",
121
+ label: "Style",
122
+ options: [
123
+ { value: "simple", label: "simple (one collapsed line per tool)" },
124
+ { value: "regular", label: "regular (pi's own)" },
125
+ { value: "advanced", label: "advanced (highlighted commands, diffs, test summaries)" },
126
+ ],
127
+ description: "Ctrl+O expands collapsed output in every style",
128
+ },
129
+ ],
130
+ },
131
+ {
132
+ title: "Attachments",
133
+ description: "Pasted, dropped or Ctrl+V'd files",
134
+ fields: [
135
+ { key: "attachments.enabled", type: "boolean", label: "Attach pasted files", description: "Turn pasted image/file paths into [Image #N] / [File #N]; images are sent as images" },
136
+ { key: "attachments.preview", type: "boolean", label: "Inline previews", description: "Small previews above the editor and in the transcript (Kitty, Ghostty, iTerm2, WezTerm)" },
143
137
  ],
144
138
  },
139
+ decisionModelSection({ title: "Session name — Decision model" }),
145
140
  ],
146
141
  });
147
142
 
148
- /**
149
- * One-time import of `unipi.skills.discovery` from pi's settings.json into the
150
- * engine layout (global scope), so the hub owns the value from here on.
151
- */
152
- function importLegacySkillDiscovery(): void {
143
+ function atomicWrite(filePath: string, data: string): void {
144
+ const tmpPath = filePath + ".tmp";
145
+ fs.writeFileSync(tmpPath, data, "utf-8");
146
+ fs.renameSync(tmpPath, filePath);
147
+ }
148
+
149
+ function readJson(file: string): Record<string, unknown> | null {
153
150
  try {
154
- const agentDir = process.env.PI_AGENT_DIR || path.join(os.homedir(), ".pi", "agent");
155
- const raw = JSON.parse(fs.readFileSync(path.join(agentDir, "settings.json"), "utf-8")) as {
156
- unipi?: { skills?: { discovery?: unknown } };
157
- };
158
- const discovery = raw?.unipi?.skills?.discovery;
159
- if (typeof discovery !== "boolean") return;
160
- if (settingsLayers("utility", process.cwd()).global) return; // engine value wins
161
- setSettings("utility", { skills: { mode: discovery ? "judged" : "off" } } as unknown as Record<string, unknown>, "global", process.cwd());
151
+ if (!fs.existsSync(file)) return null;
152
+ return JSON.parse(fs.readFileSync(file, "utf-8")) as Record<string, unknown>;
162
153
  } catch {
163
- // Absent/unreadable legacy value — default applies.
154
+ return null;
164
155
  }
165
156
  }
166
157
 
158
+
167
159
  /**
168
- * One-time in-file migration: stored `skills.discovery` boolean → `skills.mode`
169
- * (false → "off", true/absent → "judged"). Runs per layer before reads so the
170
- * merged settings never carry an ambiguous pair.
160
+ * One-time in-file migration: `badge.*` (removed badge overlay) → `rename.*`
161
+ * per layer, so an explicit old choice (e.g. autoGen: false) survives the new
162
+ * defaults merge. badgeEnabled/agentTool have no successor and are dropped.
171
163
  */
172
- export function migrateSkillsDiscovery(cwd: string): void {
164
+ export function migrateBadgeToRename(cwd: string): void {
173
165
  for (const file of [globalSettingsPath("utility"), projectSettingsPath(cwd, "utility")]) {
174
166
  try {
175
- if (!fs.existsSync(file)) continue;
176
- const raw = JSON.parse(fs.readFileSync(file, "utf-8")) as {
177
- skills?: Record<string, unknown>;
178
- };
179
- const skills = raw?.skills;
180
- if (!skills || typeof skills !== "object" || skills.mode !== undefined || skills.discovery === undefined) {
181
- continue;
182
- }
183
- const mode = skills.discovery === false ? "off" : "judged";
184
- const { discovery: _dropped, ...rest } = skills;
185
- atomicWrite(file, JSON.stringify({ ...raw, skills: { ...rest, mode } }, null, 2));
167
+ const raw = readJson(file) as { badge?: Record<string, unknown>; rename?: unknown } | null;
168
+ if (!raw?.badge || typeof raw.badge !== "object") continue;
169
+ const { badge, ...rest } = raw;
170
+ const rename: Record<string, unknown> = { ...(typeof raw.rename === "object" && raw.rename ? raw.rename as Record<string, unknown> : {}) };
171
+ if (rename.auto === undefined && typeof badge.autoGen === "boolean") rename.auto = badge.autoGen;
172
+ if (rename.herdrSync === undefined && typeof badge.herdrSync === "boolean") rename.herdrSync = badge.herdrSync;
173
+ if (rename.model === undefined && typeof badge.generationModel === "string" && badge.generationModel !== "inherit") rename.model = badge.generationModel;
174
+ atomicWrite(file, JSON.stringify(Object.keys(rename).length ? { ...rest, rename } : rest, null, 2));
186
175
  } catch {
187
176
  // Corrupt layer — defaults apply.
188
177
  }
189
178
  }
190
179
  }
191
180
 
192
- /** One-time import from the legacy <cwd>/.unipi/config/util-settings.json. */
181
+ /** One-time import from the legacy in-repo util-settings.json / badge.json. */
193
182
  function importLegacyUtilSettings(): void {
194
183
  const layers = settingsLayers("utility", process.cwd());
195
184
  if (layers.global || layers.project) return;
196
- const legacy = (() => {
197
- try {
198
- const configPath = getConfigPath(UTIL_SETTINGS_FILE);
199
- if (!fs.existsSync(configPath)) return null;
200
- return normalizeSettings(JSON.parse(fs.readFileSync(configPath, "utf-8")));
201
- } catch {
202
- return null;
203
- }
204
- })();
205
- if (legacy) {
206
- setSettings("utility", legacy as unknown as Record<string, unknown>, "project", process.cwd());
207
- return;
208
- }
209
- const legacyBadge = readLegacyBadgeSettings();
210
- if (legacyBadge) {
211
- setSettings("utility", { badge: legacyBadge } as unknown as Record<string, unknown>, "project", process.cwd());
212
- }
213
- }
214
-
215
- export function readUtilSettings(): UtilSettings {
216
- try {
217
- importLegacyUtilSettings();
218
- importLegacySkillDiscovery();
219
- const raw = getSettings("utility", process.cwd());
220
- const normalized = normalizeSettings(raw);
221
- if (normalized) return normalized;
222
- return { ...DEFAULT_SETTINGS, badge: { ...DEFAULT_BADGE_SETTINGS } };
223
- } catch {
224
- return { ...DEFAULT_SETTINGS, badge: { ...DEFAULT_BADGE_SETTINGS } };
225
- }
226
- }
227
-
228
- export function writeUtilSettings(settings: UtilSettings): void {
229
- try {
230
- // Badge settings are project-scoped — they travel with the repo.
231
- setSettings("utility", settings as unknown as Record<string, unknown>, "project", process.cwd());
232
- } catch {
233
- // Best effort
234
- }
235
- }
236
-
237
- function normalizeSettings(parsed: any): UtilSettings {
185
+ const legacy = readJson(path.resolve(process.cwd(), UTIL_SETTINGS_FILE))
186
+ ?? (() => {
187
+ const badge = readJson(path.resolve(process.cwd(), BADGE_CONFIG_FILE));
188
+ return badge ? { badge } : null;
189
+ })();
190
+ if (legacy) setSettings("utility", normalizeSettings(legacy) as unknown as Record<string, unknown>, "project", process.cwd());
191
+ }
192
+
193
+ /** Pure normalizer; maps legacy `badge.*` onto `rename.*` when rename is unset. */
194
+ export function normalizeSettings(parsed: unknown): UtilSettings {
195
+ const p = (parsed ?? {}) as { rename?: Record<string, unknown>; badge?: Record<string, unknown>; answer?: Record<string, unknown> };
196
+ const answer = p.answer ?? {};
197
+ const att = (p as { attachments?: Record<string, unknown> }).attachments ?? {};
198
+ const render = (p as { render?: Record<string, unknown> }).render ?? {};
199
+ const rename = p.rename ?? {};
200
+ const badge = p.badge ?? {};
201
+ const bool = (v: unknown, legacy: unknown, d: boolean) => typeof v === "boolean" ? v : typeof legacy === "boolean" ? legacy : d;
202
+ const legacyModel = typeof badge.generationModel === "string" && badge.generationModel !== "inherit" ? badge.generationModel : undefined;
203
+ const model = typeof rename.model === "string" ? rename.model : legacyModel ?? DEFAULT_RENAME_SETTINGS.model;
238
204
  return {
239
- badge: {
240
- autoGen: typeof parsed?.badge?.autoGen === "boolean" ? parsed.badge.autoGen : DEFAULT_BADGE_SETTINGS.autoGen,
241
- badgeEnabled: typeof parsed?.badge?.badgeEnabled === "boolean" ? parsed.badge.badgeEnabled : DEFAULT_BADGE_SETTINGS.badgeEnabled,
242
- agentTool: typeof parsed?.badge?.agentTool === "boolean" ? parsed.badge.agentTool : DEFAULT_BADGE_SETTINGS.agentTool,
243
- generationModel: typeof parsed?.badge?.generationModel === "string" ? parsed.badge.generationModel : DEFAULT_BADGE_SETTINGS.generationModel,
244
- herdrSync: typeof parsed?.badge?.herdrSync === "boolean" ? parsed.badge.herdrSync : DEFAULT_BADGE_SETTINGS.herdrSync,
205
+ rename: {
206
+ auto: bool(rename.auto, badge.autoGen, DEFAULT_RENAME_SETTINGS.auto),
207
+ model: model === "inherit" ? "" : model,
208
+ herdrSync: bool(rename.herdrSync, badge.herdrSync, DEFAULT_RENAME_SETTINGS.herdrSync),
209
+ },
210
+ answer: {
211
+ // "editor" was the old name of the questions template.
212
+ method: answer.method === "web" ? "web" : answer.method === "questions" || answer.method === "editor" ? "questions" : "reply",
213
+ hint: typeof answer.hint === "boolean" ? answer.hint : DEFAULT_ANSWER_SETTINGS.hint,
214
+ port: typeof answer.port === "number" && answer.port >= 0 && answer.port <= 65535 ? Math.floor(answer.port) : DEFAULT_ANSWER_SETTINGS.port,
245
215
  },
246
- skills: {
247
- mode:
248
- parsed?.skills?.mode === "judged" || parsed?.skills?.mode === "all" || parsed?.skills?.mode === "off"
249
- ? parsed.skills.mode
250
- : parsed?.skills?.discovery === false
251
- ? "off"
252
- : "judged",
253
- threshold:
254
- typeof parsed?.skills?.threshold === "number" && parsed.skills.threshold >= 0 && parsed.skills.threshold <= 1
255
- ? parsed.skills.threshold
256
- : DEFAULT_SKILL_DISCOVERY.threshold,
257
- maxSkills:
258
- typeof parsed?.skills?.maxSkills === "number" && parsed.skills.maxSkills >= 1
259
- ? parsed.skills.maxSkills
260
- : DEFAULT_SKILL_DISCOVERY.maxSkills,
261
- recheck: typeof parsed?.skills?.recheck === "boolean" ? parsed.skills.recheck : DEFAULT_SKILL_DISCOVERY.recheck,
216
+ attachments: {
217
+ enabled: typeof att.enabled === "boolean" ? att.enabled : DEFAULT_ATTACHMENT_SETTINGS.enabled,
218
+ preview: typeof att.preview === "boolean" ? att.preview : DEFAULT_ATTACHMENT_SETTINGS.preview,
219
+ },
220
+ render: {
221
+ style: render.style === "simple" || render.style === "advanced" ? render.style : "regular",
262
222
  },
263
223
  };
264
224
  }
265
225
 
266
- /** Read only the badge settings section. */
267
- export function readBadgeSettings(): BadgeSettingsSection {
268
- return readUtilSettings().badge;
269
- }
270
-
271
- /** Write partial badge settings (merged with existing). */
272
- export function writeBadgeSettings(partial: Partial<BadgeSettingsSection>): void {
273
- const settings = readUtilSettings();
274
- settings.badge = { ...settings.badge, ...partial };
275
- writeUtilSettings(settings);
276
- }
277
-
278
- /** Update a single badge setting. */
279
- export function updateBadgeSetting<K extends keyof BadgeSettingsSection>(
280
- key: K,
281
- value: BadgeSettingsSection[K],
282
- ): BadgeSettingsSection {
283
- const settings = readBadgeSettings();
284
- settings[key] = value;
285
- writeBadgeSettings(settings);
286
- return settings;
226
+ export function readUtilSettings(cwd: string = process.cwd()): UtilSettings {
227
+ try {
228
+ importLegacyUtilSettings();
229
+ migrateBadgeToRename(cwd);
230
+ return normalizeSettings(getSettings("utility", cwd));
231
+ } catch {
232
+ return normalizeSettings({});
233
+ }
287
234
  }
288
235
 
289
- /** Format badge settings for display. */
290
- export function formatBadgeSettings(settings: BadgeSettingsSection): string {
291
- const toggle = (v: boolean) => (v ? "✓ enabled" : "✗ disabled");
292
- return [
293
- "## Badge Settings",
294
- "",
295
- `| Setting | Status | Description |`,
296
- `|---------|--------|-------------|`,
297
- `| Auto Generate | ${toggle(settings.autoGen)} | Generate name on first message |`,
298
- `| Badge Enabled | ${toggle(settings.badgeEnabled)} | Show badge overlay |`,
299
- `| Agent Tool | ${toggle(settings.agentTool)} | Allow agents to call set_session_name |`,
300
- `| Herdr Sync | ${toggle(settings.herdrSync)} | Sync session name to herdr tab/pane title |`,
301
- `| Generation Model | ${settings.generationModel} | Model for badge name generation |`,
302
- "",
303
- `Config: .unipi/config/util-settings.json`,
304
- ].join("\n");
236
+ export function readRenameSettings(cwd: string = process.cwd()): RenameSettings {
237
+ return readUtilSettings(cwd).rename;
305
238
  }