├── README.md
├── docs.jsonl
└── scripts
├── reorder.sh
└── test.sh
/README.md:
--------------------------------------------------------------------------------
1 | # Cursor Built-In Documentation
2 |
3 | This repository contains the official list of built-in documentation sources available in [Cursor](https://cursor.com/), the AI code editor.
4 |
5 |
6 |
7 | 
8 |
9 |
10 |
11 | ## What is this?
12 |
13 | When using Cursor, you can reference documentation for libraries, frameworks, and languages using the `@docs` functionality. For example, typing `@React` will provide context about React's documentation.
14 |
15 | Learn more about using @docs, and how to add your own documentation sources in Cursor at our [documentation](https://docs.cursor.com/context/@-symbols/@-docs).
16 |
17 | Documentation is automatically updated in the editor every week, on Sunday.
18 |
19 | While you can add custom documentation sources to your local Cursor installation, this repository controls what documentation is available out-of-the-box for all users.
20 |
21 | ## What Qualifies for Built-in Docs?
22 |
23 | We aim to include documentation for tools and technologies that are:
24 |
25 | 1. **Widely Used**: Technologies with significant adoption in the developer community (e.g. React, Python, AWS services)
26 | 2. **Well-Documented**: Sources must have comprehensive, maintained documentation with a stable URL structure
27 | 3. **Developer-Focused**: Tools and frameworks used directly by developers in their workflow
28 | 4. **Production-Ready**: No beta/alpha versions or experimental tools
29 | 5. **English Language**: Documentation must be primarily in English
30 | 6. **Latest Versions**: Only the most recent stable version of libraries will be included, with rare exceptions for widely-used legacy versions (e.g. Python 2)
31 |
32 | Some examples that would NOT qualify:
33 | - Personal project documentation
34 | - Company-specific internal tools
35 | - Outdated or unmaintained projects
36 | - Documentation that requires authentication
37 | - Unofficial documentation sources
38 |
39 | ## Contributing
40 |
41 | We welcome contributions to expand our built-in documentation or fix issues with existing sources!
42 |
43 | To add a new documentation source:
44 |
45 | 1. Add a single new entry to [`docs.jsonl`](docs.jsonl) with:
46 | - Project name
47 | - Starting URL for our crawler
48 | - Prefix URL that all crawled pages should be under
49 | 2. Run `./scripts/reorder.sh` to sort the entries
50 | 3. Submit a PR with:
51 | - Only ONE new documentation source (for additions)
52 | - A comment explaining what you're adding/fixing and why
53 | - Confirmation that you've run the reorder script
54 |
55 | **Note:** When adding new sources, PRs with multiple documentation additions will be closed. Please submit separate PRs for each new source. PRs fixing existing documentation sources can include multiple fixes.
56 |
57 | Once approved, we'll crawl the documentation and make it available to all Cursor users via the `@ProjectName` command.
58 |
--------------------------------------------------------------------------------
/docs.jsonl:
--------------------------------------------------------------------------------
1 | { "name": "ASP.NET", "crawlerStart": "https://learn.microsoft.com/en-us/aspnet/core/?view=aspnetcore-7.0", "crawlerPrefix": "https://learn.microsoft.com/en-us/aspnet/core/"}
2 | { "name": "AWS Amplify", "crawlerStart": "https://docs.amplify.aws/", "crawlerPrefix": "https://docs.amplify.aws/"}
3 | { "name": "AWS CLI", "crawlerStart": "https://docs.aws.amazon.com/cli/latest/reference/", "crawlerPrefix": "https://docs.aws.amazon.com/cli/latest/reference/"}
4 | { "name": "AWS DynamoDB", "crawlerStart": "https://docs.aws.amazon.com/dynamodb/", "crawlerPrefix": "https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/"}
5 | { "name": "AWS ECS", "crawlerStart": "https://docs.aws.amazon.com/ecs/", "crawlerPrefix": "https://docs.aws.amazon.com/ecs/latest/developerguide/"}
6 | { "name": "AWS Lambda", "crawlerStart": "https://docs.aws.amazon.com/lambda/index.html", "crawlerPrefix": "https://docs.aws.amazon.com/lambda/latest/dg/"}
7 | { "name": "AWS RDS", "crawlerStart": "https://docs.aws.amazon.com/rds/", "crawlerPrefix": "https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/"}
8 | { "name": "Amazon EC2", "crawlerStart": "https://docs.aws.amazon.com/ec2/index.html", "crawlerPrefix": "https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/"}
9 | { "name": "Amazon S3", "crawlerStart": "https://docs.aws.amazon.com/s3/index.html", "crawlerPrefix": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/"}
10 | { "name": "Android SDK", "crawlerStart": "https://developer.android.com/docs", "crawlerPrefix": "https://developer.android.com/"}
11 | { "name": "Angular", "crawlerStart": "https://angular.dev/overview", "crawlerPrefix": "https://angular.dev/"}
12 | { "name": "Ansible", "crawlerStart": "https://docs.ansible.com/ansible/latest/index.html", "crawlerPrefix": "https://docs.ansible.com/ansible/latest/"}
13 | { "name": "Ant Design", "crawlerStart": "https://ant.design/docs/react/introduce", "crawlerPrefix": "https://ant.design/docs/react/"}
14 | { "name": "Apache Airflow", "crawlerStart": "https://airflow.apache.org/docs/apache-airflow/stable/index.html", "crawlerPrefix": "https://airflow.apache.org/docs/apache-airflow/stable/"}
15 | { "name": "Apollo GraphQL", "crawlerStart": "https://www.apollographql.com/docs/", "crawlerPrefix": "https://www.apollographql.com/docs/"}
16 | { "name": "Apple Developer Documentation", "crawlerStart": "https://developer.apple.com/documentation/", "crawlerPrefix": "https://developer.apple.com/documentation/"}
17 | { "name": "Astro", "crawlerStart": "https://docs.astro.build/en/", "crawlerPrefix": "https://docs.astro.build/en/"}
18 | { "name": "Auth0", "crawlerStart": "https://auth0.com/docs", "crawlerPrefix": "https://auth0.com/docs"}
19 | { "name": "Azure Pipelines", "crawlerStart": "https://docs.microsoft.com/en-us/azure/devops/pipelines/?view=azure-devops", "crawlerPrefix": "https://docs.microsoft.com/en-us/azure/devops/pipelines/"}
20 | { "name": "Bash", "crawlerStart": "https://www.gnu.org/software/bash/manual/bash.html", "crawlerPrefix": "https://www.gnu.org/software/bash/manual/"}
21 | { "name": "BeautifulSoup", "crawlerStart": "https://www.crummy.com/software/BeautifulSoup/bs4/doc/", "crawlerPrefix": "https://www.crummy.com/software/BeautifulSoup/bs4/doc/"}
22 | { "name": "Boto3", "crawlerStart": "https://boto3.amazonaws.com/v1/documentation/api/latest/index.html", "crawlerPrefix": "https://boto3.amazonaws.com/v1/documentation/api/latest/"}
23 | { "name": "Bun", "crawlerStart": "https://bun.sh/docs", "crawlerPrefix": "https://bun.sh/docs"}
24 | { "name": "C#", "crawlerStart": "https://learn.microsoft.com/en-us/dotnet/csharp/", "crawlerPrefix": "https://learn.microsoft.com/en-us/dotnet/csharp/"}
25 | { "name": "CSS", "crawlerStart": "https://developer.mozilla.org/en-US/docs/Web/CSS", "crawlerPrefix": "https://developer.mozilla.org/en-US/docs/Web/CSS"}
26 | { "name": "CUDA", "crawlerStart": "https://docs.nvidia.com/cuda/index.html", "crawlerPrefix": "https://docs.nvidia.com/cuda/"}
27 | { "name": "Cheerio", "crawlerStart": "https://cheerio.js.org/docs/intro", "crawlerPrefix": "https://cheerio.js.org/docs/"}
28 | { "name": "CircleCI", "crawlerStart": "https://circleci.com/docs/", "crawlerPrefix": "https://circleci.com/docs/"}
29 | { "name": "Clerk", "crawlerStart": "https://clerk.com/docs", "crawlerPrefix": "https://clerk.com/docs"}
30 | { "name": "Cloudflare", "crawlerStart": "https://developers.cloudflare.com/", "crawlerPrefix": "https://developers.cloudflare.com/"}
31 | { "name": "CodeMirror", "crawlerStart": "https://codemirror.net/docs/", "crawlerPrefix": "https://codemirror.net/docs/"}
32 | { "name": "Cursor", "crawlerStart": "https://docs.cursor.com/", "crawlerPrefix": "https://docs.cursor.com/"}
33 | { "name": "Cypress", "crawlerStart": "https://docs.cypress.io/guides/overview/why-cypress", "crawlerPrefix": "https://docs.cypress.io/guides/"}
34 | { "name": "D3", "crawlerStart": "https://d3js.org/getting-started", "crawlerPrefix": "https://d3js.org/"}
35 | { "name": "Datadog", "crawlerStart": "https://docs.datadoghq.com/", "crawlerPrefix": "https://docs.datadoghq.com/"}
36 | { "name": "Deno", "crawlerStart": "https://deno.land/manual@v1.35.0/introduction", "crawlerPrefix": "https://deno.land/manual@v1.35.0/"}
37 | { "name": "DigitalOcean", "crawlerStart": "https://docs.digitalocean.com/", "crawlerPrefix": "https://docs.digitalocean.com/"}
38 | { "name": "Discord API", "crawlerStart": "https://discord.com/developers/docs/intro", "crawlerPrefix": "https://discord.com/developers/docs"}
39 | { "name": "Django", "crawlerStart": "https://docs.djangoproject.com/en/4.2/", "crawlerPrefix": "https://docs.djangoproject.com/en/4.2/"}
40 | { "name": "Django Rest Framework", "crawlerStart": "https://www.django-rest-framework.org/api-guide/requests/", "crawlerPrefix": "https://www.django-rest-framework.org/api-guide"}
41 | { "name": "Docker", "crawlerStart": "https://docs.docker.com/", "crawlerPrefix": "https://docs.docker.com/"}
42 | { "name": "Drizzle", "crawlerStart": "https://orm.drizzle.team/docs/overview", "crawlerPrefix": "https://orm.drizzle.team/docs/overview"}
43 | { "name": "DuckDB", "crawlerStart": "https://duckdb.org/docs/sitemap", "crawlerPrefix": "https://duckdb.org/docs/stable"}
44 | { "name": "ELK Stack", "crawlerStart": "https://www.elastic.co/guide/en/elastic-stack/current/index.html", "crawlerPrefix": "https://www.elastic.co/guide/en/elastic-stack/current/"}
45 | { "name": "ESBuild", "crawlerStart": "https://esbuild.github.io/api/", "crawlerPrefix": "https://esbuild.github.io/api/"}
46 | { "name": "ESLint", "crawlerStart": "https://eslint.org/docs/latest/", "crawlerPrefix": "https://eslint.org/docs/latest/"}
47 | { "name": "Elasticsearch", "crawlerStart": "https://www.elastic.co/guide/en/enterprise-search/current/index.html", "crawlerPrefix": "https://www.elastic.co/guide/en/enterprise-search/current/"}
48 | { "name": "Electron", "crawlerStart": "https://www.electronjs.org/docs/latest/", "crawlerPrefix": "https://www.electronjs.org/docs/latest/"}
49 | { "name": "Emacs", "crawlerStart": "https://www.gnu.org/software/emacs/manual/html_node/emacs/", "crawlerPrefix": "https://www.gnu.org/software/emacs/manual/html_node/emacs/"}
50 | { "name": "Expo", "crawlerStart": "https://docs.expo.dev/", "crawlerPrefix": "https://docs.expo.dev/"}
51 | { "name": "Express", "crawlerStart": "https://expressjs.com/en/5x/api.html", "crawlerPrefix": "https://expressjs.com/en/5x/"}
52 | { "name": "FFmpeg", "crawlerStart": "https://ffmpeg.org/ffmpeg.html", "crawlerPrefix": "https://ffmpeg.org/ffmpeg.html"}
53 | { "name": "Fabric.js", "crawlerStart": "http://fabricjs.com/docs/", "crawlerPrefix": "http://fabricjs.com/docs/"}
54 | { "name": "Fal.ai", "crawlerStart": "https://docs.fal.ai/quick-start", "crawlerPrefix": "https://docs.fal.ai/"}
55 | { "name": "FastAPI", "crawlerStart": "https://fastapi.tiangolo.com/tutorial/", "crawlerPrefix": "https://fastapi.tiangolo.com/tutorial/"}
56 | { "name": "Firebase", "crawlerStart": "https://firebase.google.com/docs", "crawlerPrefix": "https://firebase.google.com/docs"}
57 | { "name": "Flask", "crawlerStart": "https://flask.palletsprojects.com/en/2.3.x/", "crawlerPrefix": "https://flask.palletsprojects.com/en/2.3.x/"}
58 | { "name": "Flutter", "crawlerStart": "https://docs.flutter.dev/", "crawlerPrefix": "https://docs.flutter.dev/"}
59 | { "name": "FontAwesome", "crawlerStart": "https://fontawesome.com/docs/web/", "crawlerPrefix": "https://fontawesome.com/docs/web/"}
60 | { "name": "GCP CLI", "crawlerStart": "https://cloud.google.com/sdk/docs", "crawlerPrefix": "https://cloud.google.com/sdk/docs"}
61 | { "name": "Git", "crawlerStart": "https://git-scm.com/docs", "crawlerPrefix": "https://git-scm.com/docs"}
62 | { "name": "GitHub Actions", "crawlerStart": "https://docs.github.com/en/actions", "crawlerPrefix": "https://docs.github.com/en/actions"}
63 | { "name": "GitLab CI", "crawlerStart": "https://docs.gitlab.com/ee/ci/", "crawlerPrefix": "https://docs.gitlab.com/ee/ci/"}
64 | { "name": "Go", "crawlerStart": "https://go.dev/doc", "crawlerPrefix": "https://go.dev/doc"}
65 | { "name": "Godot", "crawlerStart": "https://docs.godotengine.org/en/stable/", "crawlerPrefix": "https://docs.godotengine.org/en/stable/"}
66 | { "name": "Google Maps JS API", "crawlerStart": "https://developers.google.com/maps/documentation/javascript", "crawlerPrefix": "https://developers.google.com/maps/documentation/javascript"}
67 | { "name": "Gradle", "crawlerStart": "https://docs.gradle.org/current/userguide/userguide.html", "crawlerPrefix": "https://docs.gradle.org/current/userguide/"}
68 | { "name": "Grafana", "crawlerStart": "https://grafana.com/docs/grafana/latest/", "crawlerPrefix": "https://grafana.com/docs/grafana/latest/"}
69 | { "name": "GraphQL", "crawlerStart": "https://graphql.org/learn/", "crawlerPrefix": "https://graphql.org/learn/"}
70 | { "name": "HTML", "crawlerStart": "https://developer.mozilla.org/en-US/docs/Web/HTML", "crawlerPrefix": "https://developer.mozilla.org/en-US/docs/Web/HTML"}
71 | { "name": "Heroku", "crawlerStart": "https://devcenter.heroku.com/categories/reference", "crawlerPrefix": "https://devcenter.heroku.com/"}
72 | { "name": "Hono", "crawlerStart": "https://hono.dev/docs/", "crawlerPrefix": "https://hono.dev/docs/"}
73 | { "name": "Insomnia", "crawlerStart": "https://docs.insomnia.rest/", "crawlerPrefix": "https://docs.insomnia.rest/"}
74 | { "name": "Ionic", "crawlerStart": "https://ionicframework.com/docs", "crawlerPrefix": "https://ionicframework.com/docs"}
75 | { "name": "JAX", "crawlerStart": "https://jax.readthedocs.io/en/latest/", "crawlerPrefix": "https://jax.readthedocs.io/"}
76 | { "name": "JUnit 5", "crawlerStart": "https://junit.org/junit5/docs/current/user-guide/", "crawlerPrefix": "https://junit.org/junit5/docs/current/user-guide/"}
77 | { "name": "Java", "crawlerStart": "https://docs.oracle.com/javase/8/docs/api/", "crawlerPrefix": "https://docs.oracle.com/javase/8/docs/api/"}
78 | { "name": "Jenkins", "crawlerStart": "https://www.jenkins.io/doc/", "crawlerPrefix": "https://www.jenkins.io/doc/"}
79 | { "name": "Jest", "crawlerStart": "https://jestjs.io/docs/getting-started", "crawlerPrefix": "https://jestjs.io/docs/getting-started"}
80 | { "name": "Jquery", "crawlerStart": "https://api.jqueryui.com/1.12/", "crawlerPrefix": "https://api.jqueryui.com/1.12/"}
81 | { "name": "Keras", "crawlerStart": "https://keras.io/api/", "crawlerPrefix": "https://keras.io/api/"}
82 | { "name": "Kubernetes", "crawlerStart": "https://kubernetes.io/docs/", "crawlerPrefix": "https://kubernetes.io/docs/"}
83 | { "name": "LLVM", "crawlerStart": "https://llvm.org/docs/", "crawlerPrefix": "https://llvm.org/docs/"}
84 | { "name": "Langchain", "crawlerStart": "https://python.langchain.com/docs/", "crawlerPrefix": "https://python.langchain.com/docs/"}
85 | { "name": "Langchain-JS", "crawlerStart": "https://js.langchain.com/docs/", "crawlerPrefix": "https://js.langchain.com/docs/"}
86 | { "name": "Laravel", "crawlerStart": "https://laravel.com/docs/10.x", "crawlerPrefix": "https://laravel.com/docs/10.x"}
87 | { "name": "Linux Man Pages", "crawlerStart": "https://man7.org/linux/man-pages/dir_all_alphabetic.html", "crawlerPrefix": "https://man7.org/linux/man-pages/"}
88 | { "name": "MCP", "crawlerStart": "https://modelcontextprotocol.io/introduction", "crawlerPrefix": "https://modelcontextprotocol.io/"}
89 | { "name": "MLX", "crawlerStart": "https://ml-explore.github.io/mlx/build/html/", "crawlerPrefix": "https://ml-explore.github.io/mlx/build/html/"}
90 | { "name": "Material UI", "crawlerStart": "https://mui.com/material-ui/getting-started/", "crawlerPrefix": "https://mui.com/material-ui/"}
91 | { "name": "Matplotlib", "crawlerStart": "https://matplotlib.org/stable/api/", "crawlerPrefix": "https://matplotlib.org/stable/api/"}
92 | { "name": "Maven", "crawlerStart": "https://maven.apache.org/guides/", "crawlerPrefix": "https://maven.apache.org/guides/"}
93 | { "name": "Microsoft Teams", "crawlerStart": "https://learn.microsoft.com/en-us/microsoftteams/platform/", "crawlerPrefix": "https://learn.microsoft.com/en-us/microsoftteams/platform/"}
94 | { "name": "Mockito", "crawlerStart": "https://javadoc.io/doc/org.mockito/mockito-core/latest/index.html", "crawlerPrefix": "https://javadoc.io/doc/org.mockito/mockito-core/latest/"}
95 | { "name": "MongoDB", "crawlerStart": "https://www.mongodb.com/docs/manual/", "crawlerPrefix": "https://www.mongodb.com/docs/manual/"}
96 | { "name": "MySQL", "crawlerStart": "https://dev.mysql.com/doc/", "crawlerPrefix": "https://dev.mysql.com/doc/"}
97 | { "name": "Mypy", "crawlerStart": "https://mypy.readthedocs.io/en/stable/", "crawlerPrefix": "https://mypy.readthedocs.io/en/stable/"}
98 | { "name": "NLTK", "crawlerStart": "https://www.nltk.org/", "crawlerPrefix": "https://www.nltk.org/"}
99 | { "name": "Neo4j", "crawlerStart": "https://neo4j.com/docs/", "crawlerPrefix": "https://neo4j.com/docs/"}
100 | { "name": "NestJS", "crawlerStart": "https://docs.nestjs.com/", "crawlerPrefix": "https://docs.nestjs.com/"}
101 | { "name": "Netlify", "crawlerStart": "https://docs.netlify.com/", "crawlerPrefix": "https://docs.netlify.com/"}
102 | { "name": "NextJS", "crawlerStart": "https://nextjs.org/docs", "crawlerPrefix": "https://nextjs.org/docs"}
103 | { "name": "Nginx", "crawlerStart": "http://nginx.org/en/docs/", "crawlerPrefix": "http://nginx.org/en/docs/"}
104 | { "name": "NodeJS", "crawlerStart": "https://nodejs.org/api/", "crawlerPrefix": "https://nodejs.org/api/"}
105 | { "name": "Notion", "crawlerStart": "https://developers.notion.com/reference/", "crawlerPrefix": "https://developers.notion.com/reference/"}
106 | { "name": "NumPy", "crawlerStart": "https://numpy.org/doc/stable/", "crawlerPrefix": "https://numpy.org/doc/stable/"}
107 | { "name": "Nuxt", "crawlerStart": "https://nuxt.com/docs", "crawlerPrefix": "https://nuxt.com/docs"}
108 | { "name": "Nx", "crawlerStart": "https://nx.dev/getting-started/intro", "crawlerPrefix": "https://nx.dev/"}
109 | { "name": "OpenAI", "crawlerStart": "https://platform.openai.com/docs/", "crawlerPrefix": "https://platform.openai.com/docs/"}
110 | { "name": "OpenCV", "crawlerStart": "https://docs.opencv.org/4.x/", "crawlerPrefix": "https://docs.opencv.org/4.x/"}
111 | { "name": "PHP", "crawlerStart": "https://www.php.net/manual/en/", "crawlerPrefix": "https://www.php.net/manual/en/"}
112 | { "name": "POSIX.1-2024", "crawlerStart": "https://pubs.opengroup.org/onlinepubs/9799919799/idx/index.html", "crawlerPrefix": "https://pubs.opengroup.org/onlinepubs/9799919799/"}
113 | { "name": "Pandas", "crawlerStart": "https://pandas.pydata.org/docs/", "crawlerPrefix": "https://pandas.pydata.org/docs/"}
114 | { "name": "Pinia", "crawlerStart": "https://pinia.vuejs.org/core-concepts/", "crawlerPrefix": "https://pinia.vuejs.org/"}
115 | { "name": "Playwright", "crawlerStart": "https://playwright.dev/docs/intro", "crawlerPrefix": "https://playwright.dev/docs/"}
116 | { "name": "Pnpm", "crawlerStart": "https://pnpm.io/", "crawlerPrefix": "https://pnpm.io/"}
117 | { "name": "Polaris", "crawlerStart": "https://polaris.shopify.com/", "crawlerPrefix": "https://polaris.shopify.com/"}
118 | { "name": "Polars", "crawlerStart": "https://docs.pola.rs/", "crawlerPrefix": "https://docs.pola.rs/"}
119 | { "name": "PostgreSQL", "crawlerStart": "https://www.postgresql.org/docs/current/", "crawlerPrefix": "https://www.postgresql.org/docs/current/"}
120 | { "name": "Postman", "crawlerStart": "https://learning.postman.com/docs/", "crawlerPrefix": "https://learning.postman.com/docs/"}
121 | { "name": "Prisma", "crawlerStart": "https://www.prisma.io/docs", "crawlerPrefix": "https://www.prisma.io/docs"}
122 | { "name": "Pulumi", "crawlerStart": "https://www.pulumi.com/docs/", "crawlerPrefix": "https://www.pulumi.com/docs/"}
123 | { "name": "Puppeteer", "crawlerStart": "https://pptr.dev/", "crawlerPrefix": "https://pptr.dev/"}
124 | { "name": "PyTorch", "crawlerStart": "https://pytorch.org/docs/stable/", "crawlerPrefix": "https://pytorch.org/docs/stable/"}
125 | { "name": "Pydantic", "crawlerStart": "https://docs.pydantic.dev/latest/", "crawlerPrefix": "https://docs.pydantic.dev/latest/"}
126 | { "name": "Pytest", "crawlerStart": "https://docs.pytest.org/en/stable/", "crawlerPrefix": "https://docs.pytest.org/en/stable/"}
127 | { "name": "Python", "crawlerStart": "https://docs.python.org/3/", "crawlerPrefix": "https://docs.python.org/3/"}
128 | { "name": "ROS", "crawlerStart": "https://docs.ros.org/en/rolling/", "crawlerPrefix": "https://docs.ros.org/en/rolling/"}
129 | { "name": "Railway", "crawlerStart": "https://docs.railway.app/", "crawlerPrefix": "https://docs.railway.app/"}
130 | { "name": "React", "crawlerStart": "https://react.dev/reference/react", "crawlerPrefix": "https://react.dev/reference/"}
131 | { "name": "Redis", "crawlerStart": "https://redis.io/docs/", "crawlerPrefix": "https://redis.io/docs/"}
132 | { "name": "Regex", "crawlerStart": "https://www.regular-expressions.info/", "crawlerPrefix": "https://www.regular-expressions.info/"}
133 | { "name": "Remix", "crawlerStart": "https://remix.run/docs/en/main", "crawlerPrefix": "https://remix.run/docs/"}
134 | { "name": "Ruby", "crawlerStart": "https://docs.ruby-lang.org/en/master/", "crawlerPrefix": "https://docs.ruby-lang.org/en/"}
135 | { "name": "Ruff", "crawlerStart": "https://docs.astral.sh/ruff/", "crawlerPrefix": "https://docs.astral.sh/ruff/"}
136 | { "name": "Rust", "crawlerStart": "https://doc.rust-lang.org/book/", "crawlerPrefix": "https://doc.rust-lang.org/book/"}
137 | { "name": "Rust Stdlib", "crawlerStart": "https://doc.rust-lang.org/std/", "crawlerPrefix": "https://doc.rust-lang.org/std/"}
138 | { "name": "SQLite", "crawlerStart": "https://www.sqlite.org/docs.html", "crawlerPrefix": "https://www.sqlite.org/"}
139 | { "name": "Scikit-learn", "crawlerStart": "https://scikit-learn.org/stable/", "crawlerPrefix": "https://scikit-learn.org/stable/"}
140 | { "name": "Selenium", "crawlerStart": "https://www.selenium.dev/documentation/", "crawlerPrefix": "https://www.selenium.dev/documentation/"}
141 | { "name": "Sentry", "crawlerStart": "https://docs.sentry.io/", "crawlerPrefix": "https://docs.sentry.io/"}
142 | { "name": "Shadcn", "crawlerStart": "https://ui.shadcn.com/docs", "crawlerPrefix": "https://ui.shadcn.com/docs"}
143 | { "name": "Socket.io", "crawlerStart": "https://socket.io/docs/v4/", "crawlerPrefix": "https://socket.io/docs/v4/"}
144 | { "name": "Solidity", "crawlerStart": "https://docs.soliditylang.org/en/latest/", "crawlerPrefix": "https://docs.soliditylang.org/en/latest/"}
145 | { "name": "Spring", "crawlerStart": "https://docs.spring.io/spring-framework/reference/", "crawlerPrefix": "https://docs.spring.io/spring-framework/reference/"}
146 | { "name": "Stripe", "crawlerStart": "https://stripe.com/docs", "crawlerPrefix": "https://stripe.com/docs"}
147 | { "name": "Supabase", "crawlerStart": "https://supabase.com/docs", "crawlerPrefix": "https://supabase.com/docs"}
148 | { "name": "Svelte", "crawlerStart": "https://svelte.dev/docs", "crawlerPrefix": "https://svelte.dev/docs"}
149 | { "name": "Symfony", "crawlerStart": "https://symfony.com/doc/current/", "crawlerPrefix": "https://symfony.com/doc/"}
150 | { "name": "Tailwind", "crawlerStart": "https://tailwindcss.com/docs", "crawlerPrefix": "https://tailwindcss.com/docs"}
151 | { "name": "Terraform", "crawlerStart": "https://developer.hashicorp.com/terraform/docs", "crawlerPrefix": "https://developer.hashicorp.com/terraform/docs"}
152 | { "name": "Three.js", "crawlerStart": "https://threejs.org/docs/", "crawlerPrefix": "https://threejs.org/docs/"}
153 | { "name": "Tinygrad", "crawlerStart": "https://docs.tinygrad.org", "crawlerPrefix": "https://docs.tinygrad.org"}
154 | { "name": "Tokio.rs", "crawlerStart": "https://docs.rs/tokio/latest/tokio/", "crawlerPrefix": "https://docs.rs/tokio/latest/tokio/"}
155 | { "name": "Transformers", "crawlerStart": "https://huggingface.co/docs/transformers/index", "crawlerPrefix": "https://huggingface.co/docs/transformers/"}
156 | { "name": "TypeScript", "crawlerStart": "https://www.typescriptlang.org/docs/", "crawlerPrefix": "https://www.typescriptlang.org/docs/"}
157 | { "name": "Unity", "crawlerStart": "https://docs.unity3d.com/Manual/", "crawlerPrefix": "https://docs.unity3d.com/Manual/"}
158 | { "name": "Unreal Engine", "crawlerStart": "https://docs.unrealengine.com/5.0/en-US/", "crawlerPrefix": "https://docs.unrealengine.com/5.0/en-US/"}
159 | { "name": "Uv", "crawlerStart": "https://docs.astral.sh/uv/", "crawlerPrefix": "https://docs.astral.sh/uv/"}
160 | { "name": "Vercel", "crawlerStart": "https://vercel.com/docs", "crawlerPrefix": "https://vercel.com/docs"}
161 | { "name": "Vim", "crawlerStart": "https://vimhelp.org/", "crawlerPrefix": "https://vimhelp.org/"}
162 | { "name": "Vite", "crawlerStart": "https://vitejs.dev/guide/", "crawlerPrefix": "https://vitejs.dev/guide/"}
163 | { "name": "Vitest", "crawlerStart": "https://vitest.dev/guide/", "crawlerPrefix": "https://vitest.dev/guide/"}
164 | { "name": "Vue", "crawlerStart": "https://vuejs.org/guide/introduction.html", "crawlerPrefix": "https://vuejs.org/guide/"}
165 | { "name": "Webpack", "crawlerStart": "https://webpack.js.org/concepts/", "crawlerPrefix": "https://webpack.js.org/concepts/"}
166 | { "name": "XGBoost", "crawlerStart": "https://xgboost.readthedocs.io/en/stable/", "crawlerPrefix": "https://xgboost.readthedocs.io/en/stable/"}
167 | { "name": "Zod", "crawlerStart": "https://zod.dev/", "crawlerPrefix": "https://zod.dev/"}
168 | { "name": "Zsh", "crawlerStart": "https://zsh.sourceforge.io/Doc/", "crawlerPrefix": "https://zsh.sourceforge.io/Doc/"}
169 | { "name": "help", "crawlerStart": "https://docs.cursor.com/get-started/welcome", "crawlerPrefix": "https://docs.cursor.com/"}
--------------------------------------------------------------------------------
/scripts/reorder.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Get the directory where the script is located
4 | SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
5 |
6 | # Sort JSON entries by name, remove duplicates, ensure one item per line
7 | jq -c '.' "$SCRIPT_DIR/../docs.jsonl" | \
8 | jq -s 'sort_by(.name) | unique_by(.name) | .[]' | \
9 | tr -d '\n' | sed 's/}{/}\n{/g' > "$SCRIPT_DIR/../docs.jsonl.tmp"
10 |
11 | mv "$SCRIPT_DIR/../docs.jsonl.tmp" "$SCRIPT_DIR/../docs.jsonl"
12 |
13 | # Count items after sorting
14 | TOTAL=$(wc -l < "$SCRIPT_DIR/../docs.jsonl" | tr -d ' ')
15 |
16 | echo -e "\n\033[32m✓ Successfully reordered $TOTAL items\033[0m\n"
--------------------------------------------------------------------------------
/scripts/test.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Get the directory where the script is located
4 | SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
5 |
6 | # Extract URLs and test each one
7 | while read -r line; do
8 | # Extract URL and line number
9 | url=$(echo "$line" | cut -d: -f2- | sed -E 's/.*"crawlerStart": "([^"]+)".*/\1/')
10 | line_num=$(echo "$line" | cut -d: -f1)
11 |
12 | # Get HTTP status code and redirect location for URL
13 | response=$(curl -s -L -o /dev/null -w "%{http_code} %{url_effective}" "$url")
14 | status=$(echo "$response" | cut -d' ' -f1)
15 | redirect_url=$(echo "$response" | cut -d' ' -f2-)
16 |
17 | # Check if status code indicates success (2xx), redirect (3xx), or failure
18 | if [[ $status =~ ^2 ]]; then
19 | echo -e "\033[32m✓ $url ($status)\033[0m"
20 | elif [[ $status =~ ^3 ]]; then
21 | echo -e "\033[33m→ $url redirects to $redirect_url ($status)\033[0m"
22 | # Update docs.jsonl with redirect destination
23 | sed -i '' "${line_num}s|\"crawlerStart\": \"$url\"|\"crawlerStart\": \"$redirect_url\"|" "$SCRIPT_DIR/../docs.jsonl"
24 | elif [[ $status == "404" ]]; then
25 | echo -e "\033[31m✗ $url (404) - removing entry\033[0m"
26 | # Remove the line from docs.jsonl
27 | sed -i '' "${line_num}d" "$SCRIPT_DIR/../docs.jsonl"
28 | else
29 | echo -e "\033[31m✗ $url ($status)\033[0m"
30 | fi
31 | done < <(grep -n "crawlerStart" "$SCRIPT_DIR/../docs.jsonl")
32 |
--------------------------------------------------------------------------------