priiisk 0.7.2-linux-x64 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -2
- package/README.ru.md +181 -0
- package/bin/priiisk.mjs +65 -0
- package/package.json +19 -13
- package/bin/priiisk +0 -0
- package/profiles/_base/instructions.md +0 -68
- package/profiles/assayer/instructions.md +0 -20
- package/profiles/prospector/instructions.md +0 -17
- package/profiles/wright/instructions.md +0 -21
- package/worker-skills/codegraph/SKILL.md +0 -21
package/README.md
CHANGED
|
@@ -1,3 +1,177 @@
|
|
|
1
|
-
# priiisk
|
|
1
|
+
# priiisk
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[Русская версия](./README.ru.md)
|
|
4
|
+
|
|
5
|
+
A camp of long-lived worker agents. An orchestrator hires them, assigns work,
|
|
6
|
+
and keeps control; a human watches through the cabin and steps in only when
|
|
7
|
+
needed.
|
|
8
|
+
|
|
9
|
+
A worker is a live session, not a one-shot process: it keeps a role, a model, a
|
|
10
|
+
thinking level, a tool set, and a transcript that survives a restart.
|
|
11
|
+
|
|
12
|
+
**Under active development.** Commands, configuration and stored state change
|
|
13
|
+
between releases, sometimes without a transition path: a camp started by an
|
|
14
|
+
older build may refuse to resume, and a config that worked yesterday may be
|
|
15
|
+
rejected as a whole. Expect breakage and read the release you install.
|
|
16
|
+
|
|
17
|
+
## Install
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
npm install -g priiisk
|
|
21
|
+
priiisk --version
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
No separate runtime: the camp lives inside the executable. linux and macOS, x64
|
|
25
|
+
and arm64.
|
|
26
|
+
|
|
27
|
+
## After install
|
|
28
|
+
|
|
29
|
+
`priiisk` with no arguments — the same as `priiisk status` — is the camp
|
|
30
|
+
state: whether a camp is up, the roster, pending questions and elevation
|
|
31
|
+
requests. `priiisk survey` is the command map and the usual order of work.
|
|
32
|
+
When nothing is running, start with `camp up`.
|
|
33
|
+
|
|
34
|
+
Commands that report state accept `--json`. The camp is polled by request, not
|
|
35
|
+
by reading a screen. `priiisk --help` lists the rest; `priiisk <command> --help`
|
|
36
|
+
lists the arguments of one command.
|
|
37
|
+
|
|
38
|
+
## Quick start
|
|
39
|
+
|
|
40
|
+
`camp up` opens the cabin in a neighboring view of the current terminal
|
|
41
|
+
session. Run it from that session. Hire needs at least one model alias in the
|
|
42
|
+
config; see [Configuration](#configuration).
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
priiisk camp up
|
|
46
|
+
priiisk hire "Look into the failing tests" --role prospector
|
|
47
|
+
priiisk status prospector-quiet-harbor
|
|
48
|
+
priiisk asks
|
|
49
|
+
priiisk answer prospector-quiet-harbor
|
|
50
|
+
priiisk camp down
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Hire generates an alias (`<role>-<adjective>-<noun>`) unless you pass `--alias`.
|
|
54
|
+
Use the name hire printed — `prospector-quiet-harbor` above is only an example.
|
|
55
|
+
The first assignment is optional: omit it and the worker waits in `idle` for
|
|
56
|
+
`priiisk send`.
|
|
57
|
+
|
|
58
|
+
One project root is one camp, one socket, and one orchestrator.
|
|
59
|
+
|
|
60
|
+
## Access modes and network
|
|
61
|
+
|
|
62
|
+
Access mode is a set of operation classes the worker may receive. It is chosen
|
|
63
|
+
at hire and does not change on a live worker. `equip` may narrow what is
|
|
64
|
+
handed out, but it cannot raise this ceiling.
|
|
65
|
+
|
|
66
|
+
| mode | classes | in practice |
|
|
67
|
+
| --- | --- | --- |
|
|
68
|
+
| `read-only` | read | files, search, read-only catalog binaries; no shell |
|
|
69
|
+
| `execute` | read, execute | plus a shell for checks; `edit` and `write` are not handed out |
|
|
70
|
+
| `read-write` | read, write | file edits through tools; no shell |
|
|
71
|
+
| `all` | all three | the full set |
|
|
72
|
+
|
|
73
|
+
The tool itself declares its class. Built-in roles: `prospector` is
|
|
74
|
+
`read-only`, `assayer` is `execute`, `wright` is `all`.
|
|
75
|
+
|
|
76
|
+
`execute` does not forbid writes. A started command writes everything the
|
|
77
|
+
process user can write. That is role discipline, not isolation.
|
|
78
|
+
|
|
79
|
+
Network is a separate boolean axis, closed by default. It only decides whether
|
|
80
|
+
outbound tools are handed out. A grant cannot open it; hire a worker with
|
|
81
|
+
`--network` if you need that. The camp has no outbound tools today, so opening
|
|
82
|
+
the axis does not give a worker the internet.
|
|
83
|
+
|
|
84
|
+
## Elevation
|
|
85
|
+
|
|
86
|
+
A one-off step outside the hired mode is a grant, not a question. The worker
|
|
87
|
+
names the class it lacks (`read`, `write`, or `execute`) and a reason. The
|
|
88
|
+
orchestrator answers with `priiisk grant <id>` or `priiisk grant <id> --deny`.
|
|
89
|
+
An allow opens a window until the worker finishes the turn by returning a
|
|
90
|
+
result; interrupt, error, and retry do not close it. The next need is a new
|
|
91
|
+
request. The hired mode does not change.
|
|
92
|
+
|
|
93
|
+
## Worker workspace
|
|
94
|
+
|
|
95
|
+
`priiisk hire --workspace worktree` creates a named workspace with its own
|
|
96
|
+
working tree and branch. Hire a second worker into it by name:
|
|
97
|
+
`priiisk hire --workspace <name>`. A reviewer can then read the writer's work
|
|
98
|
+
before any merge. It is not a sandbox: the object database, refs, repository
|
|
99
|
+
config, hooks, and the user permissions of the same repository stay shared.
|
|
100
|
+
Dismissal is cooperative. Take the finished work with an ordinary `git merge`.
|
|
101
|
+
|
|
102
|
+
`priiisk workspace list` shows who lives in which workspace.
|
|
103
|
+
`priiisk workspace forget <name>` removes an empty named workspace.
|
|
104
|
+
`priiisk workspace sweep` lists orphan trees left after a crash: an empty named
|
|
105
|
+
workspace is not an orphan. `--confirm` deletes only trees that are clean and
|
|
106
|
+
whose branch is already reachable from another ref. A dirty tree and a tree
|
|
107
|
+
with an unmerged branch stay put.
|
|
108
|
+
|
|
109
|
+
## Configuration
|
|
110
|
+
|
|
111
|
+
The camp reads one user TOML file: `$XDG_CONFIG_HOME/priiisk/config.toml`, or
|
|
112
|
+
`~/.config/priiisk/config.toml` when `XDG_CONFIG_HOME` is unset.
|
|
113
|
+
|
|
114
|
+
The file is checked as a whole. An unknown field is rejected. There are no
|
|
115
|
+
silently ignored settings.
|
|
116
|
+
|
|
117
|
+
### Before the first camp: the agent runtime comes first
|
|
118
|
+
|
|
119
|
+
priiisk runs workers on the pi agent runtime and **inherits its providers,
|
|
120
|
+
models and authentication**. It stores no tokens and copies no model registry,
|
|
121
|
+
so a model exists for the camp only if it already exists there.
|
|
122
|
+
|
|
123
|
+
That makes the order fixed, and it is easy to get wrong:
|
|
124
|
+
|
|
125
|
+
1. Sign in to pi and connect the providers you intend to use. Adding a provider
|
|
126
|
+
or renewing its authentication is done with pi, not here.
|
|
127
|
+
2. Ask pi which `provider/model` references are actually available to you. The
|
|
128
|
+
camp accepts an exact reference, not a family or a display name.
|
|
129
|
+
3. Map those references to short aliases in the priiisk config below, and use
|
|
130
|
+
the aliases in roles and presets.
|
|
131
|
+
4. Run `priiisk doctor`. It confirms that every configured alias resolves in the
|
|
132
|
+
pi catalog and that authentication for it is available — by reading the
|
|
133
|
+
catalog, without sending a prompt or spending anything.
|
|
134
|
+
|
|
135
|
+
Skipping the first two steps is the usual first failure: the config is valid
|
|
136
|
+
TOML, the camp starts, and the first hire dies because the model reference
|
|
137
|
+
belongs to no one.
|
|
138
|
+
|
|
139
|
+
A minimal file. Replace both `id` values before `camp up`; the placeholders below are only the required `provider/model` shape:
|
|
140
|
+
|
|
141
|
+
```toml
|
|
142
|
+
schemaVersion = 2
|
|
143
|
+
|
|
144
|
+
[defaults]
|
|
145
|
+
model = "strong"
|
|
146
|
+
thinking = "medium"
|
|
147
|
+
network = false
|
|
148
|
+
|
|
149
|
+
[models.strong]
|
|
150
|
+
id = "provider/model"
|
|
151
|
+
|
|
152
|
+
[models.fast]
|
|
153
|
+
id = "provider/model"
|
|
154
|
+
|
|
155
|
+
[roles.assayer]
|
|
156
|
+
description = "Review worker"
|
|
157
|
+
model = "strong"
|
|
158
|
+
thinking = "high"
|
|
159
|
+
access = "execute"
|
|
160
|
+
network = false
|
|
161
|
+
|
|
162
|
+
[hirePresets.safe-review]
|
|
163
|
+
description = "Review without a shell"
|
|
164
|
+
role = "assayer"
|
|
165
|
+
access = "read-only"
|
|
166
|
+
network = false
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Replace both `id` values with models from your agent runtime. `defaults.model`
|
|
170
|
+
and `defaults.thinking` are required. A hire preset may name a built-in role
|
|
171
|
+
(`wright`, `assayer`, `prospector`) and then tighten access or network.
|
|
172
|
+
|
|
173
|
+
A repository may keep `.priiisk/config.toml` and override policy from the user
|
|
174
|
+
file: models, roles, hire presets, skill groups, defaults, and workspace. It
|
|
175
|
+
does not read MCP server definitions or the external-binary catalog from the
|
|
176
|
+
repository: those fields name what the camp will start, so taking them from a
|
|
177
|
+
clone would run someone else's code on the first hire.
|
package/README.ru.md
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# priiisk
|
|
2
|
+
|
|
3
|
+
[English version](./README.md)
|
|
4
|
+
|
|
5
|
+
Управляемый лагерь долгоживущих worker-агентов. Оркестратор нанимает воркеров,
|
|
6
|
+
дает им задания и держит управление; человек наблюдает через кабину и
|
|
7
|
+
вмешивается только когда нужно.
|
|
8
|
+
|
|
9
|
+
Воркер — не одноразовый процесс, а живая session: у него есть роль, модель,
|
|
10
|
+
уровень мышления, свой набор инструментов и transcript, который переживает
|
|
11
|
+
перезапуск.
|
|
12
|
+
|
|
13
|
+
**Идет активная разработка.** Команды, конфигурация и сохраненное состояние
|
|
14
|
+
меняются между выпусками, иногда без переходного пути: лагерь, поднятый прежней
|
|
15
|
+
сборкой, может отказаться восстанавливаться, а вчерашний конфиг — быть
|
|
16
|
+
отклоненным целиком. Ломаться будет; читайте тот выпуск, который ставите.
|
|
17
|
+
|
|
18
|
+
## Установка
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
npm install -g priiisk
|
|
22
|
+
priiisk --version
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Отдельный рантайм ставить не нужно: лагерь целиком лежит внутри исполняемого
|
|
26
|
+
файла. Поддержаны linux и macOS, x64 и arm64.
|
|
27
|
+
|
|
28
|
+
## После установки
|
|
29
|
+
|
|
30
|
+
`priiisk` без аргументов — то же, что `priiisk status` — это состояние лагеря:
|
|
31
|
+
поднят ли он, кто в ростере, какие вопросы и просьбы о повышении ждут ответа.
|
|
32
|
+
`priiisk survey` — карта команд и обычный порядок работы. Если лагеря нет,
|
|
33
|
+
его поднимают `camp up`.
|
|
34
|
+
|
|
35
|
+
Команды, отвечающие состоянием, понимают `--json`. Лагерь опрашивается
|
|
36
|
+
запросом, а не чтением экрана. `priiisk --help` перечисляет остальные команды,
|
|
37
|
+
`priiisk <команда> --help` — аргументы каждой.
|
|
38
|
+
|
|
39
|
+
## Быстрый старт
|
|
40
|
+
|
|
41
|
+
`camp up` открывает кабину в соседнем виде текущей terminal-сессии. Запускайте
|
|
42
|
+
его из этой сессии. Для найма в конфиге нужна хотя бы одна модель; см.
|
|
43
|
+
[Настройка](#настройка).
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
priiisk camp up
|
|
47
|
+
priiisk hire "Разбери падение тестов" --role prospector
|
|
48
|
+
priiisk status prospector-quiet-harbor
|
|
49
|
+
priiisk asks
|
|
50
|
+
priiisk answer prospector-quiet-harbor
|
|
51
|
+
priiisk camp down
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Hire сам генерирует алиас (`<роль>-<прилагательное>-<существительное>`), если не
|
|
55
|
+
передан `--alias`. Дальше используйте имя, которое напечатал hire —
|
|
56
|
+
`prospector-quiet-harbor` здесь только пример. Первое задание необязательно:
|
|
57
|
+
без него воркер ждет в `idle` команды `priiisk send`.
|
|
58
|
+
|
|
59
|
+
Лагерь привязан к каноническому корню репозитория: один проект — один лагерь,
|
|
60
|
+
один сокет, один управляющий оркестратор.
|
|
61
|
+
|
|
62
|
+
## Режимы доступа и сеть
|
|
63
|
+
|
|
64
|
+
Режим доступа — множество классов операций, которые воркер может получить. Он
|
|
65
|
+
задается при найме и на живом воркере не меняется. `equip` сужает выдачу
|
|
66
|
+
внутри потолка режима и никогда его не поднимает.
|
|
67
|
+
|
|
68
|
+
| режим | классы | на практике |
|
|
69
|
+
| --- | --- | --- |
|
|
70
|
+
| `read-only` | чтение | файлы, поиск, читающие бинари каталога; оболочки нет |
|
|
71
|
+
| `execute` | чтение, исполнение | плюс оболочка для проверок; `edit` и `write` не выданы |
|
|
72
|
+
| `read-write` | чтение, запись | правка файлов инструментами; оболочки нет |
|
|
73
|
+
| `all` | все три | полный набор |
|
|
74
|
+
|
|
75
|
+
Класс объявляет сам инструмент. Встроенные роли: `prospector` — `read-only`,
|
|
76
|
+
`assayer` — `execute`, `wright` — `all`.
|
|
77
|
+
|
|
78
|
+
`execute` не запрещает запись. Запущенная команда пишет все, что доступно
|
|
79
|
+
пользователю процесса. Это дисциплина роли, а не изоляция.
|
|
80
|
+
|
|
81
|
+
Сеть — отдельная булева ось, по умолчанию закрыта. Она решает только, выдаются
|
|
82
|
+
ли инструменты выхода наружу. Повышением ее не открыть: нужен наем с
|
|
83
|
+
`--network`. Сейчас у лагеря нет инструментов выхода, поэтому открытая ось не
|
|
84
|
+
дает воркеру интернет.
|
|
85
|
+
|
|
86
|
+
## Повышение полномочий
|
|
87
|
+
|
|
88
|
+
Разовый выход за нанятый режим — это просьба о повышении, а не вопрос. Воркер
|
|
89
|
+
называет недостающий класс (`read`, `write` или `execute`) и обоснование.
|
|
90
|
+
Оркестратор отвечает `priiisk grant <id>` или `priiisk grant <id> --deny`.
|
|
91
|
+
Разрешение открывает окно до конца хода, пока воркер не вернет результат;
|
|
92
|
+
прерывание, ошибка и повтор окно не закрывают. Следующая надобность — новая
|
|
93
|
+
просьба. Нанятый режим при этом не меняется.
|
|
94
|
+
|
|
95
|
+
## Рабочее пространство воркера
|
|
96
|
+
|
|
97
|
+
`priiisk hire --workspace worktree` создает именованное пространство с
|
|
98
|
+
собственным деревом и веткой. Второго воркера сажают туда по имени:
|
|
99
|
+
`priiisk hire --workspace <name>`. Так проверяющий читает работу пишущего до
|
|
100
|
+
слияния. Это не песочница: object database, refs, конфигурация репозитория,
|
|
101
|
+
hooks и права пользователя того же репозитория остаются общими. Закрытие
|
|
102
|
+
кооперативное. Готовую работу забирают обычным `git merge`.
|
|
103
|
+
|
|
104
|
+
`priiisk workspace list` показывает, кто в каком пространстве живет.
|
|
105
|
+
`priiisk workspace forget <name>` убирает пустое именованное пространство.
|
|
106
|
+
`priiisk workspace sweep` показывает осиротевшие деревья после сбоя: пустое
|
|
107
|
+
именованное пространство сиротой не считается. `--confirm` удаляет только
|
|
108
|
+
чистые деревья, чья ветка уже достижима из другой ссылки. Грязное дерево и
|
|
109
|
+
дерево с невлитой веткой команда оставляет на месте.
|
|
110
|
+
|
|
111
|
+
## Настройка
|
|
112
|
+
|
|
113
|
+
Лагерь читает один пользовательский TOML-файл:
|
|
114
|
+
`$XDG_CONFIG_HOME/priiisk/config.toml`, а если `XDG_CONFIG_HOME` не задан —
|
|
115
|
+
`~/.config/priiisk/config.toml`.
|
|
116
|
+
|
|
117
|
+
Файл проходит строгую проверку целиком. Неизвестное поле отклоняется.
|
|
118
|
+
Молчаливо игнорируемых настроек нет.
|
|
119
|
+
|
|
120
|
+
### Перед первым лагерем: сначала агент-рантайм
|
|
121
|
+
|
|
122
|
+
priiisk исполняет воркеров рантаймом pi и **наследует его провайдеров, модели и
|
|
123
|
+
авторизацию**. Своих токенов он не хранит и чужой реестр моделей не копирует:
|
|
124
|
+
модель существует для лагеря только если она уже существует там.
|
|
125
|
+
|
|
126
|
+
Отсюда жесткий порядок, который легко нарушить:
|
|
127
|
+
|
|
128
|
+
1. Войти в pi и подключить провайдеров, которыми собираетесь пользоваться.
|
|
129
|
+
Добавление провайдера и продление авторизации делаются средствами pi, а не
|
|
130
|
+
отсюда.
|
|
131
|
+
2. Узнать у pi, какие ссылки `provider/model` вам действительно доступны.
|
|
132
|
+
Лагерь принимает точную ссылку, а не семейство и не отображаемое имя.
|
|
133
|
+
3. Связать эти ссылки короткими алиасами в конфиге ниже и пользоваться в ролях
|
|
134
|
+
и пресетах алиасами.
|
|
135
|
+
4. Выполнить `priiisk doctor`. Он подтверждает, что каждый алиас резолвится в
|
|
136
|
+
каталоге pi и что авторизация для него есть, — чтением каталога, без отправки
|
|
137
|
+
запроса и без трат.
|
|
138
|
+
|
|
139
|
+
Пропуск первых двух шагов — обычный первый отказ: конфиг проходит проверку,
|
|
140
|
+
лагерь поднимается, а первый наем умирает, потому что ссылка на модель никому
|
|
141
|
+
не принадлежит.
|
|
142
|
+
|
|
143
|
+
Минимальный файл. Перед `camp up` подставьте оба `id`; плейсхолдеры ниже — только обязательная форма `provider/model`:
|
|
144
|
+
|
|
145
|
+
```toml
|
|
146
|
+
schemaVersion = 2
|
|
147
|
+
|
|
148
|
+
[defaults]
|
|
149
|
+
model = "strong"
|
|
150
|
+
thinking = "medium"
|
|
151
|
+
network = false
|
|
152
|
+
|
|
153
|
+
[models.strong]
|
|
154
|
+
id = "provider/model"
|
|
155
|
+
|
|
156
|
+
[models.fast]
|
|
157
|
+
id = "provider/model"
|
|
158
|
+
|
|
159
|
+
[roles.assayer]
|
|
160
|
+
description = "Review worker"
|
|
161
|
+
model = "strong"
|
|
162
|
+
thinking = "high"
|
|
163
|
+
access = "execute"
|
|
164
|
+
network = false
|
|
165
|
+
|
|
166
|
+
[hirePresets.safe-review]
|
|
167
|
+
description = "Review without a shell"
|
|
168
|
+
role = "assayer"
|
|
169
|
+
access = "read-only"
|
|
170
|
+
network = false
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Подставьте в оба `id` модели из своего агент-рантайма. `defaults.model` и
|
|
174
|
+
`defaults.thinking` обязательны. Пресет найма может назвать встроенную роль
|
|
175
|
+
(`wright`, `assayer`, `prospector`) и сузить доступ или сеть.
|
|
176
|
+
|
|
177
|
+
Репозиторий может держать `.priiisk/config.toml` и переопределять им политику
|
|
178
|
+
из пользовательского файла: модели, роли, пресеты найма, группы навыков,
|
|
179
|
+
defaults и workspace. Определения MCP-серверов и каталог внешних бинарей из
|
|
180
|
+
репозитория не читаются: эти поля задают то, что лагерь запустит, и чтение их
|
|
181
|
+
из клона означало бы исполнение чужого кода при первом же `hire`.
|
package/bin/priiisk.mjs
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* The installed `priiisk` command. npm cannot choose a `bin` per platform, so the
|
|
4
|
+
* entry package ships this shim and the executable travels in a platform build
|
|
5
|
+
* that npm installs only where its `os`/`cpu` match.
|
|
6
|
+
*
|
|
7
|
+
* The shim hands the terminal over untouched — the cabin is a full-screen TUI and
|
|
8
|
+
* a pipe in place of the terminal would break it — and it does not interpret
|
|
9
|
+
* signals: the terminal delivers them to the whole process group, so the binary
|
|
10
|
+
* decides when to stop and this process only reports how it ended.
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from "node:child_process";
|
|
13
|
+
import { existsSync } from "node:fs";
|
|
14
|
+
import { createRequire } from "node:module";
|
|
15
|
+
import { dirname, join } from "node:path";
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* An alias, not a registry name: the entry package installs the platform build
|
|
19
|
+
* under this name from a version of `priiisk` itself. The manifest is what gets
|
|
20
|
+
* resolved rather than the executable, because a package is always allowed to
|
|
21
|
+
* answer for its own manifest.
|
|
22
|
+
*/
|
|
23
|
+
const platformPackage = `priiisk-${process.platform}-${process.arch}`;
|
|
24
|
+
|
|
25
|
+
let binaryPath;
|
|
26
|
+
try {
|
|
27
|
+
const manifest = createRequire(import.meta.url).resolve(`${platformPackage}/package.json`);
|
|
28
|
+
binaryPath = join(dirname(manifest), "bin", "priiisk");
|
|
29
|
+
} catch {
|
|
30
|
+
binaryPath = undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (binaryPath === undefined || !existsSync(binaryPath)) {
|
|
34
|
+
process.stderr.write(
|
|
35
|
+
`priiisk: no executable for ${process.platform} ${process.arch}.\n` +
|
|
36
|
+
`The platform build ${platformPackage} is missing. It is an optional dependency, so an\n` +
|
|
37
|
+
`install run with optional dependencies disabled leaves it out; reinstall with\n` +
|
|
38
|
+
`npm install -g priiisk@latest. If nothing exists for this platform, it is not published.\n`,
|
|
39
|
+
);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const child = spawn(binaryPath, process.argv.slice(2), { stdio: "inherit" });
|
|
44
|
+
|
|
45
|
+
/*
|
|
46
|
+
* Signals reach the binary through the process group. Ignoring them here keeps
|
|
47
|
+
* this process alive until the binary has finished handling its own shutdown,
|
|
48
|
+
* instead of leaving it orphaned mid-stop.
|
|
49
|
+
*/
|
|
50
|
+
for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) process.on(signal, () => {});
|
|
51
|
+
|
|
52
|
+
child.on("error", (error) => {
|
|
53
|
+
process.stderr.write(`priiisk: cannot start ${binaryPath}: ${error.message}\n`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
child.on("exit", (code, signal) => {
|
|
58
|
+
if (signal !== null) {
|
|
59
|
+
// Die the same way the binary died, so a caller reading the status sees the signal.
|
|
60
|
+
process.removeAllListeners(signal);
|
|
61
|
+
process.kill(process.pid, signal);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
process.exit(code ?? 0);
|
|
65
|
+
});
|
package/package.json
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "priiisk",
|
|
3
|
-
"version": "0.7.2
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"x64"
|
|
10
|
-
],
|
|
3
|
+
"version": "0.7.2",
|
|
4
|
+
"description": "CLI for running and observing a camp of collaborating agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"priiisk": "./bin/priiisk.mjs"
|
|
8
|
+
},
|
|
11
9
|
"files": [
|
|
12
|
-
"bin/priiisk",
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
"bin/priiisk.mjs",
|
|
11
|
+
"README.md",
|
|
12
|
+
"README.ru.md"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=20"
|
|
16
|
+
},
|
|
17
|
+
"optionalDependencies": {
|
|
18
|
+
"priiisk-linux-x64": "npm:priiisk@0.7.2-linux-x64",
|
|
19
|
+
"priiisk-linux-arm64": "npm:priiisk@0.7.2-linux-arm64",
|
|
20
|
+
"priiisk-darwin-x64": "npm:priiisk@0.7.2-darwin-x64",
|
|
21
|
+
"priiisk-darwin-arm64": "npm:priiisk@0.7.2-darwin-arm64"
|
|
22
|
+
}
|
|
17
23
|
}
|
package/bin/priiisk
DELETED
|
Binary file
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# Общий протокол воркера
|
|
2
|
-
|
|
3
|
-
Ты работаешь внутри camp под управлением одного оркестратора. Выполняй только
|
|
4
|
-
назначенную задачу. Сообщения оркестратора приоритетнее твоего текущего плана.
|
|
5
|
-
|
|
6
|
-
## Границы
|
|
7
|
-
|
|
8
|
-
- Не общайся с другими воркерами напрямую. Нужный контекст передает
|
|
9
|
-
оркестратор.
|
|
10
|
-
- Не запускай вложенных агентов и не пытайся управлять camp.
|
|
11
|
-
- Не расширяй задачу без явного указания.
|
|
12
|
-
- Соблюдай инструкции и ограничения целевого проекта.
|
|
13
|
-
- Не скрывай ошибки, пропущенные проверки и неуверенность.
|
|
14
|
-
|
|
15
|
-
## Режим доступа
|
|
16
|
-
|
|
17
|
-
У тебя есть режим доступа и отдельная ось сети. Оба задаются при найме и на
|
|
18
|
-
живом воркере не меняются: `equip` сужает выдачу внутри потолка режима, но
|
|
19
|
-
потолок не поднимает. Сменить режим или сеть — значит нанять другого агента.
|
|
20
|
-
|
|
21
|
-
Режим — множество разрешенных классов операций. Класс объявляет сам инструмент:
|
|
22
|
-
|
|
23
|
-
| режим | классы | на практике |
|
|
24
|
-
| --- | --- | --- |
|
|
25
|
-
| `read-only` | чтение | файлы, поиск, читающие бинари каталога; оболочки нет |
|
|
26
|
-
| `execute` | чтение, исполнение | плюс `bash` для проверок и смоуков; `edit` и `write` не выданы |
|
|
27
|
-
| `read-write` | чтение, запись | правка файлов инструментами; оболочки нет |
|
|
28
|
-
| `all` | все три | полный набор |
|
|
29
|
-
|
|
30
|
-
Сеть по умолчанию закрыта. Инструментов выхода наружу может не быть вовсе: ось
|
|
31
|
-
объявлена заранее, чтобы будущий tool не оказался выдан всем.
|
|
32
|
-
|
|
33
|
-
Граница — выдача: инструмент чужого класса тебе не виден и вызвать его нельзя.
|
|
34
|
-
Если для задачи нужен класс вне режима, вызови инструмент повышения доступа:
|
|
35
|
-
назови класс и обоснование. Не подменяй его блокирующим вопросом и не ищи обход.
|
|
36
|
-
|
|
37
|
-
Честность про `execute`: режим не запрещает запись физически. Запущенная
|
|
38
|
-
команда пишет все, что доступно пользователю процесса. Это дисциплина роли, а
|
|
39
|
-
не изоляция. Воркеру с `execute` нельзя намеренно править дерево через оболочку
|
|
40
|
-
вместо отсутствующих `edit` и `write` — «случайно нельзя» система не обещает.
|
|
41
|
-
|
|
42
|
-
## Связь с оркестратором
|
|
43
|
-
|
|
44
|
-
Если без решения оркестратора нельзя безопасно продолжить, вызови
|
|
45
|
-
`priiisk_ask` с `blocking = true`. Сформулируй одну конкретную развилку. Срок
|
|
46
|
-
ожидания задает лагерь, а не ты: назначать его не нужно и нечем. Обычное
|
|
47
|
-
сообщение оркестратора приходит как новый `steer` и требует немедленно
|
|
48
|
-
пересмотреть текущий план.
|
|
49
|
-
|
|
50
|
-
Не используй обычный текст ответа вместо обязательного вопроса: текст завершит
|
|
51
|
-
ход, а blocking ask сохранит явное ожидающее состояние.
|
|
52
|
-
|
|
53
|
-
Просьба о классе операций вне режима — не вопрос: для нее есть инструмент
|
|
54
|
-
повышения доступа, а не `priiisk_ask`.
|
|
55
|
-
|
|
56
|
-
## Работа
|
|
57
|
-
|
|
58
|
-
1. Сначала прочитай задачу и локальные инструкции проекта.
|
|
59
|
-
2. Проверь существующее состояние до изменений.
|
|
60
|
-
3. Делай минимальный достаточный объем работы.
|
|
61
|
-
4. Проверяй результат соразмерно риску.
|
|
62
|
-
5. В финале перечисли факты: что сделано, чем проверено, что осталось.
|
|
63
|
-
|
|
64
|
-
Каждое утверждение «работает» подкрепляй наблюдаемым результатом. Не проверял —
|
|
65
|
-
так и напиши. Не восстанавливай содержимое файлов по памяти: перечитай источник.
|
|
66
|
-
|
|
67
|
-
Отчет держи компактным. Код, сообщения коммитов и документацию пиши обычным
|
|
68
|
-
человеческим языком по правилам проекта.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# Роль: assayer
|
|
2
|
-
|
|
3
|
-
Режим доступа — `execute`, сеть закрыта. Ты верификатор: читаешь результат и
|
|
4
|
-
запускаешь проверки, смоуки, трекер. Инструментов `edit` и `write` нет —
|
|
5
|
-
ничего не чинишь и не меняешь файлами сам.
|
|
6
|
-
|
|
7
|
-
`execute` — не песочница. Оболочка пишет все, что доступно пользователю
|
|
8
|
-
процесса. Не правь дерево через команду «заодно» с проверкой: тебе нельзя
|
|
9
|
-
намеренно, а не «случайно нельзя».
|
|
10
|
-
|
|
11
|
-
1. Прочитай критерии приемки.
|
|
12
|
-
2. Для каждого критерия получи наблюдаемое подтверждение — в том числе запуском
|
|
13
|
-
команд, если критерий этого требует.
|
|
14
|
-
3. Отделяй новые дефекты от существующего состояния проекта.
|
|
15
|
-
4. Не считай отсутствие проверки подтверждением корректности.
|
|
16
|
-
5. Верни итоговый `PASS` либо `FAIL` с главной причиной и координатами фактов.
|
|
17
|
-
|
|
18
|
-
Если проверка уперлась в продуктовую развилку или недоступный источник, вызови
|
|
19
|
-
blocking `priiisk_ask`. Если не хватает класса операций (например, записи) —
|
|
20
|
-
инструмент повышения доступа с обоснованием, а не вопрос и не обход.
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# Роль: prospector
|
|
2
|
-
|
|
3
|
-
Режим доступа — `read-only`, сеть закрыта. Читаешь файлы, ищешь по дереву,
|
|
4
|
-
запускаешь читающие бинари каталога. Оболочки, `edit` и `write` нет — файлы и
|
|
5
|
-
внешнее состояние не меняешь.
|
|
6
|
-
|
|
7
|
-
Ответь на вопрос задания прямо. Покажи устройство найденной области, ключевые
|
|
8
|
-
файлы и связи, пригодные для повторного использования abstractions и ловушки.
|
|
9
|
-
Факты отделяй от предположений.
|
|
10
|
-
|
|
11
|
-
Не принимай продуктовых решений за оркестратора. Если исследование уперлось в
|
|
12
|
-
неоднозначную развилку или недоступный источник, вызови blocking `priiisk_ask`.
|
|
13
|
-
Если не хватает класса операций — инструмент повышения доступа с обоснованием,
|
|
14
|
-
а не обход через то, что еще выдано, и не блокирующий вопрос вместо работы.
|
|
15
|
-
|
|
16
|
-
Финальный отчет держи компактным: прямой ответ, подтверждающие координаты,
|
|
17
|
-
ограничения и неизвестное.
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# Роль: wright
|
|
2
|
-
|
|
3
|
-
Режим доступа — `all`, сеть закрыта. Тебе выданы чтение, запись и исполнение:
|
|
4
|
-
исследуешь код, правишь файлы и запускаешь проверки. Наружу не ходишь.
|
|
5
|
-
|
|
6
|
-
Ты исполнитель. Продуктовые решения и расширение scope принадлежат
|
|
7
|
-
оркестратору.
|
|
8
|
-
|
|
9
|
-
Перед изменениями:
|
|
10
|
-
|
|
11
|
-
1. Прочитай локальные инструкции и затронутую спецификацию.
|
|
12
|
-
2. Найди существующие abstractions и тесты.
|
|
13
|
-
3. При неоднозначной развилке вызови blocking `priiisk_ask` до правок.
|
|
14
|
-
|
|
15
|
-
Предпочитай существующие зависимости, нативные возможности платформы и
|
|
16
|
-
маленькие изменения. Не упрощай за счет валидации, обработки ошибок,
|
|
17
|
-
сохранности данных и явных lifecycle-состояний.
|
|
18
|
-
|
|
19
|
-
После изменений запусти доступные проверки из проекта. Убери временные файлы и
|
|
20
|
-
процессы. Финальный отчет должен содержать измененные области, фактические
|
|
21
|
-
результаты проверок и незакрытые ограничения.
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: codegraph
|
|
3
|
-
description: "Использовать для структурной навигации по коду, когда в проекте есть .codegraph и доступны codegraph tools: поиск символов, flow, callers/callees, blast radius и чтение индексированного source."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# CodeGraph
|
|
7
|
-
|
|
8
|
-
Для структурного вопроса сначала используй `codegraph_explore`: устройство
|
|
9
|
-
области, определения, связи, flow и влияние изменения. Один широкий запрос
|
|
10
|
-
предпочтительнее цепочки поиска и ручного чтения файлов.
|
|
11
|
-
|
|
12
|
-
Для буквального текста, логов, комментариев и документации используй `rg` и
|
|
13
|
-
обычное чтение. Не перепроверяй результат CodeGraph тем же поиском без причины.
|
|
14
|
-
|
|
15
|
-
После своей правки перечитай измененный файл напрямую, пока watcher не обновил
|
|
16
|
-
индекс. Если инструмент сообщает stale state, доверяй только неустаревшим
|
|
17
|
-
файлам и дочитай перечисленные файлы обычным способом.
|
|
18
|
-
|
|
19
|
-
Если `.codegraph` или tools недоступны, не чини окружение и не создавай индекс
|
|
20
|
-
самостоятельно. Продолжай через доступные read/search tools и явно укажи
|
|
21
|
-
ограничение в отчете.
|