FTS generation и CI: TypeScript без drift
Генератор создаёт два файла:
fts generate policies/discount.fts --out src/generated
src/generated/
fts.utilities.ts
fts.utilities.test.ts
Generated source детерминирован: одинаковый документ даёт одинаковое содержимое.
Рекомендуемый pipeline
fts check policies/discount.fts
fts test policies/discount.fts
fts generate policies/discount.fts --out src/generated
npm run typecheck
npm test
Если артефакты коммитятся, CI после generation проверяет git diff --exit-code.
Если не коммитятся, build обязан генерировать их до tsc.
GitHub Actions
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: npx fts check policies/discount.fts
- run: npx fts test policies/discount.fts
- run: npx fts generate policies/discount.fts --out src/generated
- run: npm run typecheck
- run: npm test
Review policy
Изменение .fts должно отвечать на четыре вопроса:
- Какой предметный термин или закон изменился?
- Какой пример добавлен на новую границу?
- Какие generated functions или UI descriptors изменились?
- Есть ли migration для потребителей canonical JSON?
Не принимайте большой generated diff без небольшого и читаемого diff исходной модели.
Работа агента
Агент может вызвать fts_generate без --out: файлы возвращаются structured
content и ничего не записывают. Это удобно для preview. Запись и commit должны
происходить отдельным контролируемым шагом после проверки.
Упражнение
Добавьте generation в CI своего учебного проекта. Измените .fts, но не
обновляйте generated files. Pipeline должен поймать drift. Затем выберите одну
из двух политик — commit artifacts или build-time generation — и зафиксируйте
её в README.