Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Forge

Локальная платформа самоподготовки: дискретная математика, основы ИБ, современные технологии программирования, визуализация данных, английский, алгоритмы. Один бинарник, 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.db

Сборка бинарника

go build -o forge-server ./cmd/server
./forge-server

Драйвер SQLite — pure Go (modernc.org/sqlite), поэтому кросс-компиляция не требует cgo: GOOS=linux GOARCH=amd64 go build ./cmd/server.

API

Метод Путь Назначение
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.

Как работает 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 — темы с повторяющимися по типу ошибками, независимо от расписания.

Bulk-seed

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, поэтому батч можно повторять безопасно.

Добавление темы

  1. Положить HTML-артефакт в content/.
  2. Пересобрать бинарник (контент вшивается через embed.FS).
  3. Зарегистрировать тему через 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 ./...

About

Local-first spaced repetition platform for CS coursework. Go + SQLite, SM-2 algorithm, zero external dependencies. Built for offline study.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages