@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,96 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@pugi/cli` are documented here. The file follows the
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) convention with newer
5
+ releases listed first. Section format: `## [<version>] - <YYYY-MM-DD>`.
6
+
7
+ The bundled `pugi release-notes` command parses this file and renders sections
8
+ strictly newer than `~/.pugi/.last-seen-version` after every upgrade.
9
+
10
+ ## [0.1.0-beta.26] - 2026-05-27
11
+
12
+ ### Added
13
+ - RAG consumer middleware on admin-api () — XML `<rag-context>`
14
+ block, persona allowlist (Pugi / Hiroshi / Vera), 2000-token cap,
15
+ and the Pugi observability stack () shipped earlier today.
16
+
17
+ ### Notes
18
+ - CLI surface unchanged in this bump — the version bump tracks lockstep with
19
+ the admin-api redeploy so `--version` reflects the live server's
20
+ feature set during the alpha-7 sprint.
21
+
22
+ ## [0.1.0-beta.23] - 2026-05-27
23
+
24
+ ### Added
25
+ - L30 `pugi theme` + `/theme` — TUI color presets (default / dark / light / colorblind) ().
26
+ - L24 `pugi release-notes` + `/release-notes` — changelog diff after upgrade
27
+ with `~/.pugi/.last-seen-version` tracking and `--reset` flag ().
28
+
29
+ ### Fixed
30
+ - vim-input — useRef for shadow cursor + pending, lift `onSubmit` out of `setState` ().
31
+
32
+ ## [0.1.0-beta.22] - 2026-05-27
33
+
34
+ ### Added
35
+ - L24 `pugi release-notes` + `/release-notes` — changelog diff after upgrade
36
+ with `~/.pugi/.last-seen-version` tracking and `--reset` flag.
37
+ - L25 `/onboarding` first-run interactive setup wizard ().
38
+ - L18 output-style presets — voice register dial ().
39
+ - L33 `/stickers` brand-personality gimmick ().
40
+ - L16 `TodoWriteTool` single-in-progress invariant ().
41
+ - L22 `--bare` flag — skip project auto-discovery ().
42
+ - L21 `/feedback` in-CLI collector.
43
+ - L20 `/share` session transcript export.
44
+
45
+ ### Fixed
46
+ - P1 stickers await + style buffered output + todo-write zod parse ().
47
+
48
+ ## [0.1.0-beta.21] - 2026-05-27
49
+
50
+ ### Added
51
+ - L7 `/plan` quick mode-switch + one-shot dispatch ().
52
+ - L31 tool retry budget per command ().
53
+ - L19 `/cost` + `/usage` token + dollar accounting ().
54
+ - L34 `pugi status` — session snapshot ().
55
+ - L11 `DenialTrackingState` model-facing denial aggregate ().
56
+ - L6 permission modes — canonical 4-mode gate ().
57
+ - L8 `/compact` command + auto-trigger + boundary marker ().
58
+ - L17 `pugi doctor` — environment health report ().
59
+ - L13 `/mcp remove` + `doctor` + `logs` + `restart` subcommands ().
60
+ - L3 internal underscore-prefix tool-arg convention ().
61
+ - L2 `z.strictObject` all tool schemas + revert beta.17 aliases ().
62
+ - L5 `AskUserQuestionTool` structured multi-choice — kills fake-dispatch ().
63
+ - L1 stale-read gate — reject `FileEdit` if file changed since last read ().
64
+
65
+ ### Fixed
66
+ - Pugi-review per-file chunking — unblock multi-file diffs (Anvil HTTP 400) ().
67
+ - Privacy `PiiScrubberService` regex fallback + `@Inject` DI fix ().
68
+
69
+ ## [0.1.0-beta.20] - 2026-05-26
70
+
71
+ ### Added
72
+ - Pugi codegen real dispatch — Pugi actually writes files instead of describing
73
+ them ().
74
+ - Live agent progress display — `pugi jobs --watch` (CC compact style) ().
75
+ - PAVF-7 `pugi report --from-error` — field bug capture ().
76
+ - Opensource template fetch + bundled starters — не reinventing ().
77
+
78
+ ### Fixed
79
+ - Dialog quality — RU mirror + brevity + memory + force dispatch + render ().
80
+ - Pugi anti-greenfield + anti-emoji discipline rules ().
81
+ - Persona output gate — Pugi strip + fake-dispatch detector (P0) ().
82
+
83
+ ## [0.1.0-beta.19] - 2026-05-26
84
+
85
+ ### Added
86
+ - Pugi-review batch review followups — silent PASS + safeGit split + quota
87
+ migration + cleanup dead code ().
88
+
89
+ ### Fixed
90
+ - Replace CJS `require()` в ESM bundle — bare REPL crash on beta.16 ().
91
+
92
+ ## [0.1.0-beta.18] - 2026-05-26
93
+
94
+ ### Added
95
+ - Initial public beta of `@pugi/cli` with REPL, dispatch, sync, review, and
96
+ doctor surfaces. Establishes the baseline for the leak-parity sprint.
@@ -0,0 +1,40 @@
1
+ # Third-Party Notices
2
+
3
+ `@pugi/cli` bundles default skill content from third parties on `pugi init`.
4
+ Each entry below carries the full upstream MIT license text required for
5
+ redistribution.
6
+
7
+ ## mattpocock/skills
8
+
9
+ Pugi bundles the following skill bodies (ported, attribution preserved in
10
+ each `SKILL.md` header) from https://github.com/mattpocock/skills:
11
+
12
+ - `zoom-out` — `skills/engineering/zoom-out/SKILL.md`
13
+ - `diagnose` — `skills/engineering/diagnose/SKILL.md`
14
+ - `grill-me` — `skills/productivity/grill-me/SKILL.md`
15
+
16
+ Upstream license follows verbatim.
17
+
18
+ ---
19
+
20
+ MIT License
21
+
22
+ Copyright (c) 2026 Matt Pocock
23
+
24
+ Permission is hereby granted, free of charge, to any person obtaining a copy
25
+ of this software and associated documentation files (the "Software"), to deal
26
+ in the Software without restriction, including without limitation the rights
27
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
28
+ copies of the Software, and to permit persons to whom the Software is
29
+ furnished to do so, subject to the following conditions:
30
+
31
+ The above copyright notice and this permission notice shall be included in all
32
+ copies or substantial portions of the Software.
33
+
34
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
35
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
36
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
37
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
38
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
39
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
40
+ SOFTWARE.
@@ -0,0 +1,9 @@
1
+ [?25l 
2
+ 
3
+ ▄▄▄▄▄▄▄▄ 
4
+ ▄▄▄▄▄▄ 
5
+ ▄▄▄▄▄▄ 
6
+ ▄▄ 
7
+ ▄ 
8
+ 
9
+ [?25h
package/bin/run.js CHANGED
@@ -1,2 +1,34 @@
1
1
  #!/usr/bin/env node
2
- import '../dist/index.js';
2
+ // 2026-05-27 — silence the noisy `node:sqlite` ExperimentalWarning.
3
+ // Node 22.x prints a multi-line warning the first time any consumer
4
+ // imports `node:sqlite` (see core/repl/store/session-store.ts). CEO has
5
+ // pinged this surface twice now ("(node:XXXXX) ExperimentalWarning:
6
+ // SQLite is an experimental feature and might change at any time" +
7
+ // trace-warnings hint). Hiding it cleanly requires a tap on
8
+ // process.emitWarning BEFORE any module loads the sqlite binding —
9
+ // hence wiring it here in the binary entry, not deep inside the CLI.
10
+ //
11
+ // We allowlist only the exact sqlite warning + leave every other
12
+ // runtime warning (deprecation, security, custom code paths) intact.
13
+ // Operator can still re-enable the noise by exporting
14
+ // PUGI_SHOW_EXPERIMENTAL_WARNINGS=1 — useful when debugging a node
15
+ // version bump that might surface a new experimental flag we should
16
+ // notice.
17
+ if (!process.env.PUGI_SHOW_EXPERIMENTAL_WARNINGS) {
18
+ const originalEmit = process.emit;
19
+ process.emit = function patchedEmit(name, ...args) {
20
+ if (name === 'warning') {
21
+ const w = args[0];
22
+ const isSqliteExperimental =
23
+ w &&
24
+ typeof w === 'object' &&
25
+ w.name === 'ExperimentalWarning' &&
26
+ typeof w.message === 'string' &&
27
+ /SQLite is an experimental feature/i.test(w.message);
28
+ if (isSqliteExperimental) return false;
29
+ }
30
+ return originalEmit.call(this, name, ...args);
31
+ };
32
+ }
33
+
34
+ import('../dist/index.js');
@@ -1,27 +1,27 @@
1
1
  /**
2
- * `pugi deploy` command surface — Wave 3 P2 (Task #34, 2026-05-25).
2
+ * `pugi deploy` command surface — P2 (Task #34).
3
3
  *
4
4
  * Subcommands:
5
- * pugi deploy --target vercel <vercelProject> [--project <id>] [--ref <ref>] [--target-env production|preview] [--integration <id>]
6
- * pugi deploy --target render <renderService> [--project <id>] [--ref <ref>]
7
- * pugi deploy --status <deployment-id>
8
- * pugi deploy --logs <deployment-id> [--tail]
5
+ * pugi deploy --target vercel <vercelProject> [--project <id>] [--ref <ref>] [--target-env production|preview] [--integration <id>]
6
+ * pugi deploy --target render <renderService> [--project <id>] [--ref <ref>]
7
+ * pugi deploy --status <deployment-id>
8
+ * pugi deploy --logs <deployment-id> [--tail]
9
9
  *
10
10
  * Exit codes (per task spec):
11
- * 0 success (trigger queued, status terminal=ready, logs printed)
12
- * 1 deployment failed (status=error or trigger refused)
13
- * 2 transient (rate-limited, runtime down, retry-safe)
11
+ * 0 success (trigger queued, status terminal=ready, logs printed)
12
+ * 1 deployment failed (status=error or trigger refused)
13
+ * 2 transient (rate-limited, runtime down, retry-safe)
14
14
  *
15
15
  * Project resolution:
16
- * `--project <id>` is required for trigger commands because the CLI's
17
- * credential store is tenant-scoped but not project-scoped. A future
18
- * sprint (Wave 4) auto-detects the project from `.pugi/settings.json`
19
- * bound to the workspace; until then the operator passes it explicitly.
16
+ * `--project <id>` is required for trigger commands because the CLI's
17
+ * credential store is tenant-scoped but not project-scoped. A future
18
+ * sprint auto-detects the project from `.pugi/settings.json`
19
+ * bound to the workspace; until then the operator passes it explicitly.
20
20
  *
21
- * Local-first invariant (ADR-0037):
22
- * `pugi deploy` does NOT read repository files. The Vercel deploy
23
- * resolves source from the existing ProjectGitBinding row on the
24
- * admin-api side — the CLI is only a request initiator + status poller.
21
+ * Local-first invariant :
22
+ * `pugi deploy` does NOT read repository files. The Vercel deploy
23
+ * resolves source from the existing ProjectGitBinding row on the
24
+ * admin-api side — the CLI is only a request initiator + status poller.
25
25
  */
26
26
  import { fetchDeployStatus, fetchDeployLogs, submitDeployTrigger, } from '@pugi/sdk';
27
27
  /**
@@ -143,26 +143,26 @@ export function parseDeployArgs(args) {
143
143
  export function usage() {
144
144
  return [
145
145
  'Usage:',
146
- ' pugi deploy --target vercel <vercelProject> --project <id> [--target-env production|preview] [--ref <git-ref>] [--integration <id>]',
147
- ' pugi deploy --target render <renderService> --project <id> [--ref <git-ref>]',
148
- ' pugi deploy --status <deployment-id>',
149
- ' pugi deploy --logs <deployment-id> [--tail]',
146
+ ' pugi deploy --target vercel <vercelProject> --project <id> [--target-env production|preview] [--ref <git-ref>] [--integration <id>]',
147
+ ' pugi deploy --target render <renderService> --project <id> [--ref <git-ref>]',
148
+ ' pugi deploy --status <deployment-id>',
149
+ ' pugi deploy --logs <deployment-id> [--tail]',
150
150
  '',
151
151
  'Flags:',
152
- ' --target vercel|render Provider to deploy to.',
153
- ' --project <id> Pugi project id (required for trigger).',
154
- ' --ref <git-ref> Optional Git ref. Defaults to the binding default branch.',
155
- ' --target-env production|preview',
156
- ' Vercel deploy environment. Defaults to production.',
157
- ' --integration <id> Disambiguate when multiple integrations are active.',
158
- ' --status <id> Show the current status for a deployment.',
159
- ' --logs <id> [--tail] Fetch log tail. With --tail, polls until terminal.',
160
- ' --json Emit machine-readable JSON envelopes.',
152
+ ' --target vercel|render Provider to deploy to.',
153
+ ' --project <id> Pugi project id (required for trigger).',
154
+ ' --ref <git-ref> Optional Git ref. Defaults to the binding default branch.',
155
+ ' --target-env production|preview',
156
+ ' Vercel deploy environment. Defaults to production.',
157
+ ' --integration <id> Disambiguate when multiple integrations are active.',
158
+ ' --status <id> Show the current status for a deployment.',
159
+ ' --logs <id> [--tail] Fetch log tail. With --tail, polls until terminal.',
160
+ ' --json Emit machine-readable JSON envelopes.',
161
161
  '',
162
162
  'Exit codes:',
163
- ' 0 success',
164
- ' 1 deployment failed / refused',
165
- ' 2 transient (rate-limited, runtime down, retry-safe)',
163
+ ' 0 success',
164
+ ' 1 deployment failed / refused',
165
+ ' 2 transient (rate-limited, runtime down, retry-safe)',
166
166
  ].join('\n');
167
167
  }
168
168
  /**
@@ -418,16 +418,16 @@ function statusToExitCode(status) {
418
418
  function renderStatusTable(response, context) {
419
419
  const lines = [];
420
420
  lines.push(context === 'queued' ? 'Deployment queued.' : 'Deployment status:');
421
- lines.push(` id: ${response.id}`);
422
- lines.push(` provider: ${response.provider}`);
423
- lines.push(` project: ${response.projectId}`);
424
- lines.push(` status: ${response.status}`);
421
+ lines.push(` id: ${response.id}`);
422
+ lines.push(` provider: ${response.provider}`);
423
+ lines.push(` project: ${response.projectId}`);
424
+ lines.push(` status: ${response.status}`);
425
425
  if (response.url)
426
- lines.push(` url: ${response.url}`);
426
+ lines.push(` url: ${response.url}`);
427
427
  if (response.providerDeploymentId)
428
- lines.push(` providerDeploymentId: ${response.providerDeploymentId}`);
429
- lines.push(` createdAt: ${response.createdAt}`);
430
- lines.push(` updatedAt: ${response.updatedAt}`);
428
+ lines.push(` providerDeploymentId: ${response.providerDeploymentId}`);
429
+ lines.push(` createdAt: ${response.createdAt}`);
430
+ lines.push(` updatedAt: ${response.updatedAt}`);
431
431
  if (response.error) {
432
432
  lines.push('');
433
433
  lines.push('--- build error tail ---');
@@ -0,0 +1,191 @@
1
+ /**
2
+ * `pugi flatten` — CLI surface for the rendergit-port flatten engine.
3
+ *
4
+ * The runner lives here (not in `runtime/cli.ts`) so the dispatch
5
+ * surface stays focused on argv routing. This module owns:
6
+ *
7
+ * - Parsing the command-local flags (`--mode`, `--max-file-size`,
8
+ * `--include`, `--exclude`, `--stdout`, `--open`, `--out`).
9
+ * - Routing to `flattenRepo` with a resolved option bag.
10
+ * - Forwarding the rendered text + summary through the unified
11
+ * `writeOutput` writer so `--json` mode works without a second
12
+ * code path.
13
+ *
14
+ * Ported from karpathy/rendergit (BSD-0). License compatible with
15
+ * Pugi's open-source posture.
16
+ */
17
+ import { resolve } from 'node:path';
18
+ import { DEFAULT_MAX_FILE_SIZE, flattenRepo, } from '../core/flatten/flatten-repo.js';
19
+ /**
20
+ * Entry point invoked by `runtime/cli.ts::dispatchFlatten`. Returns
21
+ * the desired process exit code so the dispatcher can set
22
+ * `process.exitCode` without a second round-trip.
23
+ */
24
+ export async function runFlattenCommand(ctx) {
25
+ const parsed = parseArgs(ctx.args);
26
+ if ('error' in parsed) {
27
+ ctx.writeOutput({ ok: false, error: parsed.error }, `pugi flatten: ${parsed.error}`);
28
+ return 2;
29
+ }
30
+ const options = {
31
+ cwd: parsed.cwd,
32
+ mode: parsed.mode,
33
+ stdout: parsed.stdout,
34
+ maxFileSize: parsed.maxFileSize,
35
+ include: parsed.include,
36
+ exclude: parsed.exclude,
37
+ open: parsed.open,
38
+ };
39
+ try {
40
+ const result = await flattenRepo(options);
41
+ if (parsed.stdout) {
42
+ // Always emit the rendered text to stdout. JSON mode wraps it
43
+ // in an envelope so scripted callers can demux the result from
44
+ // the summary line.
45
+ if (ctx.json) {
46
+ ctx.writeOutput({
47
+ ok: true,
48
+ mode: parsed.mode,
49
+ files: result.files.length,
50
+ skipped: result.skipped.length,
51
+ html: result.html,
52
+ }, result.html);
53
+ }
54
+ else {
55
+ process.stdout.write(result.html);
56
+ }
57
+ return 0;
58
+ }
59
+ const summary = `pugi flatten: wrote ${result.files.length} files (${result.skipped.length} skipped) to ${result.path ?? '<unknown>'}`;
60
+ ctx.writeOutput({
61
+ ok: true,
62
+ mode: parsed.mode,
63
+ path: result.path,
64
+ files: result.files.length,
65
+ skipped: result.skipped.length,
66
+ }, summary);
67
+ return 0;
68
+ }
69
+ catch (err) {
70
+ const msg = err instanceof Error ? err.message : String(err);
71
+ ctx.writeOutput({ ok: false, error: msg }, `pugi flatten: ${msg}`);
72
+ return 1;
73
+ }
74
+ }
75
+ function parseArgs(args) {
76
+ let cwd = process.cwd();
77
+ let mode = 'human';
78
+ let stdout = false;
79
+ let open = false;
80
+ let maxFileSize = DEFAULT_MAX_FILE_SIZE;
81
+ const include = [];
82
+ const exclude = [];
83
+ let positionalConsumed = false;
84
+ for (let i = 0; i < args.length; i += 1) {
85
+ const arg = args[i] ?? '';
86
+ if (arg === '--stdout') {
87
+ stdout = true;
88
+ continue;
89
+ }
90
+ if (arg === '--open') {
91
+ open = true;
92
+ continue;
93
+ }
94
+ if (arg === '--mode') {
95
+ const next = args[i + 1];
96
+ if (!next)
97
+ return { error: '--mode requires a value (human | llm)' };
98
+ const m = parseMode(next);
99
+ if (!m)
100
+ return { error: `--mode: unknown value "${next}" (expected human | llm)` };
101
+ mode = m;
102
+ i += 1;
103
+ continue;
104
+ }
105
+ if (arg.startsWith('--mode=')) {
106
+ const m = parseMode(arg.slice('--mode='.length));
107
+ if (!m)
108
+ return { error: `--mode: unknown value "${arg.slice('--mode='.length)}" (expected human | llm)` };
109
+ mode = m;
110
+ continue;
111
+ }
112
+ if (arg === '--max-file-size') {
113
+ const next = args[i + 1];
114
+ if (!next)
115
+ return { error: '--max-file-size requires a value (e.g. 200kb)' };
116
+ const n = parseSize(next);
117
+ if (n === undefined)
118
+ return { error: `--max-file-size: cannot parse "${next}"` };
119
+ maxFileSize = n;
120
+ i += 1;
121
+ continue;
122
+ }
123
+ if (arg.startsWith('--max-file-size=')) {
124
+ const v = arg.slice('--max-file-size='.length);
125
+ const n = parseSize(v);
126
+ if (n === undefined)
127
+ return { error: `--max-file-size: cannot parse "${v}"` };
128
+ maxFileSize = n;
129
+ continue;
130
+ }
131
+ if (arg === '--include') {
132
+ const next = args[i + 1];
133
+ if (!next)
134
+ return { error: '--include requires a pattern' };
135
+ include.push(next);
136
+ i += 1;
137
+ continue;
138
+ }
139
+ if (arg.startsWith('--include=')) {
140
+ include.push(arg.slice('--include='.length));
141
+ continue;
142
+ }
143
+ if (arg === '--exclude') {
144
+ const next = args[i + 1];
145
+ if (!next)
146
+ return { error: '--exclude requires a pattern' };
147
+ exclude.push(next);
148
+ i += 1;
149
+ continue;
150
+ }
151
+ if (arg.startsWith('--exclude=')) {
152
+ exclude.push(arg.slice('--exclude='.length));
153
+ continue;
154
+ }
155
+ if (arg.startsWith('--')) {
156
+ return { error: `unknown flag "${arg}"` };
157
+ }
158
+ // Positional: workspace path. Only the first non-flag wins; extras
159
+ // are an error so a typo (`pugi flatten . foo`) surfaces.
160
+ if (positionalConsumed) {
161
+ return { error: `unexpected positional argument "${arg}"` };
162
+ }
163
+ cwd = resolve(arg);
164
+ positionalConsumed = true;
165
+ }
166
+ return { cwd, mode, stdout, open, maxFileSize, include, exclude };
167
+ }
168
+ function parseMode(v) {
169
+ if (v === 'human' || v === 'llm')
170
+ return v;
171
+ return undefined;
172
+ }
173
+ /**
174
+ * Parse a size literal: bare number = bytes; `200kb` / `1mb` / `2gb`
175
+ * (case-insensitive, binary units — 1KB = 1024 bytes).
176
+ */
177
+ export function parseSize(raw) {
178
+ const trimmed = raw.trim().toLowerCase();
179
+ if (trimmed.length === 0)
180
+ return undefined;
181
+ const match = /^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/.exec(trimmed);
182
+ if (!match)
183
+ return undefined;
184
+ const n = Number(match[1]);
185
+ if (!Number.isFinite(n) || n < 0)
186
+ return undefined;
187
+ const unit = match[2] ?? 'b';
188
+ const multiplier = unit === 'b' ? 1 : unit === 'kb' ? 1024 : unit === 'mb' ? 1024 * 1024 : 1024 * 1024 * 1024;
189
+ return Math.floor(n * multiplier);
190
+ }
191
+ //# sourceMappingURL=flatten.js.map