FTS toolchain: CLI, библиотека, MCP и канонический JSON
FTS требует Node.js 20 или новее. Пока репозиторий приватный, пакет можно подключить из внутреннего registry или собрать из исходников:
git clone git@github.com:the-homeless-god/fts.git
cd fts
npm ci
npm test
npm run build
После публикации пакет и CLI устанавливаются обычным способом:
npm install @digitable/fts
npx fts check model.fts
Один конвейер, три поверхности
Библиотечный API подходит Node.js-приложению:
import { compile, validate } from "@digitable/fts"
const document = compile(source)
const report = validate(document)
if (!report.valid) throw new Error(JSON.stringify(report.diagnostics))
CLI подходит CI и любому языку, который умеет запускать процесс:
fts check model.fts --pretty
fts test model.fts --pretty
fts pipeline model.fts --context snapshot.json --pretty
MCP подходит агенту. Он получает исходник строкой и вызывает read-only tools:
fts_compile, fts_check, fts_test, fts_execute, fts_generate,
fts_certify, fts_verify и другие.
Канонический JSON
Все поверхности приходят к одному FtsDocument. Упрощённо:
{
"category": "Продажи",
"structures": [
{
"name": "Покупка",
"fields": [{ "name": "сумма", "type": "Деньги" }]
}
],
"functors": [],
"proposition": null,
"utilities": []
}
Это главный интеграционный контракт. React не обязан понимать русские ключевые
слова: он получает structures. Python не обязан встраивать TypeScript-парсер:
он читает JSON из stdout CLI. Агент не получает право читать произвольный файл:
он передаёт исходник как аргумент MCP.
JSON-first дисциплина
Успешный CLI-ответ печатается в stdout как JSON. Диагностика ошибки печатается
в stderr, процесс возвращает ненулевой exit code. Поэтому не парсите красивый
текст и не определяйте успех по наличию слова ok.
if fts test policy.fts > result.json; then
node publish-report.mjs result.json
else
echo "FTS policy failed" >&2
exit 1
fi
Упражнение
Скомпилируйте пример скидки, сохраните JSON и найдите в нём категорию, входную
структуру, правило и ожидаемый результат. Затем измените имя поля только в
правиле: fts check должен вернуть стабильный диагностический код неизвестного
поля.