AiSDocs
Пользователи работают в библиотеке документов. Directus — только техническая платформа и админка разработчиков.
Base URL
Для пользовательского сценария и интеграций используйте Library API:
https://apirfc.botsaray.com/v1 https://rfc.botsaray.com/v1 (same-origin для SPA)
https://rfc.botsaray.com/.
Directus Admin: только https://rfc.botsaray.com/admin/.
Библиотека (UI)
Пять экранов первого этапа:
| Экран | URL |
|---|---|
| Проекты | / |
| Проект | /projects/{slug} |
| Документ | /projects/{slug}/rfc/{doc-slug} |
| Редактирование | .../edit |
| История версий | .../history |
Library API /v1
Скрывает структуру Directus. Frontend вызывает только эти операции.
{"type":"rfc","title":"...","summary":"...","body_md":"..."}
curl -sS -H "Authorization: Bearer rfc_..." \ https://apirfc.botsaray.com/v1/projects
Авторизация
Токен из Rfc API Tokens (поле token_secret, вид rfc_...).
Authorization: Bearer <token_secret>
read/create/update) и ACL проектов.
Чтение списка проектов через /v1 допускается и без токена (анонимный read).
Мутации требуют Bearer.
Health
Library API. Без авторизации.
curl -sS https://apirfc.botsaray.com/health
Gatekeeper / Directus proxy (legacy).
Коллекции (legacy Directus Items)
Базовый путь: /items/{collection} — только для служебных интеграций, не для UI библиотеки.
| Collection | Назначение |
|---|---|
rfc_projects | Реестр продуктов/контуров (TaskCapitan, Parser, …) |
rfc_documents | Каталог RFC (code, title, body, urls) |
rfc_hashtags | Хештеги |
rfc_project_cycles | Циклы внедрения внутри проекта |
rfc_project_entries | Идеи / планы / обсуждения / ревизии / отчёты |
rfc_project_entry_links | Ссылки entry → RFC / URL / файл |
rfc_project_entry_comments | Комментарии к entry |
Методы
DELETE на nginx дополнительно защищён basic auth.
Query-параметры
| Параметр | Пример | Смысл |
|---|---|---|
fields | id,code,title,status | Какие поля вернуть |
filter | filter[status][_eq]=active | Фильтр Directus |
search | search=router | Поиск по searchable-полям |
sort | sort=-updated_at | Сортировка |
limit | limit=25 | Лимит (-1 = все, осторожно) |
offset / page | offset=25 | Пагинация |
meta | meta=filter_count | Метаданные ответа |
Примеры
Список проектов
curl -sS 'https://apirfc.botsaray.com/items/rfc_projects?fields=id,name,slug,status&limit=50' \ -H "Authorization: Bearer $TOKEN"
Поиск RFC
curl -sS 'https://apirfc.botsaray.com/items/rfc_documents?search=LLM&fields=id,code,title,status,document_url&limit=20' \ -H "Authorization: Bearer $TOKEN"
RFC по коду
curl -sS 'https://apirfc.botsaray.com/items/rfc_documents?filter[code][_eq]=RFC_30&fields=id,code,title,body_text,document_url' \ -H "Authorization: Bearer $TOKEN"
Записи проекта
curl -sS 'https://apirfc.botsaray.com/items/rfc_project_entries?filter[project_id][slug][_eq]=taskcapitan&fields=id,title,slug,entry_type,status,public_url&limit=50' \ -H "Authorization: Bearer $TOKEN"
Создать entry
curl -sS -X POST 'https://apirfc.botsaray.com/items/rfc_project_entries' \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"project_id": 1,
"entry_type": "idea",
"title": "Новая идея",
"slug": "idea-new",
"summary": "Кратко",
"body_md": "## Суть\n...",
"status": "draft",
"revision_no": 1,
"metadata_json": {}
}'
Документы проекта и чат
Всё живёт внутри Rfc Project, не как отдельные «сущности меню».
Типы документов — поле entry_type в rfc_project_entries:
| entry_type | Смысл |
|---|---|
idea | Идея |
discussion | Предложение / обсуждение |
rfc_revision | RFC-концепция (новая или редакция) |
plan | План внедрения |
report | Отчёт |
Уникальный код документа в проекте — slug (уникален в паре project+slug).
Публичный URL — public_url (копируй и шарь):
https://rfc.botsaray.com/projects/{project-slug}/{slug}
Список документов проекта
curl -sS 'https://apirfc.botsaray.com/items/rfc_project_entries?filter[project_id][slug][_eq]=taskcapitan&fields=id,entry_type,title,slug,status,public_url&sort=-updated_at' \ -H "Authorization: Bearer $TOKEN"
Чат документа (комментарии)
Чат участников = rfc_project_entry_comments, привязан к конкретному entry через entry_id.
curl -sS 'https://apirfc.botsaray.com/items/rfc_project_entry_comments?filter[entry_id][_eq]=1&fields=id,author_name,comment_md,created_at&sort=created_at' \ -H "Authorization: Bearer $TOKEN"
curl -sS -X POST 'https://apirfc.botsaray.com/items/rfc_project_entry_comments' \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"entry_id": 1,
"author_name": "Ivan",
"comment_md": "Согласен с планом, давайте в цикл 2."
}'
Reader URL (браузер)
Человекочитаемые страницы на UI-домене (basic auth reader):
| Тип | URL |
|---|---|
| RFC документ | https://rfc.botsaray.com/{project-slug}/{rfc-code}пример: https://rfc.botsaray.com/taskcapitan/RFC_30 |
| Project entry | https://rfc.botsaray.com/projects/{project-slug}/{entry-slug} |
| Админка документа | https://rfc.botsaray.com/admin/content/rfc_documents/{id} |
Ошибки
| HTTP | Когда |
|---|---|
401 | Нет/битый Bearer |
403 | Нет прав на коллекцию/действие |
404 | Нет объекта или маршрута |
400 | Невалидный filter/payload |
Тело ошибки Directus:
{
"errors": [
{
"message": "...",
"extensions": { "code": "INVALID_CREDENTIALS" }
}
]
}
Админка
- https://rfc.botsaray.com/admin/
- Проекты: rfc_projects
- RFC: rfc_documents
- Токены: rfc_api_tokens