dirpush 0.0.0-stage → 0.1.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.
- package/.agents/skills/dirpush/SKILL.md +92 -0
- package/.agents/skills/dirpush/references/assets.md +48 -0
- package/.agents/skills/dirpush/references/authentication.md +59 -0
- package/.agents/skills/dirpush/references/recovery.md +34 -0
- package/.agents/skills/dirpush/references/submissions.md +43 -0
- package/LICENSE +21 -0
- package/README.md +66 -2
- package/THIRD_PARTY_NOTICES.md +10 -0
- package/bin/dirpush.cjs +13 -0
- package/drizzle/0000_init.sql +59 -0
- package/drizzle/0001_jazzy_masked_marvel.sql +9 -0
- package/drizzle/0002_loose_may_parker.sql +9 -0
- package/drizzle/0003_modern_lilandra.sql +6 -0
- package/drizzle/0004_deep_master_chief.sql +11 -0
- package/drizzle/meta/0000_snapshot.json +404 -0
- package/drizzle/meta/0001_snapshot.json +466 -0
- package/drizzle/meta/0002_snapshot.json +527 -0
- package/drizzle/meta/0003_snapshot.json +566 -0
- package/drizzle/meta/0004_snapshot.json +642 -0
- package/drizzle/meta/_journal.json +41 -0
- package/examples/workspace/identity.yaml +6 -0
- package/examples/workspace/permissions.yaml +29 -0
- package/examples/workspace/product.yaml +29 -0
- package/package.json +76 -4
- package/registry/LICENSE +396 -0
- package/registry/directories/1000-tools/directory.yaml +55 -0
- package/registry/directories/1000-tools/playbook.md +5 -0
- package/registry/directories/10015-io/directory.yaml +66 -0
- package/registry/directories/10015-io/playbook.md +9 -0
- package/registry/directories/10words/directory.yaml +53 -0
- package/registry/directories/10words/playbook.md +8 -0
- package/registry/directories/600-tools/directory.yaml +48 -0
- package/registry/directories/600-tools/playbook.md +1 -0
- package/registry/directories/a1bookmarks/directory.yaml +42 -0
- package/registry/directories/aback-launch/directory.yaml +54 -0
- package/registry/directories/aback-launch/playbook.md +1 -0
- package/registry/directories/acid-tools/directory.yaml +51 -0
- package/registry/directories/acid-tools/playbook.md +8 -0
- package/registry/directories/agenthunter/directory.yaml +53 -0
- package/registry/directories/ai-agents-directory/directory.yaml +49 -0
- package/registry/directories/ai-agents-directory/playbook.md +6 -0
- package/registry/directories/ai-agents-list/directory.yaml +46 -0
- package/registry/directories/ai-agents-list/playbook.md +1 -0
- package/registry/directories/ai-agents-listing/directory.yaml +76 -0
- package/registry/directories/ai-directories/directory.yaml +45 -0
- package/registry/directories/ai-directories/playbook.md +7 -0
- package/registry/directories/ai-dust/directory.yaml +68 -0
- package/registry/directories/ai-dust/playbook.md +1 -0
- package/registry/directories/ai-nav/directory.yaml +54 -0
- package/registry/directories/ai-nav/playbook.md +1 -0
- package/registry/directories/ai-respo/directory.yaml +43 -0
- package/registry/directories/ai-respo/playbook.md +1 -0
- package/registry/directories/ai-superhub/directory.yaml +65 -0
- package/registry/directories/ai-tool-list/directory.yaml +44 -0
- package/registry/directories/ai-tool-list/playbook.md +1 -0
- package/registry/directories/ai-tool-saver/directory.yaml +52 -0
- package/registry/directories/ai-tool-saver/playbook.md +1 -0
- package/registry/directories/ai-toolex/directory.yaml +46 -0
- package/registry/directories/ai-toolex/playbook.md +1 -0
- package/registry/directories/ai-toolz-dir/directory.yaml +60 -0
- package/registry/directories/ai-website-directory/directory.yaml +66 -0
- package/registry/directories/ai-website-directory/playbook.md +1 -0
- package/registry/directories/ai-x-collection/directory.yaml +45 -0
- package/registry/directories/ai-x-collection/playbook.md +1 -0
- package/registry/directories/aiagentstore/directory.yaml +52 -0
- package/registry/directories/aiagentstore/playbook.md +1 -0
- package/registry/directories/aidirs-best/directory.yaml +46 -0
- package/registry/directories/aifindy/directory.yaml +44 -0
- package/registry/directories/aifindy/playbook.md +1 -0
- package/registry/directories/aihubs/directory.yaml +44 -0
- package/registry/directories/aihubs/playbook.md +5 -0
- package/registry/directories/aihuntlist/directory.yaml +43 -0
- package/registry/directories/aihuntlist/playbook.md +6 -0
- package/registry/directories/aihustle/directory.yaml +51 -0
- package/registry/directories/aihustle/playbook.md +5 -0
- package/registry/directories/ailaunch-space/directory.yaml +44 -0
- package/registry/directories/ailaunch-space/playbook.md +6 -0
- package/registry/directories/ailib/directory.yaml +64 -0
- package/registry/directories/ailib/playbook.md +1 -0
- package/registry/directories/aimatch-pro/directory.yaml +42 -0
- package/registry/directories/aimatch-pro/playbook.md +1 -0
- package/registry/directories/ainave/directory.yaml +71 -0
- package/registry/directories/ainave/playbook.md +10 -0
- package/registry/directories/aitechviral/directory.yaml +47 -0
- package/registry/directories/aitechviral/playbook.md +10 -0
- package/registry/directories/aitogrow/directory.yaml +52 -0
- package/registry/directories/aitogrow/playbook.md +6 -0
- package/registry/directories/aitoolhunt/directory.yaml +43 -0
- package/registry/directories/aitoolhunt/playbook.md +5 -0
- package/registry/directories/aitools-fyi/directory.yaml +52 -0
- package/registry/directories/aitools-inc/directory.yaml +48 -0
- package/registry/directories/aitools-inc/playbook.md +1 -0
- package/registry/directories/aitoolsdirectory/directory.yaml +73 -0
- package/registry/directories/aitoolsdirectory/playbook.md +8 -0
- package/registry/directories/aitoolshunt/directory.yaml +64 -0
- package/registry/directories/aitoolshunt/playbook.md +6 -0
- package/registry/directories/aitoolslist/directory.yaml +59 -0
- package/registry/directories/aitoolslist/playbook.md +6 -0
- package/registry/directories/aitoolsmagazine/directory.yaml +46 -0
- package/registry/directories/aitoolsmagazine/playbook.md +5 -0
- package/registry/directories/aitoolsmarketer/directory.yaml +56 -0
- package/registry/directories/aitoolsmarketer/playbook.md +7 -0
- package/registry/directories/aitooltrek/directory.yaml +47 -0
- package/registry/directories/aitooltrek/playbook.md +6 -0
- package/registry/directories/aitop10-tools/directory.yaml +44 -0
- package/registry/directories/aitop10-tools/playbook.md +5 -0
- package/registry/directories/aitoptools/directory.yaml +74 -0
- package/registry/directories/aitoptools/playbook.md +1 -0
- package/registry/directories/aiwithme/directory.yaml +54 -0
- package/registry/directories/aiwithme/playbook.md +10 -0
- package/registry/directories/all-in-ai-tools/directory.yaml +51 -0
- package/registry/directories/all-in-ai-tools/playbook.md +1 -0
- package/registry/directories/allmcps/directory.yaml +55 -0
- package/registry/directories/allmcps/playbook.md +7 -0
- package/registry/directories/alltopstartups/directory.yaml +43 -0
- package/registry/directories/altern-ai/directory.yaml +50 -0
- package/registry/directories/altern-ai/playbook.md +6 -0
- package/registry/directories/alternative-tools/directory.yaml +46 -0
- package/registry/directories/alternative-tools/playbook.md +4 -0
- package/registry/directories/alternativeto/directory.yaml +48 -0
- package/registry/directories/alternativeto/playbook.md +8 -0
- package/registry/directories/ant-directory/directory.yaml +52 -0
- package/registry/directories/ant-directory/playbook.md +1 -0
- package/registry/directories/app-scout/directory.yaml +60 -0
- package/registry/directories/app-scout/playbook.md +5 -0
- package/registry/directories/app-stack-builder/directory.yaml +71 -0
- package/registry/directories/appalist/directory.yaml +46 -0
- package/registry/directories/appalist/playbook.md +4 -0
- package/registry/directories/apprater/directory.yaml +65 -0
- package/registry/directories/apprater/playbook.md +1 -0
- package/registry/directories/appsumo/directory.yaml +45 -0
- package/registry/directories/appsumo/playbook.md +1 -0
- package/registry/directories/ask-ai-for-it/directory.yaml +45 -0
- package/registry/directories/ask-ai-for-it/playbook.md +1 -0
- package/registry/directories/auraplusplus/directory.yaml +56 -0
- package/registry/directories/auraplusplus/playbook.md +6 -0
- package/registry/directories/awesome-mcp-list/directory.yaml +45 -0
- package/registry/directories/awesome-mcp-list/playbook.md +7 -0
- package/registry/directories/awesome-mcp-lists/directory.yaml +44 -0
- package/registry/directories/awesome-mcp-lists/playbook.md +6 -0
- package/registry/directories/awesome-remote-mcp-servers/directory.yaml +46 -0
- package/registry/directories/awesome-remote-mcp-servers/playbook.md +8 -0
- package/registry/directories/awesome-tools/directory.yaml +55 -0
- package/registry/directories/awesome-tools/playbook.md +8 -0
- package/registry/directories/awesomeindie/directory.yaml +51 -0
- package/registry/directories/awesomeindie/playbook.md +7 -0
- package/registry/directories/axis-launch/directory.yaml +64 -0
- package/registry/directories/b2b-saas-market/directory.yaml +63 -0
- package/registry/directories/bai-tools/directory.yaml +53 -0
- package/registry/directories/bai-tools/playbook.md +7 -0
- package/registry/directories/basedtools/directory.yaml +59 -0
- package/registry/directories/basedtools/playbook.md +1 -0
- package/registry/directories/best-ai-org/directory.yaml +53 -0
- package/registry/directories/best-ai-org/playbook.md +1 -0
- package/registry/directories/best-of-ai/directory.yaml +57 -0
- package/registry/directories/best-of-ai/playbook.md +1 -0
- package/registry/directories/bestaito/directory.yaml +47 -0
- package/registry/directories/bestaito/playbook.md +6 -0
- package/registry/directories/bestofai/directory.yaml +45 -0
- package/registry/directories/bestofai/playbook.md +7 -0
- package/registry/directories/bestsky-tools/directory.yaml +44 -0
- package/registry/directories/bestsky-tools/playbook.md +5 -0
- package/registry/directories/betabound/directory.yaml +63 -0
- package/registry/directories/betabound/playbook.md +7 -0
- package/registry/directories/betalist/directory.yaml +52 -0
- package/registry/directories/betalist/playbook.md +11 -0
- package/registry/directories/betterbuys/directory.yaml +55 -0
- package/registry/directories/betterbuys/playbook.md +7 -0
- package/registry/directories/betterlaunch/directory.yaml +53 -0
- package/registry/directories/beyond-ai-tools/directory.yaml +43 -0
- package/registry/directories/beyond-ai-tools/playbook.md +1 -0
- package/registry/directories/billion-dollar-pitch-decks/directory.yaml +64 -0
- package/registry/directories/billion-dollar-pitch-decks/playbook.md +4 -0
- package/registry/directories/browserextension-dev/directory.yaml +55 -0
- package/registry/directories/browserextension-dev/playbook.md +7 -0
- package/registry/directories/bsdirectory/directory.yaml +68 -0
- package/registry/directories/bsdirectory/playbook.md +5 -0
- package/registry/directories/buildvoyage/directory.yaml +64 -0
- package/registry/directories/buildvoyage/playbook.md +1 -0
- package/registry/directories/built-here/directory.yaml +50 -0
- package/registry/directories/built-here/playbook.md +6 -0
- package/registry/directories/builtbyme/directory.yaml +55 -0
- package/registry/directories/builtbyme/playbook.md +7 -0
- package/registry/directories/builtineu/directory.yaml +70 -0
- package/registry/directories/builtineu/playbook.md +7 -0
- package/registry/directories/businesssoftware/directory.yaml +42 -0
- package/registry/directories/buy-sell-startups/directory.yaml +52 -0
- package/registry/directories/buy-sell-startups/playbook.md +5 -0
- package/registry/directories/claude-mcp-directory/directory.yaml +45 -0
- package/registry/directories/claude-mcp-directory/playbook.md +7 -0
- package/registry/directories/claude-plugin-directory/directory.yaml +48 -0
- package/registry/directories/claude-plugin-directory/playbook.md +7 -0
- package/registry/directories/cocoon-ai/directory.yaml +57 -0
- package/registry/directories/codehype/directory.yaml +68 -0
- package/registry/directories/codehype/playbook.md +7 -0
- package/registry/directories/collectai/directory.yaml +43 -0
- package/registry/directories/collectai/playbook.md +5 -0
- package/registry/directories/commune-launchpad/directory.yaml +51 -0
- package/registry/directories/confettisaas/directory.yaml +51 -0
- package/registry/directories/confettisaas/playbook.md +1 -0
- package/registry/directories/crowdstax/directory.yaml +54 -0
- package/registry/directories/crowdstax/playbook.md +6 -0
- package/registry/directories/crozdesk/directory.yaml +72 -0
- package/registry/directories/crozdesk/playbook.md +8 -0
- package/registry/directories/crypto-tools-directory/directory.yaml +60 -0
- package/registry/directories/crypto-tools-directory/playbook.md +6 -0
- package/registry/directories/ctrlaltship/directory.yaml +92 -0
- package/registry/directories/ctrlaltship/playbook.md +6 -0
- package/registry/directories/dachstartups/directory.yaml +49 -0
- package/registry/directories/dachstartups/playbook.md +4 -0
- package/registry/directories/dailypings/directory.yaml +51 -0
- package/registry/directories/dailypings/playbook.md +6 -0
- package/registry/directories/dang-ai/directory.yaml +44 -0
- package/registry/directories/dang-ai/playbook.md +1 -0
- package/registry/directories/daniellaunches/directory.yaml +47 -0
- package/registry/directories/daniellaunches/playbook.md +6 -0
- package/registry/directories/datalook/directory.yaml +60 -0
- package/registry/directories/dayslaunch/directory.yaml +46 -0
- package/registry/directories/dayslaunch/playbook.md +5 -0
- package/registry/directories/deeplaunch/directory.yaml +46 -0
- package/registry/directories/deeplaunch/playbook.md +6 -0
- package/registry/directories/desifounder-spotlight/directory.yaml +49 -0
- package/registry/directories/desifounder-spotlight/playbook.md +1 -0
- package/registry/directories/developers-digest-mcp/directory.yaml +46 -0
- package/registry/directories/developers-digest-mcp/playbook.md +7 -0
- package/registry/directories/devhunt/directory.yaml +53 -0
- package/registry/directories/devhunt/playbook.md +8 -0
- package/registry/directories/devpages/directory.yaml +62 -0
- package/registry/directories/devpages/playbook.md +7 -0
- package/registry/directories/devresourc-es/directory.yaml +49 -0
- package/registry/directories/devresourc-es/playbook.md +9 -0
- package/registry/directories/devtools-directory/directory.yaml +63 -0
- package/registry/directories/devtools-directory/playbook.md +7 -0
- package/registry/directories/dir-hub/directory.yaml +62 -0
- package/registry/directories/dir-hub/playbook.md +6 -0
- package/registry/directories/direct2app/directory.yaml +47 -0
- package/registry/directories/direct2app/playbook.md +5 -0
- package/registry/directories/directree/directory.yaml +56 -0
- package/registry/directories/directree/playbook.md +7 -0
- package/registry/directories/dirs-cc/directory.yaml +49 -0
- package/registry/directories/dirs-cc/playbook.md +1 -0
- package/registry/directories/dododirectory/directory.yaml +46 -0
- package/registry/directories/dododirectory/playbook.md +6 -0
- package/registry/directories/dofollowtools/directory.yaml +75 -0
- package/registry/directories/dofollowtools/playbook.md +7 -0
- package/registry/directories/dropyourai/directory.yaml +73 -0
- package/registry/directories/dynamite-ai/directory.yaml +59 -0
- package/registry/directories/dynamite-ai/playbook.md +1 -0
- package/registry/directories/earlyhunt/directory.yaml +44 -0
- package/registry/directories/earlyhunt/playbook.md +6 -0
- package/registry/directories/ebool/directory.yaml +72 -0
- package/registry/directories/ebool/playbook.md +8 -0
- package/registry/directories/eliteai-tools/directory.yaml +45 -0
- package/registry/directories/eliteai-tools/playbook.md +1 -0
- package/registry/directories/emoji-launch/directory.yaml +60 -0
- package/registry/directories/emoji-launch/playbook.md +1 -0
- package/registry/directories/enlisted/directory.yaml +48 -0
- package/registry/directories/enlisted/playbook.md +7 -0
- package/registry/directories/eu-software-alternatives/directory.yaml +87 -0
- package/registry/directories/eu-software-alternatives/playbook.md +5 -0
- package/registry/directories/eu-vetted/directory.yaml +64 -0
- package/registry/directories/eu-vetted/playbook.md +1 -0
- package/registry/directories/eubuilt/directory.yaml +77 -0
- package/registry/directories/eubuilt/playbook.md +5 -0
- package/registry/directories/euroalternative/directory.yaml +48 -0
- package/registry/directories/euroalternative/playbook.md +1 -0
- package/registry/directories/european-tech/directory.yaml +55 -0
- package/registry/directories/european-tech/playbook.md +5 -0
- package/registry/directories/europeanapps/directory.yaml +52 -0
- package/registry/directories/europeanapps/playbook.md +5 -0
- package/registry/directories/europeanstack/directory.yaml +66 -0
- package/registry/directories/europeanstack/playbook.md +7 -0
- package/registry/directories/eurotoolsindex/directory.yaml +68 -0
- package/registry/directories/eurotoolsindex/playbook.md +7 -0
- package/registry/directories/everydev-ai/directory.yaml +50 -0
- package/registry/directories/everydev-ai/playbook.md +6 -0
- package/registry/directories/faceless-directory/directory.yaml +52 -0
- package/registry/directories/fastd/directory.yaml +45 -0
- package/registry/directories/fastd/playbook.md +1 -0
- package/registry/directories/fastlaunch/directory.yaml +53 -0
- package/registry/directories/fastlaunch/playbook.md +10 -0
- package/registry/directories/favors/directory.yaml +72 -0
- package/registry/directories/favors/playbook.md +7 -0
- package/registry/directories/fazier/directory.yaml +44 -0
- package/registry/directories/fazier/playbook.md +8 -0
- package/registry/directories/featuredtool/directory.yaml +51 -0
- package/registry/directories/featuredtool/playbook.md +1 -0
- package/registry/directories/find-seo-tools/directory.yaml +72 -0
- package/registry/directories/find-seo-tools/playbook.md +1 -0
- package/registry/directories/findly-tools/directory.yaml +45 -0
- package/registry/directories/findly-tools/playbook.md +7 -0
- package/registry/directories/findstack/directory.yaml +46 -0
- package/registry/directories/findstack/playbook.md +1 -0
- package/registry/directories/findyoursaas/directory.yaml +47 -0
- package/registry/directories/findyoursaas/playbook.md +7 -0
- package/registry/directories/firsto/directory.yaml +54 -0
- package/registry/directories/firsto/playbook.md +10 -0
- package/registry/directories/fosspace/directory.yaml +49 -0
- package/registry/directories/founders-today/directory.yaml +52 -0
- package/registry/directories/francesaas/directory.yaml +49 -0
- package/registry/directories/francesaas/playbook.md +5 -0
- package/registry/directories/free-startup-directories/directory.yaml +70 -0
- package/registry/directories/free-startup-listing/directory.yaml +59 -0
- package/registry/directories/free-startup-listing/playbook.md +6 -0
- package/registry/directories/free-tools-directory/directory.yaml +55 -0
- package/registry/directories/free-tools-directory/playbook.md +7 -0
- package/registry/directories/freeaitools-net/directory.yaml +57 -0
- package/registry/directories/from-europe-with-love/directory.yaml +63 -0
- package/registry/directories/from-europe-with-love/playbook.md +5 -0
- package/registry/directories/fstlaunch/directory.yaml +57 -0
- package/registry/directories/fstlaunch/playbook.md +6 -0
- package/registry/directories/futuretools/directory.yaml +67 -0
- package/registry/directories/futuretools/playbook.md +10 -0
- package/registry/directories/glama/directory.yaml +46 -0
- package/registry/directories/glama/playbook.md +7 -0
- package/registry/directories/goodaitools/directory.yaml +46 -0
- package/registry/directories/goodaitools/playbook.md +7 -0
- package/registry/directories/gptbot/directory.yaml +56 -0
- package/registry/directories/gptdemo/directory.yaml +56 -0
- package/registry/directories/gptdemo/playbook.md +7 -0
- package/registry/directories/hicyou/directory.yaml +51 -0
- package/registry/directories/hicyou/playbook.md +1 -0
- package/registry/directories/hightechattic/directory.yaml +49 -0
- package/registry/directories/hightechattic/playbook.md +6 -0
- package/registry/directories/howtobuysaas/directory.yaml +59 -0
- package/registry/directories/howtobuysaas/playbook.md +1 -0
- package/registry/directories/hunt0/directory.yaml +81 -0
- package/registry/directories/hunt0/playbook.md +1 -0
- package/registry/directories/huntscreens/directory.yaml +56 -0
- package/registry/directories/huntscreens/playbook.md +11 -0
- package/registry/directories/huntstartup/directory.yaml +53 -0
- package/registry/directories/huntstartup/playbook.md +8 -0
- package/registry/directories/huzzler/directory.yaml +49 -0
- package/registry/directories/huzzler/playbook.md +7 -0
- package/registry/directories/hype-star/directory.yaml +57 -0
- package/registry/directories/hype-star/playbook.md +6 -0
- package/registry/directories/idea-kiln/directory.yaml +50 -0
- package/registry/directories/idea-kiln/playbook.md +6 -0
- package/registry/directories/ignlab-launch/directory.yaml +82 -0
- package/registry/directories/ignlab-launch/playbook.md +7 -0
- package/registry/directories/indie-deals/directory.yaml +48 -0
- package/registry/directories/indie-deals/playbook.md +8 -0
- package/registry/directories/indie-hustles/directory.yaml +61 -0
- package/registry/directories/indie-hustles/playbook.md +1 -0
- package/registry/directories/indie-makers-hub/directory.yaml +50 -0
- package/registry/directories/indie-makers-hub/playbook.md +5 -0
- package/registry/directories/indie-page/directory.yaml +47 -0
- package/registry/directories/indie-page/playbook.md +1 -0
- package/registry/directories/indiefounders/directory.yaml +48 -0
- package/registry/directories/indiefounders/playbook.md +5 -0
- package/registry/directories/indiehackers/directory.yaml +47 -0
- package/registry/directories/indiehackers/playbook.md +1 -0
- package/registry/directories/indiehackerstacks/directory.yaml +45 -0
- package/registry/directories/indiehackerstacks/playbook.md +5 -0
- package/registry/directories/indiehub/directory.yaml +45 -0
- package/registry/directories/indiehub/playbook.md +8 -0
- package/registry/directories/indiehunt/directory.yaml +45 -0
- package/registry/directories/indiehunt/playbook.md +6 -0
- package/registry/directories/indieneed/directory.yaml +78 -0
- package/registry/directories/indieneed/playbook.md +9 -0
- package/registry/directories/indieproducts/directory.yaml +47 -0
- package/registry/directories/indieproducts/playbook.md +4 -0
- package/registry/directories/indiesignal/directory.yaml +47 -0
- package/registry/directories/indietool/directory.yaml +44 -0
- package/registry/directories/indietool/playbook.md +1 -0
- package/registry/directories/indietools/directory.yaml +69 -0
- package/registry/directories/insidr-ai/directory.yaml +49 -0
- package/registry/directories/insidr-ai/playbook.md +5 -0
- package/registry/directories/intelligent-tools/directory.yaml +59 -0
- package/registry/directories/intelligent-tools/playbook.md +1 -0
- package/registry/directories/inventlist/directory.yaml +71 -0
- package/registry/directories/inventlist/playbook.md +5 -0
- package/registry/directories/joinly/directory.yaml +68 -0
- package/registry/directories/joinly/playbook.md +5 -0
- package/registry/directories/junkstartups/directory.yaml +72 -0
- package/registry/directories/junkstartups/playbook.md +1 -0
- package/registry/directories/justhunt/directory.yaml +55 -0
- package/registry/directories/justhunt/playbook.md +7 -0
- package/registry/directories/kittylaunch/directory.yaml +70 -0
- package/registry/directories/kittylaunch/playbook.md +7 -0
- package/registry/directories/lachief/directory.yaml +81 -0
- package/registry/directories/lachief/playbook.md +1 -0
- package/registry/directories/landbook/directory.yaml +48 -0
- package/registry/directories/landbook/playbook.md +1 -0
- package/registry/directories/launch-community/directory.yaml +73 -0
- package/registry/directories/launch-community/playbook.md +1 -0
- package/registry/directories/launch-list/directory.yaml +52 -0
- package/registry/directories/launch-list/playbook.md +6 -0
- package/registry/directories/launchaf/directory.yaml +51 -0
- package/registry/directories/launchbase-india/directory.yaml +53 -0
- package/registry/directories/launchboard/directory.yaml +50 -0
- package/registry/directories/launchboard/playbook.md +6 -0
- package/registry/directories/launchclash/directory.yaml +47 -0
- package/registry/directories/launchclash/playbook.md +6 -0
- package/registry/directories/launched-tools/directory.yaml +48 -0
- package/registry/directories/launchfree/directory.yaml +58 -0
- package/registry/directories/launchfree/playbook.md +1 -0
- package/registry/directories/launchigniter/directory.yaml +60 -0
- package/registry/directories/launchigniter/playbook.md +9 -0
- package/registry/directories/launchit/directory.yaml +48 -0
- package/registry/directories/launchit/playbook.md +1 -0
- package/registry/directories/launchllama/directory.yaml +53 -0
- package/registry/directories/launchllama/playbook.md +7 -0
- package/registry/directories/launchonit/directory.yaml +74 -0
- package/registry/directories/launchonit/playbook.md +7 -0
- package/registry/directories/launchpedia-tools/directory.yaml +43 -0
- package/registry/directories/launchpedia-tools/playbook.md +5 -0
- package/registry/directories/launchscaler/directory.yaml +53 -0
- package/registry/directories/launchtory/directory.yaml +47 -0
- package/registry/directories/launchtory/playbook.md +5 -0
- package/registry/directories/launchvault/directory.yaml +52 -0
- package/registry/directories/launchvault/playbook.md +5 -0
- package/registry/directories/launchvibe/directory.yaml +45 -0
- package/registry/directories/launchvibe/playbook.md +1 -0
- package/registry/directories/launchvoid/directory.yaml +45 -0
- package/registry/directories/launchvoid/playbook.md +6 -0
- package/registry/directories/letslaunch/directory.yaml +53 -0
- package/registry/directories/letslaunch/playbook.md +1 -0
- package/registry/directories/libhunt/directory.yaml +50 -0
- package/registry/directories/libhunt/playbook.md +1 -0
- package/registry/directories/linezine/directory.yaml +44 -0
- package/registry/directories/linezine/playbook.md +1 -0
- package/registry/directories/linkrena/directory.yaml +58 -0
- package/registry/directories/linkrena/playbook.md +6 -0
- package/registry/directories/list-maro/directory.yaml +74 -0
- package/registry/directories/list-your-tool/directory.yaml +76 -0
- package/registry/directories/list-your-tool/playbook.md +1 -0
- package/registry/directories/listbulb/directory.yaml +48 -0
- package/registry/directories/listbulb/playbook.md +1 -0
- package/registry/directories/listing-sh/directory.yaml +70 -0
- package/registry/directories/llm-relevance/directory.yaml +67 -0
- package/registry/directories/llm-relevance/playbook.md +1 -0
- package/registry/directories/llms-txt-hub/directory.yaml +47 -0
- package/registry/directories/llms-txt-hub/playbook.md +6 -0
- package/registry/directories/llms-txt-site/directory.yaml +53 -0
- package/registry/directories/llms-txt-site/playbook.md +7 -0
- package/registry/directories/macnative/directory.yaml +47 -0
- package/registry/directories/macnative/playbook.md +6 -0
- package/registry/directories/made-with-bolt/directory.yaml +58 -0
- package/registry/directories/made-with-bolt/playbook.md +1 -0
- package/registry/directories/made-with-lovable/directory.yaml +64 -0
- package/registry/directories/made-with-lovable/playbook.md +1 -0
- package/registry/directories/magicbox/directory.yaml +51 -0
- package/registry/directories/magicbox/playbook.md +16 -0
- package/registry/directories/maidensail/directory.yaml +54 -0
- package/registry/directories/makeitlast/directory.yaml +63 -0
- package/registry/directories/makeitlast/playbook.md +8 -0
- package/registry/directories/makerhunt/directory.yaml +56 -0
- package/registry/directories/makerhunt/playbook.md +1 -0
- package/registry/directories/makerlist/directory.yaml +49 -0
- package/registry/directories/makerlist/playbook.md +7 -0
- package/registry/directories/mapbid/directory.yaml +46 -0
- package/registry/directories/marketingdb/directory.yaml +50 -0
- package/registry/directories/marketingdb/playbook.md +8 -0
- package/registry/directories/marketraa/directory.yaml +63 -0
- package/registry/directories/marketraa/playbook.md +1 -0
- package/registry/directories/mcp-market/directory.yaml +49 -0
- package/registry/directories/mcp-market/playbook.md +7 -0
- package/registry/directories/mcp-repository/directory.yaml +45 -0
- package/registry/directories/mcp-repository/playbook.md +6 -0
- package/registry/directories/mcp-so/directory.yaml +45 -0
- package/registry/directories/mcp-so/playbook.md +6 -0
- package/registry/directories/mcpservers/directory.yaml +53 -0
- package/registry/directories/mcpservers/playbook.md +7 -0
- package/registry/directories/mf8/directory.yaml +53 -0
- package/registry/directories/mf8/playbook.md +5 -0
- package/registry/directories/microlaunch/directory.yaml +48 -0
- package/registry/directories/microlaunch/playbook.md +1 -0
- package/registry/directories/microsaasexamples/directory.yaml +50 -0
- package/registry/directories/must-tools/directory.yaml +68 -0
- package/registry/directories/must-tools/playbook.md +6 -0
- package/registry/directories/my-launch-stash/directory.yaml +47 -0
- package/registry/directories/my-launch-stash/playbook.md +8 -0
- package/registry/directories/nachonacho/directory.yaml +47 -0
- package/registry/directories/navfolders/directory.yaml +48 -0
- package/registry/directories/navfolders/playbook.md +5 -0
- package/registry/directories/navs/directory.yaml +66 -0
- package/registry/directories/navs/playbook.md +6 -0
- package/registry/directories/navtools-ai/directory.yaml +51 -0
- package/registry/directories/navtools-ai/playbook.md +1 -0
- package/registry/directories/neeed-directory/directory.yaml +60 -0
- package/registry/directories/neeed-directory/playbook.md +10 -0
- package/registry/directories/neonrev/directory.yaml +43 -0
- package/registry/directories/neonrev/playbook.md +1 -0
- package/registry/directories/newaiforyou/directory.yaml +50 -0
- package/registry/directories/newaiforyou/playbook.md +1 -0
- package/registry/directories/newtool/directory.yaml +51 -0
- package/registry/directories/newtool/playbook.md +1 -0
- package/registry/directories/nextbigwhat/directory.yaml +48 -0
- package/registry/directories/nextbigwhat/playbook.md +5 -0
- package/registry/directories/nextlaunch/directory.yaml +50 -0
- package/registry/directories/nextlaunch/playbook.md +8 -0
- package/registry/directories/nicklaunches/directory.yaml +70 -0
- package/registry/directories/nicklaunches/playbook.md +1 -0
- package/registry/directories/nocodefinder/directory.yaml +45 -0
- package/registry/directories/nocodefinder/playbook.md +6 -0
- package/registry/directories/nocodelist/directory.yaml +48 -0
- package/registry/directories/nocodelist/playbook.md +7 -0
- package/registry/directories/noonlaunch/directory.yaml +51 -0
- package/registry/directories/noonlaunch/playbook.md +6 -0
- package/registry/directories/nxgn-tools/directory.yaml +49 -0
- package/registry/directories/nxgn-tools/playbook.md +6 -0
- package/registry/directories/once-tools/directory.yaml +58 -0
- package/registry/directories/once-tools/playbook.md +1 -0
- package/registry/directories/open-launch/directory.yaml +46 -0
- package/registry/directories/open-launch/playbook.md +1 -0
- package/registry/directories/openalternative/directory.yaml +62 -0
- package/registry/directories/openalternative/playbook.md +8 -0
- package/registry/directories/openhunts/directory.yaml +52 -0
- package/registry/directories/openhunts/playbook.md +1 -0
- package/registry/directories/openresources/directory.yaml +59 -0
- package/registry/directories/openresources/playbook.md +6 -0
- package/registry/directories/opensaas-directory/directory.yaml +47 -0
- package/registry/directories/opensourcealternative-to/directory.yaml +63 -0
- package/registry/directories/opensourcealternative-to/playbook.md +6 -0
- package/registry/directories/opentools/directory.yaml +42 -0
- package/registry/directories/opentools/playbook.md +4 -0
- package/registry/directories/osssoftware/directory.yaml +66 -0
- package/registry/directories/osssoftware/playbook.md +5 -0
- package/registry/directories/oursoftware-eu/directory.yaml +69 -0
- package/registry/directories/oursoftware-eu/playbook.md +1 -0
- package/registry/directories/peerpush/directory.yaml +48 -0
- package/registry/directories/peerpush/playbook.md +8 -0
- package/registry/directories/phyco/directory.yaml +54 -0
- package/registry/directories/phygital-ai-library/directory.yaml +47 -0
- package/registry/directories/phygital-ai-library/playbook.md +6 -0
- package/registry/directories/pitchground/directory.yaml +47 -0
- package/registry/directories/pitchground/playbook.md +5 -0
- package/registry/directories/pitchwall/directory.yaml +47 -0
- package/registry/directories/pitchwall/playbook.md +1 -0
- package/registry/directories/postmake/directory.yaml +56 -0
- package/registry/directories/postmake/playbook.md +1 -0
- package/registry/directories/poweredbyai/directory.yaml +57 -0
- package/registry/directories/poweredbyai/playbook.md +1 -0
- package/registry/directories/pro-launch/directory.yaml +51 -0
- package/registry/directories/pro-launch/playbook.md +9 -0
- package/registry/directories/product-hunt/directory.yaml +54 -0
- package/registry/directories/product-hunt/playbook.md +1 -0
- package/registry/directories/product-rally/directory.yaml +50 -0
- package/registry/directories/product-rally/playbook.md +6 -0
- package/registry/directories/productivity-directory/directory.yaml +47 -0
- package/registry/directories/productivity-directory/playbook.md +7 -0
- package/registry/directories/productwatch/directory.yaml +51 -0
- package/registry/directories/productwatch/playbook.md +7 -0
- package/registry/directories/proofstories/directory.yaml +47 -0
- package/registry/directories/proofstories/playbook.md +1 -0
- package/registry/directories/prouct/directory.yaml +93 -0
- package/registry/directories/prouct/playbook.md +7 -0
- package/registry/directories/public-apis/directory.yaml +47 -0
- package/registry/directories/public-apis/playbook.md +6 -0
- package/registry/directories/publishyoursaas/directory.yaml +53 -0
- package/registry/directories/publishyoursaas/playbook.md +7 -0
- package/registry/directories/rankinpublic/directory.yaml +50 -0
- package/registry/directories/rankinpublic/playbook.md +1 -0
- package/registry/directories/rankyourai/directory.yaml +50 -0
- package/registry/directories/rankyourai/playbook.md +1 -0
- package/registry/directories/resource-fyi/directory.yaml +47 -0
- package/registry/directories/resource-fyi/playbook.md +5 -0
- package/registry/directories/roozna/directory.yaml +68 -0
- package/registry/directories/roozna/playbook.md +1 -0
- package/registry/directories/saas-fyi/directory.yaml +73 -0
- package/registry/directories/saas-fyi/playbook.md +7 -0
- package/registry/directories/saas-italia/directory.yaml +58 -0
- package/registry/directories/saas-launches/directory.yaml +47 -0
- package/registry/directories/saas-launches/playbook.md +6 -0
- package/registry/directories/saasbison/directory.yaml +44 -0
- package/registry/directories/saasbison/playbook.md +8 -0
- package/registry/directories/saascity/directory.yaml +50 -0
- package/registry/directories/saascubes/directory.yaml +49 -0
- package/registry/directories/saascubes/playbook.md +6 -0
- package/registry/directories/saasfame/directory.yaml +47 -0
- package/registry/directories/saasfame/playbook.md +6 -0
- package/registry/directories/saasgenius/directory.yaml +50 -0
- package/registry/directories/saasgenius/playbook.md +8 -0
- package/registry/directories/saasgrave-launches/directory.yaml +53 -0
- package/registry/directories/saasgrave-launches/playbook.md +7 -0
- package/registry/directories/saashammer/directory.yaml +53 -0
- package/registry/directories/saashammer/playbook.md +6 -0
- package/registry/directories/saashub/directory.yaml +51 -0
- package/registry/directories/saashub/playbook.md +9 -0
- package/registry/directories/saashunt/directory.yaml +43 -0
- package/registry/directories/saaslineup/directory.yaml +68 -0
- package/registry/directories/saaslineup/playbook.md +1 -0
- package/registry/directories/saaslist/directory.yaml +55 -0
- package/registry/directories/saaslist/playbook.md +5 -0
- package/registry/directories/saasmag-saas1000/directory.yaml +71 -0
- package/registry/directories/saaspage/directory.yaml +48 -0
- package/registry/directories/saasplace/directory.yaml +66 -0
- package/registry/directories/saasplace/playbook.md +1 -0
- package/registry/directories/saasrow/directory.yaml +51 -0
- package/registry/directories/saasrow/playbook.md +1 -0
- package/registry/directories/saassy-board/directory.yaml +54 -0
- package/registry/directories/saassy-board/playbook.md +1 -0
- package/registry/directories/saastore/directory.yaml +56 -0
- package/registry/directories/saastore/playbook.md +6 -0
- package/registry/directories/saastr-community-agents/directory.yaml +65 -0
- package/registry/directories/saastr-community-agents/playbook.md +8 -0
- package/registry/directories/saasvault/directory.yaml +48 -0
- package/registry/directories/saasvault/playbook.md +6 -0
- package/registry/directories/scrolllaunch/directory.yaml +54 -0
- package/registry/directories/scrolllaunch/playbook.md +8 -0
- package/registry/directories/seewhatnewai/directory.yaml +53 -0
- package/registry/directories/sellwithboost/directory.yaml +54 -0
- package/registry/directories/sellwithboost/playbook.md +5 -0
- package/registry/directories/serchen/directory.yaml +48 -0
- package/registry/directories/serchen/playbook.md +8 -0
- package/registry/directories/shinylaunch/directory.yaml +48 -0
- package/registry/directories/shinylaunch/playbook.md +6 -0
- package/registry/directories/shipyard-hq/directory.yaml +58 -0
- package/registry/directories/shipyard-hq/playbook.md +1 -0
- package/registry/directories/shipybara/directory.yaml +48 -0
- package/registry/directories/shipybara/playbook.md +8 -0
- package/registry/directories/shipycorn/directory.yaml +47 -0
- package/registry/directories/shipycorn/playbook.md +6 -0
- package/registry/directories/showmebest-ai/directory.yaml +50 -0
- package/registry/directories/showmebest-ai/playbook.md +1 -0
- package/registry/directories/showmysites/directory.yaml +52 -0
- package/registry/directories/showmysites/playbook.md +7 -0
- package/registry/directories/sidehunt/directory.yaml +56 -0
- package/registry/directories/sidehunt/playbook.md +1 -0
- package/registry/directories/sideprojectors/directory.yaml +55 -0
- package/registry/directories/sideprojectors/playbook.md +1 -0
- package/registry/directories/sideprojects/directory.yaml +52 -0
- package/registry/directories/sideprojects/playbook.md +1 -0
- package/registry/directories/sitepatent/directory.yaml +58 -0
- package/registry/directories/sitepatent/playbook.md +1 -0
- package/registry/directories/small-business-marketing-tools/directory.yaml +67 -0
- package/registry/directories/small-business-marketing-tools/playbook.md +1 -0
- package/registry/directories/smol-launch/directory.yaml +44 -0
- package/registry/directories/smol-launch/playbook.md +9 -0
- package/registry/directories/software-como-servicio/directory.yaml +64 -0
- package/registry/directories/software-como-servicio/playbook.md +6 -0
- package/registry/directories/software-finder/directory.yaml +47 -0
- package/registry/directories/software-finder/playbook.md +6 -0
- package/registry/directories/softwaresuggest/directory.yaml +68 -0
- package/registry/directories/softwaresuggest/playbook.md +6 -0
- package/registry/directories/solo-launches/directory.yaml +48 -0
- package/registry/directories/solo-launches/playbook.md +6 -0
- package/registry/directories/sololaunch/directory.yaml +69 -0
- package/registry/directories/sourceforge/directory.yaml +75 -0
- package/registry/directories/sourceforge/playbook.md +9 -0
- package/registry/directories/spacerrapps/directory.yaml +53 -0
- package/registry/directories/spacerrapps/playbook.md +6 -0
- package/registry/directories/speartip/directory.yaml +48 -0
- package/registry/directories/speartip/playbook.md +1 -0
- package/registry/directories/spiff-store/directory.yaml +46 -0
- package/registry/directories/spiff-store/playbook.md +6 -0
- package/registry/directories/spot-startups/directory.yaml +48 -0
- package/registry/directories/spotsaas/directory.yaml +45 -0
- package/registry/directories/squidir/directory.yaml +60 -0
- package/registry/directories/squidir/playbook.md +5 -0
- package/registry/directories/stackboo/directory.yaml +49 -0
- package/registry/directories/stackboo/playbook.md +6 -0
- package/registry/directories/stackledge/directory.yaml +84 -0
- package/registry/directories/stackledge/playbook.md +8 -0
- package/registry/directories/startup-alternatives/directory.yaml +68 -0
- package/registry/directories/startup-alternatives/playbook.md +5 -0
- package/registry/directories/startup-benchmarks/directory.yaml +59 -0
- package/registry/directories/startup-benchmarks/playbook.md +1 -0
- package/registry/directories/startup-collections/directory.yaml +56 -0
- package/registry/directories/startup-collections/playbook.md +5 -0
- package/registry/directories/startup-europe/directory.yaml +52 -0
- package/registry/directories/startup-europe/playbook.md +1 -0
- package/registry/directories/startup-fame/directory.yaml +51 -0
- package/registry/directories/startup-fame/playbook.md +8 -0
- package/registry/directories/startup-fast/directory.yaml +52 -0
- package/registry/directories/startup-fast/playbook.md +9 -0
- package/registry/directories/startup-list/directory.yaml +81 -0
- package/registry/directories/startup-list/playbook.md +8 -0
- package/registry/directories/startup-listing/directory.yaml +77 -0
- package/registry/directories/startup-listing/playbook.md +1 -0
- package/registry/directories/startup-og/directory.yaml +52 -0
- package/registry/directories/startup-ranking/directory.yaml +51 -0
- package/registry/directories/startup-ranking/playbook.md +1 -0
- package/registry/directories/startup-spotlight/directory.yaml +50 -0
- package/registry/directories/startup-spotlight/playbook.md +5 -0
- package/registry/directories/startup88/directory.yaml +46 -0
- package/registry/directories/startup88/playbook.md +1 -0
- package/registry/directories/startupaccelerator/directory.yaml +76 -0
- package/registry/directories/startupaccelerator/playbook.md +7 -0
- package/registry/directories/startupbase/directory.yaml +44 -0
- package/registry/directories/startupbase/playbook.md +1 -0
- package/registry/directories/startupbeats/directory.yaml +48 -0
- package/registry/directories/startupbeats/playbook.md +6 -0
- package/registry/directories/startupdirectory/directory.yaml +50 -0
- package/registry/directories/startupdirectory/playbook.md +1 -0
- package/registry/directories/startupinspire/directory.yaml +52 -0
- package/registry/directories/startupinspire/playbook.md +8 -0
- package/registry/directories/startuplibrary/directory.yaml +46 -0
- package/registry/directories/startuplibrary/playbook.md +1 -0
- package/registry/directories/startuplist-africa/directory.yaml +45 -0
- package/registry/directories/startuplist-africa/playbook.md +6 -0
- package/registry/directories/startups-gallery/directory.yaml +61 -0
- package/registry/directories/startups-gallery/playbook.md +5 -0
- package/registry/directories/startupsfm/directory.yaml +64 -0
- package/registry/directories/startupsfm/playbook.md +9 -0
- package/registry/directories/startupsfyi/directory.yaml +51 -0
- package/registry/directories/startupsfyi/playbook.md +4 -0
- package/registry/directories/startupslab/directory.yaml +61 -0
- package/registry/directories/startupslab/playbook.md +8 -0
- package/registry/directories/startuptile/directory.yaml +51 -0
- package/registry/directories/startuptile/playbook.md +5 -0
- package/registry/directories/startuptrusted/directory.yaml +46 -0
- package/registry/directories/startuptrusted/playbook.md +1 -0
- package/registry/directories/startuups/directory.yaml +50 -0
- package/registry/directories/steemhunt/directory.yaml +46 -0
- package/registry/directories/steemhunt/playbook.md +5 -0
- package/registry/directories/stellar-launch/directory.yaml +55 -0
- package/registry/directories/stellar-launch/playbook.md +1 -0
- package/registry/directories/stork-ai/directory.yaml +49 -0
- package/registry/directories/stork-ai/playbook.md +3 -0
- package/registry/directories/stork-mcp/directory.yaml +52 -0
- package/registry/directories/stork-mcp/playbook.md +3 -0
- package/registry/directories/submitaitools/directory.yaml +57 -0
- package/registry/directories/submitaitools/playbook.md +19 -0
- package/registry/directories/submithunt/directory.yaml +49 -0
- package/registry/directories/submithunt/playbook.md +9 -0
- package/registry/directories/submitmysaas/directory.yaml +51 -0
- package/registry/directories/submitmysaas/playbook.md +6 -0
- package/registry/directories/submitstartup/directory.yaml +73 -0
- package/registry/directories/sumodir/directory.yaml +47 -0
- package/registry/directories/sumodir/playbook.md +7 -0
- package/registry/directories/superlaunch/directory.yaml +64 -0
- package/registry/directories/superlaunch/playbook.md +7 -0
- package/registry/directories/techboard-australia/directory.yaml +54 -0
- package/registry/directories/techboard-australia/playbook.md +5 -0
- package/registry/directories/technologyadvice/directory.yaml +65 -0
- package/registry/directories/technologyadvice/playbook.md +8 -0
- package/registry/directories/tekpon/directory.yaml +44 -0
- package/registry/directories/tensorblock-mcp/directory.yaml +46 -0
- package/registry/directories/tensorblock-mcp/playbook.md +7 -0
- package/registry/directories/thankjohn/directory.yaml +42 -0
- package/registry/directories/thankjohn/playbook.md +1 -0
- package/registry/directories/that-ai-collection/directory.yaml +52 -0
- package/registry/directories/the-ai-library/directory.yaml +46 -0
- package/registry/directories/the-ai-library/playbook.md +1 -0
- package/registry/directories/the-next-ai/directory.yaml +62 -0
- package/registry/directories/the-popular-apps/directory.yaml +43 -0
- package/registry/directories/the-popular-apps/playbook.md +1 -0
- package/registry/directories/the-startup-inc/directory.yaml +90 -0
- package/registry/directories/the-startup-inc/playbook.md +4 -0
- package/registry/directories/the-startup-project/directory.yaml +67 -0
- package/registry/directories/the-startup-project/playbook.md +5 -0
- package/registry/directories/the-tool-directory/directory.yaml +75 -0
- package/registry/directories/thedevtoolsdir/directory.yaml +57 -0
- package/registry/directories/thedevtoolsdir/playbook.md +6 -0
- package/registry/directories/theres-an-ai/directory.yaml +44 -0
- package/registry/directories/theres-an-ai/playbook.md +1 -0
- package/registry/directories/theresanaiforthat/directory.yaml +51 -0
- package/registry/directories/theresanaiforthat/playbook.md +1 -0
- package/registry/directories/thesaasdir/directory.yaml +44 -0
- package/registry/directories/thesaasdir/playbook.md +6 -0
- package/registry/directories/tinylaunch/directory.yaml +50 -0
- package/registry/directories/tinylaunch/playbook.md +8 -0
- package/registry/directories/tinystartups/directory.yaml +61 -0
- package/registry/directories/tinystartups/playbook.md +6 -0
- package/registry/directories/tipseason/directory.yaml +68 -0
- package/registry/directories/tolodora/directory.yaml +59 -0
- package/registry/directories/tool-commons/directory.yaml +46 -0
- package/registry/directories/tool-commons/playbook.md +1 -0
- package/registry/directories/tool-directory-ai/directory.yaml +64 -0
- package/registry/directories/tool-directory-ai/playbook.md +5 -0
- package/registry/directories/tool-finder/directory.yaml +64 -0
- package/registry/directories/tool-finder/playbook.md +6 -0
- package/registry/directories/tooldirs/directory.yaml +64 -0
- package/registry/directories/tooldirs/playbook.md +7 -0
- package/registry/directories/toolfame/directory.yaml +47 -0
- package/registry/directories/toolfame/playbook.md +6 -0
- package/registry/directories/toolfio/directory.yaml +48 -0
- package/registry/directories/toolfio/playbook.md +7 -0
- package/registry/directories/toolfolio/directory.yaml +54 -0
- package/registry/directories/toolfolio/playbook.md +1 -0
- package/registry/directories/toolfound/directory.yaml +66 -0
- package/registry/directories/toolify/directory.yaml +52 -0
- package/registry/directories/toolify/playbook.md +8 -0
- package/registry/directories/toolkitly/directory.yaml +46 -0
- package/registry/directories/toolkitly/playbook.md +1 -0
- package/registry/directories/toollist-ai/directory.yaml +60 -0
- package/registry/directories/toollist-ai/playbook.md +1 -0
- package/registry/directories/toolomio/directory.yaml +55 -0
- package/registry/directories/toolomio/playbook.md +5 -0
- package/registry/directories/toolpasta/directory.yaml +46 -0
- package/registry/directories/toolpasta/playbook.md +1 -0
- package/registry/directories/toolpilot-ai/directory.yaml +77 -0
- package/registry/directories/toolpilot-ai/playbook.md +8 -0
- package/registry/directories/toolpromote/directory.yaml +81 -0
- package/registry/directories/toolrain/directory.yaml +48 -0
- package/registry/directories/toolrain/playbook.md +1 -0
- package/registry/directories/tools-ai-online/directory.yaml +65 -0
- package/registry/directories/tools-ai-online/playbook.md +7 -0
- package/registry/directories/tools-cafe/directory.yaml +51 -0
- package/registry/directories/tools-cafe/playbook.md +6 -0
- package/registry/directories/toolscout/directory.yaml +45 -0
- package/registry/directories/toolscout/playbook.md +5 -0
- package/registry/directories/toolsfine/directory.yaml +58 -0
- package/registry/directories/toolsfine/playbook.md +9 -0
- package/registry/directories/toolsnocode/directory.yaml +48 -0
- package/registry/directories/toolsnocode/playbook.md +6 -0
- package/registry/directories/tooltrove/directory.yaml +71 -0
- package/registry/directories/tooltrove/playbook.md +9 -0
- package/registry/directories/toolveyor/directory.yaml +44 -0
- package/registry/directories/toolveyor/playbook.md +1 -0
- package/registry/directories/toolwise/directory.yaml +67 -0
- package/registry/directories/toolwise/playbook.md +7 -0
- package/registry/directories/toools-design/directory.yaml +64 -0
- package/registry/directories/toools-design/playbook.md +8 -0
- package/registry/directories/topai-tools/directory.yaml +43 -0
- package/registry/directories/topai-tools/playbook.md +1 -0
- package/registry/directories/traffiklist/directory.yaml +55 -0
- package/registry/directories/traffiklist/playbook.md +6 -0
- package/registry/directories/trendy-startups/directory.yaml +49 -0
- package/registry/directories/trendy-startups/playbook.md +1 -0
- package/registry/directories/trillionagent/directory.yaml +57 -0
- package/registry/directories/trillionagent/playbook.md +1 -0
- package/registry/directories/truerev/directory.yaml +83 -0
- package/registry/directories/truerev/playbook.md +12 -0
- package/registry/directories/trustmrr/directory.yaml +43 -0
- package/registry/directories/trustradius/directory.yaml +67 -0
- package/registry/directories/trustradius/playbook.md +9 -0
- package/registry/directories/trylaunch/directory.yaml +51 -0
- package/registry/directories/trylaunch/playbook.md +1 -0
- package/registry/directories/tulimoa/directory.yaml +65 -0
- package/registry/directories/tulimoa/playbook.md +7 -0
- package/registry/directories/turbo0/directory.yaml +49 -0
- package/registry/directories/turbo0/playbook.md +9 -0
- package/registry/directories/twelve-tools/directory.yaml +47 -0
- package/registry/directories/twelve-tools/playbook.md +6 -0
- package/registry/directories/ultimate-free-tools/directory.yaml +49 -0
- package/registry/directories/ultimate-free-tools/playbook.md +8 -0
- package/registry/directories/uneed/directory.yaml +55 -0
- package/registry/directories/uneed/playbook.md +9 -0
- package/registry/directories/unitelist/directory.yaml +49 -0
- package/registry/directories/unitelist/playbook.md +7 -0
- package/registry/directories/uno-directory/directory.yaml +48 -0
- package/registry/directories/uno-directory/playbook.md +1 -0
- package/registry/directories/ventureradar/directory.yaml +47 -0
- package/registry/directories/ventureradar/playbook.md +5 -0
- package/registry/directories/vibe-coding-cloud/directory.yaml +45 -0
- package/registry/directories/vibe-coding-cloud/playbook.md +6 -0
- package/registry/directories/victrays/directory.yaml +55 -0
- package/registry/directories/victrays/playbook.md +8 -0
- package/registry/directories/visalytica/directory.yaml +59 -0
- package/registry/directories/wavel/directory.yaml +51 -0
- package/registry/directories/we-are-founders/directory.yaml +85 -0
- package/registry/directories/we-are-founders/playbook.md +1 -0
- package/registry/directories/web-store-extensions/directory.yaml +45 -0
- package/registry/directories/web-store-extensions/playbook.md +6 -0
- package/registry/directories/webcurate/directory.yaml +50 -0
- package/registry/directories/website-rating/directory.yaml +66 -0
- package/registry/directories/website-rating/playbook.md +9 -0
- package/registry/directories/webspot/directory.yaml +46 -0
- package/registry/directories/webspot/playbook.md +5 -0
- package/registry/directories/weekhack/directory.yaml +56 -0
- package/registry/directories/weekhack/playbook.md +5 -0
- package/registry/directories/weliketools/directory.yaml +50 -0
- package/registry/directories/weliketools/playbook.md +6 -0
- package/registry/directories/what-is-ai-tools/directory.yaml +48 -0
- package/registry/directories/what-is-ai-tools/playbook.md +1 -0
- package/registry/directories/wired-business/directory.yaml +44 -0
- package/registry/directories/wired-business/playbook.md +6 -0
- package/registry/directories/would-you-pay/directory.yaml +49 -0
- package/registry/directories/would-you-pay/playbook.md +6 -0
- package/registry/directories/xai-plugin-marketplace/directory.yaml +46 -0
- package/registry/directories/xai-plugin-marketplace/playbook.md +5 -0
- package/registry/directories/zplatform-ai/directory.yaml +75 -0
- package/registry/directories/zumvu/directory.yaml +50 -0
- package/scripts/ab +40 -0
- package/scripts/check-listings +8 -0
- package/scripts/google-login +13 -0
- package/scripts/show-browser +17 -0
- package/src/accounts.ts +81 -0
- package/src/audit.ts +229 -0
- package/src/browser.ts +123 -0
- package/src/capabilities.ts +62 -0
- package/src/cli.ts +741 -0
- package/src/db/index.ts +29 -0
- package/src/db/schema.ts +152 -0
- package/src/directory-kinds.ts +12 -0
- package/src/import-hosted.ts +156 -0
- package/src/jobs.ts +270 -0
- package/src/listings.ts +64 -0
- package/src/manual.ts +26 -0
- package/src/product-approvals.ts +31 -0
- package/src/public.ts +24 -0
- package/src/ratings.ts +71 -0
- package/src/registry-updates.ts +54 -0
- package/src/registry.ts +101 -0
- package/src/review.ts +58 -0
- package/src/server.ts +186 -0
- package/src/views.ts +71 -0
- package/src/web/app.tsx +1026 -0
- package/src/web/favicon.svg +4 -0
- package/src/web/index.html +14 -0
- package/src/web/style.css +301 -0
- 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); }
|
package/src/workspace.ts
ADDED
|
@@ -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
|
+
}
|