Skip to content
This repository was archived by the owner on Sep 11, 2026. It is now read-only.

doc-files: Vue SFC-екстрактор + гібридний рендер Публічного API - #166

Merged
vitaliytv merged 3 commits into
mainfrom
claude/hybrid-comments-llm-vue-sfc-e3a424
Jul 20, 2026
Merged

vitaliytv merged 3 commits into
mainfrom
claude/hybrid-comments-llm-vue-sfc-e3a424

Conversation

@vitaliytv

Copy link
Copy Markdown
Member

Summary

Реалізує ADR 260719-2155 — гібрид «скриптовий рендер коментарів + LLM лише на прогалини» і Vue SFC-екстрактор:

  • Vue SFC-екстрактор (plugins/lang-js/doc-files/vue.mjs): .vue отримує повний факт-лист (orchestrated-шлях) замість unsupported/one-shot. Props/emits/exposed стають псевдо-експортами (об'єктна форма defineProps({...}) і generic defineProps<Props>() з окремою interface-декларацією — обидві покриті тестами), <!-- @slot --> → facts.slots, юніти зі зміщеними у файл офсетами. vue/compiler-sfc — optional peer у plugins/lang-js/package.json (без пакета — коректна деградація до unsupported). Спільні JS regex-хелпери винесено в js-facts.mjs, щоб уникнути циклічного імпорту extractors.mjs ↔ vue.mjs.
  • Ядро doc-files (docgen-gen/docgen-prompts): секція «Публічний API» рендериться дослівно для JSDoc-покритих експортів (renderApiLine, 0 LLM-токенів), LLM викликається лише на прогалини (isApiGap/apiGapMessages). Зміна на рівні ядра — автоматично працює і для Rust (той самий факт-лист {name, desc}).

Побічний улов

Ширший прогін parseJsDoc по ~370 файлах репо виявив 3 попередньо існуючі баги атрибуції JSDoc (не внесені цим PR, але Stage 1 тепер робить їх видимими напряму в доці замість маскування LLM-перефразом) — виправлено разом:

  • glob-рядок 'src/**/linux.rs' читався як порожній /**/, жадібний пошук */ протікав до наступного реального коментаря, змішуючи проміжний код в опис;
  • обгорнутий на 2 рядки @returns — хвіст (продовження без @) падав у desc замість ret;
  • багаторядковий @param {{ ... }} (складний object-type) — усе тіло типу бралось у desc.

Ще один, структурно ширший випадок (/** усередині звичайного //-коментаря, не glob) лишається невиправленим — це вимагає attach JSDoc через comments з AST, а не regex по сирому тексту; окрема більша задача, не точковий фікс.

Test plan

  • npx vitest run npm/rules/doc-files/ plugins/lang-js/ plugins/lang-rust/ — 795 тестів зелені
  • npx @7n/rules lint — exit 0
  • Нові тести: vue.test.mjs (10 тестів на props/emits/exposed/slots/header/unsupported/offsets), isApiGap/renderApiLine/apiGapMessages у docgen-prompts.test.mjs, buildApiSection у docgen-gen.test.mjs
  • Живі прогони генерації (JS + Vue, локальна omlx-модель) для порівняння старого/нового виводу секції «Публічний API»
  • doc-files регенеровано для змінених файлів; changelog-записи покладено в npm/.changes/ і plugins/lang-js/.changes/

🤖 Generated with Claude Code

vitaliytv and others added 3 commits July 20, 2026 10:20
Реалізує ADR 260719-2155 (гібрид «скриптовий рендер коментарів + LLM лише на
прогалини» і Vue SFC-екстрактор):

- plugins/lang-js/doc-files/vue.mjs — .vue отримує повний факт-лист замість
  unsupported/one-shot: props/emits/exposed як псевдо-експорти (об'єктна форма
  defineProps({...}) і generic defineProps<Props>() з окремою interface-
  декларацією), <!-- @slot --> → facts.slots, юніти зі зміщеними у файл
  офсетами. vue/compiler-sfc — optional peer у package.json.
- Спільні JS regex-хелпери винесені в js-facts.mjs (без циклічного імпорту
  extractors.mjs ↔ vue.mjs).
- docgen-gen/docgen-prompts: секція «Публічний API» рендериться дослівно для
  JSDoc-покритих експортів (0 LLM-токенів), LLM викликається лише на прогалини
  (isApiGap/renderApiLine/apiGapMessages). Працює й для Rust (спільне ядро,
  той самий факт-лист {name, desc}).

Побічний улов при ширшому прогоні parseJsDoc по репо (370 файлів): 3 попередньо
існуючі баги атрибуції JSDoc, які Stage 1 тепер робить видимими напряму в доці
замість маскування LLM-перефразом — виправлено разом:
- glob-рядок 'src/**/linux.rs' читався як порожній /**/, жадібний пошук */
  протікав до наступного реального коментаря;
- обгорнутий на 2 рядки @returns — хвіст падав у desc замість ret;
- багаторядковий @PARAM {{ ... }} (складний object-type) — усе тіло типу
  бралось у desc.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Замінює regex-based backward-scan (precedingJsDoc/JSDOC_BEFORE_RE) на
атрибуцію через список коментарів реального парсера
(parseProgramAndCommentsOrNull → jsDocCommentBefore, js-facts.mjs), з
regex-фолбеком лише коли парсинг не вдався.

Точковий фікс (glob 'src/**/linux.rs' читався як порожній /**/) закривав лише
один вузький випадок; regex за конструкцією не бачить меж //-коментарів і
рядкових літералів, тож "/**"-подібний текст усередині них (напр. // приклад:
export const X) все одно міг «протекти» до наступного реального */. AST-парсер
уже коректно розрізняє справжні коментарі від тексту всередині інших
коментарів/рядків — жодних regex-евристик тут більше не потрібно.

Виправляє 4-й (раніше задокументований як невирішений) випадок:
plugins/ci-azure/.../fix-service_deploy_pipeline.mjs migratePipelineFile —
602 символи змішаного коду → 70 символів чистого опису. Прогін по 370 файлах
репо новий регресій не показав.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…s-llm-vue-sfc-e3a424

# Conflicts:
#	plugins/lang-js/doc-files/docs/extractors.md
#	plugins/lang-js/doc-files/docs/vue.md
#	plugins/lang-js/doc-files/extractors.mjs
#	plugins/lang-js/doc-files/tests/vue.test.mjs
#	plugins/lang-js/doc-files/vue.mjs
#	plugins/lang-js/package.json
@vitaliytv
vitaliytv merged commit 52f69dd into main Jul 20, 2026
4 of 7 checks passed
@vitaliytv
vitaliytv deleted the claude/hybrid-comments-llm-vue-sfc-e3a424 branch July 25, 2026 05:03
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant