ralph-starter 0.0.1 → 0.1.1-beta.0

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 (382) hide show
  1. package/README.md +707 -17
  2. package/dist/auth/browser.d.ts +10 -0
  3. package/dist/auth/browser.d.ts.map +1 -0
  4. package/dist/auth/browser.js +56 -0
  5. package/dist/auth/browser.js.map +1 -0
  6. package/dist/auth/index.d.ts +5 -0
  7. package/dist/auth/index.d.ts.map +1 -0
  8. package/dist/auth/index.js +5 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/auth/oauth-server.d.ts +20 -0
  11. package/dist/auth/oauth-server.d.ts.map +1 -0
  12. package/dist/auth/oauth-server.js +168 -0
  13. package/dist/auth/oauth-server.js.map +1 -0
  14. package/dist/auth/pkce.d.ts +46 -0
  15. package/dist/auth/pkce.d.ts.map +1 -0
  16. package/dist/auth/pkce.js +57 -0
  17. package/dist/auth/pkce.js.map +1 -0
  18. package/dist/auth/providers/base.d.ts +52 -0
  19. package/dist/auth/providers/base.d.ts.map +1 -0
  20. package/dist/auth/providers/base.js +70 -0
  21. package/dist/auth/providers/base.js.map +1 -0
  22. package/dist/auth/providers/index.d.ts +23 -0
  23. package/dist/auth/providers/index.d.ts.map +1 -0
  24. package/dist/auth/providers/index.js +39 -0
  25. package/dist/auth/providers/index.js.map +1 -0
  26. package/dist/auth/providers/linear.d.ts +37 -0
  27. package/dist/auth/providers/linear.d.ts.map +1 -0
  28. package/dist/auth/providers/linear.js +46 -0
  29. package/dist/auth/providers/linear.js.map +1 -0
  30. package/dist/auth/providers/notion.d.ts +36 -0
  31. package/dist/auth/providers/notion.d.ts.map +1 -0
  32. package/dist/auth/providers/notion.js +75 -0
  33. package/dist/auth/providers/notion.js.map +1 -0
  34. package/dist/auth/providers/todoist.d.ts +29 -0
  35. package/dist/auth/providers/todoist.d.ts.map +1 -0
  36. package/dist/auth/providers/todoist.js +40 -0
  37. package/dist/auth/providers/todoist.js.map +1 -0
  38. package/dist/automation/git.d.ts +15 -0
  39. package/dist/automation/git.d.ts.map +1 -0
  40. package/dist/automation/git.js +73 -0
  41. package/dist/automation/git.js.map +1 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +192 -19
  45. package/dist/cli.js.map +1 -0
  46. package/dist/commands/auth.d.ts +14 -0
  47. package/dist/commands/auth.d.ts.map +1 -0
  48. package/dist/commands/auth.js +243 -0
  49. package/dist/commands/auth.js.map +1 -0
  50. package/dist/commands/check.d.ts +12 -0
  51. package/dist/commands/check.d.ts.map +1 -0
  52. package/dist/commands/check.js +124 -0
  53. package/dist/commands/check.js.map +1 -0
  54. package/dist/commands/config.d.ts +13 -0
  55. package/dist/commands/config.d.ts.map +1 -0
  56. package/dist/commands/config.js +376 -0
  57. package/dist/commands/config.js.map +1 -0
  58. package/dist/commands/init.d.ts +31 -0
  59. package/dist/commands/init.d.ts.map +1 -0
  60. package/dist/commands/init.js +353 -0
  61. package/dist/commands/init.js.map +1 -0
  62. package/dist/commands/integrations.d.ts +17 -0
  63. package/dist/commands/integrations.d.ts.map +1 -0
  64. package/dist/commands/integrations.js +193 -0
  65. package/dist/commands/integrations.js.map +1 -0
  66. package/dist/commands/plan.d.ts +5 -0
  67. package/dist/commands/plan.d.ts.map +1 -0
  68. package/dist/commands/plan.js +80 -0
  69. package/dist/commands/plan.js.map +1 -0
  70. package/dist/commands/run.d.ts +26 -0
  71. package/dist/commands/run.d.ts.map +1 -0
  72. package/dist/commands/run.js +351 -0
  73. package/dist/commands/run.js.map +1 -0
  74. package/dist/commands/scaffold.d.ts +9 -0
  75. package/dist/commands/scaffold.d.ts.map +1 -0
  76. package/dist/commands/scaffold.js +128 -0
  77. package/dist/commands/scaffold.js.map +1 -0
  78. package/dist/commands/setup.d.ts +12 -0
  79. package/dist/commands/setup.d.ts.map +1 -0
  80. package/dist/commands/setup.js +27 -0
  81. package/dist/commands/setup.js.map +1 -0
  82. package/dist/commands/skill.d.ts +6 -0
  83. package/dist/commands/skill.d.ts.map +1 -0
  84. package/dist/commands/skill.js +151 -0
  85. package/dist/commands/skill.js.map +1 -0
  86. package/dist/commands/source.d.ts +17 -0
  87. package/dist/commands/source.d.ts.map +1 -0
  88. package/dist/commands/source.js +173 -0
  89. package/dist/commands/source.js.map +1 -0
  90. package/dist/config/manager.d.ts +70 -0
  91. package/dist/config/manager.d.ts.map +1 -0
  92. package/dist/config/manager.js +227 -0
  93. package/dist/config/manager.js.map +1 -0
  94. package/dist/index.d.ts +26 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +27 -2
  97. package/dist/index.js.map +1 -0
  98. package/dist/integrations/_template/auth.d.ts +29 -0
  99. package/dist/integrations/_template/auth.d.ts.map +1 -0
  100. package/dist/integrations/_template/auth.js +42 -0
  101. package/dist/integrations/_template/auth.js.map +1 -0
  102. package/dist/integrations/_template/index.d.ts +8 -0
  103. package/dist/integrations/_template/index.d.ts.map +1 -0
  104. package/dist/integrations/_template/index.js +8 -0
  105. package/dist/integrations/_template/index.js.map +1 -0
  106. package/dist/integrations/_template/source.d.ts +34 -0
  107. package/dist/integrations/_template/source.d.ts.map +1 -0
  108. package/dist/integrations/_template/source.js +124 -0
  109. package/dist/integrations/_template/source.js.map +1 -0
  110. package/dist/integrations/base.d.ts +158 -0
  111. package/dist/integrations/base.d.ts.map +1 -0
  112. package/dist/integrations/base.js +109 -0
  113. package/dist/integrations/base.js.map +1 -0
  114. package/dist/integrations/github/index.d.ts +8 -0
  115. package/dist/integrations/github/index.d.ts.map +1 -0
  116. package/dist/integrations/github/index.js +8 -0
  117. package/dist/integrations/github/index.js.map +1 -0
  118. package/dist/integrations/github/source.d.ts +26 -0
  119. package/dist/integrations/github/source.d.ts.map +1 -0
  120. package/dist/integrations/github/source.js +190 -0
  121. package/dist/integrations/github/source.js.map +1 -0
  122. package/dist/integrations/index.d.ts +37 -0
  123. package/dist/integrations/index.d.ts.map +1 -0
  124. package/dist/integrations/index.js +71 -0
  125. package/dist/integrations/index.js.map +1 -0
  126. package/dist/integrations/linear/auth.d.ts +37 -0
  127. package/dist/integrations/linear/auth.d.ts.map +1 -0
  128. package/dist/integrations/linear/auth.js +45 -0
  129. package/dist/integrations/linear/auth.js.map +1 -0
  130. package/dist/integrations/linear/index.d.ts +9 -0
  131. package/dist/integrations/linear/index.d.ts.map +1 -0
  132. package/dist/integrations/linear/index.js +9 -0
  133. package/dist/integrations/linear/index.js.map +1 -0
  134. package/dist/integrations/linear/source.d.ts +26 -0
  135. package/dist/integrations/linear/source.d.ts.map +1 -0
  136. package/dist/integrations/linear/source.js +248 -0
  137. package/dist/integrations/linear/source.js.map +1 -0
  138. package/dist/integrations/notion/index.d.ts +8 -0
  139. package/dist/integrations/notion/index.d.ts.map +1 -0
  140. package/dist/integrations/notion/index.js +8 -0
  141. package/dist/integrations/notion/index.js.map +1 -0
  142. package/dist/integrations/notion/source.d.ts +53 -0
  143. package/dist/integrations/notion/source.d.ts.map +1 -0
  144. package/dist/integrations/notion/source.js +463 -0
  145. package/dist/integrations/notion/source.js.map +1 -0
  146. package/dist/llm/api.d.ts +29 -0
  147. package/dist/llm/api.d.ts.map +1 -0
  148. package/dist/llm/api.js +152 -0
  149. package/dist/llm/api.js.map +1 -0
  150. package/dist/llm/index.d.ts +7 -0
  151. package/dist/llm/index.d.ts.map +1 -0
  152. package/dist/llm/index.js +7 -0
  153. package/dist/llm/index.js.map +1 -0
  154. package/dist/llm/providers.d.ts +24 -0
  155. package/dist/llm/providers.d.ts.map +1 -0
  156. package/dist/llm/providers.js +51 -0
  157. package/dist/llm/providers.js.map +1 -0
  158. package/dist/loop/__tests__/agents.test.d.ts +2 -0
  159. package/dist/loop/__tests__/agents.test.d.ts.map +1 -0
  160. package/dist/loop/__tests__/agents.test.js +183 -0
  161. package/dist/loop/__tests__/agents.test.js.map +1 -0
  162. package/dist/loop/__tests__/circuit-breaker.test.d.ts +2 -0
  163. package/dist/loop/__tests__/circuit-breaker.test.d.ts.map +1 -0
  164. package/dist/loop/__tests__/circuit-breaker.test.js +161 -0
  165. package/dist/loop/__tests__/circuit-breaker.test.js.map +1 -0
  166. package/dist/loop/__tests__/cost-tracker.test.d.ts +2 -0
  167. package/dist/loop/__tests__/cost-tracker.test.d.ts.map +1 -0
  168. package/dist/loop/__tests__/cost-tracker.test.js +200 -0
  169. package/dist/loop/__tests__/cost-tracker.test.js.map +1 -0
  170. package/dist/loop/__tests__/rate-limiter.test.d.ts +2 -0
  171. package/dist/loop/__tests__/rate-limiter.test.d.ts.map +1 -0
  172. package/dist/loop/__tests__/rate-limiter.test.js +198 -0
  173. package/dist/loop/__tests__/rate-limiter.test.js.map +1 -0
  174. package/dist/loop/__tests__/validation.test.d.ts +2 -0
  175. package/dist/loop/__tests__/validation.test.d.ts.map +1 -0
  176. package/dist/loop/__tests__/validation.test.js +234 -0
  177. package/dist/loop/__tests__/validation.test.js.map +1 -0
  178. package/dist/loop/agents.d.ts +26 -0
  179. package/dist/loop/agents.d.ts.map +1 -0
  180. package/dist/loop/agents.js +188 -0
  181. package/dist/loop/agents.js.map +1 -0
  182. package/dist/loop/circuit-breaker.d.ts +61 -0
  183. package/dist/loop/circuit-breaker.d.ts.map +1 -0
  184. package/dist/loop/circuit-breaker.js +143 -0
  185. package/dist/loop/circuit-breaker.js.map +1 -0
  186. package/dist/loop/cost-tracker.d.ts +90 -0
  187. package/dist/loop/cost-tracker.d.ts.map +1 -0
  188. package/dist/loop/cost-tracker.js +229 -0
  189. package/dist/loop/cost-tracker.js.map +1 -0
  190. package/dist/loop/estimator.d.ts +20 -0
  191. package/dist/loop/estimator.d.ts.map +1 -0
  192. package/dist/loop/estimator.js +123 -0
  193. package/dist/loop/estimator.js.map +1 -0
  194. package/dist/loop/executor.d.ts +44 -0
  195. package/dist/loop/executor.d.ts.map +1 -0
  196. package/dist/loop/executor.js +646 -0
  197. package/dist/loop/executor.js.map +1 -0
  198. package/dist/loop/progress.d.ts +34 -0
  199. package/dist/loop/progress.d.ts.map +1 -0
  200. package/dist/loop/progress.js +186 -0
  201. package/dist/loop/progress.js.map +1 -0
  202. package/dist/loop/rate-limiter.d.ts +71 -0
  203. package/dist/loop/rate-limiter.d.ts.map +1 -0
  204. package/dist/loop/rate-limiter.js +151 -0
  205. package/dist/loop/rate-limiter.js.map +1 -0
  206. package/dist/loop/semantic-analyzer.d.ts +33 -0
  207. package/dist/loop/semantic-analyzer.d.ts.map +1 -0
  208. package/dist/loop/semantic-analyzer.js +153 -0
  209. package/dist/loop/semantic-analyzer.js.map +1 -0
  210. package/dist/loop/skills.d.ts +29 -0
  211. package/dist/loop/skills.d.ts.map +1 -0
  212. package/dist/loop/skills.js +174 -0
  213. package/dist/loop/skills.js.map +1 -0
  214. package/dist/loop/step-detector.d.ts +17 -0
  215. package/dist/loop/step-detector.d.ts.map +1 -0
  216. package/dist/loop/step-detector.js +280 -0
  217. package/dist/loop/step-detector.js.map +1 -0
  218. package/dist/loop/task-counter.d.ts +41 -0
  219. package/dist/loop/task-counter.d.ts.map +1 -0
  220. package/dist/loop/task-counter.js +99 -0
  221. package/dist/loop/task-counter.js.map +1 -0
  222. package/dist/loop/validation.d.ts +28 -0
  223. package/dist/loop/validation.d.ts.map +1 -0
  224. package/dist/loop/validation.js +138 -0
  225. package/dist/loop/validation.js.map +1 -0
  226. package/dist/mcp/core/init.d.ts +15 -0
  227. package/dist/mcp/core/init.d.ts.map +1 -0
  228. package/dist/mcp/core/init.js +272 -0
  229. package/dist/mcp/core/init.js.map +1 -0
  230. package/dist/mcp/core/plan.d.ts +15 -0
  231. package/dist/mcp/core/plan.d.ts.map +1 -0
  232. package/dist/mcp/core/plan.js +90 -0
  233. package/dist/mcp/core/plan.js.map +1 -0
  234. package/dist/mcp/core/run.d.ts +26 -0
  235. package/dist/mcp/core/run.d.ts.map +1 -0
  236. package/dist/mcp/core/run.js +114 -0
  237. package/dist/mcp/core/run.js.map +1 -0
  238. package/dist/mcp/prompts.d.ts +10 -0
  239. package/dist/mcp/prompts.d.ts.map +1 -0
  240. package/dist/mcp/prompts.js +163 -0
  241. package/dist/mcp/prompts.js.map +1 -0
  242. package/dist/mcp/resources.d.ts +16 -0
  243. package/dist/mcp/resources.d.ts.map +1 -0
  244. package/dist/mcp/resources.js +114 -0
  245. package/dist/mcp/resources.js.map +1 -0
  246. package/dist/mcp/server.d.ts +10 -0
  247. package/dist/mcp/server.d.ts.map +1 -0
  248. package/dist/mcp/server.js +73 -0
  249. package/dist/mcp/server.js.map +1 -0
  250. package/dist/mcp/tools.d.ts +15 -0
  251. package/dist/mcp/tools.d.ts.map +1 -0
  252. package/dist/mcp/tools.js +316 -0
  253. package/dist/mcp/tools.js.map +1 -0
  254. package/dist/presets/index.d.ts +36 -0
  255. package/dist/presets/index.d.ts.map +1 -0
  256. package/dist/presets/index.js +236 -0
  257. package/dist/presets/index.js.map +1 -0
  258. package/dist/setup/agent-detector.d.ts +57 -0
  259. package/dist/setup/agent-detector.d.ts.map +1 -0
  260. package/dist/setup/agent-detector.js +170 -0
  261. package/dist/setup/agent-detector.js.map +1 -0
  262. package/dist/setup/index.d.ts +7 -0
  263. package/dist/setup/index.d.ts.map +1 -0
  264. package/dist/setup/index.js +7 -0
  265. package/dist/setup/index.js.map +1 -0
  266. package/dist/setup/llm-tester.d.ts +33 -0
  267. package/dist/setup/llm-tester.d.ts.map +1 -0
  268. package/dist/setup/llm-tester.js +105 -0
  269. package/dist/setup/llm-tester.js.map +1 -0
  270. package/dist/setup/wizard.d.ts +19 -0
  271. package/dist/setup/wizard.d.ts.map +1 -0
  272. package/dist/setup/wizard.js +313 -0
  273. package/dist/setup/wizard.js.map +1 -0
  274. package/dist/sources/__tests__/file.test.d.ts +2 -0
  275. package/dist/sources/__tests__/file.test.d.ts.map +1 -0
  276. package/dist/sources/__tests__/file.test.js +126 -0
  277. package/dist/sources/__tests__/file.test.js.map +1 -0
  278. package/dist/sources/__tests__/github.test.d.ts +2 -0
  279. package/dist/sources/__tests__/github.test.d.ts.map +1 -0
  280. package/dist/sources/__tests__/github.test.js +157 -0
  281. package/dist/sources/__tests__/github.test.js.map +1 -0
  282. package/dist/sources/base.d.ts +72 -0
  283. package/dist/sources/base.d.ts.map +1 -0
  284. package/dist/sources/base.js +127 -0
  285. package/dist/sources/base.js.map +1 -0
  286. package/dist/sources/builtin/file.d.ts +21 -0
  287. package/dist/sources/builtin/file.d.ts.map +1 -0
  288. package/dist/sources/builtin/file.js +129 -0
  289. package/dist/sources/builtin/file.js.map +1 -0
  290. package/dist/sources/builtin/github-scraper.d.ts +65 -0
  291. package/dist/sources/builtin/github-scraper.d.ts.map +1 -0
  292. package/dist/sources/builtin/github-scraper.js +324 -0
  293. package/dist/sources/builtin/github-scraper.js.map +1 -0
  294. package/dist/sources/builtin/pdf.d.ts +24 -0
  295. package/dist/sources/builtin/pdf.d.ts.map +1 -0
  296. package/dist/sources/builtin/pdf.js +174 -0
  297. package/dist/sources/builtin/pdf.js.map +1 -0
  298. package/dist/sources/builtin/url.d.ts +47 -0
  299. package/dist/sources/builtin/url.d.ts.map +1 -0
  300. package/dist/sources/builtin/url.js +429 -0
  301. package/dist/sources/builtin/url.js.map +1 -0
  302. package/dist/sources/config.d.ts +72 -0
  303. package/dist/sources/config.d.ts.map +1 -0
  304. package/dist/sources/config.js +215 -0
  305. package/dist/sources/config.js.map +1 -0
  306. package/dist/sources/index.d.ts +47 -0
  307. package/dist/sources/index.d.ts.map +1 -0
  308. package/dist/sources/index.js +210 -0
  309. package/dist/sources/index.js.map +1 -0
  310. package/dist/sources/integrations/github.d.ts +24 -0
  311. package/dist/sources/integrations/github.d.ts.map +1 -0
  312. package/dist/sources/integrations/github.js +193 -0
  313. package/dist/sources/integrations/github.js.map +1 -0
  314. package/dist/sources/integrations/linear.d.ts +18 -0
  315. package/dist/sources/integrations/linear.d.ts.map +1 -0
  316. package/dist/sources/integrations/linear.js +197 -0
  317. package/dist/sources/integrations/linear.js.map +1 -0
  318. package/dist/sources/integrations/notion.d.ts +39 -0
  319. package/dist/sources/integrations/notion.d.ts.map +1 -0
  320. package/dist/sources/integrations/notion.js +343 -0
  321. package/dist/sources/integrations/notion.js.map +1 -0
  322. package/dist/sources/integrations/todoist.d.ts +18 -0
  323. package/dist/sources/integrations/todoist.d.ts.map +1 -0
  324. package/dist/sources/integrations/todoist.js +154 -0
  325. package/dist/sources/integrations/todoist.js.map +1 -0
  326. package/dist/sources/types.d.ts +106 -0
  327. package/dist/sources/types.d.ts.map +1 -0
  328. package/dist/sources/types.js +9 -0
  329. package/dist/sources/types.js.map +1 -0
  330. package/dist/ui/index.d.ts +3 -0
  331. package/dist/ui/index.d.ts.map +1 -0
  332. package/dist/ui/index.js +3 -0
  333. package/dist/ui/index.js.map +1 -0
  334. package/dist/ui/progress-renderer.d.ts +54 -0
  335. package/dist/ui/progress-renderer.d.ts.map +1 -0
  336. package/dist/ui/progress-renderer.js +118 -0
  337. package/dist/ui/progress-renderer.js.map +1 -0
  338. package/dist/ui/shimmer.d.ts +16 -0
  339. package/dist/ui/shimmer.d.ts.map +1 -0
  340. package/dist/ui/shimmer.js +31 -0
  341. package/dist/ui/shimmer.js.map +1 -0
  342. package/dist/wizard/ascii-art.d.ts +93 -0
  343. package/dist/wizard/ascii-art.d.ts.map +1 -0
  344. package/dist/wizard/ascii-art.js +378 -0
  345. package/dist/wizard/ascii-art.js.map +1 -0
  346. package/dist/wizard/idea-prompts.d.ts +18 -0
  347. package/dist/wizard/idea-prompts.d.ts.map +1 -0
  348. package/dist/wizard/idea-prompts.js +154 -0
  349. package/dist/wizard/idea-prompts.js.map +1 -0
  350. package/dist/wizard/idea-ui.d.ts +34 -0
  351. package/dist/wizard/idea-ui.d.ts.map +1 -0
  352. package/dist/wizard/idea-ui.js +225 -0
  353. package/dist/wizard/idea-ui.js.map +1 -0
  354. package/dist/wizard/ideas.d.ts +27 -0
  355. package/dist/wizard/ideas.d.ts.map +1 -0
  356. package/dist/wizard/ideas.js +511 -0
  357. package/dist/wizard/ideas.js.map +1 -0
  358. package/dist/wizard/index.d.ts +11 -0
  359. package/dist/wizard/index.d.ts.map +1 -0
  360. package/dist/wizard/index.js +472 -0
  361. package/dist/wizard/index.js.map +1 -0
  362. package/dist/wizard/llm.d.ts +14 -0
  363. package/dist/wizard/llm.d.ts.map +1 -0
  364. package/dist/wizard/llm.js +420 -0
  365. package/dist/wizard/llm.js.map +1 -0
  366. package/dist/wizard/prompts.d.ts +75 -0
  367. package/dist/wizard/prompts.d.ts.map +1 -0
  368. package/dist/wizard/prompts.js +455 -0
  369. package/dist/wizard/prompts.js.map +1 -0
  370. package/dist/wizard/spec-generator.d.ts +14 -0
  371. package/dist/wizard/spec-generator.d.ts.map +1 -0
  372. package/dist/wizard/spec-generator.js +200 -0
  373. package/dist/wizard/spec-generator.js.map +1 -0
  374. package/dist/wizard/types.d.ts +53 -0
  375. package/dist/wizard/types.d.ts.map +1 -0
  376. package/dist/wizard/types.js +10 -0
  377. package/dist/wizard/types.js.map +1 -0
  378. package/dist/wizard/ui.d.ts +57 -0
  379. package/dist/wizard/ui.d.ts.map +1 -0
  380. package/dist/wizard/ui.js +211 -0
  381. package/dist/wizard/ui.js.map +1 -0
  382. package/package.json +59 -8
@@ -0,0 +1,324 @@
1
+ /**
2
+ * GitHub HTML Scraper
3
+ *
4
+ * Parses GitHub pages to extract content without requiring authentication.
5
+ * Handles:
6
+ * - Single issues: /owner/repo/issues/123
7
+ * - Issue lists: /owner/repo/issues
8
+ * - File blobs: /owner/repo/blob/branch/path
9
+ * - README pages: /owner/repo (extracts readme)
10
+ */
11
+ /**
12
+ * Detect if a URL is a GitHub URL and what type
13
+ */
14
+ export function detectGitHubUrl(url) {
15
+ if (url.hostname !== 'github.com' && url.hostname !== 'raw.githubusercontent.com') {
16
+ return { type: null, match: null };
17
+ }
18
+ // Raw file - already handled well by URL source
19
+ if (url.hostname === 'raw.githubusercontent.com') {
20
+ return { type: 'raw', match: null };
21
+ }
22
+ const pathname = url.pathname;
23
+ // Single issue: /owner/repo/issues/123
24
+ const issueMatch = pathname.match(/^\/([^/]+)\/([^/]+)\/issues\/(\d+)\/?$/);
25
+ if (issueMatch) {
26
+ return { type: 'issue', match: issueMatch };
27
+ }
28
+ // Issue list: /owner/repo/issues
29
+ const issuesMatch = pathname.match(/^\/([^/]+)\/([^/]+)\/issues\/?$/);
30
+ if (issuesMatch) {
31
+ return { type: 'issues', match: issuesMatch };
32
+ }
33
+ // File blob: /owner/repo/blob/branch/path
34
+ const blobMatch = pathname.match(/^\/([^/]+)\/([^/]+)\/blob\/([^/]+)\/(.+)$/);
35
+ if (blobMatch) {
36
+ return { type: 'blob', match: blobMatch };
37
+ }
38
+ // Repository root: /owner/repo
39
+ const repoMatch = pathname.match(/^\/([^/]+)\/([^/]+)\/?$/);
40
+ if (repoMatch) {
41
+ return { type: 'repo', match: repoMatch };
42
+ }
43
+ return { type: null, match: null };
44
+ }
45
+ /**
46
+ * Parse a single GitHub issue page
47
+ */
48
+ export function parseGitHubIssue(html, issueNumber) {
49
+ // Extract title
50
+ const titleMatch = html.match(/<bdi class="js-issue-title[^"]*"[^>]*>([^<]+)<\/bdi>/);
51
+ const title = titleMatch ? decodeHtmlEntities(titleMatch[1].trim()) : `Issue #${issueNumber}`;
52
+ // Extract state (open/closed)
53
+ const stateOpen = html.includes('State State--open') || html.includes('status-open');
54
+ const state = stateOpen ? 'open' : 'closed';
55
+ // Extract author
56
+ const authorMatch = html.match(/class="author[^"]*"[^>]*>([^<]+)<\/a>/);
57
+ const author = authorMatch ? authorMatch[1].trim() : 'unknown';
58
+ // Extract labels
59
+ const labels = [];
60
+ const labelRegex = /IssueLabel[^>]*>([^<]+)<\/span>/g;
61
+ let labelMatch;
62
+ while ((labelMatch = labelRegex.exec(html)) !== null) {
63
+ labels.push(decodeHtmlEntities(labelMatch[1].trim()));
64
+ }
65
+ // Extract issue body
66
+ const bodyMatch = html.match(/class="edit-comment-hide"[^>]*>[\s\S]*?<td[^>]*class="[^"]*comment-body[^"]*"[^>]*>([\s\S]*?)<\/td>/);
67
+ let body = '';
68
+ if (bodyMatch) {
69
+ body = htmlToMarkdown(bodyMatch[1]);
70
+ }
71
+ // Extract created date
72
+ const dateMatch = html.match(/<relative-time[^>]*datetime="([^"]+)"[^>]*>/);
73
+ const createdAt = dateMatch ? dateMatch[1] : '';
74
+ // Extract comments
75
+ const comments = parseGitHubComments(html);
76
+ return {
77
+ number: issueNumber,
78
+ title,
79
+ body,
80
+ state,
81
+ labels,
82
+ author,
83
+ createdAt,
84
+ comments,
85
+ };
86
+ }
87
+ /**
88
+ * Parse comments from a GitHub issue page
89
+ */
90
+ function parseGitHubComments(html) {
91
+ const comments = [];
92
+ // Find all comment bodies (skip the first one which is the issue body)
93
+ const commentRegex = /class="timeline-comment[^"]*"[\s\S]*?<a[^>]*class="author[^"]*"[^>]*>([^<]+)<\/a>[\s\S]*?<relative-time[^>]*datetime="([^"]+)"[\s\S]*?<td[^>]*class="[^"]*comment-body[^"]*"[^>]*>([\s\S]*?)<\/td>/g;
94
+ let match;
95
+ let isFirst = true;
96
+ while ((match = commentRegex.exec(html)) !== null) {
97
+ // Skip the first match (issue body)
98
+ if (isFirst) {
99
+ isFirst = false;
100
+ continue;
101
+ }
102
+ comments.push({
103
+ author: match[1].trim(),
104
+ createdAt: match[2],
105
+ body: htmlToMarkdown(match[3]),
106
+ });
107
+ }
108
+ return comments;
109
+ }
110
+ /**
111
+ * Parse GitHub issue list page
112
+ */
113
+ export function parseGitHubIssueList(html, _owner, _repo) {
114
+ const issues = [];
115
+ // Find issue rows
116
+ const issueRegex = /<a[^>]*id="issue_(\d+)_link"[^>]*href="[^"]*"[^>]*>([^<]+)<\/a>/g;
117
+ let match;
118
+ while ((match = issueRegex.exec(html)) !== null) {
119
+ issues.push({
120
+ number: parseInt(match[1], 10),
121
+ title: decodeHtmlEntities(match[2].trim()),
122
+ });
123
+ }
124
+ // Check for pagination
125
+ const hasMore = html.includes('next_page') || html.includes('pagination');
126
+ return { issues, hasMore };
127
+ }
128
+ /**
129
+ * Parse GitHub file blob page
130
+ */
131
+ export function parseGitHubBlob(html, filepath) {
132
+ // Try to find raw content in the page
133
+ // GitHub includes the raw content in a data attribute or script
134
+ let content = '';
135
+ // Method 1: Look for raw-blob-content
136
+ const blobMatch = html.match(/<div[^>]*class="[^"]*blob-code-content[^"]*"[^>]*>([\s\S]*?)<\/div>/);
137
+ if (blobMatch) {
138
+ content = extractCodeFromBlob(blobMatch[1]);
139
+ }
140
+ // Method 2: Look for data-plain attribute
141
+ if (!content) {
142
+ const plainMatch = html.match(/data-plain="([^"]*)"/);
143
+ if (plainMatch) {
144
+ content = decodeHtmlEntities(plainMatch[1]);
145
+ }
146
+ }
147
+ // Method 3: Extract line by line from blob-code elements
148
+ if (!content) {
149
+ const lines = [];
150
+ const lineRegex = /<td[^>]*class="[^"]*blob-code[^"]*"[^>]*>([\s\S]*?)<\/td>/g;
151
+ let lineMatch;
152
+ while ((lineMatch = lineRegex.exec(html)) !== null) {
153
+ lines.push(extractTextFromHtml(lineMatch[1]));
154
+ }
155
+ if (lines.length > 0) {
156
+ content = lines.join('\n');
157
+ }
158
+ }
159
+ // Detect language from file extension
160
+ const ext = filepath.split('.').pop()?.toLowerCase() || '';
161
+ const languageMap = {
162
+ js: 'javascript',
163
+ ts: 'typescript',
164
+ py: 'python',
165
+ rb: 'ruby',
166
+ go: 'go',
167
+ rs: 'rust',
168
+ java: 'java',
169
+ md: 'markdown',
170
+ json: 'json',
171
+ yaml: 'yaml',
172
+ yml: 'yaml',
173
+ };
174
+ return {
175
+ path: filepath,
176
+ content,
177
+ language: languageMap[ext] || ext,
178
+ };
179
+ }
180
+ /**
181
+ * Convert a GitHub issue to markdown
182
+ */
183
+ export function issueToMarkdown(issue) {
184
+ const lines = [];
185
+ // Title with state badge
186
+ const stateBadge = issue.state === 'open' ? '🟢 Open' : '🔴 Closed';
187
+ lines.push(`# ${issue.title}`);
188
+ lines.push('');
189
+ lines.push(`**Issue #${issue.number}** | ${stateBadge} | by @${issue.author}`);
190
+ if (issue.labels.length > 0) {
191
+ lines.push(`**Labels:** ${issue.labels.join(', ')}`);
192
+ }
193
+ if (issue.createdAt) {
194
+ lines.push(`**Created:** ${new Date(issue.createdAt).toLocaleDateString()}`);
195
+ }
196
+ lines.push('');
197
+ lines.push('---');
198
+ lines.push('');
199
+ // Body
200
+ if (issue.body) {
201
+ lines.push(issue.body);
202
+ lines.push('');
203
+ }
204
+ // Comments
205
+ if (issue.comments.length > 0) {
206
+ lines.push('---');
207
+ lines.push('');
208
+ lines.push('## Comments');
209
+ lines.push('');
210
+ for (const comment of issue.comments) {
211
+ lines.push(`### @${comment.author}`);
212
+ if (comment.createdAt) {
213
+ lines.push(`*${new Date(comment.createdAt).toLocaleDateString()}*`);
214
+ }
215
+ lines.push('');
216
+ lines.push(comment.body);
217
+ lines.push('');
218
+ }
219
+ }
220
+ return lines.join('\n');
221
+ }
222
+ /**
223
+ * Convert a GitHub file to markdown
224
+ */
225
+ export function fileToMarkdown(file) {
226
+ const lines = [];
227
+ lines.push(`# ${file.path}`);
228
+ lines.push('');
229
+ // If it's already markdown, just include it
230
+ if (file.language === 'markdown') {
231
+ lines.push(file.content);
232
+ }
233
+ else {
234
+ // Wrap in code block
235
+ lines.push(`\`\`\`${file.language || ''}`);
236
+ lines.push(file.content);
237
+ lines.push('```');
238
+ }
239
+ return lines.join('\n');
240
+ }
241
+ /**
242
+ * Convert issue list to markdown
243
+ */
244
+ export function issueListToMarkdown(issues, owner, repo) {
245
+ const lines = [];
246
+ lines.push(`# Issues: ${owner}/${repo}`);
247
+ lines.push('');
248
+ for (const issue of issues) {
249
+ const link = `https://github.com/${owner}/${repo}/issues/${issue.number}`;
250
+ lines.push(`- [#${issue.number}](${link}) ${issue.title}`);
251
+ }
252
+ return lines.join('\n');
253
+ }
254
+ // Helper functions
255
+ function decodeHtmlEntities(text) {
256
+ return text
257
+ .replace(/&nbsp;/g, ' ')
258
+ .replace(/&amp;/g, '&')
259
+ .replace(/&lt;/g, '<')
260
+ .replace(/&gt;/g, '>')
261
+ .replace(/&quot;/g, '"')
262
+ .replace(/&#39;/g, "'")
263
+ .replace(/&#x27;/g, "'")
264
+ .replace(/&#(\d+);/g, (_, num) => String.fromCharCode(parseInt(num, 10)));
265
+ }
266
+ function htmlToMarkdown(html) {
267
+ return (html
268
+ // Code blocks
269
+ .replace(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/gi, '\n```\n$1\n```\n')
270
+ // Inline code
271
+ .replace(/<code[^>]*>(.*?)<\/code>/gi, '`$1`')
272
+ // Headers
273
+ .replace(/<h1[^>]*>(.*?)<\/h1>/gi, '# $1\n')
274
+ .replace(/<h2[^>]*>(.*?)<\/h2>/gi, '## $1\n')
275
+ .replace(/<h3[^>]*>(.*?)<\/h3>/gi, '### $1\n')
276
+ .replace(/<h4[^>]*>(.*?)<\/h4>/gi, '#### $1\n')
277
+ // Paragraphs
278
+ .replace(/<p[^>]*>([\s\S]*?)<\/p>/gi, '$1\n\n')
279
+ // Lists
280
+ .replace(/<li[^>]*>([\s\S]*?)<\/li>/gi, '- $1\n')
281
+ .replace(/<ul[^>]*>|<\/ul>|<ol[^>]*>|<\/ol>/gi, '\n')
282
+ // Links
283
+ .replace(/<a[^>]*href="([^"]*)"[^>]*>(.*?)<\/a>/gi, '[$2]($1)')
284
+ // Bold
285
+ .replace(/<strong[^>]*>(.*?)<\/strong>/gi, '**$1**')
286
+ .replace(/<b[^>]*>(.*?)<\/b>/gi, '**$1**')
287
+ // Italic
288
+ .replace(/<em[^>]*>(.*?)<\/em>/gi, '*$1*')
289
+ .replace(/<i[^>]*>(.*?)<\/i>/gi, '*$1*')
290
+ // Line breaks
291
+ .replace(/<br\s*\/?>/gi, '\n')
292
+ // Remove remaining tags
293
+ .replace(/<[^>]+>/g, '')
294
+ // Decode entities
295
+ .replace(/&nbsp;/g, ' ')
296
+ .replace(/&amp;/g, '&')
297
+ .replace(/&lt;/g, '<')
298
+ .replace(/&gt;/g, '>')
299
+ // Clean up whitespace
300
+ .replace(/\n{3,}/g, '\n\n')
301
+ .trim());
302
+ }
303
+ function extractCodeFromBlob(html) {
304
+ // Remove span tags but keep content
305
+ return html
306
+ .replace(/<span[^>]*>/g, '')
307
+ .replace(/<\/span>/g, '')
308
+ .replace(/<[^>]+>/g, '')
309
+ .replace(/&nbsp;/g, ' ')
310
+ .replace(/&amp;/g, '&')
311
+ .replace(/&lt;/g, '<')
312
+ .replace(/&gt;/g, '>')
313
+ .trim();
314
+ }
315
+ function extractTextFromHtml(html) {
316
+ return html
317
+ .replace(/<[^>]+>/g, '')
318
+ .replace(/&nbsp;/g, ' ')
319
+ .replace(/&amp;/g, '&')
320
+ .replace(/&lt;/g, '<')
321
+ .replace(/&gt;/g, '>')
322
+ .trim();
323
+ }
324
+ //# sourceMappingURL=github-scraper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-scraper.js","sourceRoot":"","sources":["../../../src/sources/builtin/github-scraper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { BuiltinSource } from '../base.js';
2
+ import type { SourceOptions, SourceResult } from '../types.js';
3
+ /**
4
+ * PDF source - extracts text from PDF documents
5
+ *
6
+ * Supports:
7
+ * - Local PDF files
8
+ * - Remote PDF URLs
9
+ *
10
+ * Requires: pdf-parse package
11
+ */
12
+ export declare class PdfSource extends BuiltinSource {
13
+ name: string;
14
+ description: string;
15
+ private pdfParse;
16
+ isAvailable(): Promise<boolean>;
17
+ fetch(identifier: string, options?: SourceOptions): Promise<SourceResult>;
18
+ private fetchFromFile;
19
+ private fetchFromUrl;
20
+ private formatPdfContent;
21
+ private addMarkdownStructure;
22
+ getHelp(): string;
23
+ }
24
+ //# sourceMappingURL=pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../../src/sources/builtin/pdf.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D;;;;;;;;GAQG;AACH,qBAAa,SAAU,SAAQ,aAAa;IAC1C,IAAI,SAAS;IACb,WAAW,SAAsC;IAEjD,OAAO,CAAC,QAAQ,CAA8D;IAExE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAU/B,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YAiDjE,aAAa;YAqBb,YAAY;IA2B1B,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,oBAAoB;IAgD5B,OAAO,IAAI,MAAM;CAmBlB"}
@@ -0,0 +1,174 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { basename, resolve } from 'node:path';
3
+ import { BuiltinSource } from '../base.js';
4
+ /**
5
+ * PDF source - extracts text from PDF documents
6
+ *
7
+ * Supports:
8
+ * - Local PDF files
9
+ * - Remote PDF URLs
10
+ *
11
+ * Requires: pdf-parse package
12
+ */
13
+ export class PdfSource extends BuiltinSource {
14
+ name = 'pdf';
15
+ description = 'Extract specs from PDF documents';
16
+ pdfParse = null;
17
+ async isAvailable() {
18
+ try {
19
+ const pdfParseModule = await import('pdf-parse');
20
+ this.pdfParse = pdfParseModule.default;
21
+ return true;
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ async fetch(identifier, options) {
28
+ // Ensure pdf-parse is loaded
29
+ if (!this.pdfParse) {
30
+ const available = await this.isAvailable();
31
+ if (!available) {
32
+ this.error('pdf-parse package not installed. Run: npm install pdf-parse');
33
+ }
34
+ }
35
+ let buffer;
36
+ let source;
37
+ let title;
38
+ // Check if it's a URL or local file
39
+ if (identifier.startsWith('http://') || identifier.startsWith('https://')) {
40
+ const result = await this.fetchFromUrl(identifier, options);
41
+ buffer = result.buffer;
42
+ source = identifier;
43
+ title = result.title;
44
+ }
45
+ else {
46
+ const result = await this.fetchFromFile(identifier);
47
+ buffer = result.buffer;
48
+ source = result.path;
49
+ title = result.title;
50
+ }
51
+ // Parse PDF
52
+ const data = await this.pdfParse?.(buffer);
53
+ if (!data) {
54
+ throw new Error('PDF parsing failed - pdf-parse not available');
55
+ }
56
+ // Clean and format the text
57
+ const content = this.formatPdfContent(data.text, title);
58
+ return {
59
+ content,
60
+ source,
61
+ title,
62
+ metadata: {
63
+ type: 'pdf',
64
+ pages: data.numpages,
65
+ info: data.info,
66
+ version: data.version,
67
+ },
68
+ };
69
+ }
70
+ async fetchFromFile(identifier) {
71
+ const path = resolve(process.cwd(), identifier);
72
+ if (!existsSync(path)) {
73
+ this.error(`PDF file not found: ${identifier}`);
74
+ }
75
+ if (!path.toLowerCase().endsWith('.pdf')) {
76
+ this.error(`Not a PDF file: ${identifier}`);
77
+ }
78
+ const buffer = readFileSync(path);
79
+ const title = basename(path, '.pdf');
80
+ return { buffer, path, title };
81
+ }
82
+ async fetchFromUrl(url, options) {
83
+ const response = await fetch(url, {
84
+ headers: {
85
+ 'User-Agent': 'ralph-starter/0.1.0',
86
+ ...options?.headers,
87
+ },
88
+ });
89
+ if (!response.ok) {
90
+ this.error(`HTTP error ${response.status}: ${response.statusText}`);
91
+ }
92
+ const arrayBuffer = await response.arrayBuffer();
93
+ const buffer = Buffer.from(arrayBuffer);
94
+ // Try to get title from URL
95
+ const urlObj = new URL(url);
96
+ const pathSegments = urlObj.pathname.split('/');
97
+ const filename = pathSegments[pathSegments.length - 1] || 'document';
98
+ const title = filename.replace(/\.pdf$/i, '');
99
+ return { buffer, title };
100
+ }
101
+ formatPdfContent(text, title) {
102
+ // Clean up the text
103
+ let cleaned = text
104
+ // Normalize whitespace
105
+ .replace(/\r\n/g, '\n')
106
+ .replace(/\r/g, '\n')
107
+ // Remove excessive blank lines
108
+ .replace(/\n{4,}/g, '\n\n\n')
109
+ // Clean up spacing
110
+ .replace(/[ \t]+/g, ' ')
111
+ .trim();
112
+ // Try to detect sections and add markdown headers
113
+ cleaned = this.addMarkdownStructure(cleaned);
114
+ return `# ${title}\n\n${cleaned}`;
115
+ }
116
+ addMarkdownStructure(text) {
117
+ const lines = text.split('\n');
118
+ const result = [];
119
+ for (let i = 0; i < lines.length; i++) {
120
+ const line = lines[i].trim();
121
+ // Skip empty lines
122
+ if (!line) {
123
+ result.push('');
124
+ continue;
125
+ }
126
+ // Detect potential headers (all caps, short, followed by content)
127
+ if (line.length < 60 &&
128
+ line === line.toUpperCase() &&
129
+ /^[A-Z][A-Z\s\d]+$/.test(line) &&
130
+ lines[i + 1]?.trim()) {
131
+ // Convert to title case
132
+ const titleCase = line.toLowerCase().replace(/\b\w/g, (c) => c.toUpperCase());
133
+ result.push(`\n## ${titleCase}\n`);
134
+ continue;
135
+ }
136
+ // Detect numbered sections
137
+ const numberedMatch = line.match(/^(\d+\.?\d*\.?)\s+(.+)$/);
138
+ if (numberedMatch && line.length < 80) {
139
+ const [, number, text] = numberedMatch;
140
+ const depth = (number.match(/\./g) || []).length;
141
+ const prefix = '#'.repeat(Math.min(depth + 2, 4));
142
+ result.push(`\n${prefix} ${text}\n`);
143
+ continue;
144
+ }
145
+ // Detect bullet points
146
+ if (line.startsWith('•') || line.startsWith('-') || line.startsWith('*')) {
147
+ result.push(`- ${line.slice(1).trim()}`);
148
+ continue;
149
+ }
150
+ result.push(line);
151
+ }
152
+ return result.join('\n');
153
+ }
154
+ getHelp() {
155
+ return `
156
+ pdf: Extract specs from PDF documents
157
+
158
+ Usage:
159
+ ralph-starter run --from ./document.pdf
160
+ ralph-starter run --from https://example.com/spec.pdf
161
+
162
+ Examples:
163
+ ralph-starter run --from requirements.pdf
164
+ ralph-starter run --from ./docs/PRD.pdf
165
+ ralph-starter run --from https://company.com/api-spec.pdf
166
+
167
+ Notes:
168
+ - Requires pdf-parse package (npm install pdf-parse)
169
+ - Text extraction quality depends on PDF structure
170
+ - Scanned PDFs (images) are not supported
171
+ `.trim();
172
+ }
173
+ }
174
+ //# sourceMappingURL=pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/sources/builtin/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C;;;;;;;;GAQG;AACH,MAAM,OAAO,SAAU,SAAQ,aAAa;IAC1C,IAAI,GAAG,KAAK,CAAC;IACb,WAAW,GAAG,kCAAkC,CAAC;IAEzC,QAAQ,GAAyD,IAAI,CAAC;IAE9E,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,OAAuB;QACrD,6BAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,IAAI,MAAc,CAAC;QACnB,IAAI,MAAc,CAAC;QACnB,IAAI,KAAa,CAAC;QAElB,oCAAoC;QACpC,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,MAAM,GAAG,UAAU,CAAC;YACpB,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;YACrB,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACvB,CAAC;QAED,YAAY;QACZ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;QAE3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,4BAA4B;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAExD,OAAO;YACL,OAAO;YACP,MAAM;YACN,KAAK;YACL,QAAQ,EAAE;gBACR,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,IAAI,CAAC,QAAQ;gBACpB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,UAAkB;QAK5C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QAEhD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAErC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,GAAW,EACX,OAAuB;QAEvB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE;gBACP,YAAY,EAAE,qBAAqB;gBACnC,GAAG,OAAO,EAAE,OAAO;aACpB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAExC,4BAA4B;QAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC;QACrE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAE9C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAEO,gBAAgB,CAAC,IAAY,EAAE,KAAa;QAClD,oBAAoB;QACpB,IAAI,OAAO,GAAG,IAAI;YAChB,uBAAuB;aACtB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;aACtB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;YACrB,+BAA+B;aAC9B,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC;YAC7B,mBAAmB;aAClB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,IAAI,EAAE,CAAC;QAEV,kDAAkD;QAClD,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE7C,OAAO,KAAK,KAAK,OAAO,OAAO,EAAE,CAAC;IACpC,CAAC;IAEO,oBAAoB,CAAC,IAAY;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE7B,mBAAmB;YACnB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,kEAAkE;YAClE,IACE,IAAI,CAAC,MAAM,GAAG,EAAE;gBAChB,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE;gBAC3B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC9B,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EACpB,CAAC;gBACD,wBAAwB;gBACxB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC9E,MAAM,CAAC,IAAI,CAAC,QAAQ,SAAS,IAAI,CAAC,CAAC;gBACnC,SAAS;YACX,CAAC;YAED,2BAA2B;YAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC5D,IAAI,aAAa,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,aAAa,CAAC;gBACvC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACjD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAClD,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC;gBACrC,SAAS;YACX,CAAC;YAED,uBAAuB;YACvB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACzC,SAAS;YACX,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,OAAO;;;;;;;;;;;;;;;;CAgBV,CAAC,IAAI,EAAE,CAAC;IACP,CAAC;CACF"}
@@ -0,0 +1,47 @@
1
+ import { BuiltinSource } from '../base.js';
2
+ import type { SourceOptions, SourceResult } from '../types.js';
3
+ /**
4
+ * URL source - fetches specs from remote URLs
5
+ *
6
+ * Supports:
7
+ * - Raw markdown files (GitHub raw, etc.)
8
+ * - HTML pages (basic conversion)
9
+ * - JSON responses
10
+ * - GitHub issues and files (specialized parsing)
11
+ * - Notion public pages (specialized parsing)
12
+ */
13
+ export declare class UrlSource extends BuiltinSource {
14
+ name: string;
15
+ description: string;
16
+ isAvailable(): Promise<boolean>;
17
+ fetch(identifier: string, options?: SourceOptions): Promise<SourceResult>;
18
+ /**
19
+ * Fetch and parse GitHub URLs (issues, blobs, etc.)
20
+ */
21
+ private fetchGitHub;
22
+ /**
23
+ * Check if URL is a Notion public page
24
+ */
25
+ private isNotionUrl;
26
+ /**
27
+ * Fetch and parse Notion public pages
28
+ */
29
+ private fetchNotion;
30
+ /**
31
+ * Parse Notion public page HTML
32
+ * Note: Notion uses client-side rendering, so public pages have limited HTML content
33
+ */
34
+ private parseNotionHtml;
35
+ /**
36
+ * Extract content from Notion's preloaded data
37
+ */
38
+ private extractNotionContent;
39
+ private isMarkdown;
40
+ private jsonToMarkdown;
41
+ private arrayToMarkdown;
42
+ private objectToMarkdown;
43
+ private htmlToMarkdown;
44
+ private getTitleFromUrl;
45
+ getHelp(): string;
46
+ }
47
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/sources/builtin/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAW/D;;;;;;;;;GASG;AACH,qBAAa,SAAU,SAAQ,aAAa;IAC1C,IAAI,SAAS;IACb,WAAW,SAAkC;IAEvC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAoE/E;;OAEG;YACW,WAAW;IAuGzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;YACW,WAAW;IAoCzB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAsDvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,gBAAgB;IAwCxB,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,eAAe;IAiBvB,OAAO,IAAI,MAAM;CAiClB"}