128 lines
4.3 KiB
Markdown
128 lines
4.3 KiB
Markdown
|
|
# iObj
|
||
|
|
|
||
|
|
Personlig JSON-objekt / "hukommelsesbank" service. Gemmer og gør søgbare små
|
||
|
|
strukturerede memory-objekter — git-commit-noter, AI-recap, mødereferater,
|
||
|
|
1:1-noter, standups m.m. — på tværs af maskiner, uden at kræve en databaseserver.
|
||
|
|
|
||
|
|
## Hvorfor
|
||
|
|
|
||
|
|
I dag ligger denne slags data spredt i flade filer (`~/.githistory`,
|
||
|
|
`~/.claude_recap.md`, `~/copilot-sessions/*/sessions`), lokalt på én maskine og
|
||
|
|
uden fælles skema eller søgning. iObj samler det i én lille service, der kan
|
||
|
|
tilgås fra enhver maskine.
|
||
|
|
|
||
|
|
**Bemærk:** Denne version af iObj er selve servicen. Integration af
|
||
|
|
`git-today` / `resume_copilot` / recap-flowet til at skrive ind i iObj er en
|
||
|
|
separat, senere opgave.
|
||
|
|
|
||
|
|
## Datamodel
|
||
|
|
|
||
|
|
Hvert objekt har:
|
||
|
|
|
||
|
|
- `id` — uuid
|
||
|
|
- `type` — `git_commit` | `session_log` | `recap` | `meeting_note` | `oneonone` | `standup` | `custom`
|
||
|
|
- `created_at` — hvornår objektet blev gemt
|
||
|
|
- `object_date` — datoen objektet handler om (bruges til sharding + datofiltrering)
|
||
|
|
- `project` — valgfrit projektnavn
|
||
|
|
- `tags` — liste af fritekst-tags
|
||
|
|
- `title` / `body` — kort titel + fritekst/markdown-indhold
|
||
|
|
- `payload` — vilkårligt ekstra JSON (fx `{"sha": "...", "participants": [...]}`)
|
||
|
|
- `source_machine` / `source_tool` — hvor og hvorfra objektet blev skrevet
|
||
|
|
|
||
|
|
Data gemmes i **TinyDB**, ét JSON-fil-shard pr. måned (`data/2026-07.json`) —
|
||
|
|
ingen database-server at drifte, og filstørrelser holdes nede over tid.
|
||
|
|
|
||
|
|
## Kør lokalt
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python3 -m venv .venv && source .venv/bin/activate
|
||
|
|
pip install -r requirements.txt -r requirements-dev.txt
|
||
|
|
|
||
|
|
IOBJ_DATA_DIR=./data IOBJ_API_TOKEN=dev-token \
|
||
|
|
uvicorn iobj.app:app --reload --port 8000
|
||
|
|
```
|
||
|
|
|
||
|
|
Kør tests:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
pytest -q
|
||
|
|
```
|
||
|
|
|
||
|
|
## API
|
||
|
|
|
||
|
|
Alle `/objects*` endpoints kræver `Authorization: Bearer <IOBJ_API_TOKEN>`
|
||
|
|
(auth er slået fra hvis `IOBJ_API_TOKEN` ikke er sat — kun til lokal dev).
|
||
|
|
|
||
|
|
| Metode | Path | Beskrivelse |
|
||
|
|
|---|---|---|
|
||
|
|
| GET | `/health` | Liveness check |
|
||
|
|
| POST | `/objects` | Opret objekt |
|
||
|
|
| GET | `/objects` | Søg (query params: `type`, `project`, `tag`, `date_from`, `date_to`, `q`, `limit`, `offset`) |
|
||
|
|
| GET | `/objects/date/{date}` | Alle objekter for én dato |
|
||
|
|
| GET | `/objects/{id}` | Hent ét objekt |
|
||
|
|
| PATCH | `/objects/{id}` | Opdater (delvist) |
|
||
|
|
| DELETE | `/objects/{id}` | Slet |
|
||
|
|
|
||
|
|
### Eksempler
|
||
|
|
|
||
|
|
```bash
|
||
|
|
TOKEN=dev-token
|
||
|
|
BASE=http://localhost:8000
|
||
|
|
|
||
|
|
# Opret en recap
|
||
|
|
curl -s -X POST "$BASE/objects" -H "Authorization: Bearer $TOKEN" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{
|
||
|
|
"type": "recap",
|
||
|
|
"object_date": "2026-07-13",
|
||
|
|
"project": "NordBytes",
|
||
|
|
"tags": ["backend"],
|
||
|
|
"title": "BDD test patterns",
|
||
|
|
"body": "Implementerede Behave step definitions for invoice-flowet.",
|
||
|
|
"source_tool": "manual"
|
||
|
|
}'
|
||
|
|
|
||
|
|
# Opret en git-commit-note
|
||
|
|
curl -s -X POST "$BASE/objects" -H "Authorization: Bearer $TOKEN" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{
|
||
|
|
"type": "git_commit",
|
||
|
|
"object_date": "2026-07-13",
|
||
|
|
"project": "DevOpsMCP",
|
||
|
|
"title": "Fix Redis TTL bug",
|
||
|
|
"payload": {"sha": "abc123", "author": "Henrik Jess Nielsen"}
|
||
|
|
}'
|
||
|
|
|
||
|
|
# Søg alt for NordBytes i juli, der nævner "BDD"
|
||
|
|
curl -s "$BASE/objects?project=NordBytes&date_from=2026-07-01&date_to=2026-07-31&q=BDD" \
|
||
|
|
-H "Authorization: Bearer $TOKEN"
|
||
|
|
|
||
|
|
# Alt for én bestemt dag (afløser for git-today's dags-visning)
|
||
|
|
curl -s "$BASE/objects/date/2026-07-13" -H "Authorization: Bearer $TOKEN"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Deploy
|
||
|
|
|
||
|
|
- `Dockerfile` — python:3.11-slim, ikke-root bruger, health check på `/health`
|
||
|
|
- `iobj.nomad` — Nomad job (samme mønster som `devops-mcp.nomad`), deployes på
|
||
|
|
`autobox.i80.dk`, exposed via Traefik som `https://iobj.i80.dk`
|
||
|
|
- Data persisteres via Nomad host-volume `iobj-data` → `/app/data`
|
||
|
|
- `IOBJ_API_TOKEN` sættes via Consul KV (`iobj/api/token`), samme mønster som
|
||
|
|
DevOpsMCP's secrets-templates
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker build -t registry.i80.dk/gitea/iobj:<tag> .
|
||
|
|
docker push registry.i80.dk/gitea/iobj:<tag>
|
||
|
|
nomad job run -var="image_tag=<tag>" iobj.nomad
|
||
|
|
curl -sf https://iobj.i80.dk/health
|
||
|
|
```
|
||
|
|
|
||
|
|
## Miljøvariabler
|
||
|
|
|
||
|
|
| Variabel | Default | Beskrivelse |
|
||
|
|
|---|---|---|
|
||
|
|
| `IOBJ_DATA_DIR` | `data` | Sti til mappen med TinyDB-shards |
|
||
|
|
| `IOBJ_API_TOKEN` | (unset) | Bearer-token for alle `/objects*` kald. Auth deaktiveret hvis unset — sæt altid i netværksdeploy |
|
||
|
|
| `IOBJ_LOG_LEVEL` | `INFO` | Log-niveau |
|
||
|
|
| `PORT` | `8000` | Lytteport (styres af Nomad i produktion) |
|