dirpush 0.0.0 → 0.1.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 (895) hide show
  1. package/.agents/skills/dirpush/SKILL.md +92 -0
  2. package/.agents/skills/dirpush/references/assets.md +48 -0
  3. package/.agents/skills/dirpush/references/authentication.md +59 -0
  4. package/.agents/skills/dirpush/references/recovery.md +34 -0
  5. package/.agents/skills/dirpush/references/submissions.md +43 -0
  6. package/LICENSE +21 -0
  7. package/README.md +64 -5
  8. package/THIRD_PARTY_NOTICES.md +10 -0
  9. package/bin/dirpush.cjs +13 -0
  10. package/drizzle/0000_init.sql +59 -0
  11. package/drizzle/0001_jazzy_masked_marvel.sql +9 -0
  12. package/drizzle/0002_loose_may_parker.sql +9 -0
  13. package/drizzle/0003_modern_lilandra.sql +6 -0
  14. package/drizzle/0004_deep_master_chief.sql +11 -0
  15. package/drizzle/meta/0000_snapshot.json +404 -0
  16. package/drizzle/meta/0001_snapshot.json +466 -0
  17. package/drizzle/meta/0002_snapshot.json +527 -0
  18. package/drizzle/meta/0003_snapshot.json +566 -0
  19. package/drizzle/meta/0004_snapshot.json +642 -0
  20. package/drizzle/meta/_journal.json +41 -0
  21. package/examples/workspace/identity.yaml +6 -0
  22. package/examples/workspace/permissions.yaml +29 -0
  23. package/examples/workspace/product.yaml +29 -0
  24. package/package.json +61 -6
  25. package/registry/LICENSE +396 -0
  26. package/registry/directories/1000-tools/directory.yaml +55 -0
  27. package/registry/directories/1000-tools/playbook.md +5 -0
  28. package/registry/directories/10015-io/directory.yaml +66 -0
  29. package/registry/directories/10015-io/playbook.md +9 -0
  30. package/registry/directories/10words/directory.yaml +53 -0
  31. package/registry/directories/10words/playbook.md +8 -0
  32. package/registry/directories/600-tools/directory.yaml +48 -0
  33. package/registry/directories/600-tools/playbook.md +1 -0
  34. package/registry/directories/a1bookmarks/directory.yaml +42 -0
  35. package/registry/directories/aback-launch/directory.yaml +54 -0
  36. package/registry/directories/aback-launch/playbook.md +1 -0
  37. package/registry/directories/acid-tools/directory.yaml +51 -0
  38. package/registry/directories/acid-tools/playbook.md +8 -0
  39. package/registry/directories/agenthunter/directory.yaml +53 -0
  40. package/registry/directories/ai-agents-directory/directory.yaml +49 -0
  41. package/registry/directories/ai-agents-directory/playbook.md +6 -0
  42. package/registry/directories/ai-agents-list/directory.yaml +46 -0
  43. package/registry/directories/ai-agents-list/playbook.md +1 -0
  44. package/registry/directories/ai-agents-listing/directory.yaml +76 -0
  45. package/registry/directories/ai-directories/directory.yaml +45 -0
  46. package/registry/directories/ai-directories/playbook.md +7 -0
  47. package/registry/directories/ai-dust/directory.yaml +68 -0
  48. package/registry/directories/ai-dust/playbook.md +1 -0
  49. package/registry/directories/ai-nav/directory.yaml +54 -0
  50. package/registry/directories/ai-nav/playbook.md +1 -0
  51. package/registry/directories/ai-respo/directory.yaml +43 -0
  52. package/registry/directories/ai-respo/playbook.md +1 -0
  53. package/registry/directories/ai-superhub/directory.yaml +65 -0
  54. package/registry/directories/ai-tool-list/directory.yaml +44 -0
  55. package/registry/directories/ai-tool-list/playbook.md +1 -0
  56. package/registry/directories/ai-tool-saver/directory.yaml +52 -0
  57. package/registry/directories/ai-tool-saver/playbook.md +1 -0
  58. package/registry/directories/ai-toolex/directory.yaml +46 -0
  59. package/registry/directories/ai-toolex/playbook.md +1 -0
  60. package/registry/directories/ai-toolz-dir/directory.yaml +60 -0
  61. package/registry/directories/ai-website-directory/directory.yaml +66 -0
  62. package/registry/directories/ai-website-directory/playbook.md +1 -0
  63. package/registry/directories/ai-x-collection/directory.yaml +45 -0
  64. package/registry/directories/ai-x-collection/playbook.md +1 -0
  65. package/registry/directories/aiagentstore/directory.yaml +52 -0
  66. package/registry/directories/aiagentstore/playbook.md +1 -0
  67. package/registry/directories/aidirs-best/directory.yaml +46 -0
  68. package/registry/directories/aifindy/directory.yaml +44 -0
  69. package/registry/directories/aifindy/playbook.md +1 -0
  70. package/registry/directories/aihubs/directory.yaml +44 -0
  71. package/registry/directories/aihubs/playbook.md +5 -0
  72. package/registry/directories/aihuntlist/directory.yaml +43 -0
  73. package/registry/directories/aihuntlist/playbook.md +6 -0
  74. package/registry/directories/aihustle/directory.yaml +51 -0
  75. package/registry/directories/aihustle/playbook.md +5 -0
  76. package/registry/directories/ailaunch-space/directory.yaml +44 -0
  77. package/registry/directories/ailaunch-space/playbook.md +6 -0
  78. package/registry/directories/ailib/directory.yaml +64 -0
  79. package/registry/directories/ailib/playbook.md +1 -0
  80. package/registry/directories/aimatch-pro/directory.yaml +42 -0
  81. package/registry/directories/aimatch-pro/playbook.md +1 -0
  82. package/registry/directories/ainave/directory.yaml +71 -0
  83. package/registry/directories/ainave/playbook.md +10 -0
  84. package/registry/directories/aitechviral/directory.yaml +47 -0
  85. package/registry/directories/aitechviral/playbook.md +10 -0
  86. package/registry/directories/aitogrow/directory.yaml +52 -0
  87. package/registry/directories/aitogrow/playbook.md +6 -0
  88. package/registry/directories/aitoolhunt/directory.yaml +43 -0
  89. package/registry/directories/aitoolhunt/playbook.md +5 -0
  90. package/registry/directories/aitools-fyi/directory.yaml +52 -0
  91. package/registry/directories/aitools-inc/directory.yaml +48 -0
  92. package/registry/directories/aitools-inc/playbook.md +1 -0
  93. package/registry/directories/aitoolsdirectory/directory.yaml +73 -0
  94. package/registry/directories/aitoolsdirectory/playbook.md +8 -0
  95. package/registry/directories/aitoolshunt/directory.yaml +64 -0
  96. package/registry/directories/aitoolshunt/playbook.md +6 -0
  97. package/registry/directories/aitoolslist/directory.yaml +59 -0
  98. package/registry/directories/aitoolslist/playbook.md +6 -0
  99. package/registry/directories/aitoolsmagazine/directory.yaml +46 -0
  100. package/registry/directories/aitoolsmagazine/playbook.md +5 -0
  101. package/registry/directories/aitoolsmarketer/directory.yaml +56 -0
  102. package/registry/directories/aitoolsmarketer/playbook.md +7 -0
  103. package/registry/directories/aitooltrek/directory.yaml +47 -0
  104. package/registry/directories/aitooltrek/playbook.md +6 -0
  105. package/registry/directories/aitop10-tools/directory.yaml +44 -0
  106. package/registry/directories/aitop10-tools/playbook.md +5 -0
  107. package/registry/directories/aitoptools/directory.yaml +74 -0
  108. package/registry/directories/aitoptools/playbook.md +1 -0
  109. package/registry/directories/aiwithme/directory.yaml +54 -0
  110. package/registry/directories/aiwithme/playbook.md +10 -0
  111. package/registry/directories/all-in-ai-tools/directory.yaml +51 -0
  112. package/registry/directories/all-in-ai-tools/playbook.md +1 -0
  113. package/registry/directories/allmcps/directory.yaml +55 -0
  114. package/registry/directories/allmcps/playbook.md +7 -0
  115. package/registry/directories/alltopstartups/directory.yaml +43 -0
  116. package/registry/directories/altern-ai/directory.yaml +50 -0
  117. package/registry/directories/altern-ai/playbook.md +6 -0
  118. package/registry/directories/alternative-tools/directory.yaml +46 -0
  119. package/registry/directories/alternative-tools/playbook.md +4 -0
  120. package/registry/directories/alternativeto/directory.yaml +48 -0
  121. package/registry/directories/alternativeto/playbook.md +8 -0
  122. package/registry/directories/ant-directory/directory.yaml +52 -0
  123. package/registry/directories/ant-directory/playbook.md +1 -0
  124. package/registry/directories/app-scout/directory.yaml +60 -0
  125. package/registry/directories/app-scout/playbook.md +5 -0
  126. package/registry/directories/app-stack-builder/directory.yaml +71 -0
  127. package/registry/directories/appalist/directory.yaml +46 -0
  128. package/registry/directories/appalist/playbook.md +4 -0
  129. package/registry/directories/apprater/directory.yaml +65 -0
  130. package/registry/directories/apprater/playbook.md +1 -0
  131. package/registry/directories/appsumo/directory.yaml +45 -0
  132. package/registry/directories/appsumo/playbook.md +1 -0
  133. package/registry/directories/ask-ai-for-it/directory.yaml +45 -0
  134. package/registry/directories/ask-ai-for-it/playbook.md +1 -0
  135. package/registry/directories/auraplusplus/directory.yaml +56 -0
  136. package/registry/directories/auraplusplus/playbook.md +6 -0
  137. package/registry/directories/awesome-mcp-list/directory.yaml +45 -0
  138. package/registry/directories/awesome-mcp-list/playbook.md +7 -0
  139. package/registry/directories/awesome-mcp-lists/directory.yaml +44 -0
  140. package/registry/directories/awesome-mcp-lists/playbook.md +6 -0
  141. package/registry/directories/awesome-remote-mcp-servers/directory.yaml +46 -0
  142. package/registry/directories/awesome-remote-mcp-servers/playbook.md +8 -0
  143. package/registry/directories/awesome-tools/directory.yaml +55 -0
  144. package/registry/directories/awesome-tools/playbook.md +8 -0
  145. package/registry/directories/awesomeindie/directory.yaml +51 -0
  146. package/registry/directories/awesomeindie/playbook.md +7 -0
  147. package/registry/directories/axis-launch/directory.yaml +64 -0
  148. package/registry/directories/b2b-saas-market/directory.yaml +63 -0
  149. package/registry/directories/bai-tools/directory.yaml +53 -0
  150. package/registry/directories/bai-tools/playbook.md +7 -0
  151. package/registry/directories/basedtools/directory.yaml +59 -0
  152. package/registry/directories/basedtools/playbook.md +1 -0
  153. package/registry/directories/best-ai-org/directory.yaml +53 -0
  154. package/registry/directories/best-ai-org/playbook.md +1 -0
  155. package/registry/directories/best-of-ai/directory.yaml +57 -0
  156. package/registry/directories/best-of-ai/playbook.md +1 -0
  157. package/registry/directories/bestaito/directory.yaml +47 -0
  158. package/registry/directories/bestaito/playbook.md +6 -0
  159. package/registry/directories/bestofai/directory.yaml +45 -0
  160. package/registry/directories/bestofai/playbook.md +7 -0
  161. package/registry/directories/bestsky-tools/directory.yaml +44 -0
  162. package/registry/directories/bestsky-tools/playbook.md +5 -0
  163. package/registry/directories/betabound/directory.yaml +63 -0
  164. package/registry/directories/betabound/playbook.md +7 -0
  165. package/registry/directories/betalist/directory.yaml +52 -0
  166. package/registry/directories/betalist/playbook.md +11 -0
  167. package/registry/directories/betterbuys/directory.yaml +55 -0
  168. package/registry/directories/betterbuys/playbook.md +7 -0
  169. package/registry/directories/betterlaunch/directory.yaml +53 -0
  170. package/registry/directories/beyond-ai-tools/directory.yaml +43 -0
  171. package/registry/directories/beyond-ai-tools/playbook.md +1 -0
  172. package/registry/directories/billion-dollar-pitch-decks/directory.yaml +64 -0
  173. package/registry/directories/billion-dollar-pitch-decks/playbook.md +4 -0
  174. package/registry/directories/browserextension-dev/directory.yaml +55 -0
  175. package/registry/directories/browserextension-dev/playbook.md +7 -0
  176. package/registry/directories/bsdirectory/directory.yaml +68 -0
  177. package/registry/directories/bsdirectory/playbook.md +5 -0
  178. package/registry/directories/buildvoyage/directory.yaml +64 -0
  179. package/registry/directories/buildvoyage/playbook.md +1 -0
  180. package/registry/directories/built-here/directory.yaml +50 -0
  181. package/registry/directories/built-here/playbook.md +6 -0
  182. package/registry/directories/builtbyme/directory.yaml +55 -0
  183. package/registry/directories/builtbyme/playbook.md +7 -0
  184. package/registry/directories/builtineu/directory.yaml +70 -0
  185. package/registry/directories/builtineu/playbook.md +7 -0
  186. package/registry/directories/businesssoftware/directory.yaml +42 -0
  187. package/registry/directories/buy-sell-startups/directory.yaml +52 -0
  188. package/registry/directories/buy-sell-startups/playbook.md +5 -0
  189. package/registry/directories/claude-mcp-directory/directory.yaml +45 -0
  190. package/registry/directories/claude-mcp-directory/playbook.md +7 -0
  191. package/registry/directories/claude-plugin-directory/directory.yaml +48 -0
  192. package/registry/directories/claude-plugin-directory/playbook.md +7 -0
  193. package/registry/directories/cocoon-ai/directory.yaml +57 -0
  194. package/registry/directories/codehype/directory.yaml +68 -0
  195. package/registry/directories/codehype/playbook.md +7 -0
  196. package/registry/directories/collectai/directory.yaml +43 -0
  197. package/registry/directories/collectai/playbook.md +5 -0
  198. package/registry/directories/commune-launchpad/directory.yaml +51 -0
  199. package/registry/directories/confettisaas/directory.yaml +51 -0
  200. package/registry/directories/confettisaas/playbook.md +1 -0
  201. package/registry/directories/crowdstax/directory.yaml +54 -0
  202. package/registry/directories/crowdstax/playbook.md +6 -0
  203. package/registry/directories/crozdesk/directory.yaml +72 -0
  204. package/registry/directories/crozdesk/playbook.md +8 -0
  205. package/registry/directories/crypto-tools-directory/directory.yaml +60 -0
  206. package/registry/directories/crypto-tools-directory/playbook.md +6 -0
  207. package/registry/directories/ctrlaltship/directory.yaml +92 -0
  208. package/registry/directories/ctrlaltship/playbook.md +6 -0
  209. package/registry/directories/dachstartups/directory.yaml +49 -0
  210. package/registry/directories/dachstartups/playbook.md +4 -0
  211. package/registry/directories/dailypings/directory.yaml +51 -0
  212. package/registry/directories/dailypings/playbook.md +6 -0
  213. package/registry/directories/dang-ai/directory.yaml +44 -0
  214. package/registry/directories/dang-ai/playbook.md +1 -0
  215. package/registry/directories/daniellaunches/directory.yaml +47 -0
  216. package/registry/directories/daniellaunches/playbook.md +6 -0
  217. package/registry/directories/datalook/directory.yaml +60 -0
  218. package/registry/directories/dayslaunch/directory.yaml +46 -0
  219. package/registry/directories/dayslaunch/playbook.md +5 -0
  220. package/registry/directories/deeplaunch/directory.yaml +46 -0
  221. package/registry/directories/deeplaunch/playbook.md +6 -0
  222. package/registry/directories/desifounder-spotlight/directory.yaml +49 -0
  223. package/registry/directories/desifounder-spotlight/playbook.md +1 -0
  224. package/registry/directories/developers-digest-mcp/directory.yaml +46 -0
  225. package/registry/directories/developers-digest-mcp/playbook.md +7 -0
  226. package/registry/directories/devhunt/directory.yaml +53 -0
  227. package/registry/directories/devhunt/playbook.md +8 -0
  228. package/registry/directories/devpages/directory.yaml +62 -0
  229. package/registry/directories/devpages/playbook.md +7 -0
  230. package/registry/directories/devresourc-es/directory.yaml +49 -0
  231. package/registry/directories/devresourc-es/playbook.md +9 -0
  232. package/registry/directories/devtools-directory/directory.yaml +63 -0
  233. package/registry/directories/devtools-directory/playbook.md +7 -0
  234. package/registry/directories/dir-hub/directory.yaml +62 -0
  235. package/registry/directories/dir-hub/playbook.md +6 -0
  236. package/registry/directories/direct2app/directory.yaml +47 -0
  237. package/registry/directories/direct2app/playbook.md +5 -0
  238. package/registry/directories/directree/directory.yaml +56 -0
  239. package/registry/directories/directree/playbook.md +7 -0
  240. package/registry/directories/dirs-cc/directory.yaml +49 -0
  241. package/registry/directories/dirs-cc/playbook.md +1 -0
  242. package/registry/directories/dododirectory/directory.yaml +46 -0
  243. package/registry/directories/dododirectory/playbook.md +6 -0
  244. package/registry/directories/dofollowtools/directory.yaml +75 -0
  245. package/registry/directories/dofollowtools/playbook.md +7 -0
  246. package/registry/directories/dropyourai/directory.yaml +73 -0
  247. package/registry/directories/dynamite-ai/directory.yaml +59 -0
  248. package/registry/directories/dynamite-ai/playbook.md +1 -0
  249. package/registry/directories/earlyhunt/directory.yaml +44 -0
  250. package/registry/directories/earlyhunt/playbook.md +6 -0
  251. package/registry/directories/ebool/directory.yaml +72 -0
  252. package/registry/directories/ebool/playbook.md +8 -0
  253. package/registry/directories/eliteai-tools/directory.yaml +45 -0
  254. package/registry/directories/eliteai-tools/playbook.md +1 -0
  255. package/registry/directories/emoji-launch/directory.yaml +60 -0
  256. package/registry/directories/emoji-launch/playbook.md +1 -0
  257. package/registry/directories/enlisted/directory.yaml +48 -0
  258. package/registry/directories/enlisted/playbook.md +7 -0
  259. package/registry/directories/eu-software-alternatives/directory.yaml +87 -0
  260. package/registry/directories/eu-software-alternatives/playbook.md +5 -0
  261. package/registry/directories/eu-vetted/directory.yaml +64 -0
  262. package/registry/directories/eu-vetted/playbook.md +1 -0
  263. package/registry/directories/eubuilt/directory.yaml +77 -0
  264. package/registry/directories/eubuilt/playbook.md +5 -0
  265. package/registry/directories/euroalternative/directory.yaml +48 -0
  266. package/registry/directories/euroalternative/playbook.md +1 -0
  267. package/registry/directories/european-tech/directory.yaml +55 -0
  268. package/registry/directories/european-tech/playbook.md +5 -0
  269. package/registry/directories/europeanapps/directory.yaml +52 -0
  270. package/registry/directories/europeanapps/playbook.md +5 -0
  271. package/registry/directories/europeanstack/directory.yaml +66 -0
  272. package/registry/directories/europeanstack/playbook.md +7 -0
  273. package/registry/directories/eurotoolsindex/directory.yaml +68 -0
  274. package/registry/directories/eurotoolsindex/playbook.md +7 -0
  275. package/registry/directories/everydev-ai/directory.yaml +50 -0
  276. package/registry/directories/everydev-ai/playbook.md +6 -0
  277. package/registry/directories/faceless-directory/directory.yaml +52 -0
  278. package/registry/directories/fastd/directory.yaml +45 -0
  279. package/registry/directories/fastd/playbook.md +1 -0
  280. package/registry/directories/fastlaunch/directory.yaml +53 -0
  281. package/registry/directories/fastlaunch/playbook.md +10 -0
  282. package/registry/directories/favors/directory.yaml +72 -0
  283. package/registry/directories/favors/playbook.md +7 -0
  284. package/registry/directories/fazier/directory.yaml +44 -0
  285. package/registry/directories/fazier/playbook.md +8 -0
  286. package/registry/directories/featuredtool/directory.yaml +51 -0
  287. package/registry/directories/featuredtool/playbook.md +1 -0
  288. package/registry/directories/find-seo-tools/directory.yaml +72 -0
  289. package/registry/directories/find-seo-tools/playbook.md +1 -0
  290. package/registry/directories/findly-tools/directory.yaml +45 -0
  291. package/registry/directories/findly-tools/playbook.md +7 -0
  292. package/registry/directories/findstack/directory.yaml +46 -0
  293. package/registry/directories/findstack/playbook.md +1 -0
  294. package/registry/directories/findyoursaas/directory.yaml +47 -0
  295. package/registry/directories/findyoursaas/playbook.md +7 -0
  296. package/registry/directories/firsto/directory.yaml +54 -0
  297. package/registry/directories/firsto/playbook.md +10 -0
  298. package/registry/directories/fosspace/directory.yaml +49 -0
  299. package/registry/directories/founders-today/directory.yaml +52 -0
  300. package/registry/directories/francesaas/directory.yaml +49 -0
  301. package/registry/directories/francesaas/playbook.md +5 -0
  302. package/registry/directories/free-startup-directories/directory.yaml +70 -0
  303. package/registry/directories/free-startup-listing/directory.yaml +59 -0
  304. package/registry/directories/free-startup-listing/playbook.md +6 -0
  305. package/registry/directories/free-tools-directory/directory.yaml +55 -0
  306. package/registry/directories/free-tools-directory/playbook.md +7 -0
  307. package/registry/directories/freeaitools-net/directory.yaml +57 -0
  308. package/registry/directories/from-europe-with-love/directory.yaml +63 -0
  309. package/registry/directories/from-europe-with-love/playbook.md +5 -0
  310. package/registry/directories/fstlaunch/directory.yaml +57 -0
  311. package/registry/directories/fstlaunch/playbook.md +6 -0
  312. package/registry/directories/futuretools/directory.yaml +67 -0
  313. package/registry/directories/futuretools/playbook.md +10 -0
  314. package/registry/directories/glama/directory.yaml +46 -0
  315. package/registry/directories/glama/playbook.md +7 -0
  316. package/registry/directories/goodaitools/directory.yaml +46 -0
  317. package/registry/directories/goodaitools/playbook.md +7 -0
  318. package/registry/directories/gptbot/directory.yaml +56 -0
  319. package/registry/directories/gptdemo/directory.yaml +56 -0
  320. package/registry/directories/gptdemo/playbook.md +7 -0
  321. package/registry/directories/hicyou/directory.yaml +51 -0
  322. package/registry/directories/hicyou/playbook.md +1 -0
  323. package/registry/directories/hightechattic/directory.yaml +49 -0
  324. package/registry/directories/hightechattic/playbook.md +6 -0
  325. package/registry/directories/howtobuysaas/directory.yaml +59 -0
  326. package/registry/directories/howtobuysaas/playbook.md +1 -0
  327. package/registry/directories/hunt0/directory.yaml +81 -0
  328. package/registry/directories/hunt0/playbook.md +1 -0
  329. package/registry/directories/huntscreens/directory.yaml +56 -0
  330. package/registry/directories/huntscreens/playbook.md +11 -0
  331. package/registry/directories/huntstartup/directory.yaml +53 -0
  332. package/registry/directories/huntstartup/playbook.md +8 -0
  333. package/registry/directories/huzzler/directory.yaml +49 -0
  334. package/registry/directories/huzzler/playbook.md +7 -0
  335. package/registry/directories/hype-star/directory.yaml +57 -0
  336. package/registry/directories/hype-star/playbook.md +6 -0
  337. package/registry/directories/idea-kiln/directory.yaml +50 -0
  338. package/registry/directories/idea-kiln/playbook.md +6 -0
  339. package/registry/directories/ignlab-launch/directory.yaml +82 -0
  340. package/registry/directories/ignlab-launch/playbook.md +7 -0
  341. package/registry/directories/indie-deals/directory.yaml +48 -0
  342. package/registry/directories/indie-deals/playbook.md +8 -0
  343. package/registry/directories/indie-hustles/directory.yaml +61 -0
  344. package/registry/directories/indie-hustles/playbook.md +1 -0
  345. package/registry/directories/indie-makers-hub/directory.yaml +50 -0
  346. package/registry/directories/indie-makers-hub/playbook.md +5 -0
  347. package/registry/directories/indie-page/directory.yaml +47 -0
  348. package/registry/directories/indie-page/playbook.md +1 -0
  349. package/registry/directories/indiefounders/directory.yaml +48 -0
  350. package/registry/directories/indiefounders/playbook.md +5 -0
  351. package/registry/directories/indiehackers/directory.yaml +47 -0
  352. package/registry/directories/indiehackers/playbook.md +1 -0
  353. package/registry/directories/indiehackerstacks/directory.yaml +45 -0
  354. package/registry/directories/indiehackerstacks/playbook.md +5 -0
  355. package/registry/directories/indiehub/directory.yaml +45 -0
  356. package/registry/directories/indiehub/playbook.md +8 -0
  357. package/registry/directories/indiehunt/directory.yaml +45 -0
  358. package/registry/directories/indiehunt/playbook.md +6 -0
  359. package/registry/directories/indieneed/directory.yaml +78 -0
  360. package/registry/directories/indieneed/playbook.md +9 -0
  361. package/registry/directories/indieproducts/directory.yaml +47 -0
  362. package/registry/directories/indieproducts/playbook.md +4 -0
  363. package/registry/directories/indiesignal/directory.yaml +47 -0
  364. package/registry/directories/indietool/directory.yaml +44 -0
  365. package/registry/directories/indietool/playbook.md +1 -0
  366. package/registry/directories/indietools/directory.yaml +69 -0
  367. package/registry/directories/insidr-ai/directory.yaml +49 -0
  368. package/registry/directories/insidr-ai/playbook.md +5 -0
  369. package/registry/directories/intelligent-tools/directory.yaml +59 -0
  370. package/registry/directories/intelligent-tools/playbook.md +1 -0
  371. package/registry/directories/inventlist/directory.yaml +71 -0
  372. package/registry/directories/inventlist/playbook.md +5 -0
  373. package/registry/directories/joinly/directory.yaml +68 -0
  374. package/registry/directories/joinly/playbook.md +5 -0
  375. package/registry/directories/junkstartups/directory.yaml +72 -0
  376. package/registry/directories/junkstartups/playbook.md +1 -0
  377. package/registry/directories/justhunt/directory.yaml +55 -0
  378. package/registry/directories/justhunt/playbook.md +7 -0
  379. package/registry/directories/kittylaunch/directory.yaml +70 -0
  380. package/registry/directories/kittylaunch/playbook.md +7 -0
  381. package/registry/directories/lachief/directory.yaml +81 -0
  382. package/registry/directories/lachief/playbook.md +1 -0
  383. package/registry/directories/landbook/directory.yaml +48 -0
  384. package/registry/directories/landbook/playbook.md +1 -0
  385. package/registry/directories/launch-community/directory.yaml +73 -0
  386. package/registry/directories/launch-community/playbook.md +1 -0
  387. package/registry/directories/launch-list/directory.yaml +52 -0
  388. package/registry/directories/launch-list/playbook.md +6 -0
  389. package/registry/directories/launchaf/directory.yaml +51 -0
  390. package/registry/directories/launchbase-india/directory.yaml +53 -0
  391. package/registry/directories/launchboard/directory.yaml +50 -0
  392. package/registry/directories/launchboard/playbook.md +6 -0
  393. package/registry/directories/launchclash/directory.yaml +47 -0
  394. package/registry/directories/launchclash/playbook.md +6 -0
  395. package/registry/directories/launched-tools/directory.yaml +48 -0
  396. package/registry/directories/launchfree/directory.yaml +58 -0
  397. package/registry/directories/launchfree/playbook.md +1 -0
  398. package/registry/directories/launchigniter/directory.yaml +60 -0
  399. package/registry/directories/launchigniter/playbook.md +9 -0
  400. package/registry/directories/launchit/directory.yaml +48 -0
  401. package/registry/directories/launchit/playbook.md +1 -0
  402. package/registry/directories/launchllama/directory.yaml +53 -0
  403. package/registry/directories/launchllama/playbook.md +7 -0
  404. package/registry/directories/launchonit/directory.yaml +74 -0
  405. package/registry/directories/launchonit/playbook.md +7 -0
  406. package/registry/directories/launchpedia-tools/directory.yaml +43 -0
  407. package/registry/directories/launchpedia-tools/playbook.md +5 -0
  408. package/registry/directories/launchscaler/directory.yaml +53 -0
  409. package/registry/directories/launchtory/directory.yaml +47 -0
  410. package/registry/directories/launchtory/playbook.md +5 -0
  411. package/registry/directories/launchvault/directory.yaml +52 -0
  412. package/registry/directories/launchvault/playbook.md +5 -0
  413. package/registry/directories/launchvibe/directory.yaml +45 -0
  414. package/registry/directories/launchvibe/playbook.md +1 -0
  415. package/registry/directories/launchvoid/directory.yaml +45 -0
  416. package/registry/directories/launchvoid/playbook.md +6 -0
  417. package/registry/directories/letslaunch/directory.yaml +53 -0
  418. package/registry/directories/letslaunch/playbook.md +1 -0
  419. package/registry/directories/libhunt/directory.yaml +50 -0
  420. package/registry/directories/libhunt/playbook.md +1 -0
  421. package/registry/directories/linezine/directory.yaml +44 -0
  422. package/registry/directories/linezine/playbook.md +1 -0
  423. package/registry/directories/linkrena/directory.yaml +58 -0
  424. package/registry/directories/linkrena/playbook.md +6 -0
  425. package/registry/directories/list-maro/directory.yaml +74 -0
  426. package/registry/directories/list-your-tool/directory.yaml +76 -0
  427. package/registry/directories/list-your-tool/playbook.md +1 -0
  428. package/registry/directories/listbulb/directory.yaml +48 -0
  429. package/registry/directories/listbulb/playbook.md +1 -0
  430. package/registry/directories/listing-sh/directory.yaml +70 -0
  431. package/registry/directories/llm-relevance/directory.yaml +67 -0
  432. package/registry/directories/llm-relevance/playbook.md +1 -0
  433. package/registry/directories/llms-txt-hub/directory.yaml +47 -0
  434. package/registry/directories/llms-txt-hub/playbook.md +6 -0
  435. package/registry/directories/llms-txt-site/directory.yaml +53 -0
  436. package/registry/directories/llms-txt-site/playbook.md +7 -0
  437. package/registry/directories/macnative/directory.yaml +47 -0
  438. package/registry/directories/macnative/playbook.md +6 -0
  439. package/registry/directories/made-with-bolt/directory.yaml +58 -0
  440. package/registry/directories/made-with-bolt/playbook.md +1 -0
  441. package/registry/directories/made-with-lovable/directory.yaml +64 -0
  442. package/registry/directories/made-with-lovable/playbook.md +1 -0
  443. package/registry/directories/magicbox/directory.yaml +51 -0
  444. package/registry/directories/magicbox/playbook.md +16 -0
  445. package/registry/directories/maidensail/directory.yaml +54 -0
  446. package/registry/directories/makeitlast/directory.yaml +63 -0
  447. package/registry/directories/makeitlast/playbook.md +8 -0
  448. package/registry/directories/makerhunt/directory.yaml +56 -0
  449. package/registry/directories/makerhunt/playbook.md +1 -0
  450. package/registry/directories/makerlist/directory.yaml +49 -0
  451. package/registry/directories/makerlist/playbook.md +7 -0
  452. package/registry/directories/mapbid/directory.yaml +46 -0
  453. package/registry/directories/marketingdb/directory.yaml +50 -0
  454. package/registry/directories/marketingdb/playbook.md +8 -0
  455. package/registry/directories/marketraa/directory.yaml +63 -0
  456. package/registry/directories/marketraa/playbook.md +1 -0
  457. package/registry/directories/mcp-market/directory.yaml +49 -0
  458. package/registry/directories/mcp-market/playbook.md +7 -0
  459. package/registry/directories/mcp-repository/directory.yaml +45 -0
  460. package/registry/directories/mcp-repository/playbook.md +6 -0
  461. package/registry/directories/mcp-so/directory.yaml +45 -0
  462. package/registry/directories/mcp-so/playbook.md +6 -0
  463. package/registry/directories/mcpservers/directory.yaml +53 -0
  464. package/registry/directories/mcpservers/playbook.md +7 -0
  465. package/registry/directories/mf8/directory.yaml +53 -0
  466. package/registry/directories/mf8/playbook.md +5 -0
  467. package/registry/directories/microlaunch/directory.yaml +48 -0
  468. package/registry/directories/microlaunch/playbook.md +1 -0
  469. package/registry/directories/microsaasexamples/directory.yaml +50 -0
  470. package/registry/directories/must-tools/directory.yaml +68 -0
  471. package/registry/directories/must-tools/playbook.md +6 -0
  472. package/registry/directories/my-launch-stash/directory.yaml +47 -0
  473. package/registry/directories/my-launch-stash/playbook.md +8 -0
  474. package/registry/directories/nachonacho/directory.yaml +47 -0
  475. package/registry/directories/navfolders/directory.yaml +48 -0
  476. package/registry/directories/navfolders/playbook.md +5 -0
  477. package/registry/directories/navs/directory.yaml +66 -0
  478. package/registry/directories/navs/playbook.md +6 -0
  479. package/registry/directories/navtools-ai/directory.yaml +51 -0
  480. package/registry/directories/navtools-ai/playbook.md +1 -0
  481. package/registry/directories/neeed-directory/directory.yaml +60 -0
  482. package/registry/directories/neeed-directory/playbook.md +10 -0
  483. package/registry/directories/neonrev/directory.yaml +43 -0
  484. package/registry/directories/neonrev/playbook.md +1 -0
  485. package/registry/directories/newaiforyou/directory.yaml +50 -0
  486. package/registry/directories/newaiforyou/playbook.md +1 -0
  487. package/registry/directories/newtool/directory.yaml +51 -0
  488. package/registry/directories/newtool/playbook.md +1 -0
  489. package/registry/directories/nextbigwhat/directory.yaml +48 -0
  490. package/registry/directories/nextbigwhat/playbook.md +5 -0
  491. package/registry/directories/nextlaunch/directory.yaml +50 -0
  492. package/registry/directories/nextlaunch/playbook.md +8 -0
  493. package/registry/directories/nicklaunches/directory.yaml +70 -0
  494. package/registry/directories/nicklaunches/playbook.md +1 -0
  495. package/registry/directories/nocodefinder/directory.yaml +45 -0
  496. package/registry/directories/nocodefinder/playbook.md +6 -0
  497. package/registry/directories/nocodelist/directory.yaml +48 -0
  498. package/registry/directories/nocodelist/playbook.md +7 -0
  499. package/registry/directories/noonlaunch/directory.yaml +51 -0
  500. package/registry/directories/noonlaunch/playbook.md +6 -0
  501. package/registry/directories/nxgn-tools/directory.yaml +49 -0
  502. package/registry/directories/nxgn-tools/playbook.md +6 -0
  503. package/registry/directories/once-tools/directory.yaml +58 -0
  504. package/registry/directories/once-tools/playbook.md +1 -0
  505. package/registry/directories/open-launch/directory.yaml +46 -0
  506. package/registry/directories/open-launch/playbook.md +1 -0
  507. package/registry/directories/openalternative/directory.yaml +62 -0
  508. package/registry/directories/openalternative/playbook.md +8 -0
  509. package/registry/directories/openhunts/directory.yaml +52 -0
  510. package/registry/directories/openhunts/playbook.md +1 -0
  511. package/registry/directories/openresources/directory.yaml +59 -0
  512. package/registry/directories/openresources/playbook.md +6 -0
  513. package/registry/directories/opensaas-directory/directory.yaml +47 -0
  514. package/registry/directories/opensourcealternative-to/directory.yaml +63 -0
  515. package/registry/directories/opensourcealternative-to/playbook.md +6 -0
  516. package/registry/directories/opentools/directory.yaml +42 -0
  517. package/registry/directories/opentools/playbook.md +4 -0
  518. package/registry/directories/osssoftware/directory.yaml +66 -0
  519. package/registry/directories/osssoftware/playbook.md +5 -0
  520. package/registry/directories/oursoftware-eu/directory.yaml +69 -0
  521. package/registry/directories/oursoftware-eu/playbook.md +1 -0
  522. package/registry/directories/peerpush/directory.yaml +48 -0
  523. package/registry/directories/peerpush/playbook.md +8 -0
  524. package/registry/directories/phyco/directory.yaml +54 -0
  525. package/registry/directories/phygital-ai-library/directory.yaml +47 -0
  526. package/registry/directories/phygital-ai-library/playbook.md +6 -0
  527. package/registry/directories/pitchground/directory.yaml +47 -0
  528. package/registry/directories/pitchground/playbook.md +5 -0
  529. package/registry/directories/pitchwall/directory.yaml +47 -0
  530. package/registry/directories/pitchwall/playbook.md +1 -0
  531. package/registry/directories/postmake/directory.yaml +56 -0
  532. package/registry/directories/postmake/playbook.md +1 -0
  533. package/registry/directories/poweredbyai/directory.yaml +57 -0
  534. package/registry/directories/poweredbyai/playbook.md +1 -0
  535. package/registry/directories/pro-launch/directory.yaml +51 -0
  536. package/registry/directories/pro-launch/playbook.md +9 -0
  537. package/registry/directories/product-hunt/directory.yaml +54 -0
  538. package/registry/directories/product-hunt/playbook.md +1 -0
  539. package/registry/directories/product-rally/directory.yaml +50 -0
  540. package/registry/directories/product-rally/playbook.md +6 -0
  541. package/registry/directories/productivity-directory/directory.yaml +47 -0
  542. package/registry/directories/productivity-directory/playbook.md +7 -0
  543. package/registry/directories/productwatch/directory.yaml +51 -0
  544. package/registry/directories/productwatch/playbook.md +7 -0
  545. package/registry/directories/proofstories/directory.yaml +47 -0
  546. package/registry/directories/proofstories/playbook.md +1 -0
  547. package/registry/directories/prouct/directory.yaml +93 -0
  548. package/registry/directories/prouct/playbook.md +7 -0
  549. package/registry/directories/public-apis/directory.yaml +47 -0
  550. package/registry/directories/public-apis/playbook.md +6 -0
  551. package/registry/directories/publishyoursaas/directory.yaml +53 -0
  552. package/registry/directories/publishyoursaas/playbook.md +7 -0
  553. package/registry/directories/rankinpublic/directory.yaml +50 -0
  554. package/registry/directories/rankinpublic/playbook.md +1 -0
  555. package/registry/directories/rankyourai/directory.yaml +50 -0
  556. package/registry/directories/rankyourai/playbook.md +1 -0
  557. package/registry/directories/resource-fyi/directory.yaml +47 -0
  558. package/registry/directories/resource-fyi/playbook.md +5 -0
  559. package/registry/directories/roozna/directory.yaml +68 -0
  560. package/registry/directories/roozna/playbook.md +1 -0
  561. package/registry/directories/saas-fyi/directory.yaml +73 -0
  562. package/registry/directories/saas-fyi/playbook.md +7 -0
  563. package/registry/directories/saas-italia/directory.yaml +58 -0
  564. package/registry/directories/saas-launches/directory.yaml +47 -0
  565. package/registry/directories/saas-launches/playbook.md +6 -0
  566. package/registry/directories/saasbison/directory.yaml +44 -0
  567. package/registry/directories/saasbison/playbook.md +8 -0
  568. package/registry/directories/saascity/directory.yaml +50 -0
  569. package/registry/directories/saascubes/directory.yaml +49 -0
  570. package/registry/directories/saascubes/playbook.md +6 -0
  571. package/registry/directories/saasfame/directory.yaml +47 -0
  572. package/registry/directories/saasfame/playbook.md +6 -0
  573. package/registry/directories/saasgenius/directory.yaml +50 -0
  574. package/registry/directories/saasgenius/playbook.md +8 -0
  575. package/registry/directories/saasgrave-launches/directory.yaml +53 -0
  576. package/registry/directories/saasgrave-launches/playbook.md +7 -0
  577. package/registry/directories/saashammer/directory.yaml +53 -0
  578. package/registry/directories/saashammer/playbook.md +6 -0
  579. package/registry/directories/saashub/directory.yaml +51 -0
  580. package/registry/directories/saashub/playbook.md +9 -0
  581. package/registry/directories/saashunt/directory.yaml +43 -0
  582. package/registry/directories/saaslineup/directory.yaml +68 -0
  583. package/registry/directories/saaslineup/playbook.md +1 -0
  584. package/registry/directories/saaslist/directory.yaml +55 -0
  585. package/registry/directories/saaslist/playbook.md +5 -0
  586. package/registry/directories/saasmag-saas1000/directory.yaml +71 -0
  587. package/registry/directories/saaspage/directory.yaml +48 -0
  588. package/registry/directories/saasplace/directory.yaml +66 -0
  589. package/registry/directories/saasplace/playbook.md +1 -0
  590. package/registry/directories/saasrow/directory.yaml +51 -0
  591. package/registry/directories/saasrow/playbook.md +1 -0
  592. package/registry/directories/saassy-board/directory.yaml +54 -0
  593. package/registry/directories/saassy-board/playbook.md +1 -0
  594. package/registry/directories/saastore/directory.yaml +56 -0
  595. package/registry/directories/saastore/playbook.md +6 -0
  596. package/registry/directories/saastr-community-agents/directory.yaml +65 -0
  597. package/registry/directories/saastr-community-agents/playbook.md +8 -0
  598. package/registry/directories/saasvault/directory.yaml +48 -0
  599. package/registry/directories/saasvault/playbook.md +6 -0
  600. package/registry/directories/scrolllaunch/directory.yaml +54 -0
  601. package/registry/directories/scrolllaunch/playbook.md +8 -0
  602. package/registry/directories/seewhatnewai/directory.yaml +53 -0
  603. package/registry/directories/sellwithboost/directory.yaml +54 -0
  604. package/registry/directories/sellwithboost/playbook.md +5 -0
  605. package/registry/directories/serchen/directory.yaml +48 -0
  606. package/registry/directories/serchen/playbook.md +8 -0
  607. package/registry/directories/shinylaunch/directory.yaml +48 -0
  608. package/registry/directories/shinylaunch/playbook.md +6 -0
  609. package/registry/directories/shipyard-hq/directory.yaml +58 -0
  610. package/registry/directories/shipyard-hq/playbook.md +1 -0
  611. package/registry/directories/shipybara/directory.yaml +48 -0
  612. package/registry/directories/shipybara/playbook.md +8 -0
  613. package/registry/directories/shipycorn/directory.yaml +47 -0
  614. package/registry/directories/shipycorn/playbook.md +6 -0
  615. package/registry/directories/showmebest-ai/directory.yaml +50 -0
  616. package/registry/directories/showmebest-ai/playbook.md +1 -0
  617. package/registry/directories/showmysites/directory.yaml +52 -0
  618. package/registry/directories/showmysites/playbook.md +7 -0
  619. package/registry/directories/sidehunt/directory.yaml +56 -0
  620. package/registry/directories/sidehunt/playbook.md +1 -0
  621. package/registry/directories/sideprojectors/directory.yaml +55 -0
  622. package/registry/directories/sideprojectors/playbook.md +1 -0
  623. package/registry/directories/sideprojects/directory.yaml +52 -0
  624. package/registry/directories/sideprojects/playbook.md +1 -0
  625. package/registry/directories/sitepatent/directory.yaml +58 -0
  626. package/registry/directories/sitepatent/playbook.md +1 -0
  627. package/registry/directories/small-business-marketing-tools/directory.yaml +67 -0
  628. package/registry/directories/small-business-marketing-tools/playbook.md +1 -0
  629. package/registry/directories/smol-launch/directory.yaml +44 -0
  630. package/registry/directories/smol-launch/playbook.md +9 -0
  631. package/registry/directories/software-como-servicio/directory.yaml +64 -0
  632. package/registry/directories/software-como-servicio/playbook.md +6 -0
  633. package/registry/directories/software-finder/directory.yaml +47 -0
  634. package/registry/directories/software-finder/playbook.md +6 -0
  635. package/registry/directories/softwaresuggest/directory.yaml +68 -0
  636. package/registry/directories/softwaresuggest/playbook.md +6 -0
  637. package/registry/directories/solo-launches/directory.yaml +48 -0
  638. package/registry/directories/solo-launches/playbook.md +6 -0
  639. package/registry/directories/sololaunch/directory.yaml +69 -0
  640. package/registry/directories/sourceforge/directory.yaml +75 -0
  641. package/registry/directories/sourceforge/playbook.md +9 -0
  642. package/registry/directories/spacerrapps/directory.yaml +53 -0
  643. package/registry/directories/spacerrapps/playbook.md +6 -0
  644. package/registry/directories/speartip/directory.yaml +48 -0
  645. package/registry/directories/speartip/playbook.md +1 -0
  646. package/registry/directories/spiff-store/directory.yaml +46 -0
  647. package/registry/directories/spiff-store/playbook.md +6 -0
  648. package/registry/directories/spot-startups/directory.yaml +48 -0
  649. package/registry/directories/spotsaas/directory.yaml +45 -0
  650. package/registry/directories/squidir/directory.yaml +60 -0
  651. package/registry/directories/squidir/playbook.md +5 -0
  652. package/registry/directories/stackboo/directory.yaml +49 -0
  653. package/registry/directories/stackboo/playbook.md +6 -0
  654. package/registry/directories/stackledge/directory.yaml +84 -0
  655. package/registry/directories/stackledge/playbook.md +8 -0
  656. package/registry/directories/startup-alternatives/directory.yaml +68 -0
  657. package/registry/directories/startup-alternatives/playbook.md +5 -0
  658. package/registry/directories/startup-benchmarks/directory.yaml +59 -0
  659. package/registry/directories/startup-benchmarks/playbook.md +1 -0
  660. package/registry/directories/startup-collections/directory.yaml +56 -0
  661. package/registry/directories/startup-collections/playbook.md +5 -0
  662. package/registry/directories/startup-europe/directory.yaml +52 -0
  663. package/registry/directories/startup-europe/playbook.md +1 -0
  664. package/registry/directories/startup-fame/directory.yaml +51 -0
  665. package/registry/directories/startup-fame/playbook.md +8 -0
  666. package/registry/directories/startup-fast/directory.yaml +52 -0
  667. package/registry/directories/startup-fast/playbook.md +9 -0
  668. package/registry/directories/startup-list/directory.yaml +81 -0
  669. package/registry/directories/startup-list/playbook.md +8 -0
  670. package/registry/directories/startup-listing/directory.yaml +77 -0
  671. package/registry/directories/startup-listing/playbook.md +1 -0
  672. package/registry/directories/startup-og/directory.yaml +52 -0
  673. package/registry/directories/startup-ranking/directory.yaml +51 -0
  674. package/registry/directories/startup-ranking/playbook.md +1 -0
  675. package/registry/directories/startup-spotlight/directory.yaml +50 -0
  676. package/registry/directories/startup-spotlight/playbook.md +5 -0
  677. package/registry/directories/startup88/directory.yaml +46 -0
  678. package/registry/directories/startup88/playbook.md +1 -0
  679. package/registry/directories/startupaccelerator/directory.yaml +76 -0
  680. package/registry/directories/startupaccelerator/playbook.md +7 -0
  681. package/registry/directories/startupbase/directory.yaml +44 -0
  682. package/registry/directories/startupbase/playbook.md +1 -0
  683. package/registry/directories/startupbeats/directory.yaml +48 -0
  684. package/registry/directories/startupbeats/playbook.md +6 -0
  685. package/registry/directories/startupdirectory/directory.yaml +50 -0
  686. package/registry/directories/startupdirectory/playbook.md +1 -0
  687. package/registry/directories/startupinspire/directory.yaml +52 -0
  688. package/registry/directories/startupinspire/playbook.md +8 -0
  689. package/registry/directories/startuplibrary/directory.yaml +46 -0
  690. package/registry/directories/startuplibrary/playbook.md +1 -0
  691. package/registry/directories/startuplist-africa/directory.yaml +45 -0
  692. package/registry/directories/startuplist-africa/playbook.md +6 -0
  693. package/registry/directories/startups-gallery/directory.yaml +61 -0
  694. package/registry/directories/startups-gallery/playbook.md +5 -0
  695. package/registry/directories/startupsfm/directory.yaml +64 -0
  696. package/registry/directories/startupsfm/playbook.md +9 -0
  697. package/registry/directories/startupsfyi/directory.yaml +51 -0
  698. package/registry/directories/startupsfyi/playbook.md +4 -0
  699. package/registry/directories/startupslab/directory.yaml +61 -0
  700. package/registry/directories/startupslab/playbook.md +8 -0
  701. package/registry/directories/startuptile/directory.yaml +51 -0
  702. package/registry/directories/startuptile/playbook.md +5 -0
  703. package/registry/directories/startuptrusted/directory.yaml +46 -0
  704. package/registry/directories/startuptrusted/playbook.md +1 -0
  705. package/registry/directories/startuups/directory.yaml +50 -0
  706. package/registry/directories/steemhunt/directory.yaml +46 -0
  707. package/registry/directories/steemhunt/playbook.md +5 -0
  708. package/registry/directories/stellar-launch/directory.yaml +55 -0
  709. package/registry/directories/stellar-launch/playbook.md +1 -0
  710. package/registry/directories/stork-ai/directory.yaml +49 -0
  711. package/registry/directories/stork-ai/playbook.md +3 -0
  712. package/registry/directories/stork-mcp/directory.yaml +52 -0
  713. package/registry/directories/stork-mcp/playbook.md +3 -0
  714. package/registry/directories/submitaitools/directory.yaml +57 -0
  715. package/registry/directories/submitaitools/playbook.md +19 -0
  716. package/registry/directories/submithunt/directory.yaml +49 -0
  717. package/registry/directories/submithunt/playbook.md +9 -0
  718. package/registry/directories/submitmysaas/directory.yaml +51 -0
  719. package/registry/directories/submitmysaas/playbook.md +6 -0
  720. package/registry/directories/submitstartup/directory.yaml +73 -0
  721. package/registry/directories/sumodir/directory.yaml +47 -0
  722. package/registry/directories/sumodir/playbook.md +7 -0
  723. package/registry/directories/superlaunch/directory.yaml +64 -0
  724. package/registry/directories/superlaunch/playbook.md +7 -0
  725. package/registry/directories/techboard-australia/directory.yaml +54 -0
  726. package/registry/directories/techboard-australia/playbook.md +5 -0
  727. package/registry/directories/technologyadvice/directory.yaml +65 -0
  728. package/registry/directories/technologyadvice/playbook.md +8 -0
  729. package/registry/directories/tekpon/directory.yaml +44 -0
  730. package/registry/directories/tensorblock-mcp/directory.yaml +46 -0
  731. package/registry/directories/tensorblock-mcp/playbook.md +7 -0
  732. package/registry/directories/thankjohn/directory.yaml +42 -0
  733. package/registry/directories/thankjohn/playbook.md +1 -0
  734. package/registry/directories/that-ai-collection/directory.yaml +52 -0
  735. package/registry/directories/the-ai-library/directory.yaml +46 -0
  736. package/registry/directories/the-ai-library/playbook.md +1 -0
  737. package/registry/directories/the-next-ai/directory.yaml +62 -0
  738. package/registry/directories/the-popular-apps/directory.yaml +43 -0
  739. package/registry/directories/the-popular-apps/playbook.md +1 -0
  740. package/registry/directories/the-startup-inc/directory.yaml +90 -0
  741. package/registry/directories/the-startup-inc/playbook.md +4 -0
  742. package/registry/directories/the-startup-project/directory.yaml +67 -0
  743. package/registry/directories/the-startup-project/playbook.md +5 -0
  744. package/registry/directories/the-tool-directory/directory.yaml +75 -0
  745. package/registry/directories/thedevtoolsdir/directory.yaml +57 -0
  746. package/registry/directories/thedevtoolsdir/playbook.md +6 -0
  747. package/registry/directories/theres-an-ai/directory.yaml +44 -0
  748. package/registry/directories/theres-an-ai/playbook.md +1 -0
  749. package/registry/directories/theresanaiforthat/directory.yaml +51 -0
  750. package/registry/directories/theresanaiforthat/playbook.md +1 -0
  751. package/registry/directories/thesaasdir/directory.yaml +44 -0
  752. package/registry/directories/thesaasdir/playbook.md +6 -0
  753. package/registry/directories/tinylaunch/directory.yaml +50 -0
  754. package/registry/directories/tinylaunch/playbook.md +8 -0
  755. package/registry/directories/tinystartups/directory.yaml +61 -0
  756. package/registry/directories/tinystartups/playbook.md +6 -0
  757. package/registry/directories/tipseason/directory.yaml +68 -0
  758. package/registry/directories/tolodora/directory.yaml +59 -0
  759. package/registry/directories/tool-commons/directory.yaml +46 -0
  760. package/registry/directories/tool-commons/playbook.md +1 -0
  761. package/registry/directories/tool-directory-ai/directory.yaml +64 -0
  762. package/registry/directories/tool-directory-ai/playbook.md +5 -0
  763. package/registry/directories/tool-finder/directory.yaml +64 -0
  764. package/registry/directories/tool-finder/playbook.md +6 -0
  765. package/registry/directories/tooldirs/directory.yaml +64 -0
  766. package/registry/directories/tooldirs/playbook.md +7 -0
  767. package/registry/directories/toolfame/directory.yaml +47 -0
  768. package/registry/directories/toolfame/playbook.md +6 -0
  769. package/registry/directories/toolfio/directory.yaml +48 -0
  770. package/registry/directories/toolfio/playbook.md +7 -0
  771. package/registry/directories/toolfolio/directory.yaml +54 -0
  772. package/registry/directories/toolfolio/playbook.md +1 -0
  773. package/registry/directories/toolfound/directory.yaml +66 -0
  774. package/registry/directories/toolify/directory.yaml +52 -0
  775. package/registry/directories/toolify/playbook.md +8 -0
  776. package/registry/directories/toolkitly/directory.yaml +46 -0
  777. package/registry/directories/toolkitly/playbook.md +1 -0
  778. package/registry/directories/toollist-ai/directory.yaml +60 -0
  779. package/registry/directories/toollist-ai/playbook.md +1 -0
  780. package/registry/directories/toolomio/directory.yaml +55 -0
  781. package/registry/directories/toolomio/playbook.md +5 -0
  782. package/registry/directories/toolpasta/directory.yaml +46 -0
  783. package/registry/directories/toolpasta/playbook.md +1 -0
  784. package/registry/directories/toolpilot-ai/directory.yaml +77 -0
  785. package/registry/directories/toolpilot-ai/playbook.md +8 -0
  786. package/registry/directories/toolpromote/directory.yaml +81 -0
  787. package/registry/directories/toolrain/directory.yaml +48 -0
  788. package/registry/directories/toolrain/playbook.md +1 -0
  789. package/registry/directories/tools-ai-online/directory.yaml +65 -0
  790. package/registry/directories/tools-ai-online/playbook.md +7 -0
  791. package/registry/directories/tools-cafe/directory.yaml +51 -0
  792. package/registry/directories/tools-cafe/playbook.md +6 -0
  793. package/registry/directories/toolscout/directory.yaml +45 -0
  794. package/registry/directories/toolscout/playbook.md +5 -0
  795. package/registry/directories/toolsfine/directory.yaml +58 -0
  796. package/registry/directories/toolsfine/playbook.md +9 -0
  797. package/registry/directories/toolsnocode/directory.yaml +48 -0
  798. package/registry/directories/toolsnocode/playbook.md +6 -0
  799. package/registry/directories/tooltrove/directory.yaml +71 -0
  800. package/registry/directories/tooltrove/playbook.md +9 -0
  801. package/registry/directories/toolveyor/directory.yaml +44 -0
  802. package/registry/directories/toolveyor/playbook.md +1 -0
  803. package/registry/directories/toolwise/directory.yaml +67 -0
  804. package/registry/directories/toolwise/playbook.md +7 -0
  805. package/registry/directories/toools-design/directory.yaml +64 -0
  806. package/registry/directories/toools-design/playbook.md +8 -0
  807. package/registry/directories/topai-tools/directory.yaml +43 -0
  808. package/registry/directories/topai-tools/playbook.md +1 -0
  809. package/registry/directories/traffiklist/directory.yaml +55 -0
  810. package/registry/directories/traffiklist/playbook.md +6 -0
  811. package/registry/directories/trendy-startups/directory.yaml +49 -0
  812. package/registry/directories/trendy-startups/playbook.md +1 -0
  813. package/registry/directories/trillionagent/directory.yaml +57 -0
  814. package/registry/directories/trillionagent/playbook.md +1 -0
  815. package/registry/directories/truerev/directory.yaml +83 -0
  816. package/registry/directories/truerev/playbook.md +12 -0
  817. package/registry/directories/trustmrr/directory.yaml +43 -0
  818. package/registry/directories/trustradius/directory.yaml +67 -0
  819. package/registry/directories/trustradius/playbook.md +9 -0
  820. package/registry/directories/trylaunch/directory.yaml +51 -0
  821. package/registry/directories/trylaunch/playbook.md +1 -0
  822. package/registry/directories/tulimoa/directory.yaml +65 -0
  823. package/registry/directories/tulimoa/playbook.md +7 -0
  824. package/registry/directories/turbo0/directory.yaml +49 -0
  825. package/registry/directories/turbo0/playbook.md +9 -0
  826. package/registry/directories/twelve-tools/directory.yaml +47 -0
  827. package/registry/directories/twelve-tools/playbook.md +6 -0
  828. package/registry/directories/ultimate-free-tools/directory.yaml +49 -0
  829. package/registry/directories/ultimate-free-tools/playbook.md +8 -0
  830. package/registry/directories/uneed/directory.yaml +55 -0
  831. package/registry/directories/uneed/playbook.md +9 -0
  832. package/registry/directories/unitelist/directory.yaml +49 -0
  833. package/registry/directories/unitelist/playbook.md +7 -0
  834. package/registry/directories/uno-directory/directory.yaml +48 -0
  835. package/registry/directories/uno-directory/playbook.md +1 -0
  836. package/registry/directories/ventureradar/directory.yaml +47 -0
  837. package/registry/directories/ventureradar/playbook.md +5 -0
  838. package/registry/directories/vibe-coding-cloud/directory.yaml +45 -0
  839. package/registry/directories/vibe-coding-cloud/playbook.md +6 -0
  840. package/registry/directories/victrays/directory.yaml +55 -0
  841. package/registry/directories/victrays/playbook.md +8 -0
  842. package/registry/directories/visalytica/directory.yaml +59 -0
  843. package/registry/directories/wavel/directory.yaml +51 -0
  844. package/registry/directories/we-are-founders/directory.yaml +85 -0
  845. package/registry/directories/we-are-founders/playbook.md +1 -0
  846. package/registry/directories/web-store-extensions/directory.yaml +45 -0
  847. package/registry/directories/web-store-extensions/playbook.md +6 -0
  848. package/registry/directories/webcurate/directory.yaml +50 -0
  849. package/registry/directories/website-rating/directory.yaml +66 -0
  850. package/registry/directories/website-rating/playbook.md +9 -0
  851. package/registry/directories/webspot/directory.yaml +46 -0
  852. package/registry/directories/webspot/playbook.md +5 -0
  853. package/registry/directories/weekhack/directory.yaml +56 -0
  854. package/registry/directories/weekhack/playbook.md +5 -0
  855. package/registry/directories/weliketools/directory.yaml +50 -0
  856. package/registry/directories/weliketools/playbook.md +6 -0
  857. package/registry/directories/what-is-ai-tools/directory.yaml +48 -0
  858. package/registry/directories/what-is-ai-tools/playbook.md +1 -0
  859. package/registry/directories/wired-business/directory.yaml +44 -0
  860. package/registry/directories/wired-business/playbook.md +6 -0
  861. package/registry/directories/would-you-pay/directory.yaml +49 -0
  862. package/registry/directories/would-you-pay/playbook.md +6 -0
  863. package/registry/directories/xai-plugin-marketplace/directory.yaml +46 -0
  864. package/registry/directories/xai-plugin-marketplace/playbook.md +5 -0
  865. package/registry/directories/zplatform-ai/directory.yaml +75 -0
  866. package/registry/directories/zumvu/directory.yaml +50 -0
  867. package/scripts/ab +40 -0
  868. package/scripts/check-listings +8 -0
  869. package/scripts/google-login +13 -0
  870. package/scripts/show-browser +17 -0
  871. package/src/accounts.ts +81 -0
  872. package/src/audit.ts +229 -0
  873. package/src/browser.ts +123 -0
  874. package/src/capabilities.ts +62 -0
  875. package/src/cli.ts +780 -0
  876. package/src/db/index.ts +29 -0
  877. package/src/db/schema.ts +152 -0
  878. package/src/directory-kinds.ts +12 -0
  879. package/src/import-hosted.ts +156 -0
  880. package/src/jobs.ts +270 -0
  881. package/src/listings.ts +64 -0
  882. package/src/manual.ts +26 -0
  883. package/src/product-approvals.ts +31 -0
  884. package/src/public.ts +24 -0
  885. package/src/ratings.ts +71 -0
  886. package/src/registry-updates.ts +54 -0
  887. package/src/registry.ts +101 -0
  888. package/src/review.ts +58 -0
  889. package/src/server.ts +186 -0
  890. package/src/views.ts +71 -0
  891. package/src/web/app.tsx +1026 -0
  892. package/src/web/favicon.svg +4 -0
  893. package/src/web/index.html +14 -0
  894. package/src/web/style.css +301 -0
  895. package/src/workspace.ts +97 -0
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
+ <rect x="18" y="18" width="38" height="38" rx="10" fill="#d4ff3a" opacity=".38" transform="rotate(-8 37 37)"/>
3
+ <rect x="8" y="8" width="40" height="40" rx="10" fill="#d4ff3a" transform="rotate(-8 28 28)"/>
4
+ </svg>
@@ -0,0 +1,14 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>dirpush</title>
7
+ <link rel="icon" href="./favicon.svg" type="image/svg+xml" />
8
+ <link rel="stylesheet" href="./style.css" />
9
+ </head>
10
+ <body>
11
+ <div id="root"></div>
12
+ <script type="module" src="./app.tsx"></script>
13
+ </body>
14
+ </html>
@@ -0,0 +1,301 @@
1
+ /* Warm monochrome, hairline borders, SF Pro throughout. System fonts only: this runs offline. */
2
+ :root {
3
+ color-scheme: light dark;
4
+ --canvas: #fbfbfa;
5
+ --surface: #ffffff;
6
+ --ink: #1f2124;
7
+ --ink-2: #4a4b4d;
8
+ --quiet: #787774;
9
+ --line: #eaeaea;
10
+ --line-2: #dededc;
11
+ --hover: #f4f4f2;
12
+ --button: #111111;
13
+ --button-ink: #ffffff;
14
+ --green-bg: #edf3ec; --green: #346538;
15
+ --blue-bg: #e1f3fe; --blue: #1f6c9f;
16
+ --yellow-bg: #fbf3db; --yellow: #956400;
17
+ --red-bg: #fdebec; --red: #9f2f2d;
18
+ --gray-bg: #f1f1ef; --gray: #5f5e5b;
19
+ --sans: "SF Pro Text", -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Segoe UI", sans-serif;
20
+ --display: "SF Pro Display", -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Segoe UI", sans-serif;
21
+ --mono: "SF Mono", ui-monospace, "JetBrains Mono", Menlo, monospace;
22
+ --ease: cubic-bezier(0.16, 1, 0.3, 1);
23
+ font: 14px/1.6 var(--sans);
24
+ }
25
+ @media (prefers-color-scheme: dark) {
26
+ :root {
27
+ --canvas: #191919;
28
+ --surface: #202020;
29
+ --ink: #ebebea;
30
+ --ink-2: #c5c5c3;
31
+ --quiet: #9b9a97;
32
+ --line: #2c2c2c;
33
+ --line-2: #373737;
34
+ --hover: #262626;
35
+ --button: #ebebea;
36
+ --button-ink: #191919;
37
+ --green-bg: #22301f; --green: #9bc59a;
38
+ --blue-bg: #1c2b36; --blue: #8cc4ec;
39
+ --yellow-bg: #332b17; --yellow: #e2bf6e;
40
+ --red-bg: #3a2223; --red: #ee9b97;
41
+ --gray-bg: #2a2a2a; --gray: #b4b3b0;
42
+ }
43
+ }
44
+
45
+ * { box-sizing: border-box; }
46
+ body { margin: 0; background: var(--canvas); color: var(--ink); -webkit-font-smoothing: antialiased; }
47
+ a { color: inherit; text-decoration: underline; text-decoration-color: var(--line-2); text-underline-offset: 3px; }
48
+ a:hover { text-decoration-color: currentColor; }
49
+ code, pre, .mono { font-family: var(--mono); font-size: 12px; }
50
+ code { background: var(--gray-bg); padding: 1px 5px; border-radius: 4px; }
51
+ h1, h2, h3 { margin: 0; font-weight: 600; text-wrap: balance; }
52
+ h1 { font: 600 30px/1.15 var(--display); letter-spacing: -0.025em; }
53
+ h2 { font-size: 13px; letter-spacing: 0.01em; }
54
+ h3 { font-size: 13px; margin: 28px 0 10px; }
55
+ p { margin: 0 0 8px; }
56
+ .quiet { color: var(--quiet); }
57
+ .small { font-size: 12px; }
58
+ .strong { font-weight: 600; }
59
+ .clip { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
60
+ .clip.short { max-width: 180px; }
61
+ td.wide { width: auto; }
62
+ td .stack { min-width: 0; }
63
+ .stack { display: flex; flex-direction: column; line-height: 1.35; }
64
+
65
+ /* ---- shell ---- */
66
+ .shell { display: grid; grid-template-columns: 232px 1fr; min-height: 100vh; }
67
+ .side { position: sticky; top: 0; height: 100vh; padding: 28px 18px; border-right: 1px solid var(--line); display: flex; flex-direction: column; gap: 18px; }
68
+ .brand { font: 700 17px/1 var(--display); letter-spacing: -0.02em; padding: 0 10px; }
69
+ .switch { margin: 0 2px; }
70
+ .switch.static { padding: 7px 10px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface); font-weight: 500; }
71
+ .side nav { display: flex; flex-direction: column; gap: 2px; }
72
+ .side nav a { display: flex; align-items: center; justify-content: space-between; padding: 7px 10px; border-radius: 6px; color: var(--ink-2); text-decoration: none; }
73
+ .side nav a:hover { background: var(--hover); color: var(--ink); }
74
+ .side nav a[aria-current="page"] { background: var(--surface); color: var(--ink); font-weight: 500; box-shadow: 0 0 0 1px var(--line); }
75
+ .count { font: 600 11px/1 var(--sans); background: var(--yellow-bg); color: var(--yellow); padding: 3px 7px; border-radius: 999px; font-variant-numeric: tabular-nums; }
76
+ .side-foot { margin-top: auto; padding: 0 10px; font-size: 12px; color: var(--quiet); line-height: 1.5; }
77
+ main { min-width: 0; }
78
+ .page { max-width: 1040px; margin: 0 auto; padding: 56px 48px 96px; animation: rise 500ms var(--ease) both; }
79
+ @keyframes rise { from { opacity: 0; transform: translateY(8px); } }
80
+
81
+ .head { display: flex; justify-content: space-between; align-items: flex-end; gap: 24px; margin-bottom: 36px; }
82
+ .lede { color: var(--quiet); margin: 10px 0 0; max-width: 62ch; }
83
+ .head-aside { flex: none; }
84
+
85
+ /* ---- controls ---- */
86
+ button, .button {
87
+ font: 500 13px/1 var(--sans); padding: 9px 14px; border-radius: 6px; border: 1px solid var(--button);
88
+ background: var(--button); color: var(--button-ink); cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; gap: 6px;
89
+ transition: transform 120ms var(--ease), opacity 120ms;
90
+ }
91
+ button:hover, .button:hover { opacity: 0.86; }
92
+ button:active, .button:active { transform: scale(0.98); }
93
+ button:disabled { opacity: 0.4; cursor: default; transform: none; }
94
+ button.ghost { background: transparent; color: var(--ink); border-color: var(--line-2); }
95
+ button.ghost:hover { background: var(--hover); opacity: 1; }
96
+ button.link { background: none; border: 0; padding: 0; color: inherit; font: inherit; text-decoration: underline; text-decoration-color: var(--line-2); text-underline-offset: 3px; }
97
+ button.link:hover { text-decoration-color: currentColor; opacity: 1; }
98
+ button.link.strong { font-weight: 600; text-decoration: none; }
99
+ input, select { font: 13px/1.2 var(--sans); color: var(--ink); background: var(--surface); border: 1px solid var(--line-2); border-radius: 6px; padding: 8px 10px; }
100
+ input:focus-visible, select:focus-visible, button:focus-visible, a:focus-visible, tr:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }
101
+ .actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
102
+ .actions.tight { margin-top: 0; }
103
+ .card.add { margin-bottom: 20px; }
104
+ .card.add h2 { margin-bottom: 4px; }
105
+ .manual { margin: 0 0 18px; }
106
+ .manual summary { cursor: pointer; }
107
+ .answer { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
108
+ .answer input { flex: 1; min-width: 220px; }
109
+
110
+ /* ---- tags ---- */
111
+ .tag { display: inline-block; font: 600 10.5px/1 var(--sans); letter-spacing: 0.05em; text-transform: uppercase; padding: 4px 8px; border-radius: 999px; white-space: nowrap; }
112
+ .tag.green { background: var(--green-bg); color: var(--green); }
113
+ .tag.blue { background: var(--blue-bg); color: var(--blue); }
114
+ .tag.yellow { background: var(--yellow-bg); color: var(--yellow); }
115
+ .tag.red { background: var(--red-bg); color: var(--red); }
116
+ .tag.gray { background: var(--gray-bg); color: var(--gray); }
117
+
118
+ /* ---- overview ---- */
119
+ .stats { display: grid; grid-template-columns: repeat(4, 1fr); border: 1px solid var(--line); border-radius: 12px; background: var(--surface); margin-bottom: 20px; }
120
+ .stat { padding: 22px 24px; text-decoration: none; display: flex; flex-direction: column; gap: 4px; transition: background 160ms; }
121
+ .stat + .stat { border-left: 1px solid var(--line); }
122
+ .stat:hover { background: var(--hover); }
123
+ .stat:first-child { border-radius: 12px 0 0 12px; }
124
+ .stat:last-child { border-radius: 0 12px 12px 0; }
125
+ .stat-n { font: 600 34px/1 var(--display); letter-spacing: -0.03em; font-variant-numeric: tabular-nums; }
126
+ .stat-n.green { color: var(--green); }
127
+ .stat-n.yellow { color: var(--yellow); }
128
+ .stat-label { color: var(--quiet); font-size: 13px; }
129
+ .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; align-items: start; }
130
+ .gap-top { margin-top: 20px; }
131
+ .gap-top .facts div { grid-template-columns: 140px 1fr; }
132
+ .card { background: var(--surface); border: 1px solid var(--line); border-radius: 12px; padding: 24px 26px; min-width: 0; }
133
+ .card h2 { margin-bottom: 14px; }
134
+ .card .block-head h2 { margin-bottom: 0; }
135
+ .big-line { display: flex; align-items: baseline; gap: 12px; margin-bottom: 12px; }
136
+ .big-line strong { font: 600 20px/1 var(--display); letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
137
+ .big-line .dr { font-size: 34px; letter-spacing: -0.03em; }
138
+ .up { color: var(--green); font-weight: 500; }
139
+ .down { color: var(--red); font-weight: 500; }
140
+ .bar { height: 6px; background: var(--gray-bg); border-radius: 999px; overflow: hidden; margin: 4px 0 12px; }
141
+ .bar span { display: block; height: 100%; background: var(--ink); border-radius: 999px; transition: width 600ms var(--ease); }
142
+ .chart { width: 100%; height: auto; display: block; margin: 4px 0 10px; overflow: visible; }
143
+ .chart .grid { stroke: var(--line); stroke-width: 1; }
144
+ .chart .axis { fill: var(--quiet); font: 10px var(--sans); font-variant-numeric: tabular-nums; }
145
+ .chart .line { stroke: var(--ink); stroke-width: 1.75; stroke-linecap: round; }
146
+ .chart .line.dotted { stroke: var(--quiet); stroke-dasharray: 2 4; }
147
+ .chart .point { fill: var(--surface); stroke: var(--ink); stroke-width: 1.5; }
148
+
149
+ .block { margin-top: 48px; }
150
+ .block-head { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 12px; }
151
+ .block > h2 { margin-bottom: 12px; }
152
+ .note { margin: -4px 0 14px; max-width: 70ch; }
153
+ .gap { margin-top: 32px; margin-bottom: 8px; }
154
+
155
+ .list { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); }
156
+ .list li { border-bottom: 1px solid var(--line); }
157
+ .row-button { width: 100%; display: grid; grid-template-columns: 180px 1fr auto; gap: 16px; align-items: center; padding: 12px 4px; background: none; border: 0; border-radius: 0; color: var(--ink); text-align: left; font-weight: 400; }
158
+ .row-button:hover { background: var(--hover); opacity: 1; }
159
+ .row-title { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
160
+ .row-text { color: var(--quiet); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
161
+
162
+ .feed { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); }
163
+ .feed li { display: grid; grid-template-columns: 80px 180px 1fr; gap: 16px; padding: 10px 4px; border-bottom: 1px solid var(--line); align-items: baseline; min-width: 0; }
164
+ .feed .link { text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
165
+
166
+ /* ---- needs you ---- */
167
+ .items { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
168
+ .item { background: var(--surface); border: 1px solid var(--line); border-radius: 10px; padding: 18px 20px; transition: box-shadow 200ms; }
169
+ .item:hover { box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); }
170
+ .item-head { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; margin-bottom: 6px; }
171
+ .item-head > .quiet { white-space: nowrap; }
172
+ .todo { display: grid; grid-template-columns: 1fr auto; gap: 4px 20px; align-items: center; padding: 14px 4px; border-bottom: 1px solid var(--line); }
173
+ .todo p { margin: 0; color: var(--ink-2); }
174
+ .todo a { grid-column: 1; font-size: 12px; color: var(--quiet); }
175
+ .todo button { grid-column: 2; grid-row: 1 / span 2; }
176
+ .items:has(.todo) { gap: 0; border-top: 1px solid var(--line); }
177
+ .item p { color: var(--ink-2); max-width: 78ch; overflow-wrap: anywhere; }
178
+ .fold { margin-top: 48px; border-top: 1px solid var(--line); padding-top: 16px; }
179
+ .fold summary { cursor: pointer; font-weight: 600; font-size: 13px; list-style: none; }
180
+ .fold summary::before { content: "+"; display: inline-block; width: 16px; color: var(--quiet); }
181
+ .fold[open] summary::before { content: "−"; }
182
+ .fold .items { margin-top: 14px; }
183
+
184
+ /* ---- notices ---- */
185
+ .notice { border-radius: 10px; padding: 16px 18px; margin-bottom: 20px; border: 1px solid var(--line); background: var(--surface); }
186
+ .notice.green { background: var(--green-bg); border-color: transparent; }
187
+ .notice.blue { background: var(--blue-bg); border-color: transparent; }
188
+ .notice.yellow { background: var(--yellow-bg); border-color: transparent; }
189
+ .notice.red { background: var(--red-bg); border-color: transparent; }
190
+ .notice p { overflow-wrap: anywhere; }
191
+ .diff { margin: 10px 0 0; display: grid; gap: 6px; }
192
+ .diff div { display: grid; grid-template-columns: 90px 1fr; gap: 12px; }
193
+ .diff dt { color: var(--quiet); }
194
+ .diff dd { margin: 0; font-family: var(--mono); font-size: 12px; overflow-wrap: anywhere; }
195
+
196
+ /* ---- table ---- */
197
+ .table { background: var(--surface); border: 1px solid var(--line); border-radius: 12px; overflow: hidden; }
198
+ .toolbar { display: flex; gap: 10px; align-items: center; padding: 14px 16px; border-bottom: 1px solid var(--line); }
199
+ .toolbar input[type="search"] { width: 280px; }
200
+ .count-label { margin-left: auto; font-variant-numeric: tabular-nums; }
201
+ .chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 12px 16px; border-bottom: 1px solid var(--line); }
202
+ .chip { background: transparent; color: var(--ink-2); border: 1px solid var(--line-2); border-radius: 6px; padding: 6px 10px; font-weight: 500; font-size: 12px; }
203
+ .chip span { color: var(--quiet); font-variant-numeric: tabular-nums; margin-left: 2px; }
204
+ .chip:hover { background: var(--hover); opacity: 1; }
205
+ .chip[aria-pressed="true"] { background: var(--button); color: var(--button-ink); border-color: var(--button); }
206
+ .chip[aria-pressed="true"] span { color: inherit; opacity: 0.7; }
207
+ .scroll { overflow-x: auto; }
208
+ table { width: 100%; border-collapse: collapse; }
209
+ th { text-align: left; padding: 0; border-bottom: 1px solid var(--line); background: var(--canvas); }
210
+ .sort { width: 100%; background: none; border: 0; color: var(--quiet); font: 500 12px/1 var(--sans); padding: 11px 16px; justify-content: flex-start; border-radius: 0; }
211
+ .sort:hover { color: var(--ink); opacity: 1; }
212
+ td { padding: 11px 16px; border-bottom: 1px solid var(--line); vertical-align: middle; max-width: 0; white-space: nowrap; }
213
+ td:not(.wide) { width: 1%; max-width: none; }
214
+ tr:last-child td { border-bottom: 0; }
215
+ tr.clickable { cursor: pointer; }
216
+ tr.clickable:hover td { background: var(--hover); }
217
+ th.num, td.num { text-align: right; }
218
+ th.num .sort { justify-content: flex-end; }
219
+ .more { margin: 12px 16px; }
220
+ .pad { padding: 24px 16px; }
221
+
222
+ /* ---- facts, lists, media ---- */
223
+ .facts { margin: 0; display: grid; gap: 10px; }
224
+ .facts div { display: grid; grid-template-columns: 110px 1fr; gap: 14px; }
225
+ .facts dt { color: var(--quiet); }
226
+ .facts dt::first-letter { text-transform: uppercase; }
227
+ .facts dd { margin: 0; overflow-wrap: anywhere; }
228
+ .plain { margin: 0; padding-left: 18px; color: var(--ink-2); }
229
+ .plain li { margin: 4px 0; }
230
+ .perms { list-style: none; margin: 10px 0 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 0 24px; }
231
+ .perms li { display: flex; justify-content: space-between; align-items: center; padding: 8px 0; border-bottom: 1px solid var(--line); gap: 12px; }
232
+ .perms code { background: none; padding: 0; }
233
+ .shots { list-style: none; margin: 12px 0 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; }
234
+ .shots img { width: 100%; aspect-ratio: 16 / 10; object-fit: cover; border-radius: 8px; border: 1px solid var(--line); display: block; }
235
+ .shots span { display: block; font-size: 12px; color: var(--quiet); margin-top: 6px; }
236
+ .fields { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); }
237
+ .fields li { display: flex; justify-content: space-between; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--line); }
238
+ .playbook { white-space: pre-wrap; font-size: 13px; color: var(--ink-2); background: var(--canvas); border: 1px solid var(--line); border-radius: 8px; padding: 14px 16px; max-height: 360px; overflow: auto; }
239
+
240
+ /* ---- side panel ---- */
241
+ .backdrop { position: fixed; inset: 0; background: rgba(15, 15, 15, 0.18); animation: fade 200ms both; }
242
+ .panel { position: fixed; top: 0; right: 0; bottom: 0; width: min(560px, 100vw); background: var(--surface); border-left: 1px solid var(--line); padding: 28px 30px 48px; overflow-y: auto; animation: slide 320ms var(--ease) both; }
243
+ .panel-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; margin-bottom: 18px; }
244
+ .panel-head h2 { font: 600 22px/1.2 var(--display); letter-spacing: -0.02em; margin-bottom: 4px; }
245
+ .links { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin-bottom: 18px; }
246
+ .timeline section + section { margin-top: 16px; }
247
+ .timeline h4 { margin: 0 0 6px; font-size: 12px; font-weight: 600; color: var(--quiet); }
248
+ .timeline ol { list-style: none; margin: 0; padding: 0; border-left: 1px solid var(--line-2); }
249
+ .timeline li { display: grid; grid-template-columns: 52px 1fr; gap: 12px; padding: 5px 0 5px 16px; position: relative; overflow-wrap: anywhere; color: var(--ink-2); }
250
+ .timeline li::before { content: ""; position: absolute; left: -3.5px; top: 13px; width: 6px; height: 6px; border-radius: 50%; background: var(--line-2); }
251
+ .timeline li.you { color: var(--ink); }
252
+ .timeline li.you::before { background: var(--ink); }
253
+ .timeline time { font-variant-numeric: tabular-nums; padding-top: 1px; }
254
+ .raw { margin-top: 24px; }
255
+ .raw pre { background: var(--canvas); border: 1px solid var(--line); border-radius: 8px; padding: 12px; max-height: 320px; overflow: auto; }
256
+ @keyframes fade { from { opacity: 0; } }
257
+ @keyframes slide { from { transform: translateX(24px); opacity: 0; } }
258
+
259
+ @media (max-width: 900px) {
260
+ .shell { grid-template-columns: 1fr; }
261
+ .side { position: static; height: auto; flex-direction: row; flex-wrap: wrap; align-items: center; padding: 14px 16px; border-right: 0; border-bottom: 1px solid var(--line); }
262
+ .side nav { flex-direction: row; flex-wrap: wrap; }
263
+ .side-foot { display: none; }
264
+ .page { padding: 32px 18px 64px; }
265
+ .stats, .grid-2 { grid-template-columns: 1fr 1fr; }
266
+ .grid-2 { grid-template-columns: 1fr; }
267
+ .head { flex-direction: column; align-items: flex-start; }
268
+ .feed li { grid-template-columns: 64px 1fr; }
269
+ .feed li > :last-child { grid-column: 2; }
270
+ }
271
+ @media (prefers-reduced-motion: reduce) {
272
+ *, *::before, *::after { animation: none !important; transition: none !important; }
273
+ }
274
+ .facts.gap-top { margin-top: 22px; }
275
+ .grid-2.stretch { align-items: stretch; }
276
+ .segments { display: flex; gap: 3px; height: 8px; margin: 6px 0 18px; }
277
+ .segments span { border-radius: 2px; min-width: 3px; }
278
+ .segments .green, .dot.green { background: var(--green); }
279
+ .segments .blue, .dot.blue { background: var(--blue); }
280
+ .segments .yellow, .dot.yellow { background: var(--yellow); }
281
+ .segments .gray, .dot.gray { background: var(--quiet); }
282
+ .segments .faint, .dot.faint { background: var(--line-2); }
283
+ .legend { list-style: none; margin: 0 0 14px; padding: 0; border-top: 1px solid var(--line); }
284
+ .legend li { border-bottom: 1px solid var(--line); }
285
+ .legend a { display: flex; align-items: center; gap: 10px; padding: 7px 0; text-decoration: none; color: var(--ink-2); }
286
+ .legend a:hover { color: var(--ink); }
287
+ .dot { width: 8px; height: 8px; border-radius: 2px; flex: none; }
288
+ .legend-n { margin-left: auto; font-variant-numeric: tabular-nums; color: var(--ink); font-weight: 500; }
289
+
290
+ /* Selects: native control, custom face. The chevron is two gradient strokes, so it follows the theme. */
291
+ select {
292
+ appearance: none; -webkit-appearance: none; cursor: pointer;
293
+ padding-right: 30px; min-height: 34px; line-height: 1.2;
294
+ background-image: linear-gradient(45deg, transparent 50%, var(--quiet) 50%), linear-gradient(135deg, var(--quiet) 50%, transparent 50%);
295
+ background-position: calc(100% - 15px) 50%, calc(100% - 10px) 50%;
296
+ background-size: 5px 5px, 5px 5px; background-repeat: no-repeat;
297
+ transition: border-color 0.15s, box-shadow 0.15s;
298
+ }
299
+ select:hover { border-color: var(--quiet); }
300
+ select:focus-visible { outline: none; border-color: var(--blue); box-shadow: 0 0 0 3px var(--blue-bg); }
301
+ select option { background: var(--surface); color: var(--ink); }
@@ -0,0 +1,97 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { z } from "zod";
4
+ import { HOME } from "./db";
5
+
6
+ export const WORKSPACE = process.env.LAUNCH_WORKSPACE ?? join(HOME, "workspace");
7
+ export const PRODUCTS = join(WORKSPACE, "products");
8
+
9
+ // The product id is its directory name: workspace/products/<id>/product.yaml
10
+ export const Product = z.object({
11
+ name: z.string(),
12
+ version: z.string().optional(),
13
+ release_url: z.url().optional(),
14
+ url: z.url(),
15
+ tagline: z.string(),
16
+ descriptions: z.object({ short: z.string(), medium: z.string().optional(), long: z.string().optional() }),
17
+ categories: z.array(z.string()).default([]),
18
+ features: z.array(z.string()).default([]),
19
+ pricing: z.object({ free_plan: z.boolean(), notes: z.string().optional() }),
20
+ social: z.record(z.string(), z.string().nullable()).default({}),
21
+ // Facts forms often ask for (country, launch date/status, tech stack).
22
+ country: z.string().nullish(),
23
+ city: z.string().nullish(),
24
+ launched: z.string().nullish(), // YYYY-MM or YYYY-MM-DD
25
+ status: z.enum(["idea", "beta", "launched"]).optional(),
26
+ tech_stack: z.array(z.string()).default([]),
27
+ // Standing answers to questions directories keep asking.
28
+ replaces: z.array(z.string()).default([]), // well-known products this replaces ("alternative to …")
29
+ company_stage: z.string().nullish(), // free text; map to the form's closest option
30
+ funding: z.string().nullish(),
31
+ username: z.string().nullish(), // default handle when a site needs a permanent username
32
+ listing_rules: z.array(z.string()).default([]), // e.g. "title is always the product name"
33
+ assets: z.object({ logo: z.string().optional(), icon: z.string().optional() }).default({}),
34
+ screenshots: z
35
+ .array(z.object({ id: z.string(), path: z.string(), description: z.string(), priority: z.number().default(0) }))
36
+ .default([]),
37
+ });
38
+ export type Product = z.infer<typeof Product> & { id: string; dir: string };
39
+
40
+ export const Identity = z.object({
41
+ display_name: z.string(),
42
+ username: z.string(),
43
+ email: z.email(),
44
+ company: z.string().optional(),
45
+ role: z.string().optional(),
46
+ });
47
+
48
+ const Mode = z.enum(["automatic", "confirm", "never"]);
49
+ export const Permissions = z.record(z.string(), z.record(z.string(), Mode));
50
+ export type Mode = z.infer<typeof Mode>;
51
+
52
+ async function load<T extends z.ZodType>(path: string, schema: T): Promise<z.infer<T>> {
53
+ if (!existsSync(path)) throw new Error(`missing ${path} — run 'dirpush init <product-id>' and fill it in`);
54
+ return schema.parse(Bun.YAML.parse(await Bun.file(path).text()));
55
+ }
56
+
57
+ export const productIds = () =>
58
+ existsSync(PRODUCTS) ? readdirSync(PRODUCTS).filter((d) => existsSync(join(PRODUCTS, d, "product.yaml"))).sort() : [];
59
+
60
+ /** Explicit id, else LAUNCH_PRODUCT, else the only product. */
61
+ export function resolveProductId(id = process.env.LAUNCH_PRODUCT) {
62
+ if (id) {
63
+ if (!productIds().includes(id)) throw new Error(`no product '${id}' (have: ${productIds().join(", ") || "none"})`);
64
+ return id;
65
+ }
66
+ const ids = productIds();
67
+ if (ids.length === 1) return ids[0]!;
68
+ throw new Error(ids.length ? `several products (${ids.join(", ")}): pass --product <id> or set LAUNCH_PRODUCT` : "no products yet: run 'dirpush init <product-id>'");
69
+ }
70
+
71
+ export async function loadProduct(id?: string): Promise<Product> {
72
+ const pid = resolveProductId(id);
73
+ const dir = join(PRODUCTS, pid);
74
+ return { ...(await load(join(dir, "product.yaml"), Product)), id: pid, dir };
75
+ }
76
+
77
+ /** Per-product file if present, else the shared workspace one. */
78
+ const shared = (file: string, id?: string) => {
79
+ const own = id && join(PRODUCTS, id, file);
80
+ return own && existsSync(own) ? own : join(WORKSPACE, file);
81
+ };
82
+ export const loadIdentity = (id?: string) => load(shared("identity.yaml", id), Identity);
83
+ export const loadPermissions = (id?: string) => load(shared("permissions.yaml", id), Permissions);
84
+
85
+ /** `accounts.create` -> automatic|confirm|never. Unlisted actions require confirmation. */
86
+ export async function permission(action: string, productId?: string): Promise<Mode> {
87
+ const [group, key] = action.split(".");
88
+ const perms = await loadPermissions(productId);
89
+ return perms[group!]?.[key!] ?? "confirm";
90
+ }
91
+
92
+ export function utm(productUrl: string, directoryId: string) {
93
+ const u = new URL(productUrl);
94
+ u.searchParams.set("utm_source", directoryId);
95
+ u.searchParams.set("utm_medium", "directory");
96
+ return u.toString();
97
+ }