chore: add Zed project config, .editorconfig and shared pyright settings

- .zed/settings.json: ruff + basedpyright for Python (no format on save, the
  tree is not ruff-format clean), ESLint fixes then Prettier for the frontend,
  scan exclusions for caches and build outputs, .jwt_secret_key as private
- .zed/tasks.json: dev services, API, worker, frontend, pytest/vitest for the
  current file or test, linting, uv lock + requirements export
- .zed/debug.json: debugpy targets matching .vscode/launch.json
- .editorconfig: whitespace rules for every editor
- [tool.pyright] in pyproject.toml: venv, import root and excludes shared by
  pyright, basedpyright and Pylance
- .gitignore: track only the shared files under .zed/
- CONTRIBUTING: editor setup section; fix the stale ESLint config path
This commit is contained in:
arc53-machine committed 2026-09-21 16:10:31 +01:00
1 parent 1c1bc2538f
commit 53facb460c
7 files changed
+320 -1

No files matched your search

+33
View File
@@ -0,0 +1,33 @@
# https://editorconfig.org — shared whitespace rules for every editor.
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2
[*.{py,pyi}]
indent_size = 4
max_line_length = 120
[*.{sh,ps1,ini,toml}]
indent_size = 4
[{Dockerfile,Dockerfile.*,*.dockerfile}]
indent_size = 4
# Two trailing spaces are a hard line break in Markdown.
[*.{md,mdx}]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab
# Generated or vendored; leave as produced.
[{uv.lock,package-lock.json,docsgpt/requirements*.txt}]
indent_size = unset
insert_final_newline = unset
trim_trailing_whitespace = unset
+5
View File
@@ -195,6 +195,11 @@ docsgpt/static/
node_modules/
.vscode/settings.json
.vscode/sftp.json
# Zed: the shared project config is tracked, anything else under .zed/ is local
.zed/*
!.zed/settings.json
!.zed/tasks.json
!.zed/debug.json
/models/
model/
+44
View File
@@ -0,0 +1,44 @@
// Debug configurations for the Zed editor (https://zed.dev/docs/debugger),
// the counterparts of .vscode/launch.json. Start one with `debugger: start`.
// Zed picks the interpreter from the checkout's `.venv`.
[
{
"label": "API (uvicorn)",
"adapter": "Debugpy",
"request": "launch",
"module": "uvicorn",
"args": ["docsgpt.asgi:asgi_app", "--host", "127.0.0.1", "--port", "7091"],
"cwd": "$ZED_WORKTREE_ROOT",
"env": { "PYTHONPATH": "$ZED_WORKTREE_ROOT" },
"justMyCode": true
},
{
// The solo pool keeps tasks in the debugged process, so breakpoints hit.
"label": "Celery worker (solo pool)",
"adapter": "Debugpy",
"request": "launch",
"module": "celery",
"args": ["-A", "docsgpt.app.celery", "worker", "-l", "INFO", "--pool=solo"],
"cwd": "$ZED_WORKTREE_ROOT",
"env": { "PYTHONPATH": "$ZED_WORKTREE_ROOT" },
"justMyCode": true
},
{
"label": "pytest: this file",
"adapter": "Debugpy",
"request": "launch",
"module": "pytest",
"args": ["--no-cov", "$ZED_RELATIVE_FILE"],
"cwd": "$ZED_WORKTREE_ROOT",
"env": { "PYTHONPATH": "$ZED_WORKTREE_ROOT" },
"justMyCode": false
},
{
"label": "Python: this file",
"adapter": "Debugpy",
"request": "launch",
"program": "$ZED_FILE",
"cwd": "$ZED_WORKTREE_ROOT",
"env": { "PYTHONPATH": "$ZED_WORKTREE_ROOT" }
}
]
+89
View File
@@ -0,0 +1,89 @@
// Project settings for the Zed editor (https://zed.dev/docs/configuring-zed).
// They mirror what CI and the pre-commit hook enforce; whitespace rules live in
// .editorconfig and the Python analysis config in pyproject.toml
// ([tool.pyright]) so other editors share them. Personal preferences belong in
// your user settings, not here.
{
// Zed replaces its defaults when this key is set, so they are repeated first.
// Build outputs, caches and local runtime data only add noise to the file
// finder and project search.
"file_scan_exclusions": [
"**/.git",
"**/.svn",
"**/.hg",
"**/.jj",
"**/.sl",
"**/.repo",
"**/CVS",
"**/.DS_Store",
"**/Thumbs.db",
"**/.classpath",
"**/.settings",
"**/__pycache__",
"**/.ruff_cache",
"**/.pytest_cache",
"**/.mypy_cache",
"**/htmlcov",
"**/.next",
"frontend/dist",
"docsgpt/static",
"**/indexes",
"**/inputs",
"**/vectors",
"models"
],
// Never shared with collaborators or sent to an AI assistant. The first six
// are Zed's defaults, which this key also replaces.
"private_files": [
"**/.env*",
"**/*.pem",
"**/*.key",
"**/*.cert",
"**/*.crt",
"**/secrets.yml",
"**/.jwt_secret_key"
],
"file_types": {
"Shell Script": [".env-template"],
"Dockerfile": ["Dockerfile*"]
},
"languages": {
"Python": {
"language_servers": ["basedpyright", "ruff", "..."],
"formatter": { "language_server": { "name": "ruff" } },
// CI runs `ruff check` only and most of the tree is not `ruff format`
// clean, so formatting on save would bury a change in unrelated diffs.
"format_on_save": "off",
"preferred_line_length": 120,
"wrap_guides": [120]
},
// Same order as the lint-staged hook: ESLint fixes, then Prettier.
"TypeScript": {
"formatter": "prettier",
"format_on_save": "on",
"code_actions_on_format": { "source.fixAll.eslint": true }
},
"TSX": {
"formatter": "prettier",
"format_on_save": "on",
"code_actions_on_format": { "source.fixAll.eslint": true }
},
"JavaScript": {
"formatter": "prettier",
"format_on_save": "on",
"code_actions_on_format": { "source.fixAll.eslint": true }
},
// Docs prose is reviewed by Vale, not reflowed by a formatter.
"Markdown": { "format_on_save": "off" },
"MDX": { "format_on_save": "off" }
},
"lsp": {
// The ESLint config is frontend/eslint.config.js, not at the root.
"eslint": {
"settings": { "workingDirectory": { "mode": "auto" } }
},
"tailwindcss-language-server": {
"settings": { "classFunctions": ["cn", "cva", "clsx", "twMerge"] }
}
}
}
+100
View File
@@ -0,0 +1,100 @@
// Project tasks for the Zed editor (https://zed.dev/docs/tasks). Run one with
// `task: spawn`. Python commands go through `uv run --no-sync`, which uses the
// checkout's `.venv` without changing what is installed in it; create it first
// with `uv sync`. See AGENTS.md for what each command does.
[
{
"label": "services: Postgres + Redis",
"command": "docker compose -f deployment/docker-compose-dev.yaml up",
"cwd": "$ZED_WORKTREE_ROOT",
"use_new_terminal": true
},
{
"label": "dev: API + worker + frontend",
"command": "uv run --no-sync docsgpt dev --ui",
"cwd": "$ZED_WORKTREE_ROOT",
"use_new_terminal": true
},
{
"label": "dev: API + worker + frontend (mock LLM, no API key)",
"command": "uv run --no-sync docsgpt dev --ui --mock-llm",
"cwd": "$ZED_WORKTREE_ROOT",
"use_new_terminal": true
},
{
"label": "backend: API",
"command": "uv run --no-sync docsgpt api --reload",
"cwd": "$ZED_WORKTREE_ROOT",
"use_new_terminal": true
},
{
"label": "backend: Celery worker",
"command": "uv run --no-sync docsgpt worker",
"cwd": "$ZED_WORKTREE_ROOT",
"use_new_terminal": true
},
{
"label": "backend: run migrations",
"command": "uv run --no-sync docsgpt migrate",
"cwd": "$ZED_WORKTREE_ROOT"
},
{
"label": "frontend: dev server",
"command": "npm run dev",
"cwd": "$ZED_WORKTREE_ROOT/frontend",
"use_new_terminal": true
},
{
"label": "frontend: build into docsgpt/static",
"command": "bash scripts/build_frontend.sh",
"cwd": "$ZED_WORKTREE_ROOT"
},
// Coverage is switched off for partial runs: pytest.ini turns it on, and a
// report for one file is slow and misleading.
{
"label": "pytest: all",
"command": "uv run --no-sync python -m pytest",
"cwd": "$ZED_WORKTREE_ROOT"
},
{
"label": "pytest: this file",
"command": "uv run --no-sync python -m pytest --no-cov \"$ZED_RELATIVE_FILE\"",
"cwd": "$ZED_WORKTREE_ROOT"
},
{
"label": "pytest: test under cursor ($ZED_SYMBOL)",
"command": "uv run --no-sync python -m pytest --no-cov \"$ZED_RELATIVE_FILE\" -k \"$ZED_SYMBOL\"",
"cwd": "$ZED_WORKTREE_ROOT"
},
{
"label": "pytest: last failed",
"command": "uv run --no-sync python -m pytest --no-cov --lf",
"cwd": "$ZED_WORKTREE_ROOT"
},
{
"label": "vitest: all",
"command": "npm run test",
"cwd": "$ZED_WORKTREE_ROOT/frontend"
},
{
"label": "vitest: this file",
"command": "npx vitest run \"$ZED_FILE\"",
"cwd": "$ZED_WORKTREE_ROOT/frontend"
},
{
"label": "lint: ruff check --fix",
"command": "uv run --no-sync ruff check --fix .",
"cwd": "$ZED_WORKTREE_ROOT"
},
{
"label": "lint: frontend (eslint --fix + prettier)",
"command": "npm run lint-fix && npm run format",
"cwd": "$ZED_WORKTREE_ROOT/frontend"
},
// CI fails when docsgpt/requirements*.txt are stale against uv.lock.
{
"label": "deps: uv lock + export requirements",
"command": "uv lock && bash scripts/export_requirements.sh",
"cwd": "$ZED_WORKTREE_ROOT"
}
]
+27 -1
View File
@@ -43,7 +43,7 @@ Tech Stack Overview:
### 🌐 Frontend Contributions (⚛️ React, Vite)
* The updated Figma design can be found [here](https://www.figma.com/file/OXLtrl1EAy885to6S69554/DocsGPT?node-id=0%3A1&t=hjWVuxRg9yi5YkJ9-1). Please try to follow the guidelines.
* **Coding Style:** We follow a strict coding style enforced by ESLint and Prettier. Please ensure your code adheres to the configuration provided in our repository's `fronetend/.eslintrc.js` file. We recommend configuring your editor with ESLint and Prettier to help with this.
* **Coding Style:** We follow a strict coding style enforced by ESLint and Prettier. Please ensure your code adheres to the configuration provided in our repository's `frontend/eslint.config.js` and `frontend/prettier.config.cjs` files. We recommend configuring your editor with ESLint and Prettier to help with this.
* **Component Structure:** Strive for small, reusable components. Favor functional components and hooks over class components where possible.
* **State Management** If you need to add stores, please use Redux.
@@ -75,6 +75,32 @@ Tech Stack Overview:
...
```
### Editor setup
Some configuration is shared by every editor, so you rarely need to set anything up by hand:
- [`.editorconfig`](https://editorconfig.org) holds the whitespace rules (4 spaces for Python, 2 for TypeScript/JSON/YAML, LF line endings, final newline). Most editors read it natively or through a plugin.
- `[tool.pyright]` in `pyproject.toml` points Pyright, basedpyright and Pylance at the `.venv` created by `uv sync` and at the repository root for imports.
- `.ruff.toml`, `frontend/eslint.config.js` and `frontend/prettier.config.cjs` are picked up by the matching editor integrations.
Editor-specific configuration that is tracked:
- **VS Code:** `.vscode/launch.json` has debug targets for the API, the Celery worker and the frontend.
- **Zed:** open the repository root (not `frontend/`). `.zed/settings.json` configures the language servers and formatters, `.zed/tasks.json` adds tasks (`task: spawn`) for the dev services, the API, the worker, the frontend, tests and linting, and `.zed/debug.json` adds debug targets (`debugger: start`). Python files are not formatted on save because most of the tree is not `ruff format` clean; frontend files are, with ESLint fixes followed by Prettier, as in the pre-commit hook. Project settings cannot install extensions, so if you want the matching syntax support add this to your own Zed settings:
```json
{
"auto_install_extensions": {
"dockerfile": true,
"docker-compose": true,
"toml": true,
"mdx": true
}
}
```
Personal preferences belong in your user settings; `.vscode/settings.json` and any other file under `.zed/` are ignored by git.
### Testing
To run unit tests from the root of the repository, execute:
+22
View File
@@ -213,6 +213,28 @@ exclude = [
"docsgpt/vectors/",
]
# Shared by every editor's Python language server (pyright, basedpyright,
# Pylance) and by `pyright` on the command line. Imports are rooted at the
# checkout (`docsgpt.…`, `tests.…`), and the interpreter is the uv-managed
# `.venv`. "standard" keeps basedpyright from defaulting to its much stricter
# "recommended" mode; this is editor feedback, not a CI gate.
[tool.pyright]
pythonVersion = "3.12"
venvPath = "."
venv = ".venv"
extraPaths = ["."]
typeCheckingMode = "standard"
include = ["docsgpt", "application", "tests", "scripts"]
exclude = [
"**/__pycache__",
"**/node_modules",
".venv",
"docsgpt/static",
"docsgpt/indexes",
"docsgpt/inputs",
"docsgpt/vectors",
]
[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"