@pugi/cli 0.1.0-beta.9 → 0.1.0-beta.91

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 (411) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/LICENSE +1 -1
  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 +3 -3
  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 +13 -13
  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 +333 -7
  94. package/dist/core/edits/format-detector.js +260 -0
  95. package/dist/core/edits/format-matrix.js +26 -0
  96. package/dist/core/edits/fuzzy-ladder.js +650 -0
  97. package/dist/core/edits/index.js +5 -1
  98. package/dist/core/edits/journal.js +199 -0
  99. package/dist/core/edits/layer-a-apply.js +15 -15
  100. package/dist/core/edits/layer-a-fuzzy-apply.js +198 -0
  101. package/dist/core/edits/layer-b-apply.js +9 -9
  102. package/dist/core/edits/layer-c-apply.js +6 -6
  103. package/dist/core/edits/layer-d-ast.js +557 -14
  104. package/dist/core/edits/marker-parser.js +12 -12
  105. package/dist/core/edits/security-gate.js +27 -27
  106. package/dist/core/edits/verify-hook.js +273 -0
  107. package/dist/core/edits/worktree.js +29 -29
  108. package/dist/core/engine/anvil-client.js +214 -26
  109. package/dist/core/engine/auto-compact.js +179 -0
  110. package/dist/core/engine/budgets.js +186 -0
  111. package/dist/core/engine/context-prefix.js +155 -0
  112. package/dist/core/engine/index.js +1 -1
  113. package/dist/core/engine/intensity.js +158 -0
  114. package/dist/core/engine/intent.js +260 -0
  115. package/dist/core/engine/native-pugi.js +1295 -227
  116. package/dist/core/engine/prompts.js +129 -19
  117. package/dist/core/engine/strip-internal-fields.js +124 -0
  118. package/dist/core/engine/tool-bridge.js +1792 -59
  119. package/dist/core/evaluation/golden-dataset.js +293 -0
  120. package/dist/core/feedback/queue.js +177 -0
  121. package/dist/core/feedback/submitter.js +145 -0
  122. package/dist/core/file-cache.js +113 -1
  123. package/dist/core/flatten/flatten-repo.js +439 -0
  124. package/dist/core/format/osc8-link.js +28 -0
  125. package/dist/core/hook-chains.js +392 -0
  126. package/dist/core/hooks/citation-verify-hook.js +138 -0
  127. package/dist/core/hooks/citation-verify.js +112 -0
  128. package/dist/core/hooks/events.js +46 -0
  129. package/dist/core/hooks/index.js +15 -0
  130. package/dist/core/hooks/registry.js +216 -0
  131. package/dist/core/hooks/runner.js +236 -0
  132. package/dist/core/hooks/v2/event-emitter.js +115 -0
  133. package/dist/core/hooks/v2/executor.js +282 -0
  134. package/dist/core/hooks/v2/index.js +25 -0
  135. package/dist/core/hooks/v2/lifecycle.js +104 -0
  136. package/dist/core/hooks/v2/loader.js +216 -0
  137. package/dist/core/hooks/v2/matcher.js +125 -0
  138. package/dist/core/hooks/v2/trust.js +143 -0
  139. package/dist/core/hooks/v2/types.js +86 -0
  140. package/dist/core/hooks/worktree-events.js +158 -0
  141. package/dist/core/image/renderer.js +71 -0
  142. package/dist/core/init/detector.js +582 -0
  143. package/dist/core/init/template-renderer.js +242 -0
  144. package/dist/core/jobs/registry.js +18 -18
  145. package/dist/core/ledger/results-tsv.js +142 -0
  146. package/dist/core/log-discipline/stdout-redirect.js +51 -0
  147. package/dist/core/lsp/cache.js +105 -0
  148. package/dist/core/lsp/client.js +551 -41
  149. package/dist/core/lsp/language-detect.js +66 -0
  150. package/dist/core/lsp/post-edit-diagnostics.js +171 -0
  151. package/dist/core/lsp/server-detect.js +173 -0
  152. package/dist/core/lsp/symbol-cache.js +162 -0
  153. package/dist/core/lsp/symbol-tools.js +664 -0
  154. package/dist/core/mcp/client.js +97 -28
  155. package/dist/core/mcp/http-server.js +553 -0
  156. package/dist/core/mcp/orchestrator-tools.js +662 -0
  157. package/dist/core/mcp/permission.js +190 -0
  158. package/dist/core/mcp/registry.js +39 -17
  159. package/dist/core/mcp/server-tools.js +219 -0
  160. package/dist/core/mcp/server.js +397 -0
  161. package/dist/core/mcp/trust.js +10 -10
  162. package/dist/core/memory/dual-write.js +416 -0
  163. package/dist/core/memory/passive-extract.js +130 -0
  164. package/dist/core/memory/phase1-kinds.js +20 -0
  165. package/dist/core/memory/secret-scanner.js +304 -0
  166. package/dist/core/memory-sync/queue.js +170 -0
  167. package/dist/core/metrics/extract.js +113 -0
  168. package/dist/core/modes/roo-modes.js +68 -0
  169. package/dist/core/onboarding/ensure-initialized.js +133 -0
  170. package/dist/core/onboarding/marker.js +111 -0
  171. package/dist/core/onboarding/telemetry-state.js +108 -0
  172. package/dist/core/output-style/presets.js +176 -0
  173. package/dist/core/output-style/state.js +185 -0
  174. package/dist/core/path-security.js +287 -5
  175. package/dist/core/permission.js +82 -22
  176. package/dist/core/permissions/auto-classifier.js +124 -0
  177. package/dist/core/permissions/bash-parser.js +371 -0
  178. package/dist/core/permissions/circuit-breaker.js +83 -0
  179. package/dist/core/permissions/constrained-edit.js +91 -0
  180. package/dist/core/permissions/gate.js +278 -0
  181. package/dist/core/permissions/index.js +20 -0
  182. package/dist/core/permissions/mode.js +174 -0
  183. package/dist/core/permissions/network-egress.js +137 -0
  184. package/dist/core/permissions/state.js +241 -0
  185. package/dist/core/permissions/tool-class.js +93 -0
  186. package/dist/core/plan-mode/ui-state.js +51 -0
  187. package/dist/core/plans/plan-artifact.js +721 -0
  188. package/dist/core/policy-limits/etag-store.js +122 -0
  189. package/dist/core/prd-check/parser.js +215 -0
  190. package/dist/core/prd-check/reporter.js +127 -0
  191. package/dist/core/prd-check/session-review.js +557 -0
  192. package/dist/core/prd-check/verifiers.js +223 -0
  193. package/dist/core/prompt-cache/client-cache.js +99 -0
  194. package/dist/core/prompts/assembly.js +29 -0
  195. package/dist/core/prompts/registry.js +364 -0
  196. package/dist/core/pugi-md/cc-compat-rules.js +735 -0
  197. package/dist/core/pugi-md/context-injector.js +76 -0
  198. package/dist/core/pugi-md/walk-up.js +207 -0
  199. package/dist/core/python/uv-installer.js +270 -0
  200. package/dist/core/python/uv-resolver.js +83 -0
  201. package/dist/core/rate-limit/narrator.js +146 -0
  202. package/dist/core/recipes/cli-types.js +20 -0
  203. package/dist/core/recipes/loader.js +103 -0
  204. package/dist/core/recipes/runner.js +345 -0
  205. package/dist/core/recipes/schema.js +587 -0
  206. package/dist/core/release-notes/parser.js +241 -0
  207. package/dist/core/release-notes/state.js +116 -0
  208. package/dist/core/repl/ask.js +37 -37
  209. package/dist/core/repl/cancellation.js +26 -26
  210. package/dist/core/repl/cap-warning.js +4 -4
  211. package/dist/core/repl/clipboard-read.js +11 -11
  212. package/dist/core/repl/dispatch-fsm.js +12 -12
  213. package/dist/core/repl/history-search.js +15 -15
  214. package/dist/core/repl/history.js +28 -18
  215. package/dist/core/repl/kill-ring.js +5 -5
  216. package/dist/core/repl/model-pricing.js +135 -0
  217. package/dist/core/repl/privacy-banner.js +22 -22
  218. package/dist/core/repl/session.js +2148 -217
  219. package/dist/core/repl/slash-commands.js +501 -41
  220. package/dist/core/repl/store/index.js +1 -1
  221. package/dist/core/repl/store/jsonl-log.js +22 -22
  222. package/dist/core/repl/store/lockfile.js +10 -10
  223. package/dist/core/repl/store/session-store.js +136 -107
  224. package/dist/core/repl/store/types.js +15 -15
  225. package/dist/core/repl/store/uuid-v7.js +12 -12
  226. package/dist/core/repl/workspace-context.js +43 -21
  227. package/dist/core/repo-map/build.js +125 -0
  228. package/dist/core/repo-map/cache.js +185 -0
  229. package/dist/core/repo-map/extractor.js +254 -0
  230. package/dist/core/repo-map/formatter.js +145 -0
  231. package/dist/core/repo-map/page-rank.js +105 -0
  232. package/dist/core/repo-map/scanner.js +211 -0
  233. package/dist/core/retry-budget/budget.js +284 -0
  234. package/dist/core/retry-budget/index.js +5 -0
  235. package/dist/core/retry-budget/retry-cap.js +74 -0
  236. package/dist/core/routing/lead-worker.js +43 -0
  237. package/dist/core/routing/pre-flight-estimator.js +108 -0
  238. package/dist/core/runs/run-tree.js +103 -0
  239. package/dist/core/security/injection-scanner.js +367 -0
  240. package/dist/core/security/output-filter.js +418 -0
  241. package/dist/core/session/env-file.js +105 -0
  242. package/dist/core/session/section-budgets.js +140 -0
  243. package/dist/core/session.js +92 -0
  244. package/dist/core/settings.js +324 -5
  245. package/dist/core/share/formatter.js +271 -0
  246. package/dist/core/share/redactor.js +221 -0
  247. package/dist/core/share/uploader.js +267 -0
  248. package/dist/core/skills/defaults.js +30 -30
  249. package/dist/core/skills/loader.js +22 -22
  250. package/dist/core/skills/sources.js +27 -27
  251. package/dist/core/smoke/headless-driver.js +174 -0
  252. package/dist/core/smoke/orchestrator.js +194 -0
  253. package/dist/core/smoke/runner.js +238 -0
  254. package/dist/core/smoke/scenario-parser.js +316 -0
  255. package/dist/core/statusline.js +99 -0
  256. package/dist/core/subagents/dispatcher-real.js +600 -0
  257. package/dist/core/subagents/dispatcher.js +132 -43
  258. package/dist/core/subagents/index.js +19 -6
  259. package/dist/core/subagents/isolation-matrix.js +213 -0
  260. package/dist/core/subagents/spawn.js +19 -4
  261. package/dist/core/telemetry/emitter.js +229 -0
  262. package/dist/core/telemetry/queue.js +251 -0
  263. package/dist/core/theme/context.js +91 -0
  264. package/dist/core/theme/presets.js +228 -0
  265. package/dist/core/theme/state.js +181 -0
  266. package/dist/core/todos/invariant.js +10 -0
  267. package/dist/core/todos/state.js +177 -0
  268. package/dist/core/tool-schema/compressor.js +89 -0
  269. package/dist/core/transport/version-interceptor.js +166 -0
  270. package/dist/core/trust.js +2 -2
  271. package/dist/core/tui/thinking-block.js +64 -0
  272. package/dist/core/vim/keymap.js +288 -0
  273. package/dist/core/vim/state.js +92 -0
  274. package/dist/core/watch-markers/marker-watcher.js +133 -0
  275. package/dist/core/worktree/include-parser.js +249 -0
  276. package/dist/core/worktree-manager/cleanup.js +123 -0
  277. package/dist/core/worktree-manager/manager.js +303 -0
  278. package/dist/index.js +36 -0
  279. package/dist/runtime/bootstrap.js +190 -0
  280. package/dist/runtime/cli.js +4185 -549
  281. package/dist/runtime/commands/agents.js +31 -31
  282. package/dist/runtime/commands/budget.js +5 -5
  283. package/dist/runtime/commands/cancel.js +231 -0
  284. package/dist/runtime/commands/chain.js +489 -0
  285. package/dist/runtime/commands/codegraph-status.js +227 -0
  286. package/dist/runtime/commands/compact.js +297 -0
  287. package/dist/runtime/commands/config.js +73 -39
  288. package/dist/runtime/commands/cost.js +199 -0
  289. package/dist/runtime/commands/delegate.js +27 -4
  290. package/dist/runtime/commands/dispatch.js +126 -0
  291. package/dist/runtime/commands/doctor.js +579 -0
  292. package/dist/runtime/commands/feedback.js +184 -0
  293. package/dist/runtime/commands/hooks.js +187 -0
  294. package/dist/runtime/commands/init.js +254 -0
  295. package/dist/runtime/commands/lsp.js +200 -38
  296. package/dist/runtime/commands/mcp.js +879 -0
  297. package/dist/runtime/commands/memory.js +582 -0
  298. package/dist/runtime/commands/model.js +237 -0
  299. package/dist/runtime/commands/onboarding.js +275 -0
  300. package/dist/runtime/commands/patch.js +12 -12
  301. package/dist/runtime/commands/permissions.js +112 -0
  302. package/dist/runtime/commands/plan.js +143 -0
  303. package/dist/runtime/commands/prd-check.js +285 -0
  304. package/dist/runtime/commands/privacy.js +17 -17
  305. package/dist/runtime/commands/recipe.js +325 -0
  306. package/dist/runtime/commands/redo-blob-store.js +92 -0
  307. package/dist/runtime/commands/redo.js +361 -0
  308. package/dist/runtime/commands/release-notes.js +229 -0
  309. package/dist/runtime/commands/repo-map.js +95 -0
  310. package/dist/runtime/commands/report.js +299 -0
  311. package/dist/runtime/commands/resume.js +118 -0
  312. package/dist/runtime/commands/review-consensus.js +68 -53
  313. package/dist/runtime/commands/rewind.js +333 -0
  314. package/dist/runtime/commands/roster.js +14 -14
  315. package/dist/runtime/commands/sessions.js +163 -0
  316. package/dist/runtime/commands/share.js +316 -0
  317. package/dist/runtime/commands/skills.js +31 -31
  318. package/dist/runtime/commands/status.js +186 -0
  319. package/dist/runtime/commands/stickers.js +82 -0
  320. package/dist/runtime/commands/style.js +194 -0
  321. package/dist/runtime/commands/theme.js +196 -0
  322. package/dist/runtime/commands/undo.js +54 -22
  323. package/dist/runtime/commands/update.js +289 -0
  324. package/dist/runtime/commands/vim.js +140 -0
  325. package/dist/runtime/commands/worktree.js +8 -8
  326. package/dist/runtime/commands/worktrees.js +155 -0
  327. package/dist/runtime/headless-repl.js +195 -0
  328. package/dist/runtime/headless.js +543 -0
  329. package/dist/runtime/load-hooks-or-exit.js +71 -0
  330. package/dist/runtime/plan-decompose.js +22 -22
  331. package/dist/runtime/sigint-guard.js +272 -0
  332. package/dist/runtime/update-check.js +28 -28
  333. package/dist/runtime/version.js +65 -0
  334. package/dist/runtime/worktree-bootstrap.js +579 -0
  335. package/dist/skills/bundled/batch.js +617 -0
  336. package/dist/skills/bundled/index.js +45 -0
  337. package/dist/skills/bundled/loop.js +358 -0
  338. package/dist/skills/bundled/remember.js +383 -0
  339. package/dist/skills/bundled/simplify.js +289 -0
  340. package/dist/skills/bundled/skillify.js +373 -0
  341. package/dist/skills/bundled/stuck.js +558 -0
  342. package/dist/skills/bundled/verify.js +439 -0
  343. package/dist/testing/vcr.js +486 -0
  344. package/dist/tools/agent-tool.js +229 -0
  345. package/dist/tools/apply-patch.js +89 -28
  346. package/dist/tools/ask-user-question.js +337 -0
  347. package/dist/tools/ask-user.js +115 -0
  348. package/dist/tools/bash.js +624 -46
  349. package/dist/tools/brief.js +224 -0
  350. package/dist/tools/cron.js +433 -0
  351. package/dist/tools/enter-worktree.js +250 -0
  352. package/dist/tools/exit-worktree.js +147 -0
  353. package/dist/tools/file-tools.js +161 -44
  354. package/dist/tools/lsp-tools.js +377 -1
  355. package/dist/tools/mcp-tool.js +260 -0
  356. package/dist/tools/multi-edit.js +361 -0
  357. package/dist/tools/powershell.js +268 -0
  358. package/dist/tools/registry.js +99 -4
  359. package/dist/tools/skill-tool.js +96 -0
  360. package/dist/tools/sleep.js +99 -0
  361. package/dist/tools/synthetic-output.js +133 -0
  362. package/dist/tools/tasks.js +208 -0
  363. package/dist/tools/todo-write.js +184 -0
  364. package/dist/tools/verify-plan-execution.js +295 -0
  365. package/dist/tools/web-fetch-injection-scanner.js +207 -0
  366. package/dist/tools/web-fetch.js +195 -10
  367. package/dist/tools/web-search.js +458 -0
  368. package/dist/tui/agent-progress-card.js +111 -0
  369. package/dist/tui/agent-tree.js +11 -1
  370. package/dist/tui/ask-modal.js +14 -14
  371. package/dist/tui/ask-user-question-chips.js +315 -0
  372. package/dist/tui/ask-user-question-prompt.js +203 -0
  373. package/dist/tui/compact-banner.js +81 -0
  374. package/dist/tui/conversation-pane.js +85 -11
  375. package/dist/tui/cost-table.js +111 -0
  376. package/dist/tui/device-flow.js +2 -2
  377. package/dist/tui/doctor-table.js +46 -0
  378. package/dist/tui/feedback-prompt.js +156 -0
  379. package/dist/tui/input-box.js +247 -32
  380. package/dist/tui/login-picker.js +3 -3
  381. package/dist/tui/markdown-render.js +6 -6
  382. package/dist/tui/multi-file-diff-approval.js +375 -0
  383. package/dist/tui/onboarding-wizard.js +240 -0
  384. package/dist/tui/permissions-picker.js +86 -0
  385. package/dist/tui/render.js +36 -1
  386. package/dist/tui/repl-render.js +176 -25
  387. package/dist/tui/repl-splash-art.js +16 -16
  388. package/dist/tui/repl-splash-mascot.js +48 -24
  389. package/dist/tui/repl-splash.js +22 -22
  390. package/dist/tui/repl.js +125 -45
  391. package/dist/tui/slash-palette.js +6 -6
  392. package/dist/tui/splash.js +2 -2
  393. package/dist/tui/status-bar.js +109 -31
  394. package/dist/tui/status-table.js +7 -0
  395. package/dist/tui/stickers-art.js +136 -0
  396. package/dist/tui/style-table.js +28 -0
  397. package/dist/tui/theme-table.js +29 -0
  398. package/dist/tui/thinking-spinner.js +123 -0
  399. package/dist/tui/tool-stream-pane.js +53 -4
  400. package/dist/tui/update-banner.js +27 -2
  401. package/dist/tui/vim-input.js +267 -0
  402. package/dist/tui/welcome-banner.js +107 -0
  403. package/dist/tui/welcome-data.js +293 -0
  404. package/dist/tui/workspace-context.js +2 -2
  405. package/package.json +31 -16
  406. package/test/scenarios/codegen-create-file.scenario.txt +13 -0
  407. package/test/scenarios/compact-force.scenario.txt +12 -0
  408. package/test/scenarios/identity.scenario.txt +12 -0
  409. package/test/scenarios/persona-handoff.scenario.txt +12 -0
  410. package/test/scenarios/walkback.scenario.txt +12 -0
  411. package/dist/core/engine/compaction-hook.js +0 -154
@@ -0,0 +1,223 @@
1
+ /**
2
+ * PRD criterion verifiers — Pugi (`/prd-check`).
3
+ *
4
+ * Given a `ParsedCriterion` from `parser.ts`, run a set of built-in
5
+ * checks against the repository workspace and return a
6
+ * `VerifiedCriterion` with a per-criterion verdict + per-mention
7
+ * evidence trail. The module owns the file-system + grep surface
8
+ * the parser deliberately avoided.
9
+ *
10
+ * Verdict semantics (mirror the doctor probe contract so the
11
+ * reporter can render both with the same column layout):
12
+ *
13
+ * - PASS : at least one mention verified AND every attempted
14
+ * verifier passed
15
+ * - FAIL : at least one verifier failed (missing file, empty
16
+ * doc, command not in registry, etc.)
17
+ * - SKIPPED : no verifiable mentions in the criterion. The
18
+ * criterion is preserved in the report so the
19
+ * operator sees it, but it does not gate the verdict.
20
+ *
21
+ * Each `MentionResult` carries an evidence string the reporter
22
+ * shows next to the criterion. For PASS we render the resolved
23
+ * absolute path or matched line; for FAIL we render the missing
24
+ * artifact identifier so the operator can fix it directly.
25
+ *
26
+ * The verifier deps are injected (existsSync, readFileSync, …) so
27
+ * the spec can drive every branch without touching the real disk.
28
+ * The default-bound variant `runDefaultVerifiers` plugs the real
29
+ * Node fs helpers in for the CLI handler.
30
+ */
31
+ import { existsSync, readFileSync } from 'node:fs';
32
+ import { isAbsolute, resolve } from 'node:path';
33
+ /**
34
+ * Top-level verify-one-criterion entry. Walks the mention list,
35
+ * dispatches each to the right verifier, then computes the
36
+ * roll-up. Pure with respect to `deps` — no globals touched.
37
+ */
38
+ export function verifyCriterion(criterion, deps) {
39
+ if (criterion.mentions.length === 0) {
40
+ return {
41
+ criterion,
42
+ status: 'skipped',
43
+ results: [],
44
+ };
45
+ }
46
+ const results = [];
47
+ for (const mention of criterion.mentions) {
48
+ results.push(verifyMention(mention, deps));
49
+ }
50
+ const status = rollUp(results);
51
+ return { criterion, status, results };
52
+ }
53
+ /** Verify a whole PRD's worth of criteria. */
54
+ export function verifyAll(criteria, deps) {
55
+ return criteria.map((c) => verifyCriterion(c, deps));
56
+ }
57
+ function verifyMention(mention, deps) {
58
+ switch (mention.kind) {
59
+ case 'file':
60
+ return verifyFile(mention, deps);
61
+ case 'test':
62
+ return verifyTest(mention, deps);
63
+ case 'doc':
64
+ return verifyDoc(mention, deps);
65
+ case 'command':
66
+ return verifyCommand(mention, deps);
67
+ case 'route':
68
+ return verifyRoute(mention, deps);
69
+ }
70
+ }
71
+ function verifyFile(mention, deps) {
72
+ const absolute = deps.resolveWorkspacePath(mention.path);
73
+ if (deps.existsSync(absolute)) {
74
+ return {
75
+ mention,
76
+ status: 'pass',
77
+ evidence: `file present (${mention.path})`,
78
+ };
79
+ }
80
+ return {
81
+ mention,
82
+ status: 'fail',
83
+ evidence: `file missing (${mention.path})`,
84
+ };
85
+ }
86
+ function verifyTest(mention, deps) {
87
+ const absolute = deps.resolveWorkspacePath(mention.path);
88
+ if (!deps.existsSync(absolute)) {
89
+ return {
90
+ mention,
91
+ status: 'fail',
92
+ evidence: `spec missing (${mention.path})`,
93
+ };
94
+ }
95
+ let body;
96
+ try {
97
+ body = deps.readFileSync(absolute);
98
+ }
99
+ catch (error) {
100
+ const message = error instanceof Error ? error.message : String(error);
101
+ return {
102
+ mention,
103
+ status: 'fail',
104
+ evidence: `spec unreadable: ${message}`,
105
+ };
106
+ }
107
+ // Count `test(`, `it(`, and `describe(...).it(` blocks. The
108
+ // matcher is permissive — any of the three counts because the
109
+ // PRD only cares whether the spec asserts anything at all.
110
+ const matches = body.match(/\b(it|test)\s*\(/g);
111
+ if (!matches || matches.length === 0) {
112
+ return {
113
+ mention,
114
+ status: 'fail',
115
+ evidence: `spec present but has 0 test()/it() blocks`,
116
+ };
117
+ }
118
+ return {
119
+ mention,
120
+ status: 'pass',
121
+ evidence: `spec present with ${matches.length} block(s)`,
122
+ };
123
+ }
124
+ function verifyDoc(mention, deps) {
125
+ const absolute = deps.resolveWorkspacePath(mention.path);
126
+ if (!deps.existsSync(absolute)) {
127
+ return {
128
+ mention,
129
+ status: 'fail',
130
+ evidence: `doc missing (${mention.path})`,
131
+ };
132
+ }
133
+ let body;
134
+ try {
135
+ body = deps.readFileSync(absolute);
136
+ }
137
+ catch (error) {
138
+ const message = error instanceof Error ? error.message : String(error);
139
+ return {
140
+ mention,
141
+ status: 'fail',
142
+ evidence: `doc unreadable: ${message}`,
143
+ };
144
+ }
145
+ const trimmed = body.trim();
146
+ if (trimmed.length < 100) {
147
+ return {
148
+ mention,
149
+ status: 'fail',
150
+ evidence: `doc present but too short (${trimmed.length} chars, < 100)`,
151
+ };
152
+ }
153
+ return {
154
+ mention,
155
+ status: 'pass',
156
+ evidence: `doc present (${trimmed.length} chars)`,
157
+ };
158
+ }
159
+ function verifyCommand(mention, deps) {
160
+ if (deps.isKnownCommand(mention.name)) {
161
+ return {
162
+ mention,
163
+ status: 'pass',
164
+ evidence: `command \`${mention.name}\` registered`,
165
+ };
166
+ }
167
+ return {
168
+ mention,
169
+ status: 'fail',
170
+ evidence: `command \`${mention.name}\` not found in CLI registry`,
171
+ };
172
+ }
173
+ function verifyRoute(mention, deps) {
174
+ if (deps.hasRoute(mention.method, mention.path)) {
175
+ return {
176
+ mention,
177
+ status: 'pass',
178
+ evidence: `route ${mention.method} ${mention.path} registered`,
179
+ };
180
+ }
181
+ return {
182
+ mention,
183
+ status: 'fail',
184
+ evidence: `route ${mention.method} ${mention.path} not found`,
185
+ };
186
+ }
187
+ function rollUp(results) {
188
+ if (results.length === 0)
189
+ return 'skipped';
190
+ const anyFail = results.some((r) => r.status === 'fail');
191
+ if (anyFail)
192
+ return 'fail';
193
+ const anyPass = results.some((r) => r.status === 'pass');
194
+ return anyPass ? 'pass' : 'skipped';
195
+ }
196
+ /**
197
+ * Default verifier deps bound to real fs + a CLI-command predicate
198
+ * + a grep-based route locator. The CLI handler passes the
199
+ * workspace root + the known-command list at call time.
200
+ */
201
+ export function createDefaultDeps(options) {
202
+ return {
203
+ resolveWorkspacePath: (relative) => {
204
+ if (isAbsolute(relative))
205
+ return relative;
206
+ return resolve(options.workspaceRoot, relative);
207
+ },
208
+ existsSync: (path) => existsSync(path),
209
+ readFileSync: (path) => readFileSync(path, 'utf8'),
210
+ isKnownCommand: (name) => options.knownCommands.has(name),
211
+ hasRoute: () => {
212
+ // Best-effort default: the wave-6 PRD says the route verifier
213
+ // is "best-effort grep of controllers". Since the workspace
214
+ // layout varies per repo, the CLI handler injects a project
215
+ // -aware implementation when one is available; the default
216
+ // stays conservative and reports `fail` so the reporter
217
+ // surfaces the missing-verifier signal instead of silently
218
+ // passing.
219
+ return false;
220
+ },
221
+ };
222
+ }
223
+ //# sourceMappingURL=verifiers.js.map
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Client-side prompt cache .
3
+ *
4
+ * Wraps `lru-cache` (isaacs, MIT, used by npm itself) for in-memory
5
+ * LRU with TTL. Cached entries survive the entire process lifetime
6
+ * but are intentionally NOT persisted к disk — that's a follow-up
7
+ * (see PUGI_CLIENT_PROMPT_CACHE_PERSIST in the spec).
8
+ *
9
+ * Anthropic's server-side prompt cache uses a 5-minute TTL. We mirror
10
+ * that default here so a repeated turn within a single user session
11
+ * benefits even when the server cache expired (e.g. across a brief
12
+ * network drop or a model retry to a different upstream replica).
13
+ *
14
+ * Pure wrapper — no I/O, no globals. Caller hashes the prompt itself
15
+ * (this keeps the cache key implementation orthogonal to whichever
16
+ * digest algorithm the engine prefers). The key must already include
17
+ * the model slug + system prompt + dialog tail digest.
18
+ */
19
+ import { LRUCache } from 'lru-cache';
20
+ const DEFAULT_MAX_ENTRIES = 256;
21
+ const DEFAULT_TTL_MS = 5 * 60 * 1000;
22
+ export class ClientPromptCache {
23
+ store;
24
+ hits = 0;
25
+ misses = 0;
26
+ tokensSaved = 0;
27
+ constructor(options = {}) {
28
+ const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;
29
+ const ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
30
+ if (maxEntries < 1) {
31
+ throw new RangeError(`maxEntries must be >= 1, got ${maxEntries}`);
32
+ }
33
+ if (ttlMs <= 0) {
34
+ throw new RangeError(`ttlMs must be > 0, got ${ttlMs}`);
35
+ }
36
+ this.store = new LRUCache({
37
+ max: maxEntries,
38
+ ttl: ttlMs,
39
+ // updateAgeOnGet=false: a cache hit does NOT refresh the TTL —
40
+ // we want stale-after-5min semantics matching Anthropic's server
41
+ // cache, not "as long as someone keeps asking, keep it forever".
42
+ updateAgeOnGet: false,
43
+ });
44
+ }
45
+ /**
46
+ * Look up an entry. Returns null on miss or на TTL expiry.
47
+ * Increments hit/miss counters as a side effect.
48
+ */
49
+ tryGet(key) {
50
+ const entry = this.store.get(key);
51
+ if (entry === undefined) {
52
+ this.misses += 1;
53
+ return null;
54
+ }
55
+ this.hits += 1;
56
+ this.tokensSaved += entry.avoidedInputTokens + entry.outputTokens;
57
+ return entry;
58
+ }
59
+ /**
60
+ * Store a response для future hits. Overwrites prior entry at the
61
+ * same key, resetting its TTL.
62
+ */
63
+ set(key, entry) {
64
+ this.store.set(key, entry);
65
+ }
66
+ /**
67
+ * Drop a single key. No-op if absent. Returns true when removed.
68
+ */
69
+ invalidate(key) {
70
+ return this.store.delete(key);
71
+ }
72
+ /** Clear all entries и reset hit/miss/tokensSaved counters. */
73
+ clear() {
74
+ this.store.clear();
75
+ this.hits = 0;
76
+ this.misses = 0;
77
+ this.tokensSaved = 0;
78
+ }
79
+ /** Snapshot of cache stats — caller-safe read. */
80
+ stats() {
81
+ return {
82
+ hits: this.hits,
83
+ misses: this.misses,
84
+ size: this.store.size,
85
+ tokensSaved: this.tokensSaved,
86
+ };
87
+ }
88
+ /**
89
+ * Hit rate в [0, 1]. Returns 0 when no lookups have happened yet
90
+ * (instead of NaN), so callers can render without guard.
91
+ */
92
+ hitRate() {
93
+ const total = this.hits + this.misses;
94
+ if (total === 0)
95
+ return 0;
96
+ return this.hits / total;
97
+ }
98
+ }
99
+ //# sourceMappingURL=client-cache.js.map
@@ -0,0 +1,29 @@
1
+ const SECTION_SEPARATOR = '\n\n---\n\n';
2
+ export function registerModule(registry, mod) {
3
+ registry.set(mod.key, mod);
4
+ }
5
+ export function assemblePrompt(modules, context) {
6
+ const registry = new Map();
7
+ for (const mod of modules) {
8
+ registerModule(registry, mod);
9
+ }
10
+ const orderedModules = [...registry.values()].sort((a, b) => b.priority - a.priority);
11
+ const producedSections = [];
12
+ const sections = [];
13
+ const skipped = [];
14
+ for (const mod of orderedModules) {
15
+ const produced = mod.produce(context);
16
+ if (produced === null || produced.length === 0) {
17
+ skipped.push(mod.key);
18
+ continue;
19
+ }
20
+ producedSections.push(produced);
21
+ sections.push({ key: mod.key, size: produced.length });
22
+ }
23
+ return {
24
+ text: producedSections.join(SECTION_SEPARATOR),
25
+ sections,
26
+ skipped,
27
+ };
28
+ }
29
+ //# sourceMappingURL=assembly.js.map