@work-graph/cli 0.2.8 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,6 +4,8 @@ Install **Work Graph** in any project via npm. No engine clone, no manual `engin
4
4
 
5
5
  Work Graph is a local, Git-friendly work system for AI-assisted development. It stores work items as BVC files, keeps project intent close to the codebase, and opens a local backlog UI for operators and agents.
6
6
 
7
+ Website: [workgraph.ru/en](https://workgraph.ru/en/)
8
+
7
9
  Use it when you want:
8
10
 
9
11
  - a project-local backlog without SaaS lock-in;
@@ -132,6 +134,7 @@ See [CONTRIBUTING.md](https://github.com/bvc-lang/work-graph/blob/main/CONTRIBUT
132
134
 
133
135
  ## Links
134
136
 
137
+ - Website: https://workgraph.ru/en/
135
138
  - CLI mirror: https://github.com/bvc-lang/work-graph-cli
136
139
  - Work Graph monorepo: https://github.com/bvc-lang/work-graph
137
140
  - BVC spec: https://github.com/bvc-lang/spec
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@work-graph/cli",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
4
4
  "description": "Work Graph CLI — install local agent work tracking, BVC work items and backlog UI in any project",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,7 +22,7 @@
22
22
  "type": "git",
23
23
  "url": "git+https://github.com/bvc-lang/work-graph-cli.git"
24
24
  },
25
- "homepage": "https://github.com/bvc-lang/work-graph-cli#readme",
25
+ "homepage": "https://workgraph.ru/en/",
26
26
  "keywords": [
27
27
  "work-graph",
28
28
  "backlog",
@@ -2,6 +2,8 @@
2
2
 
3
3
  [MCP](https://modelcontextprotocol.io) server for Work Graph — list, create, and update work items in `intent/**/*.work.bvc`.
4
4
 
5
+ Website: [workgraph.ru/en](https://workgraph.ru/en/)
6
+
5
7
  Works with any MCP-capable agent client (Cursor, Claude Desktop, Claude Code, and others).
6
8
 
7
9
  ## After `work-graph init`
@@ -46,3 +48,9 @@ Requires a project with `.work-graph/config.json` (run `npx @work-graph/cli init
46
48
  Resource: `workgraph://contract/{workId}`
47
49
 
48
50
  Recommended agent flow: `get_work_contract` → run checks → `validate_evidence` → `assert_task_ready_for_done` → `complete_work_item`.
51
+
52
+ ## Links
53
+
54
+ - Website: https://workgraph.ru/en/
55
+ - npm: https://www.npmjs.com/package/@work-graph/mcp
56
+ - Monorepo: https://github.com/bvc-lang/work-graph
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@work-graph/mcp",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "description": "MCP server for Work Graph — work items in intent/**/*.work.bvc",
5
5
  "type": "module",
6
6
  "bin": {
@@ -16,11 +16,12 @@
16
16
  "access": "public"
17
17
  },
18
18
  "dependencies": {
19
- "@work-graph/cli": "^0.2.8",
19
+ "@work-graph/cli": "^0.2.9",
20
20
  "@modelcontextprotocol/sdk": "^1.29.0",
21
21
  "zod": "^3.25.76"
22
22
  },
23
23
  "license": "Apache-2.0",
24
+ "homepage": "https://workgraph.ru/en/",
24
25
  "repository": {
25
26
  "type": "git",
26
27
  "url": "git+https://github.com/bvc-lang/work-graph.git",
@@ -1,4 +1,3 @@
1
1
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <rect width="16" height="16" fill="white"/>
3
2
  <path d="M3.33333 12.622L0 3.31055H3.33333L7.4 7.15081H8.52402L12.6667 3.31055H16L12.6667 12.622H10L8.52402 9.59728H7.4L6 12.622H3.33333Z" fill="#0065FF"/>
4
3
  </svg>
@@ -122,3 +122,66 @@ export function highlightCodeBlock(source, language) {
122
122
  return escapeHtml(source);
123
123
  }
124
124
  }
125
+
126
+ const BVC_SECTION_RE = /^(Базис|Вектор|Цель|Метки|Checks|Basis|Vector|Goal|Labels):/u;
127
+
128
+ function normalizePublicSiteCodeText(source) {
129
+ return String(source ?? '').replace(/\\n/g, '\n');
130
+ }
131
+
132
+ export function highlightBvcBlock(source) {
133
+ const text = normalizePublicSiteCodeText(source);
134
+ return text.split('\n').map((line) => {
135
+ const trimmed = line.trimEnd();
136
+ const header = trimmed.match(/^(#\w+)@(\w+)(<\[)?$/u);
137
+ if (header) {
138
+ const open = header[3] ? '<span class="code-hl-punct">&lt;[</span>' : '';
139
+ return `<span class="code-hl-keyword">${escapeHtml(header[1])}</span><span class="code-hl-punct">@</span><span class="code-hl-number">${escapeHtml(header[2])}</span>${open}`;
140
+ }
141
+ if (/^\]>$/.test(trimmed)) {
142
+ return '<span class="code-hl-punct">]&gt;</span>';
143
+ }
144
+ if (BVC_SECTION_RE.test(trimmed)) {
145
+ const match = trimmed.match(/^([^:]+):(.*)$/u);
146
+ const rest = match[2] ? highlightStructuredTokens(match[2]) : '';
147
+ return `<span class="code-hl-key">${escapeHtml(match[1])}</span><span class="code-hl-punct">:</span>${rest}`;
148
+ }
149
+ const kv = line.match(/^(\s+)([\w.*-]+):\s*(.*)$/u);
150
+ if (kv) {
151
+ return `${escapeHtml(kv[1])}<span class="code-hl-key">${escapeHtml(kv[2])}</span><span class="code-hl-punct">:</span> <span class="code-hl-string">${escapeHtml(kv[3])}</span>`;
152
+ }
153
+ if (/^\s+\S/u.test(line)) {
154
+ return `<span class="code-hl-comment">${escapeHtml(line)}</span>`;
155
+ }
156
+ return highlightStructuredTokens(line);
157
+ }).join('\n');
158
+ }
159
+
160
+ export function highlightMcpFlow(source) {
161
+ const text = normalizePublicSiteCodeText(source);
162
+ return text.split('\n').map((line) => {
163
+ let rest = line.trim();
164
+ let prefix = '';
165
+ if (/^→\s/u.test(rest)) {
166
+ prefix = '<span class="code-hl-punct">→</span> ';
167
+ rest = rest.replace(/^→\s/u, '');
168
+ }
169
+ const fnMatch = rest.match(/^([\w]+)(\(([^)]*)\))?(\s*\+\s*(\w+))?$/u);
170
+ if (fnMatch) {
171
+ const [, fn, parenGroup, args = '', plusSuffix, plusWord] = fnMatch;
172
+ let html = `${prefix}<span class="code-hl-key">${escapeHtml(fn)}</span>`;
173
+ if (parenGroup) {
174
+ html += `<span class="code-hl-punct">(</span><span class="code-hl-string">${escapeHtml(args)}</span><span class="code-hl-punct">)</span>`;
175
+ }
176
+ if (plusSuffix) {
177
+ html += `<span class="code-hl-punct"> + </span><span class="code-hl-keyword">${escapeHtml(plusWord)}</span>`;
178
+ }
179
+ return html;
180
+ }
181
+ const verbMatch = rest.match(/^([\w]+)\s+(.+)$/u);
182
+ if (verbMatch) {
183
+ return `${prefix}<span class="code-hl-key">${escapeHtml(verbMatch[1])}</span> <span class="code-hl-string">${escapeHtml(verbMatch[2])}</span>`;
184
+ }
185
+ return prefix + highlightStructuredTokens(rest);
186
+ }).join('\n');
187
+ }
@@ -1,3 +1,5 @@
1
+ import { getPublicSitePageBlocks, getPublicSitePageMeta } from './publicSitePageContent.mjs';
2
+
1
3
  export const PUBLIC_SITE_DEFAULT_LOCALE = 'en';
2
4
  export const PUBLIC_SITE_LOCALES = ['en', 'ru'];
3
5
  export const PUBLIC_SITE_THEMES = ['light', 'dark'];
@@ -7,13 +9,23 @@ const FLOW_RU = ['Решение (AN)', 'Контракт задачи (.bvc)',
7
9
 
8
10
  const COMPETITORS = [
9
11
  ['Cursor / Claude Code', 'Writes code and runs tools', 'partial', 'Execution layer; WG is the evidence ledger above it'],
12
+ ['GitHub Copilot', 'IDE completions and agent sessions', 'partial', 'Execution layer; WG scopes work.id and proof per change'],
13
+ ['Windsurf / Cline', 'Open IDE agents and edits', 'partial', 'Same as Cursor; WG supplies backlog and gates in git'],
10
14
  ['Linear / Jira', 'Plans and tracks issues', 'no', 'PM layer; WG keeps local BVC contracts and proof'],
15
+ ['Asana / ClickUp', 'Team tasks and project tracking', 'no', 'PM layer; no machine-readable contract per task'],
16
+ ['Notion / Confluence', 'Docs and informal task lists', 'no', 'Knowledge layer; WG links decisions to executable work items'],
17
+ ['Langfuse / LangSmith', 'LLM traces and experiment logs', 'partial', 'Observability; WG ties traces to BVC checks and done'],
11
18
  ['Mem0', 'Stores agent memory', 'no', 'Memory layer; WG stores accountable work records'],
12
19
  ['Devin', 'Autonomous ticket-to-PR sessions', 'partial', 'Cloud execution; WG defines acceptance and evidence'],
13
20
  ];
14
21
  const COMPETITORS_RU = [
15
22
  ['Cursor / Claude Code', 'Пишут код и вызывают инструменты', 'частично', 'Слой исполнения; WG ведёт журнал доказательств над ним'],
23
+ ['GitHub Copilot', 'Подсказки и агентские сессии в IDE', 'частично', 'Слой исполнения; WG задаёт work.id и proof на изменение'],
24
+ ['Windsurf / Cline', 'Открытые IDE-агенты и правки', 'частично', 'Как Cursor; WG даёт бэклог и гейты в git'],
16
25
  ['Linear / Jira', 'Планируют и ведут задачи', 'нет', 'PM-слой; WG хранит локальные BVC-контракты и доказательства'],
26
+ ['Asana / ClickUp', 'Командные задачи и проекты', 'нет', 'PM-слой; нет машиночитаемого контракта на задачу'],
27
+ ['Notion / Confluence', 'Документы и неформальные списки', 'нет', 'Слой знаний; WG связывает решения с исполняемой работой'],
28
+ ['Langfuse / LangSmith', 'Трассы LLM и логи экспериментов', 'частично', 'Наблюдаемость; WG привязывает трассы к BVC-проверкам и done'],
17
29
  ['Mem0', 'Хранит память агента', 'нет', 'Слой памяти; WG хранит ответственные записи работ'],
18
30
  ['Devin', 'Автономные сессии тикет→PR', 'частично', 'Облачное исполнение; WG задаёт acceptance и evidence'],
19
31
  ];
@@ -52,8 +64,8 @@ export const FAQ_ENTRIES = [
52
64
  {
53
65
  question: { en: 'Is Work Graph a task tracker?', ru: 'Work Graph — это тасктрекер?' },
54
66
  answer: {
55
- en: 'No. Unlike Linear or Jira, which track statuses and comments, Work Graph tracks contracts and evidence. A WG task is a .bvc structure linked to repository files and cannot be closed until the agent submits machine-readable proof such as npm test with exit_code: 0.',
56
- ru: 'Нет. Обычные трекеры вроде Linear и Jira хранят статусы и комментарии. Work Graph хранит контракты и доказательства. Задача в WG это структура .bvc, привязанная к файлам репозитория, и она не может быть закрыта, пока агент не предоставит машиночитаемое свидетельство выполнения, например npm test с exit_code: 0.',
67
+ en: 'Yes a local one in your git repo, with a kanban board and statuses. Unlike Jira or Linear, each item is a BVC contract with evidence gates, not just status and comments. A task cannot close until machine-readable proof is attached, for example npm test with exit_code: 0.',
68
+ ru: 'Да локальный, в git-репозитории, с доской и статусами. В отличие от Linear и Jira, единица работыBVC-контракт с гейтами evidence, а не только статус и комментарии. Задача не закрывается, пока не приложено машиночитаемое свидетельство, например npm test с exit_code: 0.',
57
69
  },
58
70
  },
59
71
  {
@@ -152,13 +164,15 @@ const COPY = {
152
164
  evidence: 'Evidence ledger',
153
165
  compare: 'Compare',
154
166
  docs: 'Docs',
167
+ menuOpen: 'Open menu',
168
+ menuClose: 'Close menu',
155
169
  },
156
170
  theme: { light: 'Light', dark: 'Dark' },
157
171
  localeLabel: 'Language',
158
172
  hero: {
159
- eyebrow: 'Local-first · Git · MCP · Agents',
160
- title: 'Contract platform for AI-driven development',
161
- body: 'Work Graph links intent, execution and memory into one machine-readable loop. Not an AI chat, but a graph of work with trace: from research to proof of readiness.',
173
+ title: 'Your navigator for AI development turns goals into an executable graph',
174
+ documentTitle: 'Work Graph — contract platform for AI-driven development',
175
+ body: 'Work Graph links intent, execution and memory into one loop. The path from idea to outcome becomes a manageable project map.',
162
176
  primary: 'How to install',
163
177
  secondary: 'Read llms.txt',
164
178
  },
@@ -201,13 +215,15 @@ const COPY = {
201
215
  evidence: 'Журнал доказательств',
202
216
  compare: 'Сравнение',
203
217
  docs: 'Документация',
218
+ menuOpen: 'Открыть меню',
219
+ menuClose: 'Закрыть меню',
204
220
  },
205
221
  theme: { light: 'Светлая', dark: 'Тёмная' },
206
222
  localeLabel: 'Язык',
207
223
  hero: {
208
- eyebrow: 'Local-first · Git · MCP · Агенты',
209
- title: 'Work Graph — контрактная платформа для разработки с ИИ',
210
- body: 'Work Graph связывает намерение, исполнение и память в единый машиночитаемый контур. Не чат с ИИ, а граф работ со следом: от исследования до доказательства готовности.',
224
+ title: 'Ваш навигатор для AI-разработки, переводит цели в исполняемый граф',
225
+ documentTitle: 'Work Graph — контрактная платформа для разработки с ИИ',
226
+ body: 'Work Graph связывает намерение, исполнение и память в единый контур. Путь от идеи до результата превращается в управляемую карту проекта.',
211
227
  primary: 'Как установить',
212
228
  secondary: 'Открыть llms.txt',
213
229
  },
@@ -296,7 +312,6 @@ export const PUBLIC_SITE_ROUTES = [
296
312
  '/product',
297
313
  '/evidence-ledger',
298
314
  '/compare',
299
- '/faq',
300
315
  '/docs',
301
316
  ...PUBLIC_DOCS.map((doc) => `/docs/${doc.slug}`),
302
317
  ];
@@ -352,8 +367,13 @@ export function buildFaqJsonLd(locale = PUBLIC_SITE_DEFAULT_LOCALE) {
352
367
  };
353
368
  }
354
369
 
370
+ export function getPublicSiteCompetitors(locale) {
371
+ return locale === 'ru' ? COMPETITORS_RU : COMPETITORS;
372
+ }
373
+
355
374
  export function getPublicSitePage(pathname, locale = PUBLIC_SITE_DEFAULT_LOCALE) {
356
375
  const copy = getPublicSiteCopy(locale);
376
+ const pageMeta = getPublicSitePageMeta(locale);
357
377
  const path = pathname === '/index.html' ? '/' : pathname;
358
378
  const docsMatch = path.match(/^\/docs\/([^/.]+)$/u);
359
379
  if (docsMatch) {
@@ -377,44 +397,33 @@ export function getPublicSitePage(pathname, locale = PUBLIC_SITE_DEFAULT_LOCALE)
377
397
  const routes = {
378
398
  '/': {
379
399
  title: copy.hero.title,
400
+ documentTitle: copy.hero.documentTitle,
380
401
  description: copy.hero.body,
381
402
  kind: 'home',
382
403
  sections: [
383
- { title: copy.sections.flowTitle, body: copy.sections.flowBody, items: locale === 'ru' ? FLOW_RU : FLOW, icon: 'git-branch', badges: [{ label: 'BVC', tone: 'accent' }, { label: locale === 'ru' ? 'ЛОКАЛЬНО' : 'LOCAL', tone: 'ok' }] },
384
- { title: copy.sections.evidenceTitle, body: copy.sections.evidenceBody, icon: 'shield-check', badges: [{ label: locale === 'ru' ? 'ДОКАЗАТЕЛЬСТВА' : 'EVIDENCE', tone: 'warning' }, { label: locale === 'ru' ? 'ПРОВЕРКА' : 'VERIFY', tone: 'accent' }] },
385
- { title: copy.sections.compareTitle, body: locale === 'ru' ? 'IDE выполняет команды, трекер ведёт задачи, память хранит факты. Work Graph связывает намерение, контракт работы и доказательство результата.' : 'The IDE runs commands, the tracker manages tasks and memory stores facts. Work Graph connects intent, work contract and proof of outcome.', icon: 'scales', badges: [{ label: locale === 'ru' ? 'ГРАФ НАМЕРЕНИЙ' : 'INTENT GRAPH', tone: 'accent' }, { label: locale === 'ru' ? 'ДОКАЗАТЕЛЬСТВА' : 'EVIDENCE', tone: 'warning' }] },
386
- { title: copy.sections.docsTitle, body: copy.sections.docsBody, icon: 'robot', badges: [{ label: 'LLMS.TXT', tone: 'accent' }, { label: 'MCP', tone: 'ok' }] },
404
+ { title: copy.sections.flowTitle, body: copy.sections.flowBody, badges: [{ label: 'BVC', tone: 'accent' }, { label: locale === 'ru' ? 'ЛОКАЛЬНО' : 'LOCAL', tone: 'ok' }] },
405
+ { title: copy.sections.evidenceTitle, body: copy.sections.evidenceBody, badges: [{ label: locale === 'ru' ? 'ДОКАЗАТЕЛЬСТВА' : 'EVIDENCE', tone: 'warning' }, { label: locale === 'ru' ? 'ПРОВЕРКА' : 'VERIFY', tone: 'accent' }] },
406
+ { title: copy.sections.docsTitle, body: copy.sections.docsBody, badges: [{ label: 'LLMS.TXT', tone: 'accent' }, { label: 'MCP', tone: 'ok' }] },
407
+ { title: copy.sections.compareTitle, body: locale === 'ru' ? 'IDE выполняет команды, трекер ведёт задачи, память хранит факты. Work Graph связывает намерение, контракт работы и доказательство результата.' : 'The IDE runs commands, the tracker manages tasks and memory stores facts. Work Graph connects intent, work contract and proof of outcome.', badges: [{ label: locale === 'ru' ? 'ГРАФ НАМЕРЕНИЙ' : 'INTENT GRAPH', tone: 'accent' }, { label: locale === 'ru' ? 'ДОКАЗАТЕЛЬСТВА' : 'EVIDENCE', tone: 'warning' }] },
387
408
  ],
388
409
  },
389
410
  '/product': {
390
- title: copy.sections.productTitle,
391
- description: copy.sections.productBody,
411
+ ...pageMeta.product,
392
412
  kind: 'product',
393
- sections: [
394
- { title: copy.labels.analytics, body: locale === 'ru' ? 'Решения и аргументация становятся долговечными AN-записями до попадания работы в бэклог.' : 'Decisions and reasoning become durable AN records before work enters the backlog.', icon: 'chart-bar', badges: [{ label: 'AN', tone: 'accent' }] },
395
- { title: copy.labels.workItems, body: locale === 'ru' ? 'BVC-атомы фиксируют Базис, Вектор и Цель, чтобы бэклог не превращался в список дел из чата.' : 'BVC atoms define Basis, Vector and Goal so the backlog is not a chat todo list.', icon: 'clipboard-text', badges: [{ label: '.WORK.BVC', tone: 'ok' }] },
396
- { title: copy.labels.board, body: locale === 'ru' ? 'Текущее движение видно людям и агентам через состояния: готово, захвачено, выполняется и на проверке.' : 'Current motion is visible for humans and agents through ready, claimed, doing and verify states.', icon: 'kanban', badges: [{ label: locale === 'ru' ? 'ПОТОК' : 'FLOW', tone: 'warning' }] },
397
- { title: copy.labels.verification, body: locale === 'ru' ? 'Доказательства и проверки решают готовность; done — это вердикт контракта, а не сообщение.' : 'Evidence and checks decide readiness; done is a contract verdict, not a message.', icon: 'shield-check', badges: [{ label: locale === 'ru' ? 'ГОТОВО' : 'READY', tone: 'accent' }] },
398
- { title: copy.labels.memory, body: locale === 'ru' ? 'Проверенные результаты становятся памятью проекта с исходными задачами и связанными файлами.' : 'Verified outcomes become project memory with source work items and related files.', icon: 'brain', badges: [{ label: locale === 'ru' ? 'ПАМЯТЬ' : 'MEMORY', tone: 'ok' }] },
399
- ],
413
+ blocks: getPublicSitePageBlocks(locale, 'product'),
414
+ sections: [],
400
415
  },
401
416
  '/evidence-ledger': {
402
- title: copy.sections.evidenceTitle,
403
- description: copy.sections.evidenceBody,
417
+ ...pageMeta.evidence,
404
418
  kind: 'evidence',
405
- sections: [
406
- { title: copy.labels.readyForDone, body: locale === 'ru' ? 'Завершение требует доказательств, проверок и трассируемого контракта работы. Гейт объясняет, чего именно не хватает.' : 'Done requires evidence, checks and a traceable work contract. The gate can explain exactly what is missing.', icon: 'check-circle', badges: [{ label: locale === 'ru' ? 'ГЕЙТ' : 'GATE', tone: 'accent' }] },
407
- { title: copy.labels.evidenceRecords, body: locale === 'ru' ? 'Строки и структурированные записи доказательств связывают команды, файлы, трассы и результаты проверки с work.id.' : 'Evidence lines and structured records link commands, files, traces and verification outcomes to a work.id.', icon: 'list-checks', badges: [{ label: locale === 'ru' ? 'ТРАССА' : 'TRACE', tone: 'warning' }] },
408
- { title: copy.labels.localByDefault, body: locale === 'ru' ? 'Журнал живёт в репозитории, а не в отдельной SaaS-базе, поэтому review и аудит следуют за git.' : 'The ledger lives in the repository, not in a separate SaaS database, so review and audit follow git.', icon: 'hard-drives', badges: [{ label: 'GIT', tone: 'ok' }] },
409
- ],
419
+ blocks: getPublicSitePageBlocks(locale, 'evidence'),
420
+ sections: [],
410
421
  },
411
422
  '/compare': {
412
- title: copy.sections.compareTitle,
413
- description: locale === 'ru' ? 'Сравнение с Cursor, Claude Code, Linear, Devin и Mem0.' : 'Comparison with Cursor, Claude Code, Linear, Devin and Mem0.',
423
+ ...pageMeta.compare,
414
424
  kind: 'compare',
415
- sections: [
416
- { title: copy.labels.competitorMatrix, body: locale === 'ru' ? 'Work Graph занимает слой графа намерений: связывает цели, решения, задачи, evidence и память.' : 'Work Graph is the intent-graph layer: it links goals, decisions, work items, evidence and memory.', competitors: locale === 'ru' ? COMPETITORS_RU : COMPETITORS, icon: 'strategy', badges: [{ label: 'AN-44', tone: 'muted' }, { label: 'AN-64', tone: 'accent' }] },
417
- ],
425
+ blocks: getPublicSitePageBlocks(locale, 'compare'),
426
+ sections: [],
418
427
  },
419
428
  '/docs': {
420
429
  title: copy.sections.docsTitle,
@@ -424,14 +433,6 @@ export function getPublicSitePage(pathname, locale = PUBLIC_SITE_DEFAULT_LOCALE)
424
433
  { title: copy.labels.docsIndex, body: locale === 'ru' ? 'BVC, MCP-инструменты, проверки и ошибки выполнения.' : 'BVC, MCP tools, verification and runtime errors.', docs: PUBLIC_DOCS.map((doc) => localizePublicDoc(doc, locale)), icon: 'book-open-text', badges: [{ label: 'MARKDOWN', tone: 'accent' }, { label: 'JSON-LD', tone: 'ok' }] },
425
434
  ],
426
435
  },
427
- '/faq': {
428
- title: locale === 'ru' ? 'Вопрос-ответ (FAQ) — Work Graph' : 'FAQ — Work Graph',
429
- description: locale === 'ru'
430
- ? 'Быстрые ответы о контрактной платформе, BVC, MCP, локальном хранении, evidence и гейтах.'
431
- : 'Quick answers about the contract platform, BVC, MCP, local storage, evidence and gates.',
432
- kind: 'faq',
433
- sections: [],
434
- },
435
436
  };
436
437
 
437
438
  return routes[path] ? { route: path, ...routes[path] } : null;
@@ -446,7 +447,7 @@ export function buildLlmsTxt() {
446
447
  - /product - Workflow: Analytics -> Work Items -> Board -> Verification -> Memory
447
448
  - /evidence-ledger - Evidence and ready-for-done contract
448
449
  - /compare - Comparison with Cursor, Claude Code, Linear, Devin and Mem0
449
- - /faq - Human and LLM-readable FAQ
450
+ - /#faq - FAQ on the home page (structured JSON at /faq.json)
450
451
  - /docs/bvc-spec - BVC atom specification
451
452
  - /docs/mcp-tools - MCP tool contracts
452
453
  - /docs/verification-matrix - Tier A/B/C verification rules