@pugi/cli 0.1.0-beta.98 → 1.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +11 -191
- package/bin/pugi +8 -0
- package/package.json +15 -71
- package/postinstall.mjs +31 -0
- package/CHANGELOG.md +0 -132
- package/THIRD_PARTY_NOTICES.md +0 -40
- package/assets/pugi-mascot.ansi +0 -16
- package/assets/pugi-prozr2-mascot.ansi +0 -9
- package/bin/run.js +0 -34
- package/dist/commands/deploy.js +0 -439
- package/dist/commands/flatten.js +0 -191
- package/dist/commands/jobs-watch.js +0 -201
- package/dist/commands/jobs.js +0 -260
- package/dist/commands/retro.js +0 -210
- package/dist/commands/smoke.js +0 -133
- package/dist/core/agent-progress/cleanup.js +0 -134
- package/dist/core/agent-progress/schema.js +0 -144
- package/dist/core/agent-progress/writer.js +0 -101
- package/dist/core/agents/adaptive-router.js +0 -330
- package/dist/core/agents/loader.js +0 -104
- package/dist/core/agents/query-decomposer.js +0 -297
- package/dist/core/agents/registry.js +0 -69
- package/dist/core/approvals/shortcut-resolver.js +0 -98
- package/dist/core/artifact-chain/dispatcher.js +0 -148
- package/dist/core/artifact-chain/exporter.js +0 -164
- package/dist/core/artifact-chain/state.js +0 -243
- package/dist/core/artifact-chain/steps.js +0 -169
- package/dist/core/ask-user/question.js +0 -92
- package/dist/core/audit/audit-trail.js +0 -275
- package/dist/core/auth/ensure-authenticated.js +0 -129
- package/dist/core/auth/env-provider.js +0 -238
- package/dist/core/auto-open-browser.js +0 -128
- package/dist/core/auto-update/channels.js +0 -122
- package/dist/core/auto-update/checker.js +0 -241
- package/dist/core/auto-update/state.js +0 -235
- package/dist/core/bare-mode/index.js +0 -107
- package/dist/core/bash/redirect.js +0 -281
- package/dist/core/bash-classifier.js +0 -1397
- package/dist/core/checkpoint/resumer.js +0 -149
- package/dist/core/checkpoint/rewinder.js +0 -291
- package/dist/core/checkpoints/shadow-git.js +0 -670
- package/dist/core/citations/parser.js +0 -109
- package/dist/core/classifier/yolo-classifier.js +0 -88
- package/dist/core/clipboard.js +0 -70
- package/dist/core/codegraph/decision-store.js +0 -248
- package/dist/core/codegraph/detect-repo.js +0 -459
- package/dist/core/codegraph/install.js +0 -134
- package/dist/core/codegraph/offer-hook.js +0 -220
- package/dist/core/compact/auto-trigger.js +0 -96
- package/dist/core/compact/buffer-rewriter.js +0 -115
- package/dist/core/compact/summarizer.js +0 -208
- package/dist/core/compact/token-counter.js +0 -108
- package/dist/core/consensus/anvil-fanout.js +0 -276
- package/dist/core/consensus/diff-capture.js +0 -491
- package/dist/core/consensus/rubric.js +0 -233
- package/dist/core/context/builder.js +0 -114
- package/dist/core/context/compaction-events.js +0 -99
- package/dist/core/context/compaction.js +0 -602
- package/dist/core/context/index.js +0 -28
- package/dist/core/context/invariants.js +0 -250
- package/dist/core/context/markdown-loader.js +0 -288
- package/dist/core/context/markdown-traverse.js +0 -255
- package/dist/core/context/pugiignore.js +0 -316
- package/dist/core/context/repo-skeleton.js +0 -533
- package/dist/core/context/tool-eviction.js +0 -55
- package/dist/core/context/watcher.js +0 -342
- package/dist/core/context/working-set.js +0 -165
- package/dist/core/coordinator/agent-tools.js +0 -77
- package/dist/core/coordinator/agent-toolset.js +0 -65
- package/dist/core/coordinator/fsm.js +0 -73
- package/dist/core/coordinator/mode-fsm.js +0 -70
- package/dist/core/cost/rate-card.js +0 -129
- package/dist/core/cost/tracker.js +0 -221
- package/dist/core/credentials.js +0 -355
- package/dist/core/cron/scheduler.js +0 -138
- package/dist/core/denial-tracking/index.js +0 -8
- package/dist/core/denial-tracking/state.js +0 -264
- package/dist/core/diagnostics/probe-runner.js +0 -93
- package/dist/core/diagnostics/probes/api.js +0 -46
- package/dist/core/diagnostics/probes/auth.js +0 -93
- package/dist/core/diagnostics/probes/bare-mode.js +0 -42
- package/dist/core/diagnostics/probes/cli-version.js +0 -127
- package/dist/core/diagnostics/probes/config.js +0 -72
- package/dist/core/diagnostics/probes/denial-tracking.js +0 -57
- package/dist/core/diagnostics/probes/disk.js +0 -81
- package/dist/core/diagnostics/probes/engine-live.js +0 -46
- package/dist/core/diagnostics/probes/git.js +0 -65
- package/dist/core/diagnostics/probes/hooks.js +0 -118
- package/dist/core/diagnostics/probes/mcp.js +0 -75
- package/dist/core/diagnostics/probes/node.js +0 -59
- package/dist/core/diagnostics/probes/pnpm.js +0 -36
- package/dist/core/diagnostics/probes/pugi-md.js +0 -89
- package/dist/core/diagnostics/probes/sandbox.js +0 -72
- package/dist/core/diagnostics/probes/session.js +0 -74
- package/dist/core/diagnostics/probes/status-snapshot.js +0 -488
- package/dist/core/diagnostics/probes/workspace.js +0 -63
- package/dist/core/diagnostics/types.js +0 -70
- package/dist/core/dispatch/cache-cleanup.js +0 -197
- package/dist/core/dispatch/cache-handoff.js +0 -295
- package/dist/core/edits/apply-patch-layer-e.js +0 -189
- package/dist/core/edits/dispatch.js +0 -511
- package/dist/core/edits/format-detector.js +0 -260
- package/dist/core/edits/format-matrix.js +0 -26
- package/dist/core/edits/fuzzy-ladder.js +0 -650
- package/dist/core/edits/index.js +0 -19
- package/dist/core/edits/journal.js +0 -199
- package/dist/core/edits/layer-a-apply.js +0 -217
- package/dist/core/edits/layer-a-fuzzy-apply.js +0 -198
- package/dist/core/edits/layer-b-apply.js +0 -211
- package/dist/core/edits/layer-c-apply.js +0 -160
- package/dist/core/edits/layer-d-ast.js +0 -572
- package/dist/core/edits/marker-parser.js +0 -401
- package/dist/core/edits/security-gate.js +0 -223
- package/dist/core/edits/verify-hook.js +0 -273
- package/dist/core/edits/worktree.js +0 -322
- package/dist/core/engine/adapter-runner.js +0 -8
- package/dist/core/engine/anvil-client.js +0 -344
- package/dist/core/engine/auto-compact.js +0 -179
- package/dist/core/engine/budgets.js +0 -192
- 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,128 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
/**
|
|
3
|
-
* Open `url` in the default browser. Returns `{ opened: true }` on a
|
|
4
|
-
* successful spawn, `{ opened: false }` on any failure. The url is not
|
|
5
|
-
* shell-escaped here; we always pass it as a single argv element to a
|
|
6
|
-
* direct spawn (no shell), so quoting is irrelevant.
|
|
7
|
-
*/
|
|
8
|
-
export async function autoOpenBrowser(url, deps = {}) {
|
|
9
|
-
const platform = deps.platform ?? process.platform;
|
|
10
|
-
const spawnDetached = deps.spawnDetached ?? defaultSpawnDetached;
|
|
11
|
-
// Refuse anything that does not parse as http(s). The device-flow URL
|
|
12
|
-
// is always https — guarding here keeps a hostile server response
|
|
13
|
-
// from convincing us to spawn `open file:///etc/passwd` or worse.
|
|
14
|
-
if (!isSafeHttpUrl(url)) {
|
|
15
|
-
return { opened: false };
|
|
16
|
-
}
|
|
17
|
-
if (platform === 'darwin') {
|
|
18
|
-
return { opened: spawnDetached('open', [url]) };
|
|
19
|
-
}
|
|
20
|
-
if (platform === 'win32') {
|
|
21
|
-
// P1-3 (triple-review): cmd.exe parses `&` as a command
|
|
22
|
-
// separator BEFORE Node hands argv to the child, regardless of
|
|
23
|
-
// `shell: false`. A device-flow URL like
|
|
24
|
-
// `https://app.pugi.io/devices/authorize?user_code=ABC&trace=xyz`
|
|
25
|
-
// would be truncated at the `&`, opening only the first half. We
|
|
26
|
-
// prefer PowerShell (its argv parser is sane: a single quoted URL
|
|
27
|
-
// round-trips verbatim) and fall back to a double-quoted cmd
|
|
28
|
-
// invocation when PowerShell is missing from PATH.
|
|
29
|
-
if (spawnDetached('powershell', [
|
|
30
|
-
'-NoProfile',
|
|
31
|
-
'-NonInteractive',
|
|
32
|
-
'-Command',
|
|
33
|
-
'Start-Process',
|
|
34
|
-
quoteForPowerShell(url),
|
|
35
|
-
])) {
|
|
36
|
-
return { opened: true };
|
|
37
|
-
}
|
|
38
|
-
// Fallback: `cmd /c start "" "<url>"`. The URL itself is wrapped
|
|
39
|
-
// in double quotes so cmd does not split on `&`; any embedded `"`
|
|
40
|
-
// in the URL is escaped using cmd's caret-quote convention.
|
|
41
|
-
return {
|
|
42
|
-
opened: spawnDetached('cmd', ['/c', 'start', '""', quoteForCmd(url)]),
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
if (platform === 'linux' || platform === 'freebsd' || platform === 'openbsd') {
|
|
46
|
-
// Try xdg-open first (the freedesktop standard), then gio (GNOME),
|
|
47
|
-
// then a couple of well-known browsers as a last resort. Each
|
|
48
|
-
// attempt is a fresh spawn — if the binary is missing the helper
|
|
49
|
-
// returns false and we fall through.
|
|
50
|
-
for (const cmd of LINUX_OPENERS) {
|
|
51
|
-
if (spawnDetached(cmd, [url]))
|
|
52
|
-
return { opened: true };
|
|
53
|
-
}
|
|
54
|
-
return { opened: false };
|
|
55
|
-
}
|
|
56
|
-
// Unknown platform (android, aix, sunos…) — degrade gracefully.
|
|
57
|
-
return { opened: false };
|
|
58
|
-
}
|
|
59
|
-
const LINUX_OPENERS = ['xdg-open', 'gio', 'gnome-open', 'kde-open'];
|
|
60
|
-
function isSafeHttpUrl(candidate) {
|
|
61
|
-
try {
|
|
62
|
-
const url = new URL(candidate);
|
|
63
|
-
return url.protocol === 'https:' || url.protocol === 'http:';
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* P1-3 (triple-review): wrap a URL for PowerShell's
|
|
71
|
-
* `Start-Process` invocation. PowerShell's single-quote string literal
|
|
72
|
-
* does NOT process escape sequences; the only metachar inside is the
|
|
73
|
-
* single quote itself (escaped by doubling). URLs do not contain
|
|
74
|
-
* single quotes in practice, but the helper handles them defensively
|
|
75
|
-
* so future input shapes do not break.
|
|
76
|
-
*/
|
|
77
|
-
function quoteForPowerShell(url) {
|
|
78
|
-
return `'${url.replace(/'/g, "''")}'`;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* P1-3 (triple-review): wrap a URL for cmd.exe's
|
|
82
|
-
* `start ""` invocation. Double quotes pin the URL as a single token
|
|
83
|
-
* so cmd does NOT split on `&`, `|`, `^`, `<`, `>`. Embedded `"` (rare
|
|
84
|
-
* in URLs but defensible) is escaped via cmd's caret-quote convention:
|
|
85
|
-
* `^"`.
|
|
86
|
-
*/
|
|
87
|
-
function quoteForCmd(url) {
|
|
88
|
-
return `"${url.replace(/"/g, '^"')}"`;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Real spawn implementation. Detaches the child so the Pugi CLI can
|
|
92
|
-
* exit (or keep polling) without inheriting the browser's lifecycle.
|
|
93
|
-
* Returns `true` only when the spawn produced a pid; any error event
|
|
94
|
-
* (ENOENT for a missing binary, EACCES for a sandboxed permission
|
|
95
|
-
* denial) flips the result to `false`.
|
|
96
|
-
*/
|
|
97
|
-
function defaultSpawnDetached(cmd, args) {
|
|
98
|
-
try {
|
|
99
|
-
const options = {
|
|
100
|
-
detached: true,
|
|
101
|
-
stdio: 'ignore',
|
|
102
|
-
shell: false,
|
|
103
|
-
};
|
|
104
|
-
const child = spawn(cmd, args.slice(), options);
|
|
105
|
-
// P3 polish (triple-review): swallow the async `error`
|
|
106
|
-
// event (ENOENT for a missing binary, EACCES for a sandboxed
|
|
107
|
-
// permission denial). The old `errored` flag was always false at
|
|
108
|
-
// the synchronous `return !errored` point (the `error` event is
|
|
109
|
-
// delivered later in the next tick), so the flag was dead. The
|
|
110
|
-
// listener is still required: without it, Node escalates the
|
|
111
|
-
// event to an unhandled-error and crashes the host process when
|
|
112
|
-
// the binary is missing.
|
|
113
|
-
child.on('error', () => undefined);
|
|
114
|
-
if (typeof child.pid !== 'number')
|
|
115
|
-
return false;
|
|
116
|
-
// unref so the parent event loop is not held open by the browser
|
|
117
|
-
// handle. The browser process continues independently.
|
|
118
|
-
child.unref();
|
|
119
|
-
// Callers treat `true` as best-effort: the fallback "Browser
|
|
120
|
-
// didn't open?" hint is always rendered, so a silent spawn
|
|
121
|
-
// failure still leaves the user a usable path.
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
catch {
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=auto-open-browser.js.map
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* — Auto-update channel model.
|
|
3
|
-
*
|
|
4
|
-
* the upstream tool's self-update flow exposes three release channels (stable
|
|
5
|
-
* / beta / canary) so operators can dial in their own risk tolerance:
|
|
6
|
-
* a finance-team operator pins `stable`, a tinkerer rides `canary`,
|
|
7
|
-
* and the default `beta` track sits in the middle. Pugi parity ships
|
|
8
|
-
* the same vocabulary on top of npm's dist-tags so we do NOT need a
|
|
9
|
-
* custom registry hop:
|
|
10
|
-
*
|
|
11
|
-
* - `stable` → npm dist-tag `latest`
|
|
12
|
-
* - `beta` → npm dist-tag `beta`
|
|
13
|
-
* - `canary` → npm dist-tag `next`
|
|
14
|
-
*
|
|
15
|
-
* The mapping is centralised here because the dispatcher + the probe
|
|
16
|
-
* + the slash command + the doctor probe all need to agree on which
|
|
17
|
-
* tag they query. The channel name is what shows up in operator UI
|
|
18
|
-
* (`pugi update --channel beta`); the npm tag is the wire-format that
|
|
19
|
-
* gets concatenated into `npm i -g @pugi/cli@<tag>`.
|
|
20
|
-
*
|
|
21
|
-
* Module contract:
|
|
22
|
-
*
|
|
23
|
-
* - Pure constants + a small parse helper. No I/O, no module-level
|
|
24
|
-
* side effects. The persistence layer (`state.ts`) and the probe
|
|
25
|
-
* (`checker.ts`) wrap this module without ever mutating it.
|
|
26
|
-
*
|
|
27
|
-
* - Default channel is `beta` because Pugi currently publishes ONLY
|
|
28
|
-
* beta releases on npm. Defaulting to `stable` would leave fresh
|
|
29
|
-
* installs polling a tag that does not exist yet, surfacing a
|
|
30
|
-
* confusing "no update available" message even though the binary
|
|
31
|
-
* they just installed is already behind. The default is revisited
|
|
32
|
-
* when `latest` (stable) starts shipping; the constant lives on
|
|
33
|
-
* a single line so the bump is a one-character diff.
|
|
34
|
-
*
|
|
35
|
-
* - All channel <-> tag conversions go through `npmTagForChannel` /
|
|
36
|
-
* `channelForNpmTag`. Hard-coding the string `'beta'` anywhere
|
|
37
|
-
* else is a bug.
|
|
38
|
-
*/
|
|
39
|
-
/**
|
|
40
|
-
* Immutable list of every supported channel. Drives the `--channel`
|
|
41
|
-
* flag validator + the `/update --channel <name>` slash parser +
|
|
42
|
-
* any future Ink picker that wants to render the full set.
|
|
43
|
-
*/
|
|
44
|
-
export const UPDATE_CHANNELS = Object.freeze([
|
|
45
|
-
'stable',
|
|
46
|
-
'beta',
|
|
47
|
-
'canary',
|
|
48
|
-
]);
|
|
49
|
-
/**
|
|
50
|
-
* Default channel when neither `~/.pugi/config.json::updateChannel`
|
|
51
|
-
* nor a CLI flag specifies one. See module header for rationale.
|
|
52
|
-
*/
|
|
53
|
-
export const DEFAULT_UPDATE_CHANNEL = 'beta';
|
|
54
|
-
/**
|
|
55
|
-
* npm dist-tag → channel mapping. Centralised so a future channel
|
|
56
|
-
* rename (e.g. dropping `next` in favour of `canary` as the npm tag)
|
|
57
|
-
* is a single-line change. The reverse-lookup helpers below derive
|
|
58
|
-
* from this map so the two surfaces never drift.
|
|
59
|
-
*/
|
|
60
|
-
const CHANNEL_TO_NPM_TAG = Object.freeze({
|
|
61
|
-
stable: 'latest',
|
|
62
|
-
beta: 'beta',
|
|
63
|
-
canary: 'next',
|
|
64
|
-
});
|
|
65
|
-
/**
|
|
66
|
-
* Map a Pugi channel name to the npm dist-tag the registry exposes.
|
|
67
|
-
* Used to build both the registry query URL and the
|
|
68
|
-
* `npm i -g @pugi/cli@<tag>` install command surfaced to the operator.
|
|
69
|
-
*/
|
|
70
|
-
export function npmTagForChannel(channel) {
|
|
71
|
-
return CHANNEL_TO_NPM_TAG[channel];
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Reverse lookup: given an npm dist-tag, return the matching Pugi
|
|
75
|
-
* channel name. Returns `null` for any tag we do not officially
|
|
76
|
-
* support; the caller layers in its own fallback (typically
|
|
77
|
-
* `DEFAULT_UPDATE_CHANNEL`) so a one-off dist-tag never crashes the
|
|
78
|
-
* channel picker.
|
|
79
|
-
*/
|
|
80
|
-
export function channelForNpmTag(tag) {
|
|
81
|
-
for (const channel of UPDATE_CHANNELS) {
|
|
82
|
-
if (CHANNEL_TO_NPM_TAG[channel] === tag)
|
|
83
|
-
return channel;
|
|
84
|
-
}
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Type guard / parser for an unknown string. Trims + lowercases the
|
|
89
|
-
* input so `--channel BETA` and `--channel beta ` both work. Returns
|
|
90
|
-
* `null` for unknown channel names; the caller decides whether to
|
|
91
|
-
* fall back, error out, or prompt the operator.
|
|
92
|
-
*/
|
|
93
|
-
export function parseUpdateChannel(raw) {
|
|
94
|
-
if (typeof raw !== 'string')
|
|
95
|
-
return null;
|
|
96
|
-
const normalised = raw.trim().toLowerCase();
|
|
97
|
-
if (normalised.length === 0)
|
|
98
|
-
return null;
|
|
99
|
-
for (const channel of UPDATE_CHANNELS) {
|
|
100
|
-
if (channel === normalised)
|
|
101
|
-
return channel;
|
|
102
|
-
}
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Pretty operator-readable description of a channel. Surfaced in the
|
|
107
|
-
* `pugi update --check` JSON envelope + the interactive picker so the
|
|
108
|
-
* operator sees what they are switching into. Keeps the copy single-
|
|
109
|
-
* sourced because the same line lands in the doctor table, the
|
|
110
|
-
* `--check` JSON, and the slash-command response.
|
|
111
|
-
*/
|
|
112
|
-
export function describeChannel(channel) {
|
|
113
|
-
switch (channel) {
|
|
114
|
-
case 'stable':
|
|
115
|
-
return 'stable (npm latest — finance / prod operators)';
|
|
116
|
-
case 'beta':
|
|
117
|
-
return 'beta (npm beta — current Pugi default)';
|
|
118
|
-
case 'canary':
|
|
119
|
-
return 'canary (npm next — tinkerers, early adopters)';
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=channels.js.map
|
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* — Channel-aware npm registry probe.
|
|
3
|
-
*
|
|
4
|
-
* Polls `https://registry.npmjs.org/@pugi/cli` and reads the
|
|
5
|
-
* `dist-tags` object — npm publishes one entry per dist-tag (`latest`,
|
|
6
|
-
* `beta`, `next`) mapped to the highest semver under that tag. The
|
|
7
|
-
* channel resolver in `channels.ts` translates Pugi's user-visible
|
|
8
|
-
* channel name (`stable` / `beta` / `canary`) into the matching tag
|
|
9
|
-
* before we read it off the response.
|
|
10
|
-
*
|
|
11
|
-
* Why this lives next to (rather than INSIDE) the existing
|
|
12
|
-
* `runtime/update-check.ts`:
|
|
13
|
-
*
|
|
14
|
-
* - `update-check.ts` already poll `/@pugi/cli/latest`. That endpoint
|
|
15
|
-
* ONLY surfaces the `latest` dist-tag — channel selection requires
|
|
16
|
-
* the full package document `/@pugi/cli` so we can pluck any of
|
|
17
|
-
* the three tags. Two endpoints, two probes.
|
|
18
|
-
*
|
|
19
|
-
* - The legacy banner (REPL cold start) keeps polling `latest` and
|
|
20
|
-
* does NOT need to know about channels yet — it is a single-track
|
|
21
|
-
* cosmetic hint. Splitting into two modules means we can ship L27
|
|
22
|
-
* without churning the existing banner cache shape.
|
|
23
|
-
*
|
|
24
|
-
* - A future sprint may unify the two probes once the channel
|
|
25
|
-
* selection percolates into the REPL banner. For now the modules
|
|
26
|
-
* coexist with a clear boundary: this file owns the `pugi update`
|
|
27
|
-
* surface, `runtime/update-check.ts` owns the REPL cold-start
|
|
28
|
-
* cosmetic banner.
|
|
29
|
-
*
|
|
30
|
-
* Module contract:
|
|
31
|
-
*
|
|
32
|
-
* - The probe is pure with respect to disk + clock — every IO/clock
|
|
33
|
-
* dependency is injected. The same module is used both at the CLI
|
|
34
|
-
* entry point (real `fetch` + real `Date.now`) and in tests
|
|
35
|
-
* (mock fetch + frozen clock) without a single environment shim.
|
|
36
|
-
*
|
|
37
|
-
* - Failures NEVER throw. A 5xx, a network error, a JSON parse
|
|
38
|
-
* failure, or an unknown channel/tag all collapse to a structured
|
|
39
|
-
* `{ available: false, error: <reason> }` envelope. The caller
|
|
40
|
-
* decides whether to surface the error to the operator (the
|
|
41
|
-
* `pugi update --check` JSON surface) or swallow it (the cold-
|
|
42
|
-
* start banner).
|
|
43
|
-
*
|
|
44
|
-
* - The probe DOES NOT touch persistence. Writing the
|
|
45
|
-
* `~/.pugi/.last-update-check` timestamp is the caller's
|
|
46
|
-
* responsibility (the dispatcher in `runtime/commands/update.ts`)
|
|
47
|
-
* so a smoke-test sweep that probes the registry 50 times in a
|
|
48
|
-
* row does not accidentally write 50 timestamps.
|
|
49
|
-
*/
|
|
50
|
-
import { npmTagForChannel, } from './channels.js';
|
|
51
|
-
import { compareVersions } from '../../runtime/update-check.js';
|
|
52
|
-
/**
|
|
53
|
-
* Base registry URL — overridable per call so the spec can drive the
|
|
54
|
-
* full request lifecycle through undici's MockAgent.
|
|
55
|
-
*/
|
|
56
|
-
const PUGI_CLI_PACKAGE_URL = 'https://registry.npmjs.org/@pugi/cli';
|
|
57
|
-
/**
|
|
58
|
-
* Hard cap on the registry round-trip. Mirrors the existing
|
|
59
|
-
* `runtime/update-check.ts::FETCH_TIMEOUT_MS` so both surfaces
|
|
60
|
-
* timeout-by-the-same-budget — operators never wait longer for `pugi
|
|
61
|
-
* update --check` than they would for the cold-start banner.
|
|
62
|
-
*/
|
|
63
|
-
const FETCH_TIMEOUT_MS = 3_000;
|
|
64
|
-
/**
|
|
65
|
-
* Build the install command the operator copy-pastes (or `pugi update
|
|
66
|
-
* --apply` shells out to). Centralised so the dispatcher + the
|
|
67
|
-
* checker share a single source of truth on the literal string.
|
|
68
|
-
*/
|
|
69
|
-
export function buildInstallCommand(channel) {
|
|
70
|
-
return `npm install -g @pugi/cli@${npmTagForChannel(channel)}`;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Probe the npm registry for the latest version under `channel`. The
|
|
74
|
-
* dispatcher wraps this with persistence + confirmation prompts; this
|
|
75
|
-
* function is intentionally pure so the doctor probe + the cold-
|
|
76
|
-
* start banner can reuse it without dragging the dispatcher's I/O
|
|
77
|
-
* surface in.
|
|
78
|
-
*/
|
|
79
|
-
export async function checkForChannelUpdate(deps) {
|
|
80
|
-
const fetchImpl = deps.fetchImpl ?? globalThis.fetch.bind(globalThis);
|
|
81
|
-
const registryUrl = deps.registryUrl ?? PUGI_CLI_PACKAGE_URL;
|
|
82
|
-
const timeoutMs = deps.timeoutMs ?? FETCH_TIMEOUT_MS;
|
|
83
|
-
const tag = npmTagForChannel(deps.channel);
|
|
84
|
-
const installCommand = buildInstallCommand(deps.channel);
|
|
85
|
-
// A controller-driven timeout — the spec's MockAgent never trips it
|
|
86
|
-
// but the production path on a stuck registry must bail in 3s.
|
|
87
|
-
const controller = new AbortController();
|
|
88
|
-
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
89
|
-
let response;
|
|
90
|
-
try {
|
|
91
|
-
response = await fetchImpl(registryUrl, {
|
|
92
|
-
method: 'GET',
|
|
93
|
-
headers: { Accept: 'application/json' },
|
|
94
|
-
signal: controller.signal,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
clearTimeout(timer);
|
|
99
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
100
|
-
return {
|
|
101
|
-
channel: deps.channel,
|
|
102
|
-
npmTag: tag,
|
|
103
|
-
current: deps.currentVersion,
|
|
104
|
-
latest: null,
|
|
105
|
-
available: false,
|
|
106
|
-
gap: null,
|
|
107
|
-
installCommand,
|
|
108
|
-
error: `registry_unreachable: ${message}`,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
clearTimeout(timer);
|
|
112
|
-
if (!response.ok) {
|
|
113
|
-
return {
|
|
114
|
-
channel: deps.channel,
|
|
115
|
-
npmTag: tag,
|
|
116
|
-
current: deps.currentVersion,
|
|
117
|
-
latest: null,
|
|
118
|
-
available: false,
|
|
119
|
-
gap: null,
|
|
120
|
-
installCommand,
|
|
121
|
-
error: `registry_status_${response.status}`,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
let body;
|
|
125
|
-
try {
|
|
126
|
-
body = await response.json();
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
130
|
-
return {
|
|
131
|
-
channel: deps.channel,
|
|
132
|
-
npmTag: tag,
|
|
133
|
-
current: deps.currentVersion,
|
|
134
|
-
latest: null,
|
|
135
|
-
available: false,
|
|
136
|
-
gap: null,
|
|
137
|
-
installCommand,
|
|
138
|
-
error: `registry_json_unparseable: ${message}`,
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
const distTags = extractDistTags(body);
|
|
142
|
-
if (!distTags) {
|
|
143
|
-
return {
|
|
144
|
-
channel: deps.channel,
|
|
145
|
-
npmTag: tag,
|
|
146
|
-
current: deps.currentVersion,
|
|
147
|
-
latest: null,
|
|
148
|
-
available: false,
|
|
149
|
-
gap: null,
|
|
150
|
-
installCommand,
|
|
151
|
-
error: 'registry_missing_dist_tags',
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
const latest = distTags[tag];
|
|
155
|
-
if (typeof latest !== 'string' || latest.length === 0) {
|
|
156
|
-
return {
|
|
157
|
-
channel: deps.channel,
|
|
158
|
-
npmTag: tag,
|
|
159
|
-
current: deps.currentVersion,
|
|
160
|
-
latest: null,
|
|
161
|
-
available: false,
|
|
162
|
-
gap: null,
|
|
163
|
-
installCommand,
|
|
164
|
-
error: `registry_missing_tag_${tag}`,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
const cmp = compareVersions(deps.currentVersion, latest);
|
|
168
|
-
const available = cmp < 0;
|
|
169
|
-
const gap = classifyGap(deps.currentVersion, latest);
|
|
170
|
-
return {
|
|
171
|
-
channel: deps.channel,
|
|
172
|
-
npmTag: tag,
|
|
173
|
-
current: deps.currentVersion,
|
|
174
|
-
latest,
|
|
175
|
-
available,
|
|
176
|
-
gap,
|
|
177
|
-
installCommand,
|
|
178
|
-
error: null,
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Extract the `dist-tags` object from a registry response. The npm
|
|
183
|
-
* package document is large (often >100kB); we only need this one
|
|
184
|
-
* key. Returns null when the field is missing or not a string-record
|
|
185
|
-
* — both indicate a registry response the probe should treat as
|
|
186
|
-
* unusable rather than panic on.
|
|
187
|
-
*/
|
|
188
|
-
function extractDistTags(body) {
|
|
189
|
-
if (!body || typeof body !== 'object')
|
|
190
|
-
return null;
|
|
191
|
-
const obj = body;
|
|
192
|
-
const raw = obj['dist-tags'];
|
|
193
|
-
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
194
|
-
return null;
|
|
195
|
-
const result = {};
|
|
196
|
-
for (const [tag, value] of Object.entries(raw)) {
|
|
197
|
-
if (typeof value === 'string' && value.length > 0) {
|
|
198
|
-
result[tag] = value;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return result;
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Coarse semver gap classification used to colour the dispatcher's
|
|
205
|
-
* diff line. We do NOT roll our own semver parser — `compareVersions`
|
|
206
|
-
* (already in `runtime/update-check.ts`) is the canonical comparator;
|
|
207
|
-
* here we only need to bucket the diff into major / minor / patch /
|
|
208
|
-
* prerelease for UX hints.
|
|
209
|
-
*
|
|
210
|
-
* The classifier is intentionally tolerant: anything that does not
|
|
211
|
-
* parse as `X.Y.Z[-pre]` collapses to `prerelease` so we surface a
|
|
212
|
-
* conservative "investigate manually" hint instead of crashing.
|
|
213
|
-
*/
|
|
214
|
-
function classifyGap(current, latest) {
|
|
215
|
-
if (current === latest)
|
|
216
|
-
return 'same';
|
|
217
|
-
const a = parseCoarseSemver(current);
|
|
218
|
-
const b = parseCoarseSemver(latest);
|
|
219
|
-
if (!a || !b)
|
|
220
|
-
return 'prerelease';
|
|
221
|
-
if (b.major !== a.major)
|
|
222
|
-
return 'major';
|
|
223
|
-
if (b.minor !== a.minor)
|
|
224
|
-
return 'minor';
|
|
225
|
-
if (b.patch !== a.patch)
|
|
226
|
-
return 'patch';
|
|
227
|
-
return 'prerelease';
|
|
228
|
-
}
|
|
229
|
-
function parseCoarseSemver(version) {
|
|
230
|
-
const match = /^v?(\d+)\.(\d+)\.(\d+)/.exec(version);
|
|
231
|
-
if (!match)
|
|
232
|
-
return null;
|
|
233
|
-
const major = Number(match[1]);
|
|
234
|
-
const minor = Number(match[2]);
|
|
235
|
-
const patch = Number(match[3]);
|
|
236
|
-
if (!Number.isFinite(major) || !Number.isFinite(minor) || !Number.isFinite(patch)) {
|
|
237
|
-
return null;
|
|
238
|
-
}
|
|
239
|
-
return { major, minor, patch };
|
|
240
|
-
}
|
|
241
|
-
//# sourceMappingURL=checker.js.map
|