Точка входа для AI-агентов и автоматизации (DSH-режим). Здесь: цель проекта, инструменты, команды, структура каталогов, карта «C# → TypeScript» и правила, которых обязан придерживаться каждый агент.
OneScriptJS — переписанный на TypeScript движок OneScript
(язык, совместимый с 1С/BSL). Требования из task.md:
- запускаться на Node.js и в браузере;
- подключаться в браузере как
<script src="/onescript.js"></script>; - исполнять код из кастомного элемента
<one-script>;Сообщить()— функция стандартной библиотеки, выводит в JavaScriptconsole.log(пример —examples/hello.html).
Оригинал на C# лежит в reference/OneScript/ (игнорируется git-ом, см.
.gitignore). Это справочный исходник, а не код нашего репозитория — его не
менять.
Форматы файлов. Наш формат — .osjs: файлы для OneScriptJS (браузер,
наша стандартная библиотека, наши расширения диалекта). .os — чужой формат:
файлы ванильного C#-OneScript для бэкенда, у них свои линтеры и инструменты. Движок
исполняет .os (грамматика BSL общая, эталонный корпус
reference/OneScript/tests/*.os — внутренняя проверка поведения), но не блокирует
его на входе и не владеет им. Переименовывать чужие .os и заявлять их в редакторе
не нужно. Решение и границы — specs/013-osjs-format/spec.md.
- pnpm — менеджер пакетов. Как запускать в DSH-окружении — см. §6.
- Node.js >= 20. В DSH-окружении использовать системный node из nvm, а не встроенный DSH-node (см. §6).
- TypeScript — strict-режим (
tsconfig.json). - Vite — сборка браузерного бандла и Node-библиотеки.
- Vitest — юнит-тесты.
| Действие | Команда |
|---|---|
| Установить зависимости | pnpm install |
| Проверка типов | pnpm typecheck |
Собрать браузерный бандл (dist/onescript.js) |
pnpm build:browser |
Собрать Node-библиотеку (dist/node/) |
pnpm build:node |
| Полная сборка (типы + браузер + Node) | pnpm build |
| Запустить тесты | pnpm test |
| Проверить, что API задокументирован в справочнике | pnpm check:docs |
| Тесты в watch-режиме | pnpm test:watch |
Dev-сервер (для examples/) |
pnpm build:browser && pnpm dev |
| Статическая сборка + preview | pnpm demo |
OneScriptJS/
├── AGENTS.md ← этот файл
├── task.md ← исходное ТЗ
├── package.json
├── tsconfig.json / tsconfig.build.json
├── vite.config.ts ← браузерная сборка (onescript.js)
├── vite.node.config.ts ← Node-сборка (ESM + CJS)
├── vitest.config.ts
├── src/
│ ├── index.ts ← точка входа библиотеки (Node / бандлеры)
│ └── browser/
│ └── onescript.ts ← браузерная точка входа (<one-script>)
├── tests/ ← юнит-тесты Vitest
├── examples/ ← HTML-примеры (hello.html — приёмочный сценарий)
├── docs/
│ ├── architecture.md ← карта «C# → TypeScript» и план слоёв
│ ├── bsl-surface.md ← синтаксис и stdlib BSL по эталонным тестам
│ ├── reference.md ← справочник API (функции, объекты, перечисления)
│ └── status.md ← статус переноса
└── reference/ ← исходник OneScript на C# (не коммитится)
Подробнее — docs/architecture.md. Ключевые соответствия:
Слой (C#, reference/OneScript/src/) |
Назначение | Куда в TypeScript |
|---|---|---|
OneScript.Language |
лексер / препроцессор / парсер / AST | src/lexer, src/parser, src/ast |
OneScript.Core |
система типов, значения, контексты | src/runtime (типы/значения) |
ScriptEngine |
стековая ВМ, компилятор, фасад движка | src/runtime (ВМ) |
OneScript.StandardLibrary |
стандартная библиотека BSL | src/stdlib |
oscript, ScriptEngine.HostedScript |
CLI / хостинг | src/node (CLI) |
| веб-обёртки | браузерное исполнение | src/browser/onescript.ts |
-
Менеджер пакетов — только
pnpm. В DSH-окружении встроенный DSH-node не может загружать нативные аддоны (macOS: «different Team IDs» у.node-библиотек rollup/esbuild), поэтому запускать pnpm нужно системным node из nvm:export PATH="$HOME/.nvm/versions/node/v24.22.0/bin:$PATH" node "$DSH_PNPM" install # $DSH_PNPM = путь к pnpm.mjs из load_workspace_dependencies node "$DSH_PNPM" test
На обычной машине (без DSH) достаточно
pnpm install/pnpm testс node >= 20. -
TDD — сначала падающий тест (Vitest), потом минимальная реализация. Доступен скилл
generic-superpowers-test-driven-development. -
Проверка перед «готово» — прогнать
pnpm typecheck && pnpm test(и при необходимостиpnpm build), показать вывод как доказательство (generic-superpowers-verification-before-completion). Менял API/stdlib — прогониpnpm check:docsи обнови справочник, если он отстал (правило 9). -
BSL-имена двуязычные — как в оригинале, поддерживать русские и английские алиасы идентификаторов (
Сообщить/Message,Если/Ifи т.п.). -
Не трогать
reference/— только читать. Это эталон для сверки поведения. -
Коммиты — только по явной просьбе пользователя. Не коммитить
reference/,node_modules/,dist/,coverage/. -
Стиль — 2 пробела, LF, строгий TypeScript;
.editorconfigобязателен. -
Файлы в браузер —
onescript.tsиспользует только браузерные API; общая логика живёт вsrc/, не вsrc/browser/. -
Синхронизация API и справочника — расширяешь stdlib или язык (новая функция, тип, объект, метод, свойство, перечисление; изменение сигнатуры или поведения) — в том же изменении обнови
docs/reference.md. Справочник — часть definition of done, наравне с тестами; если меняются пользовательские сценарии, обнови также README иexamples/. Расхождение ловятpnpm check:docs(имя изsrc/не найдено в справочнике — exit 1) и Vitest-тестtests/check-api-docs.test.ts(входит вpnpm test). -
Формат наших файлов —
.osjs— в примерах, документации, командах и новых тестовых фикстурах использовать.osjs..osупоминается только там, где речь о ванильном C#-OneScript или об эталонном корпусеreference/(specs/013-osjs-format).
Базовый принцип: лучший код — тот, который ты не написал. Решай всю задачу
минимальным количеством нового кода. Это не про «меньше токенов»: код остаётся
маленьким, потому что он необходим, а не потому что его «ужали». По мотивам
скила DietrichGebert/ponytail.
- Прочитай задачу и код, который она меняет. Перечисли все места, куда должно дотянуться изменение: вызывающие, тесты, фикстуры, конфиг, экспорты.
- Проверь, что изменение может сломать у пользователей: данные, которые оно уничтожит или раскроет, вызывающих, которые перестанут работать.
- Это и есть scope. Дополнительные фичи — не scope.
- Это вообще нужно? Пропусти фичи, опции и гибкость, которые никто не просил, и назови их одной строкой. Расплывчатый запрос получает минимальную версию.
- Уже есть в кодовой базе (хелпер, компонент, сервис, паттерн)? Используй так, как это делает окружающий код.
- Стандартная библиотека или нативная возможность платформы/браузера? Используй её, если в проекте нет своей.
- Уже установленная зависимость? Используй её. Не добавляй зависимость ради пары строк.
- Можно одной строкой, понятной с первого взгляда? Одной строкой.
- Иначе — минимальный код, который работает.
- Доводи до конца каждую часть задачи: вызывающих, тесты и фикстуры, которые ломает твоё изменение.
- Никаких абстракций, обёрток, конвертаций типов, опций, конфигов, бойлерплейта и кода «на потом», который никто не просил. Удаление лучше добавления.
- Сохраняй структуру кодовой базы: её слои, интерфейсы и конвенции.
- Комментарий — только «почему», которое код не показывает, одной строкой.
- Багфикс: прежде чем править, пройдись по всем вызывающим изменяемой функции и почини корневую причину один раз в общем коде.
- Переносимый/объединяемый код сохраняет свои обработку ошибок и валидацию.
- Новая нетривиальная логика (ветвление, цикл, парсер, деньги/безопасность, целый новый скрипт) оставляет один маленький тест — пишется по TDD из §6.2. Тривиальным изменениям тест не нужен.
- Осознанное сокращение с известным лимитом помечай комментарием:
shortcut: <лимит>, <когда апгрейдить>.
Валидацию на границах доверия, обработку ошибок, предотвращающую потерю данных, безопасность, доступность (a11y) и всё, что явно просил пользователь. Ленивый — не значит халатный.
В конце каждого ответа одной-двумя строками укажи: что ты пропустил или не проверил, и какой риск пользователь должен знать.
docs/reference.md— полный справочник API: функции с параметрами/возвратом, объекты с полями и методами, перечисления.task.md— исходное ТЗ и приёмочный HTML-пример.docs/architecture.md— карта слоёв и статус переноса.specs/— спецификации незавершённых работ (001–013); план и задачи создаются в каталоге конкретной спеки по мере готовности.docs/bsl-surface.md— синтаксис и stdlib BSL (поreference/tests).reference/OneScript/AGENTS.md— инструкции к оригиналу (для справки).reference/OneScript/docs/developer_docs.md— архитектура C#-движка.reference/OneScript/docs/contexts.md— как устроены контексты/методы BSL.