@pugi/cli 0.1.0-beta.99 → 1.0.0-alpha.2
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,211 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Layer B diff applicator — diff escalation Phase 1.
|
|
3
|
-
*
|
|
4
|
-
* Layer B is the multi-edit primitive: an ordered list of
|
|
5
|
-
* `{oldString, newString}` blocks against a single file, applied
|
|
6
|
-
* ALL-OR-NOTHING. Each block must satisfy the same uniqueness
|
|
7
|
-
* invariant as Layer A, but evaluated against the WORKING buffer
|
|
8
|
-
* after the prior blocks land — not the original disk contents. This
|
|
9
|
-
* lets the model emit edits like "rename `foo` to `bar`, then add a
|
|
10
|
-
* call to `bar(42)`" without the second edit failing because `foo`
|
|
11
|
-
* no longer exists.
|
|
12
|
-
*
|
|
13
|
-
* Atomicity story:
|
|
14
|
-
*
|
|
15
|
-
* 1. We mutate a single in-memory string buffer.
|
|
16
|
-
* 2. Every block runs through `applyOneToBuffer` and either advances
|
|
17
|
-
* the buffer or returns a structured failure.
|
|
18
|
-
* 3. On ANY block failure we discard the buffer and write nothing.
|
|
19
|
-
* The on-disk file remains exactly as it was on entry.
|
|
20
|
-
* 4. On total success we hand the final buffer to the same atomic
|
|
21
|
-
* tmp+rename writer Layer A uses, so a crash mid-write can never
|
|
22
|
-
* leave a partially-edited file.
|
|
23
|
-
*
|
|
24
|
-
* Roll-back is therefore in-memory — no need to track per-block undo
|
|
25
|
-
* because nothing touched the disk until the final write.
|
|
26
|
-
*/
|
|
27
|
-
import { existsSync, readFileSync, renameSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
28
|
-
import { countOccurrences, } from './layer-a-apply.js';
|
|
29
|
-
import { applySecurityGate } from './security-gate.js';
|
|
30
|
-
export async function applyLayerB(batch, opts) {
|
|
31
|
-
// SECURITY GATE — see security-gate.ts. Identical responsibilities
|
|
32
|
-
// to Layer A: workspace path scoping, protected-basename deny,
|
|
33
|
-
// symlink-escape re-check. Runs BEFORE the empty-batch fast-path so
|
|
34
|
-
// a maliciously empty batch targeting `.env` still surfaces the
|
|
35
|
-
// protected-file rejection rather than the no-edits one.
|
|
36
|
-
let gateResult;
|
|
37
|
-
try {
|
|
38
|
-
gateResult = applySecurityGate(batch.file, { cwd: opts.cwd, toolName: 'layer-b' });
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
return {
|
|
42
|
-
ok: false,
|
|
43
|
-
bytesWritten: 0,
|
|
44
|
-
reason: 'write_error',
|
|
45
|
-
absPath: batch.file,
|
|
46
|
-
detail: error instanceof Error ? error.message : String(error),
|
|
47
|
-
appliedCount: 0,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
if (!gateResult.ok) {
|
|
51
|
-
return {
|
|
52
|
-
ok: false,
|
|
53
|
-
bytesWritten: 0,
|
|
54
|
-
reason: gateResult.reason,
|
|
55
|
-
absPath: batch.file,
|
|
56
|
-
detail: gateResult.detail,
|
|
57
|
-
appliedCount: 0,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
const absPath = gateResult.absPath;
|
|
61
|
-
if (batch.edits.length === 0) {
|
|
62
|
-
// An empty edit array is almost always a bug in the marker parser
|
|
63
|
-
// or the model prompt. Fail loud rather than no-op success.
|
|
64
|
-
return {
|
|
65
|
-
ok: false,
|
|
66
|
-
bytesWritten: 0,
|
|
67
|
-
reason: 'no_match',
|
|
68
|
-
absPath,
|
|
69
|
-
detail: 'Layer B batch contains zero sub-edits',
|
|
70
|
-
appliedCount: 0,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
if (!existsSync(absPath)) {
|
|
74
|
-
return {
|
|
75
|
-
ok: false,
|
|
76
|
-
bytesWritten: 0,
|
|
77
|
-
reason: 'file_missing',
|
|
78
|
-
absPath,
|
|
79
|
-
detail: `file does not exist: ${batch.file}`,
|
|
80
|
-
appliedCount: 0,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
const original = readFileSync(absPath, 'utf8');
|
|
84
|
-
let buffer = original;
|
|
85
|
-
let appliedCount = 0;
|
|
86
|
-
for (let i = 0; i < batch.edits.length; i += 1) {
|
|
87
|
-
const sub = batch.edits[i];
|
|
88
|
-
if (!sub)
|
|
89
|
-
continue;
|
|
90
|
-
const stepResult = applyOneToBuffer(buffer, sub);
|
|
91
|
-
if (!stepResult.ok) {
|
|
92
|
-
return {
|
|
93
|
-
ok: false,
|
|
94
|
-
bytesWritten: 0,
|
|
95
|
-
reason: stepResult.reason,
|
|
96
|
-
absPath,
|
|
97
|
-
matchCount: stepResult.matchCount,
|
|
98
|
-
detail: `Layer B aborted at sub-edit ${i}: ${stepResult.detail}`,
|
|
99
|
-
appliedCount,
|
|
100
|
-
subFailures: [
|
|
101
|
-
{
|
|
102
|
-
index: i,
|
|
103
|
-
reason: stepResult.reason,
|
|
104
|
-
matchCount: stepResult.matchCount,
|
|
105
|
-
detail: stepResult.detail,
|
|
106
|
-
},
|
|
107
|
-
],
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
buffer = stepResult.buffer;
|
|
111
|
-
appliedCount += 1;
|
|
112
|
-
}
|
|
113
|
-
// No-op detection: if every sub-edit was an identical-replacement,
|
|
114
|
-
// `appliedCount` would be 0 above because applyOneToBuffer rejects
|
|
115
|
-
// those. A zero-byte diff with appliedCount === batch.edits.length
|
|
116
|
-
// is technically possible if the edits cancel each other out; we
|
|
117
|
-
// accept that quietly because the model presumably knows.
|
|
118
|
-
if (buffer === original) {
|
|
119
|
-
return {
|
|
120
|
-
ok: false,
|
|
121
|
-
bytesWritten: 0,
|
|
122
|
-
reason: 'identical_replacement',
|
|
123
|
-
absPath,
|
|
124
|
-
detail: 'Layer B batch produced no net change to the file',
|
|
125
|
-
appliedCount,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
if (opts.dryRun) {
|
|
129
|
-
return {
|
|
130
|
-
ok: true,
|
|
131
|
-
bytesWritten: 0,
|
|
132
|
-
absPath,
|
|
133
|
-
matchCount: appliedCount,
|
|
134
|
-
appliedCount,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
try {
|
|
138
|
-
atomicWrite(absPath, buffer);
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
return {
|
|
142
|
-
ok: false,
|
|
143
|
-
bytesWritten: 0,
|
|
144
|
-
reason: 'write_error',
|
|
145
|
-
absPath,
|
|
146
|
-
detail: error instanceof Error ? error.message : String(error),
|
|
147
|
-
appliedCount,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
return {
|
|
151
|
-
ok: true,
|
|
152
|
-
bytesWritten: Buffer.byteLength(buffer, 'utf8'),
|
|
153
|
-
absPath,
|
|
154
|
-
matchCount: appliedCount,
|
|
155
|
-
appliedCount,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
function applyOneToBuffer(buffer, sub) {
|
|
159
|
-
if (sub.oldString === sub.newString) {
|
|
160
|
-
return {
|
|
161
|
-
ok: false,
|
|
162
|
-
reason: 'identical_replacement',
|
|
163
|
-
detail: 'oldString and newString are identical',
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
const count = countOccurrences(buffer, sub.oldString);
|
|
167
|
-
if (count === 0) {
|
|
168
|
-
return {
|
|
169
|
-
ok: false,
|
|
170
|
-
reason: 'no_match',
|
|
171
|
-
matchCount: 0,
|
|
172
|
-
detail: 'oldString not found in current buffer',
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
if (count > 1) {
|
|
176
|
-
return {
|
|
177
|
-
ok: false,
|
|
178
|
-
reason: 'ambiguous_match',
|
|
179
|
-
matchCount: count,
|
|
180
|
-
detail: `oldString matches ${count} times in current buffer`,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
const idx = buffer.indexOf(sub.oldString);
|
|
184
|
-
const next = buffer.slice(0, idx) + sub.newString + buffer.slice(idx + sub.oldString.length);
|
|
185
|
-
return { ok: true, buffer: next };
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Atomic write helper — duplicated from `layer-a-apply.ts` (not exported
|
|
189
|
-
* to keep the dependency direction one-way: A is the primitive, B
|
|
190
|
-
* happens to reuse the same disk-write pattern but is otherwise
|
|
191
|
-
* independent). Both helpers are intentionally small enough that
|
|
192
|
-
* duplication is cheaper than dragging in a shared util module.
|
|
193
|
-
*/
|
|
194
|
-
function atomicWrite(absPath, contents) {
|
|
195
|
-
const suffix = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
196
|
-
const tmp = `${absPath}.pugi-tmp-${suffix}`;
|
|
197
|
-
try {
|
|
198
|
-
writeFileSync(tmp, contents, { encoding: 'utf8', mode: 0o600 });
|
|
199
|
-
renameSync(tmp, absPath);
|
|
200
|
-
}
|
|
201
|
-
catch (error) {
|
|
202
|
-
try {
|
|
203
|
-
unlinkSync(tmp);
|
|
204
|
-
}
|
|
205
|
-
catch {
|
|
206
|
-
// ignore — tmp may not exist yet.
|
|
207
|
-
}
|
|
208
|
-
throw error;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
//# sourceMappingURL=layer-b-apply.js.map
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Layer C diff applicator — diff escalation Phase 1.
|
|
3
|
-
*
|
|
4
|
-
* Layer C is the full-file rewrite escape hatch. The model emits the
|
|
5
|
-
* complete new file contents plus a sha256 of the file as it was when
|
|
6
|
-
* the model READ it. We compute the current sha256 of the on-disk
|
|
7
|
-
* file, compare, and either:
|
|
8
|
-
*
|
|
9
|
-
* - Match — atomically write the new contents.
|
|
10
|
-
* - Mismatch — refuse with `base_sha_mismatch`. The model must
|
|
11
|
-
* re-read the file and resubmit; the disk version changed between
|
|
12
|
-
* read and write (filewatcher event, parallel edit, human typing).
|
|
13
|
-
*
|
|
14
|
-
* This is the "I rewrote the entire file" path. It is the heaviest
|
|
15
|
-
* Layer because the wire payload is the full file body, but it is also
|
|
16
|
-
* the safest for sweeping refactors that touch most lines — Layer A
|
|
17
|
-
* would emit dozens of fragile blocks and Layer B's atomicity goes
|
|
18
|
-
* out the window past ~10 blocks.
|
|
19
|
-
*
|
|
20
|
-
* The sha256 gate is the load-bearing safety. Without it, Layer C
|
|
21
|
-
* silently overwrites concurrent edits; with it, the operator
|
|
22
|
-
* (and Pugi) sees a clean `mismatch` event and can resolve manually.
|
|
23
|
-
*/
|
|
24
|
-
import { createHash } from 'node:crypto';
|
|
25
|
-
import { existsSync, readFileSync, renameSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
26
|
-
import { applySecurityGate } from './security-gate.js';
|
|
27
|
-
export async function applyLayerC(edit, opts) {
|
|
28
|
-
// SECURITY GATE — see security-gate.ts. Layer C is the most
|
|
29
|
-
// dangerous layer (full-file rewrite) so the gate runs FIRST, ahead
|
|
30
|
-
// of the baseSha check. A missing baseSha on an attempted `.env`
|
|
31
|
-
// rewrite should surface as `protected_file`, not `write_error`.
|
|
32
|
-
let gateResult;
|
|
33
|
-
try {
|
|
34
|
-
gateResult = applySecurityGate(edit.file, { cwd: opts.cwd, toolName: 'layer-c' });
|
|
35
|
-
}
|
|
36
|
-
catch (error) {
|
|
37
|
-
return {
|
|
38
|
-
ok: false,
|
|
39
|
-
bytesWritten: 0,
|
|
40
|
-
reason: 'write_error',
|
|
41
|
-
absPath: edit.file,
|
|
42
|
-
detail: error instanceof Error ? error.message : String(error),
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
if (!gateResult.ok) {
|
|
46
|
-
return {
|
|
47
|
-
ok: false,
|
|
48
|
-
bytesWritten: 0,
|
|
49
|
-
reason: gateResult.reason,
|
|
50
|
-
absPath: edit.file,
|
|
51
|
-
detail: gateResult.detail,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
const absPath = gateResult.absPath;
|
|
55
|
-
if (edit.baseSha256.length === 0) {
|
|
56
|
-
// An empty baseSha is almost always a marker-parser bug. Refuse
|
|
57
|
-
// rather than write blind.
|
|
58
|
-
return {
|
|
59
|
-
ok: false,
|
|
60
|
-
bytesWritten: 0,
|
|
61
|
-
reason: 'write_error',
|
|
62
|
-
absPath,
|
|
63
|
-
detail: 'Layer C requires a non-empty baseSha256',
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
if (!existsSync(absPath)) {
|
|
67
|
-
// Layer C is a REWRITE, not a CREATE. Use Layer A's sibling
|
|
68
|
-
// `write` tool to create files. Failing loud keeps the layer
|
|
69
|
-
// semantics honest: Layer C's gate is "file was X when I read
|
|
70
|
-
// it"; a non-existent file violates the read invariant.
|
|
71
|
-
return {
|
|
72
|
-
ok: false,
|
|
73
|
-
bytesWritten: 0,
|
|
74
|
-
reason: 'file_missing',
|
|
75
|
-
absPath,
|
|
76
|
-
detail: `file does not exist: ${edit.file}; Layer C does not create files`,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
const current = readFileSync(absPath, 'utf8');
|
|
80
|
-
const actualSha = sha256OfUtf8(current);
|
|
81
|
-
if (actualSha !== edit.baseSha256) {
|
|
82
|
-
return {
|
|
83
|
-
ok: false,
|
|
84
|
-
bytesWritten: 0,
|
|
85
|
-
reason: 'base_sha_mismatch',
|
|
86
|
-
absPath,
|
|
87
|
-
detail: `file changed since model read: expected sha256 ${edit.baseSha256.slice(0, 12)}…, ` +
|
|
88
|
-
`got ${actualSha.slice(0, 12)}…`,
|
|
89
|
-
expectedSha256: edit.baseSha256,
|
|
90
|
-
actualSha256: actualSha,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
if (current === edit.newContents) {
|
|
94
|
-
return {
|
|
95
|
-
ok: false,
|
|
96
|
-
bytesWritten: 0,
|
|
97
|
-
reason: 'identical_replacement',
|
|
98
|
-
absPath,
|
|
99
|
-
detail: 'newContents is identical to current file',
|
|
100
|
-
expectedSha256: edit.baseSha256,
|
|
101
|
-
actualSha256: actualSha,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
if (opts.dryRun) {
|
|
105
|
-
return {
|
|
106
|
-
ok: true,
|
|
107
|
-
bytesWritten: 0,
|
|
108
|
-
absPath,
|
|
109
|
-
expectedSha256: edit.baseSha256,
|
|
110
|
-
actualSha256: actualSha,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
try {
|
|
114
|
-
atomicWrite(absPath, edit.newContents);
|
|
115
|
-
}
|
|
116
|
-
catch (error) {
|
|
117
|
-
return {
|
|
118
|
-
ok: false,
|
|
119
|
-
bytesWritten: 0,
|
|
120
|
-
reason: 'write_error',
|
|
121
|
-
absPath,
|
|
122
|
-
detail: error instanceof Error ? error.message : String(error),
|
|
123
|
-
expectedSha256: edit.baseSha256,
|
|
124
|
-
actualSha256: actualSha,
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
return {
|
|
128
|
-
ok: true,
|
|
129
|
-
bytesWritten: Buffer.byteLength(edit.newContents, 'utf8'),
|
|
130
|
-
absPath,
|
|
131
|
-
expectedSha256: edit.baseSha256,
|
|
132
|
-
actualSha256: actualSha,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Sha256 of a UTF-8 string. Hex output, lowercased. Centralised so the
|
|
137
|
-
* apply-side hash and the dispatcher-side hash (when computing the
|
|
138
|
-
* baseSha for the model on read) agree byte-for-byte.
|
|
139
|
-
*/
|
|
140
|
-
export function sha256OfUtf8(contents) {
|
|
141
|
-
return createHash('sha256').update(contents, 'utf8').digest('hex');
|
|
142
|
-
}
|
|
143
|
-
function atomicWrite(absPath, contents) {
|
|
144
|
-
const suffix = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
145
|
-
const tmp = `${absPath}.pugi-tmp-${suffix}`;
|
|
146
|
-
try {
|
|
147
|
-
writeFileSync(tmp, contents, { encoding: 'utf8', mode: 0o600 });
|
|
148
|
-
renameSync(tmp, absPath);
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
try {
|
|
152
|
-
unlinkSync(tmp);
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
// ignore — tmp may not exist.
|
|
156
|
-
}
|
|
157
|
-
throw error;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
//# sourceMappingURL=layer-c-apply.js.map
|