@rsconcept/rstool 1.4.2 → 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.
- package/dist/wrapper/stdio-wrapper.js +0 -0
- package/docs/BASE-SELECTION.md +2 -2
- package/docs/CONCEPTUAL-SCHEMA.md +44 -0
- package/docs/CONSTITUENTA.md +1 -1
- package/docs/DIAGNOSTICS.md +24 -24
- package/docs/DOMAIN.md +5 -5
- package/docs/PORTAL-API.md +2 -2
- package/docs/README.md +4 -4
- package/docs/SYNTAX.md +1 -1
- package/package.json +19 -18
- package/skills/README.md +3 -3
- package/skills/rstool-helper/EXAMPLES.md +194 -4
- package/skills/rstool-helper/GUIDE.md +83 -12
- package/skills/rstool-helper/REFERENCE.md +177 -34
- package/skills/rstool-helper/SKILL.md +28 -8
|
File without changes
|
package/docs/BASE-SELECTION.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
| :---------------------------------------------------------------------- | :---- | :--------------------------------------------------------------------------- |
|
|
9
9
|
| Предметные объекты без числового смысла: люди, документы, ситуации | `X#` | Элементы задаются интерпретацией и различаются только как элементы множества |
|
|
10
10
|
| Конечный именованный набор, где в формулах нужны порядок или арифметика | `C#` | Элементы интерпретируются в КМ, но поддерживают сравнение и арифметику языка |
|
|
11
|
-
| Чистые целые: размеры, счётчики, индексы, `card`, рекурсия над числами | `Z` | Это встроенная ступень
|
|
11
|
+
| Чистые целые: размеры, счётчики, индексы, `card`, рекурсия над числами | `Z` | Это встроенная ступень ЯРЭ; отдельная конституента не нужна |
|
|
12
12
|
|
|
13
13
|
```text
|
|
14
14
|
Нужно неопределяемое понятие?
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
2. Если формула «узнаёт» конкретные элементы базисного множества по способу, не заданному в схеме (скрытый порядок, кодирование атрибута константами) — вероятное нарушение переносимости или лишняя конституента.
|
|
39
39
|
3. Перед сохранением сомнительной формулы — `analyzeExpression`.
|
|
40
40
|
|
|
41
|
-
**Иллюстрация (родство):** при `X1 = {alice, bob, carol}` биективная замена на `{p1, p2, p3}` не меняет, кто чей родитель в `S1: ℬ(X1×X1)`, если пары переименованы согласованно. Формула `∀a,b∈X1 a < b` некорректна — порядок на людях в
|
|
41
|
+
**Иллюстрация (родство):** при `X1 = {alice, bob, carol}` биективная замена на `{p1, p2, p3}` не меняет, кто чей родитель в `S1: ℬ(X1×X1)`, если пары переименованы согласованно. Формула `∀a,b∈X1 a < b` некорректна — порядок на людях в ЯРЭ не задан.
|
|
42
42
|
|
|
43
43
|
## Детали по вариантам
|
|
44
44
|
|
|
@@ -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#`.
|
package/docs/CONSTITUENTA.md
CHANGED
|
@@ -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/DIAGNOSTICS.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Диагностика
|
|
2
2
|
|
|
3
3
|
Читай, когда `analyzeExpression`, `applySchemaPatch`, `listDiagnostics` или `evaluate`
|
|
4
|
-
вернули диагностику. Коды ошибок
|
|
4
|
+
вернули диагностику. Коды ошибок ЯРЭ — `RSErrorCode` в `@rsconcept/domain`; коды схемы
|
|
5
5
|
и модели — `RSDiagnosticCode` в том же пакете (числовой формат совпадает).
|
|
6
6
|
|
|
7
7
|
## Формы диагностики
|
|
@@ -80,29 +80,29 @@
|
|
|
80
80
|
|
|
81
81
|
## Parser
|
|
82
82
|
|
|
83
|
-
| Код | Имя | `params` | Исправление
|
|
84
|
-
| -------- | -------------------------- | ------------------------- |
|
|
85
|
-
| `0x8400` | `unknownSyntax` | — | Неопределённая синтаксическая ошибка: проверь операторы, скобки, идентификаторы.
|
|
86
|
-
| `0x8401` | `forbiddenCharacter` | `[character]` | Символ не входит в
|
|
87
|
-
| `0x8409` | `bracketMismatch` | `[expected, actual]` | Закрой ожидаемой скобкой `expected` вместо `actual`.
|
|
88
|
-
| `0x840A` | `doubleParenthesis` | — | Убери лишнюю внешнюю пару `(( … ))`.
|
|
89
|
-
| `0x840B` | `missingOpenBracket` | `[bracket]` | Непарная закрывающая `bracket`: убери её или добавь открывающую.
|
|
90
|
-
| `0x840C` | `missingCloseBracket` | `[bracket]` | Непарная открывающая `bracket`: убери её или добавь закрывающую.
|
|
91
|
-
| `0x8415` | `expectedLocal` | — | Ожидалось имя локальной переменной.
|
|
92
|
-
| `0x8416` | `expectedType` | `[expectedClass, actual]` | Несоответствие класса выражения ожидаемому.
|
|
93
|
-
| `0x8417` | `invalidFilterSyntax` | — | Синтаксис `Fi`: `Fi1[D1](S1)`, `Fi1,2[D1,D2](S1)` или `Fi1,2[D3](S1)`.
|
|
94
|
-
| `0x8418` | `expectedFunctionBody` | — | Нужно тело функции после `[параметры]`.
|
|
95
|
-
| `0x8419` | `expectedExpressionBody` | — | Нужно теоретико-множественное тело функции (ТФ).
|
|
96
|
-
| `0x841A` | `expectedLogicBody` | — | Нужно логическое тело функции.
|
|
97
|
-
| `0x841B` | `expectedQuantifierBody` | — | Нужно логическое тело после `∀(∃)…∈домен`.
|
|
98
|
-
| `0x841C` | `expectedDeclarativeBody` | — | Допиши декларативное `D{…∈… \| …}`.
|
|
99
|
-
| `0x841D` | `expectedImperativeBody` | — | Допиши императивное `I{… \| …}`.
|
|
100
|
-
| `0x841E` | `expectedRecursiveBody` | — | Допиши рекурсивное `R{…:=… \| … \| …}`.
|
|
101
|
-
| `0x841F` | `expectedQuantifierDomain` | — | После переменной квантора нужны `∈` и домен.
|
|
102
|
-
| `0x8420` | `expectedRightOperand` | — | Нужен правый операнд после оператора.
|
|
103
|
-
| `0x8421` | `expectedUnaryOperand` | — | Нужно выражение после `¬`.
|
|
104
|
-
| `0x8422` | `globalFuncParenCall` | `[name]` | Вызов `F`/`P` только через `[…]`, не `(…)`.
|
|
105
|
-
| `0x8423` | `expectedArgument` | — | Нужен аргумент в списке `[…]` у F/P.
|
|
83
|
+
| Код | Имя | `params` | Исправление |
|
|
84
|
+
| -------- | -------------------------- | ------------------------- | -------------------------------------------------------------------------------- |
|
|
85
|
+
| `0x8400` | `unknownSyntax` | — | Неопределённая синтаксическая ошибка: проверь операторы, скобки, идентификаторы. |
|
|
86
|
+
| `0x8401` | `forbiddenCharacter` | `[character]` | Символ не входит в ЯРЭ (напр. `^` для степени). Удали или замени его. |
|
|
87
|
+
| `0x8409` | `bracketMismatch` | `[expected, actual]` | Закрой ожидаемой скобкой `expected` вместо `actual`. |
|
|
88
|
+
| `0x840A` | `doubleParenthesis` | — | Убери лишнюю внешнюю пару `(( … ))`. |
|
|
89
|
+
| `0x840B` | `missingOpenBracket` | `[bracket]` | Непарная закрывающая `bracket`: убери её или добавь открывающую. |
|
|
90
|
+
| `0x840C` | `missingCloseBracket` | `[bracket]` | Непарная открывающая `bracket`: убери её или добавь закрывающую. |
|
|
91
|
+
| `0x8415` | `expectedLocal` | — | Ожидалось имя локальной переменной. |
|
|
92
|
+
| `0x8416` | `expectedType` | `[expectedClass, actual]` | Несоответствие класса выражения ожидаемому. |
|
|
93
|
+
| `0x8417` | `invalidFilterSyntax` | — | Синтаксис `Fi`: `Fi1[D1](S1)`, `Fi1,2[D1,D2](S1)` или `Fi1,2[D3](S1)`. |
|
|
94
|
+
| `0x8418` | `expectedFunctionBody` | — | Нужно тело функции после `[параметры]`. |
|
|
95
|
+
| `0x8419` | `expectedExpressionBody` | — | Нужно теоретико-множественное тело функции (ТФ). |
|
|
96
|
+
| `0x841A` | `expectedLogicBody` | — | Нужно логическое тело функции. |
|
|
97
|
+
| `0x841B` | `expectedQuantifierBody` | — | Нужно логическое тело после `∀(∃)…∈домен`. |
|
|
98
|
+
| `0x841C` | `expectedDeclarativeBody` | — | Допиши декларативное `D{…∈… \| …}`. |
|
|
99
|
+
| `0x841D` | `expectedImperativeBody` | — | Допиши императивное `I{… \| …}`. |
|
|
100
|
+
| `0x841E` | `expectedRecursiveBody` | — | Допиши рекурсивное `R{…:=… \| … \| …}`. |
|
|
101
|
+
| `0x841F` | `expectedQuantifierDomain` | — | После переменной квантора нужны `∈` и домен. |
|
|
102
|
+
| `0x8420` | `expectedRightOperand` | — | Нужен правый операнд после оператора. |
|
|
103
|
+
| `0x8421` | `expectedUnaryOperand` | — | Нужно выражение после `¬`. |
|
|
104
|
+
| `0x8422` | `globalFuncParenCall` | `[name]` | Вызов `F`/`P` только через `[…]`, не `(…)`. |
|
|
105
|
+
| `0x8423` | `expectedArgument` | — | Нужен аргумент в списке `[…]` у F/P. |
|
|
106
106
|
|
|
107
107
|
## Предупреждения
|
|
108
108
|
|
package/docs/DOMAIN.md
CHANGED
|
@@ -8,19 +8,19 @@
|
|
|
8
8
|
- **Концептуальная схема (`КС`)** — система понятий, утверждений и связей между ними.
|
|
9
9
|
- **Концептуальная модель (`КМ`)** — КС плюс интерпретация ее понятий на конечных данных.
|
|
10
10
|
- **Операционная схема синтеза (`ОСС`)** — граф загрузок и синтезов КС.
|
|
11
|
-
-
|
|
11
|
+
- **ЯРЭ** (язык родоструктурной экспликации) — формальный язык для понятий, отношений, операций и утверждений.
|
|
12
12
|
- **Типизация / ступень** — структура значений выражения: элемент, целое, кортеж, множество, `Logic`.
|
|
13
13
|
- **Граф термов** — зависимости: конституента ссылается на другую в формальном определении.
|
|
14
14
|
|
|
15
15
|
## Классификация понятий КС
|
|
16
16
|
|
|
17
17
|
- **Неопределяемое понятие** — конституента, вводимая конвенцией (и при необходимости аксиомами), а не формальным определением. В родоструктурной экспликации: `X#`, `C#`, `S#`. Смысл задают `convention`, интерпретация и аксиомы.
|
|
18
|
-
- **Производное понятие** — конституента с формальным определением на
|
|
18
|
+
- **Производное понятие** — конституента с формальным определением на ЯРЭ: `D#`, `F#`, `P#` и связанные выводимые конструкции. Значение получают из определения при заданной интерпретации неопределяемых понятий.
|
|
19
19
|
- **Ядро КС** — неопределяемые понятия, аксиомы и производные понятия, необходимые для их формулировки.
|
|
20
20
|
- **Тело КС** — остальные конституенты схемы, не входящие в ядро.
|
|
21
|
-
- **Конвенция** — текстовое соглашение о том, как неопределяемое понятие соотносится с сущностями предметной области. В данных схемы хранится в поле `convention` конституенты. Конвенция не заменяет формальное определение и не проходит формальную проверку
|
|
21
|
+
- **Конвенция** — текстовое соглашение о том, как неопределяемое понятие соотносится с сущностями предметной области. В данных схемы хранится в поле `convention` конституенты. Конвенция не заменяет формальное определение и не проходит формальную проверку ЯРЭ. Она фиксирует предметный смысл, который нельзя вывести из формулы: что именно считается элементом множества, как читать компоненты кортежа, какой порядок в паре отношения, какие константы или операции подразумеваются. В конвенции используется предметный язык и термины, которые могут быть не выражены в концептуальной схеме.
|
|
22
22
|
- **Интерпретация** — соотнесение понятий КС с сущностями предметной области. В концептуальной модели задаётся значениями неопределяемых конституент и вычислением производных.
|
|
23
|
-
- **Биективная переносимость** — независимость значения формального определения от биективной замены интерпретаций неопределяемых понятий. Для `X#` опирается на несравнимость элементов; анализатор
|
|
23
|
+
- **Биективная переносимость** — независимость значения формального определения от биективной замены интерпретаций неопределяемых понятий. Для `X#` опирается на несравнимость элементов; анализатор ЯРЭ отсекает формулы, нарушающие переносимость.
|
|
24
24
|
|
|
25
25
|
## Конституенты
|
|
26
26
|
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
| `A#` | **Аксиома**: логическое требование к модели |
|
|
39
39
|
| `T#` | **Высказывание**: логическое утверждение о модели |
|
|
40
40
|
|
|
41
|
-
`Z` — встроенная ступень целых в
|
|
41
|
+
`Z` — встроенная ступень целых в ЯРЭ, **не конституента**. Для выбора между `X#`, `C#` и `Z` — [BASE-SELECTION.md](BASE-SELECTION.md).
|
|
42
42
|
|
|
43
43
|
`R#` — **радикал**, шаблонная ступень в доменах параметров `F#` / `P#`. Это тоже **не конституента**: в схеме нет записи с `alias` `R1`, `R2`, … и добавлять её не нужно ([SYNTAX.md](SYNTAX.md), раздел «Радикалы»).
|
|
44
44
|
|
package/docs/PORTAL-API.md
CHANGED
|
@@ -202,7 +202,7 @@ curl.exe -s "https://api.portal.acconcept.ru/api/rsforms/856/details"
|
|
|
202
202
|
| `crucial` | обычно не переносить | UI/Portal-флаг |
|
|
203
203
|
| `value_is_property` | обычно не переносить | Переопределение класса интерпретируемости |
|
|
204
204
|
|
|
205
|
-
`inheritance`, `attribution`, `oss`, `models`, `versions`, `editors` полезны для контекста Portal, но не нужны для базовой проверки
|
|
205
|
+
`inheritance`, `attribution`, `oss`, `models`, `versions`, `editors` полезны для контекста Portal, но не нужны для базовой проверки ЯРЭ в `rstool`.
|
|
206
206
|
|
|
207
207
|
## Как перенести КС в rstool
|
|
208
208
|
|
|
@@ -265,7 +265,7 @@ tool.applySchemaPatch(
|
|
|
265
265
|
**до** следующего шага пайплайна (например вызова `npx tsx`), скрипт оборвётся и артефакт
|
|
266
266
|
не обновится.
|
|
267
267
|
|
|
268
|
-
- **Запись JSON** — всегда UTF-8; для
|
|
268
|
+
- **Запись JSON** — всегда UTF-8; для символов ЯРЭ в формулах не экранируй Unicode в JSON:
|
|
269
269
|
|
|
270
270
|
```python
|
|
271
271
|
path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding='utf-8')
|
package/docs/README.md
CHANGED
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
Краткая справка для агентов.
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
- **SYNTAX.md** — синтаксис
|
|
13
|
+
- **SYNTAX.md** — синтаксис ЯРЭ: операторы, генераторы `D{}`/`I{}`/`R{}`, кванторы, `F#`/`P#`.
|
|
14
14
|
- **TYPIFICATION.md** — типизация (`AnalysisResult.type`, `valueClass`).
|
|
15
15
|
- **MODEL-TESTING.md** — проверка семантики определений на маленьких концептуальных моделях.
|
|
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/docs/SYNTAX.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsconcept/rstool",
|
|
3
|
-
"version": "1.
|
|
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,4 +1,21 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ЯРЭ и rstool — примеры
|
|
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).
|
|
2
19
|
|
|
3
20
|
## Схема: batch patch
|
|
4
21
|
|
|
@@ -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
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ЯРЭ и rstool
|
|
2
2
|
|
|
3
3
|
Краткий входной гайд для агентов. Детали — в связанных документах.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**ЯРЭ** (язык родоструктурной экспликации) — формальная нотация концептуальных схем: понятия, отношения, операции, утверждения. Основа: принадлежность `x∈y`, теоретико-множественные и логические выражения, типизация.
|
|
6
6
|
|
|
7
7
|
**rstool** — API агента для сессий, редактирования схемы, анализа, диагностик, значений модели, вычисления, экспорта/импорта.
|
|
8
8
|
|
|
@@ -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,18 +65,18 @@ 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
|
-
-
|
|
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).
|
|
55
75
|
- Типизация: [../../docs/TYPIFICATION.md](../../docs/TYPIFICATION.md).
|
|
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
|
|
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
|
-
|
|
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
|
|
|
@@ -166,7 +234,7 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
|
|
|
166
234
|
| `importData` | импорт данных |
|
|
167
235
|
| session, `sessionId` | сессия |
|
|
168
236
|
|
|
169
|
-
Имена конституент (`X1`, `S2`, `D3`) и формулы
|
|
237
|
+
Имена конституент (`X1`, `S2`, `D3`) и формулы ЯРЭ — часть схемы, их приводи как есть; лучше вместе с термином: «терм `D3` (родитель)». Названия методов упоминай, только если пользователь спрашивает про rstool как инструмент.
|
|
170
238
|
|
|
171
239
|
Словарь выше — про поля rstool. Для **понятий схемы** каноничный источник — [DOMAIN.md](../../docs/DOMAIN.md).
|
|
172
240
|
|
|
@@ -187,7 +255,7 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
|
|
|
187
255
|
|
|
188
256
|
### Ревью концептуальной схемы
|
|
189
257
|
|
|
190
|
-
Перед завершением
|
|
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,4 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ЯРЭ и rstool — справочник
|
|
2
|
+
|
|
3
|
+
Контракт library / stdio / MCP для агентов. Воркфлоу — [GUIDE.md](GUIDE.md). Примеры — [EXAMPLES.md](EXAMPLES.md). Язык — `docs/*.md`.
|
|
2
4
|
|
|
3
5
|
## Контракт rstool
|
|
4
6
|
|
|
@@ -6,29 +8,59 @@
|
|
|
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?)` | Активные диагностики
|
|
21
|
-
| `analyzeExpression(input, sessionId?)` | Разбор без сохранения
|
|
22
|
-
| `commitStep(message?, sessionId?)` | Ревизия
|
|
23
|
-
| `exportSession(sessionId?)` | JSON сессии
|
|
24
|
-
| `exportPortal({ kind, format? }, sessionId?)` | Portal Load from JSON
|
|
25
|
-
| `importData(payload, kind?)` | Импорт сессии / Portal
|
|
26
|
-
| `setModelValues({ set?, clear? }, sessionId?)` | Значения модели (async —
|
|
27
|
-
| `getModelState(sessionId?)` | Состояние интерпретации
|
|
28
|
-
| `evaluate(input, sessionId?)` | Scratch или конституента
|
|
29
|
-
| `recalculateModel(sessionId?)` | Пересчёт
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
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
|
-
###
|
|
167
|
+
### `exportSession()`
|
|
51
168
|
|
|
52
|
-
|
|
169
|
+
JSON-строка сессии для последующего `importData(..., 'session')`.
|
|
53
170
|
|
|
54
|
-
|
|
171
|
+
### `exportPortal({ kind, format? })`
|
|
55
172
|
|
|
56
|
-
- `
|
|
57
|
-
- `
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
## Канонические файлы
|
|
21
|
+
## Канонические файлы
|
|
20
22
|
|
|
21
|
-
|
|
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
|
-
|
|
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` устанавливается как зависимость (анализатор и коды ошибок)
|