@pugi/cli 0.1.0-beta.10 → 0.1.0-beta.101

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 (464) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/LICENSE +1 -1
  3. package/README.md +55 -11
  4. package/assets/pugi-prozr2-mascot.ansi +9 -0
  5. package/bin/run.js +33 -1
  6. package/dist/commands/deploy.js +40 -40
  7. package/dist/commands/flatten.js +191 -0
  8. package/dist/commands/jobs-watch.js +201 -0
  9. package/dist/commands/jobs.js +42 -27
  10. package/dist/commands/retro.js +210 -0
  11. package/dist/commands/smoke.js +133 -0
  12. package/dist/core/agent-progress/cleanup.js +134 -0
  13. package/dist/core/agent-progress/schema.js +144 -0
  14. package/dist/core/agent-progress/writer.js +101 -0
  15. package/dist/core/agents/adaptive-router.js +330 -0
  16. package/dist/core/agents/query-decomposer.js +297 -0
  17. package/dist/core/agents/registry.js +3 -3
  18. package/dist/core/approvals/shortcut-resolver.js +98 -0
  19. package/dist/core/artifact-chain/dispatcher.js +148 -0
  20. package/dist/core/artifact-chain/exporter.js +164 -0
  21. package/dist/core/artifact-chain/state.js +243 -0
  22. package/dist/core/artifact-chain/steps.js +169 -0
  23. package/dist/core/ask-user/question.js +92 -0
  24. package/dist/core/audit/audit-trail.js +275 -0
  25. package/dist/core/auth/ensure-authenticated.js +129 -0
  26. package/dist/core/auth/env-provider.js +238 -0
  27. package/dist/core/auto-open-browser.js +4 -4
  28. package/dist/core/auto-update/channels.js +122 -0
  29. package/dist/core/auto-update/checker.js +241 -0
  30. package/dist/core/auto-update/state.js +235 -0
  31. package/dist/core/bare-mode/index.js +107 -0
  32. package/dist/core/bash/redirect.js +281 -0
  33. package/dist/core/bash-classifier.js +436 -40
  34. package/dist/core/checkpoint/resumer.js +149 -0
  35. package/dist/core/checkpoint/rewinder.js +291 -0
  36. package/dist/core/checkpoints/shadow-git.js +670 -0
  37. package/dist/core/citations/parser.js +109 -0
  38. package/dist/core/classifier/yolo-classifier.js +88 -0
  39. package/dist/core/codegraph/db.js +506 -0
  40. package/dist/core/codegraph/decision-store.js +248 -0
  41. package/dist/core/codegraph/detect-repo.js +459 -0
  42. package/dist/core/codegraph/install.js +134 -0
  43. package/dist/core/codegraph/offer-hook.js +220 -0
  44. package/dist/core/codegraph/parser.js +598 -0
  45. package/dist/core/codegraph/queries/go.scm +57 -0
  46. package/dist/core/codegraph/queries/javascript.scm +56 -0
  47. package/dist/core/codegraph/queries/python.scm +55 -0
  48. package/dist/core/codegraph/queries/rust.scm +63 -0
  49. package/dist/core/codegraph/queries/typescript.scm +91 -0
  50. package/dist/core/codegraph/reindex.js +218 -0
  51. package/dist/core/codegraph/resolve-edges.js +107 -0
  52. package/dist/core/codegraph/types.js +34 -0
  53. package/dist/core/codegraph/watcher.js +440 -0
  54. package/dist/core/compact/auto-trigger.js +96 -0
  55. package/dist/core/compact/buffer-rewriter.js +115 -0
  56. package/dist/core/compact/summarizer.js +208 -0
  57. package/dist/core/compact/token-counter.js +108 -0
  58. package/dist/core/consensus/anvil-fanout.js +25 -25
  59. package/dist/core/consensus/diff-capture.js +121 -12
  60. package/dist/core/consensus/rubric.js +21 -21
  61. package/dist/core/context/builder.js +6 -6
  62. package/dist/core/context/compaction-events.js +8 -8
  63. package/dist/core/context/compaction.js +31 -31
  64. package/dist/core/context/index.js +15 -8
  65. package/dist/core/context/invariants.js +51 -51
  66. package/dist/core/context/markdown-loader.js +28 -10
  67. package/dist/core/context/markdown-traverse.js +255 -0
  68. package/dist/core/context/pugiignore.js +41 -41
  69. package/dist/core/context/repo-skeleton.js +37 -37
  70. package/dist/core/context/tool-eviction.js +55 -0
  71. package/dist/core/context/watcher.js +32 -32
  72. package/dist/core/context/working-set.js +23 -23
  73. package/dist/core/coordinator/agent-tools.js +77 -0
  74. package/dist/core/coordinator/agent-toolset.js +65 -0
  75. package/dist/core/coordinator/fsm.js +73 -0
  76. package/dist/core/coordinator/mode-fsm.js +70 -0
  77. package/dist/core/cost/rate-card.js +129 -0
  78. package/dist/core/cost/tracker.js +221 -0
  79. package/dist/core/credentials.js +13 -13
  80. package/dist/core/cron/scheduler.js +138 -0
  81. package/dist/core/denial-tracking/index.js +8 -0
  82. package/dist/core/denial-tracking/state.js +264 -0
  83. package/dist/core/diagnostics/probe-runner.js +93 -0
  84. package/dist/core/diagnostics/probes/api.js +46 -0
  85. package/dist/core/diagnostics/probes/auth.js +93 -0
  86. package/dist/core/diagnostics/probes/bare-mode.js +42 -0
  87. package/dist/core/diagnostics/probes/cli-version.js +127 -0
  88. package/dist/core/diagnostics/probes/config.js +72 -0
  89. package/dist/core/diagnostics/probes/denial-tracking.js +57 -0
  90. package/dist/core/diagnostics/probes/disk.js +81 -0
  91. package/dist/core/diagnostics/probes/engine-live.js +46 -0
  92. package/dist/core/diagnostics/probes/git.js +65 -0
  93. package/dist/core/diagnostics/probes/hooks.js +118 -0
  94. package/dist/core/diagnostics/probes/mcp.js +75 -0
  95. package/dist/core/diagnostics/probes/node.js +59 -0
  96. package/dist/core/diagnostics/probes/pnpm.js +36 -0
  97. package/dist/core/diagnostics/probes/pugi-md.js +89 -0
  98. package/dist/core/diagnostics/probes/sandbox.js +67 -0
  99. package/dist/core/diagnostics/probes/session.js +74 -0
  100. package/dist/core/diagnostics/probes/status-snapshot.js +488 -0
  101. package/dist/core/diagnostics/probes/workspace.js +63 -0
  102. package/dist/core/diagnostics/types.js +70 -0
  103. package/dist/core/dispatch/cache-cleanup.js +197 -0
  104. package/dist/core/dispatch/cache-handoff.js +295 -0
  105. package/dist/core/edits/apply-patch-layer-e.js +189 -0
  106. package/dist/core/edits/dispatch.js +333 -7
  107. package/dist/core/edits/format-detector.js +260 -0
  108. package/dist/core/edits/format-matrix.js +26 -0
  109. package/dist/core/edits/fuzzy-ladder.js +650 -0
  110. package/dist/core/edits/index.js +5 -1
  111. package/dist/core/edits/journal.js +199 -0
  112. package/dist/core/edits/layer-a-apply.js +15 -15
  113. package/dist/core/edits/layer-a-fuzzy-apply.js +198 -0
  114. package/dist/core/edits/layer-b-apply.js +9 -9
  115. package/dist/core/edits/layer-c-apply.js +6 -6
  116. package/dist/core/edits/layer-d-ast.js +557 -14
  117. package/dist/core/edits/marker-parser.js +12 -12
  118. package/dist/core/edits/security-gate.js +27 -27
  119. package/dist/core/edits/verify-hook.js +273 -0
  120. package/dist/core/edits/worktree.js +29 -29
  121. package/dist/core/engine/anvil-client.js +214 -26
  122. package/dist/core/engine/auto-compact.js +247 -0
  123. package/dist/core/engine/budgets.js +220 -0
  124. package/dist/core/engine/compact-llm-summarizer.js +124 -0
  125. package/dist/core/engine/context-prefix.js +155 -0
  126. package/dist/core/engine/index.js +1 -1
  127. package/dist/core/engine/intensity.js +163 -0
  128. package/dist/core/engine/intent.js +260 -0
  129. package/dist/core/engine/native-pugi.js +1559 -227
  130. package/dist/core/engine/prompts.js +219 -19
  131. package/dist/core/engine/strip-internal-fields.js +124 -0
  132. package/dist/core/engine/tool-bridge.js +1887 -59
  133. package/dist/core/engine/verification-patterns.js +195 -0
  134. package/dist/core/eval/v1/ledger.js +83 -0
  135. package/dist/core/eval/v1/runner.js +280 -0
  136. package/dist/core/eval/v1/scoring.js +68 -0
  137. package/dist/core/eval/v1/task-loader.js +191 -0
  138. package/dist/core/eval/v1/types.js +14 -0
  139. package/dist/core/eval/v1/verifier.js +176 -0
  140. package/dist/core/eval/v1/yaml-parser.js +250 -0
  141. package/dist/core/evaluation/golden-dataset.js +293 -0
  142. package/dist/core/feedback/queue.js +177 -0
  143. package/dist/core/feedback/submitter.js +145 -0
  144. package/dist/core/file-cache.js +113 -1
  145. package/dist/core/flatten/flatten-repo.js +439 -0
  146. package/dist/core/format/osc8-link.js +28 -0
  147. package/dist/core/hook-chains.js +392 -0
  148. package/dist/core/hooks/citation-verify-hook.js +138 -0
  149. package/dist/core/hooks/citation-verify.js +112 -0
  150. package/dist/core/hooks/events.js +46 -0
  151. package/dist/core/hooks/index.js +15 -0
  152. package/dist/core/hooks/registry.js +216 -0
  153. package/dist/core/hooks/runner.js +236 -0
  154. package/dist/core/hooks/v2/event-emitter.js +115 -0
  155. package/dist/core/hooks/v2/executor.js +282 -0
  156. package/dist/core/hooks/v2/index.js +25 -0
  157. package/dist/core/hooks/v2/lifecycle.js +104 -0
  158. package/dist/core/hooks/v2/loader.js +216 -0
  159. package/dist/core/hooks/v2/matcher.js +125 -0
  160. package/dist/core/hooks/v2/trust.js +143 -0
  161. package/dist/core/hooks/v2/types.js +86 -0
  162. package/dist/core/hooks/worktree-events.js +158 -0
  163. package/dist/core/image/renderer.js +71 -0
  164. package/dist/core/init/detector.js +582 -0
  165. package/dist/core/init/template-renderer.js +242 -0
  166. package/dist/core/jobs/registry.js +18 -18
  167. package/dist/core/ledger/results-tsv.js +142 -0
  168. package/dist/core/log-discipline/stdout-redirect.js +51 -0
  169. package/dist/core/lsp/cache.js +105 -0
  170. package/dist/core/lsp/client.js +551 -41
  171. package/dist/core/lsp/language-detect.js +66 -0
  172. package/dist/core/lsp/post-edit-diagnostics.js +171 -0
  173. package/dist/core/lsp/server-detect.js +173 -0
  174. package/dist/core/lsp/symbol-cache.js +162 -0
  175. package/dist/core/lsp/symbol-tools.js +664 -0
  176. package/dist/core/mcp/client.js +97 -28
  177. package/dist/core/mcp/http-server.js +553 -0
  178. package/dist/core/mcp/orchestrator-config.js +192 -0
  179. package/dist/core/mcp/orchestrator-tools.js +806 -0
  180. package/dist/core/mcp/permission.js +190 -0
  181. package/dist/core/mcp/registry.js +39 -17
  182. package/dist/core/mcp/server-tools.js +219 -0
  183. package/dist/core/mcp/server.js +397 -0
  184. package/dist/core/mcp/trust.js +10 -10
  185. package/dist/core/memory/dual-write.js +416 -0
  186. package/dist/core/memory/passive-extract.js +130 -0
  187. package/dist/core/memory/phase1-kinds.js +20 -0
  188. package/dist/core/memory/secret-scanner.js +304 -0
  189. package/dist/core/memory-sync/queue.js +170 -0
  190. package/dist/core/metrics/extract.js +113 -0
  191. package/dist/core/modes/roo-modes.js +68 -0
  192. package/dist/core/notes/notes-paths.js +113 -0
  193. package/dist/core/notes/notes-recorder.js +140 -0
  194. package/dist/core/notes/notes-writer.js +53 -0
  195. package/dist/core/notes/renderers.js +0 -0
  196. package/dist/core/notes/slug.js +105 -0
  197. package/dist/core/onboarding/ensure-initialized.js +133 -0
  198. package/dist/core/onboarding/marker.js +111 -0
  199. package/dist/core/onboarding/telemetry-state.js +108 -0
  200. package/dist/core/output-style/presets.js +176 -0
  201. package/dist/core/output-style/state.js +185 -0
  202. package/dist/core/path-security.js +287 -5
  203. package/dist/core/permission.js +82 -22
  204. package/dist/core/permissions/auto-classifier.js +124 -0
  205. package/dist/core/permissions/bash-parser.js +371 -0
  206. package/dist/core/permissions/circuit-breaker.js +83 -0
  207. package/dist/core/permissions/constrained-edit.js +91 -0
  208. package/dist/core/permissions/gate.js +278 -0
  209. package/dist/core/permissions/index.js +20 -0
  210. package/dist/core/permissions/mode.js +174 -0
  211. package/dist/core/permissions/network-egress.js +137 -0
  212. package/dist/core/permissions/state.js +241 -0
  213. package/dist/core/permissions/tool-class.js +107 -0
  214. package/dist/core/plan-mode/ui-state.js +51 -0
  215. package/dist/core/plans/plan-artifact.js +721 -0
  216. package/dist/core/policy-limits/etag-store.js +122 -0
  217. package/dist/core/prd-check/parser.js +215 -0
  218. package/dist/core/prd-check/reporter.js +127 -0
  219. package/dist/core/prd-check/session-review.js +557 -0
  220. package/dist/core/prd-check/verifiers.js +223 -0
  221. package/dist/core/prompt-cache/client-cache.js +99 -0
  222. package/dist/core/prompts/assembly.js +29 -0
  223. package/dist/core/prompts/registry.js +364 -0
  224. package/dist/core/pugi-gitignore.js +52 -0
  225. package/dist/core/pugi-md/cc-compat-rules.js +735 -0
  226. package/dist/core/pugi-md/context-injector.js +76 -0
  227. package/dist/core/pugi-md/walk-up.js +207 -0
  228. package/dist/core/python/uv-installer.js +270 -0
  229. package/dist/core/python/uv-resolver.js +83 -0
  230. package/dist/core/rate-limit/narrator.js +146 -0
  231. package/dist/core/recipes/cli-types.js +20 -0
  232. package/dist/core/recipes/loader.js +103 -0
  233. package/dist/core/recipes/runner.js +345 -0
  234. package/dist/core/recipes/schema.js +587 -0
  235. package/dist/core/release-notes/parser.js +241 -0
  236. package/dist/core/release-notes/state.js +116 -0
  237. package/dist/core/repl/ask.js +37 -37
  238. package/dist/core/repl/cancellation.js +26 -26
  239. package/dist/core/repl/cap-warning.js +4 -4
  240. package/dist/core/repl/clipboard-read.js +11 -11
  241. package/dist/core/repl/dispatch-fsm.js +12 -12
  242. package/dist/core/repl/engine-bridge.js +303 -0
  243. package/dist/core/repl/history-search.js +15 -15
  244. package/dist/core/repl/history.js +28 -18
  245. package/dist/core/repl/kill-ring.js +5 -5
  246. package/dist/core/repl/model-pricing.js +135 -0
  247. package/dist/core/repl/privacy-banner.js +22 -22
  248. package/dist/core/repl/session.js +2690 -229
  249. package/dist/core/repl/slash-commands.js +540 -41
  250. package/dist/core/repl/store/index.js +1 -1
  251. package/dist/core/repl/store/jsonl-log.js +22 -22
  252. package/dist/core/repl/store/lockfile.js +10 -10
  253. package/dist/core/repl/store/session-store.js +136 -107
  254. package/dist/core/repl/store/types.js +15 -15
  255. package/dist/core/repl/store/uuid-v7.js +12 -12
  256. package/dist/core/repl/tool-route.js +382 -0
  257. package/dist/core/repl/workspace-context.js +43 -21
  258. package/dist/core/repo-map/build.js +125 -0
  259. package/dist/core/repo-map/cache.js +185 -0
  260. package/dist/core/repo-map/extractor.js +254 -0
  261. package/dist/core/repo-map/formatter.js +145 -0
  262. package/dist/core/repo-map/page-rank.js +105 -0
  263. package/dist/core/repo-map/scanner.js +211 -0
  264. package/dist/core/retro/git-collector.js +251 -0
  265. package/dist/core/retro/health-card.js +25 -0
  266. package/dist/core/retro/metrics.js +342 -0
  267. package/dist/core/retro/narrative.js +249 -0
  268. package/dist/core/retro/plane-collector.js +274 -0
  269. package/dist/core/retro/pr-issue-link.js +65 -0
  270. package/dist/core/retro/types.js +16 -0
  271. package/dist/core/retry-budget/budget.js +284 -0
  272. package/dist/core/retry-budget/index.js +5 -0
  273. package/dist/core/retry-budget/retry-cap.js +74 -0
  274. package/dist/core/routing/lead-worker.js +43 -0
  275. package/dist/core/routing/pre-flight-estimator.js +108 -0
  276. package/dist/core/runs/run-tree.js +103 -0
  277. package/dist/core/sandboxing/adapter.js +43 -0
  278. package/dist/core/sandboxing/bubblewrap.js +209 -0
  279. package/dist/core/sandboxing/index.js +78 -0
  280. package/dist/core/sandboxing/none.js +19 -0
  281. package/dist/core/sandboxing/policy.js +97 -0
  282. package/dist/core/sandboxing/seatbelt.js +231 -0
  283. package/dist/core/security/injection-scanner.js +367 -0
  284. package/dist/core/security/output-filter.js +418 -0
  285. package/dist/core/session/env-file.js +105 -0
  286. package/dist/core/session/section-budgets.js +140 -0
  287. package/dist/core/session.js +119 -0
  288. package/dist/core/settings.js +402 -5
  289. package/dist/core/share/formatter.js +271 -0
  290. package/dist/core/share/redactor.js +221 -0
  291. package/dist/core/share/uploader.js +267 -0
  292. package/dist/core/skills/defaults.js +30 -30
  293. package/dist/core/skills/loader.js +22 -22
  294. package/dist/core/skills/sources.js +27 -27
  295. package/dist/core/smoke/headless-driver.js +174 -0
  296. package/dist/core/smoke/orchestrator.js +194 -0
  297. package/dist/core/smoke/runner.js +238 -0
  298. package/dist/core/smoke/scenario-parser.js +316 -0
  299. package/dist/core/statusline.js +99 -0
  300. package/dist/core/subagents/dispatcher-real.js +600 -0
  301. package/dist/core/subagents/dispatcher.js +146 -52
  302. package/dist/core/subagents/index.js +19 -6
  303. package/dist/core/subagents/isolation-matrix.js +213 -0
  304. package/dist/core/subagents/spawn.js +19 -4
  305. package/dist/core/telemetry/emitter.js +229 -0
  306. package/dist/core/telemetry/queue.js +251 -0
  307. package/dist/core/theme/context.js +91 -0
  308. package/dist/core/theme/presets.js +228 -0
  309. package/dist/core/theme/state.js +181 -0
  310. package/dist/core/todos/invariant.js +10 -0
  311. package/dist/core/todos/state.js +177 -0
  312. package/dist/core/tool-schema/compressor.js +89 -0
  313. package/dist/core/transport/version-interceptor.js +166 -0
  314. package/dist/core/trust.js +2 -2
  315. package/dist/core/tui/thinking-block.js +64 -0
  316. package/dist/core/vim/keymap.js +288 -0
  317. package/dist/core/vim/state.js +92 -0
  318. package/dist/core/watch-markers/marker-watcher.js +133 -0
  319. package/dist/core/worktree/include-parser.js +249 -0
  320. package/dist/core/worktree-manager/cleanup.js +123 -0
  321. package/dist/core/worktree-manager/manager.js +303 -0
  322. package/dist/index.js +36 -0
  323. package/dist/runtime/bootstrap.js +190 -0
  324. package/dist/runtime/cli.js +4403 -561
  325. package/dist/runtime/commands/agents.js +31 -31
  326. package/dist/runtime/commands/budget.js +5 -5
  327. package/dist/runtime/commands/cancel.js +231 -0
  328. package/dist/runtime/commands/chain.js +489 -0
  329. package/dist/runtime/commands/codegraph-status.js +227 -0
  330. package/dist/runtime/commands/compact.js +297 -0
  331. package/dist/runtime/commands/config.js +74 -40
  332. package/dist/runtime/commands/cost.js +199 -0
  333. package/dist/runtime/commands/delegate.js +27 -4
  334. package/dist/runtime/commands/dispatch.js +126 -0
  335. package/dist/runtime/commands/doctor.js +579 -0
  336. package/dist/runtime/commands/eval-v1.js +266 -0
  337. package/dist/runtime/commands/feedback.js +184 -0
  338. package/dist/runtime/commands/hooks.js +187 -0
  339. package/dist/runtime/commands/index-cmd.js +459 -0
  340. package/dist/runtime/commands/init.js +254 -0
  341. package/dist/runtime/commands/lsp.js +200 -38
  342. package/dist/runtime/commands/mcp.js +935 -0
  343. package/dist/runtime/commands/memory.js +582 -0
  344. package/dist/runtime/commands/model.js +237 -0
  345. package/dist/runtime/commands/onboarding.js +275 -0
  346. package/dist/runtime/commands/patch.js +12 -12
  347. package/dist/runtime/commands/permissions.js +112 -0
  348. package/dist/runtime/commands/plan.js +143 -0
  349. package/dist/runtime/commands/prd-check.js +285 -0
  350. package/dist/runtime/commands/privacy.js +17 -17
  351. package/dist/runtime/commands/recipe.js +325 -0
  352. package/dist/runtime/commands/redo-blob-store.js +92 -0
  353. package/dist/runtime/commands/redo.js +361 -0
  354. package/dist/runtime/commands/release-notes.js +229 -0
  355. package/dist/runtime/commands/repo-map.js +95 -0
  356. package/dist/runtime/commands/report.js +299 -0
  357. package/dist/runtime/commands/resume.js +118 -0
  358. package/dist/runtime/commands/review-consensus.js +68 -53
  359. package/dist/runtime/commands/rewind.js +333 -0
  360. package/dist/runtime/commands/roster.js +14 -14
  361. package/dist/runtime/commands/servers-cli.js +182 -0
  362. package/dist/runtime/commands/servers.js +236 -0
  363. package/dist/runtime/commands/sessions.js +163 -0
  364. package/dist/runtime/commands/share.js +316 -0
  365. package/dist/runtime/commands/skills.js +31 -31
  366. package/dist/runtime/commands/status.js +186 -0
  367. package/dist/runtime/commands/stickers.js +82 -0
  368. package/dist/runtime/commands/style.js +194 -0
  369. package/dist/runtime/commands/theme.js +196 -0
  370. package/dist/runtime/commands/undo.js +54 -22
  371. package/dist/runtime/commands/update.js +289 -0
  372. package/dist/runtime/commands/vim.js +140 -0
  373. package/dist/runtime/commands/worktree.js +8 -8
  374. package/dist/runtime/commands/worktrees.js +155 -0
  375. package/dist/runtime/deprecation-warning.js +69 -0
  376. package/dist/runtime/engine-exit-code.js +50 -0
  377. package/dist/runtime/headless-repl.js +195 -0
  378. package/dist/runtime/headless.js +548 -0
  379. package/dist/runtime/load-hooks-or-exit.js +71 -0
  380. package/dist/runtime/plan-decompose.js +22 -22
  381. package/dist/runtime/sigint-guard.js +272 -0
  382. package/dist/runtime/stream-renderer.js +195 -0
  383. package/dist/runtime/update-check.js +28 -28
  384. package/dist/runtime/version.js +65 -0
  385. package/dist/runtime/worktree-bootstrap.js +579 -0
  386. package/dist/skills/bundled/batch.js +617 -0
  387. package/dist/skills/bundled/index.js +45 -0
  388. package/dist/skills/bundled/loop.js +358 -0
  389. package/dist/skills/bundled/remember.js +383 -0
  390. package/dist/skills/bundled/simplify.js +289 -0
  391. package/dist/skills/bundled/skillify.js +373 -0
  392. package/dist/skills/bundled/stuck.js +558 -0
  393. package/dist/skills/bundled/verify.js +439 -0
  394. package/dist/testing/vcr.js +486 -0
  395. package/dist/tools/agent-tool.js +229 -0
  396. package/dist/tools/apply-patch.js +89 -28
  397. package/dist/tools/ask-user-question.js +337 -0
  398. package/dist/tools/ask-user.js +115 -0
  399. package/dist/tools/bash.js +811 -49
  400. package/dist/tools/brief.js +224 -0
  401. package/dist/tools/cron.js +433 -0
  402. package/dist/tools/enter-worktree.js +250 -0
  403. package/dist/tools/exit-worktree.js +147 -0
  404. package/dist/tools/file-tools.js +161 -44
  405. package/dist/tools/http-request.js +336 -0
  406. package/dist/tools/lsp-tools.js +377 -1
  407. package/dist/tools/mcp-tool.js +260 -0
  408. package/dist/tools/multi-edit.js +361 -0
  409. package/dist/tools/powershell.js +268 -0
  410. package/dist/tools/registry.js +120 -5
  411. package/dist/tools/server-tools.js +892 -0
  412. package/dist/tools/skill-tool.js +96 -0
  413. package/dist/tools/sleep.js +99 -0
  414. package/dist/tools/synthetic-output.js +133 -0
  415. package/dist/tools/tasks.js +208 -0
  416. package/dist/tools/todo-write.js +184 -0
  417. package/dist/tools/verify-plan-execution.js +295 -0
  418. package/dist/tools/web-fetch-injection-scanner.js +207 -0
  419. package/dist/tools/web-fetch.js +195 -10
  420. package/dist/tools/web-search.js +458 -0
  421. package/dist/tui/agent-progress-card.js +111 -0
  422. package/dist/tui/agent-tree.js +22 -1
  423. package/dist/tui/ask-modal.js +14 -14
  424. package/dist/tui/ask-user-question-chips.js +315 -0
  425. package/dist/tui/ask-user-question-prompt.js +203 -0
  426. package/dist/tui/compact-banner.js +81 -0
  427. package/dist/tui/conversation-pane.js +85 -11
  428. package/dist/tui/cost-table.js +111 -0
  429. package/dist/tui/device-flow.js +2 -2
  430. package/dist/tui/doctor-table.js +46 -0
  431. package/dist/tui/feedback-prompt.js +156 -0
  432. package/dist/tui/input-box.js +247 -32
  433. package/dist/tui/login-picker.js +3 -3
  434. package/dist/tui/markdown-render.js +6 -6
  435. package/dist/tui/multi-file-diff-approval.js +375 -0
  436. package/dist/tui/onboarding-wizard.js +240 -0
  437. package/dist/tui/permissions-picker.js +86 -0
  438. package/dist/tui/render.js +36 -1
  439. package/dist/tui/repl-render.js +239 -25
  440. package/dist/tui/repl-splash-art.js +16 -16
  441. package/dist/tui/repl-splash-mascot.js +48 -24
  442. package/dist/tui/repl-splash.js +22 -22
  443. package/dist/tui/repl.js +125 -45
  444. package/dist/tui/slash-palette.js +6 -6
  445. package/dist/tui/splash.js +2 -2
  446. package/dist/tui/status-bar.js +109 -31
  447. package/dist/tui/status-table.js +7 -0
  448. package/dist/tui/stickers-art.js +136 -0
  449. package/dist/tui/style-table.js +28 -0
  450. package/dist/tui/theme-table.js +29 -0
  451. package/dist/tui/thinking-spinner.js +123 -0
  452. package/dist/tui/tool-stream-pane.js +53 -4
  453. package/dist/tui/update-banner.js +27 -2
  454. package/dist/tui/vim-input.js +267 -0
  455. package/dist/tui/welcome-banner.js +107 -0
  456. package/dist/tui/welcome-data.js +293 -0
  457. package/dist/tui/workspace-context.js +2 -2
  458. package/package.json +29 -6
  459. package/test/scenarios/codegen-create-file.scenario.txt +13 -0
  460. package/test/scenarios/compact-force.scenario.txt +12 -0
  461. package/test/scenarios/identity.scenario.txt +11 -0
  462. package/test/scenarios/persona-handoff.scenario.txt +12 -0
  463. package/test/scenarios/walkback.scenario.txt +12 -0
  464. package/dist/core/engine/compaction-hook.js +0 -154
@@ -0,0 +1,459 @@
1
+ /**
2
+ * `pugi index` - local symbol index CLI surface.
3
+ *
4
+ * Operator entry point for the Pugi-native symbol index living at
5
+ * `.pugi/codegraph.db`. Four subcommands today, all wired against the
6
+ * scaffold DB layer in `core/codegraph/db.ts`:
7
+ *
8
+ * - `pugi index` - full (re)index of the workspace.
9
+ * Today: opens the DB, runs the
10
+ * v1 migration, and reports the
11
+ * stub parser state. PR L1
12
+ * replaces this with a real
13
+ * tree-sitter walk.
14
+ * - `pugi index --watch` - start the file watcher. Not
15
+ * implemented in this PR; exits
16
+ * with rc=3 + a pointer at
17
+ * PR L2 which ships chokidar
18
+ * + 2s debounce.
19
+ * - `pugi index search <query>` - FTS5 query against
20
+ * `symbols_fts`. Works on top
21
+ * of an empty index too -
22
+ * returns zero matches.
23
+ * - `pugi index definition <symbol>` - exact-name lookup. Same shape
24
+ * as `--search`.
25
+ * - `pugi index callers <symbol>` - reverse-edge query. Empty
26
+ * today because the stub
27
+ * parser emits no edges.
28
+ *
29
+ * The command is intentionally narrow - every information surface
30
+ * (count, freshness, language coverage) routes through the existing
31
+ * `/codegraph-status` slash that already ships in `runtime/commands/
32
+ * codegraph-status.ts`. This file owns the indexing verbs; status
33
+ * lives over there.
34
+ *
35
+ * Exit codes:
36
+ * 0 - success / "nothing to do" idempotent path
37
+ * 1 - runtime failure (db error, IO error)
38
+ * 2 - invalid CLI args (unknown subcommand, missing required positional)
39
+ * 3 - not implemented yet (parser stub, watcher) - pointer in stderr
40
+ */
41
+ import { resolve } from 'node:path';
42
+ import { closeIndex, countSymbols, findCallers, findDefinition, openIndex, resolveIndexPath, searchSymbols, } from '../../core/codegraph/db.js';
43
+ import { reindexWorkspace } from '../../core/codegraph/reindex.js';
44
+ import { startWatcher } from '../../core/codegraph/watcher.js';
45
+ import { INDEXED_LANGUAGES } from '../../core/codegraph/types.js';
46
+ /**
47
+ * Single entry-point. Returns the process exit code; the caller in
48
+ * `runtime/cli.ts` propagates it via `process.exitCode` (mirrors the
49
+ * `dispatchFlatten` pattern).
50
+ */
51
+ export async function runIndexCommand(args, ctx) {
52
+ const sub = parseArgs(args);
53
+ switch (sub.kind) {
54
+ case 'help':
55
+ return printHelp(ctx);
56
+ case 'unknown':
57
+ return printUnknown(ctx, sub.raw);
58
+ case 'reindex':
59
+ return runReindex(ctx, sub.watch);
60
+ case 'search':
61
+ return runSearch(ctx, sub.query);
62
+ case 'definition':
63
+ return runDefinition(ctx, sub.symbol);
64
+ case 'callers':
65
+ return runCallers(ctx, sub.symbol);
66
+ }
67
+ }
68
+ /**
69
+ * Parse the argv tail (everything after `pugi index`). Pure - exported
70
+ * for the spec to pin canonical shapes.
71
+ */
72
+ export function parseArgs(args) {
73
+ if (args.length === 0) {
74
+ return { kind: 'reindex', watch: false };
75
+ }
76
+ const [head, ...rest] = args;
77
+ if (!head)
78
+ return { kind: 'reindex', watch: false };
79
+ if (head === '--help' || head === '-h' || head === 'help') {
80
+ return { kind: 'help' };
81
+ }
82
+ if (head === '--watch' || head === '-w') {
83
+ return { kind: 'reindex', watch: true };
84
+ }
85
+ if (head === 'search') {
86
+ const query = rest.join(' ').trim();
87
+ if (query.length === 0)
88
+ return { kind: 'unknown', raw: 'search (missing query)' };
89
+ return { kind: 'search', query };
90
+ }
91
+ if (head === 'definition') {
92
+ const symbol = rest.join(' ').trim();
93
+ if (symbol.length === 0)
94
+ return { kind: 'unknown', raw: 'definition (missing symbol)' };
95
+ return { kind: 'definition', symbol };
96
+ }
97
+ if (head === 'callers') {
98
+ const symbol = rest.join(' ').trim();
99
+ if (symbol.length === 0)
100
+ return { kind: 'unknown', raw: 'callers (missing symbol)' };
101
+ return { kind: 'callers', symbol };
102
+ }
103
+ return { kind: 'unknown', raw: head };
104
+ }
105
+ function printHelp(ctx) {
106
+ ctx.writeOutput({ command: 'index', sub: 'help', subcommands: ['search', 'definition', 'callers'] }, [
107
+ 'pugi index - local symbol index (CodeGraph-style).',
108
+ '',
109
+ 'Usage:',
110
+ ' pugi index Re-index the workspace.',
111
+ ' pugi index --watch Live auto-sync via chokidar (2s debounce).',
112
+ ' pugi index search <query> FTS5 search across symbol names.',
113
+ ' pugi index definition <symbol> Find the definition of <symbol>.',
114
+ ' pugi index callers <symbol> List call sites referencing <symbol>.',
115
+ '',
116
+ `Languages (v1): ${INDEXED_LANGUAGES.join(', ')}.`,
117
+ 'Storage: .pugi/codegraph.db (gitignored, regenerable).',
118
+ 'Design memo: docs/research/2026-06-05-pugi-index-codegraph-design.md',
119
+ ].join('\n'));
120
+ return 0;
121
+ }
122
+ function printUnknown(ctx, raw) {
123
+ ctx.writeOutput({ command: 'index', error: 'unknown-subcommand', got: raw }, `pugi index: unknown subcommand "${raw}". Allowed: search, definition, callers, --watch, --help.`);
124
+ return 2;
125
+ }
126
+ async function runReindex(ctx, watch) {
127
+ if (watch) {
128
+ return runWatch(ctx);
129
+ }
130
+ let db = null;
131
+ try {
132
+ db = openIndex(ctx.workspaceRoot);
133
+ const summary = await reindexWorkspace(db, { quiet: true });
134
+ const symCount = countSymbols(db);
135
+ ctx.writeOutput({
136
+ command: 'index',
137
+ sub: 'reindex',
138
+ watch: false,
139
+ status: 'ok',
140
+ dbPath: db.dbPath,
141
+ schemaVersion: db.version,
142
+ filesScanned: summary.filesScanned,
143
+ filesIndexed: summary.filesIndexed,
144
+ symbolsInserted: summary.symbolsInserted,
145
+ edgesInserted: summary.edgesInserted,
146
+ edgesOrphaned: summary.edgesOrphaned,
147
+ totalSymbols: symCount,
148
+ elapsedMs: summary.totalMs,
149
+ }, [
150
+ `Index DB ready at ${db.dbPath} (schema v${db.version}).`,
151
+ `Scanned ${summary.filesScanned} files, indexed ${summary.filesIndexed}.`,
152
+ `Symbols inserted: ${summary.symbolsInserted}. Edges inserted: ${summary.edgesInserted} (${summary.edgesOrphaned} orphans dropped).`,
153
+ `Elapsed: ${summary.totalMs} ms. Total symbols on disk: ${symCount}.`,
154
+ ].join('\n'));
155
+ return 0;
156
+ }
157
+ catch (err) {
158
+ const message = err instanceof Error ? err.message : String(err);
159
+ ctx.writeOutput({ command: 'index', sub: 'reindex', error: 'db_error', message }, `pugi index failed: ${message}`);
160
+ return 1;
161
+ }
162
+ finally {
163
+ if (db)
164
+ closeIndex(db);
165
+ }
166
+ }
167
+ /**
168
+ * `pugi index --watch` runtime: do one full re-index up-front so the
169
+ * index reflects the workspace as it stood at startup, then hand off
170
+ * к the chokidar watcher and block until SIGINT / SIGTERM. The DB
171
+ * handle stays open для the watcher's lifetime - the watcher writes
172
+ * incrementally, the operator quits with Ctrl+C, we close.
173
+ */
174
+ async function runWatch(ctx) {
175
+ const writeStderr = ctx.writeStderr ?? ((text) => void process.stderr.write(text));
176
+ let db = null;
177
+ try {
178
+ db = openIndex(ctx.workspaceRoot);
179
+ // Baseline reindex so the watcher starts on a known-current index.
180
+ // Reindex is idempotent + cheap on subsequent runs (no-op for
181
+ // unchanged files via the sha256 fingerprint).
182
+ const summary = await reindexWorkspace(db, { quiet: true });
183
+ ctx.writeOutput({
184
+ command: 'index',
185
+ sub: 'reindex',
186
+ watch: true,
187
+ status: 'watching',
188
+ dbPath: db.dbPath,
189
+ schemaVersion: db.version,
190
+ filesScanned: summary.filesScanned,
191
+ filesIndexed: summary.filesIndexed,
192
+ symbolsInserted: summary.symbolsInserted,
193
+ edgesInserted: summary.edgesInserted,
194
+ baselineMs: summary.totalMs,
195
+ }, [
196
+ `Baseline index ready (${summary.filesIndexed} files, ${summary.symbolsInserted} symbols, ${summary.edgesInserted} edges).`,
197
+ `watching ${ctx.workspaceRoot}...`,
198
+ ' Press Ctrl+C to stop.',
199
+ ].join('\n'));
200
+ const handle = startWatcher({
201
+ db,
202
+ workspaceRoot: ctx.workspaceRoot,
203
+ writeStderr,
204
+ });
205
+ // Set up SIGINT / SIGTERM traps. Resolve the promise that gates
206
+ // `runWatch` once the handle has fully closed.
207
+ return await new Promise((resolvePromise) => {
208
+ let shuttingDown = false;
209
+ const shutdown = async (signal) => {
210
+ if (shuttingDown)
211
+ return;
212
+ shuttingDown = true;
213
+ try {
214
+ await handle.close();
215
+ writeStderr(`pugi index --watch: stopped (${signal}).\n`);
216
+ }
217
+ catch (err) {
218
+ const message = err instanceof Error ? err.message : String(err);
219
+ writeStderr(`pugi index --watch: shutdown error: ${message}\n`);
220
+ }
221
+ finally {
222
+ if (db)
223
+ closeIndex(db);
224
+ db = null;
225
+ process.off('SIGINT', sigintListener);
226
+ process.off('SIGTERM', sigtermListener);
227
+ resolvePromise(0);
228
+ }
229
+ };
230
+ const sigintListener = () => void shutdown('SIGINT');
231
+ const sigtermListener = () => void shutdown('SIGTERM');
232
+ process.on('SIGINT', sigintListener);
233
+ process.on('SIGTERM', sigtermListener);
234
+ });
235
+ }
236
+ catch (err) {
237
+ const message = err instanceof Error ? err.message : String(err);
238
+ ctx.writeOutput({ command: 'index', sub: 'reindex', watch: true, error: 'watcher_failed', message }, `pugi index --watch failed: ${message}`);
239
+ if (db)
240
+ closeIndex(db);
241
+ return 1;
242
+ }
243
+ }
244
+ function runSearch(ctx, query) {
245
+ let db = null;
246
+ try {
247
+ db = openIndex(ctx.workspaceRoot);
248
+ // Wrap a bare identifier in a prefix-match phrase so operators
249
+ // can type `pugi index search foo` and find `fooBar`. FTS5 will
250
+ // happily accept a more specific raw expression too (e.g.
251
+ // `foo*` or `"exact phrase"`) - we only inject the convenience
252
+ // wrapping when the input looks like a plain identifier.
253
+ const wrapped = wrapSearchQuery(query);
254
+ const results = searchSymbols(db, wrapped, { limit: 50 });
255
+ ctx.writeOutput({
256
+ command: 'index',
257
+ sub: 'search',
258
+ query,
259
+ matches: results.length,
260
+ results: results.map(serializeSearchResult),
261
+ }, renderSearchText(query, results, db.dbPath));
262
+ return 0;
263
+ }
264
+ catch (err) {
265
+ const message = err instanceof Error ? err.message : String(err);
266
+ ctx.writeOutput({ command: 'index', sub: 'search', error: 'query_failed', message }, `pugi index search failed: ${message}`);
267
+ return 1;
268
+ }
269
+ finally {
270
+ if (db)
271
+ closeIndex(db);
272
+ }
273
+ }
274
+ function runDefinition(ctx, symbol) {
275
+ let db = null;
276
+ try {
277
+ db = openIndex(ctx.workspaceRoot);
278
+ const result = findDefinition(db, symbol);
279
+ ctx.writeOutput({
280
+ command: 'index',
281
+ sub: 'definition',
282
+ symbol,
283
+ result: serializeDefinitionResult(result),
284
+ }, renderDefinitionText(symbol, result));
285
+ return result.kind === 'found' ? 0 : 0;
286
+ }
287
+ catch (err) {
288
+ const message = err instanceof Error ? err.message : String(err);
289
+ ctx.writeOutput({ command: 'index', sub: 'definition', error: 'query_failed', message }, `pugi index definition failed: ${message}`);
290
+ return 1;
291
+ }
292
+ finally {
293
+ if (db)
294
+ closeIndex(db);
295
+ }
296
+ }
297
+ function runCallers(ctx, symbol) {
298
+ let db = null;
299
+ try {
300
+ db = openIndex(ctx.workspaceRoot);
301
+ const def = findDefinition(db, symbol);
302
+ if (def.kind !== 'found' || def.definition.id === undefined) {
303
+ ctx.writeOutput({
304
+ command: 'index',
305
+ sub: 'callers',
306
+ symbol,
307
+ matches: 0,
308
+ note: 'definition_not_found',
309
+ }, `pugi index callers: no definition known for "${symbol}". Run \`pugi index\` first or check the spelling.`);
310
+ return 0;
311
+ }
312
+ const callers = findCallers(db, def.definition.id);
313
+ ctx.writeOutput({
314
+ command: 'index',
315
+ sub: 'callers',
316
+ symbol,
317
+ definitionId: def.definition.id,
318
+ matches: callers.length,
319
+ callers: callers.map(serializeCallerResult),
320
+ }, renderCallersText(symbol, callers));
321
+ return 0;
322
+ }
323
+ catch (err) {
324
+ const message = err instanceof Error ? err.message : String(err);
325
+ ctx.writeOutput({ command: 'index', sub: 'callers', error: 'query_failed', message }, `pugi index callers failed: ${message}`);
326
+ return 1;
327
+ }
328
+ finally {
329
+ if (db)
330
+ closeIndex(db);
331
+ }
332
+ }
333
+ function serializeSearchResult(r) {
334
+ return {
335
+ name: r.symbol.name,
336
+ kind: r.symbol.kind,
337
+ file: r.symbol.file,
338
+ line: r.symbol.line,
339
+ col: r.symbol.column,
340
+ scope: r.symbol.scope,
341
+ signature: r.symbol.signature ?? null,
342
+ rank: r.rank,
343
+ };
344
+ }
345
+ function serializeDefinitionResult(r) {
346
+ if (r.kind === 'not_found')
347
+ return { found: false, name: r.name };
348
+ return {
349
+ found: true,
350
+ definition: serializeSymbol(r.definition),
351
+ disambiguations: r.disambiguations.map(serializeSymbol),
352
+ };
353
+ }
354
+ function serializeCallerResult(c) {
355
+ return {
356
+ name: c.caller.name,
357
+ kind: c.caller.kind,
358
+ file: c.caller.file,
359
+ line: c.caller.line,
360
+ col: c.caller.column,
361
+ scope: c.caller.scope,
362
+ edgeKind: c.edge.kind,
363
+ };
364
+ }
365
+ function serializeSymbol(s) {
366
+ return {
367
+ id: s.id,
368
+ name: s.name,
369
+ kind: s.kind,
370
+ file: s.file,
371
+ line: s.line,
372
+ col: s.column,
373
+ scope: s.scope,
374
+ signature: s.signature ?? null,
375
+ };
376
+ }
377
+ function renderSearchText(query, results, dbPath) {
378
+ if (results.length === 0) {
379
+ return [
380
+ `pugi index search "${query}" - 0 matches.`,
381
+ `Index DB: ${dbPath}`,
382
+ 'Hint: the parser stub does not extract symbols yet. PR L1 wires real tree-sitter extraction.',
383
+ ].join('\n');
384
+ }
385
+ const lines = [
386
+ `pugi index search "${query}" - ${results.length} matches:`,
387
+ '',
388
+ ];
389
+ for (const r of results) {
390
+ lines.push(` ${r.symbol.name} [${r.symbol.kind}] ${r.symbol.file}:${r.symbol.line} rank=${r.rank.toFixed(2)}`);
391
+ }
392
+ return lines.join('\n');
393
+ }
394
+ function renderDefinitionText(symbol, result) {
395
+ if (result.kind === 'not_found') {
396
+ return [
397
+ `pugi index definition "${symbol}" - not found.`,
398
+ 'Hint: PR L1 wires the parser; until then the index is empty unless seeded by tests.',
399
+ ].join('\n');
400
+ }
401
+ const d = result.definition;
402
+ const head = ` ${d.name} [${d.kind}] ${d.file}:${d.line}`;
403
+ if (result.disambiguations.length === 0)
404
+ return head;
405
+ return [
406
+ head,
407
+ `Also found in ${result.disambiguations.length} other locations:`,
408
+ ...result.disambiguations.map((s) => ` - ${s.file}:${s.line} [${s.kind}]`),
409
+ ].join('\n');
410
+ }
411
+ function renderCallersText(symbol, callers) {
412
+ if (callers.length === 0) {
413
+ return `pugi index callers "${symbol}" - 0 call sites.`;
414
+ }
415
+ const lines = [
416
+ `pugi index callers "${symbol}" - ${callers.length} call sites:`,
417
+ '',
418
+ ];
419
+ for (const c of callers) {
420
+ lines.push(` ${c.caller.name} ${c.caller.file}:${c.caller.line} edge=${c.edge.kind}`);
421
+ }
422
+ return lines.join('\n');
423
+ }
424
+ /**
425
+ * Resolve the absolute workspace root from a relative input. Exported so
426
+ * the cli.ts dispatcher can call this once and pass an already-absolute
427
+ * path to the context. Pure - no IO.
428
+ */
429
+ export function resolveWorkspaceRoot(input) {
430
+ return resolve(input);
431
+ }
432
+ /**
433
+ * Best-effort prefix wrap for FTS5. When the operator types a plain
434
+ * identifier (`fooBar`, `my_func`, `Greeter`), wrap it as a prefix
435
+ * match. When the input already looks like an FTS5 expression
436
+ * (contains `*` / `"` / `:` / leading `+` `-`), pass it through
437
+ * untouched. Exported so the spec can pin the behaviour.
438
+ *
439
+ * `unicode61` (the FTS5 default tokenizer) splits on punctuation
440
+ * other than ASCII letters/digits; an unquoted identifier with
441
+ * `_` или `-` would be tokenised к multiple terms. We avoid that
442
+ * by quoting before appending `*` for prefix-match.
443
+ */
444
+ export function wrapSearchQuery(query) {
445
+ const trimmed = query.trim();
446
+ if (trimmed.length === 0)
447
+ return trimmed;
448
+ if (/["*:+\-^()]/.test(trimmed))
449
+ return trimmed;
450
+ // Single identifier-like token: quote + prefix.
451
+ if (!/\s/.test(trimmed)) {
452
+ return `"${trimmed}"*`;
453
+ }
454
+ return trimmed;
455
+ }
456
+ // Re-export `resolveIndexPath` from db.ts for callers that want to know
457
+ // where the DB lives without opening it (e.g. `pugi doctor`).
458
+ export { resolveIndexPath };
459
+ //# sourceMappingURL=index-cmd.js.map