@pugi/cli 0.1.0-beta.7 → 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 +4162 -488
  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,5 +1,5 @@
1
1
  /**
2
- * Workspace-context badges for the REPL bottom status bar (α6.14
2
+ * Workspace-context badges for the REPL bottom status bar (
3
3
  * wave 3). Mirrors the Gemini CLI pattern where the operator sees
4
4
  * `N GEMINI.md · N MCP · N skills · N% quota` at a glance.
5
5
  *
@@ -55,7 +55,7 @@ export function countMcpServers(cwd) {
55
55
  if (Array.isArray(servers))
56
56
  return servers.length;
57
57
  // Also support the `{ "<name>": { ... } }` map shape used by
58
- // the Anthropic / Claude Code mcp config convention.
58
+ // the Anthropic / the upstream tool mcp config convention.
59
59
  const entries = Object.keys(parsed);
60
60
  return entries.length;
61
61
  }
@@ -0,0 +1,10 @@
1
+ {
2
+ "servers": {
3
+ "codegraph": {
4
+ "command": "codegraph",
5
+ "args": ["serve", "--mcp"],
6
+ "env": {},
7
+ "trust": "pending"
8
+ }
9
+ }
10
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pugi/cli",
3
- "version": "0.1.0-beta.7",
3
+ "version": "0.1.0-beta.87",
4
4
  "description": "Pugi CLI - terminal-native software execution system",
5
5
  "homepage": "https://pugi.io",
6
6
  "repository": {
@@ -29,8 +29,12 @@
29
29
  "bin/run.js",
30
30
  "dist/**/*.js",
31
31
  "assets/**/*.ansi",
32
+ "docs/examples/**/*.json",
33
+ "test/scenarios/**/*.scenario.txt",
32
34
  "README.md",
33
- "LICENSE"
35
+ "CHANGELOG.md",
36
+ "LICENSE",
37
+ "THIRD_PARTY_NOTICES.md"
34
38
  ],
35
39
  "engines": {
36
40
  "node": ">=22.5.0"
@@ -42,23 +46,33 @@
42
46
  "dependencies": {
43
47
  "@mozilla/readability": "^0.6.0",
44
48
  "chokidar": "^3.6.0",
49
+ "graphology": "^0.26.0",
50
+ "graphology-metrics": "^2.4.0",
45
51
  "ignore": "^5.3.2",
46
52
  "ink": "^5.0.1",
47
53
  "linkedom": "^0.18.12",
54
+ "lru-cache": "^11.5.1",
55
+ "node-cron": "^4.2.1",
48
56
  "react": "^18.3.1",
49
- "tar": "^6.2.1",
57
+ "semver": "^7.8.1",
58
+ "tar": "^7.5.11",
59
+ "terminal-image": "^4.3.0",
50
60
  "tinyglobby": "^0.2.16",
51
61
  "turndown": "^7.2.4",
52
62
  "undici": "^8.3.0",
63
+ "which": "^6.0.0",
53
64
  "zod": "^3.23.0",
54
65
  "@pugi/personas": "0.1.2",
55
- "@pugi/sdk": "0.1.0-beta.7"
66
+ "@pugi/sdk": "0.1.0-beta.87"
56
67
  },
57
68
  "devDependencies": {
58
69
  "@types/node": "^22.0.0",
70
+ "@types/node-cron": "^3.0.11",
59
71
  "@types/react": "^18.3.3",
72
+ "@types/semver": "^7.7.1",
60
73
  "@types/tar": "^6.1.13",
61
74
  "@types/turndown": "^5.0.6",
75
+ "@types/which": "^3.0.4",
62
76
  "ink-testing-library": "^4.0.0",
63
77
  "tsx": "^4.19.0",
64
78
  "typescript": "~5.6.0"
@@ -67,9 +81,12 @@
67
81
  "build": "pnpm --filter @pugi/personas --filter @pugi/sdk build && tsc -p tsconfig.json && node scripts/make-bin-executable.mjs",
68
82
  "dev": "tsx src/index.ts",
69
83
  "typecheck": "pnpm --filter @pugi/personas --filter @pugi/sdk build && tsc -p tsconfig.json --noEmit",
70
- "test": "pnpm run build && node --test --import tsx 'test/**/*.spec.ts' 'test/**/*.spec.tsx'",
84
+ "test": "pnpm run check:version-lockstep && pnpm run build && node --test --import tsx 'test/**/*.spec.ts' 'test/**/*.spec.tsx' 'src/**/*.spec.ts' 'src/**/*.spec.tsx'",
85
+ "test:integration": "INTEGRATION=1 pnpm run build && node --test --import tsx 'test/**/*.spec.ts' 'test/**/*.spec.tsx' 'src/**/*.spec.ts' 'src/**/*.spec.tsx'",
71
86
  "version:cli": "tsx src/index.ts version",
72
87
  "doctor": "tsx src/index.ts doctor --json",
73
- "pack:smoke": "node scripts/pack-smoke.mjs"
88
+ "check:version-lockstep": "bash ../../scripts/check-version-lockstep.sh",
89
+ "pack:smoke": "pnpm run check:version-lockstep && node scripts/pack-smoke.mjs",
90
+ "release-gate": "node scripts/secret-scanner.mjs"
74
91
  }
75
92
  }
@@ -0,0 +1,13 @@
1
+ # scenario: codegen-create-file
2
+ # title: Pugi actually writes a file (not just describes it)
3
+
4
+ # Anti-regression for task #265 — Pugi must call Write, not describe what
5
+ # it would write. The headless stub responder parses
6
+ # "create FILE with content 'TEXT'" and runs the real fs write so the
7
+ # scenario validates the wiring end-to-end. When Phase 2 lands the live
8
+ # engine path the same scenario carries over verbatim.
9
+
10
+ > "create hello.txt with content 'hello world'"
11
+ EXPECT: tool-call kind=Write file=hello.txt
12
+ EXPECT: persona-turn contains "wrote hello.txt"
13
+ EXPECT_FILE: hello.txt exists with content "hello world"
@@ -0,0 +1,11 @@
1
+ # scenario: compact-force
2
+ # title: /compact --force is acknowledged
3
+
4
+ # Phase 1: the stub responder echoes the directive verbatim — Phase 2
5
+ # wires the slash command through to the live compaction loop. Until
6
+ # then this scenario protects the contract between scenario authoring
7
+ # and the harness envelope shape.
8
+
9
+ > "/compact --force"
10
+ EXPECT: persona-turn contains "/compact"
11
+ EXPECT_NOT: persona-turn contains "Pugi"
@@ -0,0 +1,11 @@
1
+ # scenario: identity
2
+ # title: Pugi self-identifies as Pugi (never as Pugi)
3
+
4
+ # CEO directive feedback_live_console_test_every_publish: every published
5
+ # beta must still answer "ты кто?" with the Pugi persona, never the legacy
6
+ # Pugi name. This is the single most-asked dialog in CEO dogfood and the
7
+ # regression that has bitten us most often.
8
+
9
+ > "ты кто?"
10
+ EXPECT: persona-turn contains "Pugi" OR "Пуджи"
11
+ EXPECT_NOT: persona-turn contains "Pugi" OR "Мира"
@@ -0,0 +1,11 @@
1
+ # scenario: persona-handoff
2
+ # title: Pugi hands off to Hiroshi when the operator asks for dev work
3
+
4
+ # Phase 1: the headless stub currently echoes input via the Pugi persona
5
+ # (real dispatch routing wires in Phase 2). The scenario is authored
6
+ # against the Phase 2 contract — for now it documents the intent and
7
+ # the harness keeps it as a soft EXPECT so the corpus stays loadable.
8
+
9
+ > "Hiroshi, please review the authentication module"
10
+ EXPECT: persona-turn contains "Pugi" OR "Hiroshi" OR "Хироси"
11
+ EXPECT_NOT: persona-turn contains "Pugi"
@@ -0,0 +1,12 @@
1
+ # scenario: walkback
2
+ # title: Esc-Esc walkback / rewind directive recognized
3
+
4
+ # CEO parity ask (): the operator must be able to walk back
5
+ # the last turn. Phase 1 ships the harness contract — the live walkback
6
+ # wiring lands in . The scenario asserts the stub responder
7
+ # acknowledges the directive verbatim so the contract holds while the
8
+ # real implementation lands behind it.
9
+
10
+ > "/rewind 1"
11
+ EXPECT: persona-turn contains "/rewind"
12
+ EXPECT_NOT: persona-turn contains "Pugi"
@@ -1,154 +0,0 @@
1
- /**
2
- * Engine loop integration point for the six-tier compaction engine.
3
- *
4
- * `maybeCompactAfterTool` is the single function the engine loop calls
5
- * after each tool result has been appended to the transcript. It:
6
- *
7
- * 1. Estimates current context-window pressure (transcript bytes
8
- * against the model's budget, plus the static blocks).
9
- * 2. Calls `selectTier` on the snapshot.
10
- * 3. Runs the tier. Microcompact / cached_microcompact are sync;
11
- * reactive_summary / session_memory / full_compaction / reset
12
- * are async-shaped (the call returns before commit when run
13
- * against a long transcript) but currently run inline — the
14
- * engine loop is single-threaded today, so true backgrounding
15
- * waits for the SSE consumer refactor in α5.7.
16
- * 4. Runs invariant checks against the result. On any violation,
17
- * emits `compaction.invariant_violated` and returns the
18
- * pre-compaction transcript untouched.
19
- * 5. On success, emits `compaction.completed` with reclaim numbers
20
- * and returns the new transcript for the caller to adopt.
21
- * 6. On no-op, emits `compaction.skipped` and returns the original.
22
- *
23
- * Why a separate file (not inlined into `native-pugi.ts`):
24
- *
25
- * Sprint α5.3 (feat/pugi-cli-hooks-lifecycle-m1-gap-c) is in flight
26
- * and already modifies session.ts + tool-bridge + permission. Editing
27
- * native-pugi.ts in this PR risks a merge conflict against α5.3's
28
- * landing PR. Keeping the wiring as an exported helper means the
29
- * one-line callsite in native-pugi.ts can be added in a tiny
30
- * follow-up after both α5.3 and α5.5 have landed.
31
- *
32
- * Expected callsite in `apps/pugi-cli/src/core/engine/native-pugi.ts`,
33
- * inside `onToolResult`:
34
- *
35
- * ```ts
36
- * const compactionOutcome = await maybeCompactAfterTool({
37
- * session,
38
- * transcript: currentTranscript,
39
- * toolOutputs: recentToolOutputs,
40
- * contextBudgetUsed: estimatedTokens,
41
- * contextBudgetMax: budget.maxTokens,
42
- * workspaceRoot: root,
43
- * contextStaticHash: {
44
- * instructionsHash,
45
- * toolSchemaHash,
46
- * },
47
- * });
48
- * if (compactionOutcome.committed) {
49
- * currentTranscript = compactionOutcome.newTranscript;
50
- * }
51
- * ```
52
- */
53
- import { runCompaction, selectTier, } from '../context/compaction.js';
54
- import { checkInvariants } from '../context/invariants.js';
55
- import { emitCompactionCompleted, emitCompactionInvariantViolated, emitCompactionSkipped, emitCompactionStarted, } from '../context/compaction-events.js';
56
- /**
57
- * Engine-loop callback. See file header for the expected callsite shape.
58
- *
59
- * Contract:
60
- * - Never throws. All errors degrade to `committed: false` with the
61
- * original transcript and an event record.
62
- * - On `committed: true`, the caller MUST adopt `newTranscript` as
63
- * the live working transcript for the next model turn.
64
- * - On `committed: false`, the caller MUST keep the input transcript
65
- * and try again on the next tool turn (compaction will retry once
66
- * pressure stays above threshold).
67
- */
68
- export async function maybeCompactAfterTool(input) {
69
- const compactionInput = {
70
- sessionId: input.session.id,
71
- contextBudgetUsed: input.contextBudgetUsed,
72
- contextBudgetMax: input.contextBudgetMax,
73
- toolOutputs: input.toolOutputs,
74
- transcript: input.transcript,
75
- workspaceRoot: input.workspaceRoot,
76
- };
77
- const tier = selectTier(compactionInput);
78
- emitCompactionStarted(input.session, tier, {
79
- budgetUsed: input.contextBudgetUsed,
80
- budgetMax: input.contextBudgetMax,
81
- });
82
- let result;
83
- try {
84
- result = await runCompaction(compactionInput, tier);
85
- }
86
- catch (error) {
87
- const reason = error instanceof Error ? error.message : String(error);
88
- emitCompactionSkipped(input.session, tier, `compaction crashed: ${reason}`);
89
- return {
90
- committed: false,
91
- tier,
92
- newTranscript: input.transcript,
93
- bytesReclaimed: 0,
94
- newContextSize: byteSize(input.transcript),
95
- violations: [],
96
- skipped: true,
97
- skipReason: `crashed: ${reason}`,
98
- };
99
- }
100
- if (result.skipped) {
101
- emitCompactionSkipped(input.session, tier, result.skipReason || 'no work');
102
- return {
103
- committed: false,
104
- tier,
105
- newTranscript: input.transcript,
106
- bytesReclaimed: 0,
107
- newContextSize: byteSize(input.transcript),
108
- violations: [],
109
- skipped: true,
110
- skipReason: result.skipReason,
111
- };
112
- }
113
- // Invariant gate: static-hash-unchanged is enforced by passing the
114
- // same hashes in for `before` and `after` — compaction never touches
115
- // static blocks, so the hashes are equal by construction. We pass
116
- // both so the contract is explicit; if a future tier introduces a
117
- // bug that overwrites static state, the check still catches it.
118
- const violations = checkInvariants({
119
- before: compactionInput,
120
- after: result,
121
- summaryText: result.summaryText,
122
- staticHashBefore: input.contextStaticHash,
123
- staticHashAfter: input.contextStaticHash,
124
- });
125
- if (violations.length > 0) {
126
- for (const v of violations)
127
- emitCompactionInvariantViolated(input.session, v);
128
- return {
129
- committed: false,
130
- tier,
131
- newTranscript: input.transcript,
132
- bytesReclaimed: 0,
133
- newContextSize: byteSize(input.transcript),
134
- violations,
135
- skipped: false,
136
- skipReason: '',
137
- };
138
- }
139
- emitCompactionCompleted(input.session, tier, result.bytesReclaimed, result.newContextSize, result.artifactsCreated);
140
- return {
141
- committed: true,
142
- tier,
143
- newTranscript: result.newTranscript,
144
- bytesReclaimed: result.bytesReclaimed,
145
- newContextSize: result.newContextSize,
146
- violations: [],
147
- skipped: false,
148
- skipReason: '',
149
- };
150
- }
151
- function byteSize(transcript) {
152
- return transcript.reduce((sum, t) => sum + Buffer.byteLength(t.content, 'utf8'), 0);
153
- }
154
- //# sourceMappingURL=compaction-hook.js.map