@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,241 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-workspace permission-mode session state — .
|
|
3
|
-
*
|
|
4
|
-
* State lives in `.pugi/session.json` under the workspace root. The
|
|
5
|
-
* file is read on first `getCurrentMode()` call (cached for the
|
|
6
|
-
* process lifetime) and written atomically via tmp+rename on
|
|
7
|
-
* `setCurrentMode()` so a kill mid-write does not corrupt the JSON.
|
|
8
|
-
*
|
|
9
|
-
* Resolution order for the effective mode on a fresh process:
|
|
10
|
-
* 1. CLI flag (`pugi --mode plan`) — passed via `resolveMode` arg;
|
|
11
|
-
* not read from disk here.
|
|
12
|
-
* 2. Workspace session state — `<root>/.pugi/session.json` field
|
|
13
|
-
* `permissionMode`.
|
|
14
|
-
* 3. Global config — `~/.pugi/config.json` field
|
|
15
|
-
* `defaultPermissionMode`.
|
|
16
|
-
* 4. Hard default `ask`.
|
|
17
|
-
*
|
|
18
|
-
* This module owns layers 2 + 3. The CLI arg parser owns layer 1; both
|
|
19
|
-
* funnel into `resolveMode()` which performs the merge.
|
|
20
|
-
*/
|
|
21
|
-
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
22
|
-
import { dirname, resolve } from 'node:path';
|
|
23
|
-
import { homedir } from 'node:os';
|
|
24
|
-
import { z } from 'zod';
|
|
25
|
-
import { DEFAULT_PERMISSION_MODE, parsePermissionMode, } from './mode.js';
|
|
26
|
-
/**
|
|
27
|
-
* : zod enum for the canonical 6-mode taxonomy. Includes
|
|
28
|
-
* aliases (`ask`, `allow`, `bypass`) as accepted input — Zod parses
|
|
29
|
-
* them, the helpers below remap к canonical names before returning к
|
|
30
|
-
* the caller. Persistence always writes the canonical name so the file
|
|
31
|
-
* migrates forward on next save.
|
|
32
|
-
*/
|
|
33
|
-
const permissionModeEnum = z.enum([
|
|
34
|
-
// Canonical names.
|
|
35
|
-
'default',
|
|
36
|
-
'acceptEdits',
|
|
37
|
-
'plan',
|
|
38
|
-
'auto',
|
|
39
|
-
'dontAsk',
|
|
40
|
-
'bypassPermissions',
|
|
41
|
-
// backwards-compat aliases — resolved via parsePermissionMode.
|
|
42
|
-
'ask',
|
|
43
|
-
'allow',
|
|
44
|
-
'bypass',
|
|
45
|
-
]);
|
|
46
|
-
const sessionStateSchema = z
|
|
47
|
-
.object({
|
|
48
|
-
permissionMode: permissionModeEnum.optional(),
|
|
49
|
-
/**
|
|
50
|
-
* snapshot of the mode that was active immediately BEFORE
|
|
51
|
-
* the operator typed `/plan` (or `/plan <prompt>`). `/plan --back`
|
|
52
|
-
* pops this snapshot and restores it. Cleared after a successful
|
|
53
|
-
* pop so a second `/plan --back` does not double-revert.
|
|
54
|
-
*/
|
|
55
|
-
previousPermissionMode: permissionModeEnum.optional(),
|
|
56
|
-
})
|
|
57
|
-
.partial()
|
|
58
|
-
.passthrough();
|
|
59
|
-
const globalConfigSchema = z
|
|
60
|
-
.object({
|
|
61
|
-
defaultPermissionMode: permissionModeEnum.optional(),
|
|
62
|
-
})
|
|
63
|
-
.partial()
|
|
64
|
-
.passthrough();
|
|
65
|
-
const SESSION_FILE = '.pugi/session.json';
|
|
66
|
-
/**
|
|
67
|
-
* Return the path to the workspace session-state file.
|
|
68
|
-
*/
|
|
69
|
-
export function sessionStatePath(workspaceRoot) {
|
|
70
|
-
return resolve(workspaceRoot, SESSION_FILE);
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Return the path to the user-global config file. Uses HOME env when
|
|
74
|
-
* present (test fixtures, CI) so we never accidentally hit the real
|
|
75
|
-
* user-global file in spec runs.
|
|
76
|
-
*/
|
|
77
|
-
export function globalConfigPath(homeDir = homedir()) {
|
|
78
|
-
return resolve(homeDir, '.pugi/config.json');
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Read the workspace's saved permission mode. Returns null when the
|
|
82
|
-
* file is absent OR the field is unset; the caller layers in CLI + env
|
|
83
|
-
* + global config defaults to produce the effective mode.
|
|
84
|
-
*
|
|
85
|
-
* Never throws on JSON parse / schema errors — a malformed session
|
|
86
|
-
* file should not break the gate. The defensive `try/catch` returns
|
|
87
|
-
* null and lets the caller fall through to the next layer.
|
|
88
|
-
*/
|
|
89
|
-
export function getCurrentMode(workspaceRoot) {
|
|
90
|
-
const path = sessionStatePath(workspaceRoot);
|
|
91
|
-
if (!existsSync(path))
|
|
92
|
-
return null;
|
|
93
|
-
try {
|
|
94
|
-
const raw = readFileSync(path, 'utf8');
|
|
95
|
-
const parsed = sessionStateSchema.parse(JSON.parse(raw));
|
|
96
|
-
if (typeof parsed.permissionMode !== 'string')
|
|
97
|
-
return null;
|
|
98
|
-
// : parsePermissionMode resolves aliases (`ask`, `allow`,
|
|
99
|
-
// `bypass`) to their canonical names. A session file written
|
|
100
|
-
// by .x is silently upgraded on read.
|
|
101
|
-
return parsePermissionMode(parsed.permissionMode);
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Persist the workspace's permission mode. Creates the `.pugi/` dir
|
|
109
|
-
* when missing; preserves any unrelated keys in the file (passthrough
|
|
110
|
-
* schema). Atomic tmp+rename so a kill mid-write does not corrupt the
|
|
111
|
-
* JSON.
|
|
112
|
-
*/
|
|
113
|
-
export function setCurrentMode(workspaceRoot, mode) {
|
|
114
|
-
const path = sessionStatePath(workspaceRoot);
|
|
115
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
116
|
-
const existing = existsSync(path)
|
|
117
|
-
? safeParseObject(readFileSync(path, 'utf8'))
|
|
118
|
-
: {};
|
|
119
|
-
const next = { ...existing, permissionMode: mode };
|
|
120
|
-
const tmpPath = `${path}.tmp`;
|
|
121
|
-
writeFileSync(tmpPath, `${JSON.stringify(next, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
|
|
122
|
-
renameSync(tmpPath, path);
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* — read the snapshot of the mode that was active before the
|
|
126
|
-
* most-recent `/plan` (or `pugi plan`) entry. Returns null when the
|
|
127
|
-
* file is absent OR the field is unset. Same defensive behaviour as
|
|
128
|
-
* `getCurrentMode`: a malformed session file never breaks the slash
|
|
129
|
-
* command — the worst case is `/plan --back` reports "no previous
|
|
130
|
-
* mode to restore" and the operator picks the target mode explicitly.
|
|
131
|
-
*/
|
|
132
|
-
export function getPreviousMode(workspaceRoot) {
|
|
133
|
-
const path = sessionStatePath(workspaceRoot);
|
|
134
|
-
if (!existsSync(path))
|
|
135
|
-
return null;
|
|
136
|
-
try {
|
|
137
|
-
const raw = readFileSync(path, 'utf8');
|
|
138
|
-
const parsed = sessionStateSchema.parse(JSON.parse(raw));
|
|
139
|
-
if (typeof parsed.previousPermissionMode !== 'string')
|
|
140
|
-
return null;
|
|
141
|
-
return parsePermissionMode(parsed.previousPermissionMode);
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* — record the mode that was active immediately before the
|
|
149
|
-
* operator switched to plan. The runtime calls this AT `/plan` entry
|
|
150
|
-
* with the current mode (whatever `resolveMode` returned). Atomic
|
|
151
|
-
* tmp+rename keeps the snapshot consistent if the process is killed
|
|
152
|
-
* mid-write. Pass `null` to clear the snapshot (used after a
|
|
153
|
-
* successful `/plan --back` so a second `--back` does not loop).
|
|
154
|
-
*/
|
|
155
|
-
export function setPreviousMode(workspaceRoot, mode) {
|
|
156
|
-
const path = sessionStatePath(workspaceRoot);
|
|
157
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
158
|
-
const existing = existsSync(path)
|
|
159
|
-
? safeParseObject(readFileSync(path, 'utf8'))
|
|
160
|
-
: {};
|
|
161
|
-
const next = { ...existing };
|
|
162
|
-
if (mode === null) {
|
|
163
|
-
delete next.previousPermissionMode;
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
next.previousPermissionMode = mode;
|
|
167
|
-
}
|
|
168
|
-
const tmpPath = `${path}.tmp`;
|
|
169
|
-
writeFileSync(tmpPath, `${JSON.stringify(next, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
|
|
170
|
-
renameSync(tmpPath, path);
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Read `~/.pugi/config.json::defaultPermissionMode`. Returns null when
|
|
174
|
-
* the file is absent / the field is unset; same defensive behaviour
|
|
175
|
-
* as `getCurrentMode` — a malformed global config never breaks the gate.
|
|
176
|
-
*/
|
|
177
|
-
export function getGlobalDefaultMode(homeDir = homedir()) {
|
|
178
|
-
const path = globalConfigPath(homeDir);
|
|
179
|
-
if (!existsSync(path))
|
|
180
|
-
return null;
|
|
181
|
-
try {
|
|
182
|
-
const raw = readFileSync(path, 'utf8');
|
|
183
|
-
const parsed = globalConfigSchema.parse(JSON.parse(raw));
|
|
184
|
-
if (typeof parsed.defaultPermissionMode !== 'string')
|
|
185
|
-
return null;
|
|
186
|
-
return parsePermissionMode(parsed.defaultPermissionMode);
|
|
187
|
-
}
|
|
188
|
-
catch {
|
|
189
|
-
return null;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Persist `~/.pugi/config.json::defaultPermissionMode`. Used by the
|
|
194
|
-
* `/permissions <mode> --persist` flow so a future fresh session
|
|
195
|
-
* defaults to the same mode without an explicit `--mode` flag.
|
|
196
|
-
*/
|
|
197
|
-
export function setGlobalDefaultMode(mode, homeDir = homedir()) {
|
|
198
|
-
const path = globalConfigPath(homeDir);
|
|
199
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
200
|
-
const existing = existsSync(path)
|
|
201
|
-
? safeParseObject(readFileSync(path, 'utf8'))
|
|
202
|
-
: {};
|
|
203
|
-
const next = { ...existing, defaultPermissionMode: mode };
|
|
204
|
-
const tmpPath = `${path}.tmp`;
|
|
205
|
-
writeFileSync(tmpPath, `${JSON.stringify(next, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
|
|
206
|
-
renameSync(tmpPath, path);
|
|
207
|
-
}
|
|
208
|
-
export function resolveMode(options) {
|
|
209
|
-
if (options.cliFlag) {
|
|
210
|
-
const flag = parsePermissionMode(options.cliFlag);
|
|
211
|
-
if (flag)
|
|
212
|
-
return flag;
|
|
213
|
-
}
|
|
214
|
-
const workspace = getCurrentMode(options.workspaceRoot);
|
|
215
|
-
if (workspace)
|
|
216
|
-
return workspace;
|
|
217
|
-
const global = getGlobalDefaultMode(options.homeDir);
|
|
218
|
-
if (global)
|
|
219
|
-
return global;
|
|
220
|
-
return DEFAULT_PERMISSION_MODE;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Defensive helper — parse JSON to an object; non-object payload (top-
|
|
224
|
-
* level array, primitive) collapses to an empty object so the merge
|
|
225
|
-
* doesn't surface a TypeError. The `setCurrentMode` / `setGlobalDefaultMode`
|
|
226
|
-
* helpers only write objects, so a non-object existing file is corrupted
|
|
227
|
-
* and we explicitly reset it rather than appending into a non-object.
|
|
228
|
-
*/
|
|
229
|
-
function safeParseObject(raw) {
|
|
230
|
-
try {
|
|
231
|
-
const parsed = JSON.parse(raw);
|
|
232
|
-
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
233
|
-
return parsed;
|
|
234
|
-
}
|
|
235
|
-
return {};
|
|
236
|
-
}
|
|
237
|
-
catch {
|
|
238
|
-
return {};
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
//# sourceMappingURL=state.js.map
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool side-effect classification — .
|
|
3
|
-
*
|
|
4
|
-
* Three classes drive the canonical 4-mode permission gate:
|
|
5
|
-
*
|
|
6
|
-
* - `read` — observe-only. Plan mode allows; ask still prompts;
|
|
7
|
-
* allow + bypass execute silently. Examples: read,
|
|
8
|
-
* grep, glob, web_fetch, web_search, skills_list.
|
|
9
|
-
* - `write` — mutates workspace, journal, or operator screen with
|
|
10
|
-
* visible side effects. Plan mode refuses; ask prompts;
|
|
11
|
-
* allow + bypass execute. Examples: write, edit, bash,
|
|
12
|
-
* multi_edit, task_*. `ask_user_question` is also
|
|
13
|
-
* classed as `write` because it interrupts the
|
|
14
|
-
* dispatcher's flow control and demands operator
|
|
15
|
-
* attention — plan mode should not prompt operators.
|
|
16
|
-
* - `dispatch` — spawns a child subagent or off-tree task. Plan mode
|
|
17
|
-
* refuses (a write-capable child violates plan-mode's
|
|
18
|
-
* read-only contract); ask prompts; allow + bypass
|
|
19
|
-
* execute. Example: `agent`.
|
|
20
|
-
*
|
|
21
|
-
* Unknown tool names default to `write` — deny-first safety. A stale
|
|
22
|
-
* schema entry that the gate has not been told about should not silently
|
|
23
|
-
* pass in plan mode just because the gate doesn't recognise it.
|
|
24
|
-
*/
|
|
25
|
-
/**
|
|
26
|
-
* Closed map of every built-in tool name -> side-effect class. The
|
|
27
|
-
* source of truth for the four standard modes; mirrored against the
|
|
28
|
-
* `WIRED_TOOLS` set in `core/engine/tool-bridge.ts` so an unrecognised
|
|
29
|
-
* tool surfaces as the safe deny-first `write` default.
|
|
30
|
-
*
|
|
31
|
-
* MCP tools follow the `mcp__<server>__<tool>` namespace and are
|
|
32
|
-
* uniformly classed via `getToolClass` because per-tool annotations are
|
|
33
|
-
* not yet a part of the MCP spec — treating them as `write` is the
|
|
34
|
-
* conservative default until server-side metadata is trustworthy.
|
|
35
|
-
*/
|
|
36
|
-
const BUILT_IN_TOOL_CLASSES = Object.freeze({
|
|
37
|
-
// Read-only observations.
|
|
38
|
-
read: 'read',
|
|
39
|
-
grep: 'read',
|
|
40
|
-
glob: 'read',
|
|
41
|
-
ls: 'read',
|
|
42
|
-
search: 'read',
|
|
43
|
-
web_fetch: 'read',
|
|
44
|
-
web_search: 'read',
|
|
45
|
-
file_cache_check: 'read',
|
|
46
|
-
skills_list: 'read',
|
|
47
|
-
skill: 'read',
|
|
48
|
-
task_get: 'read',
|
|
49
|
-
task_list: 'read',
|
|
50
|
-
// Phase 1 runtime evidence pack (PUGI-291..295): server_health and
|
|
51
|
-
// server_logs are read-only probes (HTTP GET + tail of a log file
|
|
52
|
-
// already on disk). Classifying them as `read` keeps the ask-mode
|
|
53
|
-
// prompts honest; the dispatcher still applies the network-perm gate
|
|
54
|
-
// for server_health and the workspace-read gate for server_logs.
|
|
55
|
-
server_health: 'read',
|
|
56
|
-
server_logs: 'read',
|
|
57
|
-
// Mutating actions.
|
|
58
|
-
write: 'write',
|
|
59
|
-
edit: 'write',
|
|
60
|
-
multi_edit: 'write',
|
|
61
|
-
bash: 'write',
|
|
62
|
-
// Phase 1 runtime evidence pack: server_start spawns a process,
|
|
63
|
-
// server_stop terminates one, http_request can POST/PUT/DELETE
|
|
64
|
-
// arbitrary data against a localhost service. All three are write
|
|
65
|
-
// class so plan mode refuses and ask mode prompts.
|
|
66
|
-
server_start: 'write',
|
|
67
|
-
server_stop: 'write',
|
|
68
|
-
http_request: 'write',
|
|
69
|
-
task_create: 'write',
|
|
70
|
-
task_update: 'write',
|
|
71
|
-
todo_write: 'write',
|
|
72
|
-
// `ask_user_question` halts the loop and demands operator attention.
|
|
73
|
-
// Plan mode should not interrupt — class as write so the gate refuses
|
|
74
|
-
// it in plan mode but ask + allow + bypass execute normally.
|
|
75
|
-
ask_user_question: 'write',
|
|
76
|
-
// Dispatch — spawn a child agent. Refused in plan mode regardless of
|
|
77
|
-
// the child's role tier (the engine adapter applies role-based
|
|
78
|
-
// capability filtering, but the gate refuses dispatch up front so a
|
|
79
|
-
// plan-mode session cannot leak a writeable child).
|
|
80
|
-
agent: 'dispatch',
|
|
81
|
-
pugi_delegate: 'dispatch',
|
|
82
|
-
sub_agent_spawn: 'dispatch',
|
|
83
|
-
});
|
|
84
|
-
const MCP_TOOL_PREFIX = 'mcp__';
|
|
85
|
-
/**
|
|
86
|
-
* Resolve the class for a tool name. Unknown names default to `write`
|
|
87
|
-
* (deny-first). MCP tools (any name prefixed with `mcp__`) default to
|
|
88
|
-
* `write` for the same conservative reason — the MCP spec lacks
|
|
89
|
-
* per-tool annotations today.
|
|
90
|
-
*/
|
|
91
|
-
export function getToolClass(toolName) {
|
|
92
|
-
const builtIn = BUILT_IN_TOOL_CLASSES[toolName];
|
|
93
|
-
if (builtIn)
|
|
94
|
-
return builtIn;
|
|
95
|
-
if (toolName.startsWith(MCP_TOOL_PREFIX))
|
|
96
|
-
return 'write';
|
|
97
|
-
return 'write';
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Expose the built-in class map for diagnostic surfaces (`pugi doctor`,
|
|
101
|
-
* test fixtures). Caller MUST NOT mutate — the object is already frozen
|
|
102
|
-
* so any attempt throws in strict mode.
|
|
103
|
-
*/
|
|
104
|
-
export function listBuiltInToolClasses() {
|
|
105
|
-
return BUILT_IN_TOOL_CLASSES;
|
|
106
|
-
}
|
|
107
|
-
//# sourceMappingURL=tool-class.js.map
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
const REDUCER_TIMESTAMP = 0;
|
|
2
|
-
export function reducePlanModeState(state, event) {
|
|
3
|
-
if (event.kind === 'reset') {
|
|
4
|
-
return { kind: 'inactive' };
|
|
5
|
-
}
|
|
6
|
-
switch (state.kind) {
|
|
7
|
-
case 'inactive':
|
|
8
|
-
if (event.kind === 'start') {
|
|
9
|
-
return { kind: 'building', planText: '', startedAt: REDUCER_TIMESTAMP };
|
|
10
|
-
}
|
|
11
|
-
return state;
|
|
12
|
-
case 'building':
|
|
13
|
-
if (event.kind === 'append') {
|
|
14
|
-
return { ...state, planText: state.planText + event.text };
|
|
15
|
-
}
|
|
16
|
-
if (event.kind === 'finalize') {
|
|
17
|
-
return {
|
|
18
|
-
kind: 'awaiting-approval',
|
|
19
|
-
planText: state.planText,
|
|
20
|
-
planId: event.planId,
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
return state;
|
|
24
|
-
case 'awaiting-approval':
|
|
25
|
-
if (event.kind === 'approve' && event.planId === state.planId) {
|
|
26
|
-
return {
|
|
27
|
-
kind: 'approved',
|
|
28
|
-
planId: event.planId,
|
|
29
|
-
approvedAt: REDUCER_TIMESTAMP,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
if (event.kind === 'reject' && event.planId === state.planId) {
|
|
33
|
-
return event.reason === undefined
|
|
34
|
-
? { kind: 'rejected', planId: event.planId }
|
|
35
|
-
: { kind: 'rejected', planId: event.planId, reason: event.reason };
|
|
36
|
-
}
|
|
37
|
-
if (event.kind === 'amend' && event.previousPlanId === state.planId) {
|
|
38
|
-
return {
|
|
39
|
-
kind: 'amended',
|
|
40
|
-
planId: event.planId,
|
|
41
|
-
previousPlanId: event.previousPlanId,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
return state;
|
|
45
|
-
case 'approved':
|
|
46
|
-
case 'rejected':
|
|
47
|
-
case 'amended':
|
|
48
|
-
return state;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=ui-state.js.map
|