@vention/vention-skills 0.10.9 → 0.10.10
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/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/vention-design/SKILL.md +1 -1
- package/skills/vention-machine-logic/SKILL.md +4 -3
- package/skills/vention-machine-logic-hmi/SKILL.md +3 -3
- package/skills/vention-machine-logic-hmi/examples/indexing-station-hmi/customui/src/pages/operate-page.tsx +47 -27
- package/skills/vention-monitoring/SKILL.md +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Vention skills
|
|
2
2
|
|
|
3
|
-
Version 0.10.
|
|
3
|
+
Version 0.10.10. Skills for coding agents that work with Vention machines, packaged as one plugin, `vention`, in the `vention-skills` marketplace.
|
|
4
4
|
|
|
5
5
|
| Skill | What it does |
|
|
6
6
|
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
|
package/package.json
CHANGED
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "vention",
|
|
4
|
-
"version": "0.10.
|
|
4
|
+
"version": "0.10.10",
|
|
5
5
|
"description": "Vention skills for coding agents: write MachineLogic applications, build machine designs, and diagnose deployed machines.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Vention"
|
|
@@ -3,7 +3,7 @@ name: vention-design
|
|
|
3
3
|
description: Create, build and edit Vention machine designs and design graphs for agentic layout. Use when the user wants to start a new design, lay out an automation cell, add or reposition components in a Vention design, generate a machine layout from a description, add or place a floor plan image under a design, list a design's versions, or inspect an existing design graph. Trigger on MachineBuilder designs, design graphs, assembly graphs, extrusions, actuators, robot mounting, cell footprints, floor plans, or a machine-builder URL.
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: "0.10.
|
|
6
|
+
version: "0.10.10"
|
|
7
7
|
author: Vention
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: vention-machine-logic
|
|
|
3
3
|
description: Write, edit, validate, and deploy MachineLogic Python applications for Vention machines with the machine-logic-sdk and the Vention CLI. Load it before writing or changing any Python that talks to a Vention machine, however short, since device names and version-specific SDK calls come from here. Use to program a Vention machine or MachineMotion controller, drive actuators, conveyors, robots, pneumatics, or digital I/O, change an existing application, build a state machine, debug from logs, or pull, push, or link with the Vention CLI (vention or vn). Trigger on MachineLogic, machine-logic-sdk, MachineMotion, MachineBuilder applications, the Vention CLI, or a directory holding .machine-code-app-directory-info.json. Printing what the machine or robot holds now (positions, taught targets, calibration, I/O) is a program: files on disk hold only as-designed values. Not for explaining an existing machine or its configuration in words when no program is asked for, nor for Python that never touches the machine.
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: "0.10.
|
|
6
|
+
version: "0.10.10"
|
|
7
7
|
machine-logic-sdk: ">=3.0,<4"
|
|
8
8
|
author: Vention
|
|
9
9
|
---
|
|
@@ -244,9 +244,10 @@ Each example is a standalone `main.py` whose module docstring names the device n
|
|
|
244
244
|
3. pyright cannot check a name passed as a string. Check every name passed to `get_*` and `move_to_target*` with a case-sensitive `grep -F '"<name>"'` against `.vention-design-configuration.json` or `.vention-design-scene-assets.json`, and fix any that does not match exactly.
|
|
245
245
|
4. If `uv` is missing or the install fails, tell the user the code is unvalidated. Never report a check you could not run as passed.
|
|
246
246
|
5. `vention push`, then run the application on the digital twin from MachineBuilder before any hardware run. One or two full cycles prove the cycle; each extra one costs a cycle time and shows nothing the first two did not. Run them at 100 % of the speed setting, chosen for that run: nothing on the twin can be hurt.
|
|
247
|
-
6. Read the output with `vention logs` once the run ends, rather than following it while the cycles play. `vention logs` prints only the most recent lines, so a count of matching lines can stop rising before the run ends. Print each cycle's measured time. When the cycle time is unknown, sleep once for one cycle's estimate, read `vention logs` once for the measured time, then sleep once for the cycles left: a rounded-up guess for the whole run wastes the difference. Never loop over `vention logs` waiting for a line to appear, and never end your turn while a background wait is running. MachineLogic failures name the device and the reason; read the log before proposing a change.
|
|
247
|
+
6. Read the output with `vention logs` once the run ends, rather than following it while the cycles play. `vention logs` prints only the most recent lines, so a count of matching lines can stop rising before the run ends. Print each cycle's measured time. When the cycle time is unknown, sleep once for one cycle's estimate, read `vention logs` once for the measured time, then sleep once for the cycles left: a rounded-up guess for the whole run wastes the difference. Before that first sleep, read `vention logs` once a few seconds after starting the run, to see that the first cycle began: a run stuck before its first move would otherwise cost the whole sleep. Print a line before every call that can block for long, such as a home or a long move, not only after it, so a log that stops shows which call it stopped in. Never loop over `vention logs` waiting for a line to appear, and never end your turn while a background wait is running. MachineLogic failures name the device and the reason; read the log before proposing a change.
|
|
248
248
|
7. Check a motion from the log, not by watching the twin: `print` the robot's joint angles or the axis position at each step, then compare them with what the step should reach. For a repeated or oscillating motion, such as a wave, print the joint angles at each end of the swing, so the log alone shows how far it moved and which joints moved.
|
|
249
|
-
8.
|
|
249
|
+
8. On the digital twin, an axis finishes homing only when the design places a target in front of its home sensor. Otherwise `home()` never returns, even past its timeout, because the SDK keeps retrying the request. Never delete the homing to get past this: the hardware needs it. Tell the user the twin cannot home that axis until its home sensor faces a target in the design, and ask whether to skip the home on the twin only.
|
|
250
|
+
9. Pressing the emergency stop on the digital twin's pendant does nothing, so skip that test there. Tell the user the e-stop path is untested until the first run on the real cell.
|
|
250
251
|
9. Show the user the diff before pushing over an application they did not write in this session.
|
|
251
252
|
|
|
252
253
|
## Deploying to a real cell
|
|
@@ -3,7 +3,7 @@ name: vention-machine-logic-hmi
|
|
|
3
3
|
description: Build or edit the custom operator HMI of a MachineLogic application, the React touch screen in customui/ that runs in MachineBuilder and on the MachineMotion pendant, wired to the application's Python process through vention-communication. Use when the user asks for an operator screen, a custom HMI or UI, a touch panel, start and stop buttons, live machine state on screen, or recipes an operator picks, for a Vention machine or inside a directory holding .machine-code-app-directory-info.json. Uses @vention/machine-ui, @vention/machine-apps-components and @vention/machine-logic-ui-sdk. Do not use for the no-code HMI Builder, or for the Python motion logic alone (that is vention-machine-logic).
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: "0.10.
|
|
6
|
+
version: "0.10.10"
|
|
7
7
|
author: Vention
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -152,12 +152,12 @@ The machine-apps-components README is behind its code: `NavigationBar` takes `Na
|
|
|
152
152
|
|
|
153
153
|
- Wrap the app in `machineUiHmiTheme`.
|
|
154
154
|
- Give the app an Operate page at `/`, any setup pages it needs (such as Recipes, and a Settings page holding the speed setting of an app that runs on hardware), and a Logs page: a `LogsPanel` fed by the Events stream, as the example's `logs-page.tsx` does, where the operator finds out why a cycle faulted. Nav labels name the page and never echo a top-bar action, and their icons don't suggest one. Never "Run", "Start" or a play icon: beside the top bar's Start, the operator reads it as a second Start button.
|
|
155
|
-
- The Operate page is what the operator watches during a run, so it reads from across the cell. Copy the example's `operate-page.tsx` and adapt it rather than starting from a blank page. In every state (idle, starting, running, stopping, after a run, fault, disconnected) show the same regions from top to bottom, never swapped for a placeholder when no cycle runs: the step in progress named inside a ring that fills against the last cycle's time, or by steps done while no cycle has been timed yet, with the elapsed time counting up and no indeterminate spinner, beside the recipe and the cycles done and rate; the cycle's steps as a row of tiles, the current one lit; and the run's progress bar. Before a run they show the next run's plan, after one its result until the next Start, and on a fault the step that faulted. The example is part of this skill, so open and copy it even when the user says not to copy code from their computer: copy its StepRing, StepRail and CycleProgress as they are, and publish the step, the cycle's elapsed time and `cycles_done` on the status stream as its `enter_step` and `run_cycles` do. A single `VentionProgressBar` cannot mark the cycles a Stop cancels. Below them go the
|
|
155
|
+
- The Operate page is what the operator watches during a run, so it reads from across the cell. Copy the example's `operate-page.tsx` and adapt it rather than starting from a blank page. In every state (idle, starting, running, stopping, after a run, fault, disconnected) show the same regions from top to bottom, never swapped for a placeholder when no cycle runs: the step in progress named inside a ring that fills against the last cycle's time, or by steps done while no cycle has been timed yet, with the elapsed time counting up and no indeterminate spinner, beside the recipe and the cycles done and rate; the cycle's steps as a row of tiles, the current one lit; and the run's progress bar. The page fills the screen, laid out as the example does: no max width, the ring sized from the screen height, the recipe, readouts and step tiles in a column beside it, and the progress bar across the full width. The ring's text sits in a box inside the ring's inner circle and wraps, so a long step name never crosses the stroke. Before a run they show the next run's plan, after one its result until the next Start, and on a fault the step that faulted. The example is part of this skill, so open and copy it even when the user says not to copy code from their computer: copy its StepRing, StepRail and CycleProgress as they are, and publish the step, the cycle's elapsed time and `cycles_done` on the status stream as its `enter_step` and `run_cycles` do. A single `VentionProgressBar` cannot mark the cycles a Stop cancels. Below them, side by side, go the choices for the next run, such as the recipe (disabled while one runs), and one short paragraph on what Start and Stop do. The speed setting stays on the Settings page. Leave out what the operator can neither change nor act on, such as axis stops, taught positions or device names, here and in the Start confirmation: they are the program's constants, not the run's. Lay it out with `Box` or `Stack` gaps, each readout a label above its value in theme text variants. Never set `fontSize` or `lineHeight`: a value sized by hand overlaps its label.
|
|
156
156
|
- Show each piece of information in one place only. The `StatusTopBar` already shows the state, so a page never repeats it, not even as a status indicator or an alert titled with the same word. A page adds only what the bar cannot say: the cause of a fault, what happens next, what to do.
|
|
157
157
|
- The screen fits the pendant without scrolling: keep `body { margin: 0 }` from the example's `index.html`, or the full-viewport root overflows it. Only the page area between the two bars scrolls.
|
|
158
158
|
- Exactly one way back to Control Center: the `NavigationBar`'s own button, which confirms before leaving. Keep `ui.showDefaultBackToControlCenterButton` `false` in `project.json`, or the pendant lays a second one over the screen.
|
|
159
159
|
- Set `size="x-large"` or `size="xx-large"` on every control that takes a size. The default `"small"` is 24 px, below the 44 px touch minimum.
|
|
160
|
-
- Text uses the `heading*` and `paragraph*` typography variants: `
|
|
160
|
+
- Text uses the `heading*` and `paragraph*` typography variants: `heading36Bold` for the readouts the operator watches from across the cell, such as the cycle count, `heading24SemiBold` for titles and the ring's step, `heading18SemiBold` for labels, `paragraph18Medium` for detail. The theme marks `hmiText*` deprecated.
|
|
161
161
|
- Leave at least 16 px between adjacent touch targets and 24 px between buttons with opposite effects, such as Save and Delete. `theme.spacing` is a lookup table, not a multiplier: `gap: 2` is 8 px, `gap: 4` is 16 px, `gap: 5` is 24 px.
|
|
162
162
|
- Give each state one color from `COLORS` and always a text label next to it: green for running, amber for stopping or a warning, red for a fault, slate for ready, idle or disconnected.
|
|
163
163
|
- Nothing an operator needs lives only in a tooltip. No drag, swipe or multi-touch gestures: every action is a tap.
|
|
@@ -19,6 +19,8 @@ type Phase = "idle" | "starting" | "running" | "stopping" | "done" | "fault"
|
|
|
19
19
|
const HATCHED = `repeating-linear-gradient(45deg, ${COLORS.slate[100]} 0 8px, ${COLORS.slate[200]} 8px 16px)`
|
|
20
20
|
const RING_RADIUS = 52
|
|
21
21
|
const RING_LENGTH = 2 * Math.PI * RING_RADIUS
|
|
22
|
+
// Sized from the screen height so the ring stays the page's largest element on any pendant.
|
|
23
|
+
const RING_SIZE = "clamp(200px, 40vh, 400px)"
|
|
22
24
|
const TICK_MS = 250
|
|
23
25
|
const LIT: Partial<Record<Phase, string>> = { running: COLORS.blue[500], stopping: COLORS.amber[500], fault: COLORS.red[600] }
|
|
24
26
|
|
|
@@ -74,8 +76,8 @@ function StepRing({
|
|
|
74
76
|
const filled = phase === "done" || phase === "fault" ? 1 : cycling ? timedFill : 0
|
|
75
77
|
const color = LIT[phase] ?? COLORS.slate[400]
|
|
76
78
|
return (
|
|
77
|
-
<Box sx={{ position: "relative", width:
|
|
78
|
-
<svg viewBox="0 0 120 120" width=
|
|
79
|
+
<Box sx={{ position: "relative", width: RING_SIZE, height: RING_SIZE, flexShrink: 0, justifySelf: "center" }}>
|
|
80
|
+
<svg viewBox="0 0 120 120" width="100%" height="100%" aria-hidden="true">
|
|
79
81
|
<circle cx={60} cy={60} r={RING_RADIUS} fill="none" stroke={COLORS.slate[100]} strokeWidth={8} />
|
|
80
82
|
<circle
|
|
81
83
|
cx={60}
|
|
@@ -91,18 +93,20 @@ function StepRing({
|
|
|
91
93
|
</svg>
|
|
92
94
|
<Box
|
|
93
95
|
sx={{
|
|
96
|
+
// A square this wide stays inside the ring's inner circle, so a long step name wraps instead of crossing the stroke.
|
|
94
97
|
position: "absolute",
|
|
95
|
-
inset:
|
|
98
|
+
inset: "22%",
|
|
96
99
|
display: "flex",
|
|
97
100
|
flexDirection: "column",
|
|
98
101
|
alignItems: "center",
|
|
99
102
|
justifyContent: "center",
|
|
100
103
|
textAlign: "center",
|
|
101
104
|
gap: 1,
|
|
105
|
+
overflowWrap: "anywhere",
|
|
102
106
|
}}
|
|
103
107
|
>
|
|
104
|
-
{StepIcon && <StepIcon size={
|
|
105
|
-
<Typography variant="
|
|
108
|
+
{StepIcon && <StepIcon size={40} color={color} />}
|
|
109
|
+
<Typography variant="heading24SemiBold">{label ?? current?.label ?? step}</Typography>
|
|
106
110
|
{cycling && (
|
|
107
111
|
<Typography variant="paragraph18Medium">
|
|
108
112
|
{Math.floor(elapsed)} s{expected > 0 && ` of ~${Math.round(expected)} s`}
|
|
@@ -130,7 +134,7 @@ function StepRail({ step, phase }: { step: string; phase: Phase }) {
|
|
|
130
134
|
<Box
|
|
131
135
|
sx={{
|
|
132
136
|
width: "100%",
|
|
133
|
-
height:
|
|
137
|
+
height: 80,
|
|
134
138
|
borderRadius: 2,
|
|
135
139
|
background,
|
|
136
140
|
display: "flex",
|
|
@@ -138,7 +142,7 @@ function StepRail({ step, phase }: { step: string; phase: Phase }) {
|
|
|
138
142
|
justifyContent: "center",
|
|
139
143
|
}}
|
|
140
144
|
>
|
|
141
|
-
<StepIcon size={
|
|
145
|
+
<StepIcon size={36} color={iconColor} />
|
|
142
146
|
</Box>
|
|
143
147
|
<Typography variant={current ? "heading18SemiBold" : "paragraph18Medium"}>{name}</Typography>
|
|
144
148
|
</Box>
|
|
@@ -152,7 +156,7 @@ function Counter({ label, value }: { label: string; value: string }) {
|
|
|
152
156
|
return (
|
|
153
157
|
<Box sx={{ display: "flex", flexDirection: "column", gap: 1, padding: 4, borderRadius: 2, background: COLORS.slate[50] }}>
|
|
154
158
|
<Typography variant="paragraph18Medium">{label}</Typography>
|
|
155
|
-
<Typography variant="
|
|
159
|
+
<Typography variant="heading36Bold">{value}</Typography>
|
|
156
160
|
</Box>
|
|
157
161
|
)
|
|
158
162
|
}
|
|
@@ -163,7 +167,7 @@ function CycleProgress({ cycle, done, cycleCount, phase }: { cycle: number; done
|
|
|
163
167
|
const finished = inCycle ? cycle - 1 : done
|
|
164
168
|
const rest = cycleCount - finished - (inCycle ? 1 : 0)
|
|
165
169
|
const cancelled = (phase === "stopping" || phase === "done") && rest > 0
|
|
166
|
-
const segment = (count: number, background: string) => <Box sx={{ flex: count, height:
|
|
170
|
+
const segment = (count: number, background: string) => <Box sx={{ flex: count, height: 24, borderRadius: 1, background }} />
|
|
167
171
|
const total = phase === "stopping" && cancelled ? <s>{cycleCount}</s> : cycleCount
|
|
168
172
|
return (
|
|
169
173
|
<Box sx={{ display: "flex", flexDirection: "column", gap: 2 }}>
|
|
@@ -207,7 +211,7 @@ export function OperatePage({ status, connected, recipe, onRecipeChange, onError
|
|
|
207
211
|
}
|
|
208
212
|
|
|
209
213
|
return (
|
|
210
|
-
<Box sx={{ display: "flex", flexDirection: "column", gap: 6
|
|
214
|
+
<Box sx={{ display: "flex", flexDirection: "column", gap: 6 }}>
|
|
211
215
|
{status !== undefined && status.fault !== "" && (
|
|
212
216
|
<VentionAlert
|
|
213
217
|
severity="error"
|
|
@@ -218,7 +222,14 @@ export function OperatePage({ status, connected, recipe, onRecipeChange, onError
|
|
|
218
222
|
/>
|
|
219
223
|
)}
|
|
220
224
|
<Box sx={{ display: "flex", flexDirection: "column", gap: 5, opacity: connected ? 1 : 0.5 }}>
|
|
221
|
-
<Box
|
|
225
|
+
<Box
|
|
226
|
+
sx={{
|
|
227
|
+
display: "grid",
|
|
228
|
+
gridTemplateColumns: { xs: "minmax(0, 1fr)", md: "auto minmax(0, 1fr)" },
|
|
229
|
+
alignItems: "center",
|
|
230
|
+
gap: 6,
|
|
231
|
+
}}
|
|
232
|
+
>
|
|
222
233
|
<StepRing
|
|
223
234
|
step={idle ? STEPS[0].name : status.step}
|
|
224
235
|
elapsed={elapsed}
|
|
@@ -226,7 +237,7 @@ export function OperatePage({ status, connected, recipe, onRecipeChange, onError
|
|
|
226
237
|
phase={phase}
|
|
227
238
|
label={ringLabel(phase, status)}
|
|
228
239
|
/>
|
|
229
|
-
<Box sx={{
|
|
240
|
+
<Box sx={{ minWidth: 0, display: "flex", flexDirection: "column", gap: 5 }}>
|
|
230
241
|
<Typography variant="heading24SemiBold">{idle ? (recipe?.name ?? "No recipe chosen") : status.recipeName}</Typography>
|
|
231
242
|
{phase === "stopping" && <Typography variant="paragraph18Medium">The emergency stop halts at once.</Typography>}
|
|
232
243
|
<Box sx={{ display: "grid", gridTemplateColumns: "repeat(2, minmax(0, 1fr))", gap: 4 }}>
|
|
@@ -236,9 +247,9 @@ export function OperatePage({ status, connected, recipe, onRecipeChange, onError
|
|
|
236
247
|
value={lastCycleSeconds > 0 ? `${Math.round(3600 / lastCycleSeconds)} parts/h` : idle ? "–" : "After cycle 1"}
|
|
237
248
|
/>
|
|
238
249
|
</Box>
|
|
250
|
+
<StepRail step={idle ? "" : status.step} phase={phase} />
|
|
239
251
|
</Box>
|
|
240
252
|
</Box>
|
|
241
|
-
<StepRail step={idle ? "" : status.step} phase={phase} />
|
|
242
253
|
<CycleProgress
|
|
243
254
|
cycle={status?.cycle ?? 0}
|
|
244
255
|
done={status?.cyclesDone ?? 0}
|
|
@@ -246,20 +257,29 @@ export function OperatePage({ status, connected, recipe, onRecipeChange, onError
|
|
|
246
257
|
phase={phase}
|
|
247
258
|
/>
|
|
248
259
|
</Box>
|
|
249
|
-
<
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
260
|
+
<Box
|
|
261
|
+
sx={{
|
|
262
|
+
display: "grid",
|
|
263
|
+
gridTemplateColumns: { xs: "minmax(0, 1fr)", md: "repeat(2, minmax(0, 1fr))" },
|
|
264
|
+
alignItems: "end",
|
|
265
|
+
gap: 6,
|
|
266
|
+
}}
|
|
267
|
+
>
|
|
268
|
+
<VentionSelect
|
|
269
|
+
size="xx-large"
|
|
270
|
+
variant="outlined"
|
|
271
|
+
labelText="Recipe"
|
|
272
|
+
placeholder="Choose a recipe"
|
|
273
|
+
value={recipe?.id ?? ""}
|
|
274
|
+
isDisabled={!canStart(status, connected)}
|
|
275
|
+
onChange={event => onRecipeChange(recipes.find(candidate => candidate.id === Number(event.target.value)))}
|
|
276
|
+
menuItems={recipes.map(candidate => ({ value: candidate.id, displayText: candidate.name }))}
|
|
277
|
+
/>
|
|
278
|
+
<Typography variant="paragraph18Medium">
|
|
279
|
+
Start indexes a part, clamps it, dwells and releases it, once for each cycle of the recipe. Stop finishes the move in progress,
|
|
280
|
+
then opens the clamp. The emergency stop halts everything at once.
|
|
281
|
+
</Typography>
|
|
282
|
+
</Box>
|
|
263
283
|
</Box>
|
|
264
284
|
)
|
|
265
285
|
}
|
|
@@ -3,7 +3,7 @@ name: vention-monitoring
|
|
|
3
3
|
description: Diagnose deployed Vention machines from controller state, history, health, and activity data. Use when the user reports a machine that is down, faulted, offline, slow, or underperforming, asks why a cycle time regressed, wants to interpret MachineMotion event data or drive and brake status, asks about OEE or uptime, or wants to know which machine in a fleet needs attention. Trigger on a MachineMotion serial number plus any complaint.
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: "0.10.
|
|
6
|
+
version: "0.10.10"
|
|
7
7
|
author: Vention
|
|
8
8
|
---
|
|
9
9
|
|