@pugi/cli 0.1.0-beta.10 → 0.1.0-beta.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +132 -0
- package/LICENSE +1 -1
- package/README.md +53 -11
- package/assets/pugi-prozr2-mascot.ansi +9 -0
- package/bin/run.js +33 -1
- package/dist/commands/deploy.js +40 -40
- package/dist/commands/flatten.js +191 -0
- package/dist/commands/jobs-watch.js +201 -0
- package/dist/commands/jobs.js +42 -27
- package/dist/commands/retro.js +210 -0
- package/dist/commands/smoke.js +133 -0
- package/dist/core/agent-progress/cleanup.js +134 -0
- package/dist/core/agent-progress/schema.js +144 -0
- package/dist/core/agent-progress/writer.js +101 -0
- package/dist/core/agents/adaptive-router.js +330 -0
- package/dist/core/agents/query-decomposer.js +297 -0
- package/dist/core/agents/registry.js +3 -3
- package/dist/core/approvals/shortcut-resolver.js +98 -0
- package/dist/core/artifact-chain/dispatcher.js +148 -0
- package/dist/core/artifact-chain/exporter.js +164 -0
- package/dist/core/artifact-chain/state.js +243 -0
- package/dist/core/artifact-chain/steps.js +169 -0
- package/dist/core/ask-user/question.js +92 -0
- package/dist/core/audit/audit-trail.js +275 -0
- package/dist/core/auth/ensure-authenticated.js +129 -0
- package/dist/core/auth/env-provider.js +238 -0
- package/dist/core/auto-open-browser.js +4 -4
- package/dist/core/auto-update/channels.js +122 -0
- package/dist/core/auto-update/checker.js +241 -0
- package/dist/core/auto-update/state.js +235 -0
- package/dist/core/bare-mode/index.js +107 -0
- package/dist/core/bash/redirect.js +281 -0
- package/dist/core/bash-classifier.js +436 -40
- package/dist/core/checkpoint/resumer.js +149 -0
- package/dist/core/checkpoint/rewinder.js +291 -0
- package/dist/core/checkpoints/shadow-git.js +670 -0
- package/dist/core/citations/parser.js +109 -0
- package/dist/core/classifier/yolo-classifier.js +88 -0
- package/dist/core/codegraph/db.js +506 -0
- package/dist/core/codegraph/decision-store.js +248 -0
- package/dist/core/codegraph/detect-repo.js +459 -0
- package/dist/core/codegraph/install.js +134 -0
- package/dist/core/codegraph/offer-hook.js +220 -0
- package/dist/core/codegraph/parser.js +71 -0
- package/dist/core/codegraph/types.js +34 -0
- package/dist/core/compact/auto-trigger.js +96 -0
- package/dist/core/compact/buffer-rewriter.js +115 -0
- package/dist/core/compact/summarizer.js +208 -0
- package/dist/core/compact/token-counter.js +108 -0
- package/dist/core/consensus/anvil-fanout.js +25 -25
- package/dist/core/consensus/diff-capture.js +121 -12
- package/dist/core/consensus/rubric.js +21 -21
- package/dist/core/context/builder.js +6 -6
- package/dist/core/context/compaction-events.js +8 -8
- package/dist/core/context/compaction.js +31 -31
- package/dist/core/context/index.js +15 -8
- package/dist/core/context/invariants.js +51 -51
- package/dist/core/context/markdown-loader.js +28 -10
- package/dist/core/context/markdown-traverse.js +255 -0
- package/dist/core/context/pugiignore.js +41 -41
- package/dist/core/context/repo-skeleton.js +37 -37
- package/dist/core/context/tool-eviction.js +55 -0
- package/dist/core/context/watcher.js +32 -32
- package/dist/core/context/working-set.js +23 -23
- package/dist/core/coordinator/agent-tools.js +77 -0
- package/dist/core/coordinator/agent-toolset.js +65 -0
- package/dist/core/coordinator/fsm.js +73 -0
- package/dist/core/coordinator/mode-fsm.js +70 -0
- package/dist/core/cost/rate-card.js +129 -0
- package/dist/core/cost/tracker.js +221 -0
- package/dist/core/credentials.js +13 -13
- package/dist/core/cron/scheduler.js +138 -0
- package/dist/core/denial-tracking/index.js +8 -0
- package/dist/core/denial-tracking/state.js +264 -0
- package/dist/core/diagnostics/probe-runner.js +93 -0
- package/dist/core/diagnostics/probes/api.js +46 -0
- package/dist/core/diagnostics/probes/auth.js +93 -0
- package/dist/core/diagnostics/probes/bare-mode.js +42 -0
- package/dist/core/diagnostics/probes/cli-version.js +127 -0
- package/dist/core/diagnostics/probes/config.js +72 -0
- package/dist/core/diagnostics/probes/denial-tracking.js +57 -0
- package/dist/core/diagnostics/probes/disk.js +81 -0
- package/dist/core/diagnostics/probes/engine-live.js +46 -0
- package/dist/core/diagnostics/probes/git.js +65 -0
- package/dist/core/diagnostics/probes/hooks.js +118 -0
- package/dist/core/diagnostics/probes/mcp.js +75 -0
- package/dist/core/diagnostics/probes/node.js +59 -0
- package/dist/core/diagnostics/probes/pnpm.js +36 -0
- package/dist/core/diagnostics/probes/pugi-md.js +89 -0
- package/dist/core/diagnostics/probes/sandbox.js +72 -0
- package/dist/core/diagnostics/probes/session.js +74 -0
- package/dist/core/diagnostics/probes/status-snapshot.js +488 -0
- package/dist/core/diagnostics/probes/workspace.js +63 -0
- package/dist/core/diagnostics/types.js +70 -0
- package/dist/core/dispatch/cache-cleanup.js +197 -0
- package/dist/core/dispatch/cache-handoff.js +295 -0
- package/dist/core/edits/apply-patch-layer-e.js +189 -0
- package/dist/core/edits/dispatch.js +333 -7
- package/dist/core/edits/format-detector.js +260 -0
- package/dist/core/edits/format-matrix.js +26 -0
- package/dist/core/edits/fuzzy-ladder.js +650 -0
- package/dist/core/edits/index.js +5 -1
- package/dist/core/edits/journal.js +199 -0
- package/dist/core/edits/layer-a-apply.js +15 -15
- package/dist/core/edits/layer-a-fuzzy-apply.js +198 -0
- package/dist/core/edits/layer-b-apply.js +9 -9
- package/dist/core/edits/layer-c-apply.js +6 -6
- package/dist/core/edits/layer-d-ast.js +557 -14
- package/dist/core/edits/marker-parser.js +12 -12
- package/dist/core/edits/security-gate.js +27 -27
- package/dist/core/edits/verify-hook.js +273 -0
- package/dist/core/edits/worktree.js +29 -29
- package/dist/core/engine/anvil-client.js +214 -26
- package/dist/core/engine/auto-compact.js +247 -0
- package/dist/core/engine/budgets.js +220 -0
- package/dist/core/engine/compact-llm-summarizer.js +124 -0
- package/dist/core/engine/context-prefix.js +155 -0
- package/dist/core/engine/index.js +1 -1
- package/dist/core/engine/intensity.js +163 -0
- package/dist/core/engine/intent.js +260 -0
- package/dist/core/engine/native-pugi.js +1559 -227
- package/dist/core/engine/prompts.js +187 -19
- package/dist/core/engine/strip-internal-fields.js +124 -0
- package/dist/core/engine/tool-bridge.js +1887 -59
- package/dist/core/engine/verification-patterns.js +195 -0
- package/dist/core/evaluation/golden-dataset.js +293 -0
- package/dist/core/feedback/queue.js +177 -0
- package/dist/core/feedback/submitter.js +145 -0
- package/dist/core/file-cache.js +113 -1
- package/dist/core/flatten/flatten-repo.js +439 -0
- package/dist/core/format/osc8-link.js +28 -0
- package/dist/core/hook-chains.js +392 -0
- package/dist/core/hooks/citation-verify-hook.js +138 -0
- package/dist/core/hooks/citation-verify.js +112 -0
- package/dist/core/hooks/events.js +46 -0
- package/dist/core/hooks/index.js +15 -0
- package/dist/core/hooks/registry.js +216 -0
- package/dist/core/hooks/runner.js +236 -0
- package/dist/core/hooks/v2/event-emitter.js +115 -0
- package/dist/core/hooks/v2/executor.js +282 -0
- package/dist/core/hooks/v2/index.js +25 -0
- package/dist/core/hooks/v2/lifecycle.js +104 -0
- package/dist/core/hooks/v2/loader.js +216 -0
- package/dist/core/hooks/v2/matcher.js +125 -0
- package/dist/core/hooks/v2/trust.js +143 -0
- package/dist/core/hooks/v2/types.js +86 -0
- package/dist/core/hooks/worktree-events.js +158 -0
- package/dist/core/image/renderer.js +71 -0
- package/dist/core/init/detector.js +582 -0
- package/dist/core/init/template-renderer.js +242 -0
- package/dist/core/jobs/registry.js +18 -18
- package/dist/core/ledger/results-tsv.js +142 -0
- package/dist/core/log-discipline/stdout-redirect.js +51 -0
- package/dist/core/lsp/cache.js +105 -0
- package/dist/core/lsp/client.js +551 -41
- package/dist/core/lsp/language-detect.js +66 -0
- package/dist/core/lsp/post-edit-diagnostics.js +171 -0
- package/dist/core/lsp/server-detect.js +173 -0
- package/dist/core/lsp/symbol-cache.js +162 -0
- package/dist/core/lsp/symbol-tools.js +664 -0
- package/dist/core/mcp/client.js +97 -28
- package/dist/core/mcp/http-server.js +553 -0
- package/dist/core/mcp/orchestrator-config.js +192 -0
- package/dist/core/mcp/orchestrator-tools.js +806 -0
- package/dist/core/mcp/permission.js +190 -0
- package/dist/core/mcp/registry.js +39 -17
- package/dist/core/mcp/server-tools.js +219 -0
- package/dist/core/mcp/server.js +397 -0
- package/dist/core/mcp/trust.js +10 -10
- package/dist/core/memory/dual-write.js +416 -0
- package/dist/core/memory/passive-extract.js +130 -0
- package/dist/core/memory/phase1-kinds.js +20 -0
- package/dist/core/memory/secret-scanner.js +304 -0
- package/dist/core/memory-sync/queue.js +170 -0
- package/dist/core/metrics/extract.js +113 -0
- package/dist/core/modes/roo-modes.js +68 -0
- package/dist/core/notes/notes-paths.js +113 -0
- package/dist/core/notes/notes-recorder.js +140 -0
- package/dist/core/notes/notes-writer.js +53 -0
- package/dist/core/notes/renderers.js +0 -0
- package/dist/core/notes/slug.js +105 -0
- package/dist/core/onboarding/ensure-initialized.js +133 -0
- package/dist/core/onboarding/marker.js +111 -0
- package/dist/core/onboarding/telemetry-state.js +108 -0
- package/dist/core/output-style/presets.js +176 -0
- package/dist/core/output-style/state.js +185 -0
- package/dist/core/path-security.js +287 -5
- package/dist/core/permission.js +82 -22
- package/dist/core/permissions/auto-classifier.js +124 -0
- package/dist/core/permissions/bash-parser.js +371 -0
- package/dist/core/permissions/circuit-breaker.js +83 -0
- package/dist/core/permissions/constrained-edit.js +91 -0
- package/dist/core/permissions/gate.js +278 -0
- package/dist/core/permissions/index.js +20 -0
- package/dist/core/permissions/mode.js +174 -0
- package/dist/core/permissions/network-egress.js +137 -0
- package/dist/core/permissions/state.js +241 -0
- package/dist/core/permissions/tool-class.js +107 -0
- package/dist/core/plan-mode/ui-state.js +51 -0
- package/dist/core/plans/plan-artifact.js +721 -0
- package/dist/core/policy-limits/etag-store.js +122 -0
- package/dist/core/prd-check/parser.js +215 -0
- package/dist/core/prd-check/reporter.js +127 -0
- package/dist/core/prd-check/session-review.js +557 -0
- package/dist/core/prd-check/verifiers.js +223 -0
- package/dist/core/prompt-cache/client-cache.js +99 -0
- package/dist/core/prompts/assembly.js +29 -0
- package/dist/core/prompts/registry.js +364 -0
- package/dist/core/pugi-gitignore.js +52 -0
- package/dist/core/pugi-md/cc-compat-rules.js +735 -0
- package/dist/core/pugi-md/context-injector.js +76 -0
- package/dist/core/pugi-md/walk-up.js +207 -0
- package/dist/core/python/uv-installer.js +270 -0
- package/dist/core/python/uv-resolver.js +83 -0
- package/dist/core/rate-limit/narrator.js +146 -0
- package/dist/core/recipes/cli-types.js +20 -0
- package/dist/core/recipes/loader.js +103 -0
- package/dist/core/recipes/runner.js +345 -0
- package/dist/core/recipes/schema.js +587 -0
- package/dist/core/release-notes/parser.js +241 -0
- package/dist/core/release-notes/state.js +116 -0
- package/dist/core/repl/ask.js +37 -37
- package/dist/core/repl/cancellation.js +26 -26
- package/dist/core/repl/cap-warning.js +4 -4
- package/dist/core/repl/clipboard-read.js +11 -11
- package/dist/core/repl/dispatch-fsm.js +12 -12
- package/dist/core/repl/engine-bridge.js +303 -0
- package/dist/core/repl/history-search.js +15 -15
- package/dist/core/repl/history.js +28 -18
- package/dist/core/repl/kill-ring.js +5 -5
- package/dist/core/repl/model-pricing.js +135 -0
- package/dist/core/repl/privacy-banner.js +22 -22
- package/dist/core/repl/session.js +2690 -229
- package/dist/core/repl/slash-commands.js +540 -41
- package/dist/core/repl/store/index.js +1 -1
- package/dist/core/repl/store/jsonl-log.js +22 -22
- package/dist/core/repl/store/lockfile.js +10 -10
- package/dist/core/repl/store/session-store.js +136 -107
- package/dist/core/repl/store/types.js +15 -15
- package/dist/core/repl/store/uuid-v7.js +12 -12
- package/dist/core/repl/tool-route.js +382 -0
- package/dist/core/repl/workspace-context.js +43 -21
- package/dist/core/repo-map/build.js +125 -0
- package/dist/core/repo-map/cache.js +185 -0
- package/dist/core/repo-map/extractor.js +254 -0
- package/dist/core/repo-map/formatter.js +145 -0
- package/dist/core/repo-map/page-rank.js +105 -0
- package/dist/core/repo-map/scanner.js +211 -0
- package/dist/core/retro/git-collector.js +251 -0
- package/dist/core/retro/health-card.js +25 -0
- package/dist/core/retro/metrics.js +342 -0
- package/dist/core/retro/narrative.js +249 -0
- package/dist/core/retro/plane-collector.js +274 -0
- package/dist/core/retro/pr-issue-link.js +65 -0
- package/dist/core/retro/types.js +16 -0
- package/dist/core/retry-budget/budget.js +284 -0
- package/dist/core/retry-budget/index.js +5 -0
- package/dist/core/retry-budget/retry-cap.js +74 -0
- package/dist/core/routing/lead-worker.js +43 -0
- package/dist/core/routing/pre-flight-estimator.js +108 -0
- package/dist/core/runs/run-tree.js +103 -0
- package/dist/core/sandboxing/adapter.js +29 -0
- package/dist/core/sandboxing/index.js +49 -0
- package/dist/core/sandboxing/none.js +19 -0
- package/dist/core/sandboxing/seatbelt.js +183 -0
- package/dist/core/security/injection-scanner.js +367 -0
- package/dist/core/security/output-filter.js +418 -0
- package/dist/core/session/env-file.js +105 -0
- package/dist/core/session/section-budgets.js +140 -0
- package/dist/core/session.js +119 -0
- package/dist/core/settings.js +378 -5
- package/dist/core/share/formatter.js +271 -0
- package/dist/core/share/redactor.js +221 -0
- package/dist/core/share/uploader.js +267 -0
- package/dist/core/skills/defaults.js +30 -30
- package/dist/core/skills/loader.js +22 -22
- package/dist/core/skills/sources.js +27 -27
- package/dist/core/smoke/headless-driver.js +174 -0
- package/dist/core/smoke/orchestrator.js +194 -0
- package/dist/core/smoke/runner.js +238 -0
- package/dist/core/smoke/scenario-parser.js +316 -0
- package/dist/core/statusline.js +99 -0
- package/dist/core/subagents/dispatcher-real.js +600 -0
- package/dist/core/subagents/dispatcher.js +146 -52
- package/dist/core/subagents/index.js +19 -6
- package/dist/core/subagents/isolation-matrix.js +213 -0
- package/dist/core/subagents/spawn.js +19 -4
- package/dist/core/telemetry/emitter.js +229 -0
- package/dist/core/telemetry/queue.js +251 -0
- package/dist/core/theme/context.js +91 -0
- package/dist/core/theme/presets.js +228 -0
- package/dist/core/theme/state.js +181 -0
- package/dist/core/todos/invariant.js +10 -0
- package/dist/core/todos/state.js +177 -0
- package/dist/core/tool-schema/compressor.js +89 -0
- package/dist/core/transport/version-interceptor.js +166 -0
- package/dist/core/trust.js +2 -2
- package/dist/core/tui/thinking-block.js +64 -0
- package/dist/core/vim/keymap.js +288 -0
- package/dist/core/vim/state.js +92 -0
- package/dist/core/watch-markers/marker-watcher.js +133 -0
- package/dist/core/worktree/include-parser.js +249 -0
- package/dist/core/worktree-manager/cleanup.js +123 -0
- package/dist/core/worktree-manager/manager.js +303 -0
- package/dist/index.js +36 -0
- package/dist/runtime/bootstrap.js +190 -0
- package/dist/runtime/cli.js +4345 -561
- package/dist/runtime/commands/agents.js +31 -31
- package/dist/runtime/commands/budget.js +5 -5
- package/dist/runtime/commands/cancel.js +231 -0
- package/dist/runtime/commands/chain.js +489 -0
- package/dist/runtime/commands/codegraph-status.js +227 -0
- package/dist/runtime/commands/compact.js +297 -0
- package/dist/runtime/commands/config.js +74 -40
- package/dist/runtime/commands/cost.js +199 -0
- package/dist/runtime/commands/delegate.js +27 -4
- package/dist/runtime/commands/dispatch.js +126 -0
- package/dist/runtime/commands/doctor.js +579 -0
- package/dist/runtime/commands/feedback.js +184 -0
- package/dist/runtime/commands/hooks.js +187 -0
- package/dist/runtime/commands/index-cmd.js +353 -0
- package/dist/runtime/commands/init.js +254 -0
- package/dist/runtime/commands/lsp.js +200 -38
- package/dist/runtime/commands/mcp.js +935 -0
- package/dist/runtime/commands/memory.js +582 -0
- package/dist/runtime/commands/model.js +237 -0
- package/dist/runtime/commands/onboarding.js +275 -0
- package/dist/runtime/commands/patch.js +12 -12
- package/dist/runtime/commands/permissions.js +112 -0
- package/dist/runtime/commands/plan.js +143 -0
- package/dist/runtime/commands/prd-check.js +285 -0
- package/dist/runtime/commands/privacy.js +17 -17
- package/dist/runtime/commands/recipe.js +325 -0
- package/dist/runtime/commands/redo-blob-store.js +92 -0
- package/dist/runtime/commands/redo.js +361 -0
- package/dist/runtime/commands/release-notes.js +229 -0
- package/dist/runtime/commands/repo-map.js +95 -0
- package/dist/runtime/commands/report.js +299 -0
- package/dist/runtime/commands/resume.js +118 -0
- package/dist/runtime/commands/review-consensus.js +68 -53
- package/dist/runtime/commands/rewind.js +333 -0
- package/dist/runtime/commands/roster.js +14 -14
- package/dist/runtime/commands/servers.js +236 -0
- package/dist/runtime/commands/sessions.js +163 -0
- package/dist/runtime/commands/share.js +316 -0
- package/dist/runtime/commands/skills.js +31 -31
- package/dist/runtime/commands/status.js +186 -0
- package/dist/runtime/commands/stickers.js +82 -0
- package/dist/runtime/commands/style.js +194 -0
- package/dist/runtime/commands/theme.js +196 -0
- package/dist/runtime/commands/undo.js +54 -22
- package/dist/runtime/commands/update.js +289 -0
- package/dist/runtime/commands/vim.js +140 -0
- package/dist/runtime/commands/worktree.js +8 -8
- package/dist/runtime/commands/worktrees.js +155 -0
- package/dist/runtime/deprecation-warning.js +69 -0
- package/dist/runtime/engine-exit-code.js +50 -0
- package/dist/runtime/headless-repl.js +195 -0
- package/dist/runtime/headless.js +548 -0
- package/dist/runtime/load-hooks-or-exit.js +71 -0
- package/dist/runtime/plan-decompose.js +22 -22
- package/dist/runtime/sigint-guard.js +272 -0
- package/dist/runtime/stream-renderer.js +195 -0
- package/dist/runtime/update-check.js +28 -28
- package/dist/runtime/version.js +65 -0
- package/dist/runtime/worktree-bootstrap.js +579 -0
- package/dist/skills/bundled/batch.js +617 -0
- package/dist/skills/bundled/index.js +45 -0
- package/dist/skills/bundled/loop.js +358 -0
- package/dist/skills/bundled/remember.js +383 -0
- package/dist/skills/bundled/simplify.js +289 -0
- package/dist/skills/bundled/skillify.js +373 -0
- package/dist/skills/bundled/stuck.js +558 -0
- package/dist/skills/bundled/verify.js +439 -0
- package/dist/testing/vcr.js +486 -0
- package/dist/tools/agent-tool.js +229 -0
- package/dist/tools/apply-patch.js +89 -28
- package/dist/tools/ask-user-question.js +337 -0
- package/dist/tools/ask-user.js +115 -0
- package/dist/tools/bash.js +624 -46
- package/dist/tools/brief.js +224 -0
- package/dist/tools/cron.js +433 -0
- package/dist/tools/enter-worktree.js +250 -0
- package/dist/tools/exit-worktree.js +147 -0
- package/dist/tools/file-tools.js +161 -44
- package/dist/tools/http-request.js +336 -0
- package/dist/tools/lsp-tools.js +377 -1
- package/dist/tools/mcp-tool.js +260 -0
- package/dist/tools/multi-edit.js +361 -0
- package/dist/tools/powershell.js +268 -0
- package/dist/tools/registry.js +120 -5
- package/dist/tools/server-tools.js +892 -0
- package/dist/tools/skill-tool.js +96 -0
- package/dist/tools/sleep.js +99 -0
- package/dist/tools/synthetic-output.js +133 -0
- package/dist/tools/tasks.js +208 -0
- package/dist/tools/todo-write.js +184 -0
- package/dist/tools/verify-plan-execution.js +295 -0
- package/dist/tools/web-fetch-injection-scanner.js +207 -0
- package/dist/tools/web-fetch.js +195 -10
- package/dist/tools/web-search.js +458 -0
- package/dist/tui/agent-progress-card.js +111 -0
- package/dist/tui/agent-tree.js +22 -1
- package/dist/tui/ask-modal.js +14 -14
- package/dist/tui/ask-user-question-chips.js +315 -0
- package/dist/tui/ask-user-question-prompt.js +203 -0
- package/dist/tui/compact-banner.js +81 -0
- package/dist/tui/conversation-pane.js +85 -11
- package/dist/tui/cost-table.js +111 -0
- package/dist/tui/device-flow.js +2 -2
- package/dist/tui/doctor-table.js +46 -0
- package/dist/tui/feedback-prompt.js +156 -0
- package/dist/tui/input-box.js +247 -32
- package/dist/tui/login-picker.js +3 -3
- package/dist/tui/markdown-render.js +6 -6
- package/dist/tui/multi-file-diff-approval.js +375 -0
- package/dist/tui/onboarding-wizard.js +240 -0
- package/dist/tui/permissions-picker.js +86 -0
- package/dist/tui/render.js +36 -1
- package/dist/tui/repl-render.js +239 -25
- package/dist/tui/repl-splash-art.js +16 -16
- package/dist/tui/repl-splash-mascot.js +48 -24
- package/dist/tui/repl-splash.js +22 -22
- package/dist/tui/repl.js +125 -45
- package/dist/tui/slash-palette.js +6 -6
- package/dist/tui/splash.js +2 -2
- package/dist/tui/status-bar.js +109 -31
- package/dist/tui/status-table.js +7 -0
- package/dist/tui/stickers-art.js +136 -0
- package/dist/tui/style-table.js +28 -0
- package/dist/tui/theme-table.js +29 -0
- package/dist/tui/thinking-spinner.js +123 -0
- package/dist/tui/tool-stream-pane.js +53 -4
- package/dist/tui/update-banner.js +27 -2
- package/dist/tui/vim-input.js +267 -0
- package/dist/tui/welcome-banner.js +107 -0
- package/dist/tui/welcome-data.js +293 -0
- package/dist/tui/workspace-context.js +2 -2
- package/package.json +21 -5
- package/test/scenarios/codegen-create-file.scenario.txt +13 -0
- package/test/scenarios/compact-force.scenario.txt +12 -0
- package/test/scenarios/identity.scenario.txt +11 -0
- package/test/scenarios/persona-handoff.scenario.txt +12 -0
- package/test/scenarios/walkback.scenario.txt +12 -0
- package/dist/core/engine/compaction-hook.js +0 -154
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `@pugi/cli` are documented here. The file follows the
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) convention with newer
|
|
5
|
+
releases listed first. Section format: `## [<version>] - <YYYY-MM-DD>`.
|
|
6
|
+
|
|
7
|
+
The bundled `pugi release-notes` command parses this file and renders sections
|
|
8
|
+
strictly newer than `~/.pugi/.last-seen-version` after every upgrade.
|
|
9
|
+
|
|
10
|
+
## [0.1.0-beta.88] - 2026-06-02
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **Pugi identity intro no longer chants on later turns**. The output gate now
|
|
14
|
+
strips the canonical long-form intro ("I'm Pugi - your engineering copilot.
|
|
15
|
+
Tell me what you need...") and its Russian variant on mid-thread replies.
|
|
16
|
+
Operators were seeing the intro re-emit on turn 2+ after a session-resume
|
|
17
|
+
or autonomous tick.
|
|
18
|
+
- **Ctrl+C double-press exit guard**. A single Ctrl+C in the REPL no longer
|
|
19
|
+
kills the CLI. First press prompts "Press Ctrl+C again to exit (within 2s)
|
|
20
|
+
or any key to continue". Second press within 2s exits cleanly; any other
|
|
21
|
+
key cancels. Headless mode emits a `session-end` envelope and exits 0.
|
|
22
|
+
- **Persona no longer over-clarifies trivial creative tasks**. Asking for a
|
|
23
|
+
well-known game / demo / todo app now picks reasonable defaults and starts
|
|
24
|
+
building in one turn. Ambiguous tasks (auth, deploy targets) still ask
|
|
25
|
+
≤ 3 short choices via the `ask_user_question` tool.
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
- **Short-format AskUserQuestion chip renderer**. Up to 3 questions render
|
|
29
|
+
side-by-side as Ink chips with ▸ default highlight, ↑↓ in-question nav,
|
|
30
|
+
←→/Tab between questions, 1-9 jump, [s] skip-with-default, [Esc] cancel,
|
|
31
|
+
[Enter] commit. Labels truncate at 5 words / 22 chars. Caller can opt
|
|
32
|
+
into a non-TTY numbered fallback via `forceFallback`.
|
|
33
|
+
|
|
34
|
+
### Security
|
|
35
|
+
- **npm publish leak-gate hardening**. `prepublishOnly` now runs a
|
|
36
|
+
banned-string scan against the staged tarball (`tools/scrub/scan-tarball.sh`)
|
|
37
|
+
covering personal names, competitor refs, internal codenames, engineering
|
|
38
|
+
provenance, absolute paths, brand legacy, and secret-token shapes.
|
|
39
|
+
Per-line `[pugi-leak-ok]` allowlist marker for legitimate references;
|
|
40
|
+
path allowlist for LICENSE / THIRD_PARTY_NOTICES files where MIT requires
|
|
41
|
+
copyright-holder name. Synthetic injection regression test runs in CI.
|
|
42
|
+
|
|
43
|
+
### Chore
|
|
44
|
+
- MIT LICENSE copyright holder set to `Pugi.io` (was personal name).
|
|
45
|
+
|
|
46
|
+
## [0.1.0-beta.26] - 2026-05-27
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
- RAG consumer middleware on admin-api () — XML `<rag-context>`
|
|
50
|
+
block, persona allowlist (Pugi / Hiroshi / Vera), 2000-token cap,
|
|
51
|
+
and the Pugi observability stack () shipped earlier today.
|
|
52
|
+
|
|
53
|
+
### Notes
|
|
54
|
+
- CLI surface unchanged in this bump — the version bump tracks lockstep with
|
|
55
|
+
the admin-api redeploy so `--version` reflects the live server's
|
|
56
|
+
feature set during the alpha-7 sprint.
|
|
57
|
+
|
|
58
|
+
## [0.1.0-beta.23] - 2026-05-27
|
|
59
|
+
|
|
60
|
+
### Added
|
|
61
|
+
- L30 `pugi theme` + `/theme` — TUI color presets (default / dark / light / colorblind) ().
|
|
62
|
+
- L24 `pugi release-notes` + `/release-notes` — changelog diff after upgrade
|
|
63
|
+
with `~/.pugi/.last-seen-version` tracking and `--reset` flag ().
|
|
64
|
+
|
|
65
|
+
### Fixed
|
|
66
|
+
- vim-input — useRef for shadow cursor + pending, lift `onSubmit` out of `setState` ().
|
|
67
|
+
|
|
68
|
+
## [0.1.0-beta.22] - 2026-05-27
|
|
69
|
+
|
|
70
|
+
### Added
|
|
71
|
+
- L24 `pugi release-notes` + `/release-notes` — changelog diff after upgrade
|
|
72
|
+
with `~/.pugi/.last-seen-version` tracking and `--reset` flag.
|
|
73
|
+
- L25 `/onboarding` first-run interactive setup wizard ().
|
|
74
|
+
- L18 output-style presets — voice register dial ().
|
|
75
|
+
- L33 `/stickers` brand-personality gimmick ().
|
|
76
|
+
- L16 `TodoWriteTool` single-in-progress invariant ().
|
|
77
|
+
- L22 `--bare` flag — skip project auto-discovery ().
|
|
78
|
+
- L21 `/feedback` in-CLI collector.
|
|
79
|
+
- L20 `/share` session transcript export.
|
|
80
|
+
|
|
81
|
+
### Fixed
|
|
82
|
+
- P1 stickers await + style buffered output + todo-write zod parse ().
|
|
83
|
+
|
|
84
|
+
## [0.1.0-beta.21] - 2026-05-27
|
|
85
|
+
|
|
86
|
+
### Added
|
|
87
|
+
- L7 `/plan` quick mode-switch + one-shot dispatch ().
|
|
88
|
+
- L31 tool retry budget per command ().
|
|
89
|
+
- L19 `/cost` + `/usage` token + dollar accounting ().
|
|
90
|
+
- L34 `pugi status` — session snapshot ().
|
|
91
|
+
- L11 `DenialTrackingState` model-facing denial aggregate ().
|
|
92
|
+
- L6 permission modes — canonical 4-mode gate ().
|
|
93
|
+
- L8 `/compact` command + auto-trigger + boundary marker ().
|
|
94
|
+
- L17 `pugi doctor` — environment health report ().
|
|
95
|
+
- L13 `/mcp remove` + `doctor` + `logs` + `restart` subcommands ().
|
|
96
|
+
- L3 internal underscore-prefix tool-arg convention ().
|
|
97
|
+
- L2 `z.strictObject` all tool schemas + revert beta.17 aliases ().
|
|
98
|
+
- L5 `AskUserQuestionTool` structured multi-choice — kills fake-dispatch ().
|
|
99
|
+
- L1 stale-read gate — reject `FileEdit` if file changed since last read ().
|
|
100
|
+
|
|
101
|
+
### Fixed
|
|
102
|
+
- Pugi-review per-file chunking — unblock multi-file diffs (Anvil HTTP 400) ().
|
|
103
|
+
- Privacy `PiiScrubberService` regex fallback + `@Inject` DI fix ().
|
|
104
|
+
|
|
105
|
+
## [0.1.0-beta.20] - 2026-05-26
|
|
106
|
+
|
|
107
|
+
### Added
|
|
108
|
+
- Pugi codegen real dispatch — Pugi actually writes files instead of describing
|
|
109
|
+
them ().
|
|
110
|
+
- Live agent progress display — `pugi jobs --watch` (CC compact style) ().
|
|
111
|
+
- PAVF-7 `pugi report --from-error` — field bug capture ().
|
|
112
|
+
- Opensource template fetch + bundled starters — не reinventing ().
|
|
113
|
+
|
|
114
|
+
### Fixed
|
|
115
|
+
- Dialog quality — RU mirror + brevity + memory + force dispatch + render ().
|
|
116
|
+
- Pugi anti-greenfield + anti-emoji discipline rules ().
|
|
117
|
+
- Persona output gate — Pugi strip + fake-dispatch detector (P0) ().
|
|
118
|
+
|
|
119
|
+
## [0.1.0-beta.19] - 2026-05-26
|
|
120
|
+
|
|
121
|
+
### Added
|
|
122
|
+
- Pugi-review batch review followups — silent PASS + safeGit split + quota
|
|
123
|
+
migration + cleanup dead code ().
|
|
124
|
+
|
|
125
|
+
### Fixed
|
|
126
|
+
- Replace CJS `require()` в ESM bundle — bare REPL crash on beta.16 ().
|
|
127
|
+
|
|
128
|
+
## [0.1.0-beta.18] - 2026-05-26
|
|
129
|
+
|
|
130
|
+
### Added
|
|
131
|
+
- Initial public beta of `@pugi/cli` with REPL, dispatch, sync, review, and
|
|
132
|
+
doctor surfaces. Establishes the baseline for the leak-parity sprint.
|
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,23 +1,65 @@
|
|
|
1
1
|
# Pugi CLI
|
|
2
2
|
|
|
3
3
|
`pugi` — terminal-native software execution system. Run agents on your repo,
|
|
4
|
-
hand jobs off to the
|
|
5
|
-
by default.
|
|
4
|
+
hand jobs off to the Pugi Console or a remote runner, and keep every artifact
|
|
5
|
+
local by default.
|
|
6
|
+
|
|
7
|
+
Current published version: **`@pugi/cli@0.1.0-beta.99`** (2026-06-05).
|
|
6
8
|
|
|
7
9
|
- **Local-first.** Every plan, diff, and artifact lives under `.pugi/` in your
|
|
8
10
|
repo. Nothing leaves the machine unless you explicitly run `pugi handoff` or
|
|
9
11
|
`pugi sync`.
|
|
12
|
+
- **REPL-default.** Type `pugi` with no arguments and you drop into an
|
|
13
|
+
engine-backed chat REPL that can write files, start dev servers, probe
|
|
14
|
+
health, and run tests against real evidence (beta.96+).
|
|
10
15
|
- **Web continuation.** When a job needs collaboration, an approval, or a clean
|
|
11
|
-
Linux runner, hand it off to the
|
|
16
|
+
Linux runner, hand it off to the Console at `app.pugi.io`.
|
|
12
17
|
- **One CLI, three install paths.** npm, Homebrew tap, and a one-liner shell
|
|
13
18
|
script.
|
|
14
19
|
|
|
20
|
+
## Recent shipped (beta.94 → beta.99)
|
|
21
|
+
|
|
22
|
+
- **REPL as first-class engine path** (beta.96, PR A). REPL chat goes through
|
|
23
|
+
the Pugi engine loop, advertises tools, writes files on disk.
|
|
24
|
+
- **Phase 1 runtime primitives** (beta.97, ): `server_start`,
|
|
25
|
+
`server_stop`, `server_health`, `server_logs`, `http_request` available in
|
|
26
|
+
the tool surface so the agent can prove a server is up (pid + health 200)
|
|
27
|
+
rather than narrating it.
|
|
28
|
+
- **Conversation-aware artifact intent** (beta.97, ). Multi-turn
|
|
29
|
+
confirmation triggers auto-dispatch; the agent stops asking "should I?" mid
|
|
30
|
+
build.
|
|
31
|
+
- **Multi-turn context threading** (beta.98, PR C). REPL `dispatchBrief`
|
|
32
|
+
threads recent turns to the engine bridge; engine budget bumped к 400K.
|
|
33
|
+
- **Budget cap removed** (beta.99). 120K cap retired in favour of the
|
|
34
|
+
Claude/Codex/Aider auto-compact pattern. Effective ceiling is now 5M tokens
|
|
35
|
+
on the long-context lane.
|
|
36
|
+
- **Verification gate** (beta.94, ). Failing `npm test` propagates
|
|
37
|
+
`exit != 0` and forces `status != done`. No more "fake green" completions.
|
|
38
|
+
|
|
39
|
+
## Coming next (open PRs, awaiting merge as of 2026-06-05)
|
|
40
|
+
|
|
41
|
+
- **LLM-summary auto-compact** (PR E #916). REPL session history is summarized
|
|
42
|
+
via Gemini Flash on the Anvil gateway before re-entering the context window,
|
|
43
|
+
so long sessions stay coherent instead of getting truncated.
|
|
44
|
+
- **Obsidian-style notes** (PR F #918). Every session writes to
|
|
45
|
+
`.pugi/notes/<session-id>.md`, per-file notes to `.pugi/notes/files/<path>.md`,
|
|
46
|
+
and a daily journal entry to `.pugi/journal/YYYY-MM-DD.md`. Backed by
|
|
47
|
+
Obsidian-compatible wiki-link syntax.
|
|
48
|
+
- **`/servers` slash command** (PR H #919). List and kill dev servers spawned
|
|
49
|
+
via `server_start` from the REPL. `/servers` prints the running set,
|
|
50
|
+
`/servers stop <jobId>` terminates one.
|
|
51
|
+
- **USD + English defaults for generated apps** (PR I #920). When you brief the
|
|
52
|
+
agent in Russian or any other locale, generated UIs default к **English text
|
|
53
|
+
+ USD prices** unless you explicitly say "target market is X" in the brief.
|
|
54
|
+
Eliminates the "₽ rubles in a UI for US customers" regression. Pair with the
|
|
55
|
+
`/servers stop` hint в the `code` / `build` / `fix` prompts.
|
|
56
|
+
|
|
15
57
|
## Install
|
|
16
58
|
|
|
17
59
|
### npm (works everywhere with Node 20+)
|
|
18
60
|
|
|
19
61
|
```bash
|
|
20
|
-
npm install -g pugi
|
|
62
|
+
npm install -g @pugi/cli
|
|
21
63
|
pugi --version
|
|
22
64
|
```
|
|
23
65
|
|
|
@@ -29,7 +71,7 @@ pugi --version
|
|
|
29
71
|
```
|
|
30
72
|
|
|
31
73
|
The formula declares a Node 20+ runtime dependency and downloads the published
|
|
32
|
-
npm tarball, so the result is identical to `npm install -g pugi`.
|
|
74
|
+
npm tarball, so the result is identical to `npm install -g @pugi/cli`.
|
|
33
75
|
|
|
34
76
|
### One-liner (curl)
|
|
35
77
|
|
|
@@ -38,8 +80,8 @@ curl -fsSL https://pugi.dev/install | sh
|
|
|
38
80
|
```
|
|
39
81
|
|
|
40
82
|
The script detects your OS (Darwin / Linux), bootstraps Node 20+ via Homebrew
|
|
41
|
-
or `apt` if it is missing, and then runs `npm install -g pugi`. It prints
|
|
42
|
-
installed version on success and exits non-zero on any failure. The script
|
|
83
|
+
or `apt` if it is missing, and then runs `npm install -g @pugi/cli`. It prints
|
|
84
|
+
the installed version on success and exits non-zero on any failure. The script
|
|
43
85
|
itself is served from `pugi.dev`; review it at `https://pugi.dev/install` or
|
|
44
86
|
in `apps/admin-api/public/install.sh` before piping into a shell.
|
|
45
87
|
|
|
@@ -143,15 +185,15 @@ returns `status: blocked, reason: sync_upload_not_implemented`).
|
|
|
143
185
|
## Updating
|
|
144
186
|
|
|
145
187
|
```bash
|
|
146
|
-
npm install -g pugi@latest
|
|
147
|
-
brew upgrade pugi
|
|
148
|
-
curl -fsSL https://pugi.dev/install | sh
|
|
188
|
+
npm install -g @pugi/cli@latest # if you installed via npm
|
|
189
|
+
brew upgrade pugi # if you installed via Homebrew
|
|
190
|
+
curl -fsSL https://pugi.dev/install | sh # one-liner re-run is idempotent
|
|
149
191
|
```
|
|
150
192
|
|
|
151
193
|
## Uninstall
|
|
152
194
|
|
|
153
195
|
```bash
|
|
154
|
-
npm uninstall -g pugi
|
|
196
|
+
npm uninstall -g @pugi/cli
|
|
155
197
|
# or
|
|
156
198
|
brew uninstall pugi
|
|
157
199
|
```
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
[?25l[0m [0m
|
|
2
|
+
[0m
|
|
3
|
+
[38;2;54;62;72;48;2;59;67;77m▄[38;2;54;61;72;48;2;38;46;57m▄[38;2;89;96;107;48;2;69;76;87m▄[38;2;69;75;86;48;2;83;89;100m▄[38;2;69;76;86;48;2;40;68;89m▄[38;2;23;62;86;48;2;3;44;71m▄[38;2;3;42;67;48;2;34;44;56m▄[38;2;54;62;72;48;2;59;66;76m▄[0m [0m
|
|
4
|
+
[38;2;73;80;90;48;2;64;78;92m▄[38;2;39;62;81;48;2;28;60;82m▄[38;2;57;63;74;48;2;61;68;78m▄[38;2;58;64;75;48;2;60;67;77m▄[38;2;34;66;90;48;2;9;53;81m▄[38;2;3;75;116;48;2;2;66;101m▄[0m [0m
|
|
5
|
+
[7m[38;2;44;49;57m▄[0m[38;2;27;33;41;48;2;51;59;70m▄[38;2;48;60;76m▄[38;2;33;65;94;48;2;49;59;73m▄[38;2;3;49;77;48;2;24;80;118m▄[38;2;1;48;78;48;2;3;107;171m▄[0m [0m
|
|
6
|
+
[38;2;2;7;14m▄[38;2;2;7;13m▄[0m [0m
|
|
7
|
+
[7m[38;2;2;6;13m▄[0m [0m
|
|
8
|
+
[0m
|
|
9
|
+
[?25h
|
package/bin/run.js
CHANGED
|
@@ -1,2 +1,34 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
// 2026-05-27 — silence the noisy `node:sqlite` ExperimentalWarning.
|
|
3
|
+
// Node 22.x prints a multi-line warning the first time any consumer
|
|
4
|
+
// imports `node:sqlite` (see core/repl/store/session-store.ts). CEO has
|
|
5
|
+
// pinged this surface twice now ("(node:XXXXX) ExperimentalWarning:
|
|
6
|
+
// SQLite is an experimental feature and might change at any time" +
|
|
7
|
+
// trace-warnings hint). Hiding it cleanly requires a tap on
|
|
8
|
+
// process.emitWarning BEFORE any module loads the sqlite binding —
|
|
9
|
+
// hence wiring it here in the binary entry, not deep inside the CLI.
|
|
10
|
+
//
|
|
11
|
+
// We allowlist only the exact sqlite warning + leave every other
|
|
12
|
+
// runtime warning (deprecation, security, custom code paths) intact.
|
|
13
|
+
// Operator can still re-enable the noise by exporting
|
|
14
|
+
// PUGI_SHOW_EXPERIMENTAL_WARNINGS=1 — useful when debugging a node
|
|
15
|
+
// version bump that might surface a new experimental flag we should
|
|
16
|
+
// notice.
|
|
17
|
+
if (!process.env.PUGI_SHOW_EXPERIMENTAL_WARNINGS) {
|
|
18
|
+
const originalEmit = process.emit;
|
|
19
|
+
process.emit = function patchedEmit(name, ...args) {
|
|
20
|
+
if (name === 'warning') {
|
|
21
|
+
const w = args[0];
|
|
22
|
+
const isSqliteExperimental =
|
|
23
|
+
w &&
|
|
24
|
+
typeof w === 'object' &&
|
|
25
|
+
w.name === 'ExperimentalWarning' &&
|
|
26
|
+
typeof w.message === 'string' &&
|
|
27
|
+
/SQLite is an experimental feature/i.test(w.message);
|
|
28
|
+
if (isSqliteExperimental) return false;
|
|
29
|
+
}
|
|
30
|
+
return originalEmit.call(this, name, ...args);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
import('../dist/index.js');
|
package/dist/commands/deploy.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `pugi deploy` command surface —
|
|
2
|
+
* `pugi deploy` command surface — P2 (Task #34).
|
|
3
3
|
*
|
|
4
4
|
* Subcommands:
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
9
|
*
|
|
10
10
|
* Exit codes (per task spec):
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
14
|
*
|
|
15
15
|
* Project resolution:
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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
20
|
*
|
|
21
|
-
* Local-first invariant
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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
25
|
*/
|
|
26
26
|
import { fetchDeployStatus, fetchDeployLogs, submitDeployTrigger, } from '@pugi/sdk';
|
|
27
27
|
/**
|
|
@@ -143,26 +143,26 @@ export function parseDeployArgs(args) {
|
|
|
143
143
|
export function usage() {
|
|
144
144
|
return [
|
|
145
145
|
'Usage:',
|
|
146
|
-
'
|
|
147
|
-
'
|
|
148
|
-
'
|
|
149
|
-
'
|
|
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
150
|
'',
|
|
151
151
|
'Flags:',
|
|
152
|
-
'
|
|
153
|
-
'
|
|
154
|
-
'
|
|
155
|
-
'
|
|
156
|
-
'
|
|
157
|
-
'
|
|
158
|
-
'
|
|
159
|
-
'
|
|
160
|
-
'
|
|
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
161
|
'',
|
|
162
162
|
'Exit codes:',
|
|
163
|
-
'
|
|
164
|
-
'
|
|
165
|
-
'
|
|
163
|
+
' 0 success',
|
|
164
|
+
' 1 deployment failed / refused',
|
|
165
|
+
' 2 transient (rate-limited, runtime down, retry-safe)',
|
|
166
166
|
].join('\n');
|
|
167
167
|
}
|
|
168
168
|
/**
|
|
@@ -418,16 +418,16 @@ function statusToExitCode(status) {
|
|
|
418
418
|
function renderStatusTable(response, context) {
|
|
419
419
|
const lines = [];
|
|
420
420
|
lines.push(context === 'queued' ? 'Deployment queued.' : 'Deployment status:');
|
|
421
|
-
lines.push(`
|
|
422
|
-
lines.push(`
|
|
423
|
-
lines.push(`
|
|
424
|
-
lines.push(`
|
|
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
425
|
if (response.url)
|
|
426
|
-
lines.push(`
|
|
426
|
+
lines.push(` url: ${response.url}`);
|
|
427
427
|
if (response.providerDeploymentId)
|
|
428
|
-
lines.push(`
|
|
429
|
-
lines.push(`
|
|
430
|
-
lines.push(`
|
|
428
|
+
lines.push(` providerDeploymentId: ${response.providerDeploymentId}`);
|
|
429
|
+
lines.push(` createdAt: ${response.createdAt}`);
|
|
430
|
+
lines.push(` updatedAt: ${response.updatedAt}`);
|
|
431
431
|
if (response.error) {
|
|
432
432
|
lines.push('');
|
|
433
433
|
lines.push('--- build error tail ---');
|
|
@@ -0,0 +1,191 @@
|
|
|
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
|