@smthrs/std 0.0.0-stage → 1.0.0-rc.3

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 (555) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/LICENSE +21 -0
  3. package/README.md +152 -2
  4. package/dist/cjs/ApplyPatch.d.ts +174 -0
  5. package/dist/cjs/ApplyPatch.d.ts.map +1 -0
  6. package/dist/cjs/ApplyPatch.js +309 -0
  7. package/dist/cjs/ApplyPatch.js.map +7 -0
  8. package/dist/cjs/Bash.d.ts +304 -0
  9. package/dist/cjs/Bash.d.ts.map +1 -0
  10. package/dist/cjs/Bash.js +321 -0
  11. package/dist/cjs/Bash.js.map +7 -0
  12. package/dist/cjs/Checkpoints.d.ts +279 -0
  13. package/dist/cjs/Checkpoints.d.ts.map +1 -0
  14. package/dist/cjs/Checkpoints.js +145 -0
  15. package/dist/cjs/Checkpoints.js.map +7 -0
  16. package/dist/cjs/Container.d.ts +132 -0
  17. package/dist/cjs/Container.d.ts.map +1 -0
  18. package/dist/cjs/Container.js +113 -0
  19. package/dist/cjs/Container.js.map +7 -0
  20. package/dist/cjs/Edit.d.ts +203 -0
  21. package/dist/cjs/Edit.d.ts.map +1 -0
  22. package/dist/cjs/Edit.js +258 -0
  23. package/dist/cjs/Edit.js.map +7 -0
  24. package/dist/cjs/ExaWebSearch.d.ts +22 -0
  25. package/dist/cjs/ExaWebSearch.d.ts.map +1 -0
  26. package/dist/cjs/ExaWebSearch.js +138 -0
  27. package/dist/cjs/ExaWebSearch.js.map +7 -0
  28. package/dist/cjs/Explore.d.ts +328 -0
  29. package/dist/cjs/Explore.d.ts.map +1 -0
  30. package/dist/cjs/Explore.js +90 -0
  31. package/dist/cjs/Explore.js.map +7 -0
  32. package/dist/cjs/Fetch.d.ts +130 -0
  33. package/dist/cjs/Fetch.d.ts.map +1 -0
  34. package/dist/cjs/Fetch.js +64 -0
  35. package/dist/cjs/Fetch.js.map +7 -0
  36. package/dist/cjs/Glob.d.ts +204 -0
  37. package/dist/cjs/Glob.d.ts.map +1 -0
  38. package/dist/cjs/Glob.js +94 -0
  39. package/dist/cjs/Glob.js.map +7 -0
  40. package/dist/cjs/Grep.d.ts +347 -0
  41. package/dist/cjs/Grep.d.ts.map +1 -0
  42. package/dist/cjs/Grep.js +181 -0
  43. package/dist/cjs/Grep.js.map +7 -0
  44. package/dist/cjs/HttpPost.d.ts +130 -0
  45. package/dist/cjs/HttpPost.d.ts.map +1 -0
  46. package/dist/cjs/HttpPost.js +72 -0
  47. package/dist/cjs/HttpPost.js.map +7 -0
  48. package/dist/cjs/LanguageServer.d.ts +90 -0
  49. package/dist/cjs/LanguageServer.d.ts.map +1 -0
  50. package/dist/cjs/LanguageServer.js +60 -0
  51. package/dist/cjs/LanguageServer.js.map +7 -0
  52. package/dist/cjs/Ls.d.ts +164 -0
  53. package/dist/cjs/Ls.d.ts.map +1 -0
  54. package/dist/cjs/Ls.js +136 -0
  55. package/dist/cjs/Ls.js.map +7 -0
  56. package/dist/cjs/Lsp.d.ts +125 -0
  57. package/dist/cjs/Lsp.d.ts.map +1 -0
  58. package/dist/cjs/Lsp.js +137 -0
  59. package/dist/cjs/Lsp.js.map +7 -0
  60. package/dist/cjs/Manifest.d.ts +918 -0
  61. package/dist/cjs/Manifest.d.ts.map +1 -0
  62. package/dist/cjs/Manifest.js +144 -0
  63. package/dist/cjs/Manifest.js.map +7 -0
  64. package/dist/cjs/NativeSearch.d.ts +38 -0
  65. package/dist/cjs/NativeSearch.d.ts.map +1 -0
  66. package/dist/cjs/NativeSearch.js +326 -0
  67. package/dist/cjs/NativeSearch.js.map +7 -0
  68. package/dist/cjs/NodeLanguageServer.d.ts +128 -0
  69. package/dist/cjs/NodeLanguageServer.d.ts.map +1 -0
  70. package/dist/cjs/NodeLanguageServer.js +796 -0
  71. package/dist/cjs/NodeLanguageServer.js.map +7 -0
  72. package/dist/cjs/PortableSearch.d.ts +24 -0
  73. package/dist/cjs/PortableSearch.d.ts.map +1 -0
  74. package/dist/cjs/PortableSearch.js +233 -0
  75. package/dist/cjs/PortableSearch.js.map +7 -0
  76. package/dist/cjs/Probe.d.ts +193 -0
  77. package/dist/cjs/Probe.d.ts.map +1 -0
  78. package/dist/cjs/Probe.js +134 -0
  79. package/dist/cjs/Probe.js.map +7 -0
  80. package/dist/cjs/Read.d.ts +189 -0
  81. package/dist/cjs/Read.d.ts.map +1 -0
  82. package/dist/cjs/Read.js +223 -0
  83. package/dist/cjs/Read.js.map +7 -0
  84. package/dist/cjs/Relocate.d.ts +73 -0
  85. package/dist/cjs/Relocate.d.ts.map +1 -0
  86. package/dist/cjs/Relocate.js +72 -0
  87. package/dist/cjs/Relocate.js.map +7 -0
  88. package/dist/cjs/Search.d.ts +163 -0
  89. package/dist/cjs/Search.d.ts.map +1 -0
  90. package/dist/cjs/Search.js +51 -0
  91. package/dist/cjs/Search.js.map +7 -0
  92. package/dist/cjs/SearchConformance.d.ts +115 -0
  93. package/dist/cjs/SearchConformance.d.ts.map +1 -0
  94. package/dist/cjs/SearchConformance.js +172 -0
  95. package/dist/cjs/SearchConformance.js.map +7 -0
  96. package/dist/cjs/SearchContract.d.ts +114 -0
  97. package/dist/cjs/SearchContract.d.ts.map +1 -0
  98. package/dist/cjs/SearchContract.js +339 -0
  99. package/dist/cjs/SearchContract.js.map +7 -0
  100. package/dist/cjs/ShellCommand.d.ts +164 -0
  101. package/dist/cjs/ShellCommand.d.ts.map +1 -0
  102. package/dist/cjs/ShellCommand.js +102 -0
  103. package/dist/cjs/ShellCommand.js.map +7 -0
  104. package/dist/cjs/StdError.d.ts +55 -0
  105. package/dist/cjs/StdError.d.ts.map +1 -0
  106. package/dist/cjs/StdError.js +74 -0
  107. package/dist/cjs/StdError.js.map +7 -0
  108. package/dist/cjs/TestRun.d.ts +311 -0
  109. package/dist/cjs/TestRun.d.ts.map +1 -0
  110. package/dist/cjs/TestRun.js +228 -0
  111. package/dist/cjs/TestRun.js.map +7 -0
  112. package/dist/cjs/TestRunner.d.ts +102 -0
  113. package/dist/cjs/TestRunner.d.ts.map +1 -0
  114. package/dist/cjs/TestRunner.js +54 -0
  115. package/dist/cjs/TestRunner.js.map +7 -0
  116. package/dist/cjs/TreeFingerprint.d.ts +140 -0
  117. package/dist/cjs/TreeFingerprint.d.ts.map +1 -0
  118. package/dist/cjs/TreeFingerprint.js +87 -0
  119. package/dist/cjs/TreeFingerprint.js.map +7 -0
  120. package/dist/cjs/UpdatePlan.d.ts +152 -0
  121. package/dist/cjs/UpdatePlan.d.ts.map +1 -0
  122. package/dist/cjs/UpdatePlan.js +87 -0
  123. package/dist/cjs/UpdatePlan.js.map +7 -0
  124. package/dist/cjs/WebFetch.d.ts +134 -0
  125. package/dist/cjs/WebFetch.d.ts.map +1 -0
  126. package/dist/cjs/WebFetch.js +140 -0
  127. package/dist/cjs/WebFetch.js.map +7 -0
  128. package/dist/cjs/WebSearch.d.ts +181 -0
  129. package/dist/cjs/WebSearch.d.ts.map +1 -0
  130. package/dist/cjs/WebSearch.js +86 -0
  131. package/dist/cjs/WebSearch.js.map +7 -0
  132. package/dist/cjs/Write.d.ts +147 -0
  133. package/dist/cjs/Write.d.ts.map +1 -0
  134. package/dist/cjs/Write.js +122 -0
  135. package/dist/cjs/Write.js.map +7 -0
  136. package/dist/cjs/index.d.ts +127 -0
  137. package/dist/cjs/index.d.ts.map +1 -0
  138. package/dist/cjs/index.js +99 -0
  139. package/dist/cjs/index.js.map +7 -0
  140. package/dist/cjs/internal/ApplyPatch.d.ts +145 -0
  141. package/dist/cjs/internal/ApplyPatch.d.ts.map +1 -0
  142. package/dist/cjs/internal/ApplyPatch.js +462 -0
  143. package/dist/cjs/internal/ApplyPatch.js.map +7 -0
  144. package/dist/cjs/internal/CodexText.d.ts +73 -0
  145. package/dist/cjs/internal/CodexText.d.ts.map +1 -0
  146. package/dist/cjs/internal/CodexText.js +108 -0
  147. package/dist/cjs/internal/CodexText.js.map +7 -0
  148. package/dist/cjs/internal/Declaration.d.ts +49 -0
  149. package/dist/cjs/internal/Declaration.d.ts.map +1 -0
  150. package/dist/cjs/internal/Declaration.js +46 -0
  151. package/dist/cjs/internal/Declaration.js.map +7 -0
  152. package/dist/cjs/internal/Diagnostics.d.ts +77 -0
  153. package/dist/cjs/internal/Diagnostics.d.ts.map +1 -0
  154. package/dist/cjs/internal/Diagnostics.js +89 -0
  155. package/dist/cjs/internal/Diagnostics.js.map +7 -0
  156. package/dist/cjs/internal/EnvelopePrecheck.d.ts +67 -0
  157. package/dist/cjs/internal/EnvelopePrecheck.d.ts.map +1 -0
  158. package/dist/cjs/internal/EnvelopePrecheck.js +124 -0
  159. package/dist/cjs/internal/EnvelopePrecheck.js.map +7 -0
  160. package/dist/cjs/internal/Exec.d.ts +139 -0
  161. package/dist/cjs/internal/Exec.d.ts.map +1 -0
  162. package/dist/cjs/internal/Exec.js +158 -0
  163. package/dist/cjs/internal/Exec.js.map +7 -0
  164. package/dist/cjs/internal/FileMutation.d.ts +109 -0
  165. package/dist/cjs/internal/FileMutation.d.ts.map +1 -0
  166. package/dist/cjs/internal/FileMutation.js +116 -0
  167. package/dist/cjs/internal/FileMutation.js.map +7 -0
  168. package/dist/cjs/internal/FsFailure.d.ts +38 -0
  169. package/dist/cjs/internal/FsFailure.d.ts.map +1 -0
  170. package/dist/cjs/internal/FsFailure.js +40 -0
  171. package/dist/cjs/internal/FsFailure.js.map +7 -0
  172. package/dist/cjs/internal/GitWorktree.d.ts +98 -0
  173. package/dist/cjs/internal/GitWorktree.d.ts.map +1 -0
  174. package/dist/cjs/internal/GitWorktree.js +270 -0
  175. package/dist/cjs/internal/GitWorktree.js.map +7 -0
  176. package/dist/cjs/internal/Grouping.d.ts +51 -0
  177. package/dist/cjs/internal/Grouping.d.ts.map +1 -0
  178. package/dist/cjs/internal/Grouping.js +83 -0
  179. package/dist/cjs/internal/Grouping.js.map +7 -0
  180. package/dist/cjs/internal/Html.d.ts +20 -0
  181. package/dist/cjs/internal/Html.d.ts.map +1 -0
  182. package/dist/cjs/internal/Html.js +81 -0
  183. package/dist/cjs/internal/Html.js.map +7 -0
  184. package/dist/cjs/internal/Http.d.ts +95 -0
  185. package/dist/cjs/internal/Http.d.ts.map +1 -0
  186. package/dist/cjs/internal/Http.js +153 -0
  187. package/dist/cjs/internal/Http.js.map +7 -0
  188. package/dist/cjs/internal/HttpNetwork.d.ts +27 -0
  189. package/dist/cjs/internal/HttpNetwork.d.ts.map +1 -0
  190. package/dist/cjs/internal/HttpNetwork.js +146 -0
  191. package/dist/cjs/internal/HttpNetwork.js.map +7 -0
  192. package/dist/cjs/internal/Ignore.d.ts +37 -0
  193. package/dist/cjs/internal/Ignore.d.ts.map +1 -0
  194. package/dist/cjs/internal/Ignore.js +100 -0
  195. package/dist/cjs/internal/Ignore.js.map +7 -0
  196. package/dist/cjs/internal/LinearRegex.d.ts +19 -0
  197. package/dist/cjs/internal/LinearRegex.d.ts.map +1 -0
  198. package/dist/cjs/internal/LinearRegex.js +166 -0
  199. package/dist/cjs/internal/LinearRegex.js.map +7 -0
  200. package/dist/cjs/internal/Match.d.ts +85 -0
  201. package/dist/cjs/internal/Match.d.ts.map +1 -0
  202. package/dist/cjs/internal/Match.js +99 -0
  203. package/dist/cjs/internal/Match.js.map +7 -0
  204. package/dist/cjs/internal/Paths.d.ts +23 -0
  205. package/dist/cjs/internal/Paths.d.ts.map +1 -0
  206. package/dist/cjs/internal/Paths.js +52 -0
  207. package/dist/cjs/internal/Paths.js.map +7 -0
  208. package/dist/cjs/internal/Preserve.d.ts +25 -0
  209. package/dist/cjs/internal/Preserve.d.ts.map +1 -0
  210. package/dist/cjs/internal/Preserve.js +88 -0
  211. package/dist/cjs/internal/Preserve.js.map +7 -0
  212. package/dist/cjs/internal/Prune.d.ts +35 -0
  213. package/dist/cjs/internal/Prune.d.ts.map +1 -0
  214. package/dist/cjs/internal/Prune.js +54 -0
  215. package/dist/cjs/internal/Prune.js.map +7 -0
  216. package/dist/cjs/internal/SearchContract.d.ts +63 -0
  217. package/dist/cjs/internal/SearchContract.d.ts.map +1 -0
  218. package/dist/cjs/internal/SearchContract.js +46 -0
  219. package/dist/cjs/internal/SearchContract.js.map +7 -0
  220. package/dist/cjs/internal/Symbols.d.ts +39 -0
  221. package/dist/cjs/internal/Symbols.d.ts.map +1 -0
  222. package/dist/cjs/internal/Symbols.js +59 -0
  223. package/dist/cjs/internal/Symbols.js.map +7 -0
  224. package/dist/cjs/internal/TestReport.d.ts +52 -0
  225. package/dist/cjs/internal/TestReport.d.ts.map +1 -0
  226. package/dist/cjs/internal/TestReport.js +131 -0
  227. package/dist/cjs/internal/TestReport.js.map +7 -0
  228. package/dist/cjs/internal/Text.d.ts +114 -0
  229. package/dist/cjs/internal/Text.d.ts.map +1 -0
  230. package/dist/cjs/internal/Text.js +82 -0
  231. package/dist/cjs/internal/Text.js.map +7 -0
  232. package/dist/cjs/internal/Url.d.ts +13 -0
  233. package/dist/cjs/internal/Url.d.ts.map +1 -0
  234. package/dist/cjs/internal/Url.js +35 -0
  235. package/dist/cjs/internal/Url.js.map +7 -0
  236. package/dist/cjs/internal/Walk.d.ts +72 -0
  237. package/dist/cjs/internal/Walk.d.ts.map +1 -0
  238. package/dist/cjs/internal/Walk.js +108 -0
  239. package/dist/cjs/internal/Walk.js.map +7 -0
  240. package/dist/cjs/package.json +1 -0
  241. package/dist/esm/ApplyPatch.d.ts +174 -0
  242. package/dist/esm/ApplyPatch.d.ts.map +1 -0
  243. package/dist/esm/ApplyPatch.js +346 -0
  244. package/dist/esm/ApplyPatch.js.map +1 -0
  245. package/dist/esm/Bash.d.ts +304 -0
  246. package/dist/esm/Bash.d.ts.map +1 -0
  247. package/dist/esm/Bash.js +469 -0
  248. package/dist/esm/Bash.js.map +1 -0
  249. package/dist/esm/Checkpoints.d.ts +279 -0
  250. package/dist/esm/Checkpoints.d.ts.map +1 -0
  251. package/dist/esm/Checkpoints.js +298 -0
  252. package/dist/esm/Checkpoints.js.map +1 -0
  253. package/dist/esm/Container.d.ts +132 -0
  254. package/dist/esm/Container.d.ts.map +1 -0
  255. package/dist/esm/Container.js +151 -0
  256. package/dist/esm/Container.js.map +1 -0
  257. package/dist/esm/Edit.d.ts +203 -0
  258. package/dist/esm/Edit.d.ts.map +1 -0
  259. package/dist/esm/Edit.js +296 -0
  260. package/dist/esm/Edit.js.map +1 -0
  261. package/dist/esm/ExaWebSearch.d.ts +22 -0
  262. package/dist/esm/ExaWebSearch.d.ts.map +1 -0
  263. package/dist/esm/ExaWebSearch.js +107 -0
  264. package/dist/esm/ExaWebSearch.js.map +1 -0
  265. package/dist/esm/Explore.d.ts +328 -0
  266. package/dist/esm/Explore.d.ts.map +1 -0
  267. package/dist/esm/Explore.js +106 -0
  268. package/dist/esm/Explore.js.map +1 -0
  269. package/dist/esm/Fetch.d.ts +130 -0
  270. package/dist/esm/Fetch.d.ts.map +1 -0
  271. package/dist/esm/Fetch.js +91 -0
  272. package/dist/esm/Fetch.js.map +1 -0
  273. package/dist/esm/Glob.d.ts +204 -0
  274. package/dist/esm/Glob.d.ts.map +1 -0
  275. package/dist/esm/Glob.js +177 -0
  276. package/dist/esm/Glob.js.map +1 -0
  277. package/dist/esm/Grep.d.ts +347 -0
  278. package/dist/esm/Grep.d.ts.map +1 -0
  279. package/dist/esm/Grep.js +289 -0
  280. package/dist/esm/Grep.js.map +1 -0
  281. package/dist/esm/HttpPost.d.ts +130 -0
  282. package/dist/esm/HttpPost.d.ts.map +1 -0
  283. package/dist/esm/HttpPost.js +89 -0
  284. package/dist/esm/HttpPost.js.map +1 -0
  285. package/dist/esm/LanguageServer.d.ts +90 -0
  286. package/dist/esm/LanguageServer.d.ts.map +1 -0
  287. package/dist/esm/LanguageServer.js +57 -0
  288. package/dist/esm/LanguageServer.js.map +1 -0
  289. package/dist/esm/Ls.d.ts +164 -0
  290. package/dist/esm/Ls.d.ts.map +1 -0
  291. package/dist/esm/Ls.js +178 -0
  292. package/dist/esm/Ls.js.map +1 -0
  293. package/dist/esm/Lsp.d.ts +125 -0
  294. package/dist/esm/Lsp.d.ts.map +1 -0
  295. package/dist/esm/Lsp.js +165 -0
  296. package/dist/esm/Lsp.js.map +1 -0
  297. package/dist/esm/Manifest.d.ts +918 -0
  298. package/dist/esm/Manifest.d.ts.map +1 -0
  299. package/dist/esm/Manifest.js +153 -0
  300. package/dist/esm/Manifest.js.map +1 -0
  301. package/dist/esm/NativeSearch.d.ts +38 -0
  302. package/dist/esm/NativeSearch.d.ts.map +1 -0
  303. package/dist/esm/NativeSearch.js +378 -0
  304. package/dist/esm/NativeSearch.js.map +1 -0
  305. package/dist/esm/NodeLanguageServer.d.ts +128 -0
  306. package/dist/esm/NodeLanguageServer.d.ts.map +1 -0
  307. package/dist/esm/NodeLanguageServer.js +843 -0
  308. package/dist/esm/NodeLanguageServer.js.map +1 -0
  309. package/dist/esm/PortableSearch.d.ts +24 -0
  310. package/dist/esm/PortableSearch.d.ts.map +1 -0
  311. package/dist/esm/PortableSearch.js +240 -0
  312. package/dist/esm/PortableSearch.js.map +1 -0
  313. package/dist/esm/Probe.d.ts +193 -0
  314. package/dist/esm/Probe.d.ts.map +1 -0
  315. package/dist/esm/Probe.js +225 -0
  316. package/dist/esm/Probe.js.map +1 -0
  317. package/dist/esm/Read.d.ts +189 -0
  318. package/dist/esm/Read.d.ts.map +1 -0
  319. package/dist/esm/Read.js +300 -0
  320. package/dist/esm/Read.js.map +1 -0
  321. package/dist/esm/Relocate.d.ts +73 -0
  322. package/dist/esm/Relocate.d.ts.map +1 -0
  323. package/dist/esm/Relocate.js +153 -0
  324. package/dist/esm/Relocate.js.map +1 -0
  325. package/dist/esm/Search.d.ts +163 -0
  326. package/dist/esm/Search.d.ts.map +1 -0
  327. package/dist/esm/Search.js +47 -0
  328. package/dist/esm/Search.js.map +1 -0
  329. package/dist/esm/SearchConformance.d.ts +115 -0
  330. package/dist/esm/SearchConformance.d.ts.map +1 -0
  331. package/dist/esm/SearchConformance.js +193 -0
  332. package/dist/esm/SearchConformance.js.map +1 -0
  333. package/dist/esm/SearchContract.d.ts +114 -0
  334. package/dist/esm/SearchContract.d.ts.map +1 -0
  335. package/dist/esm/SearchContract.js +461 -0
  336. package/dist/esm/SearchContract.js.map +1 -0
  337. package/dist/esm/ShellCommand.d.ts +164 -0
  338. package/dist/esm/ShellCommand.d.ts.map +1 -0
  339. package/dist/esm/ShellCommand.js +159 -0
  340. package/dist/esm/ShellCommand.js.map +1 -0
  341. package/dist/esm/StdError.d.ts +55 -0
  342. package/dist/esm/StdError.d.ts.map +1 -0
  343. package/dist/esm/StdError.js +71 -0
  344. package/dist/esm/StdError.js.map +1 -0
  345. package/dist/esm/TestRun.d.ts +311 -0
  346. package/dist/esm/TestRun.d.ts.map +1 -0
  347. package/dist/esm/TestRun.js +316 -0
  348. package/dist/esm/TestRun.js.map +1 -0
  349. package/dist/esm/TestRunner.d.ts +102 -0
  350. package/dist/esm/TestRunner.d.ts.map +1 -0
  351. package/dist/esm/TestRunner.js +68 -0
  352. package/dist/esm/TestRunner.js.map +1 -0
  353. package/dist/esm/TreeFingerprint.d.ts +140 -0
  354. package/dist/esm/TreeFingerprint.d.ts.map +1 -0
  355. package/dist/esm/TreeFingerprint.js +170 -0
  356. package/dist/esm/TreeFingerprint.js.map +1 -0
  357. package/dist/esm/UpdatePlan.d.ts +152 -0
  358. package/dist/esm/UpdatePlan.d.ts.map +1 -0
  359. package/dist/esm/UpdatePlan.js +129 -0
  360. package/dist/esm/UpdatePlan.js.map +1 -0
  361. package/dist/esm/WebFetch.d.ts +134 -0
  362. package/dist/esm/WebFetch.d.ts.map +1 -0
  363. package/dist/esm/WebFetch.js +151 -0
  364. package/dist/esm/WebFetch.js.map +1 -0
  365. package/dist/esm/WebSearch.d.ts +181 -0
  366. package/dist/esm/WebSearch.d.ts.map +1 -0
  367. package/dist/esm/WebSearch.js +134 -0
  368. package/dist/esm/WebSearch.js.map +1 -0
  369. package/dist/esm/Write.d.ts +147 -0
  370. package/dist/esm/Write.d.ts.map +1 -0
  371. package/dist/esm/Write.js +144 -0
  372. package/dist/esm/Write.js.map +1 -0
  373. package/dist/esm/index.d.ts +127 -0
  374. package/dist/esm/index.d.ts.map +1 -0
  375. package/dist/esm/index.js +127 -0
  376. package/dist/esm/index.js.map +1 -0
  377. package/dist/esm/internal/ApplyPatch.d.ts +145 -0
  378. package/dist/esm/internal/ApplyPatch.d.ts.map +1 -0
  379. package/dist/esm/internal/ApplyPatch.js +489 -0
  380. package/dist/esm/internal/ApplyPatch.js.map +1 -0
  381. package/dist/esm/internal/CodexText.d.ts +73 -0
  382. package/dist/esm/internal/CodexText.d.ts.map +1 -0
  383. package/dist/esm/internal/CodexText.js +156 -0
  384. package/dist/esm/internal/CodexText.js.map +1 -0
  385. package/dist/esm/internal/Declaration.d.ts +49 -0
  386. package/dist/esm/internal/Declaration.d.ts.map +1 -0
  387. package/dist/esm/internal/Declaration.js +42 -0
  388. package/dist/esm/internal/Declaration.js.map +1 -0
  389. package/dist/esm/internal/Diagnostics.d.ts +77 -0
  390. package/dist/esm/internal/Diagnostics.d.ts.map +1 -0
  391. package/dist/esm/internal/Diagnostics.js +99 -0
  392. package/dist/esm/internal/Diagnostics.js.map +1 -0
  393. package/dist/esm/internal/EnvelopePrecheck.d.ts +67 -0
  394. package/dist/esm/internal/EnvelopePrecheck.d.ts.map +1 -0
  395. package/dist/esm/internal/EnvelopePrecheck.js +167 -0
  396. package/dist/esm/internal/EnvelopePrecheck.js.map +1 -0
  397. package/dist/esm/internal/Exec.d.ts +139 -0
  398. package/dist/esm/internal/Exec.d.ts.map +1 -0
  399. package/dist/esm/internal/Exec.js +193 -0
  400. package/dist/esm/internal/Exec.js.map +1 -0
  401. package/dist/esm/internal/FileMutation.d.ts +109 -0
  402. package/dist/esm/internal/FileMutation.d.ts.map +1 -0
  403. package/dist/esm/internal/FileMutation.js +123 -0
  404. package/dist/esm/internal/FileMutation.js.map +1 -0
  405. package/dist/esm/internal/FsFailure.d.ts +38 -0
  406. package/dist/esm/internal/FsFailure.d.ts.map +1 -0
  407. package/dist/esm/internal/FsFailure.js +39 -0
  408. package/dist/esm/internal/FsFailure.js.map +1 -0
  409. package/dist/esm/internal/GitWorktree.d.ts +98 -0
  410. package/dist/esm/internal/GitWorktree.d.ts.map +1 -0
  411. package/dist/esm/internal/GitWorktree.js +345 -0
  412. package/dist/esm/internal/GitWorktree.js.map +1 -0
  413. package/dist/esm/internal/Grouping.d.ts +51 -0
  414. package/dist/esm/internal/Grouping.d.ts.map +1 -0
  415. package/dist/esm/internal/Grouping.js +99 -0
  416. package/dist/esm/internal/Grouping.js.map +1 -0
  417. package/dist/esm/internal/Html.d.ts +20 -0
  418. package/dist/esm/internal/Html.d.ts.map +1 -0
  419. package/dist/esm/internal/Html.js +70 -0
  420. package/dist/esm/internal/Html.js.map +1 -0
  421. package/dist/esm/internal/Http.d.ts +95 -0
  422. package/dist/esm/internal/Http.d.ts.map +1 -0
  423. package/dist/esm/internal/Http.js +154 -0
  424. package/dist/esm/internal/Http.js.map +1 -0
  425. package/dist/esm/internal/HttpNetwork.d.ts +27 -0
  426. package/dist/esm/internal/HttpNetwork.d.ts.map +1 -0
  427. package/dist/esm/internal/HttpNetwork.js +114 -0
  428. package/dist/esm/internal/HttpNetwork.js.map +1 -0
  429. package/dist/esm/internal/Ignore.d.ts +37 -0
  430. package/dist/esm/internal/Ignore.d.ts.map +1 -0
  431. package/dist/esm/internal/Ignore.js +128 -0
  432. package/dist/esm/internal/Ignore.js.map +1 -0
  433. package/dist/esm/internal/LinearRegex.d.ts +19 -0
  434. package/dist/esm/internal/LinearRegex.d.ts.map +1 -0
  435. package/dist/esm/internal/LinearRegex.js +176 -0
  436. package/dist/esm/internal/LinearRegex.js.map +1 -0
  437. package/dist/esm/internal/Match.d.ts +85 -0
  438. package/dist/esm/internal/Match.d.ts.map +1 -0
  439. package/dist/esm/internal/Match.js +142 -0
  440. package/dist/esm/internal/Match.js.map +1 -0
  441. package/dist/esm/internal/Paths.d.ts +23 -0
  442. package/dist/esm/internal/Paths.d.ts.map +1 -0
  443. package/dist/esm/internal/Paths.js +40 -0
  444. package/dist/esm/internal/Paths.js.map +1 -0
  445. package/dist/esm/internal/Preserve.d.ts +25 -0
  446. package/dist/esm/internal/Preserve.d.ts.map +1 -0
  447. package/dist/esm/internal/Preserve.js +70 -0
  448. package/dist/esm/internal/Preserve.js.map +1 -0
  449. package/dist/esm/internal/Prune.d.ts +35 -0
  450. package/dist/esm/internal/Prune.d.ts.map +1 -0
  451. package/dist/esm/internal/Prune.js +60 -0
  452. package/dist/esm/internal/Prune.js.map +1 -0
  453. package/dist/esm/internal/SearchContract.d.ts +63 -0
  454. package/dist/esm/internal/SearchContract.d.ts.map +1 -0
  455. package/dist/esm/internal/SearchContract.js +66 -0
  456. package/dist/esm/internal/SearchContract.js.map +1 -0
  457. package/dist/esm/internal/Symbols.d.ts +39 -0
  458. package/dist/esm/internal/Symbols.d.ts.map +1 -0
  459. package/dist/esm/internal/Symbols.js +79 -0
  460. package/dist/esm/internal/Symbols.js.map +1 -0
  461. package/dist/esm/internal/TestReport.d.ts +52 -0
  462. package/dist/esm/internal/TestReport.d.ts.map +1 -0
  463. package/dist/esm/internal/TestReport.js +172 -0
  464. package/dist/esm/internal/TestReport.js.map +1 -0
  465. package/dist/esm/internal/Text.d.ts +114 -0
  466. package/dist/esm/internal/Text.d.ts.map +1 -0
  467. package/dist/esm/internal/Text.js +130 -0
  468. package/dist/esm/internal/Text.js.map +1 -0
  469. package/dist/esm/internal/Url.d.ts +13 -0
  470. package/dist/esm/internal/Url.d.ts.map +1 -0
  471. package/dist/esm/internal/Url.js +27 -0
  472. package/dist/esm/internal/Url.js.map +1 -0
  473. package/dist/esm/internal/Walk.d.ts +72 -0
  474. package/dist/esm/internal/Walk.d.ts.map +1 -0
  475. package/dist/esm/internal/Walk.js +126 -0
  476. package/dist/esm/internal/Walk.js.map +1 -0
  477. package/docs/README.md +117 -0
  478. package/docs/api.md +472 -0
  479. package/docs/concepts/effects-and-capabilities.md +136 -0
  480. package/docs/concepts/flows-and-handlers.md +115 -0
  481. package/docs/concepts/limits-and-disclosure.md +102 -0
  482. package/docs/concepts/search-contract.md +182 -0
  483. package/docs/guides/bind-the-standard-flows.md +114 -0
  484. package/docs/guides/implement-a-search-peer.md +133 -0
  485. package/docs/guides/pin-a-checkpoint.md +141 -0
  486. package/docs/guides/query-a-language-server.md +257 -0
  487. package/docs/guides/reach-the-network.md +141 -0
  488. package/docs/guides/read-and-edit-a-file.md +240 -0
  489. package/docs/guides/run-a-shell-command.md +215 -0
  490. package/docs/guides/run-the-test-suite.md +154 -0
  491. package/docs/guides/search-a-workspace.md +148 -0
  492. package/docs/installation.md +111 -0
  493. package/docs/quickstart.md +125 -0
  494. package/docs/reference/flows.md +556 -0
  495. package/docs/troubleshooting.md +322 -0
  496. package/package.json +439 -3
  497. package/src/ApplyPatch.ts +458 -0
  498. package/src/Bash.ts +549 -0
  499. package/src/Checkpoints.ts +422 -0
  500. package/src/Container.ts +212 -0
  501. package/src/Edit.ts +366 -0
  502. package/src/ExaWebSearch.ts +145 -0
  503. package/src/Explore.ts +139 -0
  504. package/src/Fetch.ts +117 -0
  505. package/src/Glob.ts +200 -0
  506. package/src/Grep.ts +320 -0
  507. package/src/HttpPost.ts +120 -0
  508. package/src/LanguageServer.ts +110 -0
  509. package/src/Ls.ts +228 -0
  510. package/src/Lsp.ts +184 -0
  511. package/src/Manifest.ts +162 -0
  512. package/src/NativeSearch.ts +457 -0
  513. package/src/NodeLanguageServer.ts +1148 -0
  514. package/src/PortableSearch.ts +264 -0
  515. package/src/Probe.ts +284 -0
  516. package/src/Read.ts +359 -0
  517. package/src/Relocate.ts +166 -0
  518. package/src/Search.ts +185 -0
  519. package/src/SearchConformance.ts +288 -0
  520. package/src/SearchContract.ts +489 -0
  521. package/src/ShellCommand.ts +201 -0
  522. package/src/StdError.ts +80 -0
  523. package/src/TestRun.ts +401 -0
  524. package/src/TestRunner.ts +119 -0
  525. package/src/TreeFingerprint.ts +200 -0
  526. package/src/UpdatePlan.ts +171 -0
  527. package/src/WebFetch.ts +194 -0
  528. package/src/WebSearch.ts +165 -0
  529. package/src/Write.ts +195 -0
  530. package/src/index.ts +154 -0
  531. package/src/internal/ApplyPatch.ts +601 -0
  532. package/src/internal/CodexText.ts +182 -0
  533. package/src/internal/Declaration.ts +60 -0
  534. package/src/internal/Diagnostics.ts +134 -0
  535. package/src/internal/EnvelopePrecheck.ts +233 -0
  536. package/src/internal/Exec.ts +314 -0
  537. package/src/internal/FileMutation.ts +231 -0
  538. package/src/internal/FsFailure.ts +51 -0
  539. package/src/internal/GitWorktree.ts +473 -0
  540. package/src/internal/Grouping.ts +106 -0
  541. package/src/internal/Html.ts +87 -0
  542. package/src/internal/Http.ts +209 -0
  543. package/src/internal/HttpNetwork.ts +153 -0
  544. package/src/internal/Ignore.ts +135 -0
  545. package/src/internal/LinearRegex.ts +173 -0
  546. package/src/internal/Match.ts +172 -0
  547. package/src/internal/Paths.ts +42 -0
  548. package/src/internal/Preserve.ts +108 -0
  549. package/src/internal/Prune.ts +62 -0
  550. package/src/internal/SearchContract.ts +77 -0
  551. package/src/internal/Symbols.ts +88 -0
  552. package/src/internal/TestReport.ts +194 -0
  553. package/src/internal/Text.ts +170 -0
  554. package/src/internal/Url.ts +23 -0
  555. package/src/internal/Walk.ts +176 -0
package/src/Search.ts ADDED
@@ -0,0 +1,185 @@
1
+ /**
2
+ * The implementation seam for the ripgrep search contract.
3
+ *
4
+ * Both implementations answer the same normalized calls. `PortableSearch`
5
+ * performs the work in-process; `NativeSearch` drives the `rg` executable.
6
+ * Callers select an implementation by Layer and cannot observe which one was
7
+ * selected from the result.
8
+ *
9
+ * @since 1.0.0
10
+ */
11
+
12
+ import { Context, Effect, Layer } from "effect"
13
+ import * as StdError from "./StdError.ts"
14
+
15
+ /**
16
+ * Normalized grep input shared by both implementations.
17
+ *
18
+ * @category models
19
+ * @since 1.0.0
20
+ */
21
+ export interface GrepInput {
22
+ readonly pattern: string
23
+ readonly root: string
24
+ readonly fixedStrings: boolean
25
+ readonly ignoreCase: boolean
26
+ readonly smartCase: boolean
27
+ readonly globs: ReadonlyArray<string>
28
+ readonly beforeContext: number
29
+ readonly afterContext: number
30
+ readonly maxCount?: number | undefined
31
+ readonly filesWithMatches: boolean
32
+ /** Opt out of root-scoped .gitignore rules; defaults to false. */
33
+ readonly noIgnore?: boolean | undefined
34
+ readonly hidden: boolean
35
+ readonly symbols: boolean
36
+ readonly limit: number
37
+ }
38
+
39
+ /**
40
+ * One matching or context line, as a peer produces it before grouping.
41
+ *
42
+ * @category models
43
+ * @since 1.0.0
44
+ */
45
+ export interface GrepLine {
46
+ readonly file: string
47
+ readonly line: number
48
+ readonly text: string
49
+ readonly kind: "match" | "context"
50
+ }
51
+
52
+ /**
53
+ * One context line carried inside the match it belongs to.
54
+ *
55
+ * @category models
56
+ * @since 1.0.0
57
+ */
58
+ export interface ContextLine {
59
+ readonly line: number
60
+ readonly text: string
61
+ }
62
+
63
+ /**
64
+ * The definition enclosing a hit, when the file's shape says so plainly.
65
+ *
66
+ * @category models
67
+ * @since 1.0.0
68
+ */
69
+ export interface Symbol {
70
+ readonly kind: string
71
+ readonly name: string
72
+ readonly startLine: number
73
+ readonly endLine: number
74
+ }
75
+
76
+ /**
77
+ * One hit: the matching line, the context that belongs to it, and the
78
+ * definition it sits in.
79
+ *
80
+ * @category models
81
+ * @since 1.0.0
82
+ */
83
+ export interface GrepMatch {
84
+ readonly file: string
85
+ readonly line: number
86
+ readonly text: string
87
+ readonly before: ReadonlyArray<ContextLine>
88
+ readonly after: ReadonlyArray<ContextLine>
89
+ readonly symbol?: Symbol | undefined
90
+ }
91
+
92
+ /**
93
+ * Normalized grep output.
94
+ *
95
+ * @category models
96
+ * @since 1.0.0
97
+ */
98
+ export interface GrepOutput {
99
+ readonly matches: ReadonlyArray<GrepMatch>
100
+ readonly files: ReadonlyArray<string>
101
+ readonly filesSearched: number
102
+ readonly skippedBinary: number
103
+ readonly truncated: boolean
104
+ readonly notice?: string | undefined
105
+ }
106
+
107
+ /**
108
+ * Normalized glob input.
109
+ *
110
+ * @category models
111
+ * @since 1.0.0
112
+ */
113
+ export interface GlobInput {
114
+ readonly pattern: string
115
+ readonly root: string
116
+ /** Opt out of root-scoped .gitignore rules; defaults to false. */
117
+ readonly noIgnore?: boolean | undefined
118
+ readonly hidden: boolean
119
+ readonly limit: number
120
+ }
121
+
122
+ /**
123
+ * Normalized glob output.
124
+ *
125
+ * @category models
126
+ * @since 1.0.0
127
+ */
128
+ export interface GlobOutput {
129
+ readonly paths: ReadonlyArray<string>
130
+ readonly total: number
131
+ readonly truncated: boolean
132
+ readonly notice?: string | undefined
133
+ }
134
+
135
+ /**
136
+ * The one search contract implemented by native and portable peers.
137
+ *
138
+ * @category services
139
+ * @since 1.0.0
140
+ */
141
+ export interface Search {
142
+ readonly grep: (input: GrepInput) => Effect.Effect<GrepOutput, StdError.StdError>
143
+ readonly glob: (input: GlobInput) => Effect.Effect<GlobOutput, StdError.StdError>
144
+ }
145
+
146
+ /**
147
+ * The {@link Search} service tag.
148
+ *
149
+ * @category services
150
+ * @since 1.0.0
151
+ */
152
+ export const Search: Context.Service<Search, Search> = Context.Service("@smthrs/std/Search")
153
+
154
+ /**
155
+ * Builds a search service from its two operations.
156
+ *
157
+ * @category constructors
158
+ * @since 1.0.0
159
+ */
160
+ export const make = (service: Search): Search => Search.of(service)
161
+
162
+ /**
163
+ * Builds an unavailable search service for compositions that deliberately omit search.
164
+ *
165
+ * @category constructors
166
+ * @since 1.0.0
167
+ */
168
+ export const makeNoop = (): Search => {
169
+ const unavailable = () =>
170
+ Effect.fail(
171
+ new StdError.StdError({
172
+ code: "provider_unavailable",
173
+ message: "No search implementation is configured"
174
+ })
175
+ )
176
+ return make({ grep: unavailable, glob: unavailable })
177
+ }
178
+
179
+ /**
180
+ * Provides {@link makeNoop}.
181
+ *
182
+ * @category layers
183
+ * @since 1.0.0
184
+ */
185
+ export const layerNoop: Layer.Layer<Search> = Layer.succeed(Search, makeNoop())
@@ -0,0 +1,288 @@
1
+ /**
2
+ * A differential conformance kit for {@link Search} implementations.
3
+ *
4
+ * `Search` is a public extension seam: a host binds its own implementation and
5
+ * every `grep` and `glob` call in the package goes through it. Two peers ship
6
+ * here, and the contract they are held to used to live only in
7
+ * `test/SearchConformance.test.ts` — a file `package.json` does not publish, so
8
+ * a third-party peer had the seam and no way to prove it filled it. Worse, the
9
+ * cases there are hand-picked: they pin the divergences somebody already
10
+ * found. A literal `?` matched `fo` in one peer and `foo?` in the other for as
11
+ * long as nobody thought to write that case down.
12
+ *
13
+ * This module is the other half. It generates a tree and a batch of calls from
14
+ * a seed, runs them through two implementations, and reports every answer that
15
+ * differs. Nothing here knows which peer is right: a divergence is the finding,
16
+ * and the reference peer to compare against is the caller's choice —
17
+ * `PortableSearch` is the obvious one, because it needs no external binary.
18
+ *
19
+ * The generator deliberately stays inside the ground both peers claim to
20
+ * share: no symlinks, no unreadable directories, no CRLF, no NUL bytes, no
21
+ * filename a shell would have to quote. Those are the cases the hand-written
22
+ * table pins one by one, with an expected value that says which behaviour is
23
+ * intended. A generator cannot say that; it can only say the two disagree.
24
+ *
25
+ * @since 1.0.0
26
+ */
27
+
28
+ import * as Effect from "effect/Effect"
29
+ import * as FileSystem from "effect/FileSystem"
30
+ import * as Path from "effect/Path"
31
+ import type * as Search from "./Search.ts"
32
+ import type * as StdError from "./StdError.ts"
33
+
34
+ /**
35
+ * One file the generated tree contains.
36
+ *
37
+ * @category models
38
+ * @since 1.0.0
39
+ */
40
+ export interface GeneratedFile {
41
+ /** Path relative to the tree root, always with `/` separators. */
42
+ readonly path: string
43
+ readonly content: string
44
+ }
45
+
46
+ /**
47
+ * A generated tree plus the calls to make against it.
48
+ *
49
+ * @category models
50
+ * @since 1.0.0
51
+ */
52
+ export interface Plan {
53
+ readonly seed: number
54
+ readonly root: string
55
+ readonly files: ReadonlyArray<GeneratedFile>
56
+ readonly grep: ReadonlyArray<Search.GrepInput>
57
+ readonly glob: ReadonlyArray<Search.GlobInput>
58
+ }
59
+
60
+ /**
61
+ * One call two implementations answered differently.
62
+ *
63
+ * `subject` and `reference` are the rendered answers, so a report names the
64
+ * bytes that differ rather than saying only that they did.
65
+ *
66
+ * @category models
67
+ * @since 1.0.0
68
+ */
69
+ export interface Divergence {
70
+ readonly call: "grep" | "glob"
71
+ readonly input: Search.GrepInput | Search.GlobInput
72
+ readonly subject: string
73
+ readonly reference: string
74
+ }
75
+
76
+ /**
77
+ * mulberry32: 32 bits of state, uniform enough for fixture generation and
78
+ * reproducible from a seed on every host, which a shared `Math.random` is not.
79
+ */
80
+ const random = (seed: number): () => number => {
81
+ let state = seed >>> 0
82
+ return () => {
83
+ state = (state + 0x6D2B79F5) >>> 0
84
+ let value = Math.imul(state ^ (state >>> 15), 1 | state)
85
+ value = (value + Math.imul(value ^ (value >>> 7), 61 | value)) ^ value
86
+ return ((value ^ (value >>> 14)) >>> 0) / 4_294_967_296
87
+ }
88
+ }
89
+
90
+ const pick = <A>(next: () => number, values: ReadonlyArray<A>): A => values[Math.floor(next() * values.length)]!
91
+
92
+ const chance = (next: () => number, probability: number): boolean => next() < probability
93
+
94
+ // Names both peers walk identically: no separator, no dot prefix outside the
95
+ // two deliberate hidden entries, no name a directory skip list contains, and
96
+ // no character that would need quoting on a command line.
97
+ const stems = ["alpha", "beta", "gamma", "Delta", "e-psilon", "ze_ta", "eta2", "th.eta", "iota", "kappa"] as const
98
+ const extensions = [".ts", ".js", ".txt", ".py", ".md"] as const
99
+ const directories = ["", "one", "one/two", "three", "three/four/five"] as const
100
+
101
+ // Lines drawn from a vocabulary that mixes the needle, near misses, regex
102
+ // metacharacters that must survive `fixedStrings`, and definition headers the
103
+ // `symbols` option reads.
104
+ const lines = [
105
+ "needle",
106
+ "a needle in the line",
107
+ "Needle capitalised",
108
+ "no match here",
109
+ "needle? with a question mark",
110
+ "a+b and x*y and [z]",
111
+ "def widen(value):",
112
+ "class Widget:",
113
+ " needle = value",
114
+ "function widen(value) {",
115
+ "",
116
+ "trailing needle"
117
+ ] as const
118
+
119
+ const patterns = ["needle", "Needle", "needle?", "a+b", "[z]", "^needle$", "widen", "no match at all"] as const
120
+
121
+ const globPatterns = ["**/*.ts", "*.ts", "**/*", "one/**/*.ts", "**/*.{ts,js}", "**/alpha*"] as const
122
+
123
+ /**
124
+ * Builds a reproducible tree and call batch from a seed.
125
+ *
126
+ * The same seed and root always produce the same plan, so a divergence a run
127
+ * reports can be replayed exactly by rerunning that seed.
128
+ *
129
+ * @category generators
130
+ * @since 1.0.0
131
+ */
132
+ export const plan = (options: {
133
+ readonly seed: number
134
+ readonly root: string
135
+ readonly files?: number | undefined
136
+ readonly calls?: number | undefined
137
+ }): Plan => {
138
+ const next = random(options.seed)
139
+ const fileCount = options.files ?? 12
140
+ const callCount = options.calls ?? 12
141
+ const files: Array<GeneratedFile> = []
142
+ for (let index = 0; index < fileCount; index++) {
143
+ const directory = pick(next, directories)
144
+ // The index makes every generated path unique, including repeated random picks.
145
+ const name = `${pick(next, stems)}${index}${pick(next, extensions)}`
146
+ const path = directory === "" ? name : `${directory}/${name}`
147
+ const body: Array<string> = []
148
+ for (let line = 0; line < 1 + Math.floor(next() * 8); line++) body.push(pick(next, lines))
149
+ files.push({ path, content: `${body.join("\n")}${chance(next, 0.8) ? "\n" : ""}` })
150
+ }
151
+
152
+ // Always exercise precedence, anchoring, directory pruning and nested
153
+ // negation alongside each seed's generated content (without a git repo).
154
+ if (fileCount > 0) {
155
+ files.push(
156
+ { path: ".gitignore", content: "*.ignored\n!keep.ignored\n/root-only.ts\ncache/\n" },
157
+ { path: "drop.ignored", content: "needle\n" },
158
+ { path: "keep.ignored", content: "needle\n" },
159
+ { path: "root-only.ts", content: "needle\n" },
160
+ { path: "cache/a.ts", content: "needle\n" },
161
+ { path: "nested/.gitignore", content: "!keep.ignored\n/anchored.ts\nframes/\n" },
162
+ { path: "nested/keep.ignored", content: "needle\n" },
163
+ { path: "nested/drop.ignored", content: "needle\n" },
164
+ { path: "nested/anchored.ts", content: "needle\n" },
165
+ { path: "nested/deep/anchored.ts", content: "needle\n" },
166
+ { path: "nested/root-only.ts", content: "needle\n" },
167
+ { path: "nested/frames/a.ts", content: "needle\n" },
168
+ { path: "other/frames", content: "needle\n" }
169
+ )
170
+ }
171
+
172
+ const roots = [options.root, ...files.map((entry) => `${options.root}/${entry.path}`)]
173
+ const grep: Array<Search.GrepInput> = []
174
+ for (let index = 0; index < callCount; index++) {
175
+ const fixedStrings = chance(next, 0.4)
176
+ // `Grep.run` refuses `ignoreCase` together with `smartCase` as mutually
177
+ // exclusive, so a generated call carrying both would be exploring ground
178
+ // the contract does not describe.
179
+ const ignoreCase = chance(next, 0.25)
180
+ grep.push({
181
+ pattern: pick(next, patterns),
182
+ root: chance(next, 0.75) ? options.root : pick(next, roots),
183
+ fixedStrings,
184
+ ignoreCase,
185
+ smartCase: !ignoreCase && chance(next, 0.3),
186
+ globs: chance(next, 0.4) ? [pick(next, ["*.ts", "*.txt", "!*.js", "**/*.ts"])] : [],
187
+ beforeContext: Math.floor(next() * 3),
188
+ afterContext: Math.floor(next() * 3),
189
+ ...(chance(next, 0.3) ? { maxCount: 1 + Math.floor(next() * 2) } : {}),
190
+ filesWithMatches: chance(next, 0.25),
191
+ hidden: chance(next, 0.5),
192
+ noIgnore: chance(next, 0.25),
193
+ symbols: chance(next, 0.3),
194
+ limit: 1 + Math.floor(next() * 40)
195
+ })
196
+ }
197
+
198
+ const glob: Array<Search.GlobInput> = []
199
+ for (let index = 0; index < callCount; index++) {
200
+ glob.push({
201
+ pattern: pick(next, globPatterns),
202
+ root: options.root,
203
+ hidden: chance(next, 0.5),
204
+ noIgnore: chance(next, 0.25),
205
+ limit: 1 + Math.floor(next() * 20)
206
+ })
207
+ }
208
+
209
+ return { seed: options.seed, root: options.root, files, grep, glob }
210
+ }
211
+
212
+ /**
213
+ * Writes a plan's tree under its root.
214
+ *
215
+ * @category generators
216
+ * @since 1.0.0
217
+ */
218
+ export const materialize = (
219
+ target: Plan
220
+ ): Effect.Effect<void, never, FileSystem.FileSystem | Path.Path> =>
221
+ Effect.gen(function*() {
222
+ const fileSystem = yield* FileSystem.FileSystem
223
+ const path = yield* Path.Path
224
+ yield* Effect.forEach(target.files, (entry) => {
225
+ const absolute = path.join(target.root, ...entry.path.split("/"))
226
+ return fileSystem.makeDirectory(path.dirname(absolute), { recursive: true }).pipe(
227
+ Effect.andThen(fileSystem.writeFileString(absolute, entry.content)),
228
+ Effect.orDie
229
+ )
230
+ }, { discard: true })
231
+ })
232
+
233
+ /** A typed answer rendered so two of them can be compared as text. */
234
+ const rendered = <A>(
235
+ effect: Effect.Effect<A, StdError.StdError>
236
+ ): Effect.Effect<string> =>
237
+ effect.pipe(
238
+ Effect.match({
239
+ onSuccess: (value) => JSON.stringify(value),
240
+ onFailure: (error) => JSON.stringify({ failure: error.code })
241
+ })
242
+ )
243
+
244
+ /**
245
+ * Runs every call in a plan through two implementations and reports the
246
+ * answers that differ.
247
+ *
248
+ * A failure is compared like any other answer: two peers that refuse the same
249
+ * call with the same code agree, and one that refuses where the other answers
250
+ * has diverged.
251
+ *
252
+ * @category conformance
253
+ * @since 1.0.0
254
+ */
255
+ export const compare = (options: {
256
+ readonly plan: Plan
257
+ readonly subject: Search.Search
258
+ readonly reference: Search.Search
259
+ }): Effect.Effect<ReadonlyArray<Divergence>> =>
260
+ Effect.gen(function*() {
261
+ const divergences: Array<Divergence> = []
262
+ for (const input of options.plan.grep) {
263
+ const subject = yield* rendered(options.subject.grep(input))
264
+ const reference = yield* rendered(options.reference.grep(input))
265
+ if (subject !== reference) divergences.push({ call: "grep", input, subject, reference })
266
+ }
267
+ for (const input of options.plan.glob) {
268
+ const subject = yield* rendered(options.subject.glob(input))
269
+ const reference = yield* rendered(options.reference.glob(input))
270
+ if (subject !== reference) divergences.push({ call: "glob", input, subject, reference })
271
+ }
272
+ return divergences
273
+ })
274
+
275
+ /**
276
+ * Renders divergences as the report a failing conformance run should print.
277
+ *
278
+ * @category conformance
279
+ * @since 1.0.0
280
+ */
281
+ export const report = (divergences: ReadonlyArray<Divergence>): string =>
282
+ divergences.map((divergence) =>
283
+ [
284
+ `${divergence.call}(${JSON.stringify(divergence.input)})`,
285
+ ` subject: ${divergence.subject}`,
286
+ ` reference: ${divergence.reference}`
287
+ ].join("\n")
288
+ ).join("\n\n")