@pugi/cli 0.1.0-beta.99 → 1.0.0-alpha.10
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
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PAVF-7 — `pugi report --from-error` field-bug capture.
|
|
3
|
-
*
|
|
4
|
-
* Operator hit a CLI failure ("pugi explain: failed [auth_missing]...")
|
|
5
|
-
* and wants to file a clean report без manual log-grepping. This command:
|
|
6
|
-
*
|
|
7
|
-
* 1. Locates the most-recently-modified session under .pugi/sessions/
|
|
8
|
-
* (the engine adapter mirrors EVERY dispatch's events to a fresh
|
|
9
|
-
* session dir; the latest one is always the failure that just
|
|
10
|
-
* surprised the operator).
|
|
11
|
-
* 2. Reads events.jsonl + extracts the terminal-state event +
|
|
12
|
-
* the last 50 frames before it (enough context to triage; small
|
|
13
|
-
* enough for a GH issue body or email paste).
|
|
14
|
-
* 3. Captures workspace metadata (CLI version, Node version, OS,
|
|
15
|
-
* tenant id from credentials, current dir, .pugi/PUGI.md presence).
|
|
16
|
-
* 4. Strips secrets — auth tokens, env values, JWT signatures —
|
|
17
|
-
* before the report ever touches disk OR network.
|
|
18
|
-
* 5. Writes the bundle к .pugi/reports/<ISO-timestamp>-<session-id>/
|
|
19
|
-
* with both a machine-readable report.json and a human-readable
|
|
20
|
-
* report.md the operator can paste into a GH issue / email.
|
|
21
|
-
* 6. Prints the path + the canonical share command the operator can
|
|
22
|
-
* run when ready to upload (the upload endpoint is deferred to a
|
|
23
|
-
* follow-up; v1 keeps everything LOCAL so an operator working
|
|
24
|
-
* offline / behind a corporate firewall can still file a clean
|
|
25
|
-
* report).
|
|
26
|
-
*
|
|
27
|
-
* Why not auto-upload in v1:
|
|
28
|
-
* The CEO HARD rule `feedback_no_fake_dispatch_promises` says we do
|
|
29
|
-
* not invent dispatch we cannot deliver. Without a live
|
|
30
|
-
* /api/pugi/report endpoint, an auto-upload would either silently
|
|
31
|
-
* no-op or claim shipped и lie. v1 emits the artifacts + a clear
|
|
32
|
-
* "upload pending" status; v2 (separate PR) wires the endpoint и
|
|
33
|
-
* flips the default к upload-on-success.
|
|
34
|
-
*
|
|
35
|
-
* Exit codes (match the existing PAVF-1 stage_code table):
|
|
36
|
-
* 0 = report written successfully
|
|
37
|
-
* 8 = no sessions found (operator ran in a workspace без .pugi/)
|
|
38
|
-
* 9 = session events.jsonl unreadable / corrupted
|
|
39
|
-
* 20 = output path not writable (disk full / perms)
|
|
40
|
-
*
|
|
41
|
-
* Secret-redaction posture: PII / tokens / env values are stripped at
|
|
42
|
-
* the report-generation layer, NOT at upload time. Even if the operator
|
|
43
|
-
* never uploads, the report dir on disk MUST NOT carry plaintext
|
|
44
|
-
* secrets — a colleague who later runs `cat .pugi/reports/.../report.md`
|
|
45
|
-
* over the shoulder sees the bug context but not the bearer token.
|
|
46
|
-
*/
|
|
47
|
-
import { existsSync, readdirSync, readFileSync, mkdirSync, statSync, writeFileSync } from 'node:fs';
|
|
48
|
-
import { join, resolve as resolvePath } from 'node:path';
|
|
49
|
-
import { homedir, platform, release } from 'node:os';
|
|
50
|
-
import { PUGI_CLI_VERSION } from '../version.js';
|
|
51
|
-
const MAX_TAIL_FRAMES = 50;
|
|
52
|
-
const MAX_DETAIL_CHARS = 400;
|
|
53
|
-
const TERMINAL_TYPES = new Set([
|
|
54
|
-
'agent.completed',
|
|
55
|
-
'agent.failed',
|
|
56
|
-
'agent.blocked',
|
|
57
|
-
'subagent.outcome',
|
|
58
|
-
'result',
|
|
59
|
-
]);
|
|
60
|
-
/**
|
|
61
|
-
* Bearer / JWT / env-secret patterns. We do NOT try to be exhaustive
|
|
62
|
-
* (cat-and-mouse with custom secret formats is unwinnable); we cover
|
|
63
|
-
* the shapes that actually appear in Pugi sessions:
|
|
64
|
-
*
|
|
65
|
-
* - `Authorization: Bearer eyJ...` (JWT header.payload.signature)
|
|
66
|
-
* - `apiKey: eyJ...` inside captured JSON envelopes
|
|
67
|
-
* - any long base64-ish token (>= 20 chars, [A-Za-z0-9_-]) following
|
|
68
|
-
* `token`, `password`, `secret`, or `key` field names
|
|
69
|
-
*
|
|
70
|
-
* Replacement is a length-preserving `[REDACTED:<n>]` marker so the
|
|
71
|
-
* operator can still verify the report at-a-glance ("yes, a 32-char
|
|
72
|
-
* token was here") без leaking the value.
|
|
73
|
-
*/
|
|
74
|
-
function redact(text) {
|
|
75
|
-
if (!text)
|
|
76
|
-
return text;
|
|
77
|
-
// Bearer + JWT shape.
|
|
78
|
-
text = text.replace(/(Bearer\s+)([A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+)/gi, (_m, prefix, tok) => `${prefix}[REDACTED:${tok.length}]`);
|
|
79
|
-
// Bare JWTs (no Bearer prefix) inside JSON / log lines.
|
|
80
|
-
text = text.replace(/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g, (tok) => `[REDACTED:${tok.length}]`);
|
|
81
|
-
// `"token": "..."` / `"apiKey": "..."` / `"password": "..."` shapes.
|
|
82
|
-
text = text.replace(/("(?:apiKey|api_key|token|access_token|refresh_token|password|secret|bearer)"\s*:\s*")([^"]{10,})(")/gi, (_m, before, val, after) => `${before}[REDACTED:${val.length}]${after}`);
|
|
83
|
-
// Bare env-style KEY=VALUE на длинных значениях.
|
|
84
|
-
text = text.replace(/\b((?:PUGI_API_KEY|GITHUB_TOKEN|NPM_TOKEN|ANVIL_API_KEY|OPENAI_API_KEY|ANTHROPIC_API_KEY|GEMINI_API_KEY)=)([^\s"']{10,})/g, (_m, prefix, val) => `${prefix}[REDACTED:${val.length}]`);
|
|
85
|
-
return text;
|
|
86
|
-
}
|
|
87
|
-
function clampDetail(value) {
|
|
88
|
-
if (typeof value !== 'string')
|
|
89
|
-
return undefined;
|
|
90
|
-
const redacted = redact(value);
|
|
91
|
-
return redacted.length > MAX_DETAIL_CHARS
|
|
92
|
-
? `${redacted.slice(0, MAX_DETAIL_CHARS)}…`
|
|
93
|
-
: redacted;
|
|
94
|
-
}
|
|
95
|
-
function findLatestSession(cwd) {
|
|
96
|
-
const dir = resolvePath(cwd, '.pugi/sessions');
|
|
97
|
-
if (!existsSync(dir))
|
|
98
|
-
return null;
|
|
99
|
-
const entries = readdirSync(dir, { withFileTypes: true })
|
|
100
|
-
.filter((e) => e.isDirectory())
|
|
101
|
-
.map((e) => {
|
|
102
|
-
const path = join(dir, e.name);
|
|
103
|
-
let mtime = 0;
|
|
104
|
-
try {
|
|
105
|
-
mtime = statSync(join(path, 'events.jsonl')).mtimeMs;
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
// Session dir without events.jsonl yet — never opened. Skip.
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
return { name: e.name, path, mtime };
|
|
112
|
-
})
|
|
113
|
-
.filter((x) => x !== null)
|
|
114
|
-
.sort((a, b) => b.mtime - a.mtime);
|
|
115
|
-
return entries[0]?.path ?? null;
|
|
116
|
-
}
|
|
117
|
-
function readTenantIdSafely() {
|
|
118
|
-
const credPath = resolvePath(homedir(), '.pugi/credentials.json');
|
|
119
|
-
if (!existsSync(credPath))
|
|
120
|
-
return undefined;
|
|
121
|
-
try {
|
|
122
|
-
const raw = JSON.parse(readFileSync(credPath, 'utf8'));
|
|
123
|
-
const first = raw.tokens?.[0]?.apiKey;
|
|
124
|
-
if (!first || typeof first !== 'string')
|
|
125
|
-
return undefined;
|
|
126
|
-
// JWT payload is the middle segment; base64-decode + parse for the
|
|
127
|
-
// `customerId` claim. Failure here returns undefined (the report
|
|
128
|
-
// still emits useful context without it).
|
|
129
|
-
const parts = first.split('.');
|
|
130
|
-
if (parts.length !== 3)
|
|
131
|
-
return undefined;
|
|
132
|
-
const payload = JSON.parse(Buffer.from(parts[1] ?? '', 'base64').toString('utf8'));
|
|
133
|
-
return typeof payload.customerId === 'string' ? payload.customerId : undefined;
|
|
134
|
-
}
|
|
135
|
-
catch {
|
|
136
|
-
return undefined;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
function captureFrames(eventsPath) {
|
|
140
|
-
const lines = readFileSync(eventsPath, 'utf8')
|
|
141
|
-
.split('\n')
|
|
142
|
-
.filter((l) => l.trim().length > 0);
|
|
143
|
-
const parsed = lines
|
|
144
|
-
.map((line) => {
|
|
145
|
-
try {
|
|
146
|
-
return JSON.parse(line);
|
|
147
|
-
}
|
|
148
|
-
catch {
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
})
|
|
152
|
-
.filter((f) => f !== null);
|
|
153
|
-
// Keep the LAST MAX_TAIL_FRAMES frames — failures cluster at the
|
|
154
|
-
// end, and the tail is where the operator's context actually lives.
|
|
155
|
-
const tail = parsed.slice(-MAX_TAIL_FRAMES);
|
|
156
|
-
return tail.map((f) => {
|
|
157
|
-
const out = {
|
|
158
|
-
type: typeof f.type === 'string' ? f.type : 'unknown',
|
|
159
|
-
};
|
|
160
|
-
if (typeof f.taskId === 'string')
|
|
161
|
-
out.taskId = f.taskId;
|
|
162
|
-
if (typeof f.timestamp === 'string')
|
|
163
|
-
out.timestamp = f.timestamp;
|
|
164
|
-
if (typeof f.outcome === 'string')
|
|
165
|
-
out.outcome = f.outcome;
|
|
166
|
-
// Keep detail / error ONLY on terminal frames (full reply text on
|
|
167
|
-
// every agent.message would blow the report past the GH issue cap).
|
|
168
|
-
if (TERMINAL_TYPES.has(out.type)) {
|
|
169
|
-
const detail = clampDetail(f.detail) ?? clampDetail(f.error);
|
|
170
|
-
if (detail)
|
|
171
|
-
out.detail = detail;
|
|
172
|
-
if (typeof f.error === 'string')
|
|
173
|
-
out.error = clampDetail(f.error);
|
|
174
|
-
}
|
|
175
|
-
return out;
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
export function runReport(args, ctx) {
|
|
179
|
-
const fromError = args.includes('--from-error');
|
|
180
|
-
if (!fromError) {
|
|
181
|
-
ctx.writeOutput({
|
|
182
|
-
command: 'report',
|
|
183
|
-
status: 'no_sessions',
|
|
184
|
-
message: 'pugi report — capture a bug report from the most-recent session.\n\n' +
|
|
185
|
-
'Usage:\n' +
|
|
186
|
-
' pugi report --from-error Bundle the most-recent failed session as a report.\n\n' +
|
|
187
|
-
'Output: writes .pugi/reports/<timestamp>-<session-id>/{report.json, report.md}.\n' +
|
|
188
|
-
'Secrets (bearer tokens, JWTs, named env values) are stripped before disk write.',
|
|
189
|
-
}, 'pugi report — see `pugi report --help`');
|
|
190
|
-
return 0;
|
|
191
|
-
}
|
|
192
|
-
const sessionPath = findLatestSession(ctx.cwd);
|
|
193
|
-
if (!sessionPath) {
|
|
194
|
-
ctx.writeOutput({
|
|
195
|
-
command: 'report',
|
|
196
|
-
status: 'no_sessions',
|
|
197
|
-
message: 'No sessions found under .pugi/sessions/. Run a `pugi` command first.',
|
|
198
|
-
}, 'pugi report: no sessions found under .pugi/sessions/ — run a `pugi` command first.');
|
|
199
|
-
return 8;
|
|
200
|
-
}
|
|
201
|
-
const eventsPath = join(sessionPath, 'events.jsonl');
|
|
202
|
-
let frames;
|
|
203
|
-
try {
|
|
204
|
-
frames = captureFrames(eventsPath);
|
|
205
|
-
}
|
|
206
|
-
catch (err) {
|
|
207
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
208
|
-
ctx.writeOutput({
|
|
209
|
-
command: 'report',
|
|
210
|
-
status: 'unreadable',
|
|
211
|
-
message: `Failed to read ${eventsPath}: ${message}`,
|
|
212
|
-
}, `pugi report: cannot read session events (${message})`);
|
|
213
|
-
return 9;
|
|
214
|
-
}
|
|
215
|
-
const sessionId = sessionPath.split('/').pop() ?? 'unknown';
|
|
216
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
217
|
-
const reportDir = resolvePath(ctx.cwd, '.pugi/reports', `${timestamp}-${sessionId}`);
|
|
218
|
-
let reportJson;
|
|
219
|
-
let reportMd;
|
|
220
|
-
try {
|
|
221
|
-
mkdirSync(reportDir, { recursive: true });
|
|
222
|
-
reportJson = join(reportDir, 'report.json');
|
|
223
|
-
reportMd = join(reportDir, 'report.md');
|
|
224
|
-
const meta = {
|
|
225
|
-
schema: 1,
|
|
226
|
-
generatedAt: new Date().toISOString(),
|
|
227
|
-
cliVersion: PUGI_CLI_VERSION,
|
|
228
|
-
nodeVersion: process.version,
|
|
229
|
-
os: `${platform()} ${release()}`,
|
|
230
|
-
cwd: ctx.cwd,
|
|
231
|
-
sessionId,
|
|
232
|
-
tenantId: readTenantIdSafely() ?? '(not resolvable)',
|
|
233
|
-
pugiMd: existsSync(resolvePath(ctx.cwd, '.pugi/PUGI.md')),
|
|
234
|
-
frames,
|
|
235
|
-
};
|
|
236
|
-
writeFileSync(reportJson, JSON.stringify(meta, null, 2), 'utf8');
|
|
237
|
-
const mdLines = [
|
|
238
|
-
`# Pugi bug report — ${sessionId}`,
|
|
239
|
-
'',
|
|
240
|
-
`Generated: \`${meta.generatedAt}\``,
|
|
241
|
-
`CLI version: \`${meta.cliVersion}\``,
|
|
242
|
-
`Node: \`${meta.nodeVersion}\` · OS: \`${meta.os}\``,
|
|
243
|
-
`Workspace: \`${meta.cwd}\` (PUGI.md present: ${meta.pugiMd ? 'yes' : 'no'})`,
|
|
244
|
-
`Tenant: \`${meta.tenantId}\``,
|
|
245
|
-
'',
|
|
246
|
-
`## Last ${frames.length} frames`,
|
|
247
|
-
'',
|
|
248
|
-
'```jsonl',
|
|
249
|
-
...frames.map((f) => JSON.stringify(f)),
|
|
250
|
-
'```',
|
|
251
|
-
'',
|
|
252
|
-
'## How to share',
|
|
253
|
-
'',
|
|
254
|
-
'1. Review `report.md` for accidental PII or sensitive paths.',
|
|
255
|
-
'2. Paste the contents into a GH issue at https://github.com/pugi-io/pugi/issues',
|
|
256
|
-
' OR attach the `report.json` as a file.',
|
|
257
|
-
'',
|
|
258
|
-
'Auto-upload to api.pugi.io is planned (`pugi report --upload`) but',
|
|
259
|
-
'NOT shipped in this build — v1 keeps everything local so an operator',
|
|
260
|
-
'behind a firewall can still file a clean report.',
|
|
261
|
-
];
|
|
262
|
-
writeFileSync(reportMd, mdLines.join('\n'), 'utf8');
|
|
263
|
-
}
|
|
264
|
-
catch (err) {
|
|
265
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
266
|
-
ctx.writeOutput({
|
|
267
|
-
command: 'report',
|
|
268
|
-
status: 'output_not_writable',
|
|
269
|
-
message: `Failed to write report bundle to ${reportDir}: ${message}`,
|
|
270
|
-
}, `pugi report: cannot write report dir (${message})`);
|
|
271
|
-
return 20;
|
|
272
|
-
}
|
|
273
|
-
ctx.writeOutput({
|
|
274
|
-
command: 'report',
|
|
275
|
-
status: 'written',
|
|
276
|
-
reportDir,
|
|
277
|
-
reportJson,
|
|
278
|
-
reportMd,
|
|
279
|
-
sessionId,
|
|
280
|
-
message: `Report written: ${reportDir}`,
|
|
281
|
-
}, [
|
|
282
|
-
`pugi report: bundle written`,
|
|
283
|
-
` Session: ${sessionId}`,
|
|
284
|
-
` Frames captured: ${frames.length}`,
|
|
285
|
-
` Files:`,
|
|
286
|
-
` ${reportJson}`,
|
|
287
|
-
` ${reportMd}`,
|
|
288
|
-
``,
|
|
289
|
-
`Review report.md for accidental PII, then paste into a GH issue OR`,
|
|
290
|
-
`attach report.json. Auto-upload is planned for a follow-up build.`,
|
|
291
|
-
].join('\n'));
|
|
292
|
-
return 0;
|
|
293
|
-
}
|
|
294
|
-
// Test seam — the redactor is the most-tested piece (false negatives
|
|
295
|
-
// leak secrets; false positives garble bug context). Exported so
|
|
296
|
-
// apps/pugi-cli/test/report.spec.ts can assert the regex behaviour
|
|
297
|
-
// без spinning up a full session.
|
|
298
|
-
export const __INTERNAL_FOR_TESTS = { redact, clampDetail };
|
|
299
|
-
//# sourceMappingURL=report.js.map
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `/resume` runtime — .
|
|
3
|
-
*
|
|
4
|
-
* Light runner that augments the existing `pugi resume` surface in
|
|
5
|
-
* `runtime/cli.ts` with rewind-aware session listings. The full
|
|
6
|
-
* REPL-mount path stays in cli.ts (it owns the credential resolver +
|
|
7
|
-
* Ink renderer); this module exposes the data-access helpers the slash
|
|
8
|
-
* dispatcher + the cli.ts handler share.
|
|
9
|
-
*
|
|
10
|
-
* Why a separate runner rather than inlining inside cli.ts: the in-REPL
|
|
11
|
-
* `/resume` slash already holds the writer lock, so it cannot use the
|
|
12
|
-
* read-only view path the top-level command relies on. The split lets
|
|
13
|
-
* the slash code call `listResumableSessionsForRepl` (which routes
|
|
14
|
-
* through the live store) while the shell code calls
|
|
15
|
-
* `listResumableSessionsReadOnly` (which uses the no-lock view).
|
|
16
|
-
*/
|
|
17
|
-
import { homedir } from 'node:os';
|
|
18
|
-
import { slugForCwd } from '../../core/repl/history.js';
|
|
19
|
-
import { applyAllMasks, listResumableSessions, } from '../../core/checkpoint/resumer.js';
|
|
20
|
-
import { findLatestActiveRewind } from '../../core/checkpoint/rewinder.js';
|
|
21
|
-
/**
|
|
22
|
-
* Read-only `pugi resume --list` path. Uses the no-lock view so a live
|
|
23
|
-
* REPL writing in the same project does not block the listing.
|
|
24
|
-
*/
|
|
25
|
-
export async function runResumeList(ctx) {
|
|
26
|
-
const slug = slugForCwd(ctx.workspaceRoot);
|
|
27
|
-
const baseInput = {
|
|
28
|
-
projectSlug: slug,
|
|
29
|
-
limit: ctx.limit ?? 10,
|
|
30
|
-
home: ctx.home ?? homedir(),
|
|
31
|
-
};
|
|
32
|
-
const sessions = await listResumableSessions(baseInput);
|
|
33
|
-
const rows = sessions.map(toResumeListRow);
|
|
34
|
-
const text = renderResumeList(rows, slug);
|
|
35
|
-
ctx.writeOutput({
|
|
36
|
-
command: 'resume',
|
|
37
|
-
status: rows.length === 0 ? 'empty' : 'listed',
|
|
38
|
-
projectSlug: slug,
|
|
39
|
-
sessions: rows,
|
|
40
|
-
}, text);
|
|
41
|
-
return {
|
|
42
|
-
command: 'resume',
|
|
43
|
-
status: rows.length === 0 ? 'empty' : 'listed',
|
|
44
|
-
projectSlug: slug,
|
|
45
|
-
sessions: rows,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* In-REPL `/resume` slash variant. The live REPL holds the writer
|
|
50
|
-
* lockfile so we cannot reuse the read-only view path; this routes
|
|
51
|
-
* through the store the session module already opened. Returns the
|
|
52
|
-
* sessions list directly so the slash handler can render system lines.
|
|
53
|
-
*/
|
|
54
|
-
export async function runResumeListForRepl(input) {
|
|
55
|
-
const slug = slugForCwd(input.workspaceRoot);
|
|
56
|
-
const limit = input.limit ?? 10;
|
|
57
|
-
const sessionRows = await input.store.listSessions({
|
|
58
|
-
project: slug,
|
|
59
|
-
limit,
|
|
60
|
-
status: 'active+archived',
|
|
61
|
-
});
|
|
62
|
-
const out = [];
|
|
63
|
-
for (const row of sessionRows) {
|
|
64
|
-
const events = await input.store.loadEvents(row.id);
|
|
65
|
-
const visible = applyAllMasks(events);
|
|
66
|
-
const latest = findLatestActiveRewind(events);
|
|
67
|
-
out.push({
|
|
68
|
-
id: row.id,
|
|
69
|
-
title: row.title,
|
|
70
|
-
branch: row.branch,
|
|
71
|
-
turnCount: row.turnCount,
|
|
72
|
-
eventCount: row.eventCount,
|
|
73
|
-
visibleEventCount: visible.length,
|
|
74
|
-
hasActiveRewind: latest !== null,
|
|
75
|
-
updatedAt: row.updatedAt,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
return out;
|
|
79
|
-
}
|
|
80
|
-
function toResumeListRow(input) {
|
|
81
|
-
return {
|
|
82
|
-
id: input.row.id,
|
|
83
|
-
title: input.row.title,
|
|
84
|
-
branch: input.row.branch,
|
|
85
|
-
turnCount: input.row.turnCount,
|
|
86
|
-
eventCount: input.row.eventCount,
|
|
87
|
-
visibleEventCount: input.visibleEventCount,
|
|
88
|
-
hasActiveRewind: input.hasActiveRewind,
|
|
89
|
-
updatedAt: input.row.updatedAt,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Pretty-print a resume list. Adds a small "rewound" tag when the
|
|
94
|
-
* session carries an unfinished rewind so the operator knows the
|
|
95
|
-
* transcript will load with a masked range.
|
|
96
|
-
*/
|
|
97
|
-
export function renderResumeList(rows, projectSlug) {
|
|
98
|
-
if (rows.length === 0) {
|
|
99
|
-
return `No stored sessions for project '${projectSlug}' yet.`;
|
|
100
|
-
}
|
|
101
|
-
const lines = [
|
|
102
|
-
`Recent local sessions for '${projectSlug}' (${rows.length}):`,
|
|
103
|
-
'',
|
|
104
|
-
];
|
|
105
|
-
for (let i = 0; i < rows.length; i += 1) {
|
|
106
|
-
const row = rows[i];
|
|
107
|
-
const title = (row.title ?? '(untitled)').slice(0, 64);
|
|
108
|
-
const idShort = row.id.slice(0, 13);
|
|
109
|
-
const branch = (row.branch ?? 'no-branch').padEnd(16);
|
|
110
|
-
const turns = `${row.turnCount}t`.padStart(4);
|
|
111
|
-
const events = `${row.visibleEventCount}e`.padStart(5);
|
|
112
|
-
const tag = row.hasActiveRewind ? ' [rewound]' : '';
|
|
113
|
-
lines.push(` ${idShort} ${branch} ${turns} ${events}${tag} ${title}`);
|
|
114
|
-
}
|
|
115
|
-
lines.push('', 'Resume with: pugi resume <id>');
|
|
116
|
-
return lines.join('\n');
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=resume.js.map
|