@pugi/cli 0.1.0-beta.99 → 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 -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
package/dist/commands/deploy.js
DELETED
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `pugi deploy` command surface — P2 (Task #34).
|
|
3
|
-
*
|
|
4
|
-
* Subcommands:
|
|
5
|
-
* pugi deploy --target vercel <vercelProject> [--project <id>] [--ref <ref>] [--target-env production|preview] [--integration <id>]
|
|
6
|
-
* pugi deploy --target render <renderService> [--project <id>] [--ref <ref>]
|
|
7
|
-
* pugi deploy --status <deployment-id>
|
|
8
|
-
* pugi deploy --logs <deployment-id> [--tail]
|
|
9
|
-
*
|
|
10
|
-
* Exit codes (per task spec):
|
|
11
|
-
* 0 success (trigger queued, status terminal=ready, logs printed)
|
|
12
|
-
* 1 deployment failed (status=error or trigger refused)
|
|
13
|
-
* 2 transient (rate-limited, runtime down, retry-safe)
|
|
14
|
-
*
|
|
15
|
-
* Project resolution:
|
|
16
|
-
* `--project <id>` is required for trigger commands because the CLI's
|
|
17
|
-
* credential store is tenant-scoped but not project-scoped. A future
|
|
18
|
-
* sprint auto-detects the project from `.pugi/settings.json`
|
|
19
|
-
* bound to the workspace; until then the operator passes it explicitly.
|
|
20
|
-
*
|
|
21
|
-
* Local-first invariant :
|
|
22
|
-
* `pugi deploy` does NOT read repository files. The Vercel deploy
|
|
23
|
-
* resolves source from the existing ProjectGitBinding row on the
|
|
24
|
-
* admin-api side — the CLI is only a request initiator + status poller.
|
|
25
|
-
*/
|
|
26
|
-
import { fetchDeployStatus, fetchDeployLogs, submitDeployTrigger, } from '@pugi/sdk';
|
|
27
|
-
/**
|
|
28
|
-
* Parse `pugi deploy ...` flags + positionals into a structured shape.
|
|
29
|
-
* Exported so tests can exercise the parser in isolation.
|
|
30
|
-
*/
|
|
31
|
-
export function parseDeployArgs(args) {
|
|
32
|
-
const flags = {};
|
|
33
|
-
const positional = [];
|
|
34
|
-
for (let i = 0; i < args.length; i++) {
|
|
35
|
-
const arg = args[i] ?? '';
|
|
36
|
-
if (arg === '--json') {
|
|
37
|
-
flags.json = true;
|
|
38
|
-
}
|
|
39
|
-
else if (arg === '--target') {
|
|
40
|
-
const next = args[i + 1];
|
|
41
|
-
if (!next)
|
|
42
|
-
return { flags, positional, error: '--target requires a value (vercel|render)' };
|
|
43
|
-
if (next !== 'vercel' && next !== 'render') {
|
|
44
|
-
return { flags, positional, error: `--target must be vercel or render, got "${next}"` };
|
|
45
|
-
}
|
|
46
|
-
flags.target = next;
|
|
47
|
-
i += 1;
|
|
48
|
-
}
|
|
49
|
-
else if (arg.startsWith('--target=')) {
|
|
50
|
-
const value = arg.slice('--target='.length);
|
|
51
|
-
if (value !== 'vercel' && value !== 'render') {
|
|
52
|
-
return { flags, positional, error: `--target must be vercel or render, got "${value}"` };
|
|
53
|
-
}
|
|
54
|
-
flags.target = value;
|
|
55
|
-
}
|
|
56
|
-
else if (arg === '--project') {
|
|
57
|
-
const next = args[i + 1];
|
|
58
|
-
if (!next)
|
|
59
|
-
return { flags, positional, error: '--project requires a value' };
|
|
60
|
-
flags.project = next;
|
|
61
|
-
i += 1;
|
|
62
|
-
}
|
|
63
|
-
else if (arg.startsWith('--project=')) {
|
|
64
|
-
flags.project = arg.slice('--project='.length);
|
|
65
|
-
}
|
|
66
|
-
else if (arg === '--ref') {
|
|
67
|
-
const next = args[i + 1];
|
|
68
|
-
if (!next)
|
|
69
|
-
return { flags, positional, error: '--ref requires a value' };
|
|
70
|
-
flags.ref = next;
|
|
71
|
-
i += 1;
|
|
72
|
-
}
|
|
73
|
-
else if (arg.startsWith('--ref=')) {
|
|
74
|
-
flags.ref = arg.slice('--ref='.length);
|
|
75
|
-
}
|
|
76
|
-
else if (arg === '--target-env') {
|
|
77
|
-
const next = args[i + 1];
|
|
78
|
-
if (!next)
|
|
79
|
-
return { flags, positional, error: '--target-env requires a value' };
|
|
80
|
-
if (next !== 'production' && next !== 'preview') {
|
|
81
|
-
return {
|
|
82
|
-
flags,
|
|
83
|
-
positional,
|
|
84
|
-
error: `--target-env must be production or preview, got "${next}"`,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
flags.targetEnv = next;
|
|
88
|
-
i += 1;
|
|
89
|
-
}
|
|
90
|
-
else if (arg.startsWith('--target-env=')) {
|
|
91
|
-
const value = arg.slice('--target-env='.length);
|
|
92
|
-
if (value !== 'production' && value !== 'preview') {
|
|
93
|
-
return {
|
|
94
|
-
flags,
|
|
95
|
-
positional,
|
|
96
|
-
error: `--target-env must be production or preview, got "${value}"`,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
flags.targetEnv = value;
|
|
100
|
-
}
|
|
101
|
-
else if (arg === '--integration') {
|
|
102
|
-
const next = args[i + 1];
|
|
103
|
-
if (!next)
|
|
104
|
-
return { flags, positional, error: '--integration requires a value' };
|
|
105
|
-
flags.integration = next;
|
|
106
|
-
i += 1;
|
|
107
|
-
}
|
|
108
|
-
else if (arg.startsWith('--integration=')) {
|
|
109
|
-
flags.integration = arg.slice('--integration='.length);
|
|
110
|
-
}
|
|
111
|
-
else if (arg === '--status') {
|
|
112
|
-
const next = args[i + 1];
|
|
113
|
-
if (!next)
|
|
114
|
-
return { flags, positional, error: '--status requires a deployment id' };
|
|
115
|
-
flags.status = next;
|
|
116
|
-
i += 1;
|
|
117
|
-
}
|
|
118
|
-
else if (arg.startsWith('--status=')) {
|
|
119
|
-
flags.status = arg.slice('--status='.length);
|
|
120
|
-
}
|
|
121
|
-
else if (arg === '--logs') {
|
|
122
|
-
const next = args[i + 1];
|
|
123
|
-
if (!next)
|
|
124
|
-
return { flags, positional, error: '--logs requires a deployment id' };
|
|
125
|
-
flags.logs = next;
|
|
126
|
-
i += 1;
|
|
127
|
-
}
|
|
128
|
-
else if (arg.startsWith('--logs=')) {
|
|
129
|
-
flags.logs = arg.slice('--logs='.length);
|
|
130
|
-
}
|
|
131
|
-
else if (arg === '--tail') {
|
|
132
|
-
flags.tail = true;
|
|
133
|
-
}
|
|
134
|
-
else if (arg.startsWith('--')) {
|
|
135
|
-
return { flags, positional, error: `unknown flag: ${arg}` };
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
positional.push(arg);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return { flags, positional };
|
|
142
|
-
}
|
|
143
|
-
export function usage() {
|
|
144
|
-
return [
|
|
145
|
-
'Usage:',
|
|
146
|
-
' pugi deploy --target vercel <vercelProject> --project <id> [--target-env production|preview] [--ref <git-ref>] [--integration <id>]',
|
|
147
|
-
' pugi deploy --target render <renderService> --project <id> [--ref <git-ref>]',
|
|
148
|
-
' pugi deploy --status <deployment-id>',
|
|
149
|
-
' pugi deploy --logs <deployment-id> [--tail]',
|
|
150
|
-
'',
|
|
151
|
-
'Flags:',
|
|
152
|
-
' --target vercel|render Provider to deploy to.',
|
|
153
|
-
' --project <id> Pugi project id (required for trigger).',
|
|
154
|
-
' --ref <git-ref> Optional Git ref. Defaults to the binding default branch.',
|
|
155
|
-
' --target-env production|preview',
|
|
156
|
-
' Vercel deploy environment. Defaults to production.',
|
|
157
|
-
' --integration <id> Disambiguate when multiple integrations are active.',
|
|
158
|
-
' --status <id> Show the current status for a deployment.',
|
|
159
|
-
' --logs <id> [--tail] Fetch log tail. With --tail, polls until terminal.',
|
|
160
|
-
' --json Emit machine-readable JSON envelopes.',
|
|
161
|
-
'',
|
|
162
|
-
'Exit codes:',
|
|
163
|
-
' 0 success',
|
|
164
|
-
' 1 deployment failed / refused',
|
|
165
|
-
' 2 transient (rate-limited, runtime down, retry-safe)',
|
|
166
|
-
].join('\n');
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Main entry point. Returns the exit code; the CLI shim sets
|
|
170
|
-
* `process.exitCode = result` so tests can drive this without a child
|
|
171
|
-
* process and the REPL can poll the value.
|
|
172
|
-
*/
|
|
173
|
-
export async function runDeployCommand(args, io, deps) {
|
|
174
|
-
const parsed = parseDeployArgs(args);
|
|
175
|
-
if (parsed.error) {
|
|
176
|
-
if (parsed.flags.json) {
|
|
177
|
-
io.write(`${JSON.stringify({ command: 'deploy', ok: false, error: parsed.error }, null, 2)}\n`);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
io.writeError(parsed.error);
|
|
181
|
-
io.writeError(usage());
|
|
182
|
-
}
|
|
183
|
-
return 2;
|
|
184
|
-
}
|
|
185
|
-
const { flags, positional } = parsed;
|
|
186
|
-
// Branch 1: --status <id>
|
|
187
|
-
if (flags.status) {
|
|
188
|
-
return runStatus(flags.status, flags, io, deps);
|
|
189
|
-
}
|
|
190
|
-
// Branch 2: --logs <id>
|
|
191
|
-
if (flags.logs) {
|
|
192
|
-
return runLogs(flags.logs, flags, io, deps);
|
|
193
|
-
}
|
|
194
|
-
// Branch 3: trigger via --target <vercel|render>
|
|
195
|
-
if (!flags.target) {
|
|
196
|
-
if (flags.json) {
|
|
197
|
-
io.write(`${JSON.stringify({
|
|
198
|
-
command: 'deploy',
|
|
199
|
-
ok: false,
|
|
200
|
-
error: 'No --target specified. Use --target vercel|render, or --status / --logs to query existing deploys.',
|
|
201
|
-
}, null, 2)}\n`);
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
io.writeError('No --target specified. Use --target vercel|render, or --status / --logs to query existing deploys.');
|
|
205
|
-
io.writeError(usage());
|
|
206
|
-
}
|
|
207
|
-
return 2;
|
|
208
|
-
}
|
|
209
|
-
const projectKey = positional[0];
|
|
210
|
-
if (!projectKey) {
|
|
211
|
-
const msg = flags.target === 'vercel'
|
|
212
|
-
? 'pugi deploy --target vercel requires a Vercel project name as the positional argument'
|
|
213
|
-
: 'pugi deploy --target render requires a Render service name as the positional argument';
|
|
214
|
-
if (flags.json) {
|
|
215
|
-
io.write(`${JSON.stringify({ command: 'deploy', ok: false, error: msg }, null, 2)}\n`);
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
io.writeError(msg);
|
|
219
|
-
io.writeError(usage());
|
|
220
|
-
}
|
|
221
|
-
return 2;
|
|
222
|
-
}
|
|
223
|
-
if (!flags.project) {
|
|
224
|
-
const msg = 'pugi deploy trigger requires --project <pugi-project-id>';
|
|
225
|
-
if (flags.json) {
|
|
226
|
-
io.write(`${JSON.stringify({ command: 'deploy', ok: false, error: msg }, null, 2)}\n`);
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
io.writeError(msg);
|
|
230
|
-
io.writeError(usage());
|
|
231
|
-
}
|
|
232
|
-
return 2;
|
|
233
|
-
}
|
|
234
|
-
const config = deps.resolveConfig();
|
|
235
|
-
if (!config) {
|
|
236
|
-
const msg = 'Not authenticated. Run `pugi login` first.';
|
|
237
|
-
if (flags.json) {
|
|
238
|
-
io.write(`${JSON.stringify({ command: 'deploy', ok: false, error: msg }, null, 2)}\n`);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
io.writeError(msg);
|
|
242
|
-
}
|
|
243
|
-
return 1;
|
|
244
|
-
}
|
|
245
|
-
let result;
|
|
246
|
-
if (flags.target === 'vercel') {
|
|
247
|
-
result = await submitDeployTrigger(config, 'vercel', {
|
|
248
|
-
schema: 1,
|
|
249
|
-
projectId: flags.project,
|
|
250
|
-
vercelProject: projectKey,
|
|
251
|
-
...(flags.integration ? { integrationId: flags.integration } : {}),
|
|
252
|
-
...(flags.targetEnv ? { target: flags.targetEnv } : {}),
|
|
253
|
-
...(flags.ref ? { ref: flags.ref } : {}),
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
result = await submitDeployTrigger(config, 'render', {
|
|
258
|
-
schema: 1,
|
|
259
|
-
projectId: flags.project,
|
|
260
|
-
renderService: projectKey,
|
|
261
|
-
...(flags.ref ? { ref: flags.ref } : {}),
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
return emitTriggerResult(result, flags, io);
|
|
265
|
-
}
|
|
266
|
-
function emitTriggerResult(result, flags, io) {
|
|
267
|
-
if (result.status === 'ok') {
|
|
268
|
-
if (flags.json) {
|
|
269
|
-
io.write(`${JSON.stringify({ command: 'deploy.trigger', ok: true, deployment: result.response }, null, 2)}\n`);
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
io.write(renderStatusTable(result.response, 'queued'));
|
|
273
|
-
}
|
|
274
|
-
return 0;
|
|
275
|
-
}
|
|
276
|
-
return emitDeployFailure('deploy.trigger', result, flags, io);
|
|
277
|
-
}
|
|
278
|
-
async function runStatus(deploymentId, flags, io, deps) {
|
|
279
|
-
const config = deps.resolveConfig();
|
|
280
|
-
if (!config) {
|
|
281
|
-
const msg = 'Not authenticated. Run `pugi login` first.';
|
|
282
|
-
if (flags.json) {
|
|
283
|
-
io.write(`${JSON.stringify({ command: 'deploy.status', ok: false, error: msg }, null, 2)}\n`);
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
io.writeError(msg);
|
|
287
|
-
}
|
|
288
|
-
return 1;
|
|
289
|
-
}
|
|
290
|
-
const result = await fetchDeployStatus(config, deploymentId);
|
|
291
|
-
if (result.status === 'ok') {
|
|
292
|
-
if (flags.json) {
|
|
293
|
-
io.write(`${JSON.stringify({ command: 'deploy.status', ok: true, deployment: result.response }, null, 2)}\n`);
|
|
294
|
-
}
|
|
295
|
-
else {
|
|
296
|
-
io.write(renderStatusTable(result.response, 'current'));
|
|
297
|
-
}
|
|
298
|
-
return statusToExitCode(result.response.status);
|
|
299
|
-
}
|
|
300
|
-
return emitDeployFailure('deploy.status', result, flags, io);
|
|
301
|
-
}
|
|
302
|
-
async function runLogs(deploymentId, flags, io, deps) {
|
|
303
|
-
const config = deps.resolveConfig();
|
|
304
|
-
if (!config) {
|
|
305
|
-
const msg = 'Not authenticated. Run `pugi login` first.';
|
|
306
|
-
if (flags.json) {
|
|
307
|
-
io.write(`${JSON.stringify({ command: 'deploy.logs', ok: false, error: msg }, null, 2)}\n`);
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
io.writeError(msg);
|
|
311
|
-
}
|
|
312
|
-
return 1;
|
|
313
|
-
}
|
|
314
|
-
const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
315
|
-
let lastTerminal = false;
|
|
316
|
-
let lastStatus = 'queued';
|
|
317
|
-
let lastLogs = '';
|
|
318
|
-
// Single-shot vs --tail. The tail loop is bounded by the 10-minute hard
|
|
319
|
-
// ceiling so a runaway runtime doesn't keep a CI job pinned forever.
|
|
320
|
-
const startedAt = Date.now();
|
|
321
|
-
const maxMs = 10 * 60 * 1000;
|
|
322
|
-
const pollIntervalMs = 3_000;
|
|
323
|
-
while (true) {
|
|
324
|
-
const result = await fetchDeployLogs(config, deploymentId);
|
|
325
|
-
if (result.status !== 'ok') {
|
|
326
|
-
return emitDeployFailure('deploy.logs', result, flags, io);
|
|
327
|
-
}
|
|
328
|
-
const { response } = result;
|
|
329
|
-
lastTerminal = response.terminal;
|
|
330
|
-
lastStatus = response.status;
|
|
331
|
-
lastLogs = response.logs;
|
|
332
|
-
if (flags.json) {
|
|
333
|
-
io.write(`${JSON.stringify({ command: 'deploy.logs', ok: true, snapshot: response }, null, 2)}\n`);
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
io.write(response.logs.endsWith('\n') ? response.logs : `${response.logs}\n`);
|
|
337
|
-
}
|
|
338
|
-
if (!flags.tail)
|
|
339
|
-
break;
|
|
340
|
-
if (response.terminal)
|
|
341
|
-
break;
|
|
342
|
-
if (Date.now() - startedAt > maxMs) {
|
|
343
|
-
io.writeError(`--tail timed out after ${Math.floor(maxMs / 60_000)} minutes; deployment still ${response.status}. Re-run with --status to confirm.`);
|
|
344
|
-
return 2;
|
|
345
|
-
}
|
|
346
|
-
await sleep(pollIntervalMs);
|
|
347
|
-
}
|
|
348
|
-
// Suppress unused-warning safe-guards in single-shot path.
|
|
349
|
-
void lastTerminal;
|
|
350
|
-
void lastLogs;
|
|
351
|
-
return statusToExitCode(lastStatus);
|
|
352
|
-
}
|
|
353
|
-
function emitDeployFailure(command, result, flags, io) {
|
|
354
|
-
if (result.status === 'ok')
|
|
355
|
-
return 0;
|
|
356
|
-
if (flags.json) {
|
|
357
|
-
io.write(`${JSON.stringify({ command, ok: false, ...result }, null, 2)}\n`);
|
|
358
|
-
}
|
|
359
|
-
switch (result.status) {
|
|
360
|
-
case 'unauthenticated':
|
|
361
|
-
if (!flags.json) {
|
|
362
|
-
io.writeError('Runtime rejected credentials. Re-run `pugi login` or refresh your API key.');
|
|
363
|
-
}
|
|
364
|
-
return 1;
|
|
365
|
-
case 'endpoint_missing':
|
|
366
|
-
if (!flags.json) {
|
|
367
|
-
io.writeError('Deploy endpoint not deployed on this runtime. Update your runtime or set PUGI_API_URL to a runtime that supports /api/pugi/deploy/*.');
|
|
368
|
-
}
|
|
369
|
-
return 2;
|
|
370
|
-
case 'not_configured':
|
|
371
|
-
if (!flags.json) {
|
|
372
|
-
io.writeError('Provider not configured on this runtime. Try `pugi deploy --target vercel` until Render ships in Sprint 2.');
|
|
373
|
-
}
|
|
374
|
-
return 2;
|
|
375
|
-
case 'not_found':
|
|
376
|
-
if (!flags.json) {
|
|
377
|
-
io.writeError('Deployment not found for this tenant.');
|
|
378
|
-
}
|
|
379
|
-
return 1;
|
|
380
|
-
case 'rate_limited':
|
|
381
|
-
if (!flags.json) {
|
|
382
|
-
const retrySec = Math.max(1, Math.ceil(result.retryAfterMs / 1000));
|
|
383
|
-
io.writeError(`Runtime rate-limited. Retry in ${retrySec}s. (Vercel Hobby cap is the common cause.)`);
|
|
384
|
-
}
|
|
385
|
-
return 2;
|
|
386
|
-
case 'failed':
|
|
387
|
-
if (!flags.json) {
|
|
388
|
-
io.writeError(`Deploy call failed: ${result.message}`);
|
|
389
|
-
}
|
|
390
|
-
// Network / 5xx → transient. Schema validation / 4xx → permanent.
|
|
391
|
-
// We cannot perfectly disambiguate here, so map HTTP < 500 to 1
|
|
392
|
-
// (caller error, fix and retry) and the rest to 2 (transient).
|
|
393
|
-
return result.code >= 500 || result.code === 0 ? 2 : 1;
|
|
394
|
-
default:
|
|
395
|
-
// Exhaustiveness: TS catches new variants at compile time. Runtime
|
|
396
|
-
// fall-through keeps the CLI from hanging if a future SDK version
|
|
397
|
-
// adds a status the CLI doesn't yet know about.
|
|
398
|
-
if (!flags.json) {
|
|
399
|
-
io.writeError(`Unknown deploy result.`);
|
|
400
|
-
}
|
|
401
|
-
return 2;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
function statusToExitCode(status) {
|
|
405
|
-
switch (status) {
|
|
406
|
-
case 'ready':
|
|
407
|
-
case 'queued':
|
|
408
|
-
case 'building':
|
|
409
|
-
return 0;
|
|
410
|
-
case 'error':
|
|
411
|
-
return 1;
|
|
412
|
-
case 'canceled':
|
|
413
|
-
return 1;
|
|
414
|
-
default:
|
|
415
|
-
return 0;
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
function renderStatusTable(response, context) {
|
|
419
|
-
const lines = [];
|
|
420
|
-
lines.push(context === 'queued' ? 'Deployment queued.' : 'Deployment status:');
|
|
421
|
-
lines.push(` id: ${response.id}`);
|
|
422
|
-
lines.push(` provider: ${response.provider}`);
|
|
423
|
-
lines.push(` project: ${response.projectId}`);
|
|
424
|
-
lines.push(` status: ${response.status}`);
|
|
425
|
-
if (response.url)
|
|
426
|
-
lines.push(` url: ${response.url}`);
|
|
427
|
-
if (response.providerDeploymentId)
|
|
428
|
-
lines.push(` providerDeploymentId: ${response.providerDeploymentId}`);
|
|
429
|
-
lines.push(` createdAt: ${response.createdAt}`);
|
|
430
|
-
lines.push(` updatedAt: ${response.updatedAt}`);
|
|
431
|
-
if (response.error) {
|
|
432
|
-
lines.push('');
|
|
433
|
-
lines.push('--- build error tail ---');
|
|
434
|
-
lines.push(response.error);
|
|
435
|
-
}
|
|
436
|
-
lines.push('');
|
|
437
|
-
return lines.join('\n');
|
|
438
|
-
}
|
|
439
|
-
//# sourceMappingURL=deploy.js.map
|
package/dist/commands/flatten.js
DELETED
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `pugi flatten` — CLI surface for the rendergit-port flatten engine.
|
|
3
|
-
*
|
|
4
|
-
* The runner lives here (not in `runtime/cli.ts`) so the dispatch
|
|
5
|
-
* surface stays focused on argv routing. This module owns:
|
|
6
|
-
*
|
|
7
|
-
* - Parsing the command-local flags (`--mode`, `--max-file-size`,
|
|
8
|
-
* `--include`, `--exclude`, `--stdout`, `--open`, `--out`).
|
|
9
|
-
* - Routing to `flattenRepo` with a resolved option bag.
|
|
10
|
-
* - Forwarding the rendered text + summary through the unified
|
|
11
|
-
* `writeOutput` writer so `--json` mode works without a second
|
|
12
|
-
* code path.
|
|
13
|
-
*
|
|
14
|
-
* Ported from karpathy/rendergit (BSD-0). License compatible with
|
|
15
|
-
* Pugi's open-source posture.
|
|
16
|
-
*/
|
|
17
|
-
import { resolve } from 'node:path';
|
|
18
|
-
import { DEFAULT_MAX_FILE_SIZE, flattenRepo, } from '../core/flatten/flatten-repo.js';
|
|
19
|
-
/**
|
|
20
|
-
* Entry point invoked by `runtime/cli.ts::dispatchFlatten`. Returns
|
|
21
|
-
* the desired process exit code so the dispatcher can set
|
|
22
|
-
* `process.exitCode` without a second round-trip.
|
|
23
|
-
*/
|
|
24
|
-
export async function runFlattenCommand(ctx) {
|
|
25
|
-
const parsed = parseArgs(ctx.args);
|
|
26
|
-
if ('error' in parsed) {
|
|
27
|
-
ctx.writeOutput({ ok: false, error: parsed.error }, `pugi flatten: ${parsed.error}`);
|
|
28
|
-
return 2;
|
|
29
|
-
}
|
|
30
|
-
const options = {
|
|
31
|
-
cwd: parsed.cwd,
|
|
32
|
-
mode: parsed.mode,
|
|
33
|
-
stdout: parsed.stdout,
|
|
34
|
-
maxFileSize: parsed.maxFileSize,
|
|
35
|
-
include: parsed.include,
|
|
36
|
-
exclude: parsed.exclude,
|
|
37
|
-
open: parsed.open,
|
|
38
|
-
};
|
|
39
|
-
try {
|
|
40
|
-
const result = await flattenRepo(options);
|
|
41
|
-
if (parsed.stdout) {
|
|
42
|
-
// Always emit the rendered text to stdout. JSON mode wraps it
|
|
43
|
-
// in an envelope so scripted callers can demux the result from
|
|
44
|
-
// the summary line.
|
|
45
|
-
if (ctx.json) {
|
|
46
|
-
ctx.writeOutput({
|
|
47
|
-
ok: true,
|
|
48
|
-
mode: parsed.mode,
|
|
49
|
-
files: result.files.length,
|
|
50
|
-
skipped: result.skipped.length,
|
|
51
|
-
html: result.html,
|
|
52
|
-
}, result.html);
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
process.stdout.write(result.html);
|
|
56
|
-
}
|
|
57
|
-
return 0;
|
|
58
|
-
}
|
|
59
|
-
const summary = `pugi flatten: wrote ${result.files.length} files (${result.skipped.length} skipped) to ${result.path ?? '<unknown>'}`;
|
|
60
|
-
ctx.writeOutput({
|
|
61
|
-
ok: true,
|
|
62
|
-
mode: parsed.mode,
|
|
63
|
-
path: result.path,
|
|
64
|
-
files: result.files.length,
|
|
65
|
-
skipped: result.skipped.length,
|
|
66
|
-
}, summary);
|
|
67
|
-
return 0;
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
71
|
-
ctx.writeOutput({ ok: false, error: msg }, `pugi flatten: ${msg}`);
|
|
72
|
-
return 1;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
function parseArgs(args) {
|
|
76
|
-
let cwd = process.cwd();
|
|
77
|
-
let mode = 'human';
|
|
78
|
-
let stdout = false;
|
|
79
|
-
let open = false;
|
|
80
|
-
let maxFileSize = DEFAULT_MAX_FILE_SIZE;
|
|
81
|
-
const include = [];
|
|
82
|
-
const exclude = [];
|
|
83
|
-
let positionalConsumed = false;
|
|
84
|
-
for (let i = 0; i < args.length; i += 1) {
|
|
85
|
-
const arg = args[i] ?? '';
|
|
86
|
-
if (arg === '--stdout') {
|
|
87
|
-
stdout = true;
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
if (arg === '--open') {
|
|
91
|
-
open = true;
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
if (arg === '--mode') {
|
|
95
|
-
const next = args[i + 1];
|
|
96
|
-
if (!next)
|
|
97
|
-
return { error: '--mode requires a value (human | llm)' };
|
|
98
|
-
const m = parseMode(next);
|
|
99
|
-
if (!m)
|
|
100
|
-
return { error: `--mode: unknown value "${next}" (expected human | llm)` };
|
|
101
|
-
mode = m;
|
|
102
|
-
i += 1;
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
if (arg.startsWith('--mode=')) {
|
|
106
|
-
const m = parseMode(arg.slice('--mode='.length));
|
|
107
|
-
if (!m)
|
|
108
|
-
return { error: `--mode: unknown value "${arg.slice('--mode='.length)}" (expected human | llm)` };
|
|
109
|
-
mode = m;
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
if (arg === '--max-file-size') {
|
|
113
|
-
const next = args[i + 1];
|
|
114
|
-
if (!next)
|
|
115
|
-
return { error: '--max-file-size requires a value (e.g. 200kb)' };
|
|
116
|
-
const n = parseSize(next);
|
|
117
|
-
if (n === undefined)
|
|
118
|
-
return { error: `--max-file-size: cannot parse "${next}"` };
|
|
119
|
-
maxFileSize = n;
|
|
120
|
-
i += 1;
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
if (arg.startsWith('--max-file-size=')) {
|
|
124
|
-
const v = arg.slice('--max-file-size='.length);
|
|
125
|
-
const n = parseSize(v);
|
|
126
|
-
if (n === undefined)
|
|
127
|
-
return { error: `--max-file-size: cannot parse "${v}"` };
|
|
128
|
-
maxFileSize = n;
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
if (arg === '--include') {
|
|
132
|
-
const next = args[i + 1];
|
|
133
|
-
if (!next)
|
|
134
|
-
return { error: '--include requires a pattern' };
|
|
135
|
-
include.push(next);
|
|
136
|
-
i += 1;
|
|
137
|
-
continue;
|
|
138
|
-
}
|
|
139
|
-
if (arg.startsWith('--include=')) {
|
|
140
|
-
include.push(arg.slice('--include='.length));
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
if (arg === '--exclude') {
|
|
144
|
-
const next = args[i + 1];
|
|
145
|
-
if (!next)
|
|
146
|
-
return { error: '--exclude requires a pattern' };
|
|
147
|
-
exclude.push(next);
|
|
148
|
-
i += 1;
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
if (arg.startsWith('--exclude=')) {
|
|
152
|
-
exclude.push(arg.slice('--exclude='.length));
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
if (arg.startsWith('--')) {
|
|
156
|
-
return { error: `unknown flag "${arg}"` };
|
|
157
|
-
}
|
|
158
|
-
// Positional: workspace path. Only the first non-flag wins; extras
|
|
159
|
-
// are an error so a typo (`pugi flatten . foo`) surfaces.
|
|
160
|
-
if (positionalConsumed) {
|
|
161
|
-
return { error: `unexpected positional argument "${arg}"` };
|
|
162
|
-
}
|
|
163
|
-
cwd = resolve(arg);
|
|
164
|
-
positionalConsumed = true;
|
|
165
|
-
}
|
|
166
|
-
return { cwd, mode, stdout, open, maxFileSize, include, exclude };
|
|
167
|
-
}
|
|
168
|
-
function parseMode(v) {
|
|
169
|
-
if (v === 'human' || v === 'llm')
|
|
170
|
-
return v;
|
|
171
|
-
return undefined;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Parse a size literal: bare number = bytes; `200kb` / `1mb` / `2gb`
|
|
175
|
-
* (case-insensitive, binary units — 1KB = 1024 bytes).
|
|
176
|
-
*/
|
|
177
|
-
export function parseSize(raw) {
|
|
178
|
-
const trimmed = raw.trim().toLowerCase();
|
|
179
|
-
if (trimmed.length === 0)
|
|
180
|
-
return undefined;
|
|
181
|
-
const match = /^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/.exec(trimmed);
|
|
182
|
-
if (!match)
|
|
183
|
-
return undefined;
|
|
184
|
-
const n = Number(match[1]);
|
|
185
|
-
if (!Number.isFinite(n) || n < 0)
|
|
186
|
-
return undefined;
|
|
187
|
-
const unit = match[2] ?? 'b';
|
|
188
|
-
const multiplier = unit === 'b' ? 1 : unit === 'kb' ? 1024 : unit === 'mb' ? 1024 * 1024 : 1024 * 1024 * 1024;
|
|
189
|
-
return Math.floor(n * multiplier);
|
|
190
|
-
}
|
|
191
|
-
//# sourceMappingURL=flatten.js.map
|