@openengio/cli 0.23.3 → 0.24.3
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 +100 -14
- package/bin/public/openeng.js +772 -115
- package/package.json +1 -1
- package/skill/build-ui/SKILL.md +4 -0
- package/skill/conventions/SKILL.md +62 -0
- package/skill/new-use-case/SKILL.md +4 -0
- package/skill/openeng/SKILL.md +128 -26
package/package.json
CHANGED
package/skill/build-ui/SKILL.md
CHANGED
|
@@ -13,6 +13,10 @@ catalogue the platform validates against. The CLI does not yet ship that generat
|
|
|
13
13
|
use this guide's examples and `openeng help types draft revise` for the wire shape, then validate the change
|
|
14
14
|
set; the host decides which components, props, bounds and bindings your version admits.
|
|
15
15
|
|
|
16
|
+
An **App** is an organisation entity with its own pages and drafts, linked by `openeng link app`.
|
|
17
|
+
An **App view** is a type's collection content in `presentationBindings.views.app`, root `AppBody`,
|
|
18
|
+
and cannot be linked by `link app`.
|
|
19
|
+
|
|
16
20
|
Work through the steps in order, and stop where a step says so.
|
|
17
21
|
|
|
18
22
|
## 1. Know what the view must answer
|
|
@@ -101,6 +101,10 @@ the first view.
|
|
|
101
101
|
drawer; an **App view** (`.app`, root `AppBody`) lays out the type's page. Only components the view
|
|
102
102
|
catalogue admits may appear, each with the props it takes.
|
|
103
103
|
|
|
104
|
+
An **App** is an organisation entity with its own pages and drafts, linked by `openeng link app`.
|
|
105
|
+
An **App view** is a type's collection content in `presentationBindings.views.app`, root `AppBody`,
|
|
106
|
+
and cannot be linked by `link app`.
|
|
107
|
+
|
|
104
108
|
## 6. Versions
|
|
105
109
|
|
|
106
110
|
- A new type key starts at version 1. A changed type is sent at its published version plus one;
|
|
@@ -132,6 +136,64 @@ for a lifecycle state. A wrong edge is replaced by a new edge type key and a rec
|
|
|
132
136
|
{"value": <the new value>}}}`; `{"absent": true}` stands for no value on either side. A `from` that no
|
|
133
137
|
longer matches is refused, so read the object first.
|
|
134
138
|
|
|
139
|
+
## Property kinds
|
|
140
|
+
|
|
141
|
+
An enum's `members` is a list of strings or finite numbers. A published member cannot be removed.
|
|
142
|
+
|
|
143
|
+
### enum
|
|
144
|
+
|
|
145
|
+
```json
|
|
146
|
+
{"kind": "enum", "members": ["open", "closed"]}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### null
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{"kind": "null"}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### boolean
|
|
156
|
+
|
|
157
|
+
```json
|
|
158
|
+
{"kind": "boolean"}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### string
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{"kind": "string"}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### number
|
|
168
|
+
|
|
169
|
+
```json
|
|
170
|
+
{"kind": "number"}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### integer
|
|
174
|
+
|
|
175
|
+
```json
|
|
176
|
+
{"kind": "integer"}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### person
|
|
180
|
+
|
|
181
|
+
```json
|
|
182
|
+
{"kind": "person"}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### array
|
|
186
|
+
|
|
187
|
+
```json
|
|
188
|
+
{"kind": "array", "items": {"kind": "string"}, "maxItems": 10}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### object
|
|
192
|
+
|
|
193
|
+
```json
|
|
194
|
+
{"kind": "object", "properties": {"name": {"kind": "string"}}, "required": ["name"]}
|
|
195
|
+
```
|
|
196
|
+
|
|
135
197
|
## 9. Examples
|
|
136
198
|
|
|
137
199
|
A minimal object type and a structural edge, every key at version 1:
|
|
@@ -105,6 +105,10 @@ Stop: the person agrees the properties and the rail.
|
|
|
105
105
|
|
|
106
106
|
## 6. Decide views, if any
|
|
107
107
|
|
|
108
|
+
An **App** is an organisation entity with its own pages and drafts, linked by `openeng link app`.
|
|
109
|
+
An **App view** is a type's collection content in `presentationBindings.views.app`, root `AppBody`,
|
|
110
|
+
and cannot be linked by `link app`.
|
|
111
|
+
|
|
108
112
|
An object view shapes the object's drawer; an App view shapes the type's page. Propose one only when the
|
|
109
113
|
default layout does not answer step 1's questions. Use only the components the view catalogue admits.
|
|
110
114
|
|
package/skill/openeng/SKILL.md
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: openeng
|
|
3
|
-
description:
|
|
3
|
+
description: >-
|
|
4
|
+
Use when you need to work with an OpenEngineering platform through its command line, `openeng`.
|
|
5
|
+
Signing in, listing projects and types, editing object types, writing objects on an agreed ref
|
|
6
|
+
and submitting branches for review.
|
|
4
7
|
---
|
|
5
8
|
|
|
6
9
|
# Working with the platform through `openeng`
|
|
@@ -11,12 +14,6 @@ description: Use when you need to work with an OpenEngineering platform through
|
|
|
11
14
|
npm install -g @openengio/cli
|
|
12
15
|
```
|
|
13
16
|
|
|
14
|
-
Upgrading from `@benjaminfh/oe2`: first run the earlier package's `logout` command, so its stored
|
|
15
|
-
session does not stay on this machine; then uninstall it and install `@openengio/cli`. The command
|
|
16
|
-
is now `openeng`, the environment variables are
|
|
17
|
-
`OPENENG_HOST`, `OPENENG_SIGN_IN_ORIGIN` and `OPENENG_SESSION_STORE`, and you sign in again once
|
|
18
|
-
with `openeng login`.
|
|
19
|
-
|
|
20
17
|
This skill gives the commands and their order. It gives no input shapes, because the commands print
|
|
21
18
|
their own. Before you send a generated command (`objects-sdk`, `branches-sdk` and the other
|
|
22
19
|
`<module> <method>` commands), run `openeng help <module> <method>`. It prints the fields, the kinds a
|
|
@@ -46,7 +43,10 @@ field may take, the selector keys and one example input, and needs no sign-in.
|
|
|
46
43
|
does, an example and the shape of its output. `openeng help <group>` lists a group's commands.
|
|
47
44
|
`openeng --version` prints the published version.
|
|
48
45
|
- `openeng` has no host built in. The production host is `https://api.openeng.io`: pass
|
|
49
|
-
`--host https://api.openeng.io
|
|
46
|
+
`--host https://api.openeng.io` on every command, or prefix it as
|
|
47
|
+
`OPENENG_HOST=https://api.openeng.io openeng ...`. An export in `~/.zshrc` does not reach
|
|
48
|
+
an agent's shell or a Claude Code `!` shell. In zsh, persist it in `~/.zshenv`.
|
|
49
|
+
Fix `no-host` by adding the flag or prefix.
|
|
50
50
|
- `openeng orgs list` and `openeng organisations list` mean `openeng org list`; `openeng project list` means
|
|
51
51
|
`openeng projects list`.
|
|
52
52
|
- A mutation or a branch command that needs a `correlation` mints it for you when your input has
|
|
@@ -58,7 +58,10 @@ field may take, the selector keys and one example input, and needs no sign-in.
|
|
|
58
58
|
## 1. Sign in and orient
|
|
59
59
|
|
|
60
60
|
1. `openeng help` to see what exists.
|
|
61
|
-
2. `openeng login
|
|
61
|
+
2. Run `openeng login` yourself with the host flag. It opens the person's browser and waits;
|
|
62
|
+
tell the person to finish sign-in there. Do not ask the person to run it. If your tool cuts a
|
|
63
|
+
command off before it returns, run it in the background or use `openeng login --no-open`
|
|
64
|
+
with the host flag and give the person the printed address.
|
|
62
65
|
3. `openeng whoami` to confirm who you are.
|
|
63
66
|
4. `openeng org list --json` prints the organisations you belong to. `openeng org attach <id>` attaches
|
|
64
67
|
your session to one. If you have no organisation, create one with
|
|
@@ -85,10 +88,11 @@ For a generic open-cycle gas turbine demonstration project, run `openeng demo se
|
|
|
85
88
|
`org: <name> (<id>)`, then `· project: <id>` and `· ref: <ref>` when you named them. Read it
|
|
86
89
|
before you trust an answer.
|
|
87
90
|
- With `--json`, the one value on standard output carries the same scope as a `scope` object:
|
|
88
|
-
`{"organisation": {"id", "name"}, "project"?, "ref"?}`. An object value gains a `scope` key.
|
|
91
|
+
`{"organisation": {"id", "name"}, "project"?, "ref"?}`. An object value normally gains a `scope` key.
|
|
89
92
|
A value that is an array or null, such as the list from `openeng projects list`, comes wrapped as
|
|
90
|
-
`{"scope": {...}, "value": <the original value>}`.
|
|
91
|
-
field.
|
|
93
|
+
`{"scope": {...}, "value": <the original value>}`. Rules command successes always use this wrapper
|
|
94
|
+
to preserve the rule's own `scope` field. Organisation-ref, lock, ceiling and schema-update
|
|
95
|
+
successes also always use `{ scope, value }`. A command with no scope carries no `scope` field.
|
|
92
96
|
- A `not-found` in an organisation is often a project or a ref that belongs to another one. The
|
|
93
97
|
command prints "not found in organisation <name>: check that you are attached to the correct
|
|
94
98
|
organisation (openeng org current)". Run `openeng org current`; if it names the wrong organisation,
|
|
@@ -137,28 +141,117 @@ watchers are admitted; the publication validator decides whether a declaration i
|
|
|
137
141
|
|
|
138
142
|
## 3. Write data
|
|
139
143
|
|
|
140
|
-
|
|
144
|
+
Write on the ref agreed with the person and within their authority. That may be `main` when
|
|
145
|
+
the applicable protections permit the write; an approved agent plan may also name an unprotected
|
|
146
|
+
project's `main`. Use a branch and review when a rule protects the ref or the person asks for it.
|
|
141
147
|
|
|
142
148
|
1. `openeng help objects-sdk mutate` and `openeng help branches-sdk createBranch` for the fields, the
|
|
143
149
|
selector keys and an example each.
|
|
144
|
-
2. `openeng branches-sdk createBranch` makes
|
|
145
|
-
written `<project id>/<name>`.
|
|
150
|
+
2. When a branch is needed, `openeng branches-sdk createBranch` makes one in the project. It
|
|
151
|
+
answers the branch's ref, written `<project id>/<name>`.
|
|
146
152
|
3. `openeng objects-sdk mutate` creates, changes or deletes an object or an edge on that ref. A ref in
|
|
147
|
-
a selector takes one of
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
153
|
+
a selector takes one of three forms: the organisation trunk is the bare `main`; a project
|
|
154
|
+
branch is its whole ref, `<project id>/<name>`; an organisation ref is its bare name.
|
|
155
|
+
The server derives the organisation from the token. Use the agreed ref for writes and read
|
|
156
|
+
back from that same ref with
|
|
157
|
+
`openeng objects-sdk readObject` and `openeng objects-sdk queryObjects`.
|
|
151
158
|
4. Read back what you wrote: `openeng objects-sdk readObject` for one object, or
|
|
152
159
|
`openeng objects-sdk queryObjects` for a list. Use the type key and version the project's
|
|
153
|
-
`openeng types list` showed.
|
|
160
|
+
`openeng types list` showed. For an object's edges use `openeng objects-sdk queryGraph`;
|
|
161
|
+
for paths use `openeng objects-sdk findPaths`. Confirm relationships through the CLI;
|
|
162
|
+
do not hand the check to the web app.
|
|
154
163
|
5. `openeng objects-sdk executeVerb` runs a verb a type defines. `openeng objects-sdk discoverVerbs` lists
|
|
155
164
|
the verbs available.
|
|
156
|
-
6. `openeng branches-sdk submitProposal` sends
|
|
157
|
-
`name` alone, the part of the ref after the slash.
|
|
165
|
+
6. When using a branch for review, `openeng branches-sdk submitProposal` sends it for review. It
|
|
166
|
+
names the branch by its `name` alone, the part of the ref after the slash.
|
|
158
167
|
|
|
159
168
|
If a command is refused, the refusal names the field and its allowed kinds. Run
|
|
160
169
|
`openeng help <module> <method>` again and compare.
|
|
161
170
|
|
|
171
|
+
### Read relationships back after a write
|
|
172
|
+
|
|
173
|
+
Run `openeng help objects-sdk queryGraph` first. Take the project and object identifiers from
|
|
174
|
+
the confirmed write and replace the placeholders below. One start address and one hop step
|
|
175
|
+
read that object's connections, including the edges in the answer:
|
|
176
|
+
|
|
177
|
+
```sh
|
|
178
|
+
openeng objects-sdk queryGraph --host https://api.openeng.io --selector '{"projectId":"<project-id>","ref":"<project-id>/<branch>"}' --input '{"kind":"graph","start":{"kind":"objects","objects":[{"projectId":"<project-id>","objectId":"<object-id>"}]},"steps":[{"depth":1}]}' --json
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Check the returned hops against the relationships you wrote. Use `findPaths` for paths across
|
|
182
|
+
several objects; read its help before supplying input.
|
|
183
|
+
|
|
184
|
+
## Project ref rules
|
|
185
|
+
|
|
186
|
+
A project rule may protect `main` or refs under that project's identifier. A matching
|
|
187
|
+
`merge-only` rule requires changes through a branch and merge. A `locked-rows-only` rule binds
|
|
188
|
+
merge-only row locks on the matching ref while leaving unlocked rows direct.
|
|
189
|
+
|
|
190
|
+
Rule management is the person's workflow: they must hold `administer projects` on the project
|
|
191
|
+
and run these commands themselves. Never add or remove rules on their behalf, including to
|
|
192
|
+
get past a refusal.
|
|
193
|
+
|
|
194
|
+
1. The person runs `openeng rules add --project <id> --pattern main --consequence merge-only`
|
|
195
|
+
to protect the project's trunk. The answer includes the rule's identifier. Adding the same
|
|
196
|
+
content again returns the existing rule.
|
|
197
|
+
2. `openeng rules list --project <id>` reads the visible rules, their identifiers, patterns and
|
|
198
|
+
consequences; it needs `read` on the project.
|
|
199
|
+
3. To lift one rule, the person runs `openeng rules remove --project <id> --rule-id <id>` with
|
|
200
|
+
the identifier from the list. An absent identifier or one from another project answers
|
|
201
|
+
`not-found`. Removal is audited, as is addition, and takes effect on the next request.
|
|
202
|
+
Other matching rules and row locks may still protect the ref's rows.
|
|
203
|
+
|
|
204
|
+
## Organisation rules, refs, locks and agent ceilings
|
|
205
|
+
|
|
206
|
+
These protections are managed by the person. Never change rules, refs or locks yourself,
|
|
207
|
+
including to get past a refusal. Read their current state and ask the person to make a change.
|
|
208
|
+
Each command's `--help` names the person's capability. A `not-permitted` refusal carries no
|
|
209
|
+
capability; read the help line before asking the person to seek permission.
|
|
210
|
+
|
|
211
|
+
- The person uses the rules commands above with `--organisation` instead of `--project <id>`
|
|
212
|
+
for organisation rules, for example
|
|
213
|
+
`openeng rules add --organisation --pattern release-v1 --consequence merge-only`.
|
|
214
|
+
Choose exactly one flag. `--organisation` takes no value and uses the attached organisation.
|
|
215
|
+
`openeng rules list --organisation` reads the rules;
|
|
216
|
+
`openeng rules remove --organisation --rule-id <id>` removes one by its identifier.
|
|
217
|
+
Adding or removing needs `administer projects` in the attached organisation; listing needs `read`.
|
|
218
|
+
- `openeng org-refs list` reads organisation refs and their read-only state. The person creates
|
|
219
|
+
one with `openeng org-refs create --name <name> [--read-only]`, marks it read-only with
|
|
220
|
+
`openeng org-refs mark-read-only --name <name>`, or deletes a writable one with
|
|
221
|
+
`openeng org-refs delete --name <name>`. Names are single segments, such as `release-v1`.
|
|
222
|
+
Creating, deleting and marking need `administer projects` in the attached organisation;
|
|
223
|
+
listing needs `read`.
|
|
224
|
+
- The person sets or lifts an object's lock with
|
|
225
|
+
`openeng locks set --project <id> --ref <ref> --object <objectId> --lock <none|merge-only|frozen>`.
|
|
226
|
+
`none` lifts it. The lock also applies to its existing structural child edges in the selected
|
|
227
|
+
project. New children on a live ref are not thereby frozen. Use a read-only organisation ref
|
|
228
|
+
for a fixed baseline. This needs `lock objects` on the selected project.
|
|
229
|
+
- `openeng ceiling show --project <id>` reads the maximum agent role. The person sets it with
|
|
230
|
+
`openeng ceiling set --project <id> --ceiling <contributor|maintainer>`.
|
|
231
|
+
Showing needs `read`; setting needs `administer projects` on the selected project.
|
|
232
|
+
|
|
233
|
+
## Protection refusals
|
|
234
|
+
|
|
235
|
+
When a command returns one of these rules, follow its action and do not repeat the same request:
|
|
236
|
+
|
|
237
|
+
- `immutable`: the type forbids changing or deleting the record on every ref. Leave it unchanged.
|
|
238
|
+
- `owned`: a connected system alone writes the record. Ask that system to make the change.
|
|
239
|
+
- `frozen`: someone with the lock capability must lift the lock. Ask that person; do not try a
|
|
240
|
+
different ref.
|
|
241
|
+
- `protected`: a rule allows the record to change only through a merge from a branch. Make the
|
|
242
|
+
change on a branch and merge it.
|
|
243
|
+
- `not-a-ref-head`: the commit is not the head of a ref you can use. Read the usable refs and
|
|
244
|
+
choose one of their heads; the refusal does not identify which commit or ref was involved.
|
|
245
|
+
- `branch-needs-schema-update`: the ref's schema must be updated before writing. The
|
|
246
|
+
person can run `openeng schema-update request --ref <ref>` to record a request, then
|
|
247
|
+
`openeng schema-update show --ref <ref>` to read its state or `no request`. Stop writing while
|
|
248
|
+
the ref needs an update; recording a request does not execute the update. Requesting needs
|
|
249
|
+
`write ref` on the branch's home project, or `administer projects` for an organisation ref;
|
|
250
|
+
showing reads only the requester's records in the token organisation and needs no project read
|
|
251
|
+
access. A branch whose name contains `/` cannot request or show a schema update today.
|
|
252
|
+
- `organisation-not-ready`: the organisation's trunk is not ready. Try again shortly.
|
|
253
|
+
- `read-only-ref`: nothing can be written or merged into this ref. Choose a writable ref.
|
|
254
|
+
|
|
162
255
|
## 4. Link to a page
|
|
163
256
|
|
|
164
257
|
To give the person a page, run `openeng link` and hand them the address it prints; never write a path
|
|
@@ -170,6 +263,15 @@ project. `openeng link ontology --ref <ref>` and `openeng link change-set --ref
|
|
|
170
263
|
project, and `openeng link organisation-page <page>` takes neither flag. The organisation is the one
|
|
171
264
|
your session is attached to.
|
|
172
265
|
|
|
266
|
+
Every kind with `--ref`, including `ontology` and `change-set`, takes `main` or
|
|
267
|
+
`<projectId>/<branch>`, the ref the platform returns. A bare branch name or change-set id is
|
|
268
|
+
refused by `openeng link`. Before printing, the command reads the ref and the page's own subject;
|
|
269
|
+
a subject it cannot find is a refusal with a reason and no printed address.
|
|
270
|
+
|
|
271
|
+
An **App** is an organisation entity with its own pages and drafts, linked by `openeng link app`.
|
|
272
|
+
An **App view** is a type's collection content in `presentationBindings.views.app`, root `AppBody`,
|
|
273
|
+
and cannot be linked by `link app`.
|
|
274
|
+
|
|
173
275
|
## 5. Show data to the person
|
|
174
276
|
|
|
175
277
|
The CLI draws nothing. Read the `--json` output of a query or a read and draw it yourself, as a
|
|
@@ -209,10 +311,10 @@ The order, from no connection to a first imported document:
|
|
|
209
311
|
`succeeded` or `failed`.
|
|
210
312
|
5. `openeng connector revoke <connection>` ends the connection.
|
|
211
313
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
314
|
+
The connected system alone writes records of its owned types. A person's write is refused as
|
|
315
|
+
`owned`. People put their own information in separate rows and link those rows to the mirrored
|
|
316
|
+
records. The importer counts updates to mirrored properties as `overwritten`. If a mirrored
|
|
317
|
+
record is absent, the importer creates it with a new identifier and counts it as `created`.
|
|
216
318
|
|
|
217
319
|
Refusals you will meet, with what each means and what to do:
|
|
218
320
|
|