@pugi/cli 0.1.0-beta.99 → 1.0.0-alpha.1

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 (448) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +11 -191
  3. package/bin/pugi +8 -0
  4. package/package.json +15 -71
  5. package/postinstall.mjs +31 -0
  6. package/CHANGELOG.md +0 -132
  7. package/THIRD_PARTY_NOTICES.md +0 -40
  8. package/assets/pugi-mascot.ansi +0 -16
  9. package/assets/pugi-prozr2-mascot.ansi +0 -9
  10. package/bin/run.js +0 -34
  11. package/dist/commands/deploy.js +0 -439
  12. package/dist/commands/flatten.js +0 -191
  13. package/dist/commands/jobs-watch.js +0 -201
  14. package/dist/commands/jobs.js +0 -260
  15. package/dist/commands/retro.js +0 -210
  16. package/dist/commands/smoke.js +0 -133
  17. package/dist/core/agent-progress/cleanup.js +0 -134
  18. package/dist/core/agent-progress/schema.js +0 -144
  19. package/dist/core/agent-progress/writer.js +0 -101
  20. package/dist/core/agents/adaptive-router.js +0 -330
  21. package/dist/core/agents/loader.js +0 -104
  22. package/dist/core/agents/query-decomposer.js +0 -297
  23. package/dist/core/agents/registry.js +0 -69
  24. package/dist/core/approvals/shortcut-resolver.js +0 -98
  25. package/dist/core/artifact-chain/dispatcher.js +0 -148
  26. package/dist/core/artifact-chain/exporter.js +0 -164
  27. package/dist/core/artifact-chain/state.js +0 -243
  28. package/dist/core/artifact-chain/steps.js +0 -169
  29. package/dist/core/ask-user/question.js +0 -92
  30. package/dist/core/audit/audit-trail.js +0 -275
  31. package/dist/core/auth/ensure-authenticated.js +0 -129
  32. package/dist/core/auth/env-provider.js +0 -238
  33. package/dist/core/auto-open-browser.js +0 -128
  34. package/dist/core/auto-update/channels.js +0 -122
  35. package/dist/core/auto-update/checker.js +0 -241
  36. package/dist/core/auto-update/state.js +0 -235
  37. package/dist/core/bare-mode/index.js +0 -107
  38. package/dist/core/bash/redirect.js +0 -281
  39. package/dist/core/bash-classifier.js +0 -1397
  40. package/dist/core/checkpoint/resumer.js +0 -149
  41. package/dist/core/checkpoint/rewinder.js +0 -291
  42. package/dist/core/checkpoints/shadow-git.js +0 -670
  43. package/dist/core/citations/parser.js +0 -109
  44. package/dist/core/classifier/yolo-classifier.js +0 -88
  45. package/dist/core/clipboard.js +0 -70
  46. package/dist/core/codegraph/decision-store.js +0 -248
  47. package/dist/core/codegraph/detect-repo.js +0 -459
  48. package/dist/core/codegraph/install.js +0 -134
  49. package/dist/core/codegraph/offer-hook.js +0 -220
  50. package/dist/core/compact/auto-trigger.js +0 -96
  51. package/dist/core/compact/buffer-rewriter.js +0 -115
  52. package/dist/core/compact/summarizer.js +0 -208
  53. package/dist/core/compact/token-counter.js +0 -108
  54. package/dist/core/consensus/anvil-fanout.js +0 -276
  55. package/dist/core/consensus/diff-capture.js +0 -491
  56. package/dist/core/consensus/rubric.js +0 -233
  57. package/dist/core/context/builder.js +0 -114
  58. package/dist/core/context/compaction-events.js +0 -99
  59. package/dist/core/context/compaction.js +0 -602
  60. package/dist/core/context/index.js +0 -28
  61. package/dist/core/context/invariants.js +0 -250
  62. package/dist/core/context/markdown-loader.js +0 -288
  63. package/dist/core/context/markdown-traverse.js +0 -255
  64. package/dist/core/context/pugiignore.js +0 -316
  65. package/dist/core/context/repo-skeleton.js +0 -533
  66. package/dist/core/context/tool-eviction.js +0 -55
  67. package/dist/core/context/watcher.js +0 -342
  68. package/dist/core/context/working-set.js +0 -165
  69. package/dist/core/coordinator/agent-tools.js +0 -77
  70. package/dist/core/coordinator/agent-toolset.js +0 -65
  71. package/dist/core/coordinator/fsm.js +0 -73
  72. package/dist/core/coordinator/mode-fsm.js +0 -70
  73. package/dist/core/cost/rate-card.js +0 -129
  74. package/dist/core/cost/tracker.js +0 -221
  75. package/dist/core/credentials.js +0 -355
  76. package/dist/core/cron/scheduler.js +0 -138
  77. package/dist/core/denial-tracking/index.js +0 -8
  78. package/dist/core/denial-tracking/state.js +0 -264
  79. package/dist/core/diagnostics/probe-runner.js +0 -93
  80. package/dist/core/diagnostics/probes/api.js +0 -46
  81. package/dist/core/diagnostics/probes/auth.js +0 -93
  82. package/dist/core/diagnostics/probes/bare-mode.js +0 -42
  83. package/dist/core/diagnostics/probes/cli-version.js +0 -127
  84. package/dist/core/diagnostics/probes/config.js +0 -72
  85. package/dist/core/diagnostics/probes/denial-tracking.js +0 -57
  86. package/dist/core/diagnostics/probes/disk.js +0 -81
  87. package/dist/core/diagnostics/probes/engine-live.js +0 -46
  88. package/dist/core/diagnostics/probes/git.js +0 -65
  89. package/dist/core/diagnostics/probes/hooks.js +0 -118
  90. package/dist/core/diagnostics/probes/mcp.js +0 -75
  91. package/dist/core/diagnostics/probes/node.js +0 -59
  92. package/dist/core/diagnostics/probes/pnpm.js +0 -36
  93. package/dist/core/diagnostics/probes/pugi-md.js +0 -89
  94. package/dist/core/diagnostics/probes/sandbox.js +0 -72
  95. package/dist/core/diagnostics/probes/session.js +0 -74
  96. package/dist/core/diagnostics/probes/status-snapshot.js +0 -488
  97. package/dist/core/diagnostics/probes/workspace.js +0 -63
  98. package/dist/core/diagnostics/types.js +0 -70
  99. package/dist/core/dispatch/cache-cleanup.js +0 -197
  100. package/dist/core/dispatch/cache-handoff.js +0 -295
  101. package/dist/core/edits/apply-patch-layer-e.js +0 -189
  102. package/dist/core/edits/dispatch.js +0 -511
  103. package/dist/core/edits/format-detector.js +0 -260
  104. package/dist/core/edits/format-matrix.js +0 -26
  105. package/dist/core/edits/fuzzy-ladder.js +0 -650
  106. package/dist/core/edits/index.js +0 -19
  107. package/dist/core/edits/journal.js +0 -199
  108. package/dist/core/edits/layer-a-apply.js +0 -217
  109. package/dist/core/edits/layer-a-fuzzy-apply.js +0 -198
  110. package/dist/core/edits/layer-b-apply.js +0 -211
  111. package/dist/core/edits/layer-c-apply.js +0 -160
  112. package/dist/core/edits/layer-d-ast.js +0 -572
  113. package/dist/core/edits/marker-parser.js +0 -401
  114. package/dist/core/edits/security-gate.js +0 -223
  115. package/dist/core/edits/verify-hook.js +0 -273
  116. package/dist/core/edits/worktree.js +0 -322
  117. package/dist/core/engine/adapter-runner.js +0 -8
  118. package/dist/core/engine/anvil-client.js +0 -344
  119. package/dist/core/engine/auto-compact.js +0 -179
  120. package/dist/core/engine/budgets.js +0 -195
  121. package/dist/core/engine/context-prefix.js +0 -155
  122. package/dist/core/engine/index.js +0 -12
  123. package/dist/core/engine/intensity.js +0 -163
  124. package/dist/core/engine/intent.js +0 -260
  125. package/dist/core/engine/native-pugi.js +0 -1616
  126. package/dist/core/engine/noop.js +0 -27
  127. package/dist/core/engine/prompts.js +0 -236
  128. package/dist/core/engine/strip-internal-fields.js +0 -124
  129. package/dist/core/engine/tool-bridge.js +0 -2173
  130. package/dist/core/engine/verification-patterns.js +0 -195
  131. package/dist/core/evaluation/golden-dataset.js +0 -293
  132. package/dist/core/feedback/queue.js +0 -177
  133. package/dist/core/feedback/submitter.js +0 -145
  134. package/dist/core/file-cache.js +0 -141
  135. package/dist/core/flatten/flatten-repo.js +0 -439
  136. package/dist/core/format/osc8-link.js +0 -28
  137. package/dist/core/hook-chains.js +0 -392
  138. package/dist/core/hooks/citation-verify-hook.js +0 -138
  139. package/dist/core/hooks/citation-verify.js +0 -112
  140. package/dist/core/hooks/events.js +0 -46
  141. package/dist/core/hooks/index.js +0 -15
  142. package/dist/core/hooks/registry.js +0 -216
  143. package/dist/core/hooks/runner.js +0 -236
  144. package/dist/core/hooks/v2/event-emitter.js +0 -115
  145. package/dist/core/hooks/v2/executor.js +0 -282
  146. package/dist/core/hooks/v2/index.js +0 -25
  147. package/dist/core/hooks/v2/lifecycle.js +0 -104
  148. package/dist/core/hooks/v2/loader.js +0 -216
  149. package/dist/core/hooks/v2/matcher.js +0 -125
  150. package/dist/core/hooks/v2/trust.js +0 -143
  151. package/dist/core/hooks/v2/types.js +0 -86
  152. package/dist/core/hooks/worktree-events.js +0 -158
  153. package/dist/core/hooks.js +0 -415
  154. package/dist/core/image/renderer.js +0 -71
  155. package/dist/core/index-store.js +0 -260
  156. package/dist/core/init/detector.js +0 -582
  157. package/dist/core/init/template-renderer.js +0 -242
  158. package/dist/core/jobs/registry.js +0 -462
  159. package/dist/core/ledger/results-tsv.js +0 -142
  160. package/dist/core/log-discipline/stdout-redirect.js +0 -51
  161. package/dist/core/lsp/cache.js +0 -105
  162. package/dist/core/lsp/client.js +0 -1229
  163. package/dist/core/lsp/language-detect.js +0 -66
  164. package/dist/core/lsp/post-edit-diagnostics.js +0 -171
  165. package/dist/core/lsp/server-detect.js +0 -173
  166. package/dist/core/lsp/symbol-cache.js +0 -162
  167. package/dist/core/lsp/symbol-tools.js +0 -664
  168. package/dist/core/mcp/client.js +0 -385
  169. package/dist/core/mcp/http-server.js +0 -553
  170. package/dist/core/mcp/orchestrator-config.js +0 -192
  171. package/dist/core/mcp/orchestrator-tools.js +0 -806
  172. package/dist/core/mcp/permission.js +0 -190
  173. package/dist/core/mcp/registry.js +0 -193
  174. package/dist/core/mcp/server-tools.js +0 -219
  175. package/dist/core/mcp/server.js +0 -397
  176. package/dist/core/mcp/trust.js +0 -91
  177. package/dist/core/memory/dual-write.js +0 -416
  178. package/dist/core/memory/passive-extract.js +0 -130
  179. package/dist/core/memory/phase1-kinds.js +0 -20
  180. package/dist/core/memory/secret-scanner.js +0 -304
  181. package/dist/core/memory-sync/queue.js +0 -170
  182. package/dist/core/metrics/extract.js +0 -113
  183. package/dist/core/modes/roo-modes.js +0 -68
  184. package/dist/core/onboarding/ensure-initialized.js +0 -133
  185. package/dist/core/onboarding/marker.js +0 -111
  186. package/dist/core/onboarding/telemetry-state.js +0 -108
  187. package/dist/core/output-style/presets.js +0 -176
  188. package/dist/core/output-style/state.js +0 -185
  189. package/dist/core/path-security.js +0 -345
  190. package/dist/core/permission.js +0 -369
  191. package/dist/core/permissions/auto-classifier.js +0 -124
  192. package/dist/core/permissions/bash-parser.js +0 -371
  193. package/dist/core/permissions/circuit-breaker.js +0 -83
  194. package/dist/core/permissions/constrained-edit.js +0 -91
  195. package/dist/core/permissions/gate.js +0 -278
  196. package/dist/core/permissions/index.js +0 -20
  197. package/dist/core/permissions/mode.js +0 -174
  198. package/dist/core/permissions/network-egress.js +0 -137
  199. package/dist/core/permissions/state.js +0 -241
  200. package/dist/core/permissions/tool-class.js +0 -107
  201. package/dist/core/plan-mode/ui-state.js +0 -51
  202. package/dist/core/plans/plan-artifact.js +0 -721
  203. package/dist/core/policy-limits/etag-store.js +0 -122
  204. package/dist/core/prd-check/parser.js +0 -215
  205. package/dist/core/prd-check/reporter.js +0 -127
  206. package/dist/core/prd-check/session-review.js +0 -557
  207. package/dist/core/prd-check/verifiers.js +0 -223
  208. package/dist/core/prompt-cache/client-cache.js +0 -99
  209. package/dist/core/prompts/assembly.js +0 -29
  210. package/dist/core/prompts/registry.js +0 -364
  211. package/dist/core/pugi-gitignore.js +0 -52
  212. package/dist/core/pugi-md/cc-compat-rules.js +0 -735
  213. package/dist/core/pugi-md/context-injector.js +0 -76
  214. package/dist/core/pugi-md/walk-up.js +0 -207
  215. package/dist/core/python/uv-installer.js +0 -270
  216. package/dist/core/python/uv-resolver.js +0 -83
  217. package/dist/core/rate-limit/narrator.js +0 -146
  218. package/dist/core/recipes/cli-types.js +0 -20
  219. package/dist/core/recipes/loader.js +0 -103
  220. package/dist/core/recipes/runner.js +0 -345
  221. package/dist/core/recipes/schema.js +0 -587
  222. package/dist/core/release-notes/parser.js +0 -241
  223. package/dist/core/release-notes/state.js +0 -116
  224. package/dist/core/repl/ask.js +0 -512
  225. package/dist/core/repl/cancellation.js +0 -98
  226. package/dist/core/repl/cap-warning.js +0 -91
  227. package/dist/core/repl/clipboard-read.js +0 -174
  228. package/dist/core/repl/dispatch-fsm.js +0 -220
  229. package/dist/core/repl/engine-bridge.js +0 -303
  230. package/dist/core/repl/history-search.js +0 -175
  231. package/dist/core/repl/history.js +0 -182
  232. package/dist/core/repl/kill-ring.js +0 -138
  233. package/dist/core/repl/model-pricing.js +0 -135
  234. package/dist/core/repl/privacy-banner.js +0 -71
  235. package/dist/core/repl/session.js +0 -4962
  236. package/dist/core/repl/slash-commands.js +0 -747
  237. package/dist/core/repl/store/index.js +0 -12
  238. package/dist/core/repl/store/jsonl-log.js +0 -321
  239. package/dist/core/repl/store/lockfile.js +0 -155
  240. package/dist/core/repl/store/session-store.js +0 -821
  241. package/dist/core/repl/store/types.js +0 -44
  242. package/dist/core/repl/store/uuid-v7.js +0 -68
  243. package/dist/core/repl/tool-route.js +0 -382
  244. package/dist/core/repl/workspace-context.js +0 -206
  245. package/dist/core/repo-map/build.js +0 -125
  246. package/dist/core/repo-map/cache.js +0 -185
  247. package/dist/core/repo-map/extractor.js +0 -254
  248. package/dist/core/repo-map/formatter.js +0 -145
  249. package/dist/core/repo-map/page-rank.js +0 -105
  250. package/dist/core/repo-map/scanner.js +0 -211
  251. package/dist/core/retro/git-collector.js +0 -251
  252. package/dist/core/retro/health-card.js +0 -25
  253. package/dist/core/retro/metrics.js +0 -342
  254. package/dist/core/retro/narrative.js +0 -249
  255. package/dist/core/retro/plane-collector.js +0 -274
  256. package/dist/core/retro/pr-issue-link.js +0 -65
  257. package/dist/core/retro/types.js +0 -16
  258. package/dist/core/retry-budget/budget.js +0 -284
  259. package/dist/core/retry-budget/index.js +0 -5
  260. package/dist/core/retry-budget/retry-cap.js +0 -74
  261. package/dist/core/routing/lead-worker.js +0 -43
  262. package/dist/core/routing/pre-flight-estimator.js +0 -108
  263. package/dist/core/runs/run-tree.js +0 -103
  264. package/dist/core/sandboxing/adapter.js +0 -29
  265. package/dist/core/sandboxing/index.js +0 -49
  266. package/dist/core/sandboxing/none.js +0 -19
  267. package/dist/core/sandboxing/seatbelt.js +0 -183
  268. package/dist/core/security/injection-scanner.js +0 -367
  269. package/dist/core/security/output-filter.js +0 -418
  270. package/dist/core/session/env-file.js +0 -105
  271. package/dist/core/session/section-budgets.js +0 -140
  272. package/dist/core/session.js +0 -377
  273. package/dist/core/settings.js +0 -400
  274. package/dist/core/share/formatter.js +0 -271
  275. package/dist/core/share/redactor.js +0 -221
  276. package/dist/core/share/uploader.js +0 -267
  277. package/dist/core/skills/defaults.js +0 -457
  278. package/dist/core/skills/loader.js +0 -454
  279. package/dist/core/skills/sources.js +0 -480
  280. package/dist/core/skills/trust.js +0 -172
  281. package/dist/core/smoke/headless-driver.js +0 -174
  282. package/dist/core/smoke/orchestrator.js +0 -194
  283. package/dist/core/smoke/runner.js +0 -238
  284. package/dist/core/smoke/scenario-parser.js +0 -316
  285. package/dist/core/statusline.js +0 -99
  286. package/dist/core/subagents/dispatcher-real.js +0 -600
  287. package/dist/core/subagents/dispatcher.js +0 -352
  288. package/dist/core/subagents/index.js +0 -39
  289. package/dist/core/subagents/isolation-matrix.js +0 -213
  290. package/dist/core/subagents/spawn.js +0 -101
  291. package/dist/core/telemetry/emitter.js +0 -229
  292. package/dist/core/telemetry/queue.js +0 -251
  293. package/dist/core/theme/context.js +0 -91
  294. package/dist/core/theme/presets.js +0 -228
  295. package/dist/core/theme/state.js +0 -181
  296. package/dist/core/todos/invariant.js +0 -10
  297. package/dist/core/todos/state.js +0 -177
  298. package/dist/core/tool-schema/compressor.js +0 -89
  299. package/dist/core/transport/version-interceptor.js +0 -166
  300. package/dist/core/trust.js +0 -109
  301. package/dist/core/tui/thinking-block.js +0 -64
  302. package/dist/core/vim/keymap.js +0 -288
  303. package/dist/core/vim/state.js +0 -92
  304. package/dist/core/watch-markers/marker-watcher.js +0 -133
  305. package/dist/core/worktree/include-parser.js +0 -249
  306. package/dist/core/worktree-manager/cleanup.js +0 -123
  307. package/dist/core/worktree-manager/manager.js +0 -303
  308. package/dist/index.js +0 -44
  309. package/dist/runtime/bootstrap.js +0 -190
  310. package/dist/runtime/cli.js +0 -8121
  311. package/dist/runtime/commands/agents.js +0 -385
  312. package/dist/runtime/commands/budget.js +0 -192
  313. package/dist/runtime/commands/cancel.js +0 -231
  314. package/dist/runtime/commands/chain.js +0 -489
  315. package/dist/runtime/commands/codegraph-status.js +0 -227
  316. package/dist/runtime/commands/compact.js +0 -297
  317. package/dist/runtime/commands/config.js +0 -595
  318. package/dist/runtime/commands/cost.js +0 -199
  319. package/dist/runtime/commands/delegate.js +0 -312
  320. package/dist/runtime/commands/dispatch.js +0 -126
  321. package/dist/runtime/commands/doctor.js +0 -579
  322. package/dist/runtime/commands/feedback.js +0 -184
  323. package/dist/runtime/commands/hooks.js +0 -187
  324. package/dist/runtime/commands/init.js +0 -254
  325. package/dist/runtime/commands/lsp.js +0 -368
  326. package/dist/runtime/commands/mcp.js +0 -935
  327. package/dist/runtime/commands/memory.js +0 -582
  328. package/dist/runtime/commands/model.js +0 -237
  329. package/dist/runtime/commands/onboarding.js +0 -275
  330. package/dist/runtime/commands/patch.js +0 -128
  331. package/dist/runtime/commands/permissions.js +0 -112
  332. package/dist/runtime/commands/plan.js +0 -143
  333. package/dist/runtime/commands/prd-check.js +0 -285
  334. package/dist/runtime/commands/privacy.js +0 -107
  335. package/dist/runtime/commands/recipe.js +0 -325
  336. package/dist/runtime/commands/redo-blob-store.js +0 -92
  337. package/dist/runtime/commands/redo.js +0 -361
  338. package/dist/runtime/commands/release-notes.js +0 -229
  339. package/dist/runtime/commands/repo-map.js +0 -95
  340. package/dist/runtime/commands/report.js +0 -299
  341. package/dist/runtime/commands/resume.js +0 -118
  342. package/dist/runtime/commands/review-consensus.js +0 -414
  343. package/dist/runtime/commands/rewind.js +0 -333
  344. package/dist/runtime/commands/roster.js +0 -117
  345. package/dist/runtime/commands/sessions.js +0 -163
  346. package/dist/runtime/commands/share.js +0 -316
  347. package/dist/runtime/commands/skills.js +0 -401
  348. package/dist/runtime/commands/status.js +0 -186
  349. package/dist/runtime/commands/stickers.js +0 -82
  350. package/dist/runtime/commands/style.js +0 -194
  351. package/dist/runtime/commands/theme.js +0 -196
  352. package/dist/runtime/commands/undo.js +0 -361
  353. package/dist/runtime/commands/update.js +0 -289
  354. package/dist/runtime/commands/vim.js +0 -140
  355. package/dist/runtime/commands/worktree.js +0 -177
  356. package/dist/runtime/commands/worktrees.js +0 -155
  357. package/dist/runtime/deprecation-warning.js +0 -69
  358. package/dist/runtime/engine-exit-code.js +0 -50
  359. package/dist/runtime/headless-repl.js +0 -195
  360. package/dist/runtime/headless.js +0 -548
  361. package/dist/runtime/load-hooks-or-exit.js +0 -71
  362. package/dist/runtime/plan-decompose.js +0 -531
  363. package/dist/runtime/sigint-guard.js +0 -272
  364. package/dist/runtime/stream-renderer.js +0 -195
  365. package/dist/runtime/update-check.js +0 -294
  366. package/dist/runtime/version.js +0 -65
  367. package/dist/runtime/worktree-bootstrap.js +0 -579
  368. package/dist/skills/bundled/batch.js +0 -617
  369. package/dist/skills/bundled/index.js +0 -45
  370. package/dist/skills/bundled/loop.js +0 -358
  371. package/dist/skills/bundled/remember.js +0 -383
  372. package/dist/skills/bundled/simplify.js +0 -289
  373. package/dist/skills/bundled/skillify.js +0 -373
  374. package/dist/skills/bundled/stuck.js +0 -558
  375. package/dist/skills/bundled/verify.js +0 -439
  376. package/dist/testing/vcr.js +0 -486
  377. package/dist/tools/agent-tool.js +0 -229
  378. package/dist/tools/apply-patch.js +0 -556
  379. package/dist/tools/ask-user-question.js +0 -337
  380. package/dist/tools/ask-user.js +0 -115
  381. package/dist/tools/bash.js +0 -1238
  382. package/dist/tools/brief.js +0 -224
  383. package/dist/tools/cron.js +0 -433
  384. package/dist/tools/enter-worktree.js +0 -250
  385. package/dist/tools/exit-worktree.js +0 -147
  386. package/dist/tools/file-tools.js +0 -553
  387. package/dist/tools/http-request.js +0 -336
  388. package/dist/tools/lsp-tools.js +0 -565
  389. package/dist/tools/mcp-tool.js +0 -260
  390. package/dist/tools/multi-edit.js +0 -361
  391. package/dist/tools/powershell.js +0 -268
  392. package/dist/tools/registry.js +0 -166
  393. package/dist/tools/server-tools.js +0 -892
  394. package/dist/tools/skill-tool.js +0 -96
  395. package/dist/tools/sleep.js +0 -99
  396. package/dist/tools/synthetic-output.js +0 -133
  397. package/dist/tools/tasks.js +0 -208
  398. package/dist/tools/todo-write.js +0 -184
  399. package/dist/tools/verify-plan-execution.js +0 -295
  400. package/dist/tools/web-fetch-injection-scanner.js +0 -207
  401. package/dist/tools/web-fetch.js +0 -720
  402. package/dist/tools/web-search.js +0 -458
  403. package/dist/tui/agent-progress-card.js +0 -111
  404. package/dist/tui/agent-tree-pane.js +0 -9
  405. package/dist/tui/agent-tree.js +0 -87
  406. package/dist/tui/ask-cli.js +0 -52
  407. package/dist/tui/ask-modal.js +0 -211
  408. package/dist/tui/ask-user-question-chips.js +0 -315
  409. package/dist/tui/ask-user-question-prompt.js +0 -203
  410. package/dist/tui/compact-banner.js +0 -81
  411. package/dist/tui/conversation-pane.js +0 -164
  412. package/dist/tui/cost-table.js +0 -111
  413. package/dist/tui/device-flow.js +0 -142
  414. package/dist/tui/doctor-table.js +0 -46
  415. package/dist/tui/feedback-prompt.js +0 -156
  416. package/dist/tui/input-box.js +0 -732
  417. package/dist/tui/login-picker.js +0 -69
  418. package/dist/tui/markdown-render.js +0 -266
  419. package/dist/tui/multi-file-diff-approval.js +0 -375
  420. package/dist/tui/onboarding-wizard.js +0 -240
  421. package/dist/tui/permissions-picker.js +0 -86
  422. package/dist/tui/render.js +0 -160
  423. package/dist/tui/repl-render.js +0 -770
  424. package/dist/tui/repl-splash-art.js +0 -64
  425. package/dist/tui/repl-splash-mascot.js +0 -154
  426. package/dist/tui/repl-splash.js +0 -117
  427. package/dist/tui/repl.js +0 -378
  428. package/dist/tui/slash-palette.js +0 -106
  429. package/dist/tui/splash-data.js +0 -61
  430. package/dist/tui/splash.js +0 -31
  431. package/dist/tui/status-bar.js +0 -209
  432. package/dist/tui/status-table.js +0 -7
  433. package/dist/tui/stickers-art.js +0 -136
  434. package/dist/tui/style-table.js +0 -28
  435. package/dist/tui/theme-table.js +0 -29
  436. package/dist/tui/thinking-spinner.js +0 -123
  437. package/dist/tui/tool-stream-pane.js +0 -140
  438. package/dist/tui/update-banner.js +0 -33
  439. package/dist/tui/vim-input.js +0 -267
  440. package/dist/tui/welcome-banner.js +0 -107
  441. package/dist/tui/welcome-data.js +0 -293
  442. package/dist/tui/workspace-context.js +0 -105
  443. package/docs/examples/codegraph.mcp.json +0 -10
  444. package/test/scenarios/codegen-create-file.scenario.txt +0 -13
  445. package/test/scenarios/compact-force.scenario.txt +0 -12
  446. package/test/scenarios/identity.scenario.txt +0 -11
  447. package/test/scenarios/persona-handoff.scenario.txt +0 -12
  448. package/test/scenarios/walkback.scenario.txt +0 -12
@@ -1,133 +0,0 @@
1
- /**
2
- * UX — `ensureInitialized` helper.
3
- *
4
- * Auto-init pre-flight for every Pugi command. Before this helper landed,
5
- * the only entry points that exercised the init flow were:
6
- *
7
- * 1. The explicit `pugi init` CLI subcommand.
8
- * 2. The REPL's `/init` slash (β1a r1).
9
- * 3. Engine commands (`pugi code`, `pugi build`, `pugi sync`) which
10
- * called the legacy `ensureInitialized` in `cli.ts` and threw
11
- * `Error('Run pugi init first')` if the operator ran them in a
12
- * directory without `.pugi/`.
13
- *
14
- * Read-only commands (`pugi explain`, `pugi review`, `pugi plan`,
15
- * `pugi smoke`, `pugi chain new`, ...) silently no-op'd the `.pugi/`
16
- * mirror inside the engine adapter, which made early dogfooding
17
- * confusing — the operator saw a successful command but no session
18
- * artifacts on disk and no idea why.
19
- *
20
- * Auto-init contract (matches CEO directive ):
21
- *
22
- * - `.pugi/` already exists → return `{ status: 'already' }` silently.
23
- * - Interactive TTY + no `.pugi/` → prompt
24
- * "No Pugi workspace found here. Initialize? (Y/n)".
25
- * Default Y. On Y: run `scaffoldPugiWorkspace`, return `{ status:
26
- * 'initialized' }`. On n: return `{ status: 'declined' }` so the
27
- * caller can bail with a helpful message.
28
- * - Non-interactive (CI / pipe / --json / --no-tty) + no `.pugi/`:
29
- * default behaviour is conservative — return `{ status: 'declined',
30
- * reason: 'non_interactive' }`. The caller decides how to surface
31
- * this (engine commands bail with a clean error; read-only
32
- * commands MAY continue with degraded semantics).
33
- * - `--no-init` flag forces conservative posture even on interactive
34
- * terminals (operator wants to fail fast).
35
- *
36
- * Session cache: a command pre-flight that already prompted for and
37
- * scaffolded `.pugi/` MUST NOT re-prompt for the same workspace in the
38
- * same process. The cache key is the absolute workspace root path. The
39
- * cache is process-local (Map) — it does not persist across `pugi`
40
- * invocations (a second `pugi code` in the same shell starts fresh and
41
- * re-checks the filesystem).
42
- *
43
- * This module is intentionally framework-free: no Ink, no React, no
44
- * readline. The prompt reader is injected via the `prompt` callback so
45
- * the spec can drive the helper deterministically and the CLI can
46
- * forward to its existing stdin-reader (`readSingleChoice` in cli.ts).
47
- */
48
- import { existsSync, statSync } from 'node:fs';
49
- import { resolve } from 'node:path';
50
- /**
51
- * Process-local cache of workspaces that already passed the pre-flight
52
- * gate. Keyed by absolute root path. The cache is intentionally
53
- * additive-only — there is no eviction. A long-running REPL session
54
- * stays in one workspace and we never want to re-prompt within it.
55
- */
56
- const initialisedCache = new Set();
57
- /**
58
- * Reset the cache. Exported for spec teardown — production callers
59
- * never need this.
60
- */
61
- export function resetInitializedCache() {
62
- initialisedCache.clear();
63
- }
64
- /**
65
- * Detect `.pugi/` at `root`. Pure filesystem read; swallows permission
66
- * errors (returns false). Exported so the spec can assert the same
67
- * detection the helper uses without re-implementing the check.
68
- */
69
- export function hasPugiWorkspace(root) {
70
- const path = resolve(root, '.pugi');
71
- try {
72
- if (!existsSync(path))
73
- return false;
74
- return statSync(path).isDirectory();
75
- }
76
- catch {
77
- return false;
78
- }
79
- }
80
- /**
81
- * Auto-init pre-flight. Idempotent and process-cache aware — calling
82
- * twice in the same process for the same workspace returns `already`
83
- * the second time even if the filesystem state changed underneath.
84
- *
85
- * Implementation notes:
86
- *
87
- * - Returns `{ status: 'already' }` when `.pugi/` exists OR the cache
88
- * remembers this workspace. The cache short-circuit means a second
89
- * command in the same process never blocks on the prompt.
90
- * - Interactive + missing → prompt. The default answer (empty input
91
- * OR a leading `y` / `yes`) maps to scaffold. Anything else
92
- * (`n`, `no`, `cancel`, whitespace + non-y) maps to declined.
93
- * - Scaffolder failures propagate to the caller; the helper does
94
- * NOT swallow them because a failed scaffold means the operator's
95
- * command cannot continue anyway. Tests assert this.
96
- */
97
- export async function ensureInitialized(opts) {
98
- const root = resolve(opts.cwd ?? process.cwd());
99
- if (initialisedCache.has(root)) {
100
- return { status: 'already', root };
101
- }
102
- if (hasPugiWorkspace(root)) {
103
- initialisedCache.add(root);
104
- return { status: 'already', root };
105
- }
106
- if (opts.skip) {
107
- return { status: 'declined', root, reason: 'disabled' };
108
- }
109
- if (!opts.interactive) {
110
- return { status: 'declined', root, reason: 'non_interactive' };
111
- }
112
- if (!opts.prompt) {
113
- // Defensive — an interactive caller forgot к wire the prompt
114
- // reader. Treat the same as non-interactive rather than throwing
115
- // so the surrounding command can degrade gracefully.
116
- return { status: 'declined', root, reason: 'non_interactive' };
117
- }
118
- const write = opts.write ?? ((line) => process.stderr.write(line));
119
- write(`No Pugi workspace found at ${root}.\n`);
120
- const answer = (await opts.prompt('Initialize a new Pugi workspace here? (Y/n) ')).trim().toLowerCase();
121
- // Default = yes (empty input OR leading 'y'). Anything else = no.
122
- // Mirrors the gh CLI / the upstream prompt convention where the upper-
123
- // case option in `(Y/n)` is the default-on-Enter answer.
124
- const acceptedShort = answer === '' || answer === 'y' || answer === 'yes';
125
- if (!acceptedShort) {
126
- write('Initialization declined.\n');
127
- return { status: 'declined', root, reason: 'user_declined' };
128
- }
129
- await opts.scaffold({ cwd: root });
130
- initialisedCache.add(root);
131
- return { status: 'initialized', root };
132
- }
133
- //# sourceMappingURL=ensure-initialized.js.map
@@ -1,111 +0,0 @@
1
- /**
2
- * — Onboarding marker file.
3
- *
4
- * `~/.pugi/.onboarded` is a single, contentless marker. Its existence
5
- * tells the bare-invocation hint check that the operator has already
6
- * walked the `/onboarding` wizard at least once, so we no longer print
7
- * the "Tip: run `pugi onboarding` to configure defaults" line on
8
- * cold-start. The wizard re-runs cleanly — idempotency lives in the
9
- * wizard itself, not in the marker.
10
- *
11
- * Why a marker file (and not just `~/.pugi/config.json`'s existence)?
12
- *
13
- * - The config file is touched the moment ANY surface writes a
14
- * default — `pugi style terse --persist`, `pugi permissions ask`,
15
- * `pugi config set …`. Using "config exists" as the proxy for
16
- * "operator has onboarded" would silence the first-run hint for
17
- * operators who never saw the wizard.
18
- *
19
- * - The marker is explicit: it is written ONLY by the wizard's exit
20
- * step (or `pugi onboarding --mark-only` for the upgrade-path
21
- * where we want to suppress the hint without forcing a re-walk).
22
- *
23
- * - Removing the marker (`rm ~/.pugi/.onboarded`) re-arms the hint
24
- * without nuking the operator's accumulated config — useful for
25
- * QA, support flows, and demo-machine resets.
26
- *
27
- * Path resolution mirrors the L6/L18 convention: `PUGI_HOME` env wins,
28
- * else `~/.pugi`. The marker is touched as an empty file (no JSON, no
29
- * timestamp payload) — readers MUST treat existence as the only signal
30
- * so a future change to mtime semantics does not break us.
31
- *
32
- * IO contract:
33
- * - `isOnboarded(env)` — pure read; never throws, returns false on
34
- * any fs error so a corrupted home dir cannot hide the hint.
35
- * - `markOnboarded(env)` — best-effort write; creates `<home>/.pugi/`
36
- * if missing, mode 0o600 on the marker so it never lands in a
37
- * world-readable backup.
38
- * - `clearOnboarded(env)` — best-effort delete; absent file is a
39
- * no-op (not an error). Used by `pugi onboarding --reset` and the
40
- * spec teardown.
41
- */
42
- import { existsSync, mkdirSync, rmSync, writeFileSync, } from 'node:fs';
43
- import { homedir } from 'node:os';
44
- import { resolve } from 'node:path';
45
- /**
46
- * Env override for `~/.pugi`. Same convention as L6 / L18 — spec
47
- * fixtures point this at a temp dir so a real developer machine never
48
- * lands a stray marker.
49
- */
50
- export const PUGI_HOME_ENV = 'PUGI_HOME';
51
- /**
52
- * Marker basename. Hidden (leading dot) so it does not clutter `ls`
53
- * inside `~/.pugi/` next to `config.json` / `session.json`.
54
- */
55
- const MARKER_BASENAME = '.onboarded';
56
- /**
57
- * Resolve the absolute path to the onboarding marker. Exported for the
58
- * spec; production callers go through `isOnboarded` / `markOnboarded`.
59
- */
60
- export function onboardingMarkerPath(env = process.env) {
61
- const home = env[PUGI_HOME_ENV] ?? resolve(homedir(), '.pugi');
62
- return resolve(home, MARKER_BASENAME);
63
- }
64
- /**
65
- * True when the marker exists. Pure read. Defensive: any fs error
66
- * (race with deletion, permission flip) degrades to `false` — printing
67
- * the hint twice is harmless, silently swallowing the wizard would
68
- * surprise the operator.
69
- */
70
- export function isOnboarded(env = process.env) {
71
- try {
72
- return existsSync(onboardingMarkerPath(env));
73
- }
74
- catch {
75
- return false;
76
- }
77
- }
78
- /**
79
- * Touch the marker. Creates `<home>/.pugi/` if missing. Idempotent —
80
- * re-touching an existing marker is a no-op for the consumer (the file
81
- * was already there; the hint was already suppressed).
82
- *
83
- * Best-effort: a write failure is swallowed because the wizard already
84
- * completed its real work (mode + style + telemetry were persisted).
85
- * The worst case is a redundant hint on the next `pugi` invocation —
86
- * preferable to crashing the freshly-completed wizard with a stat EIO.
87
- */
88
- export function markOnboarded(env = process.env) {
89
- const path = onboardingMarkerPath(env);
90
- try {
91
- mkdirSync(resolve(path, '..'), { recursive: true });
92
- writeFileSync(path, '', { encoding: 'utf8', mode: 0o600 });
93
- }
94
- catch {
95
- // intentionally swallowed — see header
96
- }
97
- }
98
- /**
99
- * Remove the marker. Used by `pugi onboarding --reset` (and the spec
100
- * teardown). Absent file is a no-op; any other fs error is swallowed
101
- * so a permission glitch never leaks out of the reset surface.
102
- */
103
- export function clearOnboarded(env = process.env) {
104
- try {
105
- rmSync(onboardingMarkerPath(env), { force: true });
106
- }
107
- catch {
108
- // intentionally swallowed — see header
109
- }
110
- }
111
- //# sourceMappingURL=marker.js.map
@@ -1,108 +0,0 @@
1
- /**
2
- * — Telemetry consent state.
3
- *
4
- * The onboarding wizard's Step 5 asks the operator for telemetry
5
- * consent. We persist the verdict in the user-tier
6
- * `~/.pugi/config.json::telemetry` field so a future REPL boot can
7
- * read it without re-asking. Choices mirror `core/settings.ts`'s
8
- * `privacy.telemetry` enum:
9
- *
10
- * - `off` — no telemetry of any kind (default).
11
- * - `anonymous` — counts + error categories only, no payloads.
12
- * - `community` — anonymous + opt-in skill/usage panels.
13
- *
14
- * This module is intentionally narrow: it only owns the `telemetry`
15
- * key inside `~/.pugi/config.json`. The full settings parsing lives in
16
- * `core/settings.ts` (workspace-tier `.pugi/settings.json`); we do NOT
17
- * route through it here because:
18
- *
19
- * 1. The settings schema is workspace-scoped — its file path is
20
- * `<root>/.pugi/settings.json`, not `~/.pugi/config.json`.
21
- * 2. The wizard records a user-level default that workspace settings
22
- * can later override. Mixing the two would conflate scope.
23
- * 3. Read-modify-write on a partial JSON file is the same pattern
24
- * L6 / L18 use for adjacent keys — keeping it self-contained
25
- * preserves the "one module, one key" invariant.
26
- */
27
- import { existsSync, mkdirSync, readFileSync, writeFileSync, } from 'node:fs';
28
- import { homedir } from 'node:os';
29
- import { dirname, resolve } from 'node:path';
30
- import { PUGI_HOME_ENV } from './marker.js';
31
- export const TELEMETRY_CHOICES = Object.freeze([
32
- 'off',
33
- 'anonymous',
34
- 'community',
35
- ]);
36
- export const DEFAULT_TELEMETRY = 'off';
37
- /**
38
- * Path to the user-tier config. Mirrors `userConfigPath()` from L18
39
- * `output-style/state.ts` — duplicated here (not imported) to keep the
40
- * marker + telemetry module self-contained. Any future drift between
41
- * the two would surface a spec failure: both modules read the same
42
- * file in the spec sandbox.
43
- */
44
- export function telemetryConfigPath(env = process.env) {
45
- const home = env[PUGI_HOME_ENV] ?? resolve(homedir(), '.pugi');
46
- return resolve(home, 'config.json');
47
- }
48
- /**
49
- * Type guard for arbitrary string input (CLI argv, config.json
50
- * deserialisation). Returns false for any non-string or out-of-set
51
- * value so a malformed config degrades to the default verdict.
52
- */
53
- export function isTelemetryChoice(value) {
54
- return (typeof value === 'string'
55
- && TELEMETRY_CHOICES.includes(value));
56
- }
57
- /**
58
- * Read the persisted telemetry verdict. Returns the default (`'off'`)
59
- * when the file is absent, empty, malformed, or holds an unknown
60
- * value. Never throws — the wizard re-asks every time it runs, so a
61
- * defensive read is the right posture.
62
- */
63
- export function readTelemetryChoice(io = {}) {
64
- const config = readConfigFile(telemetryConfigPath(io.env ?? process.env));
65
- return isTelemetryChoice(config.telemetry) ? config.telemetry : DEFAULT_TELEMETRY;
66
- }
67
- /**
68
- * Persist the telemetry verdict. Read-modify-write preserves any
69
- * neighbouring keys (`outputStyle`, `defaultPermissionMode`, …) the
70
- * other tier-state modules own.
71
- */
72
- export function writeTelemetryChoice(choice, io = {}) {
73
- const path = telemetryConfigPath(io.env ?? process.env);
74
- const config = readConfigFile(path);
75
- config.telemetry = choice;
76
- writeConfigFile(path, config);
77
- }
78
- function readConfigFile(path) {
79
- if (!existsSync(path))
80
- return {};
81
- let raw;
82
- try {
83
- raw = readFileSync(path, 'utf8');
84
- }
85
- catch {
86
- return {};
87
- }
88
- if (raw.trim().length === 0)
89
- return {};
90
- let parsed;
91
- try {
92
- parsed = JSON.parse(raw);
93
- }
94
- catch {
95
- return {};
96
- }
97
- if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
98
- return {};
99
- return parsed;
100
- }
101
- function writeConfigFile(path, config) {
102
- mkdirSync(dirname(path), { recursive: true });
103
- writeFileSync(path, `${JSON.stringify(config, null, 2)}\n`, {
104
- encoding: 'utf8',
105
- mode: 0o600,
106
- });
107
- }
108
- //# sourceMappingURL=telemetry-state.js.map
@@ -1,176 +0,0 @@
1
- /**
2
- * — Output-style presets.
3
- *
4
- * Mirror of the upstream tool's `/output-style` surface: a small closed set of
5
- * named voice presets the operator can flip between at session start so
6
- * the model's prose lands in the register they prefer. The preset
7
- * compiles into an `<output-style>` rule block appended to the engine
8
- * system prompt; tool-use / code-block formatting / file edits are NOT
9
- * affected — the preset only steers prose register.
10
- *
11
- * Design contract:
12
- *
13
- * - The catalogue is intentionally tiny (5 entries) so the operator
14
- * can hold the full surface in working memory. Adding entries means
15
- * adding a row in `OUTPUT_STYLES` plus a spec assertion; there is
16
- * no plugin surface today.
17
- *
18
- * - `default` is the only preset that emits NO rule block. The
19
- * "current Pugi voice" already lives in the base engine prompt
20
- * (jargon ban, brand voice, terse register), so re-stating it
21
- * under `<output-style>` would double the model's instruction load
22
- * for the most-common case. Other presets emit the block.
23
- *
24
- * - Rule-block prose stays terse and operator-grade (brandbook §08).
25
- * No friendly hedging, no AI-assistant framing. The bullets are
26
- * the model's contract; the section title carries the preset name
27
- * so the model can self-correct mid-turn if it drifts ("I am in
28
- * terse mode → drop articles").
29
- *
30
- * - The Russian-formal preset uses вы-form explicitly. Russian/
31
- * Ukrainian chat is permitted by the base voice contract; this
32
- * preset hardens the register for B2B / enterprise demo flows
33
- * where ты-form reads as too casual.
34
- *
35
- * - The Casual preset RELAXES the jargon ban — contractions, jokes,
36
- * informal phrasing are allowed. It does NOT lift the brand-voice
37
- * em-dash / emoji ban; those are typographic, not register, and
38
- * remain off across every preset.
39
- *
40
- * Test surface: `test/commands/output-style-presets.spec.ts` exercises
41
- * the catalogue invariants (5 entries, unique slugs, every non-default
42
- * preset emits a non-empty block, the block starts with the expected
43
- * marker so the engine prompt appender can locate it for stripping).
44
- */
45
- /**
46
- * The closed list of preset slugs in catalogue order. Mirror used by
47
- * the CLI surface (`/style` table, `pugi style --list`) so the
48
- * operator sees presets in a stable order regardless of catalogue
49
- * iteration order.
50
- */
51
- export const OUTPUT_STYLE_SLUGS = Object.freeze([
52
- 'default',
53
- 'terse',
54
- 'explanatory',
55
- 'russian-formal',
56
- 'casual',
57
- ]);
58
- /**
59
- * Default slug used when no workspace-/user-level preference is set.
60
- * Exported so `state.ts` and the CLI handler share one constant.
61
- */
62
- export const DEFAULT_OUTPUT_STYLE = 'default';
63
- /**
64
- * Catalogue keyed by slug. Frozen so callers cannot mutate the
65
- * shared rows; the CLI handler returns slugs, not preset references,
66
- * to keep the boundary clean.
67
- */
68
- export const OUTPUT_STYLES = Object.freeze({
69
- default: Object.freeze({
70
- slug: 'default',
71
- title: 'Default',
72
- gloss: 'Current Pugi voice (no override). Base engine prompt rules apply unchanged.',
73
- rules: Object.freeze([]),
74
- }),
75
- terse: Object.freeze({
76
- slug: 'terse',
77
- title: 'Terse',
78
- gloss: 'Fragments, dropped articles, one short sentence per turn.',
79
- rules: Object.freeze([
80
- 'Drop articles, fillers, hedging',
81
- '1 short sentence per turn for prose answers',
82
- 'Code blocks unchanged — never abbreviate code',
83
- 'Quote errors verbatim with no paraphrase',
84
- ]),
85
- }),
86
- explanatory: Object.freeze({
87
- slug: 'explanatory',
88
- title: 'Explanatory',
89
- gloss: 'Verbose, walks reasoning step by step, links concepts.',
90
- rules: Object.freeze([
91
- 'Explain reasoning, not just the conclusion',
92
- 'Cite relevant files + line numbers when grounding claims',
93
- 'Link adjacent concepts the operator may want to chase',
94
- 'Code blocks unchanged — annotate around, not inside',
95
- ]),
96
- }),
97
- 'russian-formal': Object.freeze({
98
- slug: 'russian-formal',
99
- title: 'Russian formal',
100
- gloss: 'Russian вы-form, professional register, no slang.',
101
- rules: Object.freeze([
102
- 'Pisat\' otvety po-russki (Russian prose; ASCII transliteration permitted in this rule block only)',
103
- 'Address the operator using вы-form, never ты',
104
- 'No slang, no contractions of Russian forms',
105
- 'Code blocks + identifiers stay in English unchanged',
106
- 'Error messages quoted verbatim in the original language',
107
- ]),
108
- }),
109
- casual: Object.freeze({
110
- slug: 'casual',
111
- title: 'Casual',
112
- gloss: 'Informal register, contractions OK, dry jokes welcome.',
113
- rules: Object.freeze([
114
- 'Contractions allowed (it\'s, don\'t, you\'re)',
115
- 'Dry, deadpan jokes welcome when they do not displace signal',
116
- 'No em-dashes, no emoji — typographic rules unchanged',
117
- 'Stay terse — casual is register, not verbosity',
118
- ]),
119
- }),
120
- });
121
- /**
122
- * Type-narrowing predicate. Used by the slash-command parser + state
123
- * loader so an unknown string from operator input or a stale config
124
- * file degrades to the default preset instead of crashing.
125
- */
126
- export function isOutputStyleSlug(value) {
127
- return (typeof value === 'string'
128
- && OUTPUT_STYLE_SLUGS.includes(value));
129
- }
130
- /**
131
- * Compile a preset into the `<output-style>` rule block injected at
132
- * the tail of the engine system prompt.
133
- *
134
- * Returns empty string when the preset is `default` (or any preset
135
- * with an empty rules array). Empty string is a load-bearing signal —
136
- * the engine prompt appender uses it to skip injection entirely so
137
- * the model sees a clean prompt for the default register.
138
- *
139
- * The block opens with `<output-style>` and closes with `</output-style>`
140
- * (XML-shaped marker, matching the engine prompt's existing `<intent>`
141
- * grammar). The `Active style:` line gives the model a self-correction
142
- * anchor when it drifts mid-turn.
143
- */
144
- export function compileStyleBlock(slug) {
145
- const preset = OUTPUT_STYLES[slug];
146
- if (preset.rules.length === 0)
147
- return '';
148
- const lines = [];
149
- lines.push('<output-style>');
150
- lines.push(` Active style: ${preset.slug}`);
151
- for (const rule of preset.rules) {
152
- lines.push(` - ${rule}`);
153
- }
154
- lines.push('</output-style>');
155
- return lines.join('\n');
156
- }
157
- /**
158
- * Render the preset catalogue as a plain-text table for the `/style`
159
- * + `pugi style` surfaces. Marks the active slug with `*` so the
160
- * operator can see at a glance which preset is in effect.
161
- *
162
- * Pure renderer (no fs, no env). Identical text is emitted from both
163
- * the slash dispatcher and the top-level CLI command so operators
164
- * trained on one surface read the same table on the other.
165
- */
166
- export function renderStyleTable(active) {
167
- const slugWidth = Math.max('NAME'.length, ...OUTPUT_STYLE_SLUGS.map((slug) => slug.length));
168
- const header = `${'NAME'.padEnd(slugWidth)} GLOSS`;
169
- const rows = OUTPUT_STYLE_SLUGS.map((slug) => {
170
- const preset = OUTPUT_STYLES[slug];
171
- const marker = slug === active ? '*' : ' ';
172
- return `${marker} ${slug.padEnd(slugWidth)} ${preset.gloss}`;
173
- });
174
- return [header, ...rows].join('\n');
175
- }
176
- //# sourceMappingURL=presets.js.map