@pugi/cli 0.1.0-beta.8 → 0.1.0-beta.87

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 +96 -0
  2. package/THIRD_PARTY_NOTICES.md +40 -0
  3. package/assets/pugi-prozr2-mascot.ansi +9 -0
  4. package/bin/run.js +33 -1
  5. package/dist/commands/deploy.js +40 -40
  6. package/dist/commands/flatten.js +191 -0
  7. package/dist/commands/jobs-watch.js +201 -0
  8. package/dist/commands/jobs.js +42 -27
  9. package/dist/commands/smoke.js +133 -0
  10. package/dist/core/agent-progress/cleanup.js +134 -0
  11. package/dist/core/agent-progress/schema.js +144 -0
  12. package/dist/core/agent-progress/writer.js +101 -0
  13. package/dist/core/agents/adaptive-router.js +330 -0
  14. package/dist/core/agents/query-decomposer.js +297 -0
  15. package/dist/core/agents/registry.js +2 -2
  16. package/dist/core/approvals/shortcut-resolver.js +98 -0
  17. package/dist/core/artifact-chain/dispatcher.js +148 -0
  18. package/dist/core/artifact-chain/exporter.js +164 -0
  19. package/dist/core/artifact-chain/state.js +243 -0
  20. package/dist/core/artifact-chain/steps.js +169 -0
  21. package/dist/core/ask-user/question.js +92 -0
  22. package/dist/core/audit/audit-trail.js +275 -0
  23. package/dist/core/auth/ensure-authenticated.js +129 -0
  24. package/dist/core/auth/env-provider.js +238 -0
  25. package/dist/core/auto-open-browser.js +4 -4
  26. package/dist/core/auto-update/channels.js +122 -0
  27. package/dist/core/auto-update/checker.js +241 -0
  28. package/dist/core/auto-update/state.js +235 -0
  29. package/dist/core/bare-mode/index.js +107 -0
  30. package/dist/core/bash/redirect.js +281 -0
  31. package/dist/core/bash-classifier.js +436 -40
  32. package/dist/core/checkpoint/resumer.js +149 -0
  33. package/dist/core/checkpoint/rewinder.js +291 -0
  34. package/dist/core/checkpoints/shadow-git.js +670 -0
  35. package/dist/core/citations/parser.js +109 -0
  36. package/dist/core/classifier/yolo-classifier.js +88 -0
  37. package/dist/core/codegraph/decision-store.js +248 -0
  38. package/dist/core/codegraph/detect-repo.js +459 -0
  39. package/dist/core/codegraph/install.js +134 -0
  40. package/dist/core/codegraph/offer-hook.js +220 -0
  41. package/dist/core/compact/auto-trigger.js +96 -0
  42. package/dist/core/compact/buffer-rewriter.js +115 -0
  43. package/dist/core/compact/summarizer.js +208 -0
  44. package/dist/core/compact/token-counter.js +108 -0
  45. package/dist/core/consensus/anvil-fanout.js +25 -25
  46. package/dist/core/consensus/diff-capture.js +121 -12
  47. package/dist/core/consensus/rubric.js +21 -21
  48. package/dist/core/context/builder.js +6 -6
  49. package/dist/core/context/compaction-events.js +8 -8
  50. package/dist/core/context/compaction.js +31 -31
  51. package/dist/core/context/index.js +15 -8
  52. package/dist/core/context/invariants.js +51 -51
  53. package/dist/core/context/markdown-loader.js +28 -10
  54. package/dist/core/context/markdown-traverse.js +255 -0
  55. package/dist/core/context/pugiignore.js +41 -41
  56. package/dist/core/context/repo-skeleton.js +37 -37
  57. package/dist/core/context/tool-eviction.js +55 -0
  58. package/dist/core/context/watcher.js +32 -32
  59. package/dist/core/context/working-set.js +23 -23
  60. package/dist/core/coordinator/agent-tools.js +77 -0
  61. package/dist/core/coordinator/agent-toolset.js +65 -0
  62. package/dist/core/coordinator/fsm.js +73 -0
  63. package/dist/core/coordinator/mode-fsm.js +70 -0
  64. package/dist/core/cost/rate-card.js +129 -0
  65. package/dist/core/cost/tracker.js +221 -0
  66. package/dist/core/credentials.js +12 -12
  67. package/dist/core/cron/scheduler.js +138 -0
  68. package/dist/core/denial-tracking/index.js +8 -0
  69. package/dist/core/denial-tracking/state.js +264 -0
  70. package/dist/core/diagnostics/probe-runner.js +93 -0
  71. package/dist/core/diagnostics/probes/api.js +46 -0
  72. package/dist/core/diagnostics/probes/auth.js +93 -0
  73. package/dist/core/diagnostics/probes/bare-mode.js +42 -0
  74. package/dist/core/diagnostics/probes/cli-version.js +127 -0
  75. package/dist/core/diagnostics/probes/config.js +72 -0
  76. package/dist/core/diagnostics/probes/denial-tracking.js +57 -0
  77. package/dist/core/diagnostics/probes/disk.js +81 -0
  78. package/dist/core/diagnostics/probes/engine-live.js +46 -0
  79. package/dist/core/diagnostics/probes/git.js +65 -0
  80. package/dist/core/diagnostics/probes/hooks.js +118 -0
  81. package/dist/core/diagnostics/probes/mcp.js +75 -0
  82. package/dist/core/diagnostics/probes/node.js +59 -0
  83. package/dist/core/diagnostics/probes/pnpm.js +36 -0
  84. package/dist/core/diagnostics/probes/pugi-md.js +89 -0
  85. package/dist/core/diagnostics/probes/sandbox.js +40 -0
  86. package/dist/core/diagnostics/probes/session.js +74 -0
  87. package/dist/core/diagnostics/probes/status-snapshot.js +488 -0
  88. package/dist/core/diagnostics/probes/workspace.js +63 -0
  89. package/dist/core/diagnostics/types.js +70 -0
  90. package/dist/core/dispatch/cache-cleanup.js +197 -0
  91. package/dist/core/dispatch/cache-handoff.js +295 -0
  92. package/dist/core/edits/apply-patch-layer-e.js +189 -0
  93. package/dist/core/edits/dispatch.js +293 -7
  94. package/dist/core/edits/format-matrix.js +26 -0
  95. package/dist/core/edits/fuzzy-ladder.js +650 -0
  96. package/dist/core/edits/index.js +3 -1
  97. package/dist/core/edits/journal.js +199 -0
  98. package/dist/core/edits/layer-a-apply.js +15 -15
  99. package/dist/core/edits/layer-a-fuzzy-apply.js +198 -0
  100. package/dist/core/edits/layer-b-apply.js +9 -9
  101. package/dist/core/edits/layer-c-apply.js +6 -6
  102. package/dist/core/edits/layer-d-ast.js +557 -14
  103. package/dist/core/edits/marker-parser.js +12 -12
  104. package/dist/core/edits/security-gate.js +27 -27
  105. package/dist/core/edits/verify-hook.js +273 -0
  106. package/dist/core/edits/worktree.js +322 -0
  107. package/dist/core/engine/anvil-client.js +140 -26
  108. package/dist/core/engine/auto-compact.js +179 -0
  109. package/dist/core/engine/budgets.js +186 -0
  110. package/dist/core/engine/context-prefix.js +155 -0
  111. package/dist/core/engine/index.js +1 -1
  112. package/dist/core/engine/intensity.js +158 -0
  113. package/dist/core/engine/intent.js +260 -0
  114. package/dist/core/engine/native-pugi.js +1295 -227
  115. package/dist/core/engine/prompts.js +134 -16
  116. package/dist/core/engine/strip-internal-fields.js +124 -0
  117. package/dist/core/engine/tool-bridge.js +1295 -59
  118. package/dist/core/evaluation/golden-dataset.js +293 -0
  119. package/dist/core/feedback/queue.js +177 -0
  120. package/dist/core/feedback/submitter.js +145 -0
  121. package/dist/core/file-cache.js +113 -1
  122. package/dist/core/flatten/flatten-repo.js +439 -0
  123. package/dist/core/format/osc8-link.js +28 -0
  124. package/dist/core/hook-chains.js +392 -0
  125. package/dist/core/hooks/citation-verify-hook.js +138 -0
  126. package/dist/core/hooks/citation-verify.js +112 -0
  127. package/dist/core/hooks/events.js +44 -0
  128. package/dist/core/hooks/index.js +15 -0
  129. package/dist/core/hooks/registry.js +213 -0
  130. package/dist/core/hooks/runner.js +236 -0
  131. package/dist/core/hooks/v2/event-emitter.js +115 -0
  132. package/dist/core/hooks/v2/executor.js +282 -0
  133. package/dist/core/hooks/v2/index.js +25 -0
  134. package/dist/core/hooks/v2/lifecycle.js +104 -0
  135. package/dist/core/hooks/v2/loader.js +216 -0
  136. package/dist/core/hooks/v2/matcher.js +125 -0
  137. package/dist/core/hooks/v2/trust.js +143 -0
  138. package/dist/core/hooks/v2/types.js +86 -0
  139. package/dist/core/image/renderer.js +71 -0
  140. package/dist/core/init/detector.js +582 -0
  141. package/dist/core/init/template-renderer.js +242 -0
  142. package/dist/core/jobs/registry.js +18 -18
  143. package/dist/core/ledger/results-tsv.js +142 -0
  144. package/dist/core/log-discipline/stdout-redirect.js +51 -0
  145. package/dist/core/lsp/cache.js +105 -0
  146. package/dist/core/lsp/client.js +776 -0
  147. package/dist/core/lsp/language-detect.js +66 -0
  148. package/dist/core/lsp/post-edit-diagnostics.js +171 -0
  149. package/dist/core/lsp/symbol-tools.js +372 -0
  150. package/dist/core/mcp/client.js +97 -28
  151. package/dist/core/mcp/http-server.js +553 -0
  152. package/dist/core/mcp/orchestrator-tools.js +662 -0
  153. package/dist/core/mcp/permission.js +190 -0
  154. package/dist/core/mcp/registry.js +39 -17
  155. package/dist/core/mcp/server-tools.js +219 -0
  156. package/dist/core/mcp/server.js +397 -0
  157. package/dist/core/mcp/trust.js +10 -10
  158. package/dist/core/memory/dual-write.js +416 -0
  159. package/dist/core/memory/passive-extract.js +130 -0
  160. package/dist/core/memory/phase1-kinds.js +20 -0
  161. package/dist/core/memory/secret-scanner.js +304 -0
  162. package/dist/core/memory-sync/queue.js +170 -0
  163. package/dist/core/metrics/extract.js +113 -0
  164. package/dist/core/modes/roo-modes.js +68 -0
  165. package/dist/core/onboarding/ensure-initialized.js +133 -0
  166. package/dist/core/onboarding/marker.js +111 -0
  167. package/dist/core/onboarding/telemetry-state.js +108 -0
  168. package/dist/core/output-style/presets.js +176 -0
  169. package/dist/core/output-style/state.js +185 -0
  170. package/dist/core/path-security.js +287 -5
  171. package/dist/core/permission.js +82 -22
  172. package/dist/core/permissions/auto-classifier.js +124 -0
  173. package/dist/core/permissions/bash-parser.js +371 -0
  174. package/dist/core/permissions/circuit-breaker.js +83 -0
  175. package/dist/core/permissions/constrained-edit.js +91 -0
  176. package/dist/core/permissions/gate.js +278 -0
  177. package/dist/core/permissions/index.js +20 -0
  178. package/dist/core/permissions/mode.js +174 -0
  179. package/dist/core/permissions/network-egress.js +137 -0
  180. package/dist/core/permissions/state.js +241 -0
  181. package/dist/core/permissions/tool-class.js +93 -0
  182. package/dist/core/plan-mode/ui-state.js +51 -0
  183. package/dist/core/plans/plan-artifact.js +721 -0
  184. package/dist/core/policy-limits/etag-store.js +122 -0
  185. package/dist/core/prd-check/parser.js +215 -0
  186. package/dist/core/prd-check/reporter.js +127 -0
  187. package/dist/core/prd-check/session-review.js +557 -0
  188. package/dist/core/prd-check/verifiers.js +223 -0
  189. package/dist/core/prompt-cache/client-cache.js +99 -0
  190. package/dist/core/prompts/assembly.js +29 -0
  191. package/dist/core/prompts/registry.js +364 -0
  192. package/dist/core/pugi-md/cc-compat-rules.js +735 -0
  193. package/dist/core/pugi-md/context-injector.js +76 -0
  194. package/dist/core/pugi-md/walk-up.js +207 -0
  195. package/dist/core/python/uv-installer.js +270 -0
  196. package/dist/core/python/uv-resolver.js +83 -0
  197. package/dist/core/rate-limit/narrator.js +146 -0
  198. package/dist/core/recipes/cli-types.js +20 -0
  199. package/dist/core/recipes/loader.js +103 -0
  200. package/dist/core/recipes/runner.js +345 -0
  201. package/dist/core/recipes/schema.js +587 -0
  202. package/dist/core/release-notes/parser.js +241 -0
  203. package/dist/core/release-notes/state.js +116 -0
  204. package/dist/core/repl/ask.js +37 -37
  205. package/dist/core/repl/cancellation.js +26 -26
  206. package/dist/core/repl/cap-warning.js +4 -4
  207. package/dist/core/repl/clipboard-read.js +11 -11
  208. package/dist/core/repl/dispatch-fsm.js +12 -12
  209. package/dist/core/repl/history-search.js +15 -15
  210. package/dist/core/repl/history.js +28 -18
  211. package/dist/core/repl/kill-ring.js +5 -5
  212. package/dist/core/repl/model-pricing.js +135 -0
  213. package/dist/core/repl/privacy-banner.js +22 -22
  214. package/dist/core/repl/session.js +2157 -214
  215. package/dist/core/repl/slash-commands.js +533 -40
  216. package/dist/core/repl/store/index.js +1 -1
  217. package/dist/core/repl/store/jsonl-log.js +22 -22
  218. package/dist/core/repl/store/lockfile.js +10 -10
  219. package/dist/core/repl/store/session-store.js +136 -107
  220. package/dist/core/repl/store/types.js +15 -15
  221. package/dist/core/repl/store/uuid-v7.js +12 -12
  222. package/dist/core/repl/workspace-context.js +43 -21
  223. package/dist/core/repo-map/build.js +125 -0
  224. package/dist/core/repo-map/cache.js +185 -0
  225. package/dist/core/repo-map/extractor.js +254 -0
  226. package/dist/core/repo-map/formatter.js +145 -0
  227. package/dist/core/repo-map/page-rank.js +105 -0
  228. package/dist/core/repo-map/scanner.js +211 -0
  229. package/dist/core/retry-budget/budget.js +284 -0
  230. package/dist/core/retry-budget/index.js +5 -0
  231. package/dist/core/retry-budget/retry-cap.js +74 -0
  232. package/dist/core/routing/lead-worker.js +43 -0
  233. package/dist/core/routing/pre-flight-estimator.js +108 -0
  234. package/dist/core/runs/run-tree.js +103 -0
  235. package/dist/core/security/injection-scanner.js +367 -0
  236. package/dist/core/security/output-filter.js +418 -0
  237. package/dist/core/session/env-file.js +105 -0
  238. package/dist/core/session/section-budgets.js +140 -0
  239. package/dist/core/session.js +92 -0
  240. package/dist/core/settings.js +286 -5
  241. package/dist/core/share/formatter.js +271 -0
  242. package/dist/core/share/redactor.js +221 -0
  243. package/dist/core/share/uploader.js +267 -0
  244. package/dist/core/skills/defaults.js +457 -0
  245. package/dist/core/skills/loader.js +22 -22
  246. package/dist/core/skills/sources.js +27 -27
  247. package/dist/core/smoke/headless-driver.js +174 -0
  248. package/dist/core/smoke/orchestrator.js +194 -0
  249. package/dist/core/smoke/runner.js +238 -0
  250. package/dist/core/smoke/scenario-parser.js +316 -0
  251. package/dist/core/statusline.js +99 -0
  252. package/dist/core/subagents/dispatcher-real.js +600 -0
  253. package/dist/core/subagents/dispatcher.js +132 -43
  254. package/dist/core/subagents/index.js +19 -6
  255. package/dist/core/subagents/isolation-matrix.js +213 -0
  256. package/dist/core/subagents/spawn.js +19 -4
  257. package/dist/core/telemetry/emitter.js +229 -0
  258. package/dist/core/telemetry/queue.js +251 -0
  259. package/dist/core/theme/context.js +91 -0
  260. package/dist/core/theme/presets.js +228 -0
  261. package/dist/core/theme/state.js +181 -0
  262. package/dist/core/todos/invariant.js +10 -0
  263. package/dist/core/todos/state.js +177 -0
  264. package/dist/core/tool-schema/compressor.js +89 -0
  265. package/dist/core/transport/version-interceptor.js +166 -0
  266. package/dist/core/trust.js +2 -2
  267. package/dist/core/tui/thinking-block.js +64 -0
  268. package/dist/core/vim/keymap.js +288 -0
  269. package/dist/core/vim/state.js +92 -0
  270. package/dist/core/watch-markers/marker-watcher.js +133 -0
  271. package/dist/core/worktree-manager/cleanup.js +123 -0
  272. package/dist/core/worktree-manager/manager.js +303 -0
  273. package/dist/index.js +28 -0
  274. package/dist/runtime/bootstrap.js +190 -0
  275. package/dist/runtime/cli.js +4151 -489
  276. package/dist/runtime/commands/agents.js +30 -30
  277. package/dist/runtime/commands/budget.js +5 -5
  278. package/dist/runtime/commands/cancel.js +231 -0
  279. package/dist/runtime/commands/chain.js +489 -0
  280. package/dist/runtime/commands/codegraph-status.js +227 -0
  281. package/dist/runtime/commands/compact.js +297 -0
  282. package/dist/runtime/commands/config.js +32 -32
  283. package/dist/runtime/commands/cost.js +199 -0
  284. package/dist/runtime/commands/delegate.js +244 -13
  285. package/dist/runtime/commands/dispatch.js +126 -0
  286. package/dist/runtime/commands/doctor.js +579 -0
  287. package/dist/runtime/commands/feedback.js +184 -0
  288. package/dist/runtime/commands/hooks.js +184 -0
  289. package/dist/runtime/commands/init.js +254 -0
  290. package/dist/runtime/commands/lsp.js +368 -0
  291. package/dist/runtime/commands/mcp.js +879 -0
  292. package/dist/runtime/commands/memory.js +582 -0
  293. package/dist/runtime/commands/model.js +237 -0
  294. package/dist/runtime/commands/onboarding.js +275 -0
  295. package/dist/runtime/commands/patch.js +128 -0
  296. package/dist/runtime/commands/permissions.js +112 -0
  297. package/dist/runtime/commands/plan.js +143 -0
  298. package/dist/runtime/commands/prd-check.js +285 -0
  299. package/dist/runtime/commands/privacy.js +17 -17
  300. package/dist/runtime/commands/recipe.js +325 -0
  301. package/dist/runtime/commands/redo-blob-store.js +92 -0
  302. package/dist/runtime/commands/redo.js +361 -0
  303. package/dist/runtime/commands/release-notes.js +229 -0
  304. package/dist/runtime/commands/repo-map.js +95 -0
  305. package/dist/runtime/commands/report.js +299 -0
  306. package/dist/runtime/commands/resume.js +118 -0
  307. package/dist/runtime/commands/review-consensus.js +68 -53
  308. package/dist/runtime/commands/rewind.js +333 -0
  309. package/dist/runtime/commands/roster.js +14 -14
  310. package/dist/runtime/commands/sessions.js +163 -0
  311. package/dist/runtime/commands/share.js +316 -0
  312. package/dist/runtime/commands/skills.js +31 -31
  313. package/dist/runtime/commands/status.js +186 -0
  314. package/dist/runtime/commands/stickers.js +82 -0
  315. package/dist/runtime/commands/style.js +194 -0
  316. package/dist/runtime/commands/theme.js +196 -0
  317. package/dist/runtime/commands/undo.js +54 -22
  318. package/dist/runtime/commands/update.js +289 -0
  319. package/dist/runtime/commands/vim.js +140 -0
  320. package/dist/runtime/commands/worktree.js +177 -0
  321. package/dist/runtime/commands/worktrees.js +155 -0
  322. package/dist/runtime/headless-repl.js +195 -0
  323. package/dist/runtime/headless.js +543 -0
  324. package/dist/runtime/load-hooks-or-exit.js +71 -0
  325. package/dist/runtime/plan-decompose.js +531 -0
  326. package/dist/runtime/update-check.js +28 -28
  327. package/dist/runtime/version.js +65 -0
  328. package/dist/skills/bundled/batch.js +617 -0
  329. package/dist/skills/bundled/index.js +45 -0
  330. package/dist/skills/bundled/loop.js +358 -0
  331. package/dist/skills/bundled/remember.js +383 -0
  332. package/dist/skills/bundled/simplify.js +289 -0
  333. package/dist/skills/bundled/skillify.js +373 -0
  334. package/dist/skills/bundled/stuck.js +558 -0
  335. package/dist/skills/bundled/verify.js +439 -0
  336. package/dist/testing/vcr.js +486 -0
  337. package/dist/tools/agent-tool.js +229 -0
  338. package/dist/tools/apply-patch.js +556 -0
  339. package/dist/tools/ask-user-question.js +222 -0
  340. package/dist/tools/ask-user.js +115 -0
  341. package/dist/tools/bash.js +623 -45
  342. package/dist/tools/brief.js +224 -0
  343. package/dist/tools/enter-worktree.js +250 -0
  344. package/dist/tools/exit-worktree.js +147 -0
  345. package/dist/tools/file-tools.js +161 -44
  346. package/dist/tools/lsp-tools.js +189 -0
  347. package/dist/tools/mcp-tool.js +260 -0
  348. package/dist/tools/multi-edit.js +361 -0
  349. package/dist/tools/powershell.js +268 -0
  350. package/dist/tools/registry.js +85 -0
  351. package/dist/tools/skill-tool.js +96 -0
  352. package/dist/tools/sleep.js +99 -0
  353. package/dist/tools/synthetic-output.js +133 -0
  354. package/dist/tools/tasks.js +208 -0
  355. package/dist/tools/todo-write.js +184 -0
  356. package/dist/tools/verify-plan-execution.js +295 -0
  357. package/dist/tools/web-fetch-injection-scanner.js +207 -0
  358. package/dist/tools/web-fetch.js +195 -10
  359. package/dist/tools/web-search.js +458 -0
  360. package/dist/tui/agent-progress-card.js +111 -0
  361. package/dist/tui/agent-tree.js +11 -1
  362. package/dist/tui/ask-modal.js +14 -14
  363. package/dist/tui/ask-user-question-prompt.js +203 -0
  364. package/dist/tui/compact-banner.js +81 -0
  365. package/dist/tui/conversation-pane.js +85 -11
  366. package/dist/tui/cost-table.js +111 -0
  367. package/dist/tui/device-flow.js +2 -2
  368. package/dist/tui/doctor-table.js +46 -0
  369. package/dist/tui/feedback-prompt.js +156 -0
  370. package/dist/tui/input-box.js +247 -32
  371. package/dist/tui/login-picker.js +3 -3
  372. package/dist/tui/markdown-render.js +6 -6
  373. package/dist/tui/onboarding-wizard.js +240 -0
  374. package/dist/tui/permissions-picker.js +86 -0
  375. package/dist/tui/render.js +35 -0
  376. package/dist/tui/repl-render.js +332 -54
  377. package/dist/tui/repl-splash-art.js +16 -16
  378. package/dist/tui/repl-splash-mascot.js +48 -24
  379. package/dist/tui/repl-splash.js +22 -22
  380. package/dist/tui/repl.js +124 -44
  381. package/dist/tui/slash-palette.js +6 -6
  382. package/dist/tui/splash.js +2 -2
  383. package/dist/tui/status-bar.js +109 -31
  384. package/dist/tui/status-table.js +7 -0
  385. package/dist/tui/stickers-art.js +136 -0
  386. package/dist/tui/style-table.js +28 -0
  387. package/dist/tui/theme-table.js +29 -0
  388. package/dist/tui/thinking-spinner.js +123 -0
  389. package/dist/tui/tool-stream-pane.js +53 -4
  390. package/dist/tui/update-banner.js +27 -2
  391. package/dist/tui/vim-input.js +267 -0
  392. package/dist/tui/welcome-banner.js +107 -0
  393. package/dist/tui/welcome-data.js +293 -0
  394. package/dist/tui/workspace-context.js +2 -2
  395. package/docs/examples/codegraph.mcp.json +10 -0
  396. package/package.json +23 -6
  397. package/test/scenarios/codegen-create-file.scenario.txt +13 -0
  398. package/test/scenarios/compact-force.scenario.txt +11 -0
  399. package/test/scenarios/identity.scenario.txt +11 -0
  400. package/test/scenarios/persona-handoff.scenario.txt +11 -0
  401. package/test/scenarios/walkback.scenario.txt +12 -0
  402. package/dist/core/engine/compaction-hook.js +0 -154
@@ -1,19 +1,21 @@
1
1
  import { getJobRegistry, summarizeJobsForPrompt, } from '../jobs/registry.js';
2
+ import { compileStyleBlock } from '../output-style/presets.js';
3
+ import { resolveOutputStyle } from '../output-style/state.js';
2
4
  /**
3
5
  * System prompts for each engine command. Each prompt:
4
- * - Anchors the model in Pugi's local-first contract (ADR-0037).
5
- * - Lists the tools the model may call (the registry is authoritative,
6
- * but stating it inline prevents the model from inventing tool names
7
- * when the tool schema is large).
8
- * - Defines the deliverable shape so the model produces a useful final
9
- * text answer instead of "here is what I did".
6
+ * - Anchors the model in Pugi's local-first contract .
7
+ * - Lists the tools the model may call (the registry is authoritative,
8
+ * but stating it inline prevents the model from inventing tool names
9
+ * when the tool schema is large).
10
+ * - Defines the deliverable shape so the model produces a useful final
11
+ * text answer instead of "here is what I did".
10
12
  *
11
13
  * The prompts are intentionally terse. Per gstack `engineering-standards`
12
14
  * the persona system prompt comes from the runtime (Anvil bridge
13
15
  * prepends `oes-dev` / Sigma prompt automatically when configured); these
14
16
  * prompts ride on top and scope the model to the current command.
15
17
  *
16
- * Sprint α5.9 (ADR-0056 PR-PUGI-CLI-M1-GAP-J): the system prompt picks up
18
+ * Sprint : the system prompt picks up
17
19
  * a `BACKGROUND JOBS:` snapshot appended at the tail so the agent loop
18
20
  * knows what background bash work is currently on watch and can avoid
19
21
  * spawning a duplicate. The snapshot is sourced from `JobRegistry` and
@@ -21,23 +23,114 @@ import { getJobRegistry, summarizeJobsForPrompt, } from '../jobs/registry.js';
21
23
  */
22
24
  const COMMON_LOCAL_FIRST_PREAMBLE = [
23
25
  'You are the Pugi CLI agent running locally inside the operator\'s repository.',
24
- 'The local filesystem is the source of truth. Every change you make is committed locally; nothing is uploaded by default (ADR-0037 local-first).',
26
+ 'The local filesystem is the source of truth. Every change you make is committed locally; nothing is uploaded by default .',
27
+ // R1 fix (2026-05-26, PR r1, Fix 5 Option B): only advertise the
28
+ // tools currently wired in `tool-bridge.ts::WIRED_TOOLS`. ships
29
+ // apply_patch / lsp_* / worktree_* as CLI-only surfaces (`pugi patch`,
30
+ // `pugi lsp`, `pugi worktree`); wiring them into the engine loop is
31
+ // deferred to β2 (apply_patch), β4 (LSP tools), β7 (worktree tools)
32
+ // per the consolidated sprint plan. Advertising them in the system
33
+ // prompt without a matching executor entry caused Pugi to attempt
34
+ // calls that returned `unknown_tool` — broken eval surface.
25
35
  'You have a tool registry: read, write, edit, grep, glob, bash. Call tools to inspect and modify the workspace.',
26
36
  'Cite file paths relative to the workspace root. Keep edits minimal and reversible.',
27
37
  'When you are done, return a single final text answer that the operator can read on the CLI.',
28
38
  ].join(' ');
39
+ /**
40
+ * β5a P1+P6 : prompt v2 — intent marker contract +
41
+ * definitional examples + jargon ban. Fixes the dominant Pugi loss
42
+ * mode in the .X Phase 2 comparative eval: tool-use on pure
43
+ * knowledge questions ("What is grep?" → bash man grep).
44
+ *
45
+ * The CLI-side `classifyIntent` (apps/pugi-cli/src/core/engine/intent.ts)
46
+ * wraps definitional questions with `<intent kind="definitional">` on
47
+ * the user message before send. The rules below teach the model what
48
+ * to do with that marker.
49
+ *
50
+ * Voice constraint: same banned-jargon list as the cabinet Pugi
51
+ * persona (брифую / диспатчу / шипаю and the English jargon list
52
+ * from BANNED_WORDS in mira.system-prompt.ts). Repeated here verbatim
53
+ * so the CLI surface has its own enforcement copy; the cabinet copy
54
+ * is the source of truth and ships through the runtime persona
55
+ * prompt for the cabinet UI. CLI runs DO NOT load the cabinet
56
+ * persona prompt — engine prompts are the only place to enforce
57
+ * voice for `pugi explain` / `pugi code` callers.
58
+ */
59
+ const INTENT_MARKER_CONTRACT = [
60
+ '# Intent contract',
61
+ 'When the operator\'s message starts with `<intent kind="definitional">`, treat it as a knowledge question:',
62
+ ' - Answer in prose. Do NOT call any tools.',
63
+ ' - Cite a file from the repo only when it directly supports the explanation.',
64
+ ' - Keep the answer to one short paragraph unless the operator asked for depth.',
65
+ 'When no intent marker is present OR the marker is operational, use tools as needed.',
66
+ '',
67
+ '# Definitional examples',
68
+ 'Operator: `<intent kind="definitional">What is grep?</intent>`',
69
+ 'You: `grep is a Unix command-line tool that searches plain text for lines matching a regular expression. It reads stdin or files and prints matching lines to stdout.`',
70
+ '(No tool calls. One paragraph. No file paths because grep is a generic Unix tool, not a repo artefact.)',
71
+ '',
72
+ 'Operator: `<intent kind="definitional">что такое pgvector?</intent>`',
73
+ 'You: `pgvector - это расширение PostgreSQL для хранения и поиска векторных эмбеддингов. Поддерживает ivfflat и hnsw индексы; используется для RAG и semantic search.`',
74
+ '(One short paragraph. No tools.)',
75
+ ].join('\n');
76
+ const JARGON_BAN = [
77
+ '# Voice',
78
+ 'Brand voice: terse, operator-grade, English in code paths / Russian-Ukrainian permitted in chat answers.',
79
+ 'Banned words (CLI customer-facing output): "брифую", "диспатчу", "шипаю", "journey", "explore", "delight", "magical", "friendly", "let me help", "I\'d be happy to", "pug-tastic". Use neutral verbs instead: brief / dispatch / ship / build / read / write.',
80
+ 'No em-dashes. No emoji. No "AI assistant" framing.',
81
+ ].join('\n');
82
+ const PROMPT_V2_APPENDIX = [INTENT_MARKER_CONTRACT, JARGON_BAN].join('\n\n');
29
83
  const PLAN_TOOLS_NOTE = 'PLAN MODE IS READ-ONLY. You may call read, grep, glob. Calls to write, edit, or bash will be refused and end the run. Produce a written plan, not changes.';
30
84
  const EDIT_FLOW_RULES = [
31
85
  'Before calling edit on a file you have not yet read this session, call read first — the edit tool fails otherwise.',
32
86
  'Prefer edit over write when changing existing files; write only for newly created files.',
33
87
  'After your last tool call, summarise what you changed and what the operator should review.',
88
+ // Backlog — Layer A.5 fuzzy ladder advisory. The operator may
89
+ // have run with `--fuzzy-edits`; the ladder is invisible to the
90
+ // model but the model should still anchor its SEARCH blocks on
91
+ // verbatim source when possible. Ellipsis is the only relaxation
92
+ // we want the model к reach for explicitly; whitespace + edit-
93
+ // distance fire automatically and silently when they're needed.
94
+ 'If exact SEARCH match fails, the dispatcher may retry with a fuzzy ladder (whitespace-flex → ellipsis → 0.8 edit-distance). Prefer exact match; use `...` ellipsis only when you explicitly need to skip a long unchanged middle.',
34
95
  ].join(' ');
35
96
  export function systemPromptFor(kind) {
36
97
  const base = baseSystemPromptFor(kind);
98
+ // β5a P1+P6: append the prompt-v2 intent-marker contract +
99
+ // definitional examples + jargon ban to every command kind. The
100
+ // appendix is shared across kinds because the marker contract +
101
+ // voice gate are command-agnostic — a definitional question lands
102
+ // the same way under `pugi explain` and `pugi code`.
103
+ const withV2 = `${base}\n\n${PROMPT_V2_APPENDIX}`;
104
+ // output-style preset block. Compiled from
105
+ // workspace > user > default precedence. The `default` preset
106
+ // returns an empty block (no override over the base voice), so the
107
+ // injection is a no-op for the most-common case. Wrapped in
108
+ // try/catch — every IO failure inside `resolveOutputStyle` already
109
+ // degrades to the default slug, but defence in depth keeps the
110
+ // engine prompt assembly from ever crashing on a hand-edited
111
+ // config.json.
112
+ const styleBlock = formatOutputStyleBlock();
113
+ const withStyle = styleBlock ? `${withV2}\n\n${styleBlock}` : withV2;
37
114
  const snapshot = formatBackgroundJobsSnapshot(getJobRegistrySafely());
38
115
  if (!snapshot)
39
- return base;
40
- return `${base}\n\n${snapshot}`;
116
+ return withStyle;
117
+ return `${withStyle}\n\n${snapshot}`;
118
+ }
119
+ /**
120
+ * Resolve the active output-style preset for the current process
121
+ * and compile it into a prompt block. Returns empty string for the
122
+ * default preset OR for any unexpected IO failure so the engine
123
+ * prompt assembly path is unaffected by a missing / malformed
124
+ * config.json.
125
+ */
126
+ function formatOutputStyleBlock() {
127
+ try {
128
+ const resolved = resolveOutputStyle({ workspaceRoot: process.cwd() });
129
+ return compileStyleBlock(resolved.slug);
130
+ }
131
+ catch {
132
+ return '';
133
+ }
41
134
  }
42
135
  function baseSystemPromptFor(kind) {
43
136
  switch (kind) {
@@ -107,12 +200,37 @@ function getJobRegistrySafely() {
107
200
  }
108
201
  }
109
202
  /**
110
- * Anvil persona slug to invoke per command. Today every command routes
111
- * to `oes-dev` (Sigma) — the Tier-2 reviewer persona already configured
112
- * for Pugi runtime work. When we add per-command personas (e.g. `pugi-
113
- * planner`, `pugi-coder`) this is the single switch to update.
203
+ * Anvil persona slug to invoke per command. Routes each engine command
204
+ * to the appropriate Tier-1 persona from PERSONA_REGISTRY (admin-api/
205
+ * src/pugi-runtime/personas/persona-dispatch.ts):
206
+ *
207
+ * - code / fix / build → 'dev' (Hiroshi, coder, Sonnet codegen tag)
208
+ * - plan → 'architect' (Marcus, architect, Sonnet reason)
209
+ * - explain → 'main' (Pugi orchestrator, DeepSeek reason)
210
+ *
211
+ * Previously this returned 'oes-dev' unconditionally — that is an OES
212
+ * C++ reviewer persona, wrong tool set + wrong system prompt for
213
+ * customer dispatches. CEO live trace #53.
214
+ *
215
+ * Operator override: PUGI_ENGINE_PERSONA_<COMMAND> env (e.g.
216
+ * PUGI_ENGINE_PERSONA_CODE=frontend pins Mia for the next dispatch).
114
217
  */
115
- export function personaSlugFor(_kind) {
116
- return 'oes-dev';
218
+ export function personaSlugFor(kind) {
219
+ const envKey = `PUGI_ENGINE_PERSONA_${kind.toUpperCase()}`;
220
+ const override = process.env[envKey];
221
+ if (override && override.length > 0)
222
+ return override;
223
+ switch (kind) {
224
+ case 'code':
225
+ case 'fix':
226
+ case 'build':
227
+ return 'dev';
228
+ case 'plan':
229
+ return 'architect';
230
+ case 'explain':
231
+ return 'main';
232
+ default:
233
+ return 'main';
234
+ }
117
235
  }
118
236
  //# sourceMappingURL=prompts.js.map
@@ -0,0 +1,124 @@
1
+ /**
2
+ * L3 — leak-parity: underscore-prefix internal-fields filter.
3
+ *
4
+ * The convention (observed in the leaked the upstream tool BashTool surface and
5
+ * codified in `docs/research/2026-05-27-pugi-.md` §1)
6
+ * is that tool-argument fields whose names start with a leading underscore
7
+ * are INTERNAL — populated by the dispatcher at call time (sessionId,
8
+ * tenantId, correlation handles, hook context, ask-modal bridge handles)
9
+ * but never advertised to the model. The model schema MUST omit them so:
10
+ *
11
+ * 1. No token cost — internal context never burns model budget.
12
+ * 2. No fabrication risk — the model cannot hallucinate values for
13
+ * sessionId / tenantId / etc. because the field is invisible.
14
+ * 3. No leak surface — implementation detail stays implementation detail.
15
+ *
16
+ * The dispatcher (see `tool-bridge.ts::buildExecutor`) does NOT strip these
17
+ * fields at call time. It passes the full args record (including any
18
+ * `_internal*` keys an upstream layer injected) straight to the tool
19
+ * handler. Only the schema surface that the engine adapter ships to the
20
+ * model is filtered.
21
+ *
22
+ * This module is intentionally narrow: it accepts a JSON Schema fragment
23
+ * and returns a deep clone with `_`-prefixed keys removed from every
24
+ * `properties` map encountered while walking, and with `required` filtered
25
+ * to drop any references to those keys. It descends into nested object
26
+ * schemas and into the `items` schema of arrays. It is JSON-Schema-version
27
+ * agnostic (works on draft-07, 2019-09, 2020-12 alike) because it only
28
+ * inspects `properties`/`required`/`items` and leaves the rest of the
29
+ * fragment alone.
30
+ *
31
+ * Edge cases handled:
32
+ * - `_` alone (single underscore) is treated as internal and stripped.
33
+ * - Nested object schemas inside `properties` get the same treatment
34
+ * (a sub-property whose name starts with `_` is removed too).
35
+ * - Array `items` are walked. Tuple schemas (`items` as array) are
36
+ * walked element-by-element.
37
+ * - `oneOf`/`anyOf`/`allOf` branches are walked.
38
+ * - Non-object inputs (null, primitives, arrays passed as the root)
39
+ * are returned as-is — defensive no-op, never throws.
40
+ *
41
+ * Contract notes:
42
+ * - Pure function. Input is never mutated.
43
+ * - Output is a deep clone — every nested object/array is freshly
44
+ * allocated so callers can mutate safely.
45
+ * - JSON-only — does not preserve symbols, getters, or class instances
46
+ * because JSON Schema is plain-data by spec.
47
+ */
48
+ const INTERNAL_PREFIX = '_';
49
+ /**
50
+ * Returns true when the field name should be stripped from the model-
51
+ * facing schema. Leading underscore is the contract — single `_` is also
52
+ * stripped (no escape hatch). Empty-string keys (which are technically
53
+ * valid JSON) are left alone so we do not silently drop them.
54
+ */
55
+ export function isInternalFieldName(name) {
56
+ return name.length > 0 && name.startsWith(INTERNAL_PREFIX);
57
+ }
58
+ /**
59
+ * Strip `_`-prefixed properties from a JSON Schema fragment. Recursively
60
+ * walks nested object schemas and array `items`. Returns a deep clone;
61
+ * the input is never mutated.
62
+ *
63
+ * Pass-through behaviour:
64
+ * - Non-object / null / array inputs round-trip unchanged (as deep
65
+ * clones where applicable).
66
+ * - Fragments with no `properties` key are returned as deep clones
67
+ * after walking `items`/`oneOf`/`anyOf`/`allOf`.
68
+ */
69
+ export function stripInternalFields(schema) {
70
+ if (schema === null || typeof schema !== 'object')
71
+ return schema;
72
+ if (Array.isArray(schema)) {
73
+ return schema.map((item) => stripInternalFields(item));
74
+ }
75
+ return walkObject(schema);
76
+ }
77
+ function walkObject(node) {
78
+ const out = {};
79
+ for (const [key, value] of Object.entries(node)) {
80
+ if (key === 'properties' && value !== null && typeof value === 'object' && !Array.isArray(value)) {
81
+ out[key] = walkProperties(value);
82
+ continue;
83
+ }
84
+ if (key === 'required' && Array.isArray(value)) {
85
+ out[key] = value.filter((entry) => typeof entry === 'string' && !isInternalFieldName(entry));
86
+ continue;
87
+ }
88
+ if (key === 'items') {
89
+ out[key] = stripInternalFields(value);
90
+ continue;
91
+ }
92
+ if (key === 'oneOf' || key === 'anyOf' || key === 'allOf') {
93
+ if (Array.isArray(value)) {
94
+ out[key] = value.map((branch) => stripInternalFields(branch));
95
+ continue;
96
+ }
97
+ }
98
+ // Default: deep-clone any nested objects/arrays so the caller can
99
+ // mutate freely without touching the input. Primitives pass through.
100
+ out[key] = cloneJson(value);
101
+ }
102
+ return out;
103
+ }
104
+ function walkProperties(props) {
105
+ const out = {};
106
+ for (const [propName, propSchema] of Object.entries(props)) {
107
+ if (isInternalFieldName(propName))
108
+ continue;
109
+ out[propName] = stripInternalFields(propSchema);
110
+ }
111
+ return out;
112
+ }
113
+ function cloneJson(value) {
114
+ if (value === null || typeof value !== 'object')
115
+ return value;
116
+ if (Array.isArray(value))
117
+ return value.map((item) => cloneJson(item));
118
+ const out = {};
119
+ for (const [key, val] of Object.entries(value)) {
120
+ out[key] = cloneJson(val);
121
+ }
122
+ return out;
123
+ }
124
+ //# sourceMappingURL=strip-internal-fields.js.map