@pugi/cli 0.1.0-beta.10 → 0.1.0-beta.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +132 -0
- package/LICENSE +1 -1
- package/README.md +55 -11
- package/assets/pugi-prozr2-mascot.ansi +9 -0
- package/bin/run.js +33 -1
- package/dist/commands/deploy.js +40 -40
- package/dist/commands/flatten.js +191 -0
- package/dist/commands/jobs-watch.js +201 -0
- package/dist/commands/jobs.js +42 -27
- package/dist/commands/retro.js +210 -0
- package/dist/commands/smoke.js +133 -0
- package/dist/core/agent-progress/cleanup.js +134 -0
- package/dist/core/agent-progress/schema.js +144 -0
- package/dist/core/agent-progress/writer.js +101 -0
- package/dist/core/agents/adaptive-router.js +330 -0
- package/dist/core/agents/query-decomposer.js +297 -0
- package/dist/core/agents/registry.js +3 -3
- package/dist/core/approvals/shortcut-resolver.js +98 -0
- package/dist/core/artifact-chain/dispatcher.js +148 -0
- package/dist/core/artifact-chain/exporter.js +164 -0
- package/dist/core/artifact-chain/state.js +243 -0
- package/dist/core/artifact-chain/steps.js +169 -0
- package/dist/core/ask-user/question.js +92 -0
- package/dist/core/audit/audit-trail.js +275 -0
- package/dist/core/auth/ensure-authenticated.js +129 -0
- package/dist/core/auth/env-provider.js +238 -0
- package/dist/core/auto-open-browser.js +4 -4
- package/dist/core/auto-update/channels.js +122 -0
- package/dist/core/auto-update/checker.js +241 -0
- package/dist/core/auto-update/state.js +235 -0
- package/dist/core/bare-mode/index.js +107 -0
- package/dist/core/bash/redirect.js +281 -0
- package/dist/core/bash-classifier.js +436 -40
- package/dist/core/checkpoint/resumer.js +149 -0
- package/dist/core/checkpoint/rewinder.js +291 -0
- package/dist/core/checkpoints/shadow-git.js +670 -0
- package/dist/core/citations/parser.js +109 -0
- package/dist/core/classifier/yolo-classifier.js +88 -0
- package/dist/core/codegraph/db.js +506 -0
- package/dist/core/codegraph/decision-store.js +248 -0
- package/dist/core/codegraph/detect-repo.js +459 -0
- package/dist/core/codegraph/install.js +134 -0
- package/dist/core/codegraph/offer-hook.js +220 -0
- package/dist/core/codegraph/parser.js +598 -0
- package/dist/core/codegraph/queries/go.scm +57 -0
- package/dist/core/codegraph/queries/javascript.scm +56 -0
- package/dist/core/codegraph/queries/python.scm +55 -0
- package/dist/core/codegraph/queries/rust.scm +63 -0
- package/dist/core/codegraph/queries/typescript.scm +91 -0
- package/dist/core/codegraph/reindex.js +218 -0
- package/dist/core/codegraph/resolve-edges.js +107 -0
- package/dist/core/codegraph/types.js +34 -0
- package/dist/core/codegraph/watcher.js +440 -0
- package/dist/core/compact/auto-trigger.js +96 -0
- package/dist/core/compact/buffer-rewriter.js +115 -0
- package/dist/core/compact/summarizer.js +208 -0
- package/dist/core/compact/token-counter.js +108 -0
- package/dist/core/consensus/anvil-fanout.js +25 -25
- package/dist/core/consensus/diff-capture.js +121 -12
- package/dist/core/consensus/rubric.js +21 -21
- package/dist/core/context/builder.js +6 -6
- package/dist/core/context/compaction-events.js +8 -8
- package/dist/core/context/compaction.js +31 -31
- package/dist/core/context/index.js +15 -8
- package/dist/core/context/invariants.js +51 -51
- package/dist/core/context/markdown-loader.js +28 -10
- package/dist/core/context/markdown-traverse.js +255 -0
- package/dist/core/context/pugiignore.js +41 -41
- package/dist/core/context/repo-skeleton.js +37 -37
- package/dist/core/context/tool-eviction.js +55 -0
- package/dist/core/context/watcher.js +32 -32
- package/dist/core/context/working-set.js +23 -23
- package/dist/core/coordinator/agent-tools.js +77 -0
- package/dist/core/coordinator/agent-toolset.js +65 -0
- package/dist/core/coordinator/fsm.js +73 -0
- package/dist/core/coordinator/mode-fsm.js +70 -0
- package/dist/core/cost/rate-card.js +129 -0
- package/dist/core/cost/tracker.js +221 -0
- package/dist/core/credentials.js +13 -13
- package/dist/core/cron/scheduler.js +138 -0
- package/dist/core/denial-tracking/index.js +8 -0
- package/dist/core/denial-tracking/state.js +264 -0
- package/dist/core/diagnostics/probe-runner.js +93 -0
- package/dist/core/diagnostics/probes/api.js +46 -0
- package/dist/core/diagnostics/probes/auth.js +93 -0
- package/dist/core/diagnostics/probes/bare-mode.js +42 -0
- package/dist/core/diagnostics/probes/cli-version.js +127 -0
- package/dist/core/diagnostics/probes/config.js +72 -0
- package/dist/core/diagnostics/probes/denial-tracking.js +57 -0
- package/dist/core/diagnostics/probes/disk.js +81 -0
- package/dist/core/diagnostics/probes/engine-live.js +46 -0
- package/dist/core/diagnostics/probes/git.js +65 -0
- package/dist/core/diagnostics/probes/hooks.js +118 -0
- package/dist/core/diagnostics/probes/mcp.js +75 -0
- package/dist/core/diagnostics/probes/node.js +59 -0
- package/dist/core/diagnostics/probes/pnpm.js +36 -0
- package/dist/core/diagnostics/probes/pugi-md.js +89 -0
- package/dist/core/diagnostics/probes/sandbox.js +67 -0
- package/dist/core/diagnostics/probes/session.js +74 -0
- package/dist/core/diagnostics/probes/status-snapshot.js +488 -0
- package/dist/core/diagnostics/probes/workspace.js +63 -0
- package/dist/core/diagnostics/types.js +70 -0
- package/dist/core/dispatch/cache-cleanup.js +197 -0
- package/dist/core/dispatch/cache-handoff.js +295 -0
- package/dist/core/edits/apply-patch-layer-e.js +189 -0
- package/dist/core/edits/dispatch.js +333 -7
- package/dist/core/edits/format-detector.js +260 -0
- package/dist/core/edits/format-matrix.js +26 -0
- package/dist/core/edits/fuzzy-ladder.js +650 -0
- package/dist/core/edits/index.js +5 -1
- package/dist/core/edits/journal.js +199 -0
- package/dist/core/edits/layer-a-apply.js +15 -15
- package/dist/core/edits/layer-a-fuzzy-apply.js +198 -0
- package/dist/core/edits/layer-b-apply.js +9 -9
- package/dist/core/edits/layer-c-apply.js +6 -6
- package/dist/core/edits/layer-d-ast.js +557 -14
- package/dist/core/edits/marker-parser.js +12 -12
- package/dist/core/edits/security-gate.js +27 -27
- package/dist/core/edits/verify-hook.js +273 -0
- package/dist/core/edits/worktree.js +29 -29
- package/dist/core/engine/anvil-client.js +214 -26
- package/dist/core/engine/auto-compact.js +247 -0
- package/dist/core/engine/budgets.js +220 -0
- package/dist/core/engine/compact-llm-summarizer.js +124 -0
- package/dist/core/engine/context-prefix.js +155 -0
- package/dist/core/engine/index.js +1 -1
- package/dist/core/engine/intensity.js +163 -0
- package/dist/core/engine/intent.js +260 -0
- package/dist/core/engine/native-pugi.js +1559 -227
- package/dist/core/engine/prompts.js +219 -19
- package/dist/core/engine/strip-internal-fields.js +124 -0
- package/dist/core/engine/tool-bridge.js +1887 -59
- package/dist/core/engine/verification-patterns.js +195 -0
- package/dist/core/eval/v1/ledger.js +83 -0
- package/dist/core/eval/v1/runner.js +280 -0
- package/dist/core/eval/v1/scoring.js +68 -0
- package/dist/core/eval/v1/task-loader.js +191 -0
- package/dist/core/eval/v1/types.js +14 -0
- package/dist/core/eval/v1/verifier.js +176 -0
- package/dist/core/eval/v1/yaml-parser.js +250 -0
- package/dist/core/evaluation/golden-dataset.js +293 -0
- package/dist/core/feedback/queue.js +177 -0
- package/dist/core/feedback/submitter.js +145 -0
- package/dist/core/file-cache.js +113 -1
- package/dist/core/flatten/flatten-repo.js +439 -0
- package/dist/core/format/osc8-link.js +28 -0
- package/dist/core/hook-chains.js +392 -0
- package/dist/core/hooks/citation-verify-hook.js +138 -0
- package/dist/core/hooks/citation-verify.js +112 -0
- package/dist/core/hooks/events.js +46 -0
- package/dist/core/hooks/index.js +15 -0
- package/dist/core/hooks/registry.js +216 -0
- package/dist/core/hooks/runner.js +236 -0
- package/dist/core/hooks/v2/event-emitter.js +115 -0
- package/dist/core/hooks/v2/executor.js +282 -0
- package/dist/core/hooks/v2/index.js +25 -0
- package/dist/core/hooks/v2/lifecycle.js +104 -0
- package/dist/core/hooks/v2/loader.js +216 -0
- package/dist/core/hooks/v2/matcher.js +125 -0
- package/dist/core/hooks/v2/trust.js +143 -0
- package/dist/core/hooks/v2/types.js +86 -0
- package/dist/core/hooks/worktree-events.js +158 -0
- package/dist/core/image/renderer.js +71 -0
- package/dist/core/init/detector.js +582 -0
- package/dist/core/init/template-renderer.js +242 -0
- package/dist/core/jobs/registry.js +18 -18
- package/dist/core/ledger/results-tsv.js +142 -0
- package/dist/core/log-discipline/stdout-redirect.js +51 -0
- package/dist/core/lsp/cache.js +105 -0
- package/dist/core/lsp/client.js +551 -41
- package/dist/core/lsp/language-detect.js +66 -0
- package/dist/core/lsp/post-edit-diagnostics.js +171 -0
- package/dist/core/lsp/server-detect.js +173 -0
- package/dist/core/lsp/symbol-cache.js +162 -0
- package/dist/core/lsp/symbol-tools.js +664 -0
- package/dist/core/mcp/client.js +97 -28
- package/dist/core/mcp/http-server.js +553 -0
- package/dist/core/mcp/orchestrator-config.js +192 -0
- package/dist/core/mcp/orchestrator-tools.js +806 -0
- package/dist/core/mcp/permission.js +190 -0
- package/dist/core/mcp/registry.js +39 -17
- package/dist/core/mcp/server-tools.js +219 -0
- package/dist/core/mcp/server.js +397 -0
- package/dist/core/mcp/trust.js +10 -10
- package/dist/core/memory/dual-write.js +416 -0
- package/dist/core/memory/passive-extract.js +130 -0
- package/dist/core/memory/phase1-kinds.js +20 -0
- package/dist/core/memory/secret-scanner.js +304 -0
- package/dist/core/memory-sync/queue.js +170 -0
- package/dist/core/metrics/extract.js +113 -0
- package/dist/core/modes/roo-modes.js +68 -0
- package/dist/core/notes/notes-paths.js +113 -0
- package/dist/core/notes/notes-recorder.js +140 -0
- package/dist/core/notes/notes-writer.js +53 -0
- package/dist/core/notes/renderers.js +0 -0
- package/dist/core/notes/slug.js +105 -0
- package/dist/core/onboarding/ensure-initialized.js +133 -0
- package/dist/core/onboarding/marker.js +111 -0
- package/dist/core/onboarding/telemetry-state.js +108 -0
- package/dist/core/output-style/presets.js +176 -0
- package/dist/core/output-style/state.js +185 -0
- package/dist/core/path-security.js +287 -5
- package/dist/core/permission.js +82 -22
- package/dist/core/permissions/auto-classifier.js +124 -0
- package/dist/core/permissions/bash-parser.js +371 -0
- package/dist/core/permissions/circuit-breaker.js +83 -0
- package/dist/core/permissions/constrained-edit.js +91 -0
- package/dist/core/permissions/gate.js +278 -0
- package/dist/core/permissions/index.js +20 -0
- package/dist/core/permissions/mode.js +174 -0
- package/dist/core/permissions/network-egress.js +137 -0
- package/dist/core/permissions/state.js +241 -0
- package/dist/core/permissions/tool-class.js +107 -0
- package/dist/core/plan-mode/ui-state.js +51 -0
- package/dist/core/plans/plan-artifact.js +721 -0
- package/dist/core/policy-limits/etag-store.js +122 -0
- package/dist/core/prd-check/parser.js +215 -0
- package/dist/core/prd-check/reporter.js +127 -0
- package/dist/core/prd-check/session-review.js +557 -0
- package/dist/core/prd-check/verifiers.js +223 -0
- package/dist/core/prompt-cache/client-cache.js +99 -0
- package/dist/core/prompts/assembly.js +29 -0
- package/dist/core/prompts/registry.js +364 -0
- package/dist/core/pugi-gitignore.js +52 -0
- package/dist/core/pugi-md/cc-compat-rules.js +735 -0
- package/dist/core/pugi-md/context-injector.js +76 -0
- package/dist/core/pugi-md/walk-up.js +207 -0
- package/dist/core/python/uv-installer.js +270 -0
- package/dist/core/python/uv-resolver.js +83 -0
- package/dist/core/rate-limit/narrator.js +146 -0
- package/dist/core/recipes/cli-types.js +20 -0
- package/dist/core/recipes/loader.js +103 -0
- package/dist/core/recipes/runner.js +345 -0
- package/dist/core/recipes/schema.js +587 -0
- package/dist/core/release-notes/parser.js +241 -0
- package/dist/core/release-notes/state.js +116 -0
- package/dist/core/repl/ask.js +37 -37
- package/dist/core/repl/cancellation.js +26 -26
- package/dist/core/repl/cap-warning.js +4 -4
- package/dist/core/repl/clipboard-read.js +11 -11
- package/dist/core/repl/dispatch-fsm.js +12 -12
- package/dist/core/repl/engine-bridge.js +303 -0
- package/dist/core/repl/history-search.js +15 -15
- package/dist/core/repl/history.js +28 -18
- package/dist/core/repl/kill-ring.js +5 -5
- package/dist/core/repl/model-pricing.js +135 -0
- package/dist/core/repl/privacy-banner.js +22 -22
- package/dist/core/repl/session.js +2690 -229
- package/dist/core/repl/slash-commands.js +540 -41
- package/dist/core/repl/store/index.js +1 -1
- package/dist/core/repl/store/jsonl-log.js +22 -22
- package/dist/core/repl/store/lockfile.js +10 -10
- package/dist/core/repl/store/session-store.js +136 -107
- package/dist/core/repl/store/types.js +15 -15
- package/dist/core/repl/store/uuid-v7.js +12 -12
- package/dist/core/repl/tool-route.js +382 -0
- package/dist/core/repl/workspace-context.js +43 -21
- package/dist/core/repo-map/build.js +125 -0
- package/dist/core/repo-map/cache.js +185 -0
- package/dist/core/repo-map/extractor.js +254 -0
- package/dist/core/repo-map/formatter.js +145 -0
- package/dist/core/repo-map/page-rank.js +105 -0
- package/dist/core/repo-map/scanner.js +211 -0
- package/dist/core/retro/git-collector.js +251 -0
- package/dist/core/retro/health-card.js +25 -0
- package/dist/core/retro/metrics.js +342 -0
- package/dist/core/retro/narrative.js +249 -0
- package/dist/core/retro/plane-collector.js +274 -0
- package/dist/core/retro/pr-issue-link.js +65 -0
- package/dist/core/retro/types.js +16 -0
- package/dist/core/retry-budget/budget.js +284 -0
- package/dist/core/retry-budget/index.js +5 -0
- package/dist/core/retry-budget/retry-cap.js +74 -0
- package/dist/core/routing/lead-worker.js +43 -0
- package/dist/core/routing/pre-flight-estimator.js +108 -0
- package/dist/core/runs/run-tree.js +103 -0
- package/dist/core/sandboxing/adapter.js +43 -0
- package/dist/core/sandboxing/bubblewrap.js +209 -0
- package/dist/core/sandboxing/index.js +78 -0
- package/dist/core/sandboxing/none.js +19 -0
- package/dist/core/sandboxing/policy.js +97 -0
- package/dist/core/sandboxing/seatbelt.js +231 -0
- package/dist/core/security/injection-scanner.js +367 -0
- package/dist/core/security/output-filter.js +418 -0
- package/dist/core/session/env-file.js +105 -0
- package/dist/core/session/section-budgets.js +140 -0
- package/dist/core/session.js +119 -0
- package/dist/core/settings.js +402 -5
- package/dist/core/share/formatter.js +271 -0
- package/dist/core/share/redactor.js +221 -0
- package/dist/core/share/uploader.js +267 -0
- package/dist/core/skills/defaults.js +30 -30
- package/dist/core/skills/loader.js +22 -22
- package/dist/core/skills/sources.js +27 -27
- package/dist/core/smoke/headless-driver.js +174 -0
- package/dist/core/smoke/orchestrator.js +194 -0
- package/dist/core/smoke/runner.js +238 -0
- package/dist/core/smoke/scenario-parser.js +316 -0
- package/dist/core/statusline.js +99 -0
- package/dist/core/subagents/dispatcher-real.js +600 -0
- package/dist/core/subagents/dispatcher.js +146 -52
- package/dist/core/subagents/index.js +19 -6
- package/dist/core/subagents/isolation-matrix.js +213 -0
- package/dist/core/subagents/spawn.js +19 -4
- package/dist/core/telemetry/emitter.js +229 -0
- package/dist/core/telemetry/queue.js +251 -0
- package/dist/core/theme/context.js +91 -0
- package/dist/core/theme/presets.js +228 -0
- package/dist/core/theme/state.js +181 -0
- package/dist/core/todos/invariant.js +10 -0
- package/dist/core/todos/state.js +177 -0
- package/dist/core/tool-schema/compressor.js +89 -0
- package/dist/core/transport/version-interceptor.js +166 -0
- package/dist/core/trust.js +2 -2
- package/dist/core/tui/thinking-block.js +64 -0
- package/dist/core/vim/keymap.js +288 -0
- package/dist/core/vim/state.js +92 -0
- package/dist/core/watch-markers/marker-watcher.js +133 -0
- package/dist/core/worktree/include-parser.js +249 -0
- package/dist/core/worktree-manager/cleanup.js +123 -0
- package/dist/core/worktree-manager/manager.js +303 -0
- package/dist/index.js +36 -0
- package/dist/runtime/bootstrap.js +190 -0
- package/dist/runtime/cli.js +4403 -561
- package/dist/runtime/commands/agents.js +31 -31
- package/dist/runtime/commands/budget.js +5 -5
- package/dist/runtime/commands/cancel.js +231 -0
- package/dist/runtime/commands/chain.js +489 -0
- package/dist/runtime/commands/codegraph-status.js +227 -0
- package/dist/runtime/commands/compact.js +297 -0
- package/dist/runtime/commands/config.js +74 -40
- package/dist/runtime/commands/cost.js +199 -0
- package/dist/runtime/commands/delegate.js +27 -4
- package/dist/runtime/commands/dispatch.js +126 -0
- package/dist/runtime/commands/doctor.js +579 -0
- package/dist/runtime/commands/eval-v1.js +266 -0
- package/dist/runtime/commands/feedback.js +184 -0
- package/dist/runtime/commands/hooks.js +187 -0
- package/dist/runtime/commands/index-cmd.js +459 -0
- package/dist/runtime/commands/init.js +254 -0
- package/dist/runtime/commands/lsp.js +200 -38
- package/dist/runtime/commands/mcp.js +935 -0
- package/dist/runtime/commands/memory.js +582 -0
- package/dist/runtime/commands/model.js +237 -0
- package/dist/runtime/commands/onboarding.js +275 -0
- package/dist/runtime/commands/patch.js +12 -12
- package/dist/runtime/commands/permissions.js +112 -0
- package/dist/runtime/commands/plan.js +143 -0
- package/dist/runtime/commands/prd-check.js +285 -0
- package/dist/runtime/commands/privacy.js +17 -17
- package/dist/runtime/commands/recipe.js +325 -0
- package/dist/runtime/commands/redo-blob-store.js +92 -0
- package/dist/runtime/commands/redo.js +361 -0
- package/dist/runtime/commands/release-notes.js +229 -0
- package/dist/runtime/commands/repo-map.js +95 -0
- package/dist/runtime/commands/report.js +299 -0
- package/dist/runtime/commands/resume.js +118 -0
- package/dist/runtime/commands/review-consensus.js +68 -53
- package/dist/runtime/commands/rewind.js +333 -0
- package/dist/runtime/commands/roster.js +14 -14
- package/dist/runtime/commands/servers-cli.js +182 -0
- package/dist/runtime/commands/servers.js +236 -0
- package/dist/runtime/commands/sessions.js +163 -0
- package/dist/runtime/commands/share.js +316 -0
- package/dist/runtime/commands/skills.js +31 -31
- package/dist/runtime/commands/status.js +186 -0
- package/dist/runtime/commands/stickers.js +82 -0
- package/dist/runtime/commands/style.js +194 -0
- package/dist/runtime/commands/theme.js +196 -0
- package/dist/runtime/commands/undo.js +54 -22
- package/dist/runtime/commands/update.js +289 -0
- package/dist/runtime/commands/vim.js +140 -0
- package/dist/runtime/commands/worktree.js +8 -8
- package/dist/runtime/commands/worktrees.js +155 -0
- package/dist/runtime/deprecation-warning.js +69 -0
- package/dist/runtime/engine-exit-code.js +50 -0
- package/dist/runtime/headless-repl.js +195 -0
- package/dist/runtime/headless.js +548 -0
- package/dist/runtime/load-hooks-or-exit.js +71 -0
- package/dist/runtime/plan-decompose.js +22 -22
- package/dist/runtime/sigint-guard.js +272 -0
- package/dist/runtime/stream-renderer.js +195 -0
- package/dist/runtime/update-check.js +28 -28
- package/dist/runtime/version.js +65 -0
- package/dist/runtime/worktree-bootstrap.js +579 -0
- package/dist/skills/bundled/batch.js +617 -0
- package/dist/skills/bundled/index.js +45 -0
- package/dist/skills/bundled/loop.js +358 -0
- package/dist/skills/bundled/remember.js +383 -0
- package/dist/skills/bundled/simplify.js +289 -0
- package/dist/skills/bundled/skillify.js +373 -0
- package/dist/skills/bundled/stuck.js +558 -0
- package/dist/skills/bundled/verify.js +439 -0
- package/dist/testing/vcr.js +486 -0
- package/dist/tools/agent-tool.js +229 -0
- package/dist/tools/apply-patch.js +89 -28
- package/dist/tools/ask-user-question.js +337 -0
- package/dist/tools/ask-user.js +115 -0
- package/dist/tools/bash.js +811 -49
- package/dist/tools/brief.js +224 -0
- package/dist/tools/cron.js +433 -0
- package/dist/tools/enter-worktree.js +250 -0
- package/dist/tools/exit-worktree.js +147 -0
- package/dist/tools/file-tools.js +161 -44
- package/dist/tools/http-request.js +336 -0
- package/dist/tools/lsp-tools.js +377 -1
- package/dist/tools/mcp-tool.js +260 -0
- package/dist/tools/multi-edit.js +361 -0
- package/dist/tools/powershell.js +268 -0
- package/dist/tools/registry.js +120 -5
- package/dist/tools/server-tools.js +892 -0
- package/dist/tools/skill-tool.js +96 -0
- package/dist/tools/sleep.js +99 -0
- package/dist/tools/synthetic-output.js +133 -0
- package/dist/tools/tasks.js +208 -0
- package/dist/tools/todo-write.js +184 -0
- package/dist/tools/verify-plan-execution.js +295 -0
- package/dist/tools/web-fetch-injection-scanner.js +207 -0
- package/dist/tools/web-fetch.js +195 -10
- package/dist/tools/web-search.js +458 -0
- package/dist/tui/agent-progress-card.js +111 -0
- package/dist/tui/agent-tree.js +22 -1
- package/dist/tui/ask-modal.js +14 -14
- package/dist/tui/ask-user-question-chips.js +315 -0
- package/dist/tui/ask-user-question-prompt.js +203 -0
- package/dist/tui/compact-banner.js +81 -0
- package/dist/tui/conversation-pane.js +85 -11
- package/dist/tui/cost-table.js +111 -0
- package/dist/tui/device-flow.js +2 -2
- package/dist/tui/doctor-table.js +46 -0
- package/dist/tui/feedback-prompt.js +156 -0
- package/dist/tui/input-box.js +247 -32
- package/dist/tui/login-picker.js +3 -3
- package/dist/tui/markdown-render.js +6 -6
- package/dist/tui/multi-file-diff-approval.js +375 -0
- package/dist/tui/onboarding-wizard.js +240 -0
- package/dist/tui/permissions-picker.js +86 -0
- package/dist/tui/render.js +36 -1
- package/dist/tui/repl-render.js +239 -25
- package/dist/tui/repl-splash-art.js +16 -16
- package/dist/tui/repl-splash-mascot.js +48 -24
- package/dist/tui/repl-splash.js +22 -22
- package/dist/tui/repl.js +125 -45
- package/dist/tui/slash-palette.js +6 -6
- package/dist/tui/splash.js +2 -2
- package/dist/tui/status-bar.js +109 -31
- package/dist/tui/status-table.js +7 -0
- package/dist/tui/stickers-art.js +136 -0
- package/dist/tui/style-table.js +28 -0
- package/dist/tui/theme-table.js +29 -0
- package/dist/tui/thinking-spinner.js +123 -0
- package/dist/tui/tool-stream-pane.js +53 -4
- package/dist/tui/update-banner.js +27 -2
- package/dist/tui/vim-input.js +267 -0
- package/dist/tui/welcome-banner.js +107 -0
- package/dist/tui/welcome-data.js +293 -0
- package/dist/tui/workspace-context.js +2 -2
- package/package.json +29 -6
- package/test/scenarios/codegen-create-file.scenario.txt +13 -0
- package/test/scenarios/compact-force.scenario.txt +12 -0
- package/test/scenarios/identity.scenario.txt +11 -0
- package/test/scenarios/persona-handoff.scenario.txt +12 -0
- package/test/scenarios/walkback.scenario.txt +12 -0
- package/dist/core/engine/compaction-hook.js +0 -154
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR H (2026-06-05): `/servers` slash command — list + stop server-
|
|
3
|
+
* started processes the operator can't otherwise kill from inside
|
|
4
|
+
* the REPL.
|
|
5
|
+
*
|
|
6
|
+
* Customer pain (CEO 2026-06-05): Hiroshi launched a Vite dev server
|
|
7
|
+
* via `server_start` tool (PID 45800 on :5173), persona answered
|
|
8
|
+
* "use `pugi stop`" — but `/stop <persona>` halts a persona agent,
|
|
9
|
+
* not a server process. Server kept running until manual
|
|
10
|
+
* `kill 45800`.
|
|
11
|
+
*
|
|
12
|
+
* Fix: surface the existing `server_start` meta files (which already
|
|
13
|
+
* persist `.pugi/runs/srv-<uuid>/server.json` per the
|
|
14
|
+
* server-tools.ts spec) as a first-class operator-facing list +
|
|
15
|
+
* kill command. The `server_stop` TOOL already exists for LLM
|
|
16
|
+
* dispatch (SIGTERM → grace → SIGKILL ladder via
|
|
17
|
+
* `dispatchServerStop`); we wire it through to a slash command so
|
|
18
|
+
* the operator no longer needs to copy PIDs out of agent text.
|
|
19
|
+
*
|
|
20
|
+
* Surface:
|
|
21
|
+
*
|
|
22
|
+
* /servers → table of tracked servers
|
|
23
|
+
* /servers stop <runId> → kill one by run id (srv-...)
|
|
24
|
+
* /servers stop <pid> → kill one by pid (numeric)
|
|
25
|
+
* /servers stop all → kill every alive tracked srv
|
|
26
|
+
*
|
|
27
|
+
* Everything is best-effort. A missing `.pugi/runs/` dir = empty
|
|
28
|
+
* list, not an error. A stale `server.json` for a process that
|
|
29
|
+
* already exited stays listed as `dead` so the operator can see it
|
|
30
|
+
* happened.
|
|
31
|
+
*/
|
|
32
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
33
|
+
import { join } from 'node:path';
|
|
34
|
+
function runsDir(workspaceRoot) {
|
|
35
|
+
return join(workspaceRoot, '.pugi', 'runs');
|
|
36
|
+
}
|
|
37
|
+
function isAlive(pid, killImpl) {
|
|
38
|
+
try {
|
|
39
|
+
killImpl(pid, 0);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Read every `<runs>/srv-<uuid>/server.json` and project к `ServerEntry`.
|
|
48
|
+
* Pure: takes the workspace + kill impl (для liveness check), returns
|
|
49
|
+
* a stable-sorted (oldest-first) list. Failure modes:
|
|
50
|
+
* - missing runs dir → []
|
|
51
|
+
* - unreadable / malformed JSON → entry omitted (no throw)
|
|
52
|
+
* - meta carries no pid → entry kept but `alive=false`
|
|
53
|
+
*/
|
|
54
|
+
export function listServers(workspaceRoot, killImpl = (pid, signal) => {
|
|
55
|
+
process.kill(pid, signal);
|
|
56
|
+
}) {
|
|
57
|
+
const dir = runsDir(workspaceRoot);
|
|
58
|
+
if (!existsSync(dir))
|
|
59
|
+
return [];
|
|
60
|
+
let names = [];
|
|
61
|
+
try {
|
|
62
|
+
names = readdirSync(dir, { withFileTypes: true })
|
|
63
|
+
.filter((e) => e.isDirectory() && e.name.startsWith('srv-'))
|
|
64
|
+
.map((e) => e.name)
|
|
65
|
+
.sort();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
const out = [];
|
|
71
|
+
for (const runId of names) {
|
|
72
|
+
const metaPath = join(dir, runId, 'server.json');
|
|
73
|
+
if (!existsSync(metaPath))
|
|
74
|
+
continue;
|
|
75
|
+
let meta;
|
|
76
|
+
try {
|
|
77
|
+
meta = JSON.parse(readFileSync(metaPath, 'utf8'));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const pid = typeof meta['pid'] === 'number' ? meta['pid'] : null;
|
|
83
|
+
out.push({
|
|
84
|
+
runId,
|
|
85
|
+
pid,
|
|
86
|
+
port: typeof meta['port'] === 'number' ? meta['port'] : null,
|
|
87
|
+
command: typeof meta['command'] === 'string' ? meta['command'] : null,
|
|
88
|
+
startedAt: typeof meta['startedAt'] === 'string' ? meta['startedAt'] : null,
|
|
89
|
+
healthStatus: typeof meta['healthStatus'] === 'number' ? meta['healthStatus'] : null,
|
|
90
|
+
alive: pid !== null ? isAlive(pid, killImpl) : false,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Kill one or more servers. Strategy:
|
|
97
|
+
* - `target === 'all'` — kill every alive entry
|
|
98
|
+
* - target matches `srv-...` — match by runId (exact)
|
|
99
|
+
* - target is numeric — match by pid
|
|
100
|
+
*
|
|
101
|
+
* Uses the same SIGTERM → 5s grace → SIGKILL ladder as the
|
|
102
|
+
* `server_stop` tool. Failures silent (entry stays listed as alive
|
|
103
|
+
* on next `/servers` if SIGKILL also fails — operator escalates
|
|
104
|
+
* manually).
|
|
105
|
+
*/
|
|
106
|
+
export async function stopServers(workspaceRoot, target, options) {
|
|
107
|
+
const killImpl = options.killImpl ??
|
|
108
|
+
((pid, signal) => {
|
|
109
|
+
process.kill(pid, signal);
|
|
110
|
+
});
|
|
111
|
+
const entries = listServers(workspaceRoot, killImpl);
|
|
112
|
+
if (entries.length === 0)
|
|
113
|
+
return { kind: 'empty' };
|
|
114
|
+
const targets = [];
|
|
115
|
+
if (target === 'all') {
|
|
116
|
+
targets.push(...entries.filter((e) => e.alive));
|
|
117
|
+
}
|
|
118
|
+
else if (/^srv-/.test(target)) {
|
|
119
|
+
const hit = entries.find((e) => e.runId === target);
|
|
120
|
+
if (!hit)
|
|
121
|
+
return { kind: 'not-found', query: target };
|
|
122
|
+
targets.push(hit);
|
|
123
|
+
}
|
|
124
|
+
else if (/^\d+$/.test(target)) {
|
|
125
|
+
const wanted = Number(target);
|
|
126
|
+
const hit = entries.find((e) => e.pid === wanted);
|
|
127
|
+
if (!hit)
|
|
128
|
+
return { kind: 'not-found', query: target };
|
|
129
|
+
targets.push(hit);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
return { kind: 'not-found', query: target };
|
|
133
|
+
}
|
|
134
|
+
if (targets.length === 0)
|
|
135
|
+
return { kind: 'empty' };
|
|
136
|
+
const killed = [];
|
|
137
|
+
let notFound = 0;
|
|
138
|
+
for (const entry of targets) {
|
|
139
|
+
if (entry.pid === null) {
|
|
140
|
+
notFound += 1;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (!isAlive(entry.pid, killImpl)) {
|
|
144
|
+
// already dead — treat as success (operator's intent matched)
|
|
145
|
+
killed.push(entry);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
killImpl(entry.pid, 'SIGTERM');
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// SIGTERM refused → escalate
|
|
153
|
+
}
|
|
154
|
+
// Grace window: poll for exit up to 5s.
|
|
155
|
+
const deadline = Date.now() + 5_000;
|
|
156
|
+
while (Date.now() < deadline) {
|
|
157
|
+
if (!isAlive(entry.pid, killImpl))
|
|
158
|
+
break;
|
|
159
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
160
|
+
}
|
|
161
|
+
if (isAlive(entry.pid, killImpl)) {
|
|
162
|
+
try {
|
|
163
|
+
killImpl(entry.pid, 'SIGKILL');
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
notFound += 1;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
killed.push(entry);
|
|
171
|
+
}
|
|
172
|
+
return { kind: 'stopped', killed, notFound };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Slash entry. The session dispatcher calls this с the parsed verdict
|
|
176
|
+
* and an IO sink that pipes lines к the REPL system pane.
|
|
177
|
+
*/
|
|
178
|
+
export async function runServersCommand(mode, io, options) {
|
|
179
|
+
if (mode.kind === 'list') {
|
|
180
|
+
const entries = listServers(options.workspaceRoot, options.killImpl);
|
|
181
|
+
renderList(entries, io);
|
|
182
|
+
return { kind: 'listed', entries };
|
|
183
|
+
}
|
|
184
|
+
const result = await stopServers(options.workspaceRoot, mode.target, options);
|
|
185
|
+
renderStopResult(result, io);
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
function renderList(entries, io) {
|
|
189
|
+
if (entries.length === 0) {
|
|
190
|
+
io.write('No tracked servers (.pugi/runs/srv-* empty).');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
io.write(`Tracked servers (${entries.length}):`);
|
|
194
|
+
for (const e of entries) {
|
|
195
|
+
const status = e.alive ? 'alive' : 'dead';
|
|
196
|
+
const port = e.port !== null ? `:${e.port}` : '';
|
|
197
|
+
const pid = e.pid !== null ? `pid=${e.pid}` : 'pid=?';
|
|
198
|
+
const cmd = e.command ? truncate(e.command, 60) : '<unknown>';
|
|
199
|
+
io.write(` ${e.runId} [${status}] ${pid} ${port} ${cmd}`);
|
|
200
|
+
}
|
|
201
|
+
io.write('Use `/servers stop <runId|pid|all>` to terminate.');
|
|
202
|
+
}
|
|
203
|
+
function renderStopResult(result, io) {
|
|
204
|
+
switch (result.kind) {
|
|
205
|
+
case 'empty':
|
|
206
|
+
io.write('No alive servers to stop.');
|
|
207
|
+
return;
|
|
208
|
+
case 'not-found':
|
|
209
|
+
io.write(`No server matches '${result.query}'. Run \`/servers\` to list.`);
|
|
210
|
+
return;
|
|
211
|
+
case 'stopped': {
|
|
212
|
+
if (result.killed.length === 0) {
|
|
213
|
+
io.write(`Stop dispatched but 0 servers terminated (${result.notFound} miss).`);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
io.write(`Stopped ${result.killed.length} server(s):`);
|
|
217
|
+
for (const e of result.killed) {
|
|
218
|
+
io.write(` ${e.runId} pid=${e.pid ?? '?'}${e.port !== null ? ` :${e.port}` : ''}`);
|
|
219
|
+
}
|
|
220
|
+
if (result.notFound > 0) {
|
|
221
|
+
io.write(`(${result.notFound} entry skipped — no pid or kill failed)`);
|
|
222
|
+
}
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
case 'error':
|
|
226
|
+
io.write(`Error: ${result.message}`);
|
|
227
|
+
return;
|
|
228
|
+
case 'listed':
|
|
229
|
+
// not used in stop path
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function truncate(s, max) {
|
|
234
|
+
return s.length > max ? `${s.slice(0, max - 1)}…` : s;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=servers.js.map
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pugi sessions` extensions — .
|
|
3
|
+
*
|
|
4
|
+
* The legacy `pugi sessions` handler lives inline in `runtime/cli.ts`
|
|
5
|
+
* (it predates the per-command runner pattern). This module exposes the
|
|
6
|
+
* new sub-commands the L9 sprint adds:
|
|
7
|
+
*
|
|
8
|
+
* - `pugi sessions undo-rewind [<session-id>]`
|
|
9
|
+
* Append an inverse marker that nullifies the latest 'rewind'
|
|
10
|
+
* marker on the target session. Operator escape hatch: nothing
|
|
11
|
+
* is destroyed, the masked range simply becomes visible again.
|
|
12
|
+
*
|
|
13
|
+
* Wire pattern matches `runCompactCommand` / `runRewindCommand`: one
|
|
14
|
+
* structured payload + one human line per invocation, returned to the
|
|
15
|
+
* caller for the JSON path.
|
|
16
|
+
*/
|
|
17
|
+
import { homedir } from 'node:os';
|
|
18
|
+
import { slugForCwd } from '../../core/repl/history.js';
|
|
19
|
+
import { appendRewindMarker, findLatestActiveRewind, } from '../../core/checkpoint/rewinder.js';
|
|
20
|
+
import { loadFromStore } from '../../core/checkpoint/resumer.js';
|
|
21
|
+
import { SqliteSessionStore, resolveProjectStoreDir, } from '../../core/repl/store/session-store.js';
|
|
22
|
+
/**
|
|
23
|
+
* Sub-command router. The caller passes the full positional args; we
|
|
24
|
+
* peel `args[0]` as the sub-command name and forward the tail. Unknown
|
|
25
|
+
* sub-commands surface a usage hint at exit code 2.
|
|
26
|
+
*/
|
|
27
|
+
export async function runSessionsCommand(args, ctx) {
|
|
28
|
+
const sub = args[0];
|
|
29
|
+
if (sub === 'undo-rewind') {
|
|
30
|
+
return runUndoRewind(args.slice(1), ctx);
|
|
31
|
+
}
|
|
32
|
+
// Other sub-commands (the legacy `pugi sessions` list path) are
|
|
33
|
+
// owned by runtime/cli.ts — return null so the caller knows to fall
|
|
34
|
+
// through to that handler.
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
async function runUndoRewind(args, ctx) {
|
|
38
|
+
const explicitId = args[0] && !args[0].startsWith('--') ? args[0] : undefined;
|
|
39
|
+
const slug = slugForCwd(ctx.workspaceRoot);
|
|
40
|
+
let store = ctx.store ?? null;
|
|
41
|
+
let sessionId = ctx.sessionId ?? explicitId ?? null;
|
|
42
|
+
let storeOpenedHere = false;
|
|
43
|
+
if (store === null) {
|
|
44
|
+
sessionId = sessionId ?? (await pickMostRecentSessionIdReadOnly(slug));
|
|
45
|
+
if (!sessionId) {
|
|
46
|
+
return emit(ctx, {
|
|
47
|
+
command: 'sessions',
|
|
48
|
+
sub: 'undo-rewind',
|
|
49
|
+
status: 'failed_no_session',
|
|
50
|
+
reason: 'No session to undo-rewind. Start a REPL with `pugi`.',
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const opened = await openLiveStore(slug, sessionId);
|
|
54
|
+
if (!opened) {
|
|
55
|
+
return emit(ctx, {
|
|
56
|
+
command: 'sessions',
|
|
57
|
+
sub: 'undo-rewind',
|
|
58
|
+
status: 'failed_store',
|
|
59
|
+
sessionId,
|
|
60
|
+
reason: 'Could not open local session store (lock held by another REPL?).',
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
store = opened;
|
|
64
|
+
storeOpenedHere = true;
|
|
65
|
+
}
|
|
66
|
+
else if (sessionId === null) {
|
|
67
|
+
const rows = await store.listSessions({ project: slug, limit: 1, status: 'active' });
|
|
68
|
+
if (rows.length === 0) {
|
|
69
|
+
return emit(ctx, {
|
|
70
|
+
command: 'sessions',
|
|
71
|
+
sub: 'undo-rewind',
|
|
72
|
+
status: 'failed_no_session',
|
|
73
|
+
reason: 'No active session to undo-rewind.',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
sessionId = rows[0].id;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const loaded = await loadFromStore(store, sessionId);
|
|
80
|
+
if (!loaded) {
|
|
81
|
+
return emit(ctx, {
|
|
82
|
+
command: 'sessions',
|
|
83
|
+
sub: 'undo-rewind',
|
|
84
|
+
status: 'failed_no_session',
|
|
85
|
+
sessionId,
|
|
86
|
+
reason: `Session '${sessionId}' not found.`,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const latest = findLatestActiveRewind(loaded.rawEvents);
|
|
90
|
+
if (latest === null) {
|
|
91
|
+
return emit(ctx, {
|
|
92
|
+
command: 'sessions',
|
|
93
|
+
sub: 'undo-rewind',
|
|
94
|
+
status: 'noop_no_rewind',
|
|
95
|
+
sessionId,
|
|
96
|
+
reason: 'No active rewind to undo on this session.',
|
|
97
|
+
}, 'No active rewind to undo.');
|
|
98
|
+
}
|
|
99
|
+
const fromEventIndex = loaded.rawEvents.length;
|
|
100
|
+
await appendRewindMarker({
|
|
101
|
+
store,
|
|
102
|
+
mode: 'undo-rewind',
|
|
103
|
+
toEventIndex: latest.payload.toEventIndex,
|
|
104
|
+
fromEventIndex,
|
|
105
|
+
turnsRewound: latest.payload.turnsRewound,
|
|
106
|
+
reason: 'undo',
|
|
107
|
+
...(ctx.now !== undefined ? { now: ctx.now } : {}),
|
|
108
|
+
});
|
|
109
|
+
return emit(ctx, {
|
|
110
|
+
command: 'sessions',
|
|
111
|
+
sub: 'undo-rewind',
|
|
112
|
+
status: 'undone',
|
|
113
|
+
sessionId,
|
|
114
|
+
undoneTurns: latest.payload.turnsRewound,
|
|
115
|
+
}, `Undid the latest rewind (${latest.payload.turnsRewound} turn${latest.payload.turnsRewound === 1 ? '' : 's'} restored).`);
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
if (storeOpenedHere && store) {
|
|
119
|
+
try {
|
|
120
|
+
await store.close();
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
/* idempotent */
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function emit(ctx, payload, text) {
|
|
129
|
+
const human = text ?? payload.reason ?? `sessions ${payload.sub}: ${payload.status}`;
|
|
130
|
+
ctx.writeOutput(payload, human);
|
|
131
|
+
return payload;
|
|
132
|
+
}
|
|
133
|
+
async function openLiveStore(projectSlug, sessionId) {
|
|
134
|
+
try {
|
|
135
|
+
const store = new SqliteSessionStore({ projectSlug, home: homedir() });
|
|
136
|
+
await store.open({
|
|
137
|
+
id: sessionId,
|
|
138
|
+
workspaceRoot: process.cwd(),
|
|
139
|
+
projectSlug,
|
|
140
|
+
});
|
|
141
|
+
return store;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function pickMostRecentSessionIdReadOnly(projectSlug) {
|
|
148
|
+
try {
|
|
149
|
+
const dir = resolveProjectStoreDir(projectSlug, homedir());
|
|
150
|
+
const view = await SqliteSessionStore.openReadOnly(dir);
|
|
151
|
+
try {
|
|
152
|
+
const rows = await view.list({ project: projectSlug, limit: 1, status: 'active' });
|
|
153
|
+
return rows.length > 0 ? rows[0].id : null;
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
await view.close();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=sessions.js.map
|