@pugi/cli 0.1.0-beta.10 → 0.1.0-beta.101
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 +55 -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 +598 -0
- package/dist/core/codegraph/queries/go.scm +57 -0
- package/dist/core/codegraph/queries/javascript.scm +56 -0
- package/dist/core/codegraph/queries/python.scm +55 -0
- package/dist/core/codegraph/queries/rust.scm +63 -0
- package/dist/core/codegraph/queries/typescript.scm +91 -0
- package/dist/core/codegraph/reindex.js +218 -0
- package/dist/core/codegraph/resolve-edges.js +107 -0
- package/dist/core/codegraph/types.js +34 -0
- package/dist/core/codegraph/watcher.js +440 -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 +67 -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 +219 -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/eval/v1/ledger.js +83 -0
- package/dist/core/eval/v1/runner.js +280 -0
- package/dist/core/eval/v1/scoring.js +68 -0
- package/dist/core/eval/v1/task-loader.js +191 -0
- package/dist/core/eval/v1/types.js +14 -0
- package/dist/core/eval/v1/verifier.js +176 -0
- package/dist/core/eval/v1/yaml-parser.js +250 -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 +43 -0
- package/dist/core/sandboxing/bubblewrap.js +209 -0
- package/dist/core/sandboxing/index.js +78 -0
- package/dist/core/sandboxing/none.js +19 -0
- package/dist/core/sandboxing/policy.js +97 -0
- package/dist/core/sandboxing/seatbelt.js +231 -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 +402 -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 +4403 -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/eval-v1.js +266 -0
- package/dist/runtime/commands/feedback.js +184 -0
- package/dist/runtime/commands/hooks.js +187 -0
- package/dist/runtime/commands/index-cmd.js +459 -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-cli.js +182 -0
- 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 +811 -49
- 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 +29 -6
- 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
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pugi index` - local symbol index CLI surface.
|
|
3
|
+
*
|
|
4
|
+
* Operator entry point for the Pugi-native symbol index living at
|
|
5
|
+
* `.pugi/codegraph.db`. Four subcommands today, all wired against the
|
|
6
|
+
* scaffold DB layer in `core/codegraph/db.ts`:
|
|
7
|
+
*
|
|
8
|
+
* - `pugi index` - full (re)index of the workspace.
|
|
9
|
+
* Today: opens the DB, runs the
|
|
10
|
+
* v1 migration, and reports the
|
|
11
|
+
* stub parser state. PR L1
|
|
12
|
+
* replaces this with a real
|
|
13
|
+
* tree-sitter walk.
|
|
14
|
+
* - `pugi index --watch` - start the file watcher. Not
|
|
15
|
+
* implemented in this PR; exits
|
|
16
|
+
* with rc=3 + a pointer at
|
|
17
|
+
* PR L2 which ships chokidar
|
|
18
|
+
* + 2s debounce.
|
|
19
|
+
* - `pugi index search <query>` - FTS5 query against
|
|
20
|
+
* `symbols_fts`. Works on top
|
|
21
|
+
* of an empty index too -
|
|
22
|
+
* returns zero matches.
|
|
23
|
+
* - `pugi index definition <symbol>` - exact-name lookup. Same shape
|
|
24
|
+
* as `--search`.
|
|
25
|
+
* - `pugi index callers <symbol>` - reverse-edge query. Empty
|
|
26
|
+
* today because the stub
|
|
27
|
+
* parser emits no edges.
|
|
28
|
+
*
|
|
29
|
+
* The command is intentionally narrow - every information surface
|
|
30
|
+
* (count, freshness, language coverage) routes through the existing
|
|
31
|
+
* `/codegraph-status` slash that already ships in `runtime/commands/
|
|
32
|
+
* codegraph-status.ts`. This file owns the indexing verbs; status
|
|
33
|
+
* lives over there.
|
|
34
|
+
*
|
|
35
|
+
* Exit codes:
|
|
36
|
+
* 0 - success / "nothing to do" idempotent path
|
|
37
|
+
* 1 - runtime failure (db error, IO error)
|
|
38
|
+
* 2 - invalid CLI args (unknown subcommand, missing required positional)
|
|
39
|
+
* 3 - not implemented yet (parser stub, watcher) - pointer in stderr
|
|
40
|
+
*/
|
|
41
|
+
import { resolve } from 'node:path';
|
|
42
|
+
import { closeIndex, countSymbols, findCallers, findDefinition, openIndex, resolveIndexPath, searchSymbols, } from '../../core/codegraph/db.js';
|
|
43
|
+
import { reindexWorkspace } from '../../core/codegraph/reindex.js';
|
|
44
|
+
import { startWatcher } from '../../core/codegraph/watcher.js';
|
|
45
|
+
import { INDEXED_LANGUAGES } from '../../core/codegraph/types.js';
|
|
46
|
+
/**
|
|
47
|
+
* Single entry-point. Returns the process exit code; the caller in
|
|
48
|
+
* `runtime/cli.ts` propagates it via `process.exitCode` (mirrors the
|
|
49
|
+
* `dispatchFlatten` pattern).
|
|
50
|
+
*/
|
|
51
|
+
export async function runIndexCommand(args, ctx) {
|
|
52
|
+
const sub = parseArgs(args);
|
|
53
|
+
switch (sub.kind) {
|
|
54
|
+
case 'help':
|
|
55
|
+
return printHelp(ctx);
|
|
56
|
+
case 'unknown':
|
|
57
|
+
return printUnknown(ctx, sub.raw);
|
|
58
|
+
case 'reindex':
|
|
59
|
+
return runReindex(ctx, sub.watch);
|
|
60
|
+
case 'search':
|
|
61
|
+
return runSearch(ctx, sub.query);
|
|
62
|
+
case 'definition':
|
|
63
|
+
return runDefinition(ctx, sub.symbol);
|
|
64
|
+
case 'callers':
|
|
65
|
+
return runCallers(ctx, sub.symbol);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Parse the argv tail (everything after `pugi index`). Pure - exported
|
|
70
|
+
* for the spec to pin canonical shapes.
|
|
71
|
+
*/
|
|
72
|
+
export function parseArgs(args) {
|
|
73
|
+
if (args.length === 0) {
|
|
74
|
+
return { kind: 'reindex', watch: false };
|
|
75
|
+
}
|
|
76
|
+
const [head, ...rest] = args;
|
|
77
|
+
if (!head)
|
|
78
|
+
return { kind: 'reindex', watch: false };
|
|
79
|
+
if (head === '--help' || head === '-h' || head === 'help') {
|
|
80
|
+
return { kind: 'help' };
|
|
81
|
+
}
|
|
82
|
+
if (head === '--watch' || head === '-w') {
|
|
83
|
+
return { kind: 'reindex', watch: true };
|
|
84
|
+
}
|
|
85
|
+
if (head === 'search') {
|
|
86
|
+
const query = rest.join(' ').trim();
|
|
87
|
+
if (query.length === 0)
|
|
88
|
+
return { kind: 'unknown', raw: 'search (missing query)' };
|
|
89
|
+
return { kind: 'search', query };
|
|
90
|
+
}
|
|
91
|
+
if (head === 'definition') {
|
|
92
|
+
const symbol = rest.join(' ').trim();
|
|
93
|
+
if (symbol.length === 0)
|
|
94
|
+
return { kind: 'unknown', raw: 'definition (missing symbol)' };
|
|
95
|
+
return { kind: 'definition', symbol };
|
|
96
|
+
}
|
|
97
|
+
if (head === 'callers') {
|
|
98
|
+
const symbol = rest.join(' ').trim();
|
|
99
|
+
if (symbol.length === 0)
|
|
100
|
+
return { kind: 'unknown', raw: 'callers (missing symbol)' };
|
|
101
|
+
return { kind: 'callers', symbol };
|
|
102
|
+
}
|
|
103
|
+
return { kind: 'unknown', raw: head };
|
|
104
|
+
}
|
|
105
|
+
function printHelp(ctx) {
|
|
106
|
+
ctx.writeOutput({ command: 'index', sub: 'help', subcommands: ['search', 'definition', 'callers'] }, [
|
|
107
|
+
'pugi index - local symbol index (CodeGraph-style).',
|
|
108
|
+
'',
|
|
109
|
+
'Usage:',
|
|
110
|
+
' pugi index Re-index the workspace.',
|
|
111
|
+
' pugi index --watch Live auto-sync via chokidar (2s debounce).',
|
|
112
|
+
' pugi index search <query> FTS5 search across symbol names.',
|
|
113
|
+
' pugi index definition <symbol> Find the definition of <symbol>.',
|
|
114
|
+
' pugi index callers <symbol> List call sites referencing <symbol>.',
|
|
115
|
+
'',
|
|
116
|
+
`Languages (v1): ${INDEXED_LANGUAGES.join(', ')}.`,
|
|
117
|
+
'Storage: .pugi/codegraph.db (gitignored, regenerable).',
|
|
118
|
+
'Design memo: docs/research/2026-06-05-pugi-index-codegraph-design.md',
|
|
119
|
+
].join('\n'));
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
function printUnknown(ctx, raw) {
|
|
123
|
+
ctx.writeOutput({ command: 'index', error: 'unknown-subcommand', got: raw }, `pugi index: unknown subcommand "${raw}". Allowed: search, definition, callers, --watch, --help.`);
|
|
124
|
+
return 2;
|
|
125
|
+
}
|
|
126
|
+
async function runReindex(ctx, watch) {
|
|
127
|
+
if (watch) {
|
|
128
|
+
return runWatch(ctx);
|
|
129
|
+
}
|
|
130
|
+
let db = null;
|
|
131
|
+
try {
|
|
132
|
+
db = openIndex(ctx.workspaceRoot);
|
|
133
|
+
const summary = await reindexWorkspace(db, { quiet: true });
|
|
134
|
+
const symCount = countSymbols(db);
|
|
135
|
+
ctx.writeOutput({
|
|
136
|
+
command: 'index',
|
|
137
|
+
sub: 'reindex',
|
|
138
|
+
watch: false,
|
|
139
|
+
status: 'ok',
|
|
140
|
+
dbPath: db.dbPath,
|
|
141
|
+
schemaVersion: db.version,
|
|
142
|
+
filesScanned: summary.filesScanned,
|
|
143
|
+
filesIndexed: summary.filesIndexed,
|
|
144
|
+
symbolsInserted: summary.symbolsInserted,
|
|
145
|
+
edgesInserted: summary.edgesInserted,
|
|
146
|
+
edgesOrphaned: summary.edgesOrphaned,
|
|
147
|
+
totalSymbols: symCount,
|
|
148
|
+
elapsedMs: summary.totalMs,
|
|
149
|
+
}, [
|
|
150
|
+
`Index DB ready at ${db.dbPath} (schema v${db.version}).`,
|
|
151
|
+
`Scanned ${summary.filesScanned} files, indexed ${summary.filesIndexed}.`,
|
|
152
|
+
`Symbols inserted: ${summary.symbolsInserted}. Edges inserted: ${summary.edgesInserted} (${summary.edgesOrphaned} orphans dropped).`,
|
|
153
|
+
`Elapsed: ${summary.totalMs} ms. Total symbols on disk: ${symCount}.`,
|
|
154
|
+
].join('\n'));
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
159
|
+
ctx.writeOutput({ command: 'index', sub: 'reindex', error: 'db_error', message }, `pugi index failed: ${message}`);
|
|
160
|
+
return 1;
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
if (db)
|
|
164
|
+
closeIndex(db);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* `pugi index --watch` runtime: do one full re-index up-front so the
|
|
169
|
+
* index reflects the workspace as it stood at startup, then hand off
|
|
170
|
+
* к the chokidar watcher and block until SIGINT / SIGTERM. The DB
|
|
171
|
+
* handle stays open для the watcher's lifetime - the watcher writes
|
|
172
|
+
* incrementally, the operator quits with Ctrl+C, we close.
|
|
173
|
+
*/
|
|
174
|
+
async function runWatch(ctx) {
|
|
175
|
+
const writeStderr = ctx.writeStderr ?? ((text) => void process.stderr.write(text));
|
|
176
|
+
let db = null;
|
|
177
|
+
try {
|
|
178
|
+
db = openIndex(ctx.workspaceRoot);
|
|
179
|
+
// Baseline reindex so the watcher starts on a known-current index.
|
|
180
|
+
// Reindex is idempotent + cheap on subsequent runs (no-op for
|
|
181
|
+
// unchanged files via the sha256 fingerprint).
|
|
182
|
+
const summary = await reindexWorkspace(db, { quiet: true });
|
|
183
|
+
ctx.writeOutput({
|
|
184
|
+
command: 'index',
|
|
185
|
+
sub: 'reindex',
|
|
186
|
+
watch: true,
|
|
187
|
+
status: 'watching',
|
|
188
|
+
dbPath: db.dbPath,
|
|
189
|
+
schemaVersion: db.version,
|
|
190
|
+
filesScanned: summary.filesScanned,
|
|
191
|
+
filesIndexed: summary.filesIndexed,
|
|
192
|
+
symbolsInserted: summary.symbolsInserted,
|
|
193
|
+
edgesInserted: summary.edgesInserted,
|
|
194
|
+
baselineMs: summary.totalMs,
|
|
195
|
+
}, [
|
|
196
|
+
`Baseline index ready (${summary.filesIndexed} files, ${summary.symbolsInserted} symbols, ${summary.edgesInserted} edges).`,
|
|
197
|
+
`watching ${ctx.workspaceRoot}...`,
|
|
198
|
+
' Press Ctrl+C to stop.',
|
|
199
|
+
].join('\n'));
|
|
200
|
+
const handle = startWatcher({
|
|
201
|
+
db,
|
|
202
|
+
workspaceRoot: ctx.workspaceRoot,
|
|
203
|
+
writeStderr,
|
|
204
|
+
});
|
|
205
|
+
// Set up SIGINT / SIGTERM traps. Resolve the promise that gates
|
|
206
|
+
// `runWatch` once the handle has fully closed.
|
|
207
|
+
return await new Promise((resolvePromise) => {
|
|
208
|
+
let shuttingDown = false;
|
|
209
|
+
const shutdown = async (signal) => {
|
|
210
|
+
if (shuttingDown)
|
|
211
|
+
return;
|
|
212
|
+
shuttingDown = true;
|
|
213
|
+
try {
|
|
214
|
+
await handle.close();
|
|
215
|
+
writeStderr(`pugi index --watch: stopped (${signal}).\n`);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
219
|
+
writeStderr(`pugi index --watch: shutdown error: ${message}\n`);
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
if (db)
|
|
223
|
+
closeIndex(db);
|
|
224
|
+
db = null;
|
|
225
|
+
process.off('SIGINT', sigintListener);
|
|
226
|
+
process.off('SIGTERM', sigtermListener);
|
|
227
|
+
resolvePromise(0);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
const sigintListener = () => void shutdown('SIGINT');
|
|
231
|
+
const sigtermListener = () => void shutdown('SIGTERM');
|
|
232
|
+
process.on('SIGINT', sigintListener);
|
|
233
|
+
process.on('SIGTERM', sigtermListener);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
238
|
+
ctx.writeOutput({ command: 'index', sub: 'reindex', watch: true, error: 'watcher_failed', message }, `pugi index --watch failed: ${message}`);
|
|
239
|
+
if (db)
|
|
240
|
+
closeIndex(db);
|
|
241
|
+
return 1;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function runSearch(ctx, query) {
|
|
245
|
+
let db = null;
|
|
246
|
+
try {
|
|
247
|
+
db = openIndex(ctx.workspaceRoot);
|
|
248
|
+
// Wrap a bare identifier in a prefix-match phrase so operators
|
|
249
|
+
// can type `pugi index search foo` and find `fooBar`. FTS5 will
|
|
250
|
+
// happily accept a more specific raw expression too (e.g.
|
|
251
|
+
// `foo*` or `"exact phrase"`) - we only inject the convenience
|
|
252
|
+
// wrapping when the input looks like a plain identifier.
|
|
253
|
+
const wrapped = wrapSearchQuery(query);
|
|
254
|
+
const results = searchSymbols(db, wrapped, { limit: 50 });
|
|
255
|
+
ctx.writeOutput({
|
|
256
|
+
command: 'index',
|
|
257
|
+
sub: 'search',
|
|
258
|
+
query,
|
|
259
|
+
matches: results.length,
|
|
260
|
+
results: results.map(serializeSearchResult),
|
|
261
|
+
}, renderSearchText(query, results, db.dbPath));
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
266
|
+
ctx.writeOutput({ command: 'index', sub: 'search', error: 'query_failed', message }, `pugi index search failed: ${message}`);
|
|
267
|
+
return 1;
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
if (db)
|
|
271
|
+
closeIndex(db);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function runDefinition(ctx, symbol) {
|
|
275
|
+
let db = null;
|
|
276
|
+
try {
|
|
277
|
+
db = openIndex(ctx.workspaceRoot);
|
|
278
|
+
const result = findDefinition(db, symbol);
|
|
279
|
+
ctx.writeOutput({
|
|
280
|
+
command: 'index',
|
|
281
|
+
sub: 'definition',
|
|
282
|
+
symbol,
|
|
283
|
+
result: serializeDefinitionResult(result),
|
|
284
|
+
}, renderDefinitionText(symbol, result));
|
|
285
|
+
return result.kind === 'found' ? 0 : 0;
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
289
|
+
ctx.writeOutput({ command: 'index', sub: 'definition', error: 'query_failed', message }, `pugi index definition failed: ${message}`);
|
|
290
|
+
return 1;
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
if (db)
|
|
294
|
+
closeIndex(db);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function runCallers(ctx, symbol) {
|
|
298
|
+
let db = null;
|
|
299
|
+
try {
|
|
300
|
+
db = openIndex(ctx.workspaceRoot);
|
|
301
|
+
const def = findDefinition(db, symbol);
|
|
302
|
+
if (def.kind !== 'found' || def.definition.id === undefined) {
|
|
303
|
+
ctx.writeOutput({
|
|
304
|
+
command: 'index',
|
|
305
|
+
sub: 'callers',
|
|
306
|
+
symbol,
|
|
307
|
+
matches: 0,
|
|
308
|
+
note: 'definition_not_found',
|
|
309
|
+
}, `pugi index callers: no definition known for "${symbol}". Run \`pugi index\` first or check the spelling.`);
|
|
310
|
+
return 0;
|
|
311
|
+
}
|
|
312
|
+
const callers = findCallers(db, def.definition.id);
|
|
313
|
+
ctx.writeOutput({
|
|
314
|
+
command: 'index',
|
|
315
|
+
sub: 'callers',
|
|
316
|
+
symbol,
|
|
317
|
+
definitionId: def.definition.id,
|
|
318
|
+
matches: callers.length,
|
|
319
|
+
callers: callers.map(serializeCallerResult),
|
|
320
|
+
}, renderCallersText(symbol, callers));
|
|
321
|
+
return 0;
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
325
|
+
ctx.writeOutput({ command: 'index', sub: 'callers', error: 'query_failed', message }, `pugi index callers failed: ${message}`);
|
|
326
|
+
return 1;
|
|
327
|
+
}
|
|
328
|
+
finally {
|
|
329
|
+
if (db)
|
|
330
|
+
closeIndex(db);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
function serializeSearchResult(r) {
|
|
334
|
+
return {
|
|
335
|
+
name: r.symbol.name,
|
|
336
|
+
kind: r.symbol.kind,
|
|
337
|
+
file: r.symbol.file,
|
|
338
|
+
line: r.symbol.line,
|
|
339
|
+
col: r.symbol.column,
|
|
340
|
+
scope: r.symbol.scope,
|
|
341
|
+
signature: r.symbol.signature ?? null,
|
|
342
|
+
rank: r.rank,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
function serializeDefinitionResult(r) {
|
|
346
|
+
if (r.kind === 'not_found')
|
|
347
|
+
return { found: false, name: r.name };
|
|
348
|
+
return {
|
|
349
|
+
found: true,
|
|
350
|
+
definition: serializeSymbol(r.definition),
|
|
351
|
+
disambiguations: r.disambiguations.map(serializeSymbol),
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
function serializeCallerResult(c) {
|
|
355
|
+
return {
|
|
356
|
+
name: c.caller.name,
|
|
357
|
+
kind: c.caller.kind,
|
|
358
|
+
file: c.caller.file,
|
|
359
|
+
line: c.caller.line,
|
|
360
|
+
col: c.caller.column,
|
|
361
|
+
scope: c.caller.scope,
|
|
362
|
+
edgeKind: c.edge.kind,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
function serializeSymbol(s) {
|
|
366
|
+
return {
|
|
367
|
+
id: s.id,
|
|
368
|
+
name: s.name,
|
|
369
|
+
kind: s.kind,
|
|
370
|
+
file: s.file,
|
|
371
|
+
line: s.line,
|
|
372
|
+
col: s.column,
|
|
373
|
+
scope: s.scope,
|
|
374
|
+
signature: s.signature ?? null,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
function renderSearchText(query, results, dbPath) {
|
|
378
|
+
if (results.length === 0) {
|
|
379
|
+
return [
|
|
380
|
+
`pugi index search "${query}" - 0 matches.`,
|
|
381
|
+
`Index DB: ${dbPath}`,
|
|
382
|
+
'Hint: the parser stub does not extract symbols yet. PR L1 wires real tree-sitter extraction.',
|
|
383
|
+
].join('\n');
|
|
384
|
+
}
|
|
385
|
+
const lines = [
|
|
386
|
+
`pugi index search "${query}" - ${results.length} matches:`,
|
|
387
|
+
'',
|
|
388
|
+
];
|
|
389
|
+
for (const r of results) {
|
|
390
|
+
lines.push(` ${r.symbol.name} [${r.symbol.kind}] ${r.symbol.file}:${r.symbol.line} rank=${r.rank.toFixed(2)}`);
|
|
391
|
+
}
|
|
392
|
+
return lines.join('\n');
|
|
393
|
+
}
|
|
394
|
+
function renderDefinitionText(symbol, result) {
|
|
395
|
+
if (result.kind === 'not_found') {
|
|
396
|
+
return [
|
|
397
|
+
`pugi index definition "${symbol}" - not found.`,
|
|
398
|
+
'Hint: PR L1 wires the parser; until then the index is empty unless seeded by tests.',
|
|
399
|
+
].join('\n');
|
|
400
|
+
}
|
|
401
|
+
const d = result.definition;
|
|
402
|
+
const head = ` ${d.name} [${d.kind}] ${d.file}:${d.line}`;
|
|
403
|
+
if (result.disambiguations.length === 0)
|
|
404
|
+
return head;
|
|
405
|
+
return [
|
|
406
|
+
head,
|
|
407
|
+
`Also found in ${result.disambiguations.length} other locations:`,
|
|
408
|
+
...result.disambiguations.map((s) => ` - ${s.file}:${s.line} [${s.kind}]`),
|
|
409
|
+
].join('\n');
|
|
410
|
+
}
|
|
411
|
+
function renderCallersText(symbol, callers) {
|
|
412
|
+
if (callers.length === 0) {
|
|
413
|
+
return `pugi index callers "${symbol}" - 0 call sites.`;
|
|
414
|
+
}
|
|
415
|
+
const lines = [
|
|
416
|
+
`pugi index callers "${symbol}" - ${callers.length} call sites:`,
|
|
417
|
+
'',
|
|
418
|
+
];
|
|
419
|
+
for (const c of callers) {
|
|
420
|
+
lines.push(` ${c.caller.name} ${c.caller.file}:${c.caller.line} edge=${c.edge.kind}`);
|
|
421
|
+
}
|
|
422
|
+
return lines.join('\n');
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Resolve the absolute workspace root from a relative input. Exported so
|
|
426
|
+
* the cli.ts dispatcher can call this once and pass an already-absolute
|
|
427
|
+
* path to the context. Pure - no IO.
|
|
428
|
+
*/
|
|
429
|
+
export function resolveWorkspaceRoot(input) {
|
|
430
|
+
return resolve(input);
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Best-effort prefix wrap for FTS5. When the operator types a plain
|
|
434
|
+
* identifier (`fooBar`, `my_func`, `Greeter`), wrap it as a prefix
|
|
435
|
+
* match. When the input already looks like an FTS5 expression
|
|
436
|
+
* (contains `*` / `"` / `:` / leading `+` `-`), pass it through
|
|
437
|
+
* untouched. Exported so the spec can pin the behaviour.
|
|
438
|
+
*
|
|
439
|
+
* `unicode61` (the FTS5 default tokenizer) splits on punctuation
|
|
440
|
+
* other than ASCII letters/digits; an unquoted identifier with
|
|
441
|
+
* `_` или `-` would be tokenised к multiple terms. We avoid that
|
|
442
|
+
* by quoting before appending `*` for prefix-match.
|
|
443
|
+
*/
|
|
444
|
+
export function wrapSearchQuery(query) {
|
|
445
|
+
const trimmed = query.trim();
|
|
446
|
+
if (trimmed.length === 0)
|
|
447
|
+
return trimmed;
|
|
448
|
+
if (/["*:+\-^()]/.test(trimmed))
|
|
449
|
+
return trimmed;
|
|
450
|
+
// Single identifier-like token: quote + prefix.
|
|
451
|
+
if (!/\s/.test(trimmed)) {
|
|
452
|
+
return `"${trimmed}"*`;
|
|
453
|
+
}
|
|
454
|
+
return trimmed;
|
|
455
|
+
}
|
|
456
|
+
// Re-export `resolveIndexPath` from db.ts for callers that want to know
|
|
457
|
+
// where the DB lives without opening it (e.g. `pugi doctor`).
|
|
458
|
+
export { resolveIndexPath };
|
|
459
|
+
//# sourceMappingURL=index-cmd.js.map
|