@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.
- package/LICENSE +1 -1
- package/README.md +11 -191
- package/bin/pugi +8 -0
- package/package.json +15 -71
- package/postinstall.mjs +31 -0
- package/CHANGELOG.md +0 -132
- package/THIRD_PARTY_NOTICES.md +0 -40
- package/assets/pugi-mascot.ansi +0 -16
- package/assets/pugi-prozr2-mascot.ansi +0 -9
- package/bin/run.js +0 -34
- package/dist/commands/deploy.js +0 -439
- package/dist/commands/flatten.js +0 -191
- package/dist/commands/jobs-watch.js +0 -201
- package/dist/commands/jobs.js +0 -260
- package/dist/commands/retro.js +0 -210
- package/dist/commands/smoke.js +0 -133
- package/dist/core/agent-progress/cleanup.js +0 -134
- package/dist/core/agent-progress/schema.js +0 -144
- package/dist/core/agent-progress/writer.js +0 -101
- package/dist/core/agents/adaptive-router.js +0 -330
- package/dist/core/agents/loader.js +0 -104
- package/dist/core/agents/query-decomposer.js +0 -297
- package/dist/core/agents/registry.js +0 -69
- package/dist/core/approvals/shortcut-resolver.js +0 -98
- package/dist/core/artifact-chain/dispatcher.js +0 -148
- package/dist/core/artifact-chain/exporter.js +0 -164
- package/dist/core/artifact-chain/state.js +0 -243
- package/dist/core/artifact-chain/steps.js +0 -169
- package/dist/core/ask-user/question.js +0 -92
- package/dist/core/audit/audit-trail.js +0 -275
- package/dist/core/auth/ensure-authenticated.js +0 -129
- package/dist/core/auth/env-provider.js +0 -238
- package/dist/core/auto-open-browser.js +0 -128
- package/dist/core/auto-update/channels.js +0 -122
- package/dist/core/auto-update/checker.js +0 -241
- package/dist/core/auto-update/state.js +0 -235
- package/dist/core/bare-mode/index.js +0 -107
- package/dist/core/bash/redirect.js +0 -281
- package/dist/core/bash-classifier.js +0 -1397
- package/dist/core/checkpoint/resumer.js +0 -149
- package/dist/core/checkpoint/rewinder.js +0 -291
- package/dist/core/checkpoints/shadow-git.js +0 -670
- package/dist/core/citations/parser.js +0 -109
- package/dist/core/classifier/yolo-classifier.js +0 -88
- package/dist/core/clipboard.js +0 -70
- package/dist/core/codegraph/decision-store.js +0 -248
- package/dist/core/codegraph/detect-repo.js +0 -459
- package/dist/core/codegraph/install.js +0 -134
- package/dist/core/codegraph/offer-hook.js +0 -220
- package/dist/core/compact/auto-trigger.js +0 -96
- package/dist/core/compact/buffer-rewriter.js +0 -115
- package/dist/core/compact/summarizer.js +0 -208
- package/dist/core/compact/token-counter.js +0 -108
- package/dist/core/consensus/anvil-fanout.js +0 -276
- package/dist/core/consensus/diff-capture.js +0 -491
- package/dist/core/consensus/rubric.js +0 -233
- package/dist/core/context/builder.js +0 -114
- package/dist/core/context/compaction-events.js +0 -99
- package/dist/core/context/compaction.js +0 -602
- package/dist/core/context/index.js +0 -28
- package/dist/core/context/invariants.js +0 -250
- package/dist/core/context/markdown-loader.js +0 -288
- package/dist/core/context/markdown-traverse.js +0 -255
- package/dist/core/context/pugiignore.js +0 -316
- package/dist/core/context/repo-skeleton.js +0 -533
- package/dist/core/context/tool-eviction.js +0 -55
- package/dist/core/context/watcher.js +0 -342
- package/dist/core/context/working-set.js +0 -165
- package/dist/core/coordinator/agent-tools.js +0 -77
- package/dist/core/coordinator/agent-toolset.js +0 -65
- package/dist/core/coordinator/fsm.js +0 -73
- package/dist/core/coordinator/mode-fsm.js +0 -70
- package/dist/core/cost/rate-card.js +0 -129
- package/dist/core/cost/tracker.js +0 -221
- package/dist/core/credentials.js +0 -355
- package/dist/core/cron/scheduler.js +0 -138
- package/dist/core/denial-tracking/index.js +0 -8
- package/dist/core/denial-tracking/state.js +0 -264
- package/dist/core/diagnostics/probe-runner.js +0 -93
- package/dist/core/diagnostics/probes/api.js +0 -46
- package/dist/core/diagnostics/probes/auth.js +0 -93
- package/dist/core/diagnostics/probes/bare-mode.js +0 -42
- package/dist/core/diagnostics/probes/cli-version.js +0 -127
- package/dist/core/diagnostics/probes/config.js +0 -72
- package/dist/core/diagnostics/probes/denial-tracking.js +0 -57
- package/dist/core/diagnostics/probes/disk.js +0 -81
- package/dist/core/diagnostics/probes/engine-live.js +0 -46
- package/dist/core/diagnostics/probes/git.js +0 -65
- package/dist/core/diagnostics/probes/hooks.js +0 -118
- package/dist/core/diagnostics/probes/mcp.js +0 -75
- package/dist/core/diagnostics/probes/node.js +0 -59
- package/dist/core/diagnostics/probes/pnpm.js +0 -36
- package/dist/core/diagnostics/probes/pugi-md.js +0 -89
- package/dist/core/diagnostics/probes/sandbox.js +0 -72
- package/dist/core/diagnostics/probes/session.js +0 -74
- package/dist/core/diagnostics/probes/status-snapshot.js +0 -488
- package/dist/core/diagnostics/probes/workspace.js +0 -63
- package/dist/core/diagnostics/types.js +0 -70
- package/dist/core/dispatch/cache-cleanup.js +0 -197
- package/dist/core/dispatch/cache-handoff.js +0 -295
- package/dist/core/edits/apply-patch-layer-e.js +0 -189
- package/dist/core/edits/dispatch.js +0 -511
- package/dist/core/edits/format-detector.js +0 -260
- package/dist/core/edits/format-matrix.js +0 -26
- package/dist/core/edits/fuzzy-ladder.js +0 -650
- package/dist/core/edits/index.js +0 -19
- package/dist/core/edits/journal.js +0 -199
- package/dist/core/edits/layer-a-apply.js +0 -217
- package/dist/core/edits/layer-a-fuzzy-apply.js +0 -198
- package/dist/core/edits/layer-b-apply.js +0 -211
- package/dist/core/edits/layer-c-apply.js +0 -160
- package/dist/core/edits/layer-d-ast.js +0 -572
- package/dist/core/edits/marker-parser.js +0 -401
- package/dist/core/edits/security-gate.js +0 -223
- package/dist/core/edits/verify-hook.js +0 -273
- package/dist/core/edits/worktree.js +0 -322
- package/dist/core/engine/adapter-runner.js +0 -8
- package/dist/core/engine/anvil-client.js +0 -344
- package/dist/core/engine/auto-compact.js +0 -179
- package/dist/core/engine/budgets.js +0 -195
- package/dist/core/engine/context-prefix.js +0 -155
- package/dist/core/engine/index.js +0 -12
- package/dist/core/engine/intensity.js +0 -163
- package/dist/core/engine/intent.js +0 -260
- package/dist/core/engine/native-pugi.js +0 -1616
- package/dist/core/engine/noop.js +0 -27
- package/dist/core/engine/prompts.js +0 -236
- package/dist/core/engine/strip-internal-fields.js +0 -124
- package/dist/core/engine/tool-bridge.js +0 -2173
- package/dist/core/engine/verification-patterns.js +0 -195
- package/dist/core/evaluation/golden-dataset.js +0 -293
- package/dist/core/feedback/queue.js +0 -177
- package/dist/core/feedback/submitter.js +0 -145
- package/dist/core/file-cache.js +0 -141
- package/dist/core/flatten/flatten-repo.js +0 -439
- package/dist/core/format/osc8-link.js +0 -28
- package/dist/core/hook-chains.js +0 -392
- package/dist/core/hooks/citation-verify-hook.js +0 -138
- package/dist/core/hooks/citation-verify.js +0 -112
- package/dist/core/hooks/events.js +0 -46
- package/dist/core/hooks/index.js +0 -15
- package/dist/core/hooks/registry.js +0 -216
- package/dist/core/hooks/runner.js +0 -236
- package/dist/core/hooks/v2/event-emitter.js +0 -115
- package/dist/core/hooks/v2/executor.js +0 -282
- package/dist/core/hooks/v2/index.js +0 -25
- package/dist/core/hooks/v2/lifecycle.js +0 -104
- package/dist/core/hooks/v2/loader.js +0 -216
- package/dist/core/hooks/v2/matcher.js +0 -125
- package/dist/core/hooks/v2/trust.js +0 -143
- package/dist/core/hooks/v2/types.js +0 -86
- package/dist/core/hooks/worktree-events.js +0 -158
- package/dist/core/hooks.js +0 -415
- package/dist/core/image/renderer.js +0 -71
- package/dist/core/index-store.js +0 -260
- package/dist/core/init/detector.js +0 -582
- package/dist/core/init/template-renderer.js +0 -242
- package/dist/core/jobs/registry.js +0 -462
- package/dist/core/ledger/results-tsv.js +0 -142
- package/dist/core/log-discipline/stdout-redirect.js +0 -51
- package/dist/core/lsp/cache.js +0 -105
- package/dist/core/lsp/client.js +0 -1229
- package/dist/core/lsp/language-detect.js +0 -66
- package/dist/core/lsp/post-edit-diagnostics.js +0 -171
- package/dist/core/lsp/server-detect.js +0 -173
- package/dist/core/lsp/symbol-cache.js +0 -162
- package/dist/core/lsp/symbol-tools.js +0 -664
- package/dist/core/mcp/client.js +0 -385
- package/dist/core/mcp/http-server.js +0 -553
- package/dist/core/mcp/orchestrator-config.js +0 -192
- package/dist/core/mcp/orchestrator-tools.js +0 -806
- package/dist/core/mcp/permission.js +0 -190
- package/dist/core/mcp/registry.js +0 -193
- package/dist/core/mcp/server-tools.js +0 -219
- package/dist/core/mcp/server.js +0 -397
- package/dist/core/mcp/trust.js +0 -91
- package/dist/core/memory/dual-write.js +0 -416
- package/dist/core/memory/passive-extract.js +0 -130
- package/dist/core/memory/phase1-kinds.js +0 -20
- package/dist/core/memory/secret-scanner.js +0 -304
- package/dist/core/memory-sync/queue.js +0 -170
- package/dist/core/metrics/extract.js +0 -113
- package/dist/core/modes/roo-modes.js +0 -68
- package/dist/core/onboarding/ensure-initialized.js +0 -133
- package/dist/core/onboarding/marker.js +0 -111
- package/dist/core/onboarding/telemetry-state.js +0 -108
- package/dist/core/output-style/presets.js +0 -176
- package/dist/core/output-style/state.js +0 -185
- package/dist/core/path-security.js +0 -345
- package/dist/core/permission.js +0 -369
- package/dist/core/permissions/auto-classifier.js +0 -124
- package/dist/core/permissions/bash-parser.js +0 -371
- package/dist/core/permissions/circuit-breaker.js +0 -83
- package/dist/core/permissions/constrained-edit.js +0 -91
- package/dist/core/permissions/gate.js +0 -278
- package/dist/core/permissions/index.js +0 -20
- package/dist/core/permissions/mode.js +0 -174
- package/dist/core/permissions/network-egress.js +0 -137
- package/dist/core/permissions/state.js +0 -241
- package/dist/core/permissions/tool-class.js +0 -107
- package/dist/core/plan-mode/ui-state.js +0 -51
- package/dist/core/plans/plan-artifact.js +0 -721
- package/dist/core/policy-limits/etag-store.js +0 -122
- package/dist/core/prd-check/parser.js +0 -215
- package/dist/core/prd-check/reporter.js +0 -127
- package/dist/core/prd-check/session-review.js +0 -557
- package/dist/core/prd-check/verifiers.js +0 -223
- package/dist/core/prompt-cache/client-cache.js +0 -99
- package/dist/core/prompts/assembly.js +0 -29
- package/dist/core/prompts/registry.js +0 -364
- package/dist/core/pugi-gitignore.js +0 -52
- package/dist/core/pugi-md/cc-compat-rules.js +0 -735
- package/dist/core/pugi-md/context-injector.js +0 -76
- package/dist/core/pugi-md/walk-up.js +0 -207
- package/dist/core/python/uv-installer.js +0 -270
- package/dist/core/python/uv-resolver.js +0 -83
- package/dist/core/rate-limit/narrator.js +0 -146
- package/dist/core/recipes/cli-types.js +0 -20
- package/dist/core/recipes/loader.js +0 -103
- package/dist/core/recipes/runner.js +0 -345
- package/dist/core/recipes/schema.js +0 -587
- package/dist/core/release-notes/parser.js +0 -241
- package/dist/core/release-notes/state.js +0 -116
- package/dist/core/repl/ask.js +0 -512
- package/dist/core/repl/cancellation.js +0 -98
- package/dist/core/repl/cap-warning.js +0 -91
- package/dist/core/repl/clipboard-read.js +0 -174
- package/dist/core/repl/dispatch-fsm.js +0 -220
- package/dist/core/repl/engine-bridge.js +0 -303
- package/dist/core/repl/history-search.js +0 -175
- package/dist/core/repl/history.js +0 -182
- package/dist/core/repl/kill-ring.js +0 -138
- package/dist/core/repl/model-pricing.js +0 -135
- package/dist/core/repl/privacy-banner.js +0 -71
- package/dist/core/repl/session.js +0 -4962
- package/dist/core/repl/slash-commands.js +0 -747
- package/dist/core/repl/store/index.js +0 -12
- package/dist/core/repl/store/jsonl-log.js +0 -321
- package/dist/core/repl/store/lockfile.js +0 -155
- package/dist/core/repl/store/session-store.js +0 -821
- package/dist/core/repl/store/types.js +0 -44
- package/dist/core/repl/store/uuid-v7.js +0 -68
- package/dist/core/repl/tool-route.js +0 -382
- package/dist/core/repl/workspace-context.js +0 -206
- package/dist/core/repo-map/build.js +0 -125
- package/dist/core/repo-map/cache.js +0 -185
- package/dist/core/repo-map/extractor.js +0 -254
- package/dist/core/repo-map/formatter.js +0 -145
- package/dist/core/repo-map/page-rank.js +0 -105
- package/dist/core/repo-map/scanner.js +0 -211
- package/dist/core/retro/git-collector.js +0 -251
- package/dist/core/retro/health-card.js +0 -25
- package/dist/core/retro/metrics.js +0 -342
- package/dist/core/retro/narrative.js +0 -249
- package/dist/core/retro/plane-collector.js +0 -274
- package/dist/core/retro/pr-issue-link.js +0 -65
- package/dist/core/retro/types.js +0 -16
- package/dist/core/retry-budget/budget.js +0 -284
- package/dist/core/retry-budget/index.js +0 -5
- package/dist/core/retry-budget/retry-cap.js +0 -74
- package/dist/core/routing/lead-worker.js +0 -43
- package/dist/core/routing/pre-flight-estimator.js +0 -108
- package/dist/core/runs/run-tree.js +0 -103
- package/dist/core/sandboxing/adapter.js +0 -29
- package/dist/core/sandboxing/index.js +0 -49
- package/dist/core/sandboxing/none.js +0 -19
- package/dist/core/sandboxing/seatbelt.js +0 -183
- package/dist/core/security/injection-scanner.js +0 -367
- package/dist/core/security/output-filter.js +0 -418
- package/dist/core/session/env-file.js +0 -105
- package/dist/core/session/section-budgets.js +0 -140
- package/dist/core/session.js +0 -377
- package/dist/core/settings.js +0 -400
- package/dist/core/share/formatter.js +0 -271
- package/dist/core/share/redactor.js +0 -221
- package/dist/core/share/uploader.js +0 -267
- package/dist/core/skills/defaults.js +0 -457
- package/dist/core/skills/loader.js +0 -454
- package/dist/core/skills/sources.js +0 -480
- package/dist/core/skills/trust.js +0 -172
- package/dist/core/smoke/headless-driver.js +0 -174
- package/dist/core/smoke/orchestrator.js +0 -194
- package/dist/core/smoke/runner.js +0 -238
- package/dist/core/smoke/scenario-parser.js +0 -316
- package/dist/core/statusline.js +0 -99
- package/dist/core/subagents/dispatcher-real.js +0 -600
- package/dist/core/subagents/dispatcher.js +0 -352
- package/dist/core/subagents/index.js +0 -39
- package/dist/core/subagents/isolation-matrix.js +0 -213
- package/dist/core/subagents/spawn.js +0 -101
- package/dist/core/telemetry/emitter.js +0 -229
- package/dist/core/telemetry/queue.js +0 -251
- package/dist/core/theme/context.js +0 -91
- package/dist/core/theme/presets.js +0 -228
- package/dist/core/theme/state.js +0 -181
- package/dist/core/todos/invariant.js +0 -10
- package/dist/core/todos/state.js +0 -177
- package/dist/core/tool-schema/compressor.js +0 -89
- package/dist/core/transport/version-interceptor.js +0 -166
- package/dist/core/trust.js +0 -109
- package/dist/core/tui/thinking-block.js +0 -64
- package/dist/core/vim/keymap.js +0 -288
- package/dist/core/vim/state.js +0 -92
- package/dist/core/watch-markers/marker-watcher.js +0 -133
- package/dist/core/worktree/include-parser.js +0 -249
- package/dist/core/worktree-manager/cleanup.js +0 -123
- package/dist/core/worktree-manager/manager.js +0 -303
- package/dist/index.js +0 -44
- package/dist/runtime/bootstrap.js +0 -190
- package/dist/runtime/cli.js +0 -8121
- package/dist/runtime/commands/agents.js +0 -385
- package/dist/runtime/commands/budget.js +0 -192
- package/dist/runtime/commands/cancel.js +0 -231
- package/dist/runtime/commands/chain.js +0 -489
- package/dist/runtime/commands/codegraph-status.js +0 -227
- package/dist/runtime/commands/compact.js +0 -297
- package/dist/runtime/commands/config.js +0 -595
- package/dist/runtime/commands/cost.js +0 -199
- package/dist/runtime/commands/delegate.js +0 -312
- package/dist/runtime/commands/dispatch.js +0 -126
- package/dist/runtime/commands/doctor.js +0 -579
- package/dist/runtime/commands/feedback.js +0 -184
- package/dist/runtime/commands/hooks.js +0 -187
- package/dist/runtime/commands/init.js +0 -254
- package/dist/runtime/commands/lsp.js +0 -368
- package/dist/runtime/commands/mcp.js +0 -935
- package/dist/runtime/commands/memory.js +0 -582
- package/dist/runtime/commands/model.js +0 -237
- package/dist/runtime/commands/onboarding.js +0 -275
- package/dist/runtime/commands/patch.js +0 -128
- package/dist/runtime/commands/permissions.js +0 -112
- package/dist/runtime/commands/plan.js +0 -143
- package/dist/runtime/commands/prd-check.js +0 -285
- package/dist/runtime/commands/privacy.js +0 -107
- package/dist/runtime/commands/recipe.js +0 -325
- package/dist/runtime/commands/redo-blob-store.js +0 -92
- package/dist/runtime/commands/redo.js +0 -361
- package/dist/runtime/commands/release-notes.js +0 -229
- package/dist/runtime/commands/repo-map.js +0 -95
- package/dist/runtime/commands/report.js +0 -299
- package/dist/runtime/commands/resume.js +0 -118
- package/dist/runtime/commands/review-consensus.js +0 -414
- package/dist/runtime/commands/rewind.js +0 -333
- package/dist/runtime/commands/roster.js +0 -117
- package/dist/runtime/commands/sessions.js +0 -163
- package/dist/runtime/commands/share.js +0 -316
- package/dist/runtime/commands/skills.js +0 -401
- package/dist/runtime/commands/status.js +0 -186
- package/dist/runtime/commands/stickers.js +0 -82
- package/dist/runtime/commands/style.js +0 -194
- package/dist/runtime/commands/theme.js +0 -196
- package/dist/runtime/commands/undo.js +0 -361
- package/dist/runtime/commands/update.js +0 -289
- package/dist/runtime/commands/vim.js +0 -140
- package/dist/runtime/commands/worktree.js +0 -177
- package/dist/runtime/commands/worktrees.js +0 -155
- package/dist/runtime/deprecation-warning.js +0 -69
- package/dist/runtime/engine-exit-code.js +0 -50
- package/dist/runtime/headless-repl.js +0 -195
- package/dist/runtime/headless.js +0 -548
- package/dist/runtime/load-hooks-or-exit.js +0 -71
- package/dist/runtime/plan-decompose.js +0 -531
- package/dist/runtime/sigint-guard.js +0 -272
- package/dist/runtime/stream-renderer.js +0 -195
- package/dist/runtime/update-check.js +0 -294
- package/dist/runtime/version.js +0 -65
- package/dist/runtime/worktree-bootstrap.js +0 -579
- package/dist/skills/bundled/batch.js +0 -617
- package/dist/skills/bundled/index.js +0 -45
- package/dist/skills/bundled/loop.js +0 -358
- package/dist/skills/bundled/remember.js +0 -383
- package/dist/skills/bundled/simplify.js +0 -289
- package/dist/skills/bundled/skillify.js +0 -373
- package/dist/skills/bundled/stuck.js +0 -558
- package/dist/skills/bundled/verify.js +0 -439
- package/dist/testing/vcr.js +0 -486
- package/dist/tools/agent-tool.js +0 -229
- package/dist/tools/apply-patch.js +0 -556
- package/dist/tools/ask-user-question.js +0 -337
- package/dist/tools/ask-user.js +0 -115
- package/dist/tools/bash.js +0 -1238
- package/dist/tools/brief.js +0 -224
- package/dist/tools/cron.js +0 -433
- package/dist/tools/enter-worktree.js +0 -250
- package/dist/tools/exit-worktree.js +0 -147
- package/dist/tools/file-tools.js +0 -553
- package/dist/tools/http-request.js +0 -336
- package/dist/tools/lsp-tools.js +0 -565
- package/dist/tools/mcp-tool.js +0 -260
- package/dist/tools/multi-edit.js +0 -361
- package/dist/tools/powershell.js +0 -268
- package/dist/tools/registry.js +0 -166
- package/dist/tools/server-tools.js +0 -892
- package/dist/tools/skill-tool.js +0 -96
- package/dist/tools/sleep.js +0 -99
- package/dist/tools/synthetic-output.js +0 -133
- package/dist/tools/tasks.js +0 -208
- package/dist/tools/todo-write.js +0 -184
- package/dist/tools/verify-plan-execution.js +0 -295
- package/dist/tools/web-fetch-injection-scanner.js +0 -207
- package/dist/tools/web-fetch.js +0 -720
- package/dist/tools/web-search.js +0 -458
- package/dist/tui/agent-progress-card.js +0 -111
- package/dist/tui/agent-tree-pane.js +0 -9
- package/dist/tui/agent-tree.js +0 -87
- package/dist/tui/ask-cli.js +0 -52
- package/dist/tui/ask-modal.js +0 -211
- package/dist/tui/ask-user-question-chips.js +0 -315
- package/dist/tui/ask-user-question-prompt.js +0 -203
- package/dist/tui/compact-banner.js +0 -81
- package/dist/tui/conversation-pane.js +0 -164
- package/dist/tui/cost-table.js +0 -111
- package/dist/tui/device-flow.js +0 -142
- package/dist/tui/doctor-table.js +0 -46
- package/dist/tui/feedback-prompt.js +0 -156
- package/dist/tui/input-box.js +0 -732
- package/dist/tui/login-picker.js +0 -69
- package/dist/tui/markdown-render.js +0 -266
- package/dist/tui/multi-file-diff-approval.js +0 -375
- package/dist/tui/onboarding-wizard.js +0 -240
- package/dist/tui/permissions-picker.js +0 -86
- package/dist/tui/render.js +0 -160
- package/dist/tui/repl-render.js +0 -770
- package/dist/tui/repl-splash-art.js +0 -64
- package/dist/tui/repl-splash-mascot.js +0 -154
- package/dist/tui/repl-splash.js +0 -117
- package/dist/tui/repl.js +0 -378
- package/dist/tui/slash-palette.js +0 -106
- package/dist/tui/splash-data.js +0 -61
- package/dist/tui/splash.js +0 -31
- package/dist/tui/status-bar.js +0 -209
- package/dist/tui/status-table.js +0 -7
- package/dist/tui/stickers-art.js +0 -136
- package/dist/tui/style-table.js +0 -28
- package/dist/tui/theme-table.js +0 -29
- package/dist/tui/thinking-spinner.js +0 -123
- package/dist/tui/tool-stream-pane.js +0 -140
- package/dist/tui/update-banner.js +0 -33
- package/dist/tui/vim-input.js +0 -267
- package/dist/tui/welcome-banner.js +0 -107
- package/dist/tui/welcome-data.js +0 -293
- package/dist/tui/workspace-context.js +0 -105
- package/docs/examples/codegraph.mcp.json +0 -10
- package/test/scenarios/codegen-create-file.scenario.txt +0 -13
- package/test/scenarios/compact-force.scenario.txt +0 -12
- package/test/scenarios/identity.scenario.txt +0 -11
- package/test/scenarios/persona-handoff.scenario.txt +0 -12
- package/test/scenarios/walkback.scenario.txt +0 -12
package/dist/tui/status-bar.js
DELETED
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from 'ink';
|
|
3
|
-
import { formatCostUsd, formatTokens } from '../core/repl/model-pricing.js';
|
|
4
|
-
/**
|
|
5
|
-
* Window during which the per-turn delta flash stays visible on the
|
|
6
|
-
* cost-meter row. CEO spec: ~2 seconds after completion. Past that, the
|
|
7
|
-
* flash dimms out and the row shows session totals only.
|
|
8
|
-
*/
|
|
9
|
-
const TURN_DELTA_FLASH_MS = 2_000;
|
|
10
|
-
/**
|
|
11
|
-
* Cyan dot glyphs across the pulse cycle. Three steps keep the motion
|
|
12
|
-
* subtle - a true gradient would force an Ink rerender on every
|
|
13
|
-
* 16ms frame and waste cycles on a status bar.
|
|
14
|
-
*/
|
|
15
|
-
const PULSE_DOTS = ['●', '◉', '○'];
|
|
16
|
-
export function StatusBar(props) {
|
|
17
|
-
const now = props.nowEpochMs ?? Date.now();
|
|
18
|
-
const elapsedLabel = formatElapsed(props.briefStartedAtEpochMs, now);
|
|
19
|
-
const tokenLabel = formatTokens(props.tokensDownstreamTotal);
|
|
20
|
-
const phase = clampPhase(props.pulsePhase);
|
|
21
|
-
const glyph = PULSE_DOTS[Math.min(phase, PULSE_DOTS.length - 1)] ?? PULSE_DOTS[0];
|
|
22
|
-
// : composite status label — connection problems trump dispatch
|
|
23
|
-
// state because the operator needs to know about a dropped admin-api
|
|
24
|
-
// first. When the connection is healthy (`on_watch` / `connecting`),
|
|
25
|
-
// the FSM dispatch state takes over to show the dispatch lifecycle
|
|
26
|
-
// (`dispatching` / `tool: read` / `aborting` / etc.).
|
|
27
|
-
const status = composeStatusLabel(props.connection, props.dispatchState, props.dispatchToolLabel, props.lastCompletedOutcome);
|
|
28
|
-
// cost-meter sprint — the cost row anchors above the legacy
|
|
29
|
-
// dispatch-state line so the operator's eye lands on the meter first
|
|
30
|
-
// (matches the upstream tool TUI footer rhythm). The session-elapsed slot
|
|
31
|
-
// uses sessionStartedAtEpochMs (REPL boot), distinct from the
|
|
32
|
-
// per-brief `elapsedLabel` on the row below.
|
|
33
|
-
const costRow = renderCostMeterRow(props.sessionTokensIn ?? 0, props.sessionTokensOut ?? 0, props.sessionCostUsd ?? 0, props.sessionStartedAtEpochMs, now);
|
|
34
|
-
const deltaFlash = renderTurnDeltaFlash(props.lastTurnDelta, now);
|
|
35
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: `↑ ${costRow.tokensInLabel}` }), _jsx(Text, { dimColor: true, children: ' ' }), _jsx(Text, { color: "cyan", children: `↓ ${costRow.tokensOutLabel}` }), _jsx(Text, { dimColor: true, children: ` · ` }), _jsx(Text, { bold: true, children: costRow.costLabel }), _jsx(Text, { dimColor: true, children: ` · ${costRow.elapsedLabel}` }), deltaFlash ? (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: ' ' }), _jsx(Text, { color: "green", children: deltaFlash })] })) : null] }), _jsxs(Box, { children: [_jsx(Text, { color: status.color, children: `${glyph ?? '●'} ${status.label}` }), _jsx(Text, { dimColor: true, children: ` · ${props.activeAgentCount} agents · ` }), _jsx(Text, { children: `↓ ${tokenLabel} tokens` }), _jsx(Text, { dimColor: true, children: ` · ${elapsedLabel}` }), typeof props.externalDispatchCount === 'number' && props.externalDispatchCount > 0 ? (_jsx(Text, { color: "yellow", children: ` · ${props.externalDispatchCount} dispatch${props.externalDispatchCount === 1 ? '' : 'es'} active. /cancel к manage.` })) : null] }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: `${formatCount(props.pugiMdCount)} PUGI.md · ${formatCount(props.mcpServerCount)} MCP · ${formatCount(props.skillCount)} skills · ${formatQuota(props.quotaPct)} quota` }) })] }));
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* cost-meter sprint — assemble the cost-meter row labels. Pure helper
|
|
39
|
-
* so the snapshot tests assert the formatted shape without standing up
|
|
40
|
-
* an Ink renderer.
|
|
41
|
-
*/
|
|
42
|
-
export function renderCostMeterRow(tokensIn, tokensOut, costUsd, sessionStartedAtEpochMs, nowEpochMs) {
|
|
43
|
-
const elapsedMs = typeof sessionStartedAtEpochMs === 'number'
|
|
44
|
-
? Math.max(0, nowEpochMs - sessionStartedAtEpochMs)
|
|
45
|
-
: 0;
|
|
46
|
-
return {
|
|
47
|
-
tokensInLabel: formatTokens(tokensIn),
|
|
48
|
-
tokensOutLabel: formatTokens(tokensOut),
|
|
49
|
-
costLabel: formatCostUsd(costUsd),
|
|
50
|
-
elapsedLabel: formatElapsedShort(elapsedMs),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* cost-meter sprint — render the per-turn delta flash when the most
|
|
55
|
-
* recent turn completed within the flash window. Returns null when no
|
|
56
|
-
* turn has completed yet OR the flash has expired (the elapsed slot
|
|
57
|
-
* gets the slot back). The flash format mirrors the spec:
|
|
58
|
-
*
|
|
59
|
-
* `+200/+1.1k +$0.01`
|
|
60
|
-
*
|
|
61
|
-
* Exported for snapshot tests.
|
|
62
|
-
*/
|
|
63
|
-
export function renderTurnDeltaFlash(delta, nowEpochMs) {
|
|
64
|
-
if (!delta)
|
|
65
|
-
return null;
|
|
66
|
-
const elapsedSinceMs = nowEpochMs - delta.completedAtEpochMs;
|
|
67
|
-
if (elapsedSinceMs < 0 || elapsedSinceMs > TURN_DELTA_FLASH_MS)
|
|
68
|
-
return null;
|
|
69
|
-
const inLabel = formatTokens(delta.tokensIn);
|
|
70
|
-
const outLabel = formatTokens(delta.tokensOut);
|
|
71
|
-
const costLabel = delta.costUsd > 0 ? ` +${formatCostUsd(delta.costUsd)}` : '';
|
|
72
|
-
return `+${inLabel}/+${outLabel}${costLabel}`;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* cost-meter sprint — local copy of the session elapsed formatter.
|
|
76
|
-
* Mirrors the helper in `core/repl/session.ts` so the status bar stays
|
|
77
|
-
* a pure leaf component without a circular import on session.ts (the
|
|
78
|
-
* model-pricing module's `formatDuration` is similar but ships an
|
|
79
|
-
* `XhYm` ceiling that does not match the CEO spec's `2m44s` shape).
|
|
80
|
-
*/
|
|
81
|
-
function formatElapsedShort(elapsedMs) {
|
|
82
|
-
if (!Number.isFinite(elapsedMs) || elapsedMs <= 0)
|
|
83
|
-
return '0s';
|
|
84
|
-
const totalSec = Math.floor(elapsedMs / 1000);
|
|
85
|
-
if (totalSec < 60)
|
|
86
|
-
return `${totalSec}s`;
|
|
87
|
-
const min = Math.floor(totalSec / 60);
|
|
88
|
-
const sec = totalSec % 60;
|
|
89
|
-
if (min < 60)
|
|
90
|
-
return `${min}m${sec.toString().padStart(2, '0')}s`;
|
|
91
|
-
const hr = Math.floor(min / 60);
|
|
92
|
-
const restMin = min % 60;
|
|
93
|
-
return `${hr}h${restMin.toString().padStart(2, '0')}m`;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Render a count badge — number if defined, `—` placeholder otherwise.
|
|
97
|
-
* The placeholder mirrors the splash header convention so the operator
|
|
98
|
-
* recognises "not yet known" vs "zero" at a glance.
|
|
99
|
-
*/
|
|
100
|
-
function formatCount(value) {
|
|
101
|
-
return typeof value === 'number' ? value.toString() : '—';
|
|
102
|
-
}
|
|
103
|
-
function formatQuota(pct) {
|
|
104
|
-
if (typeof pct !== 'number' || Number.isNaN(pct))
|
|
105
|
-
return '—';
|
|
106
|
-
return `${Math.round(pct)}%`;
|
|
107
|
-
}
|
|
108
|
-
// Exported for test introspection (status-bar-fsm.spec.tsx asserts
|
|
109
|
-
// connecting vs on_watch render in distinct colors; ink-testing-library
|
|
110
|
-
// strips ANSI from lastFrame() so we read the resolved color directly).
|
|
111
|
-
export function connectionLabel(connection) {
|
|
112
|
-
switch (connection) {
|
|
113
|
-
case 'connecting':
|
|
114
|
-
// P2 fix: was 'cyan', same as 'on_watch' - operator could not
|
|
115
|
-
// tell boot from stable. Magenta is distinct from every other
|
|
116
|
-
// state in this palette (cyan steady, yellow reconnect, gray
|
|
117
|
-
// offline) so a brief flicker through this state stands out.
|
|
118
|
-
return { label: 'connecting', color: 'magenta' };
|
|
119
|
-
case 'on_watch':
|
|
120
|
-
return { label: 'on watch', color: 'cyan' };
|
|
121
|
-
case 'reconnecting':
|
|
122
|
-
return { label: 'reconnecting', color: 'yellow' };
|
|
123
|
-
case 'offline':
|
|
124
|
-
return { label: 'offline', color: 'gray' };
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* : compose the visible status label from connection + FSM state.
|
|
129
|
-
*
|
|
130
|
-
* Priority order:
|
|
131
|
-
*
|
|
132
|
-
* 1. `offline` / `reconnecting` — transport health wins; the
|
|
133
|
-
* operator needs to know about a dropped stream before anything
|
|
134
|
-
* about the dispatch.
|
|
135
|
-
* 2. `aborting` / `aborted` / `failed` — operator-visible terminal
|
|
136
|
-
* states the FSM reached; the colour shifts to amber/red so the
|
|
137
|
-
* anomaly stands out vs the calm cyan baseline.
|
|
138
|
-
* 3. `tool_running` — surfaces the tool label when available
|
|
139
|
-
* (`tool: read`), falls back to `tool` when not.
|
|
140
|
-
* 4. `awaiting_response` — `dispatching` (matches peer CLI's verb
|
|
141
|
-
* for the same state).
|
|
142
|
-
* 5. `completed` — `shipped` (matches the agent tree status glyph
|
|
143
|
-
* so the operator's eye links the two surfaces).
|
|
144
|
-
* 6. `idle` / unknown — connection label (`on watch` / `connecting`).
|
|
145
|
-
*
|
|
146
|
-
* The dispatch label `dispatchToolLabel` is already shaped as
|
|
147
|
-
* `tool: <kind>` upstream so we just concatenate; null falls through
|
|
148
|
-
* to the bare `tool` placeholder.
|
|
149
|
-
*/
|
|
150
|
-
function composeStatusLabel(connection, dispatchState, toolLabel, lastCompletedOutcome) {
|
|
151
|
-
// Transport health wins.
|
|
152
|
-
if (connection === 'offline' || connection === 'reconnecting') {
|
|
153
|
-
return connectionLabel(connection);
|
|
154
|
-
}
|
|
155
|
-
// FSM dispatch state overlay (only when the FSM was wired).
|
|
156
|
-
switch (dispatchState) {
|
|
157
|
-
case 'aborting':
|
|
158
|
-
return { label: 'aborting', color: 'yellow' };
|
|
159
|
-
case 'aborted':
|
|
160
|
-
return { label: 'aborted', color: 'gray' };
|
|
161
|
-
case 'failed':
|
|
162
|
-
return { label: 'failed', color: 'red' };
|
|
163
|
-
case 'tool_running':
|
|
164
|
-
return { label: toolLabel ?? 'tool', color: 'cyan' };
|
|
165
|
-
case 'awaiting_response':
|
|
166
|
-
return { label: 'dispatching', color: 'cyan' };
|
|
167
|
-
case 'completed':
|
|
168
|
-
// Branch on the work-done outcome so the bottom-bar tells the
|
|
169
|
-
// same truth as the agent-tree (2026-05-26 — memory
|
|
170
|
-
// feedback_no_fake_dispatch_promises). `'replied'` = text-only
|
|
171
|
-
// turn, render with the same neutral gray + arrow used in the
|
|
172
|
-
// agent-tree. `'shipped'` = real side-effect (or older server
|
|
173
|
-
// that omits the outcome field). Defaults to `'shipped'` so
|
|
174
|
-
// older callers without the prop wired stay back-compat.
|
|
175
|
-
if (lastCompletedOutcome === 'replied') {
|
|
176
|
-
return { label: 'replied', color: 'gray' };
|
|
177
|
-
}
|
|
178
|
-
return { label: 'shipped', color: 'green' };
|
|
179
|
-
case 'idle':
|
|
180
|
-
case undefined:
|
|
181
|
-
default:
|
|
182
|
-
return connectionLabel(connection);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
function formatElapsed(startedAt, now) {
|
|
186
|
-
if (typeof startedAt !== 'number')
|
|
187
|
-
return 'idle';
|
|
188
|
-
const ms = Math.max(0, now - startedAt);
|
|
189
|
-
if (ms < 60_000) {
|
|
190
|
-
return `${Math.floor(ms / 1000)}s`;
|
|
191
|
-
}
|
|
192
|
-
const minutes = Math.floor(ms / 60_000);
|
|
193
|
-
const seconds = Math.floor((ms % 60_000) / 1000);
|
|
194
|
-
return `${minutes}m ${seconds.toString().padStart(2, '0')}s`;
|
|
195
|
-
}
|
|
196
|
-
// `formatTokens` for the downstream-throughput slot is imported from
|
|
197
|
-
// `core/repl/model-pricing.ts` — single source of truth for token
|
|
198
|
-
// formatting across the cost-meter row, `/cost` slash, and the legacy
|
|
199
|
-
// downstream-tokens slot. The shape is identical to the prior local
|
|
200
|
-
// helper (`<1000` raw, `<1m` one-decimal k, `≥1m` one-decimal m); the
|
|
201
|
-
// only semantic difference is non-finite / negative inputs render as
|
|
202
|
-
// `0` instead of throwing, matching the cost-meter row's defensive
|
|
203
|
-
// posture.
|
|
204
|
-
function clampPhase(phase) {
|
|
205
|
-
if (typeof phase !== 'number' || Number.isNaN(phase))
|
|
206
|
-
return 0;
|
|
207
|
-
return Math.max(0, Math.min(PULSE_DOTS.length - 1, Math.floor(phase)));
|
|
208
|
-
}
|
|
209
|
-
//# sourceMappingURL=status-bar.js.map
|
package/dist/tui/status-table.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from 'ink';
|
|
3
|
-
export function StatusTable({ snapshot }) {
|
|
4
|
-
const labelWidth = Math.max('Label'.length, ...snapshot.fields.map((f) => f.label.length));
|
|
5
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: "Pugi status" }) }), snapshot.fields.map((field) => (_jsxs(Box, { children: [_jsxs(Text, { children: [field.label.padEnd(labelWidth, ' '), " "] }), field.available ? (_jsx(Text, { children: field.value })) : (_jsx(Text, { dimColor: true, children: field.value }))] }, field.key))), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["CLI ", snapshot.meta.cliVersion, " Node ", snapshot.meta.nodeVersion, " cwd ", snapshot.meta.cwd] }) })] }));
|
|
6
|
-
}
|
|
7
|
-
//# sourceMappingURL=status-table.js.map
|
package/dist/tui/stickers-art.js
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from 'ink';
|
|
3
|
-
/**
|
|
4
|
-
* Curated ASCII pug corpus. Five variants — wide enough that repeat
|
|
5
|
-
* invocations look fresh, narrow enough that every entry stays
|
|
6
|
-
* hand-vetted (no procedural slop). Each art block intentionally fits
|
|
7
|
-
* inside an 80-column terminal so the surrounding box border does not
|
|
8
|
-
* wrap on narrow shells.
|
|
9
|
-
*
|
|
10
|
-
* The trailing newline at the end of each `art` string is intentional —
|
|
11
|
-
* keeps the renderer's join logic uniform between the boxed and the
|
|
12
|
-
* `--ascii-only` paths.
|
|
13
|
-
*/
|
|
14
|
-
export const PUG_STICKERS = Object.freeze([
|
|
15
|
-
{
|
|
16
|
-
id: 'classic-face',
|
|
17
|
-
caption: 'classic pug face',
|
|
18
|
-
art: [
|
|
19
|
-
' _._ _,-\'""`-._',
|
|
20
|
-
' (,-.`._,\'( |\\`-/|',
|
|
21
|
-
' `-.-\' \\ )-`( , o o)',
|
|
22
|
-
' `- \\`_`"\'-',
|
|
23
|
-
].join('\n'),
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
id: 'sit-pose',
|
|
27
|
-
caption: 'sit, stay, ship',
|
|
28
|
-
art: [
|
|
29
|
-
' /\\___/\\',
|
|
30
|
-
' ( o o )',
|
|
31
|
-
' ( =^= )',
|
|
32
|
-
' (______)',
|
|
33
|
-
].join('\n'),
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
id: 'peek',
|
|
37
|
-
caption: 'peek-a-pug',
|
|
38
|
-
art: [
|
|
39
|
-
' __',
|
|
40
|
-
' ___/ \\___',
|
|
41
|
-
' / o o \\',
|
|
42
|
-
' | > ^ < |',
|
|
43
|
-
' \\__________/',
|
|
44
|
-
].join('\n'),
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
id: 'sleepy',
|
|
48
|
-
caption: 'sleepy pug, no Zzz today',
|
|
49
|
-
art: [
|
|
50
|
-
' .--.',
|
|
51
|
-
' / - -\\',
|
|
52
|
-
' ( ^ ^ )',
|
|
53
|
-
' \\ ^^ /',
|
|
54
|
-
' `----\'',
|
|
55
|
-
].join('\n'),
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
id: 'shipping',
|
|
59
|
-
caption: 'shipping pug',
|
|
60
|
-
art: [
|
|
61
|
-
' .---. .---.',
|
|
62
|
-
' |o_o| |o_o|',
|
|
63
|
-
' \\_^_/ \\_^_/',
|
|
64
|
-
' /| |\\ /| |\\',
|
|
65
|
-
' shipped • shipped',
|
|
66
|
-
].join('\n'),
|
|
67
|
-
},
|
|
68
|
-
]);
|
|
69
|
-
/**
|
|
70
|
-
* Curated rotating-quote pool. Brand voice gate (brandbook §08):
|
|
71
|
-
* `brief / dispatch / stop / agents / quit / shipped` are the power
|
|
72
|
-
* words; quotes lean on those and на the operator-mode register.
|
|
73
|
-
* Adding lines: keep each ≤ 64 chars so the boxed renderer never wraps,
|
|
74
|
-
* stay в the operator's voice, no AI attribution, no hype.
|
|
75
|
-
*/
|
|
76
|
-
export const PUG_QUOTES = Object.freeze([
|
|
77
|
-
'Pugi: your engineering co-pilot.',
|
|
78
|
-
'Brief it. It ships.',
|
|
79
|
-
'Built for operators, not for benchmarks.',
|
|
80
|
-
'Pugi: твой инженерный напарник.',
|
|
81
|
-
'Dispatch agents, not promises.',
|
|
82
|
-
'Small CLI. Loud workforce.',
|
|
83
|
-
'Engineering at the speed of brief.',
|
|
84
|
-
'Pugi: shipping is the default mode.',
|
|
85
|
-
]);
|
|
86
|
-
/**
|
|
87
|
-
* Clamp a raw rng draw to a safe array index. Handles every hostile
|
|
88
|
-
* shape the spec exercises:
|
|
89
|
-
* - rng returns NaN → fall back to 0
|
|
90
|
-
* - rng returns 1.0 → clamp to length-1 (Math.floor would land at n)
|
|
91
|
-
* - rng returns -ε → clamp to 0
|
|
92
|
-
* The caller hands в the corpus length; the helper never touches the
|
|
93
|
-
* corpus itself so it stays trivially testable.
|
|
94
|
-
*/
|
|
95
|
-
function safeIndex(raw, length) {
|
|
96
|
-
if (!Number.isFinite(raw))
|
|
97
|
-
return 0;
|
|
98
|
-
const floored = Math.floor(raw);
|
|
99
|
-
if (floored < 0)
|
|
100
|
-
return 0;
|
|
101
|
-
if (floored >= length)
|
|
102
|
-
return length - 1;
|
|
103
|
-
return floored;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Pick one art variant. Defaults to `Math.random` but the caller can
|
|
107
|
-
* inject a deterministic source — the spec uses a sequence-driven
|
|
108
|
-
* stub to assert the picker hits each entry в the corpus.
|
|
109
|
-
*/
|
|
110
|
-
export function pickArtVariant(rng = Math.random) {
|
|
111
|
-
const raw = rng() * PUG_STICKERS.length;
|
|
112
|
-
return PUG_STICKERS[safeIndex(raw, PUG_STICKERS.length)];
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Pick one rotating brand quote. Same contract as `pickArtVariant` —
|
|
116
|
-
* test-injectable rng so the spec can pin the chosen index.
|
|
117
|
-
*/
|
|
118
|
-
export function pickQuote(rng = Math.random) {
|
|
119
|
-
const raw = rng() * PUG_QUOTES.length;
|
|
120
|
-
return PUG_QUOTES[safeIndex(raw, PUG_QUOTES.length)];
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Plain-text renderer for the `--ascii-only` flag and the non-TTY shell
|
|
124
|
-
* path. Emits the art verbatim, then a blank line, then the quote.
|
|
125
|
-
* No box border — scripting use-case (`pugi stickers --ascii-only`
|
|
126
|
-
* piped to `figlet`, `lolcat`, or a regression-fixture file) gets a
|
|
127
|
-
* stable contract free of decorative ANSI noise.
|
|
128
|
-
*/
|
|
129
|
-
export function renderPugStickersText(art, quote) {
|
|
130
|
-
return `${art.art}\n\n${quote}`;
|
|
131
|
-
}
|
|
132
|
-
export function PugStickersArt({ art, quote }) {
|
|
133
|
-
const lines = art.art.split('\n');
|
|
134
|
-
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", paddingX: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Pugi stickers" }), _jsxs(Text, { dimColor: true, children: [" \u2014 ", art.caption] })] }), _jsx(Box, { flexDirection: "column", children: lines.map((line, i) => (_jsx(Text, { children: line }, `art-${i}`))) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["\"", quote, "\""] }) })] }));
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=stickers-art.js.map
|
package/dist/tui/style-table.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from 'ink';
|
|
3
|
-
import { OUTPUT_STYLES, OUTPUT_STYLE_SLUGS, } from '../core/output-style/presets.js';
|
|
4
|
-
import { useTheme } from '../core/theme/context.js';
|
|
5
|
-
/**
|
|
6
|
-
* Banner above the table. Plain text (not bold) so the prefix `*`
|
|
7
|
-
* remains the dominant active-row cue.
|
|
8
|
-
*/
|
|
9
|
-
function buildBanner(active, source) {
|
|
10
|
-
return `Active style: ${active} (${source})`;
|
|
11
|
-
}
|
|
12
|
-
export function StyleTable({ active, source }) {
|
|
13
|
-
// the active-row marker color flows through
|
|
14
|
-
// the theme so `colorblind` operators see cyan instead of green
|
|
15
|
-
// (which their palette re-maps to `success`). Falls back to the
|
|
16
|
-
// default theme's `success` token when no provider is mounted.
|
|
17
|
-
const theme = useTheme();
|
|
18
|
-
const slugWidth = Math.max('NAME'.length, ...OUTPUT_STYLE_SLUGS.map((slug) => slug.length));
|
|
19
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: "Pugi output styles" }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: ` ${'NAME'.padEnd(slugWidth)} GLOSS` }) }), OUTPUT_STYLE_SLUGS.map((slug) => (_jsx(StyleRow, { slug: slug, active: active, slugWidth: slugWidth, activeColor: theme.success }, slug))), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: buildBanner(active, source) }) })] }));
|
|
20
|
-
}
|
|
21
|
-
function StyleRow({ slug, active, slugWidth, activeColor }) {
|
|
22
|
-
const isActive = slug === active;
|
|
23
|
-
const marker = isActive ? '*' : ' ';
|
|
24
|
-
const slugPart = slug.padEnd(slugWidth, ' ');
|
|
25
|
-
const gloss = OUTPUT_STYLES[slug].gloss;
|
|
26
|
-
return (_jsxs(Box, { children: [_jsx(Text, { color: isActive ? activeColor : undefined, bold: isActive, children: `${marker} ${slugPart}` }), _jsx(Text, { children: ` ${gloss}` })] }));
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=style-table.js.map
|
package/dist/tui/theme-table.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from 'ink';
|
|
3
|
-
import { compileSampleRow, THEMES, THEME_SLUGS, } from '../core/theme/presets.js';
|
|
4
|
-
/**
|
|
5
|
-
* Banner above the table. Plain text (not bold) so the prefix `*`
|
|
6
|
-
* remains the dominant active-row cue. Mirrors `<StyleTable>` so the
|
|
7
|
-
* Settings-group surfaces read identically.
|
|
8
|
-
*/
|
|
9
|
-
function buildBanner(active, source) {
|
|
10
|
-
return `Active theme: ${active} (${source})`;
|
|
11
|
-
}
|
|
12
|
-
export function ThemeTable({ active, source }) {
|
|
13
|
-
const slugWidth = Math.max('NAME'.length, ...THEME_SLUGS.map((slug) => slug.length));
|
|
14
|
-
// The gloss column gets sized to the widest gloss + 2 padding so
|
|
15
|
-
// the sample column lines up. Computed once per render so the
|
|
16
|
-
// layout stays stable when the catalogue grows.
|
|
17
|
-
const glossWidth = Math.max('GLOSS'.length, ...THEME_SLUGS.map((slug) => THEMES[slug].gloss.length));
|
|
18
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: "Pugi themes" }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: ` ${'NAME'.padEnd(slugWidth)} ${'GLOSS'.padEnd(glossWidth)} SAMPLE` }) }), THEME_SLUGS.map((slug) => (_jsx(ThemeRow, { slug: slug, active: active, slugWidth: slugWidth, glossWidth: glossWidth }, slug))), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: buildBanner(active, source) }) })] }));
|
|
19
|
-
}
|
|
20
|
-
function ThemeRow({ slug, active, slugWidth, glossWidth }) {
|
|
21
|
-
const isActive = slug === active;
|
|
22
|
-
const marker = isActive ? '*' : ' ';
|
|
23
|
-
const slugPart = slug.padEnd(slugWidth, ' ');
|
|
24
|
-
const preset = THEMES[slug];
|
|
25
|
-
const gloss = preset.gloss.padEnd(glossWidth, ' ');
|
|
26
|
-
const sample = compileSampleRow(slug);
|
|
27
|
-
return (_jsxs(Box, { children: [_jsx(Text, { color: isActive ? preset.colors.accent : undefined, bold: isActive, children: `${marker} ${slugPart}` }), _jsx(Text, { children: ` ${gloss} ` }), _jsx(Text, { color: preset.colors.foreground, children: sample.foreground }), _jsx(Text, { children: ' ' }), _jsx(Text, { color: preset.colors.accent, children: sample.accent }), _jsx(Text, { children: ' ' }), _jsx(Text, { color: preset.colors.success, children: sample.success }), _jsx(Text, { children: ' ' }), _jsx(Text, { color: preset.colors.warning, children: sample.warning }), _jsx(Text, { children: ' ' }), _jsx(Text, { color: preset.colors.error, children: sample.error })] }));
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=theme-table.js.map
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* Thinking spinner — animated dispatch indicator (CEO P0 #2).
|
|
4
|
-
*
|
|
5
|
-
* Replaces the static `dispatching` / `tool: <name>` strings the bottom
|
|
6
|
-
* status row used к paint during active brief dispatch with а Claude-
|
|
7
|
-
* Code-style rotating verb + glyph pair:
|
|
8
|
-
*
|
|
9
|
-
* ✽ Briefing… (awaiting_response, before the first tool call)
|
|
10
|
-
* ◆ Dispatching… (awaiting_response, после the first tool call)
|
|
11
|
-
* ◇ Reviewing… (tool_running)
|
|
12
|
-
* ✦ Synthesizing… (awaiting_response, late in turn)
|
|
13
|
-
* ❋ Shipping… (tool_running, edit/write/build family tool)
|
|
14
|
-
*
|
|
15
|
-
* The rotation cadence is ~800 ms per step so the verb feels alive but
|
|
16
|
-
* never strobes. The component owns its own timer (cleared on unmount)
|
|
17
|
-
* и takes the active dispatch state + the optional tool label so the
|
|
18
|
-
* "Shipping…" branch can light up specifically для write-class tools.
|
|
19
|
-
*
|
|
20
|
-
* Mount lifecycle: the REPL renders `<ThinkingSpinner />` only while
|
|
21
|
-
* `dispatchState` ∈ {`awaiting_response`, `tool_running`}. The
|
|
22
|
-
* status-bar's legacy `composeStatusLabel` row stays mounted too — they
|
|
23
|
-
* are not mutually exclusive — but the spinner row sits above the
|
|
24
|
-
* status row так the operator's eye lands on the live signal first.
|
|
25
|
-
*
|
|
26
|
-
* Brand discipline:
|
|
27
|
-
* - Verbs from the approved power-words list: `Briefing`,
|
|
28
|
-
* `Dispatching`, `Reviewing`, `Synthesizing`, `Shipping`. No
|
|
29
|
-
* `Thinking…` (forbidden cool word per DESIGN.md §3.2 voice gate).
|
|
30
|
-
* - Glyphs from the Pugi mascot brand glyph kit (`✽ ◆ ◇ ✦ ❋`). No
|
|
31
|
-
* emoji — the spinner must paint in а narrow Bash / WSL terminal
|
|
32
|
-
* где emoji fall back к `?`.
|
|
33
|
-
* - Cyan accent (`#3da9fc`) on the glyph; verb stays default-tone so
|
|
34
|
-
* the rotation does not compete with the cost-meter row above.
|
|
35
|
-
* - Trailing ellipsis is а single Unicode `…` (DESIGN.md §4 — three-
|
|
36
|
-
* dot ellipsis is the ONLY allowed truncation glyph).
|
|
37
|
-
*
|
|
38
|
-
* Test surface: `tickSpinnerFrame` is exported so the spec can drive
|
|
39
|
-
* the frame index without а real-clock timer.
|
|
40
|
-
*/
|
|
41
|
-
import { useEffect, useState } from 'react';
|
|
42
|
-
import { Box, Text } from 'ink';
|
|
43
|
-
/* ------------------------------------------------------------------ */
|
|
44
|
-
/* Constants */
|
|
45
|
-
/* ------------------------------------------------------------------ */
|
|
46
|
-
const ACCENT = '#3da9fc';
|
|
47
|
-
const FRAME_INTERVAL_MS = 800;
|
|
48
|
-
const FRAMES = [
|
|
49
|
-
{ glyph: '✽', verb: 'Briefing' },
|
|
50
|
-
{ glyph: '◆', verb: 'Dispatching' },
|
|
51
|
-
{ glyph: '◇', verb: 'Reviewing' },
|
|
52
|
-
{ glyph: '✦', verb: 'Synthesizing' },
|
|
53
|
-
{ glyph: '❋', verb: 'Shipping' },
|
|
54
|
-
];
|
|
55
|
-
/**
|
|
56
|
-
* Tool labels that anchor к the `Shipping…` frame regardless of
|
|
57
|
-
* rotation index. These are the write-class tools — the operator sees
|
|
58
|
-
* "shipping" the moment а real file mutation fires так the indicator
|
|
59
|
-
* matches the visible filesystem effect.
|
|
60
|
-
*/
|
|
61
|
-
const SHIPPING_TOOLS = new Set([
|
|
62
|
-
'edit',
|
|
63
|
-
'write',
|
|
64
|
-
'build',
|
|
65
|
-
'multi_edit',
|
|
66
|
-
'apply_patch',
|
|
67
|
-
]);
|
|
68
|
-
/* ------------------------------------------------------------------ */
|
|
69
|
-
/* Helpers */
|
|
70
|
-
/* ------------------------------------------------------------------ */
|
|
71
|
-
/**
|
|
72
|
-
* Compute the visible frame для the current tick. The base index is
|
|
73
|
-
* derived from а monotonically-incrementing counter (one increment per
|
|
74
|
-
* `FRAME_INTERVAL_MS` window), и а ship-class tool label overrides the
|
|
75
|
-
* base so write-tools light up `Shipping…` immediately.
|
|
76
|
-
*
|
|
77
|
-
* Exported for the spec so the frame selection is testable without
|
|
78
|
-
* mounting Ink.
|
|
79
|
-
*/
|
|
80
|
-
export function tickSpinnerFrame(baseIndex, toolLabel) {
|
|
81
|
-
if (toolLabel && SHIPPING_TOOLS.has(toolLabel.toLowerCase())) {
|
|
82
|
-
return FRAMES[FRAMES.length - 1] ?? FRAMES[0];
|
|
83
|
-
}
|
|
84
|
-
const wrapped = ((baseIndex % FRAMES.length) + FRAMES.length) % FRAMES.length;
|
|
85
|
-
return FRAMES[wrapped] ?? FRAMES[0];
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Decide whether the spinner should be visible for а dispatch state.
|
|
89
|
-
* `awaiting_response` и `tool_running` are the only active states; all
|
|
90
|
-
* other states (`idle`, `aborting`, `aborted`, `completed`, `failed`)
|
|
91
|
-
* suppress the spinner так the operator does not see а phantom verb
|
|
92
|
-
* after the dispatch settles.
|
|
93
|
-
*/
|
|
94
|
-
export function isSpinnerActive(dispatchState) {
|
|
95
|
-
return dispatchState === 'awaiting_response' || dispatchState === 'tool_running';
|
|
96
|
-
}
|
|
97
|
-
/* ------------------------------------------------------------------ */
|
|
98
|
-
/* Component */
|
|
99
|
-
/* ------------------------------------------------------------------ */
|
|
100
|
-
export function ThinkingSpinner(props) {
|
|
101
|
-
const active = isSpinnerActive(props.dispatchState);
|
|
102
|
-
const [frameIndex, setFrameIndex] = useState(0);
|
|
103
|
-
const intervalMs = props.frameIntervalMs ?? FRAME_INTERVAL_MS;
|
|
104
|
-
useEffect(() => {
|
|
105
|
-
if (!active) {
|
|
106
|
-
// Reset так the next dispatch starts on `Briefing` instead of
|
|
107
|
-
// mid-rotation. Without this the spinner would resume one verb
|
|
108
|
-
// later on every turn и quickly drift to `Synthesizing` even на
|
|
109
|
-
// а fresh brief.
|
|
110
|
-
setFrameIndex(0);
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
const timer = setInterval(() => {
|
|
114
|
-
setFrameIndex((previous) => (previous + 1) % FRAMES.length);
|
|
115
|
-
}, intervalMs);
|
|
116
|
-
return () => clearInterval(timer);
|
|
117
|
-
}, [active, intervalMs]);
|
|
118
|
-
if (!active)
|
|
119
|
-
return null;
|
|
120
|
-
const frame = tickSpinnerFrame(frameIndex, props.dispatchToolLabel ?? null);
|
|
121
|
-
return (_jsxs(Box, { children: [_jsx(Text, { color: ACCENT, children: `${frame.glyph} ` }), _jsx(Text, { children: `${frame.verb}…` })] }));
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=thinking-spinner.js.map
|