@pugi/cli 0.1.0-beta.99 → 1.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +11 -191
- package/bin/pugi +8 -0
- package/package.json +15 -71
- package/postinstall.mjs +31 -0
- package/CHANGELOG.md +0 -132
- package/THIRD_PARTY_NOTICES.md +0 -40
- package/assets/pugi-mascot.ansi +0 -16
- package/assets/pugi-prozr2-mascot.ansi +0 -9
- package/bin/run.js +0 -34
- package/dist/commands/deploy.js +0 -439
- package/dist/commands/flatten.js +0 -191
- package/dist/commands/jobs-watch.js +0 -201
- package/dist/commands/jobs.js +0 -260
- package/dist/commands/retro.js +0 -210
- package/dist/commands/smoke.js +0 -133
- package/dist/core/agent-progress/cleanup.js +0 -134
- package/dist/core/agent-progress/schema.js +0 -144
- package/dist/core/agent-progress/writer.js +0 -101
- package/dist/core/agents/adaptive-router.js +0 -330
- package/dist/core/agents/loader.js +0 -104
- package/dist/core/agents/query-decomposer.js +0 -297
- package/dist/core/agents/registry.js +0 -69
- package/dist/core/approvals/shortcut-resolver.js +0 -98
- package/dist/core/artifact-chain/dispatcher.js +0 -148
- package/dist/core/artifact-chain/exporter.js +0 -164
- package/dist/core/artifact-chain/state.js +0 -243
- package/dist/core/artifact-chain/steps.js +0 -169
- package/dist/core/ask-user/question.js +0 -92
- package/dist/core/audit/audit-trail.js +0 -275
- package/dist/core/auth/ensure-authenticated.js +0 -129
- package/dist/core/auth/env-provider.js +0 -238
- package/dist/core/auto-open-browser.js +0 -128
- package/dist/core/auto-update/channels.js +0 -122
- package/dist/core/auto-update/checker.js +0 -241
- package/dist/core/auto-update/state.js +0 -235
- package/dist/core/bare-mode/index.js +0 -107
- package/dist/core/bash/redirect.js +0 -281
- package/dist/core/bash-classifier.js +0 -1397
- package/dist/core/checkpoint/resumer.js +0 -149
- package/dist/core/checkpoint/rewinder.js +0 -291
- package/dist/core/checkpoints/shadow-git.js +0 -670
- package/dist/core/citations/parser.js +0 -109
- package/dist/core/classifier/yolo-classifier.js +0 -88
- package/dist/core/clipboard.js +0 -70
- package/dist/core/codegraph/decision-store.js +0 -248
- package/dist/core/codegraph/detect-repo.js +0 -459
- package/dist/core/codegraph/install.js +0 -134
- package/dist/core/codegraph/offer-hook.js +0 -220
- package/dist/core/compact/auto-trigger.js +0 -96
- package/dist/core/compact/buffer-rewriter.js +0 -115
- package/dist/core/compact/summarizer.js +0 -208
- package/dist/core/compact/token-counter.js +0 -108
- package/dist/core/consensus/anvil-fanout.js +0 -276
- package/dist/core/consensus/diff-capture.js +0 -491
- package/dist/core/consensus/rubric.js +0 -233
- package/dist/core/context/builder.js +0 -114
- package/dist/core/context/compaction-events.js +0 -99
- package/dist/core/context/compaction.js +0 -602
- package/dist/core/context/index.js +0 -28
- package/dist/core/context/invariants.js +0 -250
- package/dist/core/context/markdown-loader.js +0 -288
- package/dist/core/context/markdown-traverse.js +0 -255
- package/dist/core/context/pugiignore.js +0 -316
- package/dist/core/context/repo-skeleton.js +0 -533
- package/dist/core/context/tool-eviction.js +0 -55
- package/dist/core/context/watcher.js +0 -342
- package/dist/core/context/working-set.js +0 -165
- package/dist/core/coordinator/agent-tools.js +0 -77
- package/dist/core/coordinator/agent-toolset.js +0 -65
- package/dist/core/coordinator/fsm.js +0 -73
- package/dist/core/coordinator/mode-fsm.js +0 -70
- package/dist/core/cost/rate-card.js +0 -129
- package/dist/core/cost/tracker.js +0 -221
- package/dist/core/credentials.js +0 -355
- package/dist/core/cron/scheduler.js +0 -138
- package/dist/core/denial-tracking/index.js +0 -8
- package/dist/core/denial-tracking/state.js +0 -264
- package/dist/core/diagnostics/probe-runner.js +0 -93
- package/dist/core/diagnostics/probes/api.js +0 -46
- package/dist/core/diagnostics/probes/auth.js +0 -93
- package/dist/core/diagnostics/probes/bare-mode.js +0 -42
- package/dist/core/diagnostics/probes/cli-version.js +0 -127
- package/dist/core/diagnostics/probes/config.js +0 -72
- package/dist/core/diagnostics/probes/denial-tracking.js +0 -57
- package/dist/core/diagnostics/probes/disk.js +0 -81
- package/dist/core/diagnostics/probes/engine-live.js +0 -46
- package/dist/core/diagnostics/probes/git.js +0 -65
- package/dist/core/diagnostics/probes/hooks.js +0 -118
- package/dist/core/diagnostics/probes/mcp.js +0 -75
- package/dist/core/diagnostics/probes/node.js +0 -59
- package/dist/core/diagnostics/probes/pnpm.js +0 -36
- package/dist/core/diagnostics/probes/pugi-md.js +0 -89
- package/dist/core/diagnostics/probes/sandbox.js +0 -72
- package/dist/core/diagnostics/probes/session.js +0 -74
- package/dist/core/diagnostics/probes/status-snapshot.js +0 -488
- package/dist/core/diagnostics/probes/workspace.js +0 -63
- package/dist/core/diagnostics/types.js +0 -70
- package/dist/core/dispatch/cache-cleanup.js +0 -197
- package/dist/core/dispatch/cache-handoff.js +0 -295
- package/dist/core/edits/apply-patch-layer-e.js +0 -189
- package/dist/core/edits/dispatch.js +0 -511
- package/dist/core/edits/format-detector.js +0 -260
- package/dist/core/edits/format-matrix.js +0 -26
- package/dist/core/edits/fuzzy-ladder.js +0 -650
- package/dist/core/edits/index.js +0 -19
- package/dist/core/edits/journal.js +0 -199
- package/dist/core/edits/layer-a-apply.js +0 -217
- package/dist/core/edits/layer-a-fuzzy-apply.js +0 -198
- package/dist/core/edits/layer-b-apply.js +0 -211
- package/dist/core/edits/layer-c-apply.js +0 -160
- package/dist/core/edits/layer-d-ast.js +0 -572
- package/dist/core/edits/marker-parser.js +0 -401
- package/dist/core/edits/security-gate.js +0 -223
- package/dist/core/edits/verify-hook.js +0 -273
- package/dist/core/edits/worktree.js +0 -322
- package/dist/core/engine/adapter-runner.js +0 -8
- package/dist/core/engine/anvil-client.js +0 -344
- package/dist/core/engine/auto-compact.js +0 -179
- package/dist/core/engine/budgets.js +0 -195
- package/dist/core/engine/context-prefix.js +0 -155
- package/dist/core/engine/index.js +0 -12
- package/dist/core/engine/intensity.js +0 -163
- package/dist/core/engine/intent.js +0 -260
- package/dist/core/engine/native-pugi.js +0 -1616
- package/dist/core/engine/noop.js +0 -27
- package/dist/core/engine/prompts.js +0 -236
- package/dist/core/engine/strip-internal-fields.js +0 -124
- package/dist/core/engine/tool-bridge.js +0 -2173
- package/dist/core/engine/verification-patterns.js +0 -195
- package/dist/core/evaluation/golden-dataset.js +0 -293
- package/dist/core/feedback/queue.js +0 -177
- package/dist/core/feedback/submitter.js +0 -145
- package/dist/core/file-cache.js +0 -141
- package/dist/core/flatten/flatten-repo.js +0 -439
- package/dist/core/format/osc8-link.js +0 -28
- package/dist/core/hook-chains.js +0 -392
- package/dist/core/hooks/citation-verify-hook.js +0 -138
- package/dist/core/hooks/citation-verify.js +0 -112
- package/dist/core/hooks/events.js +0 -46
- package/dist/core/hooks/index.js +0 -15
- package/dist/core/hooks/registry.js +0 -216
- package/dist/core/hooks/runner.js +0 -236
- package/dist/core/hooks/v2/event-emitter.js +0 -115
- package/dist/core/hooks/v2/executor.js +0 -282
- package/dist/core/hooks/v2/index.js +0 -25
- package/dist/core/hooks/v2/lifecycle.js +0 -104
- package/dist/core/hooks/v2/loader.js +0 -216
- package/dist/core/hooks/v2/matcher.js +0 -125
- package/dist/core/hooks/v2/trust.js +0 -143
- package/dist/core/hooks/v2/types.js +0 -86
- package/dist/core/hooks/worktree-events.js +0 -158
- package/dist/core/hooks.js +0 -415
- package/dist/core/image/renderer.js +0 -71
- package/dist/core/index-store.js +0 -260
- package/dist/core/init/detector.js +0 -582
- package/dist/core/init/template-renderer.js +0 -242
- package/dist/core/jobs/registry.js +0 -462
- package/dist/core/ledger/results-tsv.js +0 -142
- package/dist/core/log-discipline/stdout-redirect.js +0 -51
- package/dist/core/lsp/cache.js +0 -105
- package/dist/core/lsp/client.js +0 -1229
- package/dist/core/lsp/language-detect.js +0 -66
- package/dist/core/lsp/post-edit-diagnostics.js +0 -171
- package/dist/core/lsp/server-detect.js +0 -173
- package/dist/core/lsp/symbol-cache.js +0 -162
- package/dist/core/lsp/symbol-tools.js +0 -664
- package/dist/core/mcp/client.js +0 -385
- package/dist/core/mcp/http-server.js +0 -553
- package/dist/core/mcp/orchestrator-config.js +0 -192
- package/dist/core/mcp/orchestrator-tools.js +0 -806
- package/dist/core/mcp/permission.js +0 -190
- package/dist/core/mcp/registry.js +0 -193
- package/dist/core/mcp/server-tools.js +0 -219
- package/dist/core/mcp/server.js +0 -397
- package/dist/core/mcp/trust.js +0 -91
- package/dist/core/memory/dual-write.js +0 -416
- package/dist/core/memory/passive-extract.js +0 -130
- package/dist/core/memory/phase1-kinds.js +0 -20
- package/dist/core/memory/secret-scanner.js +0 -304
- package/dist/core/memory-sync/queue.js +0 -170
- package/dist/core/metrics/extract.js +0 -113
- package/dist/core/modes/roo-modes.js +0 -68
- package/dist/core/onboarding/ensure-initialized.js +0 -133
- package/dist/core/onboarding/marker.js +0 -111
- package/dist/core/onboarding/telemetry-state.js +0 -108
- package/dist/core/output-style/presets.js +0 -176
- package/dist/core/output-style/state.js +0 -185
- package/dist/core/path-security.js +0 -345
- package/dist/core/permission.js +0 -369
- package/dist/core/permissions/auto-classifier.js +0 -124
- package/dist/core/permissions/bash-parser.js +0 -371
- package/dist/core/permissions/circuit-breaker.js +0 -83
- package/dist/core/permissions/constrained-edit.js +0 -91
- package/dist/core/permissions/gate.js +0 -278
- package/dist/core/permissions/index.js +0 -20
- package/dist/core/permissions/mode.js +0 -174
- package/dist/core/permissions/network-egress.js +0 -137
- package/dist/core/permissions/state.js +0 -241
- package/dist/core/permissions/tool-class.js +0 -107
- package/dist/core/plan-mode/ui-state.js +0 -51
- package/dist/core/plans/plan-artifact.js +0 -721
- package/dist/core/policy-limits/etag-store.js +0 -122
- package/dist/core/prd-check/parser.js +0 -215
- package/dist/core/prd-check/reporter.js +0 -127
- package/dist/core/prd-check/session-review.js +0 -557
- package/dist/core/prd-check/verifiers.js +0 -223
- package/dist/core/prompt-cache/client-cache.js +0 -99
- package/dist/core/prompts/assembly.js +0 -29
- package/dist/core/prompts/registry.js +0 -364
- package/dist/core/pugi-gitignore.js +0 -52
- package/dist/core/pugi-md/cc-compat-rules.js +0 -735
- package/dist/core/pugi-md/context-injector.js +0 -76
- package/dist/core/pugi-md/walk-up.js +0 -207
- package/dist/core/python/uv-installer.js +0 -270
- package/dist/core/python/uv-resolver.js +0 -83
- package/dist/core/rate-limit/narrator.js +0 -146
- package/dist/core/recipes/cli-types.js +0 -20
- package/dist/core/recipes/loader.js +0 -103
- package/dist/core/recipes/runner.js +0 -345
- package/dist/core/recipes/schema.js +0 -587
- package/dist/core/release-notes/parser.js +0 -241
- package/dist/core/release-notes/state.js +0 -116
- package/dist/core/repl/ask.js +0 -512
- package/dist/core/repl/cancellation.js +0 -98
- package/dist/core/repl/cap-warning.js +0 -91
- package/dist/core/repl/clipboard-read.js +0 -174
- package/dist/core/repl/dispatch-fsm.js +0 -220
- package/dist/core/repl/engine-bridge.js +0 -303
- package/dist/core/repl/history-search.js +0 -175
- package/dist/core/repl/history.js +0 -182
- package/dist/core/repl/kill-ring.js +0 -138
- package/dist/core/repl/model-pricing.js +0 -135
- package/dist/core/repl/privacy-banner.js +0 -71
- package/dist/core/repl/session.js +0 -4962
- package/dist/core/repl/slash-commands.js +0 -747
- package/dist/core/repl/store/index.js +0 -12
- package/dist/core/repl/store/jsonl-log.js +0 -321
- package/dist/core/repl/store/lockfile.js +0 -155
- package/dist/core/repl/store/session-store.js +0 -821
- package/dist/core/repl/store/types.js +0 -44
- package/dist/core/repl/store/uuid-v7.js +0 -68
- package/dist/core/repl/tool-route.js +0 -382
- package/dist/core/repl/workspace-context.js +0 -206
- package/dist/core/repo-map/build.js +0 -125
- package/dist/core/repo-map/cache.js +0 -185
- package/dist/core/repo-map/extractor.js +0 -254
- package/dist/core/repo-map/formatter.js +0 -145
- package/dist/core/repo-map/page-rank.js +0 -105
- package/dist/core/repo-map/scanner.js +0 -211
- package/dist/core/retro/git-collector.js +0 -251
- package/dist/core/retro/health-card.js +0 -25
- package/dist/core/retro/metrics.js +0 -342
- package/dist/core/retro/narrative.js +0 -249
- package/dist/core/retro/plane-collector.js +0 -274
- package/dist/core/retro/pr-issue-link.js +0 -65
- package/dist/core/retro/types.js +0 -16
- package/dist/core/retry-budget/budget.js +0 -284
- package/dist/core/retry-budget/index.js +0 -5
- package/dist/core/retry-budget/retry-cap.js +0 -74
- package/dist/core/routing/lead-worker.js +0 -43
- package/dist/core/routing/pre-flight-estimator.js +0 -108
- package/dist/core/runs/run-tree.js +0 -103
- package/dist/core/sandboxing/adapter.js +0 -29
- package/dist/core/sandboxing/index.js +0 -49
- package/dist/core/sandboxing/none.js +0 -19
- package/dist/core/sandboxing/seatbelt.js +0 -183
- package/dist/core/security/injection-scanner.js +0 -367
- package/dist/core/security/output-filter.js +0 -418
- package/dist/core/session/env-file.js +0 -105
- package/dist/core/session/section-budgets.js +0 -140
- package/dist/core/session.js +0 -377
- package/dist/core/settings.js +0 -400
- package/dist/core/share/formatter.js +0 -271
- package/dist/core/share/redactor.js +0 -221
- package/dist/core/share/uploader.js +0 -267
- package/dist/core/skills/defaults.js +0 -457
- package/dist/core/skills/loader.js +0 -454
- package/dist/core/skills/sources.js +0 -480
- package/dist/core/skills/trust.js +0 -172
- package/dist/core/smoke/headless-driver.js +0 -174
- package/dist/core/smoke/orchestrator.js +0 -194
- package/dist/core/smoke/runner.js +0 -238
- package/dist/core/smoke/scenario-parser.js +0 -316
- package/dist/core/statusline.js +0 -99
- package/dist/core/subagents/dispatcher-real.js +0 -600
- package/dist/core/subagents/dispatcher.js +0 -352
- package/dist/core/subagents/index.js +0 -39
- package/dist/core/subagents/isolation-matrix.js +0 -213
- package/dist/core/subagents/spawn.js +0 -101
- package/dist/core/telemetry/emitter.js +0 -229
- package/dist/core/telemetry/queue.js +0 -251
- package/dist/core/theme/context.js +0 -91
- package/dist/core/theme/presets.js +0 -228
- package/dist/core/theme/state.js +0 -181
- package/dist/core/todos/invariant.js +0 -10
- package/dist/core/todos/state.js +0 -177
- package/dist/core/tool-schema/compressor.js +0 -89
- package/dist/core/transport/version-interceptor.js +0 -166
- package/dist/core/trust.js +0 -109
- package/dist/core/tui/thinking-block.js +0 -64
- package/dist/core/vim/keymap.js +0 -288
- package/dist/core/vim/state.js +0 -92
- package/dist/core/watch-markers/marker-watcher.js +0 -133
- package/dist/core/worktree/include-parser.js +0 -249
- package/dist/core/worktree-manager/cleanup.js +0 -123
- package/dist/core/worktree-manager/manager.js +0 -303
- package/dist/index.js +0 -44
- package/dist/runtime/bootstrap.js +0 -190
- package/dist/runtime/cli.js +0 -8121
- package/dist/runtime/commands/agents.js +0 -385
- package/dist/runtime/commands/budget.js +0 -192
- package/dist/runtime/commands/cancel.js +0 -231
- package/dist/runtime/commands/chain.js +0 -489
- package/dist/runtime/commands/codegraph-status.js +0 -227
- package/dist/runtime/commands/compact.js +0 -297
- package/dist/runtime/commands/config.js +0 -595
- package/dist/runtime/commands/cost.js +0 -199
- package/dist/runtime/commands/delegate.js +0 -312
- package/dist/runtime/commands/dispatch.js +0 -126
- package/dist/runtime/commands/doctor.js +0 -579
- package/dist/runtime/commands/feedback.js +0 -184
- package/dist/runtime/commands/hooks.js +0 -187
- package/dist/runtime/commands/init.js +0 -254
- package/dist/runtime/commands/lsp.js +0 -368
- package/dist/runtime/commands/mcp.js +0 -935
- package/dist/runtime/commands/memory.js +0 -582
- package/dist/runtime/commands/model.js +0 -237
- package/dist/runtime/commands/onboarding.js +0 -275
- package/dist/runtime/commands/patch.js +0 -128
- package/dist/runtime/commands/permissions.js +0 -112
- package/dist/runtime/commands/plan.js +0 -143
- package/dist/runtime/commands/prd-check.js +0 -285
- package/dist/runtime/commands/privacy.js +0 -107
- package/dist/runtime/commands/recipe.js +0 -325
- package/dist/runtime/commands/redo-blob-store.js +0 -92
- package/dist/runtime/commands/redo.js +0 -361
- package/dist/runtime/commands/release-notes.js +0 -229
- package/dist/runtime/commands/repo-map.js +0 -95
- package/dist/runtime/commands/report.js +0 -299
- package/dist/runtime/commands/resume.js +0 -118
- package/dist/runtime/commands/review-consensus.js +0 -414
- package/dist/runtime/commands/rewind.js +0 -333
- package/dist/runtime/commands/roster.js +0 -117
- package/dist/runtime/commands/sessions.js +0 -163
- package/dist/runtime/commands/share.js +0 -316
- package/dist/runtime/commands/skills.js +0 -401
- package/dist/runtime/commands/status.js +0 -186
- package/dist/runtime/commands/stickers.js +0 -82
- package/dist/runtime/commands/style.js +0 -194
- package/dist/runtime/commands/theme.js +0 -196
- package/dist/runtime/commands/undo.js +0 -361
- package/dist/runtime/commands/update.js +0 -289
- package/dist/runtime/commands/vim.js +0 -140
- package/dist/runtime/commands/worktree.js +0 -177
- package/dist/runtime/commands/worktrees.js +0 -155
- package/dist/runtime/deprecation-warning.js +0 -69
- package/dist/runtime/engine-exit-code.js +0 -50
- package/dist/runtime/headless-repl.js +0 -195
- package/dist/runtime/headless.js +0 -548
- package/dist/runtime/load-hooks-or-exit.js +0 -71
- package/dist/runtime/plan-decompose.js +0 -531
- package/dist/runtime/sigint-guard.js +0 -272
- package/dist/runtime/stream-renderer.js +0 -195
- package/dist/runtime/update-check.js +0 -294
- package/dist/runtime/version.js +0 -65
- package/dist/runtime/worktree-bootstrap.js +0 -579
- package/dist/skills/bundled/batch.js +0 -617
- package/dist/skills/bundled/index.js +0 -45
- package/dist/skills/bundled/loop.js +0 -358
- package/dist/skills/bundled/remember.js +0 -383
- package/dist/skills/bundled/simplify.js +0 -289
- package/dist/skills/bundled/skillify.js +0 -373
- package/dist/skills/bundled/stuck.js +0 -558
- package/dist/skills/bundled/verify.js +0 -439
- package/dist/testing/vcr.js +0 -486
- package/dist/tools/agent-tool.js +0 -229
- package/dist/tools/apply-patch.js +0 -556
- package/dist/tools/ask-user-question.js +0 -337
- package/dist/tools/ask-user.js +0 -115
- package/dist/tools/bash.js +0 -1238
- package/dist/tools/brief.js +0 -224
- package/dist/tools/cron.js +0 -433
- package/dist/tools/enter-worktree.js +0 -250
- package/dist/tools/exit-worktree.js +0 -147
- package/dist/tools/file-tools.js +0 -553
- package/dist/tools/http-request.js +0 -336
- package/dist/tools/lsp-tools.js +0 -565
- package/dist/tools/mcp-tool.js +0 -260
- package/dist/tools/multi-edit.js +0 -361
- package/dist/tools/powershell.js +0 -268
- package/dist/tools/registry.js +0 -166
- package/dist/tools/server-tools.js +0 -892
- package/dist/tools/skill-tool.js +0 -96
- package/dist/tools/sleep.js +0 -99
- package/dist/tools/synthetic-output.js +0 -133
- package/dist/tools/tasks.js +0 -208
- package/dist/tools/todo-write.js +0 -184
- package/dist/tools/verify-plan-execution.js +0 -295
- package/dist/tools/web-fetch-injection-scanner.js +0 -207
- package/dist/tools/web-fetch.js +0 -720
- package/dist/tools/web-search.js +0 -458
- package/dist/tui/agent-progress-card.js +0 -111
- package/dist/tui/agent-tree-pane.js +0 -9
- package/dist/tui/agent-tree.js +0 -87
- package/dist/tui/ask-cli.js +0 -52
- package/dist/tui/ask-modal.js +0 -211
- package/dist/tui/ask-user-question-chips.js +0 -315
- package/dist/tui/ask-user-question-prompt.js +0 -203
- package/dist/tui/compact-banner.js +0 -81
- package/dist/tui/conversation-pane.js +0 -164
- package/dist/tui/cost-table.js +0 -111
- package/dist/tui/device-flow.js +0 -142
- package/dist/tui/doctor-table.js +0 -46
- package/dist/tui/feedback-prompt.js +0 -156
- package/dist/tui/input-box.js +0 -732
- package/dist/tui/login-picker.js +0 -69
- package/dist/tui/markdown-render.js +0 -266
- package/dist/tui/multi-file-diff-approval.js +0 -375
- package/dist/tui/onboarding-wizard.js +0 -240
- package/dist/tui/permissions-picker.js +0 -86
- package/dist/tui/render.js +0 -160
- package/dist/tui/repl-render.js +0 -770
- package/dist/tui/repl-splash-art.js +0 -64
- package/dist/tui/repl-splash-mascot.js +0 -154
- package/dist/tui/repl-splash.js +0 -117
- package/dist/tui/repl.js +0 -378
- package/dist/tui/slash-palette.js +0 -106
- package/dist/tui/splash-data.js +0 -61
- package/dist/tui/splash.js +0 -31
- package/dist/tui/status-bar.js +0 -209
- package/dist/tui/status-table.js +0 -7
- package/dist/tui/stickers-art.js +0 -136
- package/dist/tui/style-table.js +0 -28
- package/dist/tui/theme-table.js +0 -29
- package/dist/tui/thinking-spinner.js +0 -123
- package/dist/tui/tool-stream-pane.js +0 -140
- package/dist/tui/update-banner.js +0 -33
- package/dist/tui/vim-input.js +0 -267
- package/dist/tui/welcome-banner.js +0 -107
- package/dist/tui/welcome-data.js +0 -293
- package/dist/tui/workspace-context.js +0 -105
- package/docs/examples/codegraph.mcp.json +0 -10
- package/test/scenarios/codegen-create-file.scenario.txt +0 -13
- package/test/scenarios/compact-force.scenario.txt +0 -12
- package/test/scenarios/identity.scenario.txt +0 -11
- package/test/scenarios/persona-handoff.scenario.txt +0 -12
- package/test/scenarios/walkback.scenario.txt +0 -12
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `pugi flatten` — single-page repository renderer (backlog).
|
|
3
|
-
*
|
|
4
|
-
* Ported from karpathy/rendergit (BSD-0). License is compatible with
|
|
5
|
-
* Pugi's open-source posture so the port is permitted with any degree
|
|
6
|
-
* of source copying. The TypeScript adaptation below is structural —
|
|
7
|
-
* the data model, ignore semantics, and HTML envelope mirror the
|
|
8
|
-
* upstream Python single-file tool but the implementation is written
|
|
9
|
-
* from scratch in TypeScript-strict so it composes with our existing
|
|
10
|
-
* `loadPugiIgnore` chain, the CLI writeOutput sink, and node:test.
|
|
11
|
-
*
|
|
12
|
-
* Two output modes:
|
|
13
|
-
* - `human` — Prism.js CDN syntax highlight + nav tree + anchor
|
|
14
|
-
* links. Ctrl+F across the whole codebase in a single browser tab.
|
|
15
|
-
* - `llm` — `<repo><file path="..."><content>...</content></file>
|
|
16
|
-
* </repo>` envelope for paste into other LLMs.
|
|
17
|
-
*
|
|
18
|
-
* Privacy: output files are chmod 600. The .pugi/flat/ directory is
|
|
19
|
-
* created with chmod 700 so an operator can drop a workspace flatten
|
|
20
|
-
* without leaking it to other UNIX accounts.
|
|
21
|
-
*
|
|
22
|
-
* Self-contained: depends only on `node:fs` / `node:path` /
|
|
23
|
-
* `node:child_process` + the workspace-local `loadPugiIgnore` matcher.
|
|
24
|
-
* No new npm deps.
|
|
25
|
-
*/
|
|
26
|
-
import { execFileSync } from 'node:child_process';
|
|
27
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync, chmodSync, } from 'node:fs';
|
|
28
|
-
import { basename, extname, relative, resolve, sep } from 'node:path';
|
|
29
|
-
import { loadPugiIgnore, } from '../context/pugiignore.js';
|
|
30
|
-
/** Default per-file byte ceiling. 200 KiB matches Karpathy's tool. */
|
|
31
|
-
export const DEFAULT_MAX_FILE_SIZE = 200 * 1024;
|
|
32
|
-
/**
|
|
33
|
-
* Entry point. Walks the repo, filters, renders, and (unless `stdout`)
|
|
34
|
-
* writes the result to `.pugi/flat/<basename>-<sha>.html`.
|
|
35
|
-
*/
|
|
36
|
-
export async function flattenRepo(options = {}) {
|
|
37
|
-
const cwd = resolve(options.cwd ?? process.cwd());
|
|
38
|
-
const mode = options.mode ?? 'human';
|
|
39
|
-
const maxFileSize = options.maxFileSize ?? DEFAULT_MAX_FILE_SIZE;
|
|
40
|
-
const include = options.include ?? [];
|
|
41
|
-
const exclude = options.exclude ?? [];
|
|
42
|
-
const ignore = loadPugiIgnore(cwd);
|
|
43
|
-
const files = [];
|
|
44
|
-
const skipped = [];
|
|
45
|
-
for await (const entry of walkFiles(cwd, ignore, { maxFileSize, include, exclude })) {
|
|
46
|
-
if ('reason' in entry) {
|
|
47
|
-
skipped.push(entry);
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
files.push(entry);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
// Stable order: lexicographic by repo-relative path so the HTML nav
|
|
54
|
-
// tree and the LLM envelope reproduce 1:1 across runs.
|
|
55
|
-
files.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
|
|
56
|
-
skipped.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
|
|
57
|
-
const html = mode === 'human'
|
|
58
|
-
? renderHumanHTML(files, skipped, basename(cwd))
|
|
59
|
-
: renderLLMXML(files, skipped, basename(cwd));
|
|
60
|
-
if (options.stdout) {
|
|
61
|
-
return { html, files, skipped };
|
|
62
|
-
}
|
|
63
|
-
const outDir = options.outDir ?? resolve(cwd, '.pugi', 'flat');
|
|
64
|
-
ensureDir(outDir);
|
|
65
|
-
const sha = options.shaOverride ?? resolveShortSha(cwd);
|
|
66
|
-
const ext = mode === 'human' ? 'html' : 'xml';
|
|
67
|
-
const fileName = `${basename(cwd)}-${sha}.${ext}`;
|
|
68
|
-
const path = resolve(outDir, fileName);
|
|
69
|
-
writeFileSync(path, html, { encoding: 'utf8', mode: 0o600 });
|
|
70
|
-
try {
|
|
71
|
-
chmodSync(path, 0o600);
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
// best-effort; some filesystems (mounted shares) reject chmod.
|
|
75
|
-
}
|
|
76
|
-
if (options.open) {
|
|
77
|
-
tryOpenBrowser(path);
|
|
78
|
-
}
|
|
79
|
-
return { html, path, files, skipped };
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Async generator that walks the workspace, applying the pugi-ignore
|
|
83
|
-
* chain + include/exclude filters + binary/size gate. Each yielded
|
|
84
|
-
* item is either a `FlattenedFile` (kept) or a `SkippedFile` (dropped
|
|
85
|
-
* with a reason).
|
|
86
|
-
*/
|
|
87
|
-
export async function* walkFiles(rootDir, ignore, filters) {
|
|
88
|
-
const stack = [rootDir];
|
|
89
|
-
while (stack.length > 0) {
|
|
90
|
-
const dir = stack.pop();
|
|
91
|
-
if (!dir)
|
|
92
|
-
continue;
|
|
93
|
-
let entries;
|
|
94
|
-
try {
|
|
95
|
-
entries = readdirSync(dir, { withFileTypes: true, encoding: 'utf8' });
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
// Sort directory listing so the walk is deterministic regardless of
|
|
101
|
-
// the underlying filesystem's readdir order.
|
|
102
|
-
entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
103
|
-
for (const ent of entries) {
|
|
104
|
-
const abs = resolve(dir, ent.name);
|
|
105
|
-
if (ignore.isIgnored(abs, ent.isDirectory()))
|
|
106
|
-
continue;
|
|
107
|
-
if (ent.isDirectory()) {
|
|
108
|
-
stack.push(abs);
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
if (!ent.isFile())
|
|
112
|
-
continue;
|
|
113
|
-
const relPath = toPosix(relative(rootDir, abs));
|
|
114
|
-
if (!matchesFilters(relPath, filters.include, filters.exclude))
|
|
115
|
-
continue;
|
|
116
|
-
let size;
|
|
117
|
-
try {
|
|
118
|
-
size = statSync(abs).size;
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
yield { path: relPath, reason: 'unreadable', size: 0 };
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
if (size > filters.maxFileSize) {
|
|
125
|
-
yield { path: relPath, reason: 'too_large', size };
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
let buf;
|
|
129
|
-
try {
|
|
130
|
-
buf = readFileSync(abs);
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
yield { path: relPath, reason: 'unreadable', size };
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
if (isBinary(buf)) {
|
|
137
|
-
yield { path: relPath, reason: 'binary', size };
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
yield { path: relPath, content: buf.toString('utf8'), size };
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Binary-file heuristic. Mirrors Git's "first 8000 bytes contain a
|
|
146
|
-
* NUL" detection — simple, robust, and matches what rendergit ships.
|
|
147
|
-
*/
|
|
148
|
-
export function isBinary(content) {
|
|
149
|
-
const len = Math.min(content.length, 8000);
|
|
150
|
-
for (let i = 0; i < len; i += 1) {
|
|
151
|
-
if (content[i] === 0)
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
return false;
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Parse a `.gitignore`-shaped file into a deduped pattern list. Thin
|
|
158
|
-
* wrapper around `readFileSync` + the gitignore comment / blank-line
|
|
159
|
-
* rules. Re-exports `core/context/pugiignore`'s parser when callers
|
|
160
|
-
* want a non-layered raw read (test fixtures, CI shims).
|
|
161
|
-
*/
|
|
162
|
-
export function parseIgnoreFile(path) {
|
|
163
|
-
if (!existsSync(path))
|
|
164
|
-
return [];
|
|
165
|
-
try {
|
|
166
|
-
const raw = readFileSync(path, 'utf8');
|
|
167
|
-
const out = [];
|
|
168
|
-
for (const line of raw.split(/\r?\n/)) {
|
|
169
|
-
const trimmed = line.trim();
|
|
170
|
-
if (trimmed.length === 0)
|
|
171
|
-
continue;
|
|
172
|
-
if (trimmed.startsWith('#'))
|
|
173
|
-
continue;
|
|
174
|
-
out.push(trimmed);
|
|
175
|
-
}
|
|
176
|
-
return out;
|
|
177
|
-
}
|
|
178
|
-
catch {
|
|
179
|
-
return [];
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Render the human-facing HTML page. Single document, Prism.js loaded
|
|
184
|
-
* from CDN, nav tree on the left, file sections anchored on the right.
|
|
185
|
-
*
|
|
186
|
-
* Generated structure mirrors karpathy/rendergit (BSD-0):
|
|
187
|
-
* - <head> Prism CSS + a few inline rules for the layout
|
|
188
|
-
* - <aside> nav tree of file paths with anchor links
|
|
189
|
-
* - <main> one <section> per file with `<pre><code class="language-X">`
|
|
190
|
-
* - <footer> credits the upstream tool + license
|
|
191
|
-
*/
|
|
192
|
-
export function renderHumanHTML(files, skipped, repoName) {
|
|
193
|
-
const title = escapeHtml(`${repoName} — pugi flatten`);
|
|
194
|
-
const nav = files
|
|
195
|
-
.map((f) => {
|
|
196
|
-
const anchor = anchorFor(f.path);
|
|
197
|
-
return ` <li><a href="#${anchor}">${escapeHtml(f.path)}</a></li>`;
|
|
198
|
-
})
|
|
199
|
-
.join('\n');
|
|
200
|
-
const skippedList = skipped.length === 0
|
|
201
|
-
? ''
|
|
202
|
-
: `
|
|
203
|
-
<section class="skipped">
|
|
204
|
-
<h2>Skipped (${skipped.length})</h2>
|
|
205
|
-
<ul>
|
|
206
|
-
${skipped
|
|
207
|
-
.map((s) => ` <li><code>${escapeHtml(s.path)}</code> — ${s.reason} (${s.size}B)</li>`)
|
|
208
|
-
.join('\n')}
|
|
209
|
-
</ul>
|
|
210
|
-
</section>`;
|
|
211
|
-
const sections = files
|
|
212
|
-
.map((f) => {
|
|
213
|
-
const lang = languageFor(f.path);
|
|
214
|
-
const anchor = anchorFor(f.path);
|
|
215
|
-
return ` <section id="${anchor}" class="file">
|
|
216
|
-
<h2><a href="#${anchor}">${escapeHtml(f.path)}</a></h2>
|
|
217
|
-
<pre><code class="language-${lang}">${escapeHtml(f.content)}</code></pre>
|
|
218
|
-
</section>`;
|
|
219
|
-
})
|
|
220
|
-
.join('\n');
|
|
221
|
-
return `<!DOCTYPE html>
|
|
222
|
-
<html lang="en">
|
|
223
|
-
<head>
|
|
224
|
-
<meta charset="utf-8" />
|
|
225
|
-
<title>${title}</title>
|
|
226
|
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css" integrity="sha512-tN7Ec6zAFaVSG3TpNAKtk4DOHNpSwKHxxrsiw4GHKESGPs5njn/0sMCUMl2svV4wo4BK/rCP7juYz+zx+l6oeQ==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
|
227
|
-
<style>
|
|
228
|
-
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
229
|
-
margin: 0; display: grid; grid-template-columns: 280px 1fr; min-height: 100vh; }
|
|
230
|
-
aside { background: #f7f7f7; border-right: 1px solid #ddd; padding: 1rem;
|
|
231
|
-
position: sticky; top: 0; height: 100vh; overflow-y: auto; }
|
|
232
|
-
aside h1 { font-size: 1rem; margin: 0 0 1rem; }
|
|
233
|
-
aside ul { list-style: none; padding: 0; margin: 0; font-family: monospace; font-size: 0.85rem; }
|
|
234
|
-
aside li { margin: 0.15rem 0; word-break: break-all; }
|
|
235
|
-
aside a { color:; text-decoration: none; }
|
|
236
|
-
aside a:hover { text-decoration: underline; }
|
|
237
|
-
main { padding: 1.5rem; max-width: 100%; overflow-x: auto; }
|
|
238
|
-
section.file { margin-bottom: 2rem; border-bottom: 1px solid #eee; padding-bottom: 1rem; }
|
|
239
|
-
section.file h2 { font-family: monospace; font-size: 0.95rem; }
|
|
240
|
-
section.file h2 a { color:; text-decoration: none; }
|
|
241
|
-
pre { background: #fafafa; padding: 1rem; border: 1px solid #eee; overflow-x: auto; }
|
|
242
|
-
code { font-family: "SF Mono", Menlo, Consolas, monospace; font-size: 0.85rem; }
|
|
243
|
-
section.skipped { color:; font-size: 0.85rem; border-top: 2px solid #ddd; padding-top: 1rem; }
|
|
244
|
-
footer { grid-column: 1 / -1; padding: 1rem 1.5rem; color:; font-size: 0.8rem;
|
|
245
|
-
border-top: 1px solid #eee; }
|
|
246
|
-
</style>
|
|
247
|
-
</head>
|
|
248
|
-
<body>
|
|
249
|
-
<aside>
|
|
250
|
-
<h1>${title}</h1>
|
|
251
|
-
<ul>
|
|
252
|
-
${nav}
|
|
253
|
-
</ul>
|
|
254
|
-
</aside>
|
|
255
|
-
<main>
|
|
256
|
-
${sections}
|
|
257
|
-
${skippedList}
|
|
258
|
-
</main>
|
|
259
|
-
<footer>
|
|
260
|
-
Generated by <code>pugi flatten</code>. Ported from
|
|
261
|
-
<a href="https://github.com/karpathy/rendergit">karpathy/rendergit</a> (BSD-0).
|
|
262
|
-
</footer>
|
|
263
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js" integrity="sha512-7Z9J3l1+EYfeaPKcGXu3MS/7T+w19WtKQY/n+xzmw4hZhJ9tyYmcUS+4QqAlzhicE5LAfMQSF3iFTK9bQdTxXg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
264
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-typescript.min.js" integrity="sha512-uOw7XYETzS/DPmmirpP5UCMihSDNMeyTS965J0/456OSPfxn9xEtHHjj5Q/5WefVdqyMfN/afmQnNpZd/tpkcA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
265
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-tsx.min.js" integrity="sha512-xjGCJ9YxyZBfYTCHsEjkOZMoOse1W3cKMXv1szXrxs68myuXt0YTj3/xKPar6iDMlXzTUSEqwUxprWcyp+plaw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
266
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-jsx.min.js" integrity="sha512-m3JYEI6gx5fh9jF10FjGoMzVKcV2N6nchcDcqPCdI1L3R2WQV7br2XVNR8iTLb2daOMRl3zldbcfT40xU2ntVw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
267
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-bash.min.js" integrity="sha512-whYhDwtTmlC/NpZlCr6PSsAaLOrfjVg/iXAnC4H/dtiHawpShhT2SlIMbpIhT/IL/NrpdMm+Hq2C13+VKpHTYw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
268
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-json.min.js" integrity="sha512-QXFMVAusM85vUYDaNgcYeU3rzSlc+bTV4JvkfJhjxSHlQEo+ig53BtnGkvFTiNJh8D+wv6uWAQ2vJaVmxe8d3w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
269
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-yaml.min.js" integrity="sha512-6O/PZimM3TD1NN3yrazePA4AbZrPcwt1QCGJrVY7WoHDJROZFc9TlBvIKMe+QfqgcslW4lQeBzNJEJvIMC8WhA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
270
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js" integrity="sha512-AKaNmg8COK0zEbjTdMHJAPJ0z6VeNqvRvH4/d5M4sHJbQQUToMBtodq4HaV4fa+WV2UTfoperElm66c9/8cKmQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
271
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-rust.min.js" integrity="sha512-R/HpMlNfZZV6DxMhNz1dYJbBaPBVSOCqX8imo3uGUurhPDHRcXrBxkEVOjawwUwTMfOqT6t1eLYYQXIjFWCX/A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
272
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-go.min.js" integrity="sha512-w200Nz1i9KgDNi+IpPMgpZBVRIvfVK/V5vskyHjkz7XJkVnRJcb1uNmpiHhDv0/Ln+GG2VqScKKz/1izBfg64Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
273
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-markdown.min.js" integrity="sha512-IHQR8J+JbQpZ1tjkHkq8Ivsgo6ovfnYbQnYzmoKCjTCQG90YVs9l+2P14DRIZ94VBrB+F86Ju4wSGOMOjfVCQQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
274
|
-
</body>
|
|
275
|
-
</html>
|
|
276
|
-
`;
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Render the LLM-CXML envelope. Each file is wrapped in a
|
|
280
|
-
* `<file path="...">` block with the content escaped for XML.
|
|
281
|
-
*/
|
|
282
|
-
export function renderLLMXML(files, skipped, repoName) {
|
|
283
|
-
const blocks = files
|
|
284
|
-
.map((f) => ` <file path="${escapeXmlAttr(f.path)}" size="${f.size}">
|
|
285
|
-
<content><![CDATA[${escapeCdata(f.content)}]]></content>
|
|
286
|
-
</file>`)
|
|
287
|
-
.join('\n');
|
|
288
|
-
const skippedBlocks = skipped
|
|
289
|
-
.map((s) => ` <skipped path="${escapeXmlAttr(s.path)}" reason="${s.reason}" size="${s.size}" />`)
|
|
290
|
-
.join('\n');
|
|
291
|
-
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
292
|
-
<repo name="${escapeXmlAttr(repoName)}" generator="pugi-flatten">
|
|
293
|
-
${blocks}
|
|
294
|
-
${skippedBlocks}
|
|
295
|
-
</repo>
|
|
296
|
-
`;
|
|
297
|
-
}
|
|
298
|
-
// --- helpers --------------------------------------------------------------
|
|
299
|
-
function matchesFilters(path, include, exclude) {
|
|
300
|
-
if (include.length > 0) {
|
|
301
|
-
let any = false;
|
|
302
|
-
for (const pat of include) {
|
|
303
|
-
if (substringOrGlob(path, pat)) {
|
|
304
|
-
any = true;
|
|
305
|
-
break;
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
if (!any)
|
|
309
|
-
return false;
|
|
310
|
-
}
|
|
311
|
-
for (const pat of exclude) {
|
|
312
|
-
if (substringOrGlob(path, pat))
|
|
313
|
-
return false;
|
|
314
|
-
}
|
|
315
|
-
return true;
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Lightweight matcher: `*` glob OR plain substring. We deliberately
|
|
319
|
-
* avoid a full glob library here — the use case is operator-driven
|
|
320
|
-
* `--include=src/` and `--exclude=test/` overrides, not arbitrary
|
|
321
|
-
* gitignore semantics (which already run upstream in `loadPugiIgnore`).
|
|
322
|
-
*/
|
|
323
|
-
function substringOrGlob(path, pattern) {
|
|
324
|
-
if (pattern.length === 0)
|
|
325
|
-
return false;
|
|
326
|
-
if (!pattern.includes('*'))
|
|
327
|
-
return path.includes(pattern);
|
|
328
|
-
const re = new RegExp('^' +
|
|
329
|
-
pattern
|
|
330
|
-
.split('*')
|
|
331
|
-
.map((part) => escapeRegex(part))
|
|
332
|
-
.join('.*') +
|
|
333
|
-
'$');
|
|
334
|
-
return re.test(path);
|
|
335
|
-
}
|
|
336
|
-
function escapeRegex(s) {
|
|
337
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
338
|
-
}
|
|
339
|
-
function toPosix(p) {
|
|
340
|
-
return sep === '/' ? p : p.split(sep).join('/');
|
|
341
|
-
}
|
|
342
|
-
function anchorFor(path) {
|
|
343
|
-
return 'f-' + path.replace(/[^a-zA-Z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
344
|
-
}
|
|
345
|
-
function escapeHtml(s) {
|
|
346
|
-
return s
|
|
347
|
-
.replace(/&/g, '&')
|
|
348
|
-
.replace(/</g, '<')
|
|
349
|
-
.replace(/>/g, '>')
|
|
350
|
-
.replace(/"/g, '"')
|
|
351
|
-
.replace(/'/g, ''');
|
|
352
|
-
}
|
|
353
|
-
function escapeXmlAttr(s) {
|
|
354
|
-
return s
|
|
355
|
-
.replace(/&/g, '&')
|
|
356
|
-
.replace(/</g, '<')
|
|
357
|
-
.replace(/>/g, '>')
|
|
358
|
-
.replace(/"/g, '"');
|
|
359
|
-
}
|
|
360
|
-
/**
|
|
361
|
-
* Escape a payload for inclusion inside a `<![CDATA[ ... ]]>` block.
|
|
362
|
-
* CDATA cannot contain the literal `]]>`; the workaround is to split
|
|
363
|
-
* the sequence across two CDATA sections.
|
|
364
|
-
*/
|
|
365
|
-
function escapeCdata(s) {
|
|
366
|
-
return s.replace(/]]>/g, ']]]]><![CDATA[>');
|
|
367
|
-
}
|
|
368
|
-
const LANG_BY_EXT = {
|
|
369
|
-
'.ts': 'typescript',
|
|
370
|
-
'.tsx': 'tsx',
|
|
371
|
-
'.js': 'javascript',
|
|
372
|
-
'.jsx': 'jsx',
|
|
373
|
-
'.mjs': 'javascript',
|
|
374
|
-
'.cjs': 'javascript',
|
|
375
|
-
'.py': 'python',
|
|
376
|
-
'.rs': 'rust',
|
|
377
|
-
'.go': 'go',
|
|
378
|
-
'.json': 'json',
|
|
379
|
-
'.yml': 'yaml',
|
|
380
|
-
'.yaml': 'yaml',
|
|
381
|
-
'.md': 'markdown',
|
|
382
|
-
'.sh': 'bash',
|
|
383
|
-
'.bash': 'bash',
|
|
384
|
-
'.zsh': 'bash',
|
|
385
|
-
'.html': 'markup',
|
|
386
|
-
'.css': 'css',
|
|
387
|
-
'.sql': 'sql',
|
|
388
|
-
'.toml': 'toml',
|
|
389
|
-
};
|
|
390
|
-
function languageFor(path) {
|
|
391
|
-
const ext = extname(path).toLowerCase();
|
|
392
|
-
return LANG_BY_EXT[ext] ?? 'plaintext';
|
|
393
|
-
}
|
|
394
|
-
function ensureDir(dir) {
|
|
395
|
-
if (!existsSync(dir)) {
|
|
396
|
-
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
397
|
-
return;
|
|
398
|
-
}
|
|
399
|
-
try {
|
|
400
|
-
chmodSync(dir, 0o700);
|
|
401
|
-
}
|
|
402
|
-
catch {
|
|
403
|
-
// ignore — best-effort tightening of an existing dir.
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
function resolveShortSha(cwd) {
|
|
407
|
-
try {
|
|
408
|
-
const out = execFileSync('git', ['rev-parse', '--short', 'HEAD'], {
|
|
409
|
-
cwd,
|
|
410
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
411
|
-
encoding: 'utf8',
|
|
412
|
-
});
|
|
413
|
-
const trimmed = out.trim();
|
|
414
|
-
if (/^[0-9a-f]{4,40}$/i.test(trimmed))
|
|
415
|
-
return trimmed;
|
|
416
|
-
}
|
|
417
|
-
catch {
|
|
418
|
-
// not a git repo, or git missing — fall through.
|
|
419
|
-
}
|
|
420
|
-
// Fall back to a sortable timestamp so the filename stays unique.
|
|
421
|
-
const now = new Date();
|
|
422
|
-
return [
|
|
423
|
-
now.getUTCFullYear().toString().slice(2),
|
|
424
|
-
String(now.getUTCMonth() + 1).padStart(2, '0'),
|
|
425
|
-
String(now.getUTCDate()).padStart(2, '0'),
|
|
426
|
-
String(now.getUTCHours()).padStart(2, '0'),
|
|
427
|
-
String(now.getUTCMinutes()).padStart(2, '0'),
|
|
428
|
-
].join('');
|
|
429
|
-
}
|
|
430
|
-
function tryOpenBrowser(path) {
|
|
431
|
-
try {
|
|
432
|
-
const bin = process.platform === 'darwin' ? 'open' : 'xdg-open';
|
|
433
|
-
execFileSync(bin, [path], { stdio: 'ignore' });
|
|
434
|
-
}
|
|
435
|
-
catch {
|
|
436
|
-
// best-effort; absence of a browser opener is non-fatal.
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
//# sourceMappingURL=flatten-repo.js.map
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OSC 8 hyperlink helpers — turns workspace-relative file paths into
|
|
3
|
-
* clickable links in modern terminals (iTerm2, kitty, Windows Terminal,
|
|
4
|
-
* VS Code integrated terminal, Alacritty, WezTerm). Dumb terminals and
|
|
5
|
-
* pipes ignore the escape sequence and render only the visible label.
|
|
6
|
-
*
|
|
7
|
-
* CEO P2 #38 — artifact linking. Triggers ONLY when:
|
|
8
|
-
* - stdout is a TTY
|
|
9
|
-
* - PUGI_ARTIFACT_LINKS_DISABLE !== '1'
|
|
10
|
-
* - NO_COLOR is not set
|
|
11
|
-
*/
|
|
12
|
-
import { resolve, isAbsolute } from 'node:path';
|
|
13
|
-
import { pathToFileURL } from 'node:url';
|
|
14
|
-
const ESC = '';
|
|
15
|
-
export function linkArtifact(pathRel, opts) {
|
|
16
|
-
const env = opts.env ?? process.env;
|
|
17
|
-
const tty = opts.isTty ?? process.stdout.isTTY ?? false;
|
|
18
|
-
if (!tty)
|
|
19
|
-
return pathRel;
|
|
20
|
-
if (env['PUGI_ARTIFACT_LINKS_DISABLE'] === '1')
|
|
21
|
-
return pathRel;
|
|
22
|
-
if (env['NO_COLOR'] && env['NO_COLOR'].length > 0)
|
|
23
|
-
return pathRel;
|
|
24
|
-
const abs = isAbsolute(pathRel) ? pathRel : resolve(opts.workspaceRoot, pathRel);
|
|
25
|
-
const url = pathToFileURL(abs).href;
|
|
26
|
-
return `${ESC}]8;;${url}${ESC}\\${pathRel}${ESC}]8;;${ESC}\\`;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=osc8-link.js.map
|