3.9 KiB
3.9 KiB
Project operating rules
Development server
- Always bind the Django development server to
0.0.0.0:8000so the project is reachable from phones and other devices through the computer's local-network IP address. Do not start it on127.0.0.1unless the user explicitly requests localhost-only access. - Before starting or restarting Django on port
8000, inspect the port and identify every existing listener. - Stop the previous project server and its parent/child process tree before launching the replacement.
- After launch, verify that exactly one process is listening on port
8000. - Verify the listener is bound to
0.0.0.0:8000, then fetch the site locally through127.0.0.1:8000as a health check. - Fetch a changed page/static asset from the live server and confirm the expected new content is actually being served.
- When frontend assets change, remind the user to perform a hard refresh, but do not treat browser cache as the cause until the live listener and served content have been verified.
- Keep the active server session identifier and shut it down cleanly before starting another instance.
Graphify queries
- Treat questions about this codebase as Graphify queries first whenever
graphify-out/graph.jsonexists. - Before querying, expand the user's Persian question against the actual vocabulary in
graphify-out/graph.json. - Use the best combination of Persian and English terms that are present in the graph vocabulary; never rely on automatic translation, stemming, or synonyms inside Graphify.
- For code queries, prioritize the graph's English identifiers (class, function, model, template, route, and file names), because the structural code graph is predominantly English; add Persian terms when they actually exist in the graph, especially for requirements and documentation.
- Choose the traversal deliberately: BFS for broad relationships, DFS for dependency/data-flow traces,
pathfor a shortest connection, andexplainfor one node and its neighbors. - Validate important Graphify findings against the referenced source code or project documentation before acting on them.
Python package mirror
- Use Liara's PyPI mirror for Python dependency resolution and installation:
https://package-mirror.liara.ir/repository/pypi/simple. - Prefer the persistent user-level pip configuration over repeating
--index-urlin individual commands. - If the mirror is temporarily unavailable or missing a required package/version, report it before using the public PyPI index as a fallback.
Frontend and PWA cache safety
- Every locally served frontend asset in templates must include
static_asset_versionin its URL. - Keep the service-worker registration URL versioned with the same value and keep
updateViaCache: 'none'; changing only the service-worker cache name is not sufficient. - Any change to frontend caching or PWA lifecycle code must preserve the regression assertions in
tests/test_views.pyand passtests/e2e/test_pwa_versioning.pywith service workers enabled. - Before blaming a user's browser cache, verify the live listener and served asset content according to the development-server rules above.
End-to-end browser tests
- Put browser scenarios under
tests/e2e/, mark theme2e, and use Django's transactionallive_server. - Use the managed Chromium and isolated BrowserContext provided by
tests/e2e/conftest.py; do not launch browsers directly inside tests. Keep Playwright function-scoped because a session-scoped sync Playwright event loop conflicts with Django's synchronous test-database setup. - Keep selectors and reusable browser actions in
tests/e2e/pages/Page Objects, while tests remain focused on user-visible outcomes. - Never use fixed sleeps for synchronization. Use Playwright locators,
expect, navigation, response, or application-state waits. - Preserve automatic screenshot and trace capture on failure. PWA scenarios must explicitly enable service workers and carry the
pwamarker.