@pugi/cli 0.1.0-beta.9 → 0.1.0-beta.90
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/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/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/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/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 +40 -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 +179 -0
- package/dist/core/engine/budgets.js +186 -0
- package/dist/core/engine/context-prefix.js +155 -0
- package/dist/core/engine/index.js +1 -1
- package/dist/core/engine/intensity.js +158 -0
- package/dist/core/engine/intent.js +260 -0
- package/dist/core/engine/native-pugi.js +1295 -227
- package/dist/core/engine/prompts.js +129 -19
- package/dist/core/engine/strip-internal-fields.js +124 -0
- package/dist/core/engine/tool-bridge.js +1731 -59
- 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-tools.js +662 -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/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 +93 -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-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/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 +2148 -217
- package/dist/core/repl/slash-commands.js +501 -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/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/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/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 +92 -0
- package/dist/core/settings.js +324 -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 +132 -43
- 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 +4185 -549
- 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 +73 -39
- 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/init.js +254 -0
- package/dist/runtime/commands/lsp.js +200 -38
- package/dist/runtime/commands/mcp.js +879 -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/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/headless-repl.js +195 -0
- package/dist/runtime/headless.js +543 -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/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/enter-worktree.js +250 -0
- package/dist/tools/exit-worktree.js +147 -0
- package/dist/tools/file-tools.js +161 -44
- 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 +86 -4
- 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 +11 -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/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 +176 -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 +31 -16
- 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 +12 -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
|
@@ -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
|