@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,274 @@
1
+ /**
2
+ * The repo's own CLI subcommands (phase 2 design 4.13, P23, P24): the `bin`
3
+ * names in the nearest package.json, the commander-style registrations in
4
+ * the package's source folder, and the cache that keeps SessionStart from
5
+ * scanning (`state/anchors-cache.json`, 2.7).
6
+ *
7
+ * A scan reads at most 400 files and 8 MB of `.ts .js .mjs .cjs` under `src/`
8
+ * (else the bin target's folder), within a deadline; past any limit, a
9
+ * dynamic registration, or a default command, nothing is judged. The cache
10
+ * holds command names and a 16-hex signature of the files' paths, sizes and
11
+ * mtimes, never file text. Local file reads only: no process, no network.
12
+ */
13
+ import { createHash } from 'node:crypto';
14
+ import { lstatSync, readdirSync, statSync } from 'node:fs';
15
+ import { dirname, join, normalize, relative, resolve, sep } from 'node:path';
16
+ import { exists, readSmall } from './anchors-git.js';
17
+ import { readPlain } from '../init/plain-file.js';
18
+ import { trailPath, writePrivate } from '../util/private-fs.js';
19
+ export const MAX_SRC_FILES = 400;
20
+ export const MAX_SRC_BYTES = 8 * 1024 * 1024;
21
+ const MAX_CHECKOUTS = 20;
22
+ /** At SessionStart a cache this old is not sure: the CLI may have changed since (P24). */
23
+ const START_CACHE_MS = 24 * 3600_000;
24
+ const EXT = /\.(?:[cm]?[jt]s|[jt]sx)$/;
25
+ /** The cache file is read only as a plain file this size or under (no link, no FIFO, D100). */
26
+ const MAX_CACHE_BYTES = 1024 * 1024;
27
+ /** Commands the libraries add on their own. */
28
+ const BUILT_IN = new Set(['help']);
29
+ const NAME = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,39}$/;
30
+ const inside = (top, p) => p === top || p.startsWith(top + sep);
31
+ const isDir = (p) => { try {
32
+ return statSync(p).isDirectory();
33
+ }
34
+ catch {
35
+ return false;
36
+ } };
37
+ /** The bins of the nearest package.json from the step's folder up to the checkout: name to target. null when none or unreadable. */
38
+ export function binsNear(checkout, dir) {
39
+ const top = resolve(checkout);
40
+ for (let d = resolve(top, dir); inside(top, d); d = dirname(d)) {
41
+ const file = join(d, 'package.json');
42
+ if (exists(file)) {
43
+ const text = readSmall(file, 256 * 1024);
44
+ if (text === null)
45
+ return null;
46
+ let pkg;
47
+ try {
48
+ pkg = JSON.parse(text);
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ const bins = new Map();
54
+ if (typeof pkg?.bin === 'string' && typeof pkg.name === 'string')
55
+ bins.set(pkg.name.replace(/^@[^/]+\//, ''), pkg.bin);
56
+ else if (pkg?.bin && typeof pkg.bin === 'object') {
57
+ for (const [k, v] of Object.entries(pkg.bin))
58
+ if (typeof v === 'string')
59
+ bins.set(k, v);
60
+ }
61
+ for (const [k, v] of bins)
62
+ bins.set(k, normalize(v).replace(/^\.\//, ''));
63
+ return bins.size ? { pkgDir: d, bins } : null;
64
+ }
65
+ if (d === top)
66
+ return null;
67
+ }
68
+ return null;
69
+ }
70
+ /** The folder a program's commands are registered in: `src/`, else its bin target's folder, inside the package. */
71
+ export function srcOf(pkgDir, target) {
72
+ if (isDir(join(pkgDir, 'src')))
73
+ return join(pkgDir, 'src');
74
+ const d = dirname(resolve(pkgDir, target));
75
+ return inside(pkgDir, d) && isDir(d) ? d : null;
76
+ }
77
+ /**
78
+ * The names registered with `.command('x'`, `new Command('x'`, `createCommand('x'`, `.alias('x')` and an `.aliases` array in `text` (each
79
+ * literal's first word), into `out`. false when one isn't a plain string literal, or a default command exists: then
80
+ * any word may be the CLI's, and nothing is judged.
81
+ */
82
+ export function registrations(text, out) {
83
+ if (/\bisDefault\s*:\s*true/.test(text))
84
+ return false;
85
+ // yargs' commandDir loads commands from files, and its completion() adds one: the names can't be listed (review).
86
+ if (/\.(?:commandDir|completion)\s*\(/.test(text))
87
+ return false;
88
+ const re = /\.(command|alias|aliases)\s*\(\s*|\b(?:new\s+Command|createCommand)\s*\(\s*/g;
89
+ for (let m = re.exec(text); m; m = re.exec(text)) {
90
+ let at = re.lastIndex;
91
+ const many = m[1] === 'aliases';
92
+ if (many) {
93
+ if (text[at] !== '[')
94
+ return false;
95
+ at = skipSpace(text, at + 1);
96
+ }
97
+ for (;;) {
98
+ const q = text[at];
99
+ if ((q === ')' && !many) || (q === ']' && many))
100
+ break; // `new Command()`, `.alias()` read back, `[]`
101
+ if (q !== "'" && q !== '"' && q !== '`')
102
+ return false;
103
+ const end = text.indexOf(q, at + 1);
104
+ const lit = end < 0 ? '' : text.slice(at + 1, end);
105
+ if (end < 0 || /[\\\n]/.test(lit) || (q === '`' && lit.includes('${')))
106
+ return false;
107
+ const name = lit.trim().split(/\s+/)[0] ?? '';
108
+ if (name === '$0' || name === '*')
109
+ return false;
110
+ if (name)
111
+ out.add(name);
112
+ if (!many)
113
+ break;
114
+ at = skipSpace(text, end + 1);
115
+ if (text[at] === ',')
116
+ at = skipSpace(text, at + 1);
117
+ else if (text[at] !== ']')
118
+ return false;
119
+ }
120
+ }
121
+ return true;
122
+ }
123
+ const skipSpace = (t, i) => { while (i < t.length && /\s/.test(t[i]))
124
+ i++; return i; };
125
+ /** The source files (stat only), their signature, and whether a limit was passed. null past the deadline. */
126
+ function walk(cli, src, deadline) {
127
+ const files = [];
128
+ const parts = [];
129
+ let bytes = 0;
130
+ try {
131
+ const p = statSync(join(cli.pkgDir, 'package.json'));
132
+ parts.push(`package.json\0${p.size}\0${Math.trunc(p.mtimeMs)}`);
133
+ }
134
+ catch { /* the bins were read from it a moment ago */ }
135
+ const stack = [src];
136
+ while (stack.length) {
137
+ if (Date.now() > deadline)
138
+ return null;
139
+ const d = stack.pop();
140
+ let entries;
141
+ try {
142
+ entries = readdirSync(d, { withFileTypes: true });
143
+ }
144
+ catch {
145
+ continue;
146
+ }
147
+ entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
148
+ for (const e of entries) {
149
+ if (e.name.startsWith('.') || e.name === 'node_modules')
150
+ continue;
151
+ const p = join(d, e.name);
152
+ // A linked folder or source file can hold registrations the walk doesn't follow: not sure (review).
153
+ if (e.isSymbolicLink()) {
154
+ if (EXT.test(e.name) || isDir(p))
155
+ return { files, sig: sigOf(cli, parts), over: true };
156
+ continue;
157
+ }
158
+ if (e.isDirectory()) {
159
+ stack.push(p);
160
+ continue;
161
+ }
162
+ if (!e.isFile() || !EXT.test(e.name))
163
+ continue;
164
+ const st = lstatSync(p);
165
+ files.push(p);
166
+ bytes += st.size;
167
+ parts.push(`${relative(cli.pkgDir, p)}\0${st.size}\0${Math.trunc(st.mtimeMs)}`);
168
+ if (files.length > MAX_SRC_FILES || bytes > MAX_SRC_BYTES)
169
+ return { files, sig: sigOf(cli, parts), over: true };
170
+ }
171
+ }
172
+ // The bin target outside the source folder can register commands too (a hand-written bin/acme.js; review).
173
+ const target = resolve(cli.pkgDir, cli.target);
174
+ if (inside(cli.pkgDir, target) && !inside(src, target)) {
175
+ try {
176
+ const st = lstatSync(target);
177
+ if (st.isFile()) {
178
+ files.push(target);
179
+ bytes += st.size;
180
+ parts.push(`${relative(cli.pkgDir, target)}\0${st.size}\0${Math.trunc(st.mtimeMs)}`);
181
+ if (bytes > MAX_SRC_BYTES)
182
+ return { files, sig: sigOf(cli, parts), over: true };
183
+ }
184
+ }
185
+ catch { /* not built yet: the source folder is all there is */ }
186
+ }
187
+ return { files, sig: sigOf(cli, parts), over: false };
188
+ }
189
+ const sigOf = (cli, parts) => createHash('sha256').update(`${cli.pkgDir}\n${parts.join('\n')}`).digest('hex').slice(0, 16);
190
+ /** Every name registered in the files, or [] when not sure (a dynamic one, a default command). null past the deadline. */
191
+ function scanNames(files, deadline) {
192
+ const names = new Set();
193
+ for (const f of files) {
194
+ if (Date.now() > deadline)
195
+ return null;
196
+ const text = readSmall(f, MAX_SRC_BYTES);
197
+ if (text === null || !registrations(text, names))
198
+ return [];
199
+ }
200
+ const list = [...names].filter((n) => NAME.test(n)).sort();
201
+ return list.length === names.size && list.length <= 200 ? list : [];
202
+ }
203
+ const cachePath = (env) => trailPath(env, 'state', 'anchors-cache.json');
204
+ /** Per checkout, and per package below its top: two packages' programs of one name never share names (review). */
205
+ const keyOf = (checkout, pkgDir) => {
206
+ const rel = relative(resolve(checkout), resolve(pkgDir));
207
+ return createHash('sha256').update(rel ? `${resolve(checkout)}\0${rel}` : resolve(checkout)).digest('hex').slice(0, 12);
208
+ };
209
+ function readCache(env) {
210
+ let raw = null;
211
+ try {
212
+ const text = readPlain(cachePath(env), MAX_CACHE_BYTES);
213
+ raw = text === null ? null : JSON.parse(text);
214
+ }
215
+ catch { /* read as empty */ }
216
+ const ok = raw && typeof raw === 'object' && raw.checkouts && typeof raw.checkouts === 'object' && !Array.isArray(raw.checkouts);
217
+ const checkouts = {};
218
+ if (raw && ok) {
219
+ for (const [k, e] of Object.entries(raw.checkouts)) {
220
+ if (!/^[0-9a-f]{12}$/.test(k) || !e || typeof e.sig !== 'string' || typeof e.at !== 'string' || !e.cli || typeof e.cli !== 'object')
221
+ continue;
222
+ const cli = {};
223
+ for (const [p, names] of Object.entries(e.cli))
224
+ if (Array.isArray(names))
225
+ cli[p] = names.filter((n) => typeof n === 'string' && NAME.test(n));
226
+ checkouts[k] = { sig: e.sig, cli, at: e.at };
227
+ }
228
+ }
229
+ return { v: 1, checkouts };
230
+ }
231
+ function writeCache(env, file) {
232
+ const keep = Object.entries(file.checkouts).sort((a, b) => Date.parse(b[1].at) - Date.parse(a[1].at)).slice(0, MAX_CHECKOUTS);
233
+ try {
234
+ writePrivate(cachePath(env), JSON.stringify({ v: 1, checkouts: Object.fromEntries(keep) }));
235
+ }
236
+ catch { /* scanned again next time */ }
237
+ }
238
+ /**
239
+ * The names the program registers, or null when not known. `scan: false` (SessionStart) reads only the cache, and
240
+ * only an entry under a day old; `scan: true` walks the files (stat only) and reads them only when the signature
241
+ * moved, then writes the cache. Past the deadline: null, nothing written.
242
+ */
243
+ export function cliNames(cli, checkout, env, opts) {
244
+ const file = readCache(env);
245
+ const key = keyOf(checkout, cli.pkgDir);
246
+ const entry = file.checkouts[key];
247
+ if (!opts.scan) {
248
+ const age = entry ? Date.now() - Date.parse(entry.at) : NaN;
249
+ return entry && age >= 0 && age < START_CACHE_MS ? entry.cli[cli.prog] ?? null : null;
250
+ }
251
+ const src = srcOf(cli.pkgDir, cli.target);
252
+ const w = src ? walk(cli, src, opts.deadline) : null;
253
+ if (!w)
254
+ return null;
255
+ let names = w.over ? [] : null;
256
+ if (!names && entry?.sig === w.sig && entry.cli[cli.prog])
257
+ return entry.cli[cli.prog];
258
+ names ??= scanNames(w.files, opts.deadline);
259
+ if (!names)
260
+ return null;
261
+ const cliMap = entry?.sig === w.sig ? { ...entry.cli } : {};
262
+ cliMap[cli.prog] = names;
263
+ file.checkouts[key] = { sig: w.sig, cli: cliMap, at: new Date().toISOString() };
264
+ writeCache(env, file);
265
+ return names;
266
+ }
267
+ /** Gone only when at least 3 other registrations were found, none dynamic, and `x` isn't among them (P23). */
268
+ export function subcommandGone(names, x) {
269
+ if (!names || BUILT_IN.has(x))
270
+ return false;
271
+ const others = names.filter((n) => n !== x && !BUILT_IN.has(n));
272
+ return others.length >= 3 && !names.includes(x);
273
+ }
274
+ //# sourceMappingURL=anchors-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchors-cli.js","sourceRoot":"","sources":["../../src/skills/anchors-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Anchor } from './anchors.js';
2
+ export declare const MAX_READ: number;
3
+ export declare function readSmall(path: string, max?: number): string | null;
4
+ export declare const isFile: (p: string) => boolean;
5
+ export declare const exists: (p: string) => boolean;
6
+ export interface Git {
7
+ common: string;
8
+ remotes: Map<string, string>;
9
+ packed: string | null | undefined;
10
+ reftable: boolean;
11
+ sparse: boolean;
12
+ }
13
+ /** The common git folder (through a worktree's gitdir and commondir), its remotes and packed refs. Null outside git. */
14
+ export declare function gitOf(checkout: string): Git | null;
15
+ /** A ref's object id (loose, then packed), or null when it isn't there or can't be read (phase 2 c4: the CI check). */
16
+ export declare function refOid(git: Git, ref: string): string | null;
17
+ /** Branch anchor gone? null when it can't be known (the remote isn't one this checkout has). */
18
+ export declare function branchGone(git: Git, a: Anchor): {
19
+ gone: boolean;
20
+ remote?: string;
21
+ } | null;
22
+ /**
23
+ * D136 (3): the branch names a checkout knows, local and remote (`refs/heads/<b>`, `refs/remotes/<r>/<b>`), loose and
24
+ * packed, so "deploy it to dev" can be the ship job for any branch the repo has. Empty outside git, or under reftable.
25
+ */
26
+ export declare function repoBranches(checkout: string): Set<string>;
27
+ /** A lazy `hasBranch` for matchJob (D136 (3)): the checkout's branches are read at the first ask that needs them, once a process. */
28
+ export declare function branchTest(checkout: string): (name: string) => boolean;
29
+ //# sourceMappingURL=anchors-git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchors-git.d.ts","sourceRoot":"","sources":["../../src/skills/anchors-git.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,eAAO,MAAM,QAAQ,QAAc,CAAC;AAEpC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAW,GAAG,MAAM,GAAG,IAAI,CAQrE;AACD,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,YAAqE,CAAC;AACtG,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,YAAkE,CAAC;AAEnG,MAAM,WAAW,GAAG;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE;AAE5I,wHAAwH;AACxH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAgClD;AAqDD,uHAAuH;AACvH,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO3D;AAgBD,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAezF;AAMD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAoB1D;AAGD,qIAAqI;AACrI,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAUtE"}
@@ -0,0 +1,241 @@
1
+ /**
2
+ * The file reads under "may be out of date" (design 4.18, R35): small files, and a checkout's git folder (its
3
+ * remotes, loose refs and packed-refs, through a worktree's or submodule's `gitdir` and `commondir`). No process, no
4
+ * network, nothing written. Split from anchors.ts (500-line rule).
5
+ */
6
+ import { readdirSync, readFileSync, statSync } from 'node:fs';
7
+ import { dirname, join, resolve } from 'node:path';
8
+ export const MAX_READ = 1024 * 1024;
9
+ export function readSmall(path, max = MAX_READ) {
10
+ try {
11
+ const st = statSync(path);
12
+ if (!st.isFile() || st.size > max)
13
+ return null;
14
+ return readFileSync(path, 'utf8');
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ export const isFile = (p) => { try {
21
+ return statSync(p).isFile();
22
+ }
23
+ catch {
24
+ return false;
25
+ } };
26
+ export const exists = (p) => { try {
27
+ statSync(p);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ } };
33
+ /** The common git folder (through a worktree's gitdir and commondir), its remotes and packed refs. Null outside git. */
34
+ export function gitOf(checkout) {
35
+ if (!checkout)
36
+ return null;
37
+ let dir = resolve(checkout);
38
+ let gitDir = null;
39
+ for (let n = 0; n < 40; n++, dir = dirname(dir)) {
40
+ const dot = join(dir, '.git');
41
+ try {
42
+ const st = statSync(dot);
43
+ if (st.isDirectory())
44
+ gitDir = dot;
45
+ else if (st.isFile()) {
46
+ const m = /^gitdir:\s*(.+?)\s*$/m.exec(readSmall(dot, 4096) ?? '');
47
+ if (m)
48
+ gitDir = resolve(dir, m[1]);
49
+ }
50
+ }
51
+ catch { /* keep looking up */ }
52
+ if (gitDir || dirname(dir) === dir)
53
+ break;
54
+ }
55
+ if (!gitDir)
56
+ return null;
57
+ const cd = readSmall(join(gitDir, 'commondir'), 4096);
58
+ const common = cd ? resolve(gitDir, cd.trim()) : gitDir;
59
+ const remotes = new Map();
60
+ let current = null;
61
+ for (const line of (readSmall(join(common, 'config')) ?? '').split('\n')) {
62
+ const sec = /^\s*\[\s*remote\s+"([^"]+)"\s*\]/.exec(line);
63
+ if (sec) {
64
+ current = sec[1];
65
+ continue;
66
+ }
67
+ if (/^\s*\[/.test(line)) {
68
+ current = null;
69
+ continue;
70
+ }
71
+ const url = /^\s*url\s*=\s*(.+?)\s*$/.exec(line);
72
+ if (current && url)
73
+ remotes.set(current, url[1]);
74
+ }
75
+ const reftable = exists(join(common, 'reftable'));
76
+ // A sparse checkout leaves files out on purpose (the file can stay after `sparse-checkout disable`: not sure either way).
77
+ const sparse = exists(join(gitDir, 'info', 'sparse-checkout')) || exists(join(common, 'info', 'sparse-checkout'));
78
+ return { common, remotes, packed: undefined, reftable, sparse };
79
+ }
80
+ /** `host/owner/repo` for an https, ssh or scp-style URL; null otherwise (a remote's name). */
81
+ function urlKey(url) {
82
+ const u = url.trim().replace(/\/+$/, '').replace(/\.git$/, '');
83
+ const m = /^[a-z][a-z0-9+.-]*:\/\/(?:[^@/]+@)?([^/:]+)(?::\d+)?\/(.+)$/i.exec(u);
84
+ if (m)
85
+ return `${m[1].toLowerCase()}/${m[2]}`;
86
+ const scp = /^(?:[^@/:]+@)?([^/:]+):([^/].*)$/.exec(u);
87
+ return scp ? `${scp[1].toLowerCase()}/${scp[2]}` : null;
88
+ }
89
+ /** The remote's name: itself when the config has it, else the remote whose URL is the same repo; null when none. */
90
+ function remoteName(git, remote) {
91
+ if (git.remotes.has(remote) || exists(join(git.common, 'refs', 'remotes', remote)))
92
+ return remote;
93
+ const want = urlKey(remote);
94
+ if (!want)
95
+ return null;
96
+ for (const [name, url] of git.remotes)
97
+ if (urlKey(url) === want)
98
+ return name;
99
+ return null;
100
+ }
101
+ /** packed-refs past this is not read: one search of a 15 MB file took 12 ms, five skills 400 ms (review). Not sure, never gone. */
102
+ const MAX_PACKED = 4 * MAX_READ;
103
+ /**
104
+ * The packed refs' text, `\n` first and last, searched with indexOf; '' when there is none, null when it is too big
105
+ * or can't be read (not sure). Held in memory for the process while its size and mtime stay: a hook checks up to 5
106
+ * skills against one file. Nothing is written (R35).
107
+ */
108
+ let packedMemo = null;
109
+ function packed(git) {
110
+ if (git.packed === undefined) {
111
+ const path = join(git.common, 'packed-refs');
112
+ let text = '';
113
+ try {
114
+ const st = statSync(path);
115
+ if (packedMemo && packedMemo.path === path && packedMemo.size === st.size && packedMemo.mtimeMs === st.mtimeMs)
116
+ text = packedMemo.text;
117
+ else {
118
+ const raw = readSmall(path, MAX_PACKED);
119
+ text = raw === null ? null : `\n${raw}\n`.replace(/\r/g, '');
120
+ packedMemo = { path, size: st.size, mtimeMs: st.mtimeMs, text };
121
+ }
122
+ }
123
+ catch { /* no packed-refs: nothing packed */ }
124
+ git.packed = text;
125
+ }
126
+ return git.packed;
127
+ }
128
+ /** Is the ref there: true, false, or null when packed-refs couldn't be read and it isn't loose. */
129
+ function hasRef(git, ref) {
130
+ if (isFile(join(git.common, ...ref.split('/'))))
131
+ return true;
132
+ const text = packed(git);
133
+ return text === null ? null : text.includes(` ${ref}\n`);
134
+ }
135
+ /** A ref's object id (loose, then packed), or null when it isn't there or can't be read (phase 2 c4: the CI check). */
136
+ export function refOid(git, ref) {
137
+ if (git.reftable)
138
+ return null;
139
+ const loose = readSmall(join(git.common, ...ref.split('/')), 4096);
140
+ if (loose !== null)
141
+ return /^[0-9a-f]{40,64}\s*$/.test(loose) ? loose.trim() : null;
142
+ const text = packed(git);
143
+ const m = text === null ? null : new RegExp(`\\n([0-9a-f]{40,64}) ${ref.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\n`).exec(text);
144
+ return m ? m[1] : null;
145
+ }
146
+ /** Does the checkout know any of this remote's branches (a loose ref under refs/remotes/<remote>, or a packed one)? */
147
+ function remoteKnown(git, remote) {
148
+ try {
149
+ if (readdirSync(join(git.common, 'refs', 'remotes', remote)).some((n) => n !== 'HEAD'))
150
+ return true;
151
+ }
152
+ catch { /* none loose */ }
153
+ const text = packed(git);
154
+ if (text === null)
155
+ return false;
156
+ const key = ` refs/remotes/${remote}/`;
157
+ for (let i = text.indexOf(key); i >= 0; i = text.indexOf(key, i + 1)) {
158
+ if (!text.startsWith('HEAD\n', i + key.length))
159
+ return true;
160
+ }
161
+ return false;
162
+ }
163
+ /** Branch anchor gone? null when it can't be known (the remote isn't one this checkout has). */
164
+ export function branchGone(git, a) {
165
+ // reftable keeps refs in neither loose files nor packed-refs: nothing here can say a branch is gone.
166
+ if (git.reftable)
167
+ return null;
168
+ if (a.via === 'checkout') {
169
+ const local = hasRef(git, `refs/heads/${a.name}`);
170
+ if (local !== false)
171
+ return local ? { gone: false } : null;
172
+ let remotes = [...git.remotes.keys()];
173
+ try {
174
+ remotes = [...new Set([...remotes, ...readdirSync(join(git.common, 'refs', 'remotes'))])];
175
+ }
176
+ catch { /* none */ }
177
+ return remotes.some((r) => hasRef(git, `refs/remotes/${r}/${a.name}`) === true) ? { gone: false } : { gone: true };
178
+ }
179
+ const remote = a.remote ? remoteName(git, a.remote) : null;
180
+ // A remote this checkout never fetched says nothing about its branches.
181
+ if (!remote || !remoteKnown(git, remote))
182
+ return null;
183
+ const has = hasRef(git, `refs/remotes/${remote}/${a.name}`);
184
+ return has === null ? null : { gone: !has, remote };
185
+ }
186
+ /** At most this many branch names are read from one checkout. */
187
+ const MAX_BRANCHES = 2000;
188
+ /**
189
+ * D136 (3): the branch names a checkout knows, local and remote (`refs/heads/<b>`, `refs/remotes/<r>/<b>`), loose and
190
+ * packed, so "deploy it to dev" can be the ship job for any branch the repo has. Empty outside git, or under reftable.
191
+ */
192
+ export function repoBranches(checkout) {
193
+ const out = new Set();
194
+ const git = gitOf(checkout);
195
+ if (!git || git.reftable)
196
+ return out;
197
+ const add = (name) => { if (name && name !== 'HEAD' && out.size < MAX_BRANCHES)
198
+ out.add(name); };
199
+ const walk = (dir, prefix, depth) => {
200
+ if (depth > 6 || out.size >= MAX_BRANCHES)
201
+ return;
202
+ let names;
203
+ try {
204
+ names = readdirSync(dir, { withFileTypes: true });
205
+ }
206
+ catch {
207
+ return;
208
+ }
209
+ for (const e of names) {
210
+ if (e.isDirectory())
211
+ walk(join(dir, e.name), `${prefix}${e.name}/`, depth + 1);
212
+ else if (e.isFile())
213
+ add(`${prefix}${e.name}`);
214
+ }
215
+ };
216
+ walk(join(git.common, 'refs', 'heads'), '', 0);
217
+ try {
218
+ for (const r of readdirSync(join(git.common, 'refs', 'remotes')))
219
+ walk(join(git.common, 'refs', 'remotes', r), '', 0);
220
+ }
221
+ catch { /* no remotes */ }
222
+ for (const m of (packed(git) ?? '').matchAll(/ refs\/(?:heads|remotes\/[^/\s]+)\/(\S+)\n/g))
223
+ add(m[1]);
224
+ return out;
225
+ }
226
+ const branchMemo = new Map();
227
+ /** A lazy `hasBranch` for matchJob (D136 (3)): the checkout's branches are read at the first ask that needs them, once a process. */
228
+ export function branchTest(checkout) {
229
+ return (name) => {
230
+ if (!checkout)
231
+ return false;
232
+ let b = branchMemo.get(checkout);
233
+ if (!b) {
234
+ if (branchMemo.size >= 20)
235
+ branchMemo.clear();
236
+ branchMemo.set(checkout, (b = repoBranches(checkout)));
237
+ }
238
+ return b.has(name);
239
+ };
240
+ }
241
+ //# sourceMappingURL=anchors-git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchors-git.js","sourceRoot":"","sources":["../../src/skills/anchors-git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ParsedSkill } from './types.js';
2
+ export type WideKind = 'ci-file' | 'service' | 'subcommand';
3
+ /** where: the compose file (relative to the checkout) for a service, the program for a subcommand, 'GitHub Actions' for a CI file. */
4
+ export interface WideAnchor {
5
+ kind: WideKind;
6
+ name: string;
7
+ step: number;
8
+ where: string;
9
+ }
10
+ /** The subcommand scan's own deadline (4.13), inside the prompt hook's 400 ms. */
11
+ export declare const WIDE_SCAN_MS = 150;
12
+ /** The wider anchors in the skill's steps that can be checked here, each once (the first step that leans on it). */
13
+ export declare function wideAnchorsOf(skill: ParsedSkill, checkout: string, _env?: NodeJS.ProcessEnv): WideAnchor[];
14
+ /** The service keys one indent under a column-0 `services:`; null when not sure (4.13, P25). */
15
+ export declare function composeServices(text: string): Set<string> | null;
16
+ /**
17
+ * Gone only when sure (4.13). `scan: false` reads only the cache for subcommands (SessionStart); `scan: true` may
18
+ * scan the CLI's source until `deadline` (default: WIDE_SCAN_MS from now). A check that throws or runs out of time is
19
+ * not gone, and a scan past its deadline caches nothing.
20
+ */
21
+ export declare function wideGone(skill: ParsedSkill, checkout: string, env?: NodeJS.ProcessEnv, opts?: {
22
+ scan: boolean;
23
+ deadline?: number;
24
+ }): WideAnchor[];
25
+ //# sourceMappingURL=anchors-wide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchors-wide.d.ts","sourceRoot":"","sources":["../../src/skills/anchors-wide.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAC5D,sIAAsI;AACtI,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAEzF,kFAAkF;AAClF,eAAO,MAAM,YAAY,MAAM,CAAC;AA0NhC,oHAAoH;AACpH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,UAAwB,GAAG,UAAU,EAAE,CAEvH;AAuDD,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CA0BhE;AAiBD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,IAAI,GAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAoB,GAAG,UAAU,EAAE,CA2B/K"}