Локальная платформа самоподготовки: дискретная математика, основы ИБ,
современные технологии программирования, визуализация данных, английский,
алгоритмы. Один бинарник, SQLite, работает полностью офлайн — UI, контент тем
и миграции вшиты в исполняемый файл через embed.FS.
go run ./cmd/serverСервер поднимется на http://127.0.0.1:8080, миграции применятся
автоматически, первая тема (day1_matplotlib.html, дисциплина dataviz)
зарегистрируется идемпотентным seed'ом.
Флаги:
go run ./cmd/server -addr 127.0.0.1:9090 -db /path/to/forge.dbgo build -o forge-server ./cmd/server
./forge-serverДрайвер SQLite — pure Go (modernc.org/sqlite), поэтому кросс-компиляция не
требует cgo: GOOS=linux GOARCH=amd64 go build ./cmd/server.
| Метод | Путь | Назначение |
|---|---|---|
| GET | /api/topics?discipline=x |
Список тем, фильтр по дисциплине опционален |
| POST | /api/topics/seed |
Batch-регистрация тем, транзакционно |
| GET | /api/topics/{id}/flashcards |
Колода флешкарт темы |
| GET | /api/review/due |
Темы к повторению, сортировка по next_review_at |
| GET | /api/review/weak-spots |
Темы с повторяющимися концептуальными ошибками |
| POST | /api/attempts |
{topic_id, correct, error_type, quality} |
| GET | /api/progress |
Прогресс по каждой дисциплине |
| GET | /api/projects |
Доска проектов Go-роадмапа |
| POST | /api/projects |
{name, description, tech_stack?, roadmap_position?, repo_url?} |
| PATCH | /api/projects/{id}/status |
{status}: planned, in_progress, done |
| GET | /content/{path} |
HTML-артефакт темы |
| GET | / |
Дашборд |
quality — шкала 0–3 (0 — полный провал, 3 — уверенное припоминание);
интервалы пересчитываются алгоритмом SM-2.
Планировщик — реализация SuperMemo-2 (Piotr Wozniak, 1987), адаптированная
под 4-балльную шкалу качества ответа (не совместима 1-в-1 с формулами Anki).
Логика живёт в internal/usecase/spaced_repetition.go.
На каждую попытку (POST /api/attempts) пересчитывается состояние повторения
темы:
quality < 2(провал) — интервал сбрасывается на 1 день, счётчик повторений обнуляется; тема почти сразу возвращается в очередь.quality >= 2(успех) — счётчик повторений растёт, а интервал выбирается по правилу: 1-е повторение — 1 день, 2-е — 6 дней, начиная с 3-го —предыдущий_интервал × ease_factor, округлённый до целого дня.- Ease factor (стартует с 2.5, не опускается ниже
MinEaseFactor) корректируется после любой попытки, включая провальные, по классической формуле SM-2:EF' = EF + (0.1 − q×(0.08 + q×0.02)), гдеq = 3 − quality. - Следующая дата повторения —
now + IntervalDaysдней (UTC).
Так более лёгкие и хорошо усвоенные темы уходят в бэклог на недели, а
проблемные возвращаются на следующий день. GET /api/review/due отдаёт
темы, у которых next_review_at уже наступил, отсортированные по этому
полю; GET /api/review/weak-spots — темы с повторяющимися по типу
ошибками, независимо от расписания.
curl -X POST http://127.0.0.1:8080/api/topics/seed \
-H 'Content-Type: application/json' \
-d '[
{"discipline":"dataviz","title":"Matplotlib: анатомия фигуры","content_path":"day1_matplotlib.html","card_type":"lecture"},
{"discipline":"infosec","title":"STRIDE: модель угроз","content_path":"day2_stride.html","card_type":"lecture"}
]'Вставка транзакционная («все или ничего»); уже зарегистрированные
content_path пропускаются и возвращаются в поле skipped, поэтому батч
можно повторять безопасно.
- Положить HTML-артефакт в
content/. - Пересобрать бинарник (контент вшивается через
embed.FS). - Зарегистрировать тему через
POST /api/topics/seed.
cmd/server/ точка входа (main), сборка зависимостей вручную
internal/domain/ доменные сущности (Topic, Attempt, ReviewState, ...)
internal/port/ интерфейсы репозиториев (порты гексагональной архитектуры)
internal/usecase/ бизнес-логика: SM-2, управление темами/прогрессом/проектами
internal/adapter/sqlite/ реализация портов поверх modernc.org/sqlite
internal/adapter/http/ HTTP-роутер и хендлеры (адаптер поверх usecase)
web/ статика и HTML-шаблон дашборда (вшиты через embed.FS)
content/ HTML-артефакты тем (вшиты через embed.FS)
migrations/ SQL-миграции (вшиты через embed.FS, применяются на старте)
forge.db* (файлы SQLite, создаваемые сервером при запуске) не хранятся в
репозитории — см. .gitignore; путь настраивается флагом -db.
go test -race ./...