@nanonets/graft 0.24.0 → 0.24.1

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 (396) hide show
  1. package/dist/ask/ask.d.ts +8 -0
  2. package/dist/ask/ask.d.ts.map +1 -1
  3. package/dist/ask/ask.js +33 -12
  4. package/dist/ask/ask.js.map +1 -1
  5. package/dist/claude/hook-io.d.ts +44 -0
  6. package/dist/claude/hook-io.d.ts.map +1 -0
  7. package/dist/claude/hook-io.js +144 -0
  8. package/dist/claude/hook-io.js.map +1 -0
  9. package/dist/claude/skills-hook-util.d.ts +25 -0
  10. package/dist/claude/skills-hook-util.d.ts.map +1 -0
  11. package/dist/claude/skills-hook-util.js +71 -0
  12. package/dist/claude/skills-hook-util.js.map +1 -0
  13. package/dist/cli-picker.d.ts +24 -0
  14. package/dist/cli-picker.d.ts.map +1 -1
  15. package/dist/cli-picker.js +36 -5
  16. package/dist/cli-picker.js.map +1 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +278 -29
  19. package/dist/cli.js.map +1 -1
  20. package/dist/cloud/lookup-activity.d.ts +16 -0
  21. package/dist/cloud/lookup-activity.d.ts.map +1 -0
  22. package/dist/cloud/lookup-activity.js +56 -0
  23. package/dist/cloud/lookup-activity.js.map +1 -0
  24. package/dist/cloud/nudge.d.ts.map +1 -1
  25. package/dist/cloud/nudge.js +3 -0
  26. package/dist/cloud/nudge.js.map +1 -1
  27. package/dist/cloud/onboarding.d.ts +237 -0
  28. package/dist/cloud/onboarding.d.ts.map +1 -0
  29. package/dist/cloud/onboarding.js +536 -0
  30. package/dist/cloud/onboarding.js.map +1 -0
  31. package/dist/cloud/pair.d.ts +76 -0
  32. package/dist/cloud/pair.d.ts.map +1 -0
  33. package/dist/cloud/pair.js +249 -0
  34. package/dist/cloud/pair.js.map +1 -0
  35. package/dist/cloud/workspace-sync.d.ts +10 -2
  36. package/dist/cloud/workspace-sync.d.ts.map +1 -1
  37. package/dist/cloud/workspace-sync.js +119 -7
  38. package/dist/cloud/workspace-sync.js.map +1 -1
  39. package/dist/cloud/workspace.d.ts +22 -1
  40. package/dist/cloud/workspace.d.ts.map +1 -1
  41. package/dist/cloud/workspace.js +16 -1
  42. package/dist/cloud/workspace.js.map +1 -1
  43. package/dist/graph/native.d.ts +2 -0
  44. package/dist/graph/native.d.ts.map +1 -1
  45. package/dist/graph/native.js +29 -4
  46. package/dist/graph/native.js.map +1 -1
  47. package/dist/hosts/claude-global.d.ts +14 -0
  48. package/dist/hosts/claude-global.d.ts.map +1 -1
  49. package/dist/hosts/claude-global.js +38 -3
  50. package/dist/hosts/claude-global.js.map +1 -1
  51. package/dist/init/install-record.d.ts +21 -0
  52. package/dist/init/install-record.d.ts.map +1 -0
  53. package/dist/init/install-record.js +144 -0
  54. package/dist/init/install-record.js.map +1 -0
  55. package/dist/init/plain-file.d.ts +11 -0
  56. package/dist/init/plain-file.d.ts.map +1 -0
  57. package/dist/init/plain-file.js +80 -0
  58. package/dist/init/plain-file.js.map +1 -0
  59. package/dist/mcp/brains.d.ts +72 -0
  60. package/dist/mcp/brains.d.ts.map +1 -0
  61. package/dist/mcp/brains.js +220 -0
  62. package/dist/mcp/brains.js.map +1 -0
  63. package/dist/mcp/server.d.ts +3 -1
  64. package/dist/mcp/server.d.ts.map +1 -1
  65. package/dist/mcp/server.js +40 -5
  66. package/dist/mcp/server.js.map +1 -1
  67. package/dist/mcp/tools.d.ts.map +1 -1
  68. package/dist/mcp/tools.js +7 -2
  69. package/dist/mcp/tools.js.map +1 -1
  70. package/dist/notes/cold-start.d.ts +30 -1
  71. package/dist/notes/cold-start.d.ts.map +1 -1
  72. package/dist/notes/cold-start.js +98 -19
  73. package/dist/notes/cold-start.js.map +1 -1
  74. package/dist/notes/every-repo.d.ts +18 -0
  75. package/dist/notes/every-repo.d.ts.map +1 -0
  76. package/dist/notes/every-repo.js +86 -0
  77. package/dist/notes/every-repo.js.map +1 -0
  78. package/dist/notes/guardrails.d.ts +8 -0
  79. package/dist/notes/guardrails.d.ts.map +1 -0
  80. package/dist/notes/guardrails.js +38 -0
  81. package/dist/notes/guardrails.js.map +1 -0
  82. package/dist/notes/lesson-index.d.ts +13 -0
  83. package/dist/notes/lesson-index.d.ts.map +1 -0
  84. package/dist/notes/lesson-index.js +135 -0
  85. package/dist/notes/lesson-index.js.map +1 -0
  86. package/dist/notes/linked-learnings.d.ts +8 -0
  87. package/dist/notes/linked-learnings.d.ts.map +1 -0
  88. package/dist/notes/linked-learnings.js +113 -0
  89. package/dist/notes/linked-learnings.js.map +1 -0
  90. package/dist/notes/replace.d.ts +14 -0
  91. package/dist/notes/replace.d.ts.map +1 -0
  92. package/dist/notes/replace.js +38 -0
  93. package/dist/notes/replace.js.map +1 -0
  94. package/dist/notes/repo-notes-dir.d.ts +2 -0
  95. package/dist/notes/repo-notes-dir.d.ts.map +1 -0
  96. package/dist/notes/repo-notes-dir.js +16 -0
  97. package/dist/notes/repo-notes-dir.js.map +1 -0
  98. package/dist/skills/anchors-cli.d.ts +33 -0
  99. package/dist/skills/anchors-cli.d.ts.map +1 -0
  100. package/dist/skills/anchors-cli.js +274 -0
  101. package/dist/skills/anchors-cli.js.map +1 -0
  102. package/dist/skills/anchors-git.d.ts +29 -0
  103. package/dist/skills/anchors-git.d.ts.map +1 -0
  104. package/dist/skills/anchors-git.js +241 -0
  105. package/dist/skills/anchors-git.js.map +1 -0
  106. package/dist/skills/anchors-wide.d.ts +25 -0
  107. package/dist/skills/anchors-wide.d.ts.map +1 -0
  108. package/dist/skills/anchors-wide.js +481 -0
  109. package/dist/skills/anchors-wide.js.map +1 -0
  110. package/dist/skills/anchors.d.ts +32 -0
  111. package/dist/skills/anchors.d.ts.map +1 -0
  112. package/dist/skills/anchors.js +485 -0
  113. package/dist/skills/anchors.js.map +1 -0
  114. package/dist/skills/check-result.d.ts +26 -0
  115. package/dist/skills/check-result.d.ts.map +1 -0
  116. package/dist/skills/check-result.js +46 -0
  117. package/dist/skills/check-result.js.map +1 -0
  118. package/dist/skills/codex-sandbox.d.ts +6 -0
  119. package/dist/skills/codex-sandbox.d.ts.map +1 -0
  120. package/dist/skills/codex-sandbox.js +55 -0
  121. package/dist/skills/codex-sandbox.js.map +1 -0
  122. package/dist/skills/compile-split.d.ts +57 -0
  123. package/dist/skills/compile-split.d.ts.map +1 -0
  124. package/dist/skills/compile-split.js +532 -0
  125. package/dist/skills/compile-split.js.map +1 -0
  126. package/dist/skills/compile-version.d.ts +37 -0
  127. package/dist/skills/compile-version.d.ts.map +1 -0
  128. package/dist/skills/compile-version.js +56 -0
  129. package/dist/skills/compile-version.js.map +1 -0
  130. package/dist/skills/compile-waits.d.ts +12 -0
  131. package/dist/skills/compile-waits.d.ts.map +1 -0
  132. package/dist/skills/compile-waits.js +52 -0
  133. package/dist/skills/compile-waits.js.map +1 -0
  134. package/dist/skills/compile-words.d.ts +82 -0
  135. package/dist/skills/compile-words.d.ts.map +1 -0
  136. package/dist/skills/compile-words.js +385 -0
  137. package/dist/skills/compile-words.js.map +1 -0
  138. package/dist/skills/compile.d.ts +35 -0
  139. package/dist/skills/compile.d.ts.map +1 -0
  140. package/dist/skills/compile.js +488 -0
  141. package/dist/skills/compile.js.map +1 -0
  142. package/dist/skills/credit-facts.d.ts +8 -0
  143. package/dist/skills/credit-facts.d.ts.map +1 -0
  144. package/dist/skills/credit-facts.js +32 -0
  145. package/dist/skills/credit-facts.js.map +1 -0
  146. package/dist/skills/directive-words.d.ts +11 -0
  147. package/dist/skills/directive-words.d.ts.map +1 -0
  148. package/dist/skills/directive-words.js +33 -0
  149. package/dist/skills/directive-words.js.map +1 -0
  150. package/dist/skills/fidelity.d.ts +42 -0
  151. package/dist/skills/fidelity.d.ts.map +1 -0
  152. package/dist/skills/fidelity.js +138 -0
  153. package/dist/skills/fidelity.js.map +1 -0
  154. package/dist/skills/forget-notice.d.ts +44 -0
  155. package/dist/skills/forget-notice.d.ts.map +1 -0
  156. package/dist/skills/forget-notice.js +131 -0
  157. package/dist/skills/forget-notice.js.map +1 -0
  158. package/dist/skills/found-skill.d.ts +35 -0
  159. package/dist/skills/found-skill.d.ts.map +1 -0
  160. package/dist/skills/found-skill.js +66 -0
  161. package/dist/skills/found-skill.js.map +1 -0
  162. package/dist/skills/front-version.d.ts +12 -0
  163. package/dist/skills/front-version.d.ts.map +1 -0
  164. package/dist/skills/front-version.js +87 -0
  165. package/dist/skills/front-version.js.map +1 -0
  166. package/dist/skills/host-facts.d.ts +51 -0
  167. package/dist/skills/host-facts.d.ts.map +1 -0
  168. package/dist/skills/host-facts.js +134 -0
  169. package/dist/skills/host-facts.js.map +1 -0
  170. package/dist/skills/ledger.d.ts +43 -0
  171. package/dist/skills/ledger.d.ts.map +1 -0
  172. package/dist/skills/ledger.js +336 -0
  173. package/dist/skills/ledger.js.map +1 -0
  174. package/dist/skills/lessons.d.ts +60 -0
  175. package/dist/skills/lessons.d.ts.map +1 -0
  176. package/dist/skills/lessons.js +396 -0
  177. package/dist/skills/lessons.js.map +1 -0
  178. package/dist/skills/offer-answers.d.ts +20 -0
  179. package/dist/skills/offer-answers.d.ts.map +1 -0
  180. package/dist/skills/offer-answers.js +51 -0
  181. package/dist/skills/offer-answers.js.map +1 -0
  182. package/dist/skills/own-folder.d.ts +9 -0
  183. package/dist/skills/own-folder.d.ts.map +1 -0
  184. package/dist/skills/own-folder.js +36 -0
  185. package/dist/skills/own-folder.js.map +1 -0
  186. package/dist/skills/person.d.ts +34 -0
  187. package/dist/skills/person.d.ts.map +1 -0
  188. package/dist/skills/person.js +102 -0
  189. package/dist/skills/person.js.map +1 -0
  190. package/dist/skills/probe-clean.d.ts +9 -0
  191. package/dist/skills/probe-clean.d.ts.map +1 -0
  192. package/dist/skills/probe-clean.js +48 -0
  193. package/dist/skills/probe-clean.js.map +1 -0
  194. package/dist/skills/probes.d.ts +26 -0
  195. package/dist/skills/probes.d.ts.map +1 -0
  196. package/dist/skills/probes.js +225 -0
  197. package/dist/skills/probes.js.map +1 -0
  198. package/dist/skills/recall.d.ts +119 -0
  199. package/dist/skills/recall.d.ts.map +1 -0
  200. package/dist/skills/recall.js +370 -0
  201. package/dist/skills/recall.js.map +1 -0
  202. package/dist/skills/receipts.d.ts +44 -0
  203. package/dist/skills/receipts.d.ts.map +1 -0
  204. package/dist/skills/receipts.js +223 -0
  205. package/dist/skills/receipts.js.map +1 -0
  206. package/dist/skills/run-checkout.d.ts +4 -0
  207. package/dist/skills/run-checkout.d.ts.map +1 -0
  208. package/dist/skills/run-checkout.js +37 -0
  209. package/dist/skills/run-checkout.js.map +1 -0
  210. package/dist/skills/runblock.d.ts +45 -0
  211. package/dist/skills/runblock.d.ts.map +1 -0
  212. package/dist/skills/runblock.js +222 -0
  213. package/dist/skills/runblock.js.map +1 -0
  214. package/dist/skills/save-parse.d.ts +42 -0
  215. package/dist/skills/save-parse.d.ts.map +1 -0
  216. package/dist/skills/save-parse.js +172 -0
  217. package/dist/skills/save-parse.js.map +1 -0
  218. package/dist/skills/save-store.d.ts +12 -0
  219. package/dist/skills/save-store.d.ts.map +1 -0
  220. package/dist/skills/save-store.js +22 -0
  221. package/dist/skills/save-store.js.map +1 -0
  222. package/dist/skills/settings.d.ts +38 -0
  223. package/dist/skills/settings.d.ts.map +1 -0
  224. package/dist/skills/settings.js +133 -0
  225. package/dist/skills/settings.js.map +1 -0
  226. package/dist/skills/skill-diff.d.ts +40 -0
  227. package/dist/skills/skill-diff.d.ts.map +1 -0
  228. package/dist/skills/skill-diff.js +191 -0
  229. package/dist/skills/skill-diff.js.map +1 -0
  230. package/dist/skills/skill-file.d.ts +24 -0
  231. package/dist/skills/skill-file.d.ts.map +1 -0
  232. package/dist/skills/skill-file.js +97 -0
  233. package/dist/skills/skill-file.js.map +1 -0
  234. package/dist/skills/skill-rebuild.d.ts +27 -0
  235. package/dist/skills/skill-rebuild.d.ts.map +1 -0
  236. package/dist/skills/skill-rebuild.js +85 -0
  237. package/dist/skills/skill-rebuild.js.map +1 -0
  238. package/dist/skills/skillmd.d.ts +17 -0
  239. package/dist/skills/skillmd.d.ts.map +1 -0
  240. package/dist/skills/skillmd.js +219 -0
  241. package/dist/skills/skillmd.js.map +1 -0
  242. package/dist/skills/skills.d.ts +2 -0
  243. package/dist/skills/skills.d.ts.map +1 -1
  244. package/dist/skills/skills.js +1 -1
  245. package/dist/skills/skills.js.map +1 -1
  246. package/dist/skills/staleness.d.ts +27 -0
  247. package/dist/skills/staleness.d.ts.map +1 -0
  248. package/dist/skills/staleness.js +178 -0
  249. package/dist/skills/staleness.js.map +1 -0
  250. package/dist/skills/state.d.ts +36 -0
  251. package/dist/skills/state.d.ts.map +1 -0
  252. package/dist/skills/state.js +259 -0
  253. package/dist/skills/state.js.map +1 -0
  254. package/dist/skills/store-fs.d.ts +77 -0
  255. package/dist/skills/store-fs.d.ts.map +1 -0
  256. package/dist/skills/store-fs.js +194 -0
  257. package/dist/skills/store-fs.js.map +1 -0
  258. package/dist/skills/store-held.d.ts +44 -0
  259. package/dist/skills/store-held.d.ts.map +1 -0
  260. package/dist/skills/store-held.js +147 -0
  261. package/dist/skills/store-held.js.map +1 -0
  262. package/dist/skills/store.d.ts +73 -0
  263. package/dist/skills/store.d.ts.map +1 -0
  264. package/dist/skills/store.js +279 -0
  265. package/dist/skills/store.js.map +1 -0
  266. package/dist/skills/validate.d.ts +11 -0
  267. package/dist/skills/validate.d.ts.map +1 -0
  268. package/dist/skills/validate.js +112 -0
  269. package/dist/skills/validate.js.map +1 -0
  270. package/dist/skills/versions-fs.d.ts +45 -0
  271. package/dist/skills/versions-fs.d.ts.map +1 -0
  272. package/dist/skills/versions-fs.js +234 -0
  273. package/dist/skills/versions-fs.js.map +1 -0
  274. package/dist/skills/versions.d.ts +56 -0
  275. package/dist/skills/versions.d.ts.map +1 -0
  276. package/dist/skills/versions.js +351 -0
  277. package/dist/skills/versions.js.map +1 -0
  278. package/dist/trace/checks.d.ts +63 -0
  279. package/dist/trace/checks.d.ts.map +1 -0
  280. package/dist/trace/checks.js +487 -0
  281. package/dist/trace/checks.js.map +1 -0
  282. package/dist/trace/claude.d.ts +124 -0
  283. package/dist/trace/claude.d.ts.map +1 -0
  284. package/dist/trace/claude.js +303 -0
  285. package/dist/trace/claude.js.map +1 -0
  286. package/dist/trace/codex-exec.d.ts +22 -0
  287. package/dist/trace/codex-exec.d.ts.map +1 -0
  288. package/dist/trace/codex-exec.js +129 -0
  289. package/dist/trace/codex-exec.js.map +1 -0
  290. package/dist/trace/codex-meta.d.ts +23 -0
  291. package/dist/trace/codex-meta.d.ts.map +1 -0
  292. package/dist/trace/codex-meta.js +112 -0
  293. package/dist/trace/codex-meta.js.map +1 -0
  294. package/dist/trace/codex.d.ts +33 -0
  295. package/dist/trace/codex.d.ts.map +1 -0
  296. package/dist/trace/codex.js +485 -0
  297. package/dist/trace/codex.js.map +1 -0
  298. package/dist/trace/cursor.d.ts +16 -0
  299. package/dist/trace/cursor.d.ts.map +1 -0
  300. package/dist/trace/cursor.js +133 -0
  301. package/dist/trace/cursor.js.map +1 -0
  302. package/dist/trace/dialect.d.ts +43 -0
  303. package/dist/trace/dialect.d.ts.map +1 -0
  304. package/dist/trace/dialect.js +95 -0
  305. package/dist/trace/dialect.js.map +1 -0
  306. package/dist/trace/epochs.d.ts +10 -0
  307. package/dist/trace/epochs.d.ts.map +1 -0
  308. package/dist/trace/epochs.js +16 -0
  309. package/dist/trace/epochs.js.map +1 -0
  310. package/dist/trace/failure.d.ts +15 -0
  311. package/dist/trace/failure.d.ts.map +1 -0
  312. package/dist/trace/failure.js +69 -0
  313. package/dist/trace/failure.js.map +1 -0
  314. package/dist/trace/gate-file.d.ts +71 -0
  315. package/dist/trace/gate-file.d.ts.map +1 -0
  316. package/dist/trace/gate-file.js +329 -0
  317. package/dist/trace/gate-file.js.map +1 -0
  318. package/dist/trace/guard-fast.d.ts +22 -0
  319. package/dist/trace/guard-fast.d.ts.map +1 -0
  320. package/dist/trace/guard-fast.js +213 -0
  321. package/dist/trace/guard-fast.js.map +1 -0
  322. package/dist/trace/housekeeping.d.ts +5 -0
  323. package/dist/trace/housekeeping.d.ts.map +1 -0
  324. package/dist/trace/housekeeping.js +93 -0
  325. package/dist/trace/housekeeping.js.map +1 -0
  326. package/dist/trace/jobs.d.ts +52 -0
  327. package/dist/trace/jobs.d.ts.map +1 -0
  328. package/dist/trace/jobs.js +182 -0
  329. package/dist/trace/jobs.js.map +1 -0
  330. package/dist/trace/known-repo.d.ts +3 -0
  331. package/dist/trace/known-repo.d.ts.map +1 -0
  332. package/dist/trace/known-repo.js +55 -0
  333. package/dist/trace/known-repo.js.map +1 -0
  334. package/dist/trace/pool.d.ts +40 -0
  335. package/dist/trace/pool.d.ts.map +1 -0
  336. package/dist/trace/pool.js +154 -0
  337. package/dist/trace/pool.js.map +1 -0
  338. package/dist/trace/repairs.d.ts +27 -0
  339. package/dist/trace/repairs.d.ts.map +1 -0
  340. package/dist/trace/repairs.js +303 -0
  341. package/dist/trace/repairs.js.map +1 -0
  342. package/dist/trace/run-calls.d.ts +82 -0
  343. package/dist/trace/run-calls.d.ts.map +1 -0
  344. package/dist/trace/run-calls.js +331 -0
  345. package/dist/trace/run-calls.js.map +1 -0
  346. package/dist/trace/run-join.d.ts +20 -0
  347. package/dist/trace/run-join.d.ts.map +1 -0
  348. package/dist/trace/run-join.js +99 -0
  349. package/dist/trace/run-join.js.map +1 -0
  350. package/dist/trace/run-sheets.d.ts +26 -0
  351. package/dist/trace/run-sheets.d.ts.map +1 -0
  352. package/dist/trace/run-sheets.js +145 -0
  353. package/dist/trace/run-sheets.js.map +1 -0
  354. package/dist/trace/run-turns.d.ts +24 -0
  355. package/dist/trace/run-turns.d.ts.map +1 -0
  356. package/dist/trace/run-turns.js +67 -0
  357. package/dist/trace/run-turns.js.map +1 -0
  358. package/dist/trace/run-verdict.d.ts +24 -0
  359. package/dist/trace/run-verdict.d.ts.map +1 -0
  360. package/dist/trace/run-verdict.js +176 -0
  361. package/dist/trace/run-verdict.js.map +1 -0
  362. package/dist/trace/runs.d.ts +54 -0
  363. package/dist/trace/runs.d.ts.map +1 -0
  364. package/dist/trace/runs.js +501 -0
  365. package/dist/trace/runs.js.map +1 -0
  366. package/dist/trace/skill-session.d.ts +64 -0
  367. package/dist/trace/skill-session.d.ts.map +1 -0
  368. package/dist/trace/skill-session.js +232 -0
  369. package/dist/trace/skill-session.js.map +1 -0
  370. package/dist/trace/tamper.d.ts +12 -0
  371. package/dist/trace/tamper.d.ts.map +1 -0
  372. package/dist/trace/tamper.js +405 -0
  373. package/dist/trace/tamper.js.map +1 -0
  374. package/dist/trace/typed.d.ts +30 -0
  375. package/dist/trace/typed.d.ts.map +1 -0
  376. package/dist/trace/typed.js +132 -0
  377. package/dist/trace/typed.js.map +1 -0
  378. package/dist/trace/wall-state.d.ts +86 -0
  379. package/dist/trace/wall-state.d.ts.map +1 -0
  380. package/dist/trace/wall-state.js +279 -0
  381. package/dist/trace/wall-state.js.map +1 -0
  382. package/dist/trace/walls.d.ts +40 -0
  383. package/dist/trace/walls.d.ts.map +1 -0
  384. package/dist/trace/walls.js +318 -0
  385. package/dist/trace/walls.js.map +1 -0
  386. package/dist/vendor/tree-sitter-swift/LICENSE +21 -0
  387. package/dist/vendor/tree-sitter-swift/node-types.json +30694 -0
  388. package/dist/vendor/tree-sitter-swift/prebuilds/darwin-arm64/tree-sitter-swift.node +0 -0
  389. package/dist/vendor/tree-sitter-swift/prebuilds/darwin-x64/tree-sitter-swift.node +0 -0
  390. package/dist/vendor/tree-sitter-swift/prebuilds/linux-arm64/tree-sitter-swift.node +0 -0
  391. package/dist/vendor/tree-sitter-swift/prebuilds/linux-x64/tree-sitter-swift.node +0 -0
  392. package/dist/vendor/tree-sitter-swift/prebuilds/win32-arm64/tree-sitter-swift.node +0 -0
  393. package/dist/vendor/tree-sitter-swift/prebuilds/win32-x64/tree-sitter-swift.node +0 -0
  394. package/package.json +6 -3
  395. package/scripts/stamp-telemetry-key.mjs +8 -5
  396. package/scripts/vendor-grammars.mjs +35 -0
@@ -0,0 +1,536 @@
1
+ /**
2
+ * `trail init --connect <CODE>`: the onboarding on team.trailhq.com.
3
+ *
4
+ * A person signs up on the web, picks "Writing Code", and is shown two
5
+ * commands: install trail, then `trail init --connect TRL-XXXX-XXXX`. The code
6
+ * is one-time and short-lived; claiming it gives this machine a workspace
7
+ * token, kept where `trail login` keeps one (`~/.trail/cloud.json`).
8
+ *
9
+ * While init runs, the page ticks off stages as this sends them: connected,
10
+ * mapped, learned, done. Before `done`, one summary of the repo goes up, for
11
+ * the "What Trail found" page:
12
+ *
13
+ * - tokens: one real lookup on the fresh code map, and what it saved
14
+ * - learnings: titles, a short line of each and how many sessions said it
15
+ * - teammates: other people's recently pushed branches that change the
16
+ * files this person works on, from git
17
+ *
18
+ * Summaries only (the onboarding's "route B"): never code, diffs or session
19
+ * text. Every call is bounded and never throws; offline, init carries on and
20
+ * says nothing about it.
21
+ */
22
+ import { execFileSync } from "node:child_process";
23
+ import { hostname } from "node:os";
24
+ import { formatAsk, ask } from "../ask/ask.js";
25
+ import { contextDirFor } from "../context/node-file.js";
26
+ import { loadGraphCached } from "../graph/load.js";
27
+ import { buildRepoMap } from "../graph/map.js";
28
+ import { refreshBranches, safeRef } from "../notes/branches.js";
29
+ import { cleanSubject } from "../notes/edit-overlap.js";
30
+ import { changedFiles, ownPath } from "../notes/git-facts.js";
31
+ import { repoName, repoPlace } from "../notes/home.js";
32
+ import { listNotes, sectionLead } from "../notes/notes.js";
33
+ import { DEFAULT_TRAIL_URL, isError, trailUrl } from "./workspace.js";
34
+ /* -------------------------------------------------------------------------- */
35
+ /* the code */
36
+ /* -------------------------------------------------------------------------- */
37
+ /**
38
+ * The code as the page shows it, `TRL-7F2A-K9QD`, from however it was pasted:
39
+ * any case, with or without the prefix and dashes. Null when it can't be one.
40
+ */
41
+ export function normalizeCode(raw) {
42
+ const s = raw.trim().toUpperCase().replace(/[\s_]+/g, "-");
43
+ const bare = s.replace(/^TRL-?/, "").replace(/-/g, "");
44
+ if (!/^[A-Z0-9]{8}$/.test(bare))
45
+ return null;
46
+ return `TRL-${bare.slice(0, 4)}-${bare.slice(4)}`;
47
+ }
48
+ export function repoRef(repo) {
49
+ const place = repoPlace(repo);
50
+ if (place.key.startsWith("local/"))
51
+ return { name: repoName(place.key, place.checkout) };
52
+ // The name as the remote spells it (`go-retryablehttp`, `Graft`); the key is lower-cased.
53
+ const origin = git(place.checkout, ["remote", "get-url", "origin"], 5000)?.trim() ?? "";
54
+ const last = origin.replace(/\.git\/?$/i, "").split(/[/:]/).pop() ?? "";
55
+ const name = /^[A-Za-z0-9._-]+$/.test(last) ? last : place.key.split("/").pop();
56
+ return { name, remote_url: `https://${place.key}` };
57
+ }
58
+ /** What the page shows for the terminal: `Rushabh's MacBook Pro` on a Mac, else the host name. */
59
+ export function machineName() {
60
+ if (process.platform === "darwin") {
61
+ try {
62
+ const name = execFileSync("scutil", ["--get", "ComputerName"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], timeout: 2000 }).trim();
63
+ if (name)
64
+ return name.slice(0, 80);
65
+ }
66
+ catch {
67
+ /* the host name below */
68
+ }
69
+ }
70
+ try {
71
+ return hostname().replace(/\.(local|lan|home)$/i, "").slice(0, 80);
72
+ }
73
+ catch {
74
+ return "";
75
+ }
76
+ }
77
+ async function post(url, body, opts) {
78
+ const f = opts.fetchImpl ?? fetch;
79
+ try {
80
+ const headers = { "content-type": "application/json", accept: "application/json" };
81
+ if (opts.token)
82
+ headers.authorization = `Bearer ${opts.token}`;
83
+ const res = await f(url, { method: "POST", headers, body: JSON.stringify(body), signal: AbortSignal.timeout(opts.timeoutMs ?? 10_000) });
84
+ const text = await res.text();
85
+ let json = null;
86
+ try {
87
+ json = text ? JSON.parse(text) : null;
88
+ }
89
+ catch {
90
+ /* not JSON */
91
+ }
92
+ if (!res.ok) {
93
+ const msg = json?.error;
94
+ return { error: typeof msg === "string" ? msg : `Trail answered ${res.status}`, status: res.status };
95
+ }
96
+ return { status: res.status, body: json };
97
+ }
98
+ catch (err) {
99
+ const timedOut = err instanceof Error && (err.name === "TimeoutError" || err.name === "AbortError");
100
+ return { error: timedOut ? "Trail didn't answer in time" : "couldn't reach Trail" };
101
+ }
102
+ }
103
+ /**
104
+ * Claim the one-time code: `POST /api/public/cli/connect`. Gives back the
105
+ * connection to save, with no repos picked: the full learnings sync stays off
106
+ * for a machine connected this way, so only the summary below goes up.
107
+ */
108
+ export async function claimConnectCode(base, code, req, opts = {}) {
109
+ const r = await post(`${base}/api/public/cli/connect`, { code, machine: req.machine, repo: req.repo }, { fetchImpl: opts.fetchImpl, timeoutMs: 15_000 });
110
+ if (isError(r)) {
111
+ if (r.status === undefined)
112
+ return { error: r.error, reason: "offline" };
113
+ if (r.status >= 500)
114
+ return { error: `Trail answered ${r.status}`, reason: "offline" };
115
+ if (r.status === 403)
116
+ return { error: "the account that made this code is no longer in that workspace", reason: "invalid" };
117
+ if (r.status === 429)
118
+ return { error: "too many tries just now; wait a minute and run it again", reason: "invalid" };
119
+ return { error: "that code was already used, has expired, or isn't right", reason: "invalid" };
120
+ }
121
+ const b = r.body;
122
+ const ws = b?.workspace;
123
+ if (!b?.token || !ws?.name)
124
+ return { error: "Trail sent an answer with no workspace in it", reason: "offline" };
125
+ const id = ws.id ?? ws.slug ?? ws.name;
126
+ return {
127
+ cloud: {
128
+ url: base,
129
+ token: b.token,
130
+ user: { name: b.user?.name ?? "", email: b.user?.email ?? "" },
131
+ workspace: {
132
+ id,
133
+ name: ws.name,
134
+ // readCloud needs a slug to count the connection; the connect answer may not carry one.
135
+ slug: ws.slug || id,
136
+ url: ws.url || `${base}/`,
137
+ invite_url: ws.invite_url || `${base}/`,
138
+ },
139
+ repos: [],
140
+ linkedAt: opts.now ?? Date.now(),
141
+ via: "connect",
142
+ },
143
+ };
144
+ }
145
+ /**
146
+ * The command that connects later: `trail init --connect TRL-… --server <url>`,
147
+ * naming the Trail it was run against unless that's Trail cloud, so it
148
+ * reaches the same backend the code came from.
149
+ */
150
+ export function connectAgain(command, code, base) {
151
+ return `${command} --connect ${code}${base.replace(/\/+$/, "") === DEFAULT_TRAIL_URL ? "" : ` --server ${base}`}`;
152
+ }
153
+ /**
154
+ * What to say, once, when Trail didn't take the code because it couldn't be
155
+ * reached: which Trail, what happened, and the exact command to connect later.
156
+ * `· couldn't reach Trail at http://localhost:5173 · set this repo up anyway ·
157
+ * to connect it later: trail init --connect TRL-7F2A-K9QD --server http://localhost:5173`
158
+ */
159
+ export function offlineLine(error, base, code, command) {
160
+ const what = error.startsWith("Trail ") ? `Trail at ${base}${error.slice("Trail".length)}` : `couldn't reach Trail at ${base}`;
161
+ return `· ${what} · set this repo up anyway · to connect it later: ${connectAgain(command, code, base)}`;
162
+ }
163
+ /**
164
+ * Sends the stages and the summary for one `init --connect`, in order. The
165
+ * first call that can't reach Trail turns the rest off, so a laptop offline
166
+ * waits on one timeout at most. Never throws.
167
+ */
168
+ export class OnboardingReporter {
169
+ cloud;
170
+ repo;
171
+ opts;
172
+ offline = false;
173
+ chain = Promise.resolve();
174
+ sent = [];
175
+ constructor(cloud, repo, opts = {}) {
176
+ this.cloud = cloud;
177
+ this.repo = repo;
178
+ this.opts = opts;
179
+ }
180
+ send(path, body) {
181
+ const next = this.chain.then(async () => {
182
+ if (this.offline)
183
+ return false;
184
+ const r = await post(`${this.cloud.url}${path}`, body, { token: this.cloud.token, fetchImpl: this.opts.fetchImpl, timeoutMs: this.opts.timeoutMs ?? 5_000 });
185
+ const ok = !isError(r);
186
+ // No answer at all: offline, or Trail is down. An HTTP error is this call's alone.
187
+ if (isError(r) && r.status === undefined)
188
+ this.offline = true;
189
+ this.sent.push({ path, body, ok });
190
+ return ok;
191
+ });
192
+ this.chain = next.catch(() => false);
193
+ return next.catch(() => false);
194
+ }
195
+ /** One stage, for the page to tick off. */
196
+ stage(stage, data = {}) {
197
+ return this.send("/api/cli/onboarding/events", { repo: this.repo, stage, machine: this.opts.machine, data });
198
+ }
199
+ summary(s) {
200
+ return this.send("/api/cli/repos/summary", { repo: this.repo, ...s });
201
+ }
202
+ /** Wait for everything sent so far. */
203
+ async flush() {
204
+ await this.chain;
205
+ }
206
+ }
207
+ /* tokens ------------------------------------------------------------------- */
208
+ /** The numbers in `ask`'s `[trail] tokens saved ≈ N (P%) — this pack ≈ … tok vs reading the F source file(s) whole ≈ B tok` line. */
209
+ export function parseAskSavings(text) {
210
+ const m = text.match(/\[(?:graft|trail)\] tokens saved ≈ ([\d,]+) \((\d+)%\) — this pack ≈ ([\d,]+) tok vs reading the (\d+) source file\(s\) whole ≈ ([\d,]+) tok/);
211
+ if (!m)
212
+ return null;
213
+ const n = (s) => Number(s.replace(/,/g, ""));
214
+ return { saved: n(m[1]), pct: n(m[2]), pack: n(m[3]), files: n(m[4]), baseline: n(m[5]) };
215
+ }
216
+ /** Folders that hold tests, fixtures, vendored or generated code, anywhere in a path. */
217
+ const NOT_PRODUCT_DIR = /(^|\/)(test|tests|__tests__|testdata|test-fixtures|fixtures|__fixtures__|__mocks__|vendor|third_party|node_modules|generated|__generated__|gen)\//i;
218
+ /** File names of tests and generated code: `client_test.go`, `a.test.ts`, `a.spec.js`, `test_client.py`, `api.pb.go`, `schema.generated.ts`. */
219
+ const NOT_PRODUCT_FILE = /(_test\.[^/]+|\.(test|spec)\.[^/]+|_spec\.[^/]+|(^|\/)test_[^/]+\.py|(^|\/)conftest\.py|\.(generated|gen)\.[^/]+|\.pb\.go|_pb2(_grpc)?\.py|\.d\.ts)$/i;
220
+ /** Whether a repo path is test, fixture, vendored or generated code, which a lookup shouldn't be measured on. */
221
+ export function notProductCode(path) {
222
+ const p = path.split("\\").join("/");
223
+ return NOT_PRODUCT_DIR.test(p) || NOT_PRODUCT_FILE.test(p);
224
+ }
225
+ /** Docs and config: prose, data and settings files, and the folders that hold them. */
226
+ const DOC_OR_CONFIG_FILE = new RegExp([
227
+ "\\.(md|mdx|markdown|rst|adoc|txt|json|jsonc|ya?ml|toml|ini|cfg|conf|env|lock|xml|csv|svg|png|jpe?g|gif|ico)$",
228
+ "(^|/)(readme|changelog|changes|history|license|licence|notice|authors|contributors|codeowners|security)$",
229
+ "(^|/)(makefile|dockerfile|procfile|go\\.mod|go\\.sum)$",
230
+ // Dotfiles: .gitignore, .eslintrc.js, .env.local.
231
+ "(^|/)\\.[^/]+$",
232
+ ].join("|"), "i");
233
+ const DOC_OR_CONFIG_DIR = /(^|\/)(docs?|\.github|\.circleci|\.vscode|\.idea)\//i;
234
+ /** Whether a repo path is docs or config rather than code. */
235
+ export function docOrConfig(path) {
236
+ const p = path.split("\\").join("/");
237
+ return DOC_OR_CONFIG_DIR.test(p) || DOC_OR_CONFIG_FILE.test(p);
238
+ }
239
+ /**
240
+ * A teammate's files with the one worth naming first: product code (by the
241
+ * same rules as the tokens lookup), then other code (tests, fixtures,
242
+ * vendored, generated), then docs and config. Every file stays; only the
243
+ * order changes, and within each kind it's git's. The page says a teammate
244
+ * "is changing" the first one, which shouldn't be CHANGELOG.md when they
245
+ * also change client.go.
246
+ */
247
+ export function headlineOrder(files) {
248
+ const rank = (f) => (docOrConfig(f) ? 2 : notProductCode(f) ? 1 : 0);
249
+ return files.map((f, i) => ({ f, i, r: rank(f) })).sort((a, b) => a.r - b.r || a.i - b.i).map((x) => x.f);
250
+ }
251
+ const COMMON_UTIL_NAMES = new Set(["cn", "utils", "index", "helpers", "main", "init", "config", "setup", "test"]);
252
+ /** Whether a symbol name is worth measuring a lookup on: at least 5 characters and not a common util name. */
253
+ export function meaningfulSymbol(name) {
254
+ return name.length >= 5 && !COMMON_UTIL_NAMES.has(name.toLowerCase());
255
+ }
256
+ /**
257
+ * One real lookup on the code map, as an agent would make it: a question
258
+ * about the repo's most central symbol (most incoming edges, with a name of
259
+ * 5+ characters that isn't a common util name) outside tests,
260
+ * fixtures, vendored and generated code, answered with
261
+ * the code inlined, and what that saved against reading the files it covers
262
+ * whole. The next most central is tried when a lookup saves nothing (tiny
263
+ * files). Null without a graph.
264
+ */
265
+ export function tokensOnOneLookup(repo, opts = {}) {
266
+ try {
267
+ const graph = loadGraphCached(contextDirFor(repo, opts.contextDir));
268
+ if (!graph)
269
+ return null;
270
+ // The most central symbols of the product code: tests, fixtures, vendored
271
+ // and generated code only when there's nothing else.
272
+ // A name worth asking about: a short or generic one (`cn`, `utils`, `main`)
273
+ // says nothing about the repo, so the example would be meaningless.
274
+ // Falls back to every symbol when no name passes, so a repo of short names still gets a figure.
275
+ const spots = buildRepoMap(graph, { hotspots: 500 }).hotspots;
276
+ const named = spots.filter((h) => meaningfulSymbol(h.name));
277
+ const all = named.length ? named : spots;
278
+ const product = all.filter((h) => !notProductCode(h.path));
279
+ const hubs = (product.length ? product : all).slice(0, Math.max(1, opts.tries ?? 5));
280
+ for (const hub of hubs) {
281
+ const query = `how does ${hub.name} work`;
282
+ const r = ask(repo, query, { source: true, limit: 5, contextDir: opts.contextDir });
283
+ const got = parseAskSavings(formatAsk(r));
284
+ if (got && got.saved > 0)
285
+ return { question: `how ${hub.name} works`, symbol: hub.name, ...got };
286
+ }
287
+ return null;
288
+ }
289
+ catch {
290
+ return null;
291
+ }
292
+ }
293
+ /* learnings ---------------------------------------------------------------- */
294
+ /** How many sessions a learning read from past sessions was said in, from the line init writes under it. */
295
+ export function sessionsIn(body) {
296
+ const m = body.match(/Told to Claude in (\d+) past sessions/);
297
+ return m ? Number(m[1]) : 0;
298
+ }
299
+ /**
300
+ * One line of a learning, for a card: the first point under `## Decided` (or
301
+ * the first line of prose), no code blocks, headings or provenance line, at
302
+ * most 200 characters.
303
+ */
304
+ export function shortBody(body) {
305
+ const prose = body
306
+ .replace(/```[\s\S]*?(```|$)/g, " ")
307
+ .split(/\r?\n/)
308
+ .filter((l) => !/^_(Told to Claude|Flagged in review) /.test(l.trim()));
309
+ const text = prose.join("\n");
310
+ const lead = sectionLead(text, "Decided") ??
311
+ sectionLead(text, "Watch out") ??
312
+ prose.map((l) => l.trim()).find((l) => l && !l.startsWith("#")) ??
313
+ "";
314
+ const one = lead.replace(/^[-*]\s+/, "").replace(/\s+/g, " ").trim();
315
+ return one.length > 200 ? `${one.slice(0, 199)}…` : one;
316
+ }
317
+ /**
318
+ * The team's learnings in this repo, for the summary: what init just learned
319
+ * when it learned something (with the sessions each was said in), else what
320
+ * `.trail/learnings/` already has. Never a personal one: those stay on this
321
+ * machine.
322
+ */
323
+ export function learningsSummary(repo, learned, max = 10) {
324
+ try {
325
+ const notes = learned?.length
326
+ ? learned.filter((l) => l.note.scope !== "personal")
327
+ : listNotes(repo, { branches: false })
328
+ .filter((n) => n.scope === "repo" && !n.ref)
329
+ .map((note) => ({ note }));
330
+ return notes.slice(0, max).map(({ note, sessions }) => ({
331
+ title: note.title.slice(0, 200),
332
+ body: shortBody(note.body),
333
+ sessions: sessions ?? sessionsIn(note.body),
334
+ }));
335
+ }
336
+ catch {
337
+ return [];
338
+ }
339
+ }
340
+ /* teammates ---------------------------------------------------------------- */
341
+ function git(repo, args, timeout = 15_000) {
342
+ try {
343
+ return execFileSync("git", args, {
344
+ cwd: repo,
345
+ encoding: "utf8",
346
+ stdio: ["ignore", "pipe", "ignore"],
347
+ timeout,
348
+ maxBuffer: 16 * 1024 * 1024,
349
+ env: { ...process.env, GIT_TERMINAL_PROMPT: "0" },
350
+ });
351
+ }
352
+ catch {
353
+ return null;
354
+ }
355
+ }
356
+ const BOT = /\[bot\]|^(dependabot|github-actions|renovate)\b/i;
357
+ /** Branches that are where work lands, not work in flight: nobody is "on" them. */
358
+ const INTEGRATION_BRANCH = /^(main|master|dev|develop|staging|production|release\/.+)$/;
359
+ /**
360
+ * Whether a remote branch is open work by someone: not the remote's default
361
+ * branch (`base`), not a shared integration branch, and not fully merged
362
+ * already (its tip is an ancestor of `base`).
363
+ */
364
+ export function openBranch(repo, base, ref) {
365
+ const name = ref.replace(/^origin\//, "");
366
+ if (ref === base || name === base.replace(/^origin\//, "") || INTEGRATION_BRANCH.test(name))
367
+ return false;
368
+ // `merge-base --is-ancestor` exits 0 when merged, 1 when not; git() returns null on a nonzero exit.
369
+ return git(repo, ["merge-base", "--is-ancestor", ref, base]) === null;
370
+ }
371
+ /** Files `email` changed in the last `days` days on any branch, plus what's uncommitted here. */
372
+ export function myRecentFiles(repo, email, days = 30) {
373
+ const out = new Set(changedFiles(repo, undefined, 200));
374
+ if (email) {
375
+ const pattern = `<${email.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}>`;
376
+ const log = git(repo, ["log", "--all", "--no-merges", `--since=${days}.days`, `--author=${pattern}`, "--name-only", "--format="]);
377
+ for (const f of (log ?? "").split("\n"))
378
+ if (f.trim() && !ownPath(f.trim()))
379
+ out.add(f.trim());
380
+ }
381
+ return [...out].slice(0, 500);
382
+ }
383
+ /** The repo's busiest files lately: the stand-in for "files you work on" when you have no history here. */
384
+ export function hottestFiles(repo, n = 30) {
385
+ const count = new Map();
386
+ const log = git(repo, ["log", "--no-merges", "--since=90.days", "-n", "2000", "--name-only", "--format="]) || git(repo, ["log", "--no-merges", "-n", "300", "--name-only", "--format="]);
387
+ for (const raw of (log ?? "").split("\n")) {
388
+ const f = raw.trim();
389
+ if (f && !ownPath(f))
390
+ count.set(f, (count.get(f) ?? 0) + 1);
391
+ }
392
+ return [...count].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).slice(0, n).map(([f]) => f);
393
+ }
394
+ /** One line of what a branch does, from its commit subjects, newest first. */
395
+ function changeLine(repo, base, ref) {
396
+ const subjects = (git(repo, ["log", "--no-merges", "--format=%s", "-n", "5", `${base}..${ref}`]) ?? "")
397
+ .split("\n")
398
+ .map((s) => cleanSubject(s))
399
+ .filter(Boolean);
400
+ const line = [...new Set(subjects)].slice(0, 3).join("; ");
401
+ return line.length > 160 ? `${line.slice(0, 159)}…` : line;
402
+ }
403
+ /**
404
+ * `git fetch` in the foreground, at the end of init, without ever stopping to
405
+ * ask: no credential prompt, and no ssh passphrase prompt unless the person
406
+ * set up their own ssh command (then theirs is used as is).
407
+ */
408
+ function fetchQuietly(repo) {
409
+ try {
410
+ const env = { ...process.env, GIT_TERMINAL_PROMPT: "0" };
411
+ if (!env.GIT_SSH_COMMAND && !git(repo, ["config", "core.sshCommand"])?.trim())
412
+ env.GIT_SSH_COMMAND = "ssh -o BatchMode=yes";
413
+ execFileSync("git", ["fetch", "--quiet", "--prune", "origin"], { cwd: repo, stdio: "ignore", timeout: 20_000, env });
414
+ }
415
+ catch {
416
+ /* offline, or no origin: the refs already here */
417
+ }
418
+ }
419
+ /**
420
+ * The names a learning is about, to look for in a teammate's change: the
421
+ * symbols its `touches` name (`client.go#Do`), and code-like words in its
422
+ * title and lead line (`defaultRetryMax`, `retry_max`, `Do()`). Plain words
423
+ * are left out: "retry" in a learning says nothing about a change.
424
+ */
425
+ export function learningTerms(n) {
426
+ const terms = new Set();
427
+ for (const t of n.touches) {
428
+ const sym = t.split("#")[1];
429
+ if (sym)
430
+ terms.add(sym.split(".").pop());
431
+ }
432
+ const text = `${n.title} ${shortBody(n.body)}`;
433
+ // camelCase, PascalCase with an inner capital, snake_case, or a call: `Do()`.
434
+ for (const w of text.match(/\b[A-Za-z_][A-Za-z0-9_]*\b(\(\))?/g) ?? []) {
435
+ const word = w.replace(/\(\)$/, "");
436
+ if (w.endsWith("()") || /[a-z][A-Z]/.test(word) || /[A-Za-z]_[A-Za-z]/.test(word))
437
+ terms.add(word);
438
+ }
439
+ return [...terms].filter((t) => t.length >= 2);
440
+ }
441
+ /**
442
+ * When a teammate's branch changes a name one of the team's learnings is
443
+ * about, in a file that learning touches: `Changes defaultRetryMax in
444
+ * client.go, which your learning "Keep defaultRetryMax at 4" is about.` Read
445
+ * from the branch's diff here; only this line goes up. Nothing when the
446
+ * learning names nothing code-like, or the change doesn't touch it.
447
+ */
448
+ export function conflictLine(repo, base, ref, files, learnings) {
449
+ const changed = new Set(files);
450
+ for (const n of learnings) {
451
+ if (n.scope === "personal")
452
+ continue;
453
+ const terms = learningTerms(n);
454
+ if (terms.length === 0)
455
+ continue;
456
+ for (const file of n.touches.map((t) => t.split("#")[0]).filter((f) => changed.has(f))) {
457
+ const diff = git(repo, ["diff", "--unified=0", `${base}...${ref}`, "--", file]) ?? "";
458
+ const lines = diff.split("\n").filter((l) => /^[+-]/.test(l) && !/^(\+\+\+|---) /.test(l));
459
+ const hit = terms.find((t) => lines.some((l) => new RegExp(`\\b${t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`).test(l)));
460
+ if (hit) {
461
+ const line = `Changes ${hit} in ${file}, which your learning "${n.title.replace(/"/g, "'")}" is about.`;
462
+ return line.length > 300 ? `${line.slice(0, 299)}…` : line;
463
+ }
464
+ }
465
+ }
466
+ return undefined;
467
+ }
468
+ /**
469
+ * Teammates' work in the same place: remote branches whose newest commit is
470
+ * from the last `days` days and from someone other than this person, that
471
+ * change files this person changed lately (or the repo's busiest files, when
472
+ * they have no history here). Newest first. Fetches first unless
473
+ * `fetch: false` (or TRAIL_NO_FETCH). Names, emails, branch and file names and
474
+ * commit subjects only: never a diff.
475
+ */
476
+ export function teammatesFromGit(repo, opts = {}) {
477
+ return teammatesChecked(repo, opts) ?? [];
478
+ }
479
+ /**
480
+ * Like {@link teammatesFromGit}, but `undefined` when there was nothing to check
481
+ * against: no origin remote, no default branch to compare with, or git failed.
482
+ * An empty list means "checked, none"; a repo without a remote wasn't checked.
483
+ */
484
+ export function teammatesChecked(repo, opts = {}) {
485
+ try {
486
+ const now = opts.now ?? Date.now();
487
+ const days = opts.days ?? 14;
488
+ const me = (git(repo, ["config", "user.email"]) ?? "").trim().toLowerCase();
489
+ const myName = (git(repo, ["config", "user.name"]) ?? "").trim().toLowerCase();
490
+ if (opts.fetch !== false && !process.env.TRAIL_NO_FETCH)
491
+ fetchQuietly(repo);
492
+ const cache = refreshBranches(repo, { fetch: false, now });
493
+ if (!cache.base)
494
+ return undefined;
495
+ const mine = new Set(myRecentFiles(repo, me));
496
+ const where = mine.size ? mine : new Set(hottestFiles(repo));
497
+ const out = [];
498
+ for (const b of cache.branches) {
499
+ if (now - b.at > days * 24 * 60 * 60 * 1000)
500
+ continue;
501
+ if (!openBranch(repo, cache.base, b.ref))
502
+ continue;
503
+ const [name = "", email = ""] = (git(repo, ["log", "-1", "--format=%aN%x09%aE", b.ref]) ?? "").trim().split("\t");
504
+ if (!name || BOT.test(name))
505
+ continue;
506
+ if ((me && email.toLowerCase() === me) || (myName && name.toLowerCase() === myName))
507
+ continue;
508
+ const files = headlineOrder(b.files.filter((f) => !ownPath(f) && where.has(f)));
509
+ if (files.length === 0)
510
+ continue;
511
+ const commits = Number((git(repo, ["rev-list", "--count", `${cache.base}..${b.ref}`]) ?? "").trim());
512
+ const conflict = conflictLine(repo, cache.base, b.ref, files, opts.learnings ?? []);
513
+ out.push({
514
+ name: name.slice(0, 80),
515
+ email: email.slice(0, 120),
516
+ branch: safeRef(b.ref.replace(/^origin\//, "")),
517
+ files: files.slice(0, 20),
518
+ change: changeLine(repo, cache.base, b.ref),
519
+ pushed_at: new Date(b.at).toISOString(),
520
+ ...(Number.isFinite(commits) && commits > 0 ? { commits } : {}),
521
+ ...(conflict ? { conflict } : {}),
522
+ });
523
+ if (out.length >= (opts.max ?? 10))
524
+ break;
525
+ }
526
+ return out.sort((a, b) => b.pushed_at.localeCompare(a.pushed_at));
527
+ }
528
+ catch {
529
+ return undefined;
530
+ }
531
+ }
532
+ /** The Trail a code is claimed against: `--server`, TRAIL_URL, or Trail cloud. */
533
+ export function connectBase(env = process.env) {
534
+ return trailUrl(env);
535
+ }
536
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/cloud/onboarding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { SavedSkill } from "../skills/found-skill.js";
2
+ import type { TeammateSummary, TokensSummary } from "./onboarding.js";
3
+ /** A pair code as the onboarding page prints it: letters and digits. */
4
+ export declare function validPairCode(code: string): boolean;
5
+ export type PhaseId = "install" | "files" | "tokens" | "prs" | "decisions" | "team" | "learnings";
6
+ type PhaseStatus = "todo" | "running" | "done";
7
+ /**
8
+ * What init found out beyond the learnings, for the onboarding page: one
9
+ * lookup's token saving, the sessions read, and teammates' branches on this
10
+ * person's files. An empty `teammates` list means "checked, none".
11
+ */
12
+ export interface PairFindings {
13
+ tokens?: TokensSummary | null;
14
+ sessions?: number;
15
+ teammates?: TeammateSummary[];
16
+ }
17
+ /** "Found 3 learnings and 1 skill for your team"; the skills part is left out when there are none. */
18
+ export declare function foundLine(learnings: number, skills: number): string;
19
+ /**
20
+ * One init run, reported to the onboarding page. Every call is best effort:
21
+ * a slow or unreachable Trail never holds up or fails init.
22
+ */
23
+ export declare class PairRun {
24
+ readonly state: string;
25
+ readonly url: string;
26
+ private readonly base;
27
+ private phases;
28
+ private chain;
29
+ private readonly fetchImpl?;
30
+ private constructor();
31
+ /**
32
+ * Tell Trail about this run, with the pair code, and return it; null when
33
+ * Trail can't be reached or turns the code down (init carries on without it).
34
+ */
35
+ static start(repo: string, code: string, opts: {
36
+ agent: string;
37
+ version: string;
38
+ fetchImpl?: typeof fetch;
39
+ }): Promise<PairRun | {
40
+ error: string;
41
+ }>;
42
+ /** Move a step on: running, or done with what it counted. */
43
+ phase(id: PhaseId, status: PhaseStatus, count?: string, log?: string): void;
44
+ /** The token step's end: the saving is an estimate (the pack against reading the files whole), and the page says so. */
45
+ tokensDone(tokens: TokensSummary | null): void;
46
+ /** The team step's end: `undefined` teammates means nothing was checked (no origin remote), not "none". */
47
+ teamDone(teammates: TeammateSummary[] | undefined): void;
48
+ /** Send what init found beyond the learnings; keys left undefined (or a null `tokens`) are left out. */
49
+ findings(f: PairFindings): void;
50
+ /**
51
+ * Hand over the repo's learnings and skills, then say the read is done. A
52
+ * learning is a `decision`; a skill is a `skill`. A skill kept for the
53
+ * person alone isn't the team's, so it stays off the page.
54
+ */
55
+ finish(repo: string, skills?: SavedSkill[]): Promise<void>;
56
+ /** Wait for every report so far to be sent (or to fail). */
57
+ flush(): Promise<void>;
58
+ /** Start the detached wait for the connection and the review. */
59
+ handOff(repo: string): void;
60
+ private send;
61
+ }
62
+ export interface FinishOptions {
63
+ fetchImpl?: typeof fetch;
64
+ sleep?: (ms: number) => Promise<void>;
65
+ now?: () => number;
66
+ /** How long to wait for the person, all told. */
67
+ waitMs?: number;
68
+ }
69
+ /**
70
+ * What `_trail-pair` runs: wait for the person to connect in the browser, save
71
+ * the connection, wait for their review, then upload this repo's learnings.
72
+ * Returns what happened, for tests.
73
+ */
74
+ export declare function finishPair(state: string, repo: string, opts?: FinishOptions): Promise<"uploaded" | "expired" | "timed_out" | "failed">;
75
+ export {};
76
+ //# sourceMappingURL=pair.d.ts.map