Add files via upload
This commit is contained in:
@@ -0,0 +1,92 @@
|
|||||||
|
# Contributing to Oikos
|
||||||
|
|
||||||
|
Thanks for your interest in contributing. Oikos is a small, opinionated project — this guide covers the constraints and conventions you need to know before submitting code.
|
||||||
|
|
||||||
|
## Ground Rules
|
||||||
|
|
||||||
|
**Oikos has a hard "no frameworks, no build tools" constraint.** This is not a temporary limitation — it's an architectural decision. Specifically:
|
||||||
|
|
||||||
|
- No React, Vue, Svelte, Angular, or any frontend framework
|
||||||
|
- No Webpack, Vite, Rollup, esbuild, or any bundler
|
||||||
|
- No TypeScript (plain JavaScript with ES modules)
|
||||||
|
- No CSS libraries (Tailwind, Bootstrap, etc.)
|
||||||
|
- No external frontend dependencies except Lucide Icons (self-hosted SVG sprite)
|
||||||
|
|
||||||
|
If your contribution requires adding a frontend dependency, it will not be merged. Backend dependencies are evaluated case-by-case but should remain minimal.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/ulsklyc/oikos.git
|
||||||
|
cd oikos
|
||||||
|
npm install
|
||||||
|
cp .env.example .env
|
||||||
|
# Set SESSION_SECRET — skip DB_ENCRYPTION_KEY for local dev
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Run tests before submitting:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm test # Requires Node >=22 (uses --experimental-sqlite)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code Conventions
|
||||||
|
|
||||||
|
### General
|
||||||
|
|
||||||
|
- ES modules everywhere (`import`/`export`, never `require`)
|
||||||
|
- Semicolons: **yes**
|
||||||
|
- Header comment in every file: purpose, module, dependencies
|
||||||
|
- `try/catch` in every route handler — no unhandled promise rejections
|
||||||
|
- No `eval()`, no `innerHTML` with user input — use `textContent` or DOM API
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
|
||||||
|
- Web Component prefix: `oikos-` (one component per file)
|
||||||
|
- All UI text in **German** (the app targets German-speaking families)
|
||||||
|
- Date format: `DD.MM.YYYY` — Time format: `HH:MM` (24h)
|
||||||
|
- Pages are ES modules in `public/pages/` that export a `render()` function
|
||||||
|
- CSS uses design tokens from `public/styles/tokens.css` — don't hardcode colors or radii
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
|
||||||
|
- API routes live in `server/routes/`, one file per module
|
||||||
|
- API responses: `{ data: ... }` on success, `{ error: string, code: number }` on failure
|
||||||
|
- Database migrations go in the `migrations` array in `server/db.js` — **append only, never modify existing entries**
|
||||||
|
- Every table: `id INTEGER PRIMARY KEY`, `created_at TEXT`, `updated_at TEXT`
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
- Tests use the Node.js built-in test runner with in-memory SQLite (`--experimental-sqlite`)
|
||||||
|
- One test file per module in `tests/`
|
||||||
|
- No running server needed — tests import route handlers directly
|
||||||
|
|
||||||
|
## Submitting Changes
|
||||||
|
|
||||||
|
1. Fork the repo and create a branch from `main`
|
||||||
|
2. Make your changes following the conventions above
|
||||||
|
3. Add or update tests if applicable
|
||||||
|
4. Run `npm test` and make sure all tests pass
|
||||||
|
5. Open a pull request with a clear description of what and why
|
||||||
|
|
||||||
|
Keep PRs focused. One feature or fix per PR. Large refactors should be discussed in an issue first.
|
||||||
|
|
||||||
|
## Reporting Bugs
|
||||||
|
|
||||||
|
[Open an issue](https://github.com/ulsklyc/oikos/issues/new) with:
|
||||||
|
|
||||||
|
- What you expected to happen
|
||||||
|
- What actually happened
|
||||||
|
- Steps to reproduce
|
||||||
|
- Environment (browser, OS, Docker version if relevant)
|
||||||
|
|
||||||
|
## Feature Requests
|
||||||
|
|
||||||
|
[Open an issue](https://github.com/ulsklyc/oikos/issues/new) describing the use case. Explain the problem before proposing a solution — there might be a simpler approach that fits the existing architecture.
|
||||||
|
|
||||||
|
Features that conflict with the project's constraints (see above) or significantly expand scope will likely be declined. When in doubt, ask first.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
By contributing, you agree that your contributions will be licensed under the [MIT License](LICENSE).
|
||||||
Reference in New Issue
Block a user