@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.
Files changed (464) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/LICENSE +1 -1
  3. package/README.md +55 -11
  4. package/assets/pugi-prozr2-mascot.ansi +9 -0
  5. package/bin/run.js +33 -1
  6. package/dist/commands/deploy.js +40 -40
  7. package/dist/commands/flatten.js +191 -0
  8. package/dist/commands/jobs-watch.js +201 -0
  9. package/dist/commands/jobs.js +42 -27
  10. package/dist/commands/retro.js +210 -0
  11. package/dist/commands/smoke.js +133 -0
  12. package/dist/core/agent-progress/cleanup.js +134 -0
  13. package/dist/core/agent-progress/schema.js +144 -0
  14. package/dist/core/agent-progress/writer.js +101 -0
  15. package/dist/core/agents/adaptive-router.js +330 -0
  16. package/dist/core/agents/query-decomposer.js +297 -0
  17. package/dist/core/agents/registry.js +3 -3
  18. package/dist/core/approvals/shortcut-resolver.js +98 -0
  19. package/dist/core/artifact-chain/dispatcher.js +148 -0
  20. package/dist/core/artifact-chain/exporter.js +164 -0
  21. package/dist/core/artifact-chain/state.js +243 -0
  22. package/dist/core/artifact-chain/steps.js +169 -0
  23. package/dist/core/ask-user/question.js +92 -0
  24. package/dist/core/audit/audit-trail.js +275 -0
  25. package/dist/core/auth/ensure-authenticated.js +129 -0
  26. package/dist/core/auth/env-provider.js +238 -0
  27. package/dist/core/auto-open-browser.js +4 -4
  28. package/dist/core/auto-update/channels.js +122 -0
  29. package/dist/core/auto-update/checker.js +241 -0
  30. package/dist/core/auto-update/state.js +235 -0
  31. package/dist/core/bare-mode/index.js +107 -0
  32. package/dist/core/bash/redirect.js +281 -0
  33. package/dist/core/bash-classifier.js +436 -40
  34. package/dist/core/checkpoint/resumer.js +149 -0
  35. package/dist/core/checkpoint/rewinder.js +291 -0
  36. package/dist/core/checkpoints/shadow-git.js +670 -0
  37. package/dist/core/citations/parser.js +109 -0
  38. package/dist/core/classifier/yolo-classifier.js +88 -0
  39. package/dist/core/codegraph/db.js +506 -0
  40. package/dist/core/codegraph/decision-store.js +248 -0
  41. package/dist/core/codegraph/detect-repo.js +459 -0
  42. package/dist/core/codegraph/install.js +134 -0
  43. package/dist/core/codegraph/offer-hook.js +220 -0
  44. package/dist/core/codegraph/parser.js +598 -0
  45. package/dist/core/codegraph/queries/go.scm +57 -0
  46. package/dist/core/codegraph/queries/javascript.scm +56 -0
  47. package/dist/core/codegraph/queries/python.scm +55 -0
  48. package/dist/core/codegraph/queries/rust.scm +63 -0
  49. package/dist/core/codegraph/queries/typescript.scm +91 -0
  50. package/dist/core/codegraph/reindex.js +218 -0
  51. package/dist/core/codegraph/resolve-edges.js +107 -0
  52. package/dist/core/codegraph/types.js +34 -0
  53. package/dist/core/codegraph/watcher.js +440 -0
  54. package/dist/core/compact/auto-trigger.js +96 -0
  55. package/dist/core/compact/buffer-rewriter.js +115 -0
  56. package/dist/core/compact/summarizer.js +208 -0
  57. package/dist/core/compact/token-counter.js +108 -0
  58. package/dist/core/consensus/anvil-fanout.js +25 -25
  59. package/dist/core/consensus/diff-capture.js +121 -12
  60. package/dist/core/consensus/rubric.js +21 -21
  61. package/dist/core/context/builder.js +6 -6
  62. package/dist/core/context/compaction-events.js +8 -8
  63. package/dist/core/context/compaction.js +31 -31
  64. package/dist/core/context/index.js +15 -8
  65. package/dist/core/context/invariants.js +51 -51
  66. package/dist/core/context/markdown-loader.js +28 -10
  67. package/dist/core/context/markdown-traverse.js +255 -0
  68. package/dist/core/context/pugiignore.js +41 -41
  69. package/dist/core/context/repo-skeleton.js +37 -37
  70. package/dist/core/context/tool-eviction.js +55 -0
  71. package/dist/core/context/watcher.js +32 -32
  72. package/dist/core/context/working-set.js +23 -23
  73. package/dist/core/coordinator/agent-tools.js +77 -0
  74. package/dist/core/coordinator/agent-toolset.js +65 -0
  75. package/dist/core/coordinator/fsm.js +73 -0
  76. package/dist/core/coordinator/mode-fsm.js +70 -0
  77. package/dist/core/cost/rate-card.js +129 -0
  78. package/dist/core/cost/tracker.js +221 -0
  79. package/dist/core/credentials.js +13 -13
  80. package/dist/core/cron/scheduler.js +138 -0
  81. package/dist/core/denial-tracking/index.js +8 -0
  82. package/dist/core/denial-tracking/state.js +264 -0
  83. package/dist/core/diagnostics/probe-runner.js +93 -0
  84. package/dist/core/diagnostics/probes/api.js +46 -0
  85. package/dist/core/diagnostics/probes/auth.js +93 -0
  86. package/dist/core/diagnostics/probes/bare-mode.js +42 -0
  87. package/dist/core/diagnostics/probes/cli-version.js +127 -0
  88. package/dist/core/diagnostics/probes/config.js +72 -0
  89. package/dist/core/diagnostics/probes/denial-tracking.js +57 -0
  90. package/dist/core/diagnostics/probes/disk.js +81 -0
  91. package/dist/core/diagnostics/probes/engine-live.js +46 -0
  92. package/dist/core/diagnostics/probes/git.js +65 -0
  93. package/dist/core/diagnostics/probes/hooks.js +118 -0
  94. package/dist/core/diagnostics/probes/mcp.js +75 -0
  95. package/dist/core/diagnostics/probes/node.js +59 -0
  96. package/dist/core/diagnostics/probes/pnpm.js +36 -0
  97. package/dist/core/diagnostics/probes/pugi-md.js +89 -0
  98. package/dist/core/diagnostics/probes/sandbox.js +67 -0
  99. package/dist/core/diagnostics/probes/session.js +74 -0
  100. package/dist/core/diagnostics/probes/status-snapshot.js +488 -0
  101. package/dist/core/diagnostics/probes/workspace.js +63 -0
  102. package/dist/core/diagnostics/types.js +70 -0
  103. package/dist/core/dispatch/cache-cleanup.js +197 -0
  104. package/dist/core/dispatch/cache-handoff.js +295 -0
  105. package/dist/core/edits/apply-patch-layer-e.js +189 -0
  106. package/dist/core/edits/dispatch.js +333 -7
  107. package/dist/core/edits/format-detector.js +260 -0
  108. package/dist/core/edits/format-matrix.js +26 -0
  109. package/dist/core/edits/fuzzy-ladder.js +650 -0
  110. package/dist/core/edits/index.js +5 -1
  111. package/dist/core/edits/journal.js +199 -0
  112. package/dist/core/edits/layer-a-apply.js +15 -15
  113. package/dist/core/edits/layer-a-fuzzy-apply.js +198 -0
  114. package/dist/core/edits/layer-b-apply.js +9 -9
  115. package/dist/core/edits/layer-c-apply.js +6 -6
  116. package/dist/core/edits/layer-d-ast.js +557 -14
  117. package/dist/core/edits/marker-parser.js +12 -12
  118. package/dist/core/edits/security-gate.js +27 -27
  119. package/dist/core/edits/verify-hook.js +273 -0
  120. package/dist/core/edits/worktree.js +29 -29
  121. package/dist/core/engine/anvil-client.js +214 -26
  122. package/dist/core/engine/auto-compact.js +247 -0
  123. package/dist/core/engine/budgets.js +220 -0
  124. package/dist/core/engine/compact-llm-summarizer.js +124 -0
  125. package/dist/core/engine/context-prefix.js +155 -0
  126. package/dist/core/engine/index.js +1 -1
  127. package/dist/core/engine/intensity.js +163 -0
  128. package/dist/core/engine/intent.js +260 -0
  129. package/dist/core/engine/native-pugi.js +1559 -227
  130. package/dist/core/engine/prompts.js +219 -19
  131. package/dist/core/engine/strip-internal-fields.js +124 -0
  132. package/dist/core/engine/tool-bridge.js +1887 -59
  133. package/dist/core/engine/verification-patterns.js +195 -0
  134. package/dist/core/eval/v1/ledger.js +83 -0
  135. package/dist/core/eval/v1/runner.js +280 -0
  136. package/dist/core/eval/v1/scoring.js +68 -0
  137. package/dist/core/eval/v1/task-loader.js +191 -0
  138. package/dist/core/eval/v1/types.js +14 -0
  139. package/dist/core/eval/v1/verifier.js +176 -0
  140. package/dist/core/eval/v1/yaml-parser.js +250 -0
  141. package/dist/core/evaluation/golden-dataset.js +293 -0
  142. package/dist/core/feedback/queue.js +177 -0
  143. package/dist/core/feedback/submitter.js +145 -0
  144. package/dist/core/file-cache.js +113 -1
  145. package/dist/core/flatten/flatten-repo.js +439 -0
  146. package/dist/core/format/osc8-link.js +28 -0
  147. package/dist/core/hook-chains.js +392 -0
  148. package/dist/core/hooks/citation-verify-hook.js +138 -0
  149. package/dist/core/hooks/citation-verify.js +112 -0
  150. package/dist/core/hooks/events.js +46 -0
  151. package/dist/core/hooks/index.js +15 -0
  152. package/dist/core/hooks/registry.js +216 -0
  153. package/dist/core/hooks/runner.js +236 -0
  154. package/dist/core/hooks/v2/event-emitter.js +115 -0
  155. package/dist/core/hooks/v2/executor.js +282 -0
  156. package/dist/core/hooks/v2/index.js +25 -0
  157. package/dist/core/hooks/v2/lifecycle.js +104 -0
  158. package/dist/core/hooks/v2/loader.js +216 -0
  159. package/dist/core/hooks/v2/matcher.js +125 -0
  160. package/dist/core/hooks/v2/trust.js +143 -0
  161. package/dist/core/hooks/v2/types.js +86 -0
  162. package/dist/core/hooks/worktree-events.js +158 -0
  163. package/dist/core/image/renderer.js +71 -0
  164. package/dist/core/init/detector.js +582 -0
  165. package/dist/core/init/template-renderer.js +242 -0
  166. package/dist/core/jobs/registry.js +18 -18
  167. package/dist/core/ledger/results-tsv.js +142 -0
  168. package/dist/core/log-discipline/stdout-redirect.js +51 -0
  169. package/dist/core/lsp/cache.js +105 -0
  170. package/dist/core/lsp/client.js +551 -41
  171. package/dist/core/lsp/language-detect.js +66 -0
  172. package/dist/core/lsp/post-edit-diagnostics.js +171 -0
  173. package/dist/core/lsp/server-detect.js +173 -0
  174. package/dist/core/lsp/symbol-cache.js +162 -0
  175. package/dist/core/lsp/symbol-tools.js +664 -0
  176. package/dist/core/mcp/client.js +97 -28
  177. package/dist/core/mcp/http-server.js +553 -0
  178. package/dist/core/mcp/orchestrator-config.js +192 -0
  179. package/dist/core/mcp/orchestrator-tools.js +806 -0
  180. package/dist/core/mcp/permission.js +190 -0
  181. package/dist/core/mcp/registry.js +39 -17
  182. package/dist/core/mcp/server-tools.js +219 -0
  183. package/dist/core/mcp/server.js +397 -0
  184. package/dist/core/mcp/trust.js +10 -10
  185. package/dist/core/memory/dual-write.js +416 -0
  186. package/dist/core/memory/passive-extract.js +130 -0
  187. package/dist/core/memory/phase1-kinds.js +20 -0
  188. package/dist/core/memory/secret-scanner.js +304 -0
  189. package/dist/core/memory-sync/queue.js +170 -0
  190. package/dist/core/metrics/extract.js +113 -0
  191. package/dist/core/modes/roo-modes.js +68 -0
  192. package/dist/core/notes/notes-paths.js +113 -0
  193. package/dist/core/notes/notes-recorder.js +140 -0
  194. package/dist/core/notes/notes-writer.js +53 -0
  195. package/dist/core/notes/renderers.js +0 -0
  196. package/dist/core/notes/slug.js +105 -0
  197. package/dist/core/onboarding/ensure-initialized.js +133 -0
  198. package/dist/core/onboarding/marker.js +111 -0
  199. package/dist/core/onboarding/telemetry-state.js +108 -0
  200. package/dist/core/output-style/presets.js +176 -0
  201. package/dist/core/output-style/state.js +185 -0
  202. package/dist/core/path-security.js +287 -5
  203. package/dist/core/permission.js +82 -22
  204. package/dist/core/permissions/auto-classifier.js +124 -0
  205. package/dist/core/permissions/bash-parser.js +371 -0
  206. package/dist/core/permissions/circuit-breaker.js +83 -0
  207. package/dist/core/permissions/constrained-edit.js +91 -0
  208. package/dist/core/permissions/gate.js +278 -0
  209. package/dist/core/permissions/index.js +20 -0
  210. package/dist/core/permissions/mode.js +174 -0
  211. package/dist/core/permissions/network-egress.js +137 -0
  212. package/dist/core/permissions/state.js +241 -0
  213. package/dist/core/permissions/tool-class.js +107 -0
  214. package/dist/core/plan-mode/ui-state.js +51 -0
  215. package/dist/core/plans/plan-artifact.js +721 -0
  216. package/dist/core/policy-limits/etag-store.js +122 -0
  217. package/dist/core/prd-check/parser.js +215 -0
  218. package/dist/core/prd-check/reporter.js +127 -0
  219. package/dist/core/prd-check/session-review.js +557 -0
  220. package/dist/core/prd-check/verifiers.js +223 -0
  221. package/dist/core/prompt-cache/client-cache.js +99 -0
  222. package/dist/core/prompts/assembly.js +29 -0
  223. package/dist/core/prompts/registry.js +364 -0
  224. package/dist/core/pugi-gitignore.js +52 -0
  225. package/dist/core/pugi-md/cc-compat-rules.js +735 -0
  226. package/dist/core/pugi-md/context-injector.js +76 -0
  227. package/dist/core/pugi-md/walk-up.js +207 -0
  228. package/dist/core/python/uv-installer.js +270 -0
  229. package/dist/core/python/uv-resolver.js +83 -0
  230. package/dist/core/rate-limit/narrator.js +146 -0
  231. package/dist/core/recipes/cli-types.js +20 -0
  232. package/dist/core/recipes/loader.js +103 -0
  233. package/dist/core/recipes/runner.js +345 -0
  234. package/dist/core/recipes/schema.js +587 -0
  235. package/dist/core/release-notes/parser.js +241 -0
  236. package/dist/core/release-notes/state.js +116 -0
  237. package/dist/core/repl/ask.js +37 -37
  238. package/dist/core/repl/cancellation.js +26 -26
  239. package/dist/core/repl/cap-warning.js +4 -4
  240. package/dist/core/repl/clipboard-read.js +11 -11
  241. package/dist/core/repl/dispatch-fsm.js +12 -12
  242. package/dist/core/repl/engine-bridge.js +303 -0
  243. package/dist/core/repl/history-search.js +15 -15
  244. package/dist/core/repl/history.js +28 -18
  245. package/dist/core/repl/kill-ring.js +5 -5
  246. package/dist/core/repl/model-pricing.js +135 -0
  247. package/dist/core/repl/privacy-banner.js +22 -22
  248. package/dist/core/repl/session.js +2690 -229
  249. package/dist/core/repl/slash-commands.js +540 -41
  250. package/dist/core/repl/store/index.js +1 -1
  251. package/dist/core/repl/store/jsonl-log.js +22 -22
  252. package/dist/core/repl/store/lockfile.js +10 -10
  253. package/dist/core/repl/store/session-store.js +136 -107
  254. package/dist/core/repl/store/types.js +15 -15
  255. package/dist/core/repl/store/uuid-v7.js +12 -12
  256. package/dist/core/repl/tool-route.js +382 -0
  257. package/dist/core/repl/workspace-context.js +43 -21
  258. package/dist/core/repo-map/build.js +125 -0
  259. package/dist/core/repo-map/cache.js +185 -0
  260. package/dist/core/repo-map/extractor.js +254 -0
  261. package/dist/core/repo-map/formatter.js +145 -0
  262. package/dist/core/repo-map/page-rank.js +105 -0
  263. package/dist/core/repo-map/scanner.js +211 -0
  264. package/dist/core/retro/git-collector.js +251 -0
  265. package/dist/core/retro/health-card.js +25 -0
  266. package/dist/core/retro/metrics.js +342 -0
  267. package/dist/core/retro/narrative.js +249 -0
  268. package/dist/core/retro/plane-collector.js +274 -0
  269. package/dist/core/retro/pr-issue-link.js +65 -0
  270. package/dist/core/retro/types.js +16 -0
  271. package/dist/core/retry-budget/budget.js +284 -0
  272. package/dist/core/retry-budget/index.js +5 -0
  273. package/dist/core/retry-budget/retry-cap.js +74 -0
  274. package/dist/core/routing/lead-worker.js +43 -0
  275. package/dist/core/routing/pre-flight-estimator.js +108 -0
  276. package/dist/core/runs/run-tree.js +103 -0
  277. package/dist/core/sandboxing/adapter.js +43 -0
  278. package/dist/core/sandboxing/bubblewrap.js +209 -0
  279. package/dist/core/sandboxing/index.js +78 -0
  280. package/dist/core/sandboxing/none.js +19 -0
  281. package/dist/core/sandboxing/policy.js +97 -0
  282. package/dist/core/sandboxing/seatbelt.js +231 -0
  283. package/dist/core/security/injection-scanner.js +367 -0
  284. package/dist/core/security/output-filter.js +418 -0
  285. package/dist/core/session/env-file.js +105 -0
  286. package/dist/core/session/section-budgets.js +140 -0
  287. package/dist/core/session.js +119 -0
  288. package/dist/core/settings.js +402 -5
  289. package/dist/core/share/formatter.js +271 -0
  290. package/dist/core/share/redactor.js +221 -0
  291. package/dist/core/share/uploader.js +267 -0
  292. package/dist/core/skills/defaults.js +30 -30
  293. package/dist/core/skills/loader.js +22 -22
  294. package/dist/core/skills/sources.js +27 -27
  295. package/dist/core/smoke/headless-driver.js +174 -0
  296. package/dist/core/smoke/orchestrator.js +194 -0
  297. package/dist/core/smoke/runner.js +238 -0
  298. package/dist/core/smoke/scenario-parser.js +316 -0
  299. package/dist/core/statusline.js +99 -0
  300. package/dist/core/subagents/dispatcher-real.js +600 -0
  301. package/dist/core/subagents/dispatcher.js +146 -52
  302. package/dist/core/subagents/index.js +19 -6
  303. package/dist/core/subagents/isolation-matrix.js +213 -0
  304. package/dist/core/subagents/spawn.js +19 -4
  305. package/dist/core/telemetry/emitter.js +229 -0
  306. package/dist/core/telemetry/queue.js +251 -0
  307. package/dist/core/theme/context.js +91 -0
  308. package/dist/core/theme/presets.js +228 -0
  309. package/dist/core/theme/state.js +181 -0
  310. package/dist/core/todos/invariant.js +10 -0
  311. package/dist/core/todos/state.js +177 -0
  312. package/dist/core/tool-schema/compressor.js +89 -0
  313. package/dist/core/transport/version-interceptor.js +166 -0
  314. package/dist/core/trust.js +2 -2
  315. package/dist/core/tui/thinking-block.js +64 -0
  316. package/dist/core/vim/keymap.js +288 -0
  317. package/dist/core/vim/state.js +92 -0
  318. package/dist/core/watch-markers/marker-watcher.js +133 -0
  319. package/dist/core/worktree/include-parser.js +249 -0
  320. package/dist/core/worktree-manager/cleanup.js +123 -0
  321. package/dist/core/worktree-manager/manager.js +303 -0
  322. package/dist/index.js +36 -0
  323. package/dist/runtime/bootstrap.js +190 -0
  324. package/dist/runtime/cli.js +4403 -561
  325. package/dist/runtime/commands/agents.js +31 -31
  326. package/dist/runtime/commands/budget.js +5 -5
  327. package/dist/runtime/commands/cancel.js +231 -0
  328. package/dist/runtime/commands/chain.js +489 -0
  329. package/dist/runtime/commands/codegraph-status.js +227 -0
  330. package/dist/runtime/commands/compact.js +297 -0
  331. package/dist/runtime/commands/config.js +74 -40
  332. package/dist/runtime/commands/cost.js +199 -0
  333. package/dist/runtime/commands/delegate.js +27 -4
  334. package/dist/runtime/commands/dispatch.js +126 -0
  335. package/dist/runtime/commands/doctor.js +579 -0
  336. package/dist/runtime/commands/eval-v1.js +266 -0
  337. package/dist/runtime/commands/feedback.js +184 -0
  338. package/dist/runtime/commands/hooks.js +187 -0
  339. package/dist/runtime/commands/index-cmd.js +459 -0
  340. package/dist/runtime/commands/init.js +254 -0
  341. package/dist/runtime/commands/lsp.js +200 -38
  342. package/dist/runtime/commands/mcp.js +935 -0
  343. package/dist/runtime/commands/memory.js +582 -0
  344. package/dist/runtime/commands/model.js +237 -0
  345. package/dist/runtime/commands/onboarding.js +275 -0
  346. package/dist/runtime/commands/patch.js +12 -12
  347. package/dist/runtime/commands/permissions.js +112 -0
  348. package/dist/runtime/commands/plan.js +143 -0
  349. package/dist/runtime/commands/prd-check.js +285 -0
  350. package/dist/runtime/commands/privacy.js +17 -17
  351. package/dist/runtime/commands/recipe.js +325 -0
  352. package/dist/runtime/commands/redo-blob-store.js +92 -0
  353. package/dist/runtime/commands/redo.js +361 -0
  354. package/dist/runtime/commands/release-notes.js +229 -0
  355. package/dist/runtime/commands/repo-map.js +95 -0
  356. package/dist/runtime/commands/report.js +299 -0
  357. package/dist/runtime/commands/resume.js +118 -0
  358. package/dist/runtime/commands/review-consensus.js +68 -53
  359. package/dist/runtime/commands/rewind.js +333 -0
  360. package/dist/runtime/commands/roster.js +14 -14
  361. package/dist/runtime/commands/servers-cli.js +182 -0
  362. package/dist/runtime/commands/servers.js +236 -0
  363. package/dist/runtime/commands/sessions.js +163 -0
  364. package/dist/runtime/commands/share.js +316 -0
  365. package/dist/runtime/commands/skills.js +31 -31
  366. package/dist/runtime/commands/status.js +186 -0
  367. package/dist/runtime/commands/stickers.js +82 -0
  368. package/dist/runtime/commands/style.js +194 -0
  369. package/dist/runtime/commands/theme.js +196 -0
  370. package/dist/runtime/commands/undo.js +54 -22
  371. package/dist/runtime/commands/update.js +289 -0
  372. package/dist/runtime/commands/vim.js +140 -0
  373. package/dist/runtime/commands/worktree.js +8 -8
  374. package/dist/runtime/commands/worktrees.js +155 -0
  375. package/dist/runtime/deprecation-warning.js +69 -0
  376. package/dist/runtime/engine-exit-code.js +50 -0
  377. package/dist/runtime/headless-repl.js +195 -0
  378. package/dist/runtime/headless.js +548 -0
  379. package/dist/runtime/load-hooks-or-exit.js +71 -0
  380. package/dist/runtime/plan-decompose.js +22 -22
  381. package/dist/runtime/sigint-guard.js +272 -0
  382. package/dist/runtime/stream-renderer.js +195 -0
  383. package/dist/runtime/update-check.js +28 -28
  384. package/dist/runtime/version.js +65 -0
  385. package/dist/runtime/worktree-bootstrap.js +579 -0
  386. package/dist/skills/bundled/batch.js +617 -0
  387. package/dist/skills/bundled/index.js +45 -0
  388. package/dist/skills/bundled/loop.js +358 -0
  389. package/dist/skills/bundled/remember.js +383 -0
  390. package/dist/skills/bundled/simplify.js +289 -0
  391. package/dist/skills/bundled/skillify.js +373 -0
  392. package/dist/skills/bundled/stuck.js +558 -0
  393. package/dist/skills/bundled/verify.js +439 -0
  394. package/dist/testing/vcr.js +486 -0
  395. package/dist/tools/agent-tool.js +229 -0
  396. package/dist/tools/apply-patch.js +89 -28
  397. package/dist/tools/ask-user-question.js +337 -0
  398. package/dist/tools/ask-user.js +115 -0
  399. package/dist/tools/bash.js +811 -49
  400. package/dist/tools/brief.js +224 -0
  401. package/dist/tools/cron.js +433 -0
  402. package/dist/tools/enter-worktree.js +250 -0
  403. package/dist/tools/exit-worktree.js +147 -0
  404. package/dist/tools/file-tools.js +161 -44
  405. package/dist/tools/http-request.js +336 -0
  406. package/dist/tools/lsp-tools.js +377 -1
  407. package/dist/tools/mcp-tool.js +260 -0
  408. package/dist/tools/multi-edit.js +361 -0
  409. package/dist/tools/powershell.js +268 -0
  410. package/dist/tools/registry.js +120 -5
  411. package/dist/tools/server-tools.js +892 -0
  412. package/dist/tools/skill-tool.js +96 -0
  413. package/dist/tools/sleep.js +99 -0
  414. package/dist/tools/synthetic-output.js +133 -0
  415. package/dist/tools/tasks.js +208 -0
  416. package/dist/tools/todo-write.js +184 -0
  417. package/dist/tools/verify-plan-execution.js +295 -0
  418. package/dist/tools/web-fetch-injection-scanner.js +207 -0
  419. package/dist/tools/web-fetch.js +195 -10
  420. package/dist/tools/web-search.js +458 -0
  421. package/dist/tui/agent-progress-card.js +111 -0
  422. package/dist/tui/agent-tree.js +22 -1
  423. package/dist/tui/ask-modal.js +14 -14
  424. package/dist/tui/ask-user-question-chips.js +315 -0
  425. package/dist/tui/ask-user-question-prompt.js +203 -0
  426. package/dist/tui/compact-banner.js +81 -0
  427. package/dist/tui/conversation-pane.js +85 -11
  428. package/dist/tui/cost-table.js +111 -0
  429. package/dist/tui/device-flow.js +2 -2
  430. package/dist/tui/doctor-table.js +46 -0
  431. package/dist/tui/feedback-prompt.js +156 -0
  432. package/dist/tui/input-box.js +247 -32
  433. package/dist/tui/login-picker.js +3 -3
  434. package/dist/tui/markdown-render.js +6 -6
  435. package/dist/tui/multi-file-diff-approval.js +375 -0
  436. package/dist/tui/onboarding-wizard.js +240 -0
  437. package/dist/tui/permissions-picker.js +86 -0
  438. package/dist/tui/render.js +36 -1
  439. package/dist/tui/repl-render.js +239 -25
  440. package/dist/tui/repl-splash-art.js +16 -16
  441. package/dist/tui/repl-splash-mascot.js +48 -24
  442. package/dist/tui/repl-splash.js +22 -22
  443. package/dist/tui/repl.js +125 -45
  444. package/dist/tui/slash-palette.js +6 -6
  445. package/dist/tui/splash.js +2 -2
  446. package/dist/tui/status-bar.js +109 -31
  447. package/dist/tui/status-table.js +7 -0
  448. package/dist/tui/stickers-art.js +136 -0
  449. package/dist/tui/style-table.js +28 -0
  450. package/dist/tui/theme-table.js +29 -0
  451. package/dist/tui/thinking-spinner.js +123 -0
  452. package/dist/tui/tool-stream-pane.js +53 -4
  453. package/dist/tui/update-banner.js +27 -2
  454. package/dist/tui/vim-input.js +267 -0
  455. package/dist/tui/welcome-banner.js +107 -0
  456. package/dist/tui/welcome-data.js +293 -0
  457. package/dist/tui/workspace-context.js +2 -2
  458. package/package.json +29 -6
  459. package/test/scenarios/codegen-create-file.scenario.txt +13 -0
  460. package/test/scenarios/compact-force.scenario.txt +12 -0
  461. package/test/scenarios/identity.scenario.txt +11 -0
  462. package/test/scenarios/persona-handoff.scenario.txt +12 -0
  463. package/test/scenarios/walkback.scenario.txt +12 -0
  464. package/dist/core/engine/compaction-hook.js +0 -154
@@ -0,0 +1,56 @@
1
+ ; JavaScript symbol + edge query - used by core/codegraph/parser.ts.
2
+ ;
3
+ ; Capture-name convention matches the TS query; the extractor is
4
+ ; language-agnostic at the capture-parsing layer.
5
+ ;
6
+ ; tree-sitter-javascript covers JS + JSX in a single grammar. .mjs and
7
+ ; .cjs route here too. We intentionally do NOT extract `var` declarations -
8
+ ; they leak across enclosing scopes and the resulting Symbol rows would
9
+ ; be misleading. `let` / `const` only.
10
+ ;
11
+ ; SymbolKind coverage:
12
+ ; function - function_declaration, generator_function_declaration
13
+ ; class - class_declaration
14
+ ; method - method_definition
15
+ ; variable - lexical_declaration single-identifier binding
16
+ ; import - import_specifier / default-import identifier
17
+ ;
18
+ ; (No interface / type kinds in JS - they live in TS-only.)
19
+ ;
20
+ ; EdgeKind coverage:
21
+ ; calls - call_expression bare ID + member-access function
22
+ ; extends - class extends parent identifier
23
+
24
+ (function_declaration
25
+ name: (identifier) @symbol.function.name) @symbol.function.def
26
+
27
+ (generator_function_declaration
28
+ name: (identifier) @symbol.function.name) @symbol.function.def
29
+
30
+ (class_declaration
31
+ name: (identifier) @symbol.class.name) @symbol.class.def
32
+
33
+ (method_definition
34
+ name: (property_identifier) @symbol.method.name) @symbol.method.def
35
+
36
+ (lexical_declaration
37
+ (variable_declarator
38
+ name: (identifier) @symbol.variable.name)) @symbol.variable.def
39
+
40
+ (import_specifier
41
+ name: (identifier) @symbol.import.name) @symbol.import.def
42
+
43
+ (import_clause
44
+ (identifier) @symbol.import.name) @symbol.import.def
45
+
46
+ (call_expression
47
+ function: (identifier) @edge.calls.target)
48
+
49
+ (call_expression
50
+ function: (member_expression
51
+ property: (property_identifier) @edge.calls.target))
52
+
53
+ (class_declaration
54
+ name: (identifier) @edge.extends.from
55
+ (class_heritage
56
+ (identifier) @edge.extends.target))
@@ -0,0 +1,55 @@
1
+ ; Python symbol + edge query - used by core/codegraph/parser.ts.
2
+ ;
3
+ ; SymbolKind coverage:
4
+ ; function - function_definition (top-level OR nested - parser.ts
5
+ ; computes scope by walking parents so nested defs
6
+ ; appear as `Class.method` etc.)
7
+ ; class - class_definition
8
+ ; variable - top-level identifier assignment
9
+ ; import - import_from_statement / import_statement names
10
+ ;
11
+ ; EdgeKind coverage:
12
+ ; calls - call where the function is an identifier or attribute
13
+ ; extends - class superclass argument list (`class C(A, B):`)
14
+ ;
15
+ ; Python has no `implements` concept in the grammar (Protocols + ABCs
16
+ ; are runtime checks), so that edge kind stays empty here.
17
+
18
+ (function_definition
19
+ name: (identifier) @symbol.function.name) @symbol.function.def
20
+
21
+ (class_definition
22
+ name: (identifier) @symbol.class.name) @symbol.class.def
23
+
24
+ ; Top-level single-target assignments: `FOO = 1`. Restricted to the
25
+ ; simplest left side to avoid noise from destructuring.
26
+ (expression_statement
27
+ (assignment
28
+ left: (identifier) @symbol.variable.name)) @symbol.variable.def
29
+
30
+ ; `from x import a, b as c` - names captured per identifier.
31
+ (import_from_statement
32
+ name: (dotted_name (identifier) @symbol.import.name)) @symbol.import.def
33
+
34
+ (import_from_statement
35
+ name: (aliased_import (dotted_name (identifier) @symbol.import.name))) @symbol.import.def
36
+
37
+ ; `import foo` (single name).
38
+ (import_statement
39
+ name: (dotted_name (identifier) @symbol.import.name)) @symbol.import.def
40
+
41
+ ; Call expressions: bare identifier OR attribute (`foo.bar()`).
42
+ (call
43
+ function: (identifier) @edge.calls.target)
44
+
45
+ (call
46
+ function: (attribute
47
+ attribute: (identifier) @edge.calls.target))
48
+
49
+ ; Class superclass: `class C(A, B):` - emit one extends edge per
50
+ ; argument identifier. The scope walk in parser.ts resolves the
51
+ ; enclosing class as the source.
52
+ (class_definition
53
+ name: (identifier) @edge.extends.from
54
+ superclasses: (argument_list
55
+ (identifier) @edge.extends.target))
@@ -0,0 +1,63 @@
1
+ ; Rust symbol + edge query - used by core/codegraph/parser.ts.
2
+ ;
3
+ ; SymbolKind coverage:
4
+ ; function - function_item (`fn foo`). Methods (inside impl_item)
5
+ ; also map to `function` for v1; the scope walk in
6
+ ; parser.ts disambiguates via the dotted path.
7
+ ; class - struct_item. Rust has no `class`; struct is the
8
+ ; closest analog so `code_callers` queries work
9
+ ; consistently across languages.
10
+ ; interface - trait_item.
11
+ ; type - enum_item, type_item (type alias).
12
+ ; variable - const_item / static_item at the top level.
13
+ ; import - use_declaration terminal identifier.
14
+ ;
15
+ ; EdgeKind coverage:
16
+ ; calls - call_expression with identifier OR field-expression call.
17
+ ; extends - impl_item that implements a trait for a type. Rust
18
+ ; does not inherit; we reuse `extends` here to model
19
+ ; trait-implementation as the closest cross-language analog.
20
+
21
+ (function_item
22
+ name: (identifier) @symbol.function.name) @symbol.function.def
23
+
24
+ (struct_item
25
+ name: (type_identifier) @symbol.class.name) @symbol.class.def
26
+
27
+ (trait_item
28
+ name: (type_identifier) @symbol.interface.name) @symbol.interface.def
29
+
30
+ (enum_item
31
+ name: (type_identifier) @symbol.type.name) @symbol.type.def
32
+
33
+ (type_item
34
+ name: (type_identifier) @symbol.type.name) @symbol.type.def
35
+
36
+ ; const FOO: T = 1; / static FOO: T = 1;
37
+ (const_item
38
+ name: (identifier) @symbol.variable.name) @symbol.variable.def
39
+
40
+ (static_item
41
+ name: (identifier) @symbol.variable.name) @symbol.variable.def
42
+
43
+ ; Imports: tree-sitter-rust models `use a::b::c` as nested
44
+ ; scoped_use_list / scoped_identifier. We capture the simplest forms.
45
+ (use_declaration
46
+ argument: (identifier) @symbol.import.name) @symbol.import.def
47
+
48
+ (use_declaration
49
+ argument: (scoped_identifier
50
+ name: (identifier) @symbol.import.name)) @symbol.import.def
51
+
52
+ ; Calls: bare and method.
53
+ (call_expression
54
+ function: (identifier) @edge.calls.target)
55
+
56
+ (call_expression
57
+ function: (field_expression
58
+ field: (field_identifier) @edge.calls.target))
59
+
60
+ ; `impl Trait for Type { ... }` - emit a `extends` edge from Type -> Trait.
61
+ (impl_item
62
+ trait: (type_identifier) @edge.extends.target
63
+ type: (type_identifier) @edge.extends.from)
@@ -0,0 +1,91 @@
1
+ ; TypeScript symbol + edge query - used by core/codegraph/parser.ts.
2
+ ;
3
+ ; Capture naming convention drives the extractor:
4
+ ; @symbol.<kind>.def binds to the AST node spanning the whole declaration
5
+ ; (used for line/column anchor).
6
+ ; @symbol.<kind>.name binds to the identifier node (used for `name`).
7
+ ; @edge.<kind>.from enclosing definition that originates the edge.
8
+ ; @edge.<kind>.target identifier whose name resolves to the edge target.
9
+ ;
10
+ ; tree-sitter-typescript ships separate grammars for typescript and tsx; both
11
+ ; share the bulk of node names below. The same query runs against both
12
+ ; languages - the extractor wires both grammars to this file.
13
+ ;
14
+ ; SymbolKind coverage (per types.ts):
15
+ ; function - function_declaration, generator_function_declaration
16
+ ; class - class_declaration, abstract_class_declaration
17
+ ; method - method_definition, abstract_method_signature
18
+ ; interface - interface_declaration
19
+ ; type - type_alias_declaration, enum_declaration
20
+ ; variable - lexical_declaration single-identifier binding (let/const)
21
+ ; import - import_specifier (named imports) and default-import identifier
22
+ ;
23
+ ; EdgeKind coverage:
24
+ ; calls - call_expression where function is identifier or member.
25
+ ; extends - class extends_clause target
26
+ ; implements - class implements_clause target (TS-only)
27
+
28
+ ; --- functions ---
29
+ (function_declaration
30
+ name: (identifier) @symbol.function.name) @symbol.function.def
31
+
32
+ (generator_function_declaration
33
+ name: (identifier) @symbol.function.name) @symbol.function.def
34
+
35
+ ; --- classes ---
36
+ (class_declaration
37
+ name: (type_identifier) @symbol.class.name) @symbol.class.def
38
+
39
+ (abstract_class_declaration
40
+ name: (type_identifier) @symbol.class.name) @symbol.class.def
41
+
42
+ ; --- methods (inside class bodies) ---
43
+ (method_definition
44
+ name: (property_identifier) @symbol.method.name) @symbol.method.def
45
+
46
+ (abstract_method_signature
47
+ name: (property_identifier) @symbol.method.name) @symbol.method.def
48
+
49
+ ; --- interfaces ---
50
+ (interface_declaration
51
+ name: (type_identifier) @symbol.interface.name) @symbol.interface.def
52
+
53
+ ; --- types / enums ---
54
+ (type_alias_declaration
55
+ name: (type_identifier) @symbol.type.name) @symbol.type.def
56
+
57
+ (enum_declaration
58
+ name: (identifier) @symbol.type.name) @symbol.type.def
59
+
60
+ ; --- top-level variables (let / const single binding) ---
61
+ (lexical_declaration
62
+ (variable_declarator
63
+ name: (identifier) @symbol.variable.name)) @symbol.variable.def
64
+
65
+ ; --- imports ---
66
+ (import_specifier
67
+ name: (identifier) @symbol.import.name) @symbol.import.def
68
+
69
+ (import_clause
70
+ (identifier) @symbol.import.name) @symbol.import.def
71
+
72
+ ; --- calls (edges) ---
73
+ (call_expression
74
+ function: (identifier) @edge.calls.target)
75
+
76
+ (call_expression
77
+ function: (member_expression
78
+ property: (property_identifier) @edge.calls.target))
79
+
80
+ ; --- class extends / implements (edges) ---
81
+ (class_declaration
82
+ name: (type_identifier) @edge.extends.from
83
+ (class_heritage
84
+ (extends_clause
85
+ value: [(identifier) (type_identifier)] @edge.extends.target)))
86
+
87
+ (class_declaration
88
+ name: (type_identifier) @edge.implements.from
89
+ (class_heritage
90
+ (implements_clause
91
+ [(type_identifier) (generic_type) (predefined_type)] @edge.implements.target)))
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Pugi local symbol index - reindex orchestrator (PR L1).
3
+ *
4
+ * Wires the workspace walk against `parser.parseFile` and writes the
5
+ * results into `db.ts`. The orchestrator is the only consumer of
6
+ * `PendingEdge` - it resolves names to SQLite row ids per file and
7
+ * drops orphans before calling `insertEdges`. The contract types in
8
+ * `types.ts` stay frozen.
9
+ *
10
+ * Workspace walk is intentionally minimal:
11
+ * - Use `tinyglobby` to enumerate `**\/*.{ext}` for the v1 extension
12
+ * set (see `parser.PARSEABLE_EXTENSIONS`).
13
+ * - Always skip `node_modules`, `.git`, `dist`, `build`, `.next`,
14
+ * `.turbo`, `.cache`, `coverage`, and `.pugi` itself - these are
15
+ * the same exclusions the existing `core/repo-map/scanner.ts`
16
+ * uses, kept inline here so the codegraph module can ship without
17
+ * pulling the broader scanner dependency tree.
18
+ * - Symlinks are not followed - same default as the rest of Pugi.
19
+ *
20
+ * The orchestrator returns a structured summary so the CLI layer
21
+ * can render a single-line operator-facing recap without parsing
22
+ * stdout. Every counter the operator might want is exposed.
23
+ */
24
+ import { createHash } from 'node:crypto';
25
+ import { readFileSync } from 'node:fs';
26
+ import { resolve, sep } from 'node:path';
27
+ import { glob } from 'tinyglobby';
28
+ import { deleteFile, insertEdges, insertSymbols, upsertFile, } from './db.js';
29
+ import { PARSEABLE_EXTENSIONS, parseFile } from './parser.js';
30
+ /** Default directories pruned from the walk. */
31
+ const PRUNE_DIRS = Object.freeze([
32
+ 'node_modules',
33
+ '.git',
34
+ 'dist',
35
+ 'build',
36
+ '.next',
37
+ '.turbo',
38
+ '.cache',
39
+ 'coverage',
40
+ '.pugi',
41
+ ]);
42
+ /**
43
+ * Walk the workspace, parse every supported file, and write symbols +
44
+ * edges into the open `IndexDB`. The DB is assumed to be open already -
45
+ * the caller (the CLI command) owns its lifecycle.
46
+ */
47
+ export async function reindexWorkspace(db, opts = {}) {
48
+ const start = Date.now();
49
+ const root = db.workspaceRoot;
50
+ const patterns = PARSEABLE_EXTENSIONS.map((ext) => `**/*${ext}`);
51
+ const matches = await glob(patterns, {
52
+ cwd: root,
53
+ ignore: PRUNE_DIRS.map((d) => `**/${d}/**`),
54
+ onlyFiles: true,
55
+ dot: false,
56
+ followSymbolicLinks: false,
57
+ });
58
+ /**
59
+ * Per-file index of name -> rowId after symbols are inserted. We
60
+ * use a Map per file so edges within a file can resolve their
61
+ * source side via `fromName`. Cross-file targets resolve via the
62
+ * cross-file global map.
63
+ */
64
+ const filesOut = [];
65
+ const work = [];
66
+ /** Cross-file map: target name -> first matching SQLite id. */
67
+ const globalNameMap = new Map();
68
+ let symbolsInserted = 0;
69
+ for (const m of matches) {
70
+ const abs = resolve(root, m);
71
+ const relPath = m.split(sep).join('/');
72
+ let bytes;
73
+ try {
74
+ bytes = readFileSync(abs, 'utf8');
75
+ }
76
+ catch {
77
+ // Disappeared mid-walk or unreadable - skip.
78
+ continue;
79
+ }
80
+ const result = await parseFile(abs, {
81
+ relPath,
82
+ quiet: opts.quiet === true,
83
+ sourceOverride: bytes,
84
+ });
85
+ // Delete prior rows for this file before re-inserting. Cheap on
86
+ // first run because the file row does not exist; cheap on
87
+ // re-runs because of `idx_symbols_file`.
88
+ deleteFile(db, relPath);
89
+ if (result.symbols.length === 0) {
90
+ // Still record the file fingerprint when applicable so the
91
+ // watcher's sha256 short-circuit works on subsequent runs.
92
+ if (result.language !== null) {
93
+ upsertFile(db, {
94
+ path: relPath,
95
+ sha256: sha256(bytes),
96
+ lastIndexedAt: new Date().toISOString(),
97
+ symbolCount: 0,
98
+ });
99
+ }
100
+ filesOut.push({
101
+ file: relPath,
102
+ language: result.language,
103
+ symbolCount: 0,
104
+ edgeCount: 0,
105
+ parseMs: result.parseMs,
106
+ });
107
+ continue;
108
+ }
109
+ const ids = insertSymbols(db, result.symbols);
110
+ symbolsInserted += ids.length;
111
+ const nameMap = new Map();
112
+ for (let i = 0; i < result.symbols.length; i += 1) {
113
+ const sym = result.symbols[i];
114
+ const id = ids[i];
115
+ if (!sym || id === undefined)
116
+ continue;
117
+ // Per-file canonical key includes scope so two `speak()`
118
+ // methods on different classes do not collide.
119
+ nameMap.set(scopedKey(sym.name, sym.scope), id);
120
+ nameMap.set(sym.name, id);
121
+ // Cross-file: keep the first definition we see. A later file
122
+ // with the same name does not overwrite - we want stability,
123
+ // not last-write-wins.
124
+ if (!globalNameMap.has(sym.name)) {
125
+ globalNameMap.set(sym.name, id);
126
+ }
127
+ }
128
+ upsertFile(db, {
129
+ path: relPath,
130
+ sha256: sha256(bytes),
131
+ lastIndexedAt: new Date().toISOString(),
132
+ symbolCount: ids.length,
133
+ });
134
+ work.push({
135
+ file: relPath,
136
+ pendingEdges: result.pendingEdges,
137
+ nameMap,
138
+ parseMs: result.parseMs,
139
+ });
140
+ filesOut.push({
141
+ file: relPath,
142
+ language: result.language,
143
+ symbolCount: ids.length,
144
+ // edgeCount filled in pass 2.
145
+ edgeCount: 0,
146
+ parseMs: result.parseMs,
147
+ });
148
+ }
149
+ // Second pass: resolve edges. Caller side prefers per-file scope
150
+ // match, falls back to bare name match. Target side prefers
151
+ // per-file match first (intra-file refs), then global (cross-file
152
+ // best effort).
153
+ let edgesInserted = 0;
154
+ let edgesOrphaned = 0;
155
+ for (let i = 0; i < work.length; i += 1) {
156
+ const item = work[i];
157
+ if (!item)
158
+ continue;
159
+ const resolved = [];
160
+ for (const pe of item.pendingEdges) {
161
+ const fromId = item.nameMap.get(scopedKey(pe.fromName, pe.fromScope)) ??
162
+ item.nameMap.get(pe.fromName);
163
+ if (fromId === undefined) {
164
+ // Caller side did not resolve - this means the .scm query
165
+ // captured an edge whose source declaration is not in the
166
+ // symbol table. Should not happen for well-formed files;
167
+ // we drop quietly.
168
+ edgesOrphaned += 1;
169
+ continue;
170
+ }
171
+ const toId = item.nameMap.get(pe.toName) ?? globalNameMap.get(pe.toName);
172
+ if (toId === undefined) {
173
+ // Target name was not found in this file's symbol table OR
174
+ // the cross-file map. Drop silently - the agent's
175
+ // code_callers query simply will not see this edge.
176
+ edgesOrphaned += 1;
177
+ continue;
178
+ }
179
+ // Self-recursion is a real edge: `fn foo() { foo(); }`. Keep
180
+ // it - PR L4 PageRank treats self-loops correctly, and the
181
+ // `code_callers` MCP tool already filters by edge kind so the
182
+ // self-loop does not pollute the caller list.
183
+ resolved.push({
184
+ fromSymbolId: fromId,
185
+ toSymbolId: toId,
186
+ kind: pe.kind,
187
+ });
188
+ }
189
+ if (resolved.length > 0) {
190
+ insertEdges(db, resolved);
191
+ edgesInserted += resolved.length;
192
+ const outIdx = filesOut.findIndex((f) => f.file === item.file);
193
+ if (outIdx >= 0) {
194
+ const existing = filesOut[outIdx];
195
+ if (existing) {
196
+ filesOut[outIdx] = { ...existing, edgeCount: resolved.length };
197
+ }
198
+ }
199
+ }
200
+ }
201
+ return {
202
+ filesScanned: matches.length,
203
+ filesIndexed: work.length,
204
+ symbolsInserted,
205
+ edgesInserted,
206
+ edgesOrphaned,
207
+ totalMs: Date.now() - start,
208
+ files: filesOut,
209
+ };
210
+ }
211
+ /** Compose a stable per-file scope+name lookup key. */
212
+ function scopedKey(name, scope) {
213
+ return scope.length > 0 ? `${scope}.${name}` : name;
214
+ }
215
+ function sha256(s) {
216
+ return createHash('sha256').update(s).digest('hex');
217
+ }
218
+ //# sourceMappingURL=reindex.js.map
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Pugi local symbol index - edge resolution helper (PR L2).
3
+ *
4
+ * Shared between `reindex.ts` (workspace walker) and `watcher.ts` (chokidar
5
+ * incremental updater). Resolves the name-keyed `PendingEdge[]` produced by
6
+ * the parser into row-id-keyed `Edge[]` that `db.ts:insertEdges` accepts.
7
+ *
8
+ * Why factored out:
9
+ *
10
+ * - PR L2 originally inlined this in two places; the duplicated bodies
11
+ * drifted on the third change. One reusable resolver keeps the
12
+ * invariants (per-file scoped key precedence, global fall-through,
13
+ * orphan handling) in one location.
14
+ * - The watcher's "global name map" is the live DB rather than an
15
+ * in-memory map built across the full walk - we expose a lookup
16
+ * callback so each caller plugs in its own source of truth.
17
+ *
18
+ * Resolution policy mirrors `reindex.ts:resolveEdges` exactly:
19
+ *
20
+ * 1. Caller side prefers per-file `scope.name` exact, falls back to
21
+ * bare `name`. Unresolved caller -> orphan, edge dropped.
22
+ * 2. Target side prefers the same per-file map (intra-file ref), then
23
+ * asks the cross-file lookup (db query or in-memory map).
24
+ * 3. Self-recursive edges (`fn foo() { foo() }`) are kept - PR L4
25
+ * PageRank treats self-loops correctly and the `code_callers` MCP
26
+ * tool filters by edge kind so it does not pollute caller lists.
27
+ */
28
+ /**
29
+ * Compose `scope.name` for map lookup. Mirrors `reindex.ts:scopedKey`.
30
+ * Empty scope collapses to the bare name so the empty-scope branch
31
+ * doesn't need a separate key form.
32
+ */
33
+ export function scopedKey(name, scope) {
34
+ return scope.length > 0 ? `${scope}.${name}` : name;
35
+ }
36
+ /**
37
+ * Resolve a parser file's `PendingEdge[]` against the per-file name
38
+ * map plus a cross-file lookup. The two callers wire `crossFile`
39
+ * differently:
40
+ *
41
+ * - reindex walker: in-memory `Map<name, id>` accumulated across the
42
+ * full pass (`globalNameMap`).
43
+ * - chokidar watcher: SQLite `SELECT id FROM symbols WHERE name = ?`
44
+ * closure over the open `IndexDB`.
45
+ *
46
+ * The function is pure given those inputs - no IO, no DB writes. The
47
+ * caller decides what to do with the resolved batch.
48
+ */
49
+ export function resolvePendingEdges(pendingEdges, perFile, crossFile) {
50
+ const resolved = [];
51
+ let orphaned = 0;
52
+ for (const pe of pendingEdges) {
53
+ const fromId = perFile.get(scopedKey(pe.fromName, pe.fromScope)) ??
54
+ perFile.get(pe.fromName);
55
+ if (fromId === undefined) {
56
+ // Caller side did not resolve. The .scm query captured an edge
57
+ // whose source declaration is not in the file's symbol table -
58
+ // should not happen for well-formed files; drop quietly.
59
+ orphaned += 1;
60
+ continue;
61
+ }
62
+ let toId = perFile.get(pe.toName);
63
+ if (toId === undefined) {
64
+ const fromCross = crossFile(pe.toName);
65
+ if (fromCross !== null)
66
+ toId = fromCross;
67
+ }
68
+ if (toId === undefined) {
69
+ // Target was not in this file's symbol table OR the cross-file
70
+ // source. Drop silently - the `code_callers` MCP tool will just
71
+ // not see this edge.
72
+ orphaned += 1;
73
+ continue;
74
+ }
75
+ resolved.push({
76
+ fromSymbolId: fromId,
77
+ toSymbolId: toId,
78
+ kind: pe.kind,
79
+ });
80
+ }
81
+ return { resolved, orphaned };
82
+ }
83
+ /**
84
+ * Build the per-file `nameMap` from a freshly-inserted symbol batch
85
+ * and the row ids returned by `insertSymbols`. Mirrors the inline
86
+ * loop в `reindex.ts` so both call sites stay consistent.
87
+ *
88
+ * The two map entries per symbol intentional: the scoped key
89
+ * (`Class.method`) is the canonical one, the bare-name entry is the
90
+ * fallback for the very common case where the .scm query captured a
91
+ * top-level caller. Last-write-wins on the bare-name key matches the
92
+ * walker's first-write behavior because both forms point at the same
93
+ * row id for the same file.
94
+ */
95
+ export function buildPerFileNameMap(symbols, ids) {
96
+ const map = new Map();
97
+ for (let i = 0; i < symbols.length; i += 1) {
98
+ const sym = symbols[i];
99
+ const id = ids[i];
100
+ if (!sym || id === undefined)
101
+ continue;
102
+ map.set(scopedKey(sym.name, sym.scope), id);
103
+ map.set(sym.name, id);
104
+ }
105
+ return map;
106
+ }
107
+ //# sourceMappingURL=resolve-edges.js.map
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Pugi local symbol index - type definitions.
3
+ *
4
+ * Companion to `db.ts` (SQLite + FTS5 wrapper) and `parser.ts` (tree-sitter
5
+ * extractor, stub today, real impl in follow-up PR L1). These types are the
6
+ * cross-module contract: the parser produces `Symbol[]` + `Edge[]`, the db
7
+ * layer inserts them, the MCP tools consume the query result types.
8
+ *
9
+ * Distinct from the third-party CodeGraph install scaffold that already
10
+ * lives in the same directory (`detect-repo.ts`, `offer-hook.ts`,
11
+ * `install.ts`, `decision-store.ts`). Those manage adoption of the upstream
12
+ * colbymchenry/codegraph MCP server. This file is the Pugi-native index.
13
+ * See the design memo at
14
+ * `docs/research/2026-06-05-pugi-index-codegraph-design.md` for the full
15
+ * architecture rationale.
16
+ *
17
+ * Naming convention: every type defined here is `Symbol` / `Edge` /
18
+ * `IndexedFile` / `*Result` / `*Options`. The interface is intentionally
19
+ * narrow - five v1 languages, four MCP tools, one SQLite database file.
20
+ */
21
+ /**
22
+ * Schema version tracked in the `_migrations` table. v1 ships with this
23
+ * PR (files + symbols + edges + FTS5 virtual + triggers). Bumping this
24
+ * MUST land a matching `applyMigration(N, db)` branch in `db.ts`.
25
+ */
26
+ export const INDEX_SCHEMA_VERSION = 1;
27
+ export const INDEXED_LANGUAGES = Object.freeze([
28
+ 'typescript',
29
+ 'javascript',
30
+ 'python',
31
+ 'go',
32
+ 'rust',
33
+ ]);
34
+ //# sourceMappingURL=types.js.map