@rsconcept/rstool 1.4.3 → 1.5.0

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.
File without changes
@@ -86,6 +86,49 @@ card(S1) = card(Pr1,2(S1))
86
86
 
87
87
  Перед `D{x∈… | ∃d1∈… ∃d2∈…}` проверь, нельзя ли взять `Pr` от уже введенного отношения.
88
88
 
89
+ ## Терм-функция вместо множества пар
90
+
91
+ Частый антипаттерн: кодировать **вычисляемую зависимость** как множество пар
92
+
93
+ ```text
94
+ D1 ::= I{(ξ,σ) | ξ:∈S1; σ:=Expr(ξ)}
95
+ ```
96
+
97
+ а затем читать значение через `Pr2(Fi1[{α}](D1))` или `pr2(d)` при `d∈D1`.
98
+
99
+ Если для каждого допустимого `ξ` значение `σ` **однозначно задаётся** выражением, это не отношение, а **терм-функция**:
100
+
101
+ ```text
102
+ F1 ::= [ξ∈S1] Expr(ξ)
103
+ ```
104
+
105
+ Вызов: `F1[α]`. Потребители пишут `F1[…]`, а не проекции по графику.
106
+
107
+ ### Как переписывать
108
+
109
+ | Было (пары) | Стало (терм-функция) |
110
+ | -------------------------------------------------- | ----------------------- |
111
+ | `D1 ::= I{(ξ,σ) \| ξ:∈A; σ:=E(ξ)}` | `F1 ::= [ξ∈A] E(ξ)` |
112
+ | `Pr2(Fi1[{α}](D1))` | `F1[α]` |
113
+ | `∃d∈D1 (pr1(d)=α & … pr2(d) …)` | `… F1[α] …` |
114
+ | `D2 ::= I{(ξ,σ) \| ξ:∈A; σ:=G(Pr2(Fi1[{ξ}](D1)))}` | `F2 ::= [ξ∈A] G(F1[ξ])` |
115
+ | `∀d1,d2∈D1 (pr1(d1)=pr1(d2) ⇒ pr2(d1)=pr2(d2))` | не нужна для `F1` |
116
+
117
+ Термин формулируй как **результат при аргументе** («дети узла», «носители роли»), а не как «пары: узел и его дети», если пары больше нигде не нужны.
118
+
119
+ ### Цепочки `F#`
120
+
121
+ Строй зависимости вызовами, а не новыми графиками на каждом шаге:
122
+
123
+ ```text
124
+ F1 ::= [ξ∈X1] … — базовая характеристика
125
+ F2 ::= [ξ∈X1] H(F1[ξ]) — производная от F1
126
+ F3 ::= [ξ∈D1] F2[ξ]∩S2 — сужение на подкласс
127
+ D4 ::= I{F3[ξ] | ξ:∈D1} — только если нужно множество всех значений
128
+ ```
129
+
130
+ `D#` из значений функции уместен, когда предметно нужно **собрать** результаты (`I{F[ξ] | ξ:∈…}`, `red(…)`), а не когда снова кодируется «ξ и F[ξ]».
131
+
89
132
  ## Параметризованные определения и радикалы
90
133
 
91
134
  Терм-функция (`F#`) и предикат-функция (`P#`) могут быть шаблонными: одно формальное определение применяется к разным структурам через радикалы `R#` в доменах параметров (синтаксис — [SYNTAX.md](SYNTAX.md), раздел «Радикалы»).
@@ -94,3 +137,4 @@ card(S1) = card(Pr1,2(S1))
94
137
 
95
138
  - Если одна и та же конструкция нужна для нескольких родовых структур, предпочитай один параметризованный `F#` / `P#` с радикалами вместо дублирования определений.
96
139
  - Не добавляй в схему конституенту с `alias` `R1` (или другим `R#`) «для полноты» — это смешивает шаблон с предметной КС.
140
+ - Не путай шаблон с радикалами и обычную терм-функцию по предметному домену: для «вычислить характеристику элемента `X1`» достаточно `[ξ∈X1] …` без `R#`.
@@ -23,7 +23,7 @@
23
23
  - `constant` / `C#` — константное множество; формула пустая. С арифметикой и порядком; интерпретация в КМ. См. [BASE-SELECTION.md](BASE-SELECTION.md) (отличие от `X#` и встроенного `Z`).
24
24
  - `structure` / `S#` — родовая структура; `definitionFormal` задает область определения (типизацию).
25
25
  - `term` / `D#` — терм; формальное определение задает вычисляемое значение.
26
- - `function` / `F#` — терм-функция.
26
+ - `function` / `F#` — терм-функция. Для вычисляемой зависимости «аргумент → значение» предпочитай `F#` множеству пар.
27
27
  - `predicate` / `P#` — предикат-функция.
28
28
  - `axiom` / `A#` — аксиома; нужна типизация `Logic`.
29
29
  - `statement` / `T#` — высказывание; нужна типизация `Logic`.
package/docs/README.md CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  Краткая справка для агентов.
4
4
 
5
- **Воркфлоу и чеклисты** — в `../skills/rstool-helper/GUIDE.md` (начинай с него). Здесь — справочные правила языка и предметной области.
5
+ **Воркфлоу, матрица задач и чеклисты** — в `../skills/rstool-helper/GUIDE.md` (начинай с него: раздел «Задача → чтение»). Здесь — справочные правила языка и предметной области.
6
6
 
7
7
  ## Какой файл читать
8
8
 
9
9
  - **DOMAIN.md** — термины Portal: конституента, неопределяемые и производные понятия, ядро/тело КС, интерпретация, ОСС, синтез.
10
- - **CONCEPTUAL-SCHEMA.md** — проектирование и ревью концептуальных схем.
10
+ - **CONCEPTUAL-SCHEMA.md** — проектирование и ревью концептуальных схем (в т.ч. терм-функция вместо множества пар).
11
11
  - **CONSTITUENTA.md** — структура и правила конституент.
12
12
  - **BASE-SELECTION.md** — выбор основания: `X#`, `C#` или `Z`.
13
13
  - **SYNTAX.md** — синтаксис ЯРЭ: операторы, генераторы `D{}`/`I{}`/`R{}`, кванторы, `F#`/`P#`.
@@ -16,4 +16,4 @@
16
16
  - **DIAGNOSTICS.md** — диагностики анализа и способы исправления ошибок.
17
17
  - **PORTAL-API.md** — объекты REST API Portal.
18
18
 
19
- Контракт агента `rstool` и примеры — `../skills/rstool-helper/REFERENCE.md`, `EXAMPLES.md` (на русском, вместе с `GUIDE.md`).
19
+ Контракт агента `rstool` (library / stdio / MCP) и примеры — `../skills/rstool-helper/REFERENCE.md`, `EXAMPLES.md` (на русском, вместе с `GUIDE.md`).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsconcept/rstool",
3
- "version": "1.4.3",
3
+ "version": "1.5.0",
4
4
  "description": "Agent-facing library for incremental RSForm construction, RSLang analysis, diagnostics, modeling, and evaluation. Wraps @rsconcept/domain with a deterministic session contract.",
5
5
  "license": "MIT",
6
6
  "author": "IRBorisov",
@@ -50,21 +50,6 @@
50
50
  "README.md",
51
51
  "LICENSE"
52
52
  ],
53
- "dependencies": {
54
- "@rsconcept/domain": "2.0.2"
55
- },
56
- "devDependencies": {
57
- "@types/node": "^26.1.0",
58
- "@vitest/coverage-v8": "^4.1.9",
59
- "tsdown": "^0.22.3",
60
- "tsx": "^4.22.5",
61
- "typescript": "^6.0.3",
62
- "unrun": "^0.3.1",
63
- "vitest": "^4.1.9"
64
- },
65
- "publishConfig": {
66
- "access": "public"
67
- },
68
53
  "scripts": {
69
54
  "build": "tsdown",
70
55
  "typecheck": "tsc -p tsconfig.json --noEmit",
@@ -83,6 +68,22 @@
83
68
  "example:build-expression-bank-schema": "tsx examples/expression-bank/build-rsform.ts",
84
69
  "example:build-template-apply-schema": "tsx examples/template-apply/build-rsform.ts",
85
70
  "example:audit-diagnostics": "tsx examples/audit-diagnostics.ts",
86
- "kinship:cli": "tsx examples/kinship/cli.ts"
71
+ "kinship:cli": "tsx examples/kinship/cli.ts",
72
+ "prepublishOnly": "pnpm run build"
73
+ },
74
+ "dependencies": {
75
+ "@rsconcept/domain": "workspace:*"
76
+ },
77
+ "devDependencies": {
78
+ "@types/node": "^26.1.0",
79
+ "@vitest/coverage-v8": "^4.1.9",
80
+ "tsdown": "^0.22.3",
81
+ "tsx": "^4.22.5",
82
+ "typescript": "^6.0.3",
83
+ "unrun": "^0.3.1",
84
+ "vitest": "^4.1.9"
85
+ },
86
+ "publishConfig": {
87
+ "access": "public"
87
88
  }
88
- }
89
+ }
package/skills/README.md CHANGED
@@ -6,9 +6,9 @@ Each skill lives in its own subdirectory: `skills/<skill-name>/SKILL.md` (plus r
6
6
 
7
7
  - `INSTALL.md`: agent procedure after `npm install`
8
8
  - `rstool-helper/SKILL.md`: thin entry skill — copy into the project’s agent skills folder (see `INSTALL.md`)
9
- - `rstool-helper/GUIDE.md`: единая точка входа — воркфлоу, чеклисты, обзор языка (на русском)
10
- - `rstool-helper/REFERENCE.md`: API, stdio, контракт (на русском)
11
- - `rstool-helper/EXAMPLES.md`: примеры и типичные ошибки (на русском)
9
+ - `rstool-helper/GUIDE.md`: entry point — task→read matrix, workflows (incl. review), checklists (Russian)
10
+ - `rstool-helper/REFERENCE.md`: API, stdio, MCP names, response shapes, help map (Russian)
11
+ - `rstool-helper/EXAMPLES.md`: snippets, anti-patterns, diagnostics, `examples/` index (Russian)
12
12
  - `../docs/*.md`: language reference (DOMAIN, SYNTAX, DIAGNOSTICS, …)
13
13
 
14
14
  ## npm workflow
@@ -1,5 +1,22 @@
1
1
  # ЯРЭ и rstool — примеры
2
2
 
3
+ Короткие фрагменты для агентов. Воркфлоу — [GUIDE.md](GUIDE.md). Контракт — [REFERENCE.md](REFERENCE.md).
4
+
5
+ ## Индекс runnable `examples/`
6
+
7
+ Полные сценарии пакета:
8
+
9
+ | Тема | Паттерн | Смотри |
10
+ | ----------------------------------------------------- | ------------------------------------ | ------------------------------------------------- |
11
+ | [`sample/`](../../examples/sample/) | Минимальная КС + КМ | `X1`, `C1`, `S1`, `D1`, `A1` |
12
+ | [`kinship/`](../../examples/kinship/) | Предметная схема, модель, CLI | отношения на `X1`, правки интерпретации |
13
+ | [`chocolate-nim/`](../../examples/chocolate-nim/) | Математика на `Z` без `X#` | [BASE-SELECTION.md](../../docs/BASE-SELECTION.md) |
14
+ | [`movd/`](../../examples/movd/) | Сложные `S#`, мультипроекции, `Fi` | фильтры и проекции |
15
+ | [`expression-bank/`](../../examples/expression-bank/) | Шаблоны на радикалах `R#` | [SYNTAX.md](../../docs/SYNTAX.md) «Радикалы» |
16
+ | [`template-apply/`](../../examples/template-apply/) | Подстановка `R#` → предметные домены | применение шаблонов |
17
+
18
+ Запуск и структура папок — [examples/README.md](../../examples/README.md).
19
+
3
20
  ## Схема: batch patch
4
21
 
5
22
  ```ts
@@ -16,6 +33,159 @@ const result = tool.applySchemaPatch({
16
33
  console.log(result.summary.itemCount, result.success);
17
34
  ```
18
35
 
36
+ ## Терм-функция вместо множества пар
37
+
38
+ Правила — [CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md), раздел «Терм-функция вместо множества пар».
39
+
40
+ ### Было: граф и чтение через фильтр
41
+
42
+ ```ts
43
+ tool.applySchemaPatch({
44
+ items: [
45
+ { alias: 'X1', convention: 'узлы' },
46
+ { alias: 'S1', definitionFormal: 'ℬ(X1×X1)', convention: 'ориентированные рёбра' },
47
+ {
48
+ alias: 'D1',
49
+ term: 'узел и его исходящие рёбра',
50
+ definitionFormal: 'I{(ξ,σ) | ξ:∈X1; σ:=Pr2(Fi1[{ξ}](S1))}'
51
+ },
52
+ {
53
+ alias: 'D2',
54
+ term: 'узел и число исходящих рёбер',
55
+ definitionFormal: 'I{(ξ,n) | α:∈D1; ξ:=pr1(α); n:=card(pr2(α))}'
56
+ },
57
+ {
58
+ alias: 'A1',
59
+ term: 'функциональность графика D1',
60
+ definitionFormal: '∀d1,d2∈D1 (pr1(d1)=pr1(d2) ⇒ pr2(d1)=pr2(d2))'
61
+ }
62
+ ]
63
+ });
64
+ ```
65
+
66
+ Потребитель «степени» вынужден тащить пары и аксиому однозначности.
67
+
68
+ ### Стало: терм-функции и вызовы
69
+
70
+ ```ts
71
+ tool.applySchemaPatch({
72
+ items: [
73
+ { alias: 'X1', convention: 'узлы' },
74
+ { alias: 'S1', definitionFormal: 'ℬ(X1×X1)', convention: 'ориентированные рёбра' },
75
+ {
76
+ alias: 'F1',
77
+ term: 'исходящие соседи',
78
+ definitionFormal: '[ξ∈X1] Pr2(Fi1[{ξ}](S1))'
79
+ },
80
+ {
81
+ alias: 'F2',
82
+ term: 'исходящая степень',
83
+ definitionFormal: '[ξ∈X1] card(F1[ξ])'
84
+ },
85
+ {
86
+ alias: 'D3',
87
+ term: 'стоки',
88
+ definitionFormal: 'D{ξ∈X1 | F2[ξ]=0}'
89
+ }
90
+ ]
91
+ });
92
+ ```
93
+
94
+ `A1` не нужна: однозначность уже в `F1`/`F2`. Множество пар не вводится, пока оно само не станет предметом утверждения.
95
+
96
+ ### Когда пары уместны
97
+
98
+ Многозначная связь «документ — автор» — отношение; `F1` даёт **множество** авторов, а `D1` — отношение на документах:
99
+
100
+ ```ts
101
+ tool.applySchemaPatch({
102
+ items: [
103
+ { alias: 'X1', convention: 'документы' },
104
+ { alias: 'X2', convention: 'лица' },
105
+ { alias: 'S1', definitionFormal: 'ℬ(X1×X2)', convention: 'авторство' },
106
+ {
107
+ alias: 'F1',
108
+ term: 'авторы документа',
109
+ definitionFormal: '[δ∈X1] Pr2(Fi1[{δ}](S1))'
110
+ },
111
+ {
112
+ alias: 'D1',
113
+ term: 'соавторские пары документов',
114
+ definitionFormal: 'D{(a,b)∈X1×X1 | a≠b & F1[a]∩F1[b]≠∅}'
115
+ }
116
+ ]
117
+ });
118
+ ```
119
+
120
+ ## `D{}` / `I{}` / `R{}` — когда что
121
+
122
+ Синтаксис — [SYNTAX.md](../../docs/SYNTAX.md).
123
+
124
+ | Генератор | Когда | Пример |
125
+ | ---------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ |
126
+ | `D{ξ∈A \| P(ξ)}` | Отбор по условию без пошагового построения | `D{ξ∈X1 \| F2[ξ]=0}` |
127
+ | `I{… \| блоки;}` | Нужны промежуточные присваивания / сборка | `I{(ξ,n) \| α:∈D1; ξ:=pr1(α); n:=card(pr2(α))}` — лучше заменить на `F#`, если это функция |
128
+ | `R{x:=base \| cond \| next}` | Рекурсивное наращивание | обход / итерация по правилу |
129
+
130
+ Антипаттерн: `I{(ξ,σ) \| ξ:∈A; σ:=E(ξ)}` для однозначного `E` → пиши `F ::= [ξ∈A] E(ξ)`.
131
+
132
+ ## Конвенция: плохо / хорошо
133
+
134
+ У `X#` / `C#` / `S#` конвенция обязательна по смыслу (иначе `schemaMissingConvention`).
135
+
136
+ | Плохо | Хорошо |
137
+ | --------------------------------------------- | ----------------------------------------------------------------- |
138
+ | `convention: 'X1'` | `convention: 'сотрудники организации'` |
139
+ | `convention: 'отношение'` | `convention: 'ориентированные рёбра: пара (начало, конец)'` |
140
+ | пустая / копия термина без предметного смысла | кто элементы, как читать компоненты кортежа, какой порядок в паре |
141
+
142
+ Конвенция — предметный язык; она не заменяет формулу и не проверяется ЯРЭ.
143
+
144
+ ## Типичные диагностики (было → стало)
145
+
146
+ Полный справочник — [DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md). Исправляй диапазон `from`/`to` в формуле.
147
+
148
+ | `name` | Было | Стало |
149
+ | ------------------------------------------------- | -------------------------------------------------- | ---------------------------------------------------------------- |
150
+ | `typesNotEqual` | смешение ступеней в `∪` / `=` | выровняй типы или введи промежуточный терм |
151
+ | `globalNotTyped` | ссылка на ещё не введённый / нетипизированный `S1` | сначала поставщик в том же или предыдущем patch |
152
+ | `arithmeticNotSupported` / `orderingNotSupported` | `ξ+1` или `α<β` при `ξ∈X1` | `Z` или `C#` ([BASE-SELECTION.md](../../docs/BASE-SELECTION.md)) |
153
+ | `globalFuncParenCall` | `F1(ξ)` | `F1[ξ]` |
154
+ | `globalFuncWithoutArgs` | голое `F1` в формуле | `F1[…]` |
155
+ | `radicalUsage` | `R1` в теле формулы или как конституента | `R#` только в `[…]` у `F#`/`P#` |
156
+ | `schemaMissingConvention` | `X1` без конвенции | добавь предметную конвенцию |
157
+ | `schemaHomonym` | одинаковый термин у разных конституент | различай термины |
158
+ | `localOutOfScopeParentheses` | `∀a∈S P(a) & Q(a)` | `∀a∈S (P(a) & Q(a))` |
159
+ | `invalidFilterSyntax` | кривой `Fi` | `Fi1[{ξ}](S1)` / `Fi1,2[D1,D2](S1)` |
160
+
161
+ ```ts
162
+ const analysis = tool.analyzeExpression({
163
+ expression: 'F1(ξ)', // ошибка: скобки вызова
164
+ cstType: CstType.TERM
165
+ });
166
+ // смотри analysis.diagnostics[].name, from, to
167
+ ```
168
+
169
+ ## Scratch-проверка одной формулы
170
+
171
+ Без полной схемы задачи — минимальный стенд:
172
+
173
+ ```ts
174
+ const tool = new RSToolAgent();
175
+ tool.applySchemaPatch({
176
+ items: [
177
+ { alias: 'X1', convention: 'элементы' },
178
+ { alias: 'S1', definitionFormal: 'ℬ(X1×X1)', convention: 'рёбра' }
179
+ ]
180
+ });
181
+ const draft = tool.analyzeExpression({
182
+ expression: '[ξ∈X1] Pr2(Fi1[{ξ}](S1))',
183
+ cstType: CstType.FUNCTION
184
+ });
185
+ ```
186
+
187
+ Семантику значения — отдельная маленькая КМ ([MODEL-TESTING.md](../../docs/MODEL-TESTING.md)).
188
+
19
189
  ## `X#`, `C#` и `Z`
20
190
 
21
191
  Выбор основания — [BASE-SELECTION.md](../../docs/BASE-SELECTION.md).
@@ -66,7 +236,7 @@ const scratch = tool.evaluate({ expression: '1+2', cstType: CstType.TERM });
66
236
  const recalc = tool.recalculateModel();
67
237
  ```
68
238
 
69
- ## Экспорт / импорт
239
+ ## Экспорт / импорт и Portal round-trip
70
240
 
71
241
  ```ts
72
242
  const payload = tool.exportSession();
@@ -75,10 +245,30 @@ const restored = tool.importData(payload, 'session');
75
245
  const schemaJson = tool.exportPortal({ kind: 'schema' });
76
246
  const modelObj = tool.exportPortal({ kind: 'model', format: 'object' });
77
247
 
78
- // Portal GET /api/rsforms/:id/details
79
- const session = tool.importData(portalDetailsJsonString);
248
+ // Portal GET /api/rsforms/:id/details → строка или объект
249
+ const session = tool.importData(portalDetailsJsonString); // kind auto
250
+ tool.listDiagnostics();
251
+ // правки…
252
+ const forPortal = tool.exportPortal({ kind: 'schema' });
80
253
  ```
81
254
 
255
+ Не передавай `/details` с `kind: 'session'`. REST и curl — [PORTAL-API.md](../../docs/PORTAL-API.md).
256
+
257
+ ## Образец текста ревью (не код)
258
+
259
+ После [воркфлоу ревью](GUIDE.md#ревью--оценка-готовой-кс) ответ может выглядеть так:
260
+
261
+ > **Вердикт:** схема покрывает роли и отношение подчинения; главный риск — вычисляемая «степень» задана графиком пар вместо терм-функции.
262
+ >
263
+ > **Диагностики:** 0 ошибок expression; 1 предупреждение schema (омоним термина).
264
+ >
265
+ > **Важно:** `D4` — множество пар «сотрудник — число подчинённых»; лучше `F#` с `card`.
266
+ > **Замечание:** у `S2` конвенция слишком общая («связь»).
267
+ >
268
+ > **Покрытие:** сущности и иерархия есть; нет высказывания о единственности руководителя.
269
+ >
270
+ > **Рекомендации:** (1) заменить `D4` на `F#`; (2) уточнить конвенцию `S2`; (3) при необходимости добавить `T#`. Правки не применял — жду подтверждения.
271
+
82
272
  ## Stdio (плоские params)
83
273
 
84
274
  ```json
@@ -10,6 +10,7 @@
10
10
  - Анализатор: `@rsconcept/domain`.
11
11
  - Stdio-обёртка: `npx rstool-wrapper`, JSON построчно.
12
12
  - Node-клиент: `RSToolWrapperClient`.
13
+ - MCP: `@rsconcept/rstool-mcp` (tools в `snake_case` — [REFERENCE.md](REFERENCE.md)).
13
14
 
14
15
  ## Быстрый контракт для агента
15
16
 
@@ -20,6 +21,25 @@
20
21
  - Модель: `setModelValues`, `evaluate`, `recalculateModel`.
21
22
  - Перед сохранением сомнительной формулы — `analyzeExpression`.
22
23
 
24
+ ## Задача → чтение
25
+
26
+ Не открывай все `docs/` сразу. Выбери строку по запросу пользователя, прочитай **минимум**, остальное — только если упрёшься в пробел.
27
+
28
+ | Задача пользователя | Читать (минимум) | Не читать сразу |
29
+ | :------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------- |
30
+ | Собрать / существенно развить КС из текста | этот GUIDE → [концептуализация](#концептуализация-кс-из-содержания-источника); [CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md); [BASE-SELECTION.md](../../docs/BASE-SELECTION.md); при сомнении — [EXAMPLES.md](EXAMPLES.md) | PORTAL-API целиком; TYPIFICATION целиком |
31
+ | Оценить / отревьюить готовую КС (без запроса «перепиши») | этот GUIDE → [ревью / оценка](#ревью--оценка-готовой-кс); [чеклист ревью](#ревью-концептуальной-схемы); [CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md); при импорте — [PORTAL-API.md](../../docs/PORTAL-API.md) | EXAMPLES с batch patch; полный SYNTAX |
32
+ | Точечные правки существующей схемы | этот GUIDE → [редактирование](#редактирование-и-проверка-схемы); [REFERENCE.md](REFERENCE.md) при вызовах | CONCEPTUAL-SCHEMA целиком |
33
+ | Починить формулу / диагностики | этот GUIDE → [цикл диагностик](#цикл-диагностик); [DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md); [EXAMPLES.md](EXAMPLES.md) «типичные диагностики» | CONCEPTUAL-SCHEMA; PORTAL-API |
34
+ | Импорт / правка по ссылке Portal | этот GUIDE → [Portal](#оценка-или-правка-кс-из-portal); [PORTAL-API.md](../../docs/PORTAL-API.md) | SYNTAX; BASE-SELECTION |
35
+ | Проверить смысл на данных / КМ | этот GUIDE → [КМ](#проверка-на-маленькой-км); [MODEL-TESTING.md](../../docs/MODEL-TESTING.md) | DOMAIN/ОСС; CONCEPTUAL-SCHEMA |
36
+ | Объяснить синтаксис / генераторы / `F#`/`P#` | [SYNTAX.md](../../docs/SYNTAX.md); при необходимости [EXAMPLES.md](EXAMPLES.md) | воркфлоу сессий |
37
+ | Разобрать типизацию / ступени | [TYPIFICATION.md](../../docs/TYPIFICATION.md) | PORTAL-API |
38
+ | Вызовы API / stdio / MCP | [REFERENCE.md](REFERENCE.md) | docs языка |
39
+ | Термины КС, ядро/тело, не путать ярлыки | [DOMAIN.md](../../docs/DOMAIN.md) | — |
40
+
41
+ Полный индекс справочников — [ниже](#что-читать) и в [docs/README.md](../../docs/README.md).
42
+
23
43
  ## Границы правок: не трогай пакет rstool без запроса
24
44
 
25
45
  Задача по КС, Portal или источнику пользователя **не означает** правку дерева `rsconcept/rstool/`.
@@ -45,10 +65,10 @@ pnpm --filter @rsconcept/rstool exec tsx path/to/your/build-schema.ts
45
65
 
46
66
  Пути — относительно этого файла.
47
67
 
48
- - API, методы, stdio: [REFERENCE.md](REFERENCE.md).
49
- - Примеры: [EXAMPLES.md](EXAMPLES.md).
68
+ - API, методы, stdio, MCP: [REFERENCE.md](REFERENCE.md).
69
+ - Примеры и антипаттерны: [EXAMPLES.md](EXAMPLES.md).
50
70
  - Термины предметной области: [../../docs/DOMAIN.md](../../docs/DOMAIN.md).
51
- - **`X#` / `C#` / `Z`:** [../../docs/BASE-SELECTION.md](../../docs/BASE-SELECTION.md) — когда какое основание вводить.
71
+ - **`X#` / `C#` / `Z`:** [../../docs/BASE-SELECTION.md](../../docs/BASE-SELECTION.md).
52
72
  - Концептуализация, создание схемы: [../../docs/CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md).
53
73
  - Конституенты и валидация: [../../docs/CONSTITUENTA.md](../../docs/CONSTITUENTA.md).
54
74
  - Синтаксис ЯРЭ: [../../docs/SYNTAX.md](../../docs/SYNTAX.md).
@@ -56,7 +76,7 @@ pnpm --filter @rsconcept/rstool exec tsx path/to/your/build-schema.ts
56
76
  - Проверка определений на КМ: [../../docs/MODEL-TESTING.md](../../docs/MODEL-TESTING.md).
57
77
  - Диагностики: [../../docs/DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md).
58
78
  - REST Portal: [../../docs/PORTAL-API.md](../../docs/PORTAL-API.md).
59
- - Репозиторий Portal (исходники, API, nginx): [ConceptPortal на GitHub](https://github.com/IRBorisov/ConceptPortal).
79
+ - Репозиторий Portal: [ConceptPortal на GitHub](https://github.com/IRBorisov/ConceptPortal).
60
80
 
61
81
  ## Воркфлоу
62
82
 
@@ -86,6 +106,8 @@ pnpm --filter @rsconcept/rstool exec tsx path/to/your/build-schema.ts
86
106
  Portal JSON из `/details` не является форматом `exportSession`. Используй `importData(payload)` —
87
107
  kind `auto` (default) определит `portal-details` или `portal-schema`. Явный kind: `'portal-details'`, `'portal-schema'`, `'session'`.
88
108
 
109
+ Если задача — **оценка** схемы из Portal, а не правка: после импорта иди в [ревью / оценка](#ревью--оценка-готовой-кс), не начинай массовый refactor.
110
+
89
111
  ### Концептуализация (КС из содержания источника)
90
112
 
91
113
  Когда нужно построить или существенно развить КС по тексту ПО, требованиям или предметному описанию. Правила редукции, слоёв и паттернов — [CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md).
@@ -93,7 +115,7 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
93
115
  1. Собери словарь: неопределяемые понятия, ключевые отношения, сценарий синтеза.
94
116
  2. Добавь независимые неопределяемые понятия `X#`, `C#`, `S#` с конвенциями из источника (не копируй дословно). Для выбора `X#` vs `C#` vs `Z` — [BASE-SELECTION.md](../../docs/BASE-SELECTION.md).
95
117
  3. Всё, что выводится из уже введённых понятий, оформляй как `D#` / `F#` / `P#`, а не как новое `X#` / `C#` / `S#`.
96
- 4. Вводи промежуточные `D#`, `F#`, `P#` для проекций, функциональных связей и повторяющихся фрагментов формул.
118
+ 4. Вводи промежуточные `D#`, `F#`, `P#` для проекций, функциональных связей и повторяющихся фрагментов формул. Если зависимость имеет вид «для `ξ` вычислить значение», оформляй её как `F#`, а не как множество пар `I{(ξ,σ)|…}` ([CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md), «Терм-функция вместо множества пар»).
97
119
  5. Добавь `A#` и `T#` после терминов, на которые они опираются.
98
120
  6. Перед каждым patch — `analyzeExpression`; при ошибках — [цикл диагностик](#цикл-диагностик).
99
121
  7. Сомнительную семантику проверь на маленькой КМ ([цикл КМ](#проверка-на-маленькой-км), [MODEL-TESTING.md](../../docs/MODEL-TESTING.md)).
@@ -101,9 +123,30 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
101
123
 
102
124
  Дальше — обычное [редактирование и проверка](#редактирование-и-проверка-схемы): commit, export.
103
125
 
126
+ ### Ревью / оценка готовой КС
127
+
128
+ Когда пользователь просит **оценить**, **проревьюить**, **найти проблемы** в уже существующей схеме (сессия, JSON, ссылка Portal) — и **не** просит сразу переписать её.
129
+
130
+ **Правило:** без явного запроса на правку не делай массовый рефакторинг и не заменяй схему «улучшенной версией». Сначала отчёт; правки — только по согласованию или если пользователь сразу сказал «исправь».
131
+
132
+ 1. Загрузи схему: текущая сессия, `importData`, или Portal → [PORTAL-API.md](../../docs/PORTAL-API.md).
133
+ 2. `listDiagnostics()` — раздели `expression` / `schema` / `model`; зафиксируй ошибки и предупреждения.
134
+ 3. `getSessionState('summary')` — обзор состава; при необходимости `full` для формул.
135
+ 4. Структурный проход по [чеклисту ревью](#ревью-концептуальной-схемы) и [CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md):
136
+ - неопределяемые vs производные (`S#` там, где должно быть `D#`/`F#`/`P#`);
137
+ - `X#` / `C#` / `Z` ([BASE-SELECTION.md](../../docs/BASE-SELECTION.md));
138
+ - терм-функции vs множества пар;
139
+ - радикалы `R#` не объявлены конституентами;
140
+ - покрытие задачи vs избыточность.
141
+ 5. Severity в отчёте:
142
+ - **блокер** — диагностики `error`, схема не анализируется / ломает вычисление;
143
+ - **важно** — нарушение правил проектирования (лишнее `S#`, график вместо `F#`, смешение экспликаций);
144
+ - **замечание** — стиль, именование, возможные упрощения, пробелы покрытия.
145
+ 6. Ответ — по [шаблону ревью](#шаблон-ответа-ревью). Предлагай конкретные правки списком; применяй их только по запросу.
146
+
104
147
  ### Цикл диагностик
105
148
 
106
- Когда `analysis.success === false` или `listDiagnostics` не пуст. Коды и типичные ошибки — [DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md).
149
+ Когда `analysis.success === false` или `listDiagnostics` не пуст. Коды и типичные ошибки — [DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md); короткие «было → стало» — [EXAMPLES.md](EXAMPLES.md).
107
150
 
108
151
  1. Вызови `listDiagnostics()` — смотри `kind`: `expression` (формула), `schema` (омонимы, дубликаты, термин/конвенция), `model` (интерпретация).
109
152
  2. Для черновика формулы — `analyzeExpression` (без сохранения).
@@ -134,6 +177,10 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
134
177
 
135
178
  ## Формат ответа агента
136
179
 
180
+ Выбери шаблон по типу задачи. Не вставляй большой JSON в чат без запроса пользователя.
181
+
182
+ ### Сборка / правка схемы
183
+
137
184
  В конце работы сообщи:
138
185
 
139
186
  - что изменено в схеме или модели;
@@ -141,7 +188,28 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
141
188
  - какой экспорт получен: сессия / схема для Portal / модель для Portal;
142
189
  - какие проверки выполнены: анализ выражений / вычисление / пересчёт модели / тесты.
143
190
 
144
- Не вставляй большой JSON в чат без запроса пользователя.
191
+ ### Шаблон ответа: ревью
192
+
193
+ 1. **Краткий вердикт** (1–2 предложения): пригодна ли схема к задаче, главный риск.
194
+ 2. **Диагностики:** число ошибок / предупреждений по `expression` / `schema` / `model` (без полного JSON).
195
+ 3. **Находки** списком: блокер → важно → замечание; у каждой — имя конституенты и суть.
196
+ 4. **Покрытие:** что из задачи отражено; чего не хватает.
197
+ 5. **Рекомендации:** конкретные правки; не применяй их без запроса.
198
+ 6. **Проверки:** что уже сделано (import, listDiagnostics, выборочный анализ).
199
+
200
+ ### Шаблон ответа: диагностики
201
+
202
+ - какие конституенты / формулы затронуты;
203
+ - `name` диагностики и смысл простым языком;
204
+ - что изменено в формальном определении (или почему правка не нужна);
205
+ - повторная проверка: чисто / осталось.
206
+
207
+ ### Шаблон ответа: объяснение формулы
208
+
209
+ - роль конституенты и термин;
210
+ - формула как есть;
211
+ - по шагам: что вычисляется / утверждается;
212
+ - на какие понятия опирается; типизация.
145
213
 
146
214
  ### Язык ответа
147
215
 
@@ -187,7 +255,7 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
187
255
 
188
256
  ### Ревью концептуальной схемы
189
257
 
190
- Перед завершением концептуализации или крупного изменения. Правила — [CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md).
258
+ Перед завершением концептуализации, крупного изменения или как проход в [воркфлоу ревью](#ревью--оценка-готовой-кс). Правила — [CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md).
191
259
 
192
260
  - [ ] Атрибутивная и родоструктурная экспликации не смешаны без явного запроса.
193
261
  - [ ] Нет избыточной проверки принадлежности к собственной типизации (`x∈X1`, если `x` уже в `X1`).
@@ -196,5 +264,8 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
196
264
  - [ ] Покрыты главные сущности, роли, отношения, утверждения.
197
265
  - [ ] В текстовых определениях используются только понятия из схемы.
198
266
  - [ ] Повторяющиеся части формальных определений вынесены в производные понятия `D#` и `F#`.
267
+ - [ ] Вычисляемые зависимости «аргумент → значение» оформлены как `F#` с вызовами, а не как пары / тройки + `Pr`/`Fi` (см. [CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md), «Терм-функция вместо множества пар»).
268
+ - [ ] Пары / `I{(ξ,σ)|…}` оставлены только для истинных отношений, графиков как объектов или многозначных связей.
199
269
  - [ ] `R#` в `[…]` у `F#` / `P#` не считается пропущенной конституентой; радикалы не добавляют в схему как `X#` / `S#` / `D#`.
200
270
  - [ ] Сомнительная семантика проверена на маленькой КМ при наличии тестовых данных.
271
+ - [ ] При чистом ревью: отчёт по [шаблону](#шаблон-ответа-ревью) выдан **до** любых массовых правок.
@@ -1,34 +1,66 @@
1
1
  # ЯРЭ и rstool — справочник
2
2
 
3
+ Контракт library / stdio / MCP для агентов. Воркфлоу — [GUIDE.md](GUIDE.md). Примеры — [EXAMPLES.md](EXAMPLES.md). Язык — `docs/*.md`.
4
+
3
5
  ## Контракт rstool
4
6
 
5
7
  - Пакет: `@rsconcept/rstool`
6
8
  - Версия контракта: `3.0.0` (`CONTRACT_VERSION`)
7
9
  - Основной класс: `RSToolAgent`
8
10
  - Публичные импорты: `@rsconcept/rstool` и `@rsconcept/rstool/wrapper`
11
+ - Опции: `new RSToolAgent({ persistenceDir? })` — каталог для сохранения сессий между перезапусками (stdio/MCP: `RSTOOL_PERSISTENCE_DIR`)
12
+
13
+ Почти все методы принимают optional `sessionId` вторым аргументом (в stdio/MCP — поле `sessionId` в плоских `params`). Без него используется текущая сессия; при необходимости сессия создаётся лениво.
9
14
 
10
15
  ### Методы library API
11
16
 
12
- | Метод | Назначение |
13
- | ---------------------------------------------- | ------------------------------------------------------------------ |
14
- | `ensureSession(initial?)` | Вернуть текущую сессию или создать новую |
15
- | `createSession(initial?)` | Новая in-memory сессия |
16
- | `getCurrentSession()` | Текущая активная сессия или `null` |
17
- | `setCurrentSession(sessionId)` | Сделать сессию текущей |
18
- | `applySchemaPatch(input, sessionId?)` | Единственный путь правки схемы |
19
- | `getSessionState(detail?, sessionId?)` | `summary` (default) или `full` |
20
- | `listDiagnostics(filters?, sessionId?)` | Активные диагностики (`kind`: `expression` \| `schema` \| `model`) |
21
- | `analyzeExpression(input, sessionId?)` | Разбор без сохранения (`recordDiagnostics?`) |
22
- | `commitStep(message?, sessionId?)` | Ревизия |
23
- | `exportSession(sessionId?)` | JSON сессии |
24
- | `exportPortal({ kind, format? }, sessionId?)` | Portal Load from JSON |
25
- | `importData(payload, kind?)` | Импорт сессии / Portal (`kind` см. ниже) |
26
- | `setModelValues({ set?, clear? }, sessionId?)` | Значения модели (async — нужен `await`) |
27
- | `getModelState(sessionId?)` | Состояние интерпретации |
28
- | `evaluate(input, sessionId?)` | Scratch или конституента |
29
- | `recalculateModel(sessionId?)` | Пересчёт |
30
-
31
- ### `applySchemaPatch`
17
+ | Метод | Назначение |
18
+ | ---------------------------------------------- | ------------------------------------------- |
19
+ | `ensureSession(initial?)` | Вернуть текущую сессию или создать новую |
20
+ | `createSession(initial?)` | Новая in-memory сессия (становится текущей) |
21
+ | `getCurrentSession()` | Текущая активная сессия или `null` |
22
+ | `setCurrentSession(sessionId)` | Сделать сессию текущей |
23
+ | `applySchemaPatch(input, sessionId?)` | Единственный путь правки схемы |
24
+ | `getSessionState(detail?, sessionId?)` | `summary` (default) или `full` |
25
+ | `listDiagnostics(filters?, sessionId?)` | Активные диагностики |
26
+ | `analyzeExpression(input, sessionId?)` | Разбор без сохранения |
27
+ | `commitStep(message?, sessionId?)` | Ревизия |
28
+ | `exportSession(sessionId?)` | JSON-строка сессии |
29
+ | `exportPortal({ kind, format? }, sessionId?)` | Portal Load from JSON |
30
+ | `importData(payload, kind?)` | Импорт сессии / Portal |
31
+ | `setModelValues({ set?, clear? }, sessionId?)` | Значения модели (**async** — `await`) |
32
+ | `getModelState(sessionId?)` | Состояние интерпретации |
33
+ | `evaluate(input, sessionId?)` | Scratch или конституента |
34
+ | `recalculateModel(sessionId?)` | Пересчёт производных |
35
+
36
+ Служебные (stdio / MCP): `ping` / `pong`+`contractVersion`; `methods` / `list_methods`.
37
+
38
+ ### Library ↔ stdio ↔ MCP
39
+
40
+ Stdio использует **camelCase** имён методов (как library). MCP (`@rsconcept/rstool-mcp`) — **snake_case**. Params везде **плоские** (без обёртки `input`).
41
+
42
+ | Library / stdio | MCP tool |
43
+ | ------------------- | --------------------- |
44
+ | `ping` | `ping` |
45
+ | `methods` | `list_methods` |
46
+ | `ensureSession` | `ensure_session` |
47
+ | `createSession` | `create_session` |
48
+ | `getCurrentSession` | `get_current_session` |
49
+ | `setCurrentSession` | `set_current_session` |
50
+ | `applySchemaPatch` | `apply_schema_patch` |
51
+ | `getSessionState` | `get_session_state` |
52
+ | `listDiagnostics` | `list_diagnostics` |
53
+ | `analyzeExpression` | `analyze_expression` |
54
+ | `commitStep` | `commit_step` |
55
+ | `exportSession` | `export_session` |
56
+ | `exportPortal` | `export_portal` |
57
+ | `importData` | `import_data` |
58
+ | `setModelValues` | `set_model_values` |
59
+ | `getModelState` | `get_model_state` |
60
+ | `evaluate` | `evaluate` |
61
+ | `recalculateModel` | `recalculate_model` |
62
+
63
+ ## `applySchemaPatch`
32
64
 
33
65
  ```ts
34
66
  tool.applySchemaPatch({
@@ -38,23 +70,119 @@ tool.applySchemaPatch({
38
70
  });
39
71
  ```
40
72
 
41
- - `items` упорядочиваются автоматически: поставщики раньше потребителей.
42
- - `id` и `cstType` можно опускать — выводятся из префикса `alias` (`X/C/S/D/F/P/A/T/N`).
43
- - `mode`: `'atomic'` (default; откат всей пачки при первой ошибке) или `'best_effort'` (применяются корректные элементы).
44
- - `commitMessage` фиксирует ревизию после успешного patch.
73
+ **Вход**
74
+
75
+ | Поле | Смысл |
76
+ | ---------------- | ------------------------------------------------------------------------------------------------------------ |
77
+ | `items` | Массив патчей; у каждого обязателен `alias` |
78
+ | `initial?` | `alias` / `title` / `comment` — только если для patch создаётся новая сессия |
79
+ | `mode?` | `'atomic'` (default) — откат всей пачки при первой ошибке; `'best_effort'` — применяются корректные элементы |
80
+ | `commitMessage?` | После успешного patch фиксирует ревизию |
81
+
82
+ **Патч элемента:** `alias` обязателен; `id`, `cstType`, `definitionFormal`, `term`, `definitionText`, `convention` опциональны. `id` и `cstType` выводятся из префикса `alias` (`X/C/S/D/F/P/A/T/N`). Поля мержатся с существующей конституентой.
83
+
84
+ **Поведение:** `items` упорядочиваются автоматически (поставщики раньше потребителей).
85
+
86
+ **Результат:** `{ success, applied, failed, diagnostics, session, summary, revision? }`.
87
+
88
+ - `applied` — успешно применённые конституенты со `analysis`.
89
+ - `failed` — `{ draft, diagnostics }[]` (при `best_effort` или атомарном отказе).
90
+ - `summary` — компактный обзор сессии (см. ниже).
91
+ - `revision` — если был `commitMessage`.
92
+
93
+ Для крупных импортов с частичными ошибками формул предпочитай `mode: 'best_effort'`, затем правь оставшееся по `failed` / `listDiagnostics`.
94
+
95
+ ## `getSessionState`
96
+
97
+ - `getSessionState()` / `getSessionState('summary')` → `SessionSummary`:
98
+ - `sessionId`, `contractVersion`, `alias`, `title`, `comment`
99
+ - `itemCount`, `modelItemCount`, `diagnosticsCount`
100
+ - `items[]`: `{ id, alias, cstType, analysisSuccess }`
101
+ - `diagnostics[]` (активные)
102
+ - `lastRevision?`
103
+ - `getSessionState('full')` → полный `SessionState` (все конституенты с формулами, модель, ревизии). Для обзора агенту обычно хватает `summary`.
104
+
105
+ ## `listDiagnostics`
106
+
107
+ ```ts
108
+ tool.listDiagnostics();
109
+ tool.listDiagnostics({ kind: 'expression' });
110
+ tool.listDiagnostics({ kind: 'schema', constituentId: 3, severity: 'error' });
111
+ ```
112
+
113
+ Фильтры: `kind?: 'expression' | 'schema' | 'model'`, `constituentId?`, `severity?: 'error' | 'warning'`.
114
+
115
+ Элемент диагностики (агентский вид): `kind`, `code`, `name`, `severity`, `alias?`, `expression`, `from`, `to`, `params?`. Ключ для поиска исправления — `name` ([DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md)).
116
+
117
+ ## `analyzeExpression`
118
+
119
+ ```ts
120
+ tool.analyzeExpression({
121
+ expression: 'Pr1(S1)',
122
+ cstType: CstType.TERM,
123
+ recordDiagnostics: false // default
124
+ });
125
+ ```
126
+
127
+ **Вход:** `expression`, `cstType` (обязательны); `recordDiagnostics?` — писать ли диагностики в сессию (default `false`).
128
+
129
+ **Результат:** `{ success, type, valueClass, diagnostics }`. Не сохраняет конституенту. Для черновика формулы — до `applySchemaPatch`.
130
+
131
+ ## `evaluate`
132
+
133
+ Ровно один вариант входа:
134
+
135
+ - конституента: `{ constituentId }`
136
+ - scratch: `{ expression, cstType }`
137
+
138
+ **Результат:** `{ success, value, status, iterations, cacheHits, diagnostics }`.
139
+
140
+ `status` — статус вычисления КМ (`HAS_DATA`, `EMPTY`, `AXIOM_FALSE`, `EVAL_FAIL`, … — [DOMAIN.md](../../docs/DOMAIN.md)).
141
+
142
+ ## `setModelValues` / `getModelState` / `recalculateModel`
143
+
144
+ ```ts
145
+ await tool.setModelValues({
146
+ set: [{ target: 1, value: { 0: 'a', 1: 'b' } }],
147
+ clear: [3]
148
+ });
149
+ ```
150
+
151
+ - `set[]`: `{ target, value, type? }` — `target` = id конституенты; `type` обычно не нужен.
152
+ - `clear[]`: id для сброса значений.
153
+ - Метод **async**. После изменения данных пересчитываются диагностики модели.
154
+ - `getModelState()` → `{ items: [{ id, type, value }] }`.
155
+ - `recalculateModel()` → `{ items: [{ id, alias, value, status }] }`.
156
+
157
+ Формы `value` для `X#` / `S#` — [MODEL-TESTING.md](../../docs/MODEL-TESTING.md).
158
+
159
+ ## `importData` / `exportSession` / `exportPortal`
45
160
 
46
161
  ### `importData(payload, kind?)`
47
162
 
48
- `kind`: `'auto'` (default; определяет формат по содержимому), `'session'`, `'portal-details'` (ответ `GET /api/rsforms/:id/details`), `'portal-schema'` (Portal Load from JSON). После импорта новая сессия становится текущей.
163
+ `kind`: `'auto'` (default), `'session'`, `'portal-details'` (`GET /api/rsforms/:id/details`), `'portal-schema'` (Portal Load from JSON). После импорта новая сессия становится текущей. Возвращает `SessionHandle`.
164
+
165
+ Portal JSON из `/details` **не** является `exportSession` — не передавай его с `kind: 'session'`.
49
166
 
50
- ### Протокол stdio
167
+ ### `exportSession()`
51
168
 
52
- Плоские `params` (без `input`). Опционально: переменная окружения `RSTOOL_PERSISTENCE_DIR` — каталог для сохранения сессий между перезапусками обёртки (в library API — `new RSToolAgent({ persistenceDir })`).
169
+ JSON-строка сессии для последующего `importData(..., 'session')`.
53
170
 
54
- Служебные методы:
171
+ ### `exportPortal({ kind, format? })`
55
172
 
56
- - `ping` — liveness и `contractVersion`.
57
- - `methods` — список доступных stdio-методов.
173
+ - `kind`: `'schema'` | `'model'`
174
+ - `format?`: `'json'` (default, строка) | `'object'`
175
+ - Для загрузки в Portal UI: обычно `exportPortal({ kind: 'schema' })`.
176
+
177
+ ## `commitStep` / сессии
178
+
179
+ - `commitStep(message?)` → `{ revisionId, at, message? }`.
180
+ - `ensureSession` / `createSession` принимают optional `initial`: `alias`, `title`, `comment` (и прочие поля `SessionState` в library).
181
+ - `SessionHandle`: `{ sessionId, contractVersion }`.
182
+
183
+ ## Протокол stdio
184
+
185
+ Плоские `params`. Переменная окружения `RSTOOL_PERSISTENCE_DIR` — каталог персистентности.
58
186
 
59
187
  ```json
60
188
  {"id":"2","method":"applySchemaPatch","params":{"items":[{"alias":"X1"}]}}
@@ -62,8 +190,23 @@ tool.applySchemaPatch({
62
190
  {"id":"8","method":"evaluate","params":{"constituentId":3}}
63
191
  {"id":"9","method":"exportPortal","params":{"kind":"schema"}}
64
192
  {"id":"10","method":"importData","params":{"payload":"..."}}
193
+ {"id":"11","method":"getSessionState","params":{"detail":"summary"}}
65
194
  ```
66
195
 
67
- ## Документация
68
-
69
- Воркфлоу: `GUIDE.md`. Примеры: `EXAMPLES.md`. Язык: `docs/*.md`.
196
+ ## Help map: ошибка → документ
197
+
198
+ | Ситуация | Куда |
199
+ | -------------------------------------------------- | ------------------------------------------------------- |
200
+ | Код / `name` диагностики | [DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md) |
201
+ | Синтаксис операторов, `D{}`/`I{}`/`R{}`, `F#`/`P#` | [SYNTAX.md](../../docs/SYNTAX.md) |
202
+ | Ступени, `AnalysisResult.type` | [TYPIFICATION.md](../../docs/TYPIFICATION.md) |
203
+ | `X#` vs `C#` vs `Z`, переносимость | [BASE-SELECTION.md](../../docs/BASE-SELECTION.md) |
204
+ | Проектирование, `F#` vs пары, ревью | [CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md) |
205
+ | Поля и валидация конституенты | [CONSTITUENTA.md](../../docs/CONSTITUENTA.md) |
206
+ | Формы значений КМ, тесты | [MODEL-TESTING.md](../../docs/MODEL-TESTING.md) |
207
+ | Ссылка Portal, REST, curl | [PORTAL-API.md](../../docs/PORTAL-API.md) |
208
+ | Термины, статусы, «не путать» | [DOMAIN.md](../../docs/DOMAIN.md) |
209
+ | Воркфлоу агента | [GUIDE.md](GUIDE.md) |
210
+ | Сниппеты и антипаттерны | [EXAMPLES.md](EXAMPLES.md) |
211
+
212
+ Исходники кодов ошибок ЯРЭ: `@rsconcept/domain` (`RSErrorCode`, `error.ts`). Не дублируй грамматику в skill — правь domain и при необходимости этот help map.
@@ -1,7 +1,9 @@
1
1
  ---
2
2
  name: rstool-helper
3
3
  description: >-
4
- ЯРЭ (язык родоструктурной экспликации), формальные определения и проектирование концептуальных схем для агентов. Читай GUIDE и docs из node_modules.
4
+ ЯРЭ и концептуальные схемы через rstool: концептуализация, ревью/оценка КС,
5
+ правки и диагностики формул, проверка на КМ (evaluate), выбор X#/C#/Z,
6
+ импорт/экспорт Portal (/rsforms, /details). Читай GUIDE и docs из node_modules.
5
7
  ---
6
8
 
7
9
  # rstool-helper
@@ -16,15 +18,32 @@ description: >-
16
18
 
17
19
  Затем продолжай с каноническими файлами ниже.
18
20
 
19
- ## Канонические файлы (читать перед работой с rstool)
21
+ ## Канонические файлы
20
22
 
21
- - **Начни здесь** — воркфлоу и чеклисты: `node_modules/@rsconcept/rstool/skills/rstool-helper/GUIDE.md`
22
- - API, stdio, контракт: `node_modules/@rsconcept/rstool/skills/rstool-helper/REFERENCE.md`
23
- - Примеры, типичные ошибки: `node_modules/@rsconcept/rstool/skills/rstool-helper/EXAMPLES.md`
24
- - Язык и предметная область: `node_modules/@rsconcept/rstool/docs/*.md`
25
- - Процедура установки: `node_modules/@rsconcept/rstool/skills/INSTALL.md`
23
+ Префикс путей: `node_modules/@rsconcept/rstool/`.
26
24
 
27
- Перед началом задачи rstool всегда открывай **GUIDE.md**, затем по необходимости **REFERENCE.md** / **EXAMPLES.md** / нужные `docs/*.md`.
25
+ | Что | Путь |
26
+ | :-------------------------------------------------- | :---------------------------------- |
27
+ | **Начни здесь** — матрица задач, воркфлоу, чеклисты | `skills/rstool-helper/GUIDE.md` |
28
+ | API, stdio, MCP, контракт | `skills/rstool-helper/REFERENCE.md` |
29
+ | Примеры, антипаттерны | `skills/rstool-helper/EXAMPLES.md` |
30
+ | Язык и предметная область | `docs/*.md` |
31
+ | Установка skill | `skills/INSTALL.md` |
32
+
33
+ ## Задача → что читать
34
+
35
+ Не читай все `docs/` подряд. Открой **GUIDE.md** (раздел «Задача → чтение»), затем только нужные файлы:
36
+
37
+ | Задача | Минимум |
38
+ | :-------------------------------- | :----------------------------------------------------------------------------- |
39
+ | Собрать / развить КС из текста | GUIDE: концептуализация; `docs/CONCEPTUAL-SCHEMA.md`; `docs/BASE-SELECTION.md` |
40
+ | Оценить / отревьюить готовую КС | GUIDE: ревью; чеклист ревью; `docs/CONCEPTUAL-SCHEMA.md` |
41
+ | Починить формулу / диагностики | GUIDE: цикл диагностик; `docs/DIAGNOSTICS.md` |
42
+ | Импорт / правка по ссылке Portal | GUIDE: Portal; `docs/PORTAL-API.md` |
43
+ | Проверить смысл на данных | GUIDE: КМ; `docs/MODEL-TESTING.md` |
44
+ | Синтаксис / типизация / вызов API | `docs/SYNTAX.md` / `TYPIFICATION.md` / `REFERENCE.md` |
45
+
46
+ Перед работой всегда открой **GUIDE.md**; остальное — по строке таблицы.
28
47
 
29
48
  ## Не правь пакет rstool без запроса
30
49
 
@@ -41,4 +60,5 @@ REST API и curl — `node_modules/@rsconcept/rstool/docs/PORTAL-API.md`.
41
60
  ## Кратко
42
61
 
43
62
  - Пакет: `@rsconcept/rstool`; обёртка: `npx rstool-wrapper`
63
+ - MCP: `@rsconcept/rstool-mcp` (имена tools — `snake_case`, см. REFERENCE)
44
64
  - `@rsconcept/domain` устанавливается как зависимость (анализатор и коды ошибок)