@work-graph/cli 0.2.7 → 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 +8 -5
- package/package.json +2 -2
- package/vendor/packages/workgraph-mcp/README.md +13 -3
- package/vendor/packages/workgraph-mcp/package.json +3 -2
- package/vendor/packages/workgraph-mcp/src/index.mjs +2 -2
- package/vendor/packages/workgraph-mcp/src/prompts.mjs +2 -2
- package/vendor/public/assets/favicon.svg +0 -1
- package/vendor/src/codeSyntaxHighlight.mjs +63 -0
- package/vendor/src/publicSiteContent.mjs +44 -43
- package/vendor/src/publicSitePageContent.mjs +471 -0
- package/vendor/src/publicSitePreferences.mjs +203 -0
- package/vendor/src/publicSiteServer.mjs +969 -456
- package/vendor/src/publicSiteStandaloneServer.mjs +10 -0
- package/vendor/src/ui/iconAssets.mjs +15 -9
- package/vendor/src/workGraphProjectInit.mjs +4 -4
package/README.md
CHANGED
|
@@ -4,11 +4,13 @@ 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;
|
|
10
12
|
- BVC work contracts that can be reviewed in Git;
|
|
11
|
-
-
|
|
13
|
+
- optional MCP client configuration for the project (Cursor by default);
|
|
12
14
|
- a local UI for task status, evidence and project navigation;
|
|
13
15
|
- repeatable setup through `npx`, not a copied engine repository.
|
|
14
16
|
|
|
@@ -45,8 +47,8 @@ Typical output:
|
|
|
45
47
|
| `.work-graph/config.json` | Project id, label and UI settings |
|
|
46
48
|
| `intent/` | BVC intent tree for work items |
|
|
47
49
|
| `intent/index.bvc` | Index of work item files |
|
|
48
|
-
| `.cursor/mcp.json` |
|
|
49
|
-
| `.cursor/rules/work-graph-project.mdc` |
|
|
50
|
+
| `.cursor/mcp.json` | Optional: MCP server entry when using Cursor |
|
|
51
|
+
| `.cursor/rules/work-graph-project.mdc` | Optional: project rule for agents in Cursor |
|
|
50
52
|
| `package.json` | `workgraph:*` scripts and devDependencies |
|
|
51
53
|
|
|
52
54
|
After `npm install`, the project owns its Work Graph runtime through `node_modules/@work-graph/cli` and `node_modules/@work-graph/mcp`.
|
|
@@ -55,7 +57,7 @@ After `npm install`, the project owns its Work Graph runtime through `node_modul
|
|
|
55
57
|
|
|
56
58
|
| Command | Description |
|
|
57
59
|
|---------|-------------|
|
|
58
|
-
| `init [path]` | Scaffold Work Graph into a project: BVC intent tree, config, npm scripts, MCP
|
|
60
|
+
| `init [path]` | Scaffold Work Graph into a project: BVC intent tree, config, npm scripts, optional MCP/rule files |
|
|
59
61
|
| `ui [path]` | Start the local backlog UI for the project |
|
|
60
62
|
| `doctor [path]` | Verify that project config, package dependencies and runtime resolution are healthy |
|
|
61
63
|
| `register [path]` | Optional: register a project in the shared multiproject host |
|
|
@@ -116,7 +118,7 @@ The CLI installs the runtime and UI. The BVC format itself is published separate
|
|
|
116
118
|
| Symptom | Fix |
|
|
117
119
|
|---|---|
|
|
118
120
|
| `work-graph doctor` says dependencies are missing | Run `npm install` in the target project |
|
|
119
|
-
|
|
|
121
|
+
| Agent does not see Work Graph MCP tools | Re-run `npx @work-graph/cli init .` without `--no-mcp`, then reload MCP servers in your IDE |
|
|
120
122
|
| UI port is already in use | Run `npx @work-graph/cli ui . --port 4178` |
|
|
121
123
|
| Existing package scripts were not updated | Re-run without `--no-package` or add the `workgraph:*` scripts manually |
|
|
122
124
|
| You are hacking Work Graph itself | Use `WORKGRAPH_ENGINE_ROOT=.` or `--engine` from the monorepo, not in normal projects |
|
|
@@ -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.
|
|
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://
|
|
25
|
+
"homepage": "https://workgraph.ru/en/",
|
|
26
26
|
"keywords": [
|
|
27
27
|
"work-graph",
|
|
28
28
|
"backlog",
|
|
@@ -2,9 +2,13 @@
|
|
|
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
|
-
|
|
5
|
+
Website: [workgraph.ru/en](https://workgraph.ru/en/)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Works with any MCP-capable agent client (Cursor, Claude Desktop, Claude Code, and others).
|
|
8
|
+
|
|
9
|
+
## After `work-graph init`
|
|
10
|
+
|
|
11
|
+
`npx @work-graph/cli init .` writes `.cursor/mcp.json` when you use Cursor. The entry looks like:
|
|
8
12
|
|
|
9
13
|
```json
|
|
10
14
|
{
|
|
@@ -21,7 +25,7 @@ After `npx @work-graph/cli init .`, `.cursor/mcp.json` includes:
|
|
|
21
25
|
}
|
|
22
26
|
```
|
|
23
27
|
|
|
24
|
-
Reload MCP in
|
|
28
|
+
Reload MCP in your IDE after init. For Claude Desktop / Claude Code and other clients, use the same command and env — see [workgraph-mcp-clients.md](https://github.com/bvc-lang/work-graph/blob/main/docs/workgraph-mcp-clients.md) in the monorepo.
|
|
25
29
|
|
|
26
30
|
## Standalone
|
|
27
31
|
|
|
@@ -44,3 +48,9 @@ Requires a project with `.work-graph/config.json` (run `npx @work-graph/cli init
|
|
|
44
48
|
Resource: `workgraph://contract/{workId}`
|
|
45
49
|
|
|
46
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.
|
|
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.
|
|
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",
|
|
@@ -340,10 +340,10 @@ server.tool(
|
|
|
340
340
|
|
|
341
341
|
server.tool(
|
|
342
342
|
'record_work_item_analysis',
|
|
343
|
-
'Write pre-execution feasibility analysis into WorkItem «Анализ» (стоит ли делать; not post-factum review). Text must come from
|
|
343
|
+
'Write pre-execution feasibility analysis into WorkItem «Анализ» (стоит ли делать; not post-factum review). Text must come from the connected agent LLM — server does not call models.',
|
|
344
344
|
{
|
|
345
345
|
workId: z.string().describe('WorkItem id'),
|
|
346
|
-
analysis: z.string().describe('Full analysis text produced
|
|
346
|
+
analysis: z.string().describe('Full analysis text produced by the connected agent'),
|
|
347
347
|
},
|
|
348
348
|
async (args) => jsonText(await recordWorkItemAnalysisFromMcp(args, rootOptions())),
|
|
349
349
|
);
|
|
@@ -8,7 +8,7 @@ const TOOL_RULES = [
|
|
|
8
8
|
'New WorkItem prose (Базис/Вектор/Цель/Проверки/title): Russian, min lengths per work-item-bvc-quality; forbidden jargon: closing analysis, Canon:, evidence, upstream, Track A, feeds_epics, depends_on=, «Стоит завести «…» в бэклог».',
|
|
9
9
|
'Analysis is pre-execution only: feasibility (стоит ли делать), scope, deps, risks, alternatives — NOT a post-factum report of what was built, tests run, or evidence already in the atom.',
|
|
10
10
|
'Write analysis in present/decision tense («Стоит брать», «Не стоит», «Можно стартовать»), never past retrospective («было оправдано», «можно было») even if work.status is done.',
|
|
11
|
-
'Analysis and decision are written only from
|
|
11
|
+
'Analysis and decision are written only from the connected agent (MCP client LLM): you read the task, reason, then call record_work_item_analysis / record_work_item_decision. WorkGraph server never calls LLM.',
|
|
12
12
|
'Do not mark a WorkItem done without concrete evidence.',
|
|
13
13
|
'Keep dashboard/kanban work in WorkGraph UI; MCP is the agent client bridge.',
|
|
14
14
|
].join('\n');
|
|
@@ -26,7 +26,7 @@ export const workgraphPrompts = {
|
|
|
26
26
|
analyze_work_item: {
|
|
27
27
|
description: 'Pre-execution feasibility analysis for a WorkItem (not post-factum review).',
|
|
28
28
|
argsSchema: { workId: 'WorkItem id to analyze' },
|
|
29
|
-
text: ({ workId }) => `Analyze WorkGraph item ${workId || '<workId>'}
|
|
29
|
+
text: ({ workId }) => `Analyze WorkGraph item ${workId || '<workId>'} — **before execution** (pre-execution feasibility, not a post-mortem).
|
|
30
30
|
|
|
31
31
|
This is a feasibility review (стоит ли делать), NOT a summary of work already done. Do NOT list implemented files, passing tests, or evidence from «Свидетельства» unless you judge future verification risk.
|
|
32
32
|
|
|
@@ -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"><[</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">]></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: '
|
|
56
|
-
ru: '
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
body: 'Work Graph links intent, execution and memory into one
|
|
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
|
-
|
|
209
|
-
|
|
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,
|
|
384
|
-
{ title: copy.sections.evidenceTitle, body: copy.sections.evidenceBody,
|
|
385
|
-
{ title: copy.sections.
|
|
386
|
-
{ title: copy.sections.
|
|
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
|
-
|
|
391
|
-
description: copy.sections.productBody,
|
|
411
|
+
...pageMeta.product,
|
|
392
412
|
kind: 'product',
|
|
393
|
-
|
|
394
|
-
|
|
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
|
-
|
|
403
|
-
description: copy.sections.evidenceBody,
|
|
417
|
+
...pageMeta.evidence,
|
|
404
418
|
kind: 'evidence',
|
|
405
|
-
|
|
406
|
-
|
|
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
|
-
|
|
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
|
-
|
|
416
|
-
|
|
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
|
-
-
|
|
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
|