@aryacode/dsh-engineering 0.4.3 → 0.4.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.4] - 2026-10-25
4
+
5
+ ### Changed
6
+
7
+ - **One row per product instead of one per surface.** The Plugins page now lists five rows — `l5x`,
8
+ `ftview`, `mwi`, `viewers`, `optix` — instead of sixteen. Each product row mounts its whole surface,
9
+ so one switch turns a product off instead of four.
10
+ - **The optional surfaces are the row's config.** `entries/l5x.js` mounts read + guidance and takes
11
+ `editing`, `studio` and `live` (all off by default); `entries/ftview.js` takes `edit` and `studio`
12
+ (both on); `entries/mwi.js` takes `edit` (off). The defaults are unchanged — a read-only profile
13
+ still pays only for the read surfaces — but the toggle now lives with the product it belongs to.
14
+ - Row ids change from `l5x-read` / `ftview-edit` / `mwi-verify` to `l5x` / `ftview` / `mwi`, so a
15
+ profile's per-row enable state resets once on upgrade. The product-level defaults are identical.
16
+ - Legacy subpath exports are kept (`./l5x/read`, `./ftview/edit`, `./mwi/verify`, …) so a profile
17
+ patch that still names one of them keeps working.
18
+
19
+ ### Note
20
+
21
+ The grouping is plugin-side by choice: `cordis:group` exists in the patch format, but the Plugins
22
+ page skips group rows (`plugin-manager/src/index.ts`: "Group rows are containers … their children
23
+ carry the switches"), so a group switch is a shell feature rather than a bundle one. Collapsing the
24
+ row list is what a bundle can do on its own, without a harness change to maintain across DSH
25
+ upgrades.
26
+
3
27
  ## [0.4.3] - 2026-10-25
4
28
 
5
29
  ### Fixed
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  MotionWorks IEC and FactoryTalk Optix sit behind a single install, one row per surface. A row is the
5
5
  switch: disable it and that plugin unloads, so its tool schemas leave the request.
6
6
 
7
- `@aryacode/dsh-engineering` · 79 tools · 16 rows · 4 products · MIT
7
+ `@aryacode/dsh-engineering` · 79 tools · 5 rows · 4 products · MIT
8
8
 
9
9
  ---
10
10
 
@@ -14,17 +14,18 @@ A general assistant pays for every tool schema on every request. An automation e
14
14
  surfaces — reading a 3 MB L5X, comparing two projects, staging ladder edits, talking to a controller —
15
15
  but only one or two of them at a time.
16
16
 
17
- This bundle splits those surfaces into independently switchable rows. The expensive ones are off by
18
- default, so a read-only profile pays for the read tools and nothing else:
17
+ This bundle splits those surfaces into one row per product. The expensive surfaces are a switch inside
18
+ the row, off by default, so a read-only profile pays for the read tools and nothing else:
19
19
 
20
- | Row | Default | What a disabled row removes |
21
- |---|---|---|
22
- | `l5x-editing` | off | the nine `draft_*` schemas |
23
- | `l5x-studio` | off | the Logix Designer SDK and supervised controller schemas |
24
- | `l5x-live` | off | the EtherNet/IP polling and trend schemas |
25
- | `mwi-edit` | off | the seven MotionWorks edit schemas |
20
+ | Product row | Config option | Default | What turning it on adds |
21
+ |---|---|---|---|
22
+ | `l5x` | `editing` | off | the nine `draft_*` schemas |
23
+ | `l5x` | `studio` | off | the Logix Designer SDK and supervised controller schemas |
24
+ | `l5x` | `live` | off | the EtherNet/IP polling and trend schemas |
25
+ | `ftview` | `edit`, `studio` | on | staged ME edits and the Studio handoff |
26
+ | `mwi` | `edit` | off | the seven MotionWorks edit schemas |
26
27
 
27
- The previews are independent of the tools — switching L5X tools off does not remove the ladder viewer.
28
+ The previews are independent of the tools — switching a product off does not remove the ladder viewer.
28
29
  Both previews mount from **one** row (`viewers`), because a package registers exactly one browser
29
30
  bundle.
30
31
 
@@ -47,21 +48,23 @@ Tool groups, by product:
47
48
 
48
49
  ## Switches
49
50
 
50
- A row is a plugin. Disabling it in the profile (or on the Plugins page) unmounts that plugin and its
51
- tool schemas stop being sent; the guidance skill keeps its own row so reading guidance and reading
52
- tools switch separately.
51
+ A row is a plugin. Disabling it in the profile (or on the Plugins page) unmounts that product and its
52
+ tool schemas stop being sent. Each product's optional surfaces are config on the same row, so the
53
+ cheap decision — is this product on at all — takes one switch, and the fine decision lives one level
54
+ down:
53
55
 
54
- | Row | Surface | Default | Why the default |
55
- |---|---|---|---|
56
- | `l5x-read`, `l5x-read-skill` | offline reads, checks, comparison + guidance | on | cheap and safe |
57
- | `l5x-editing` | nine staged `draft_*` tools | **off** | a read-only profile should not pay for them |
58
- | `l5x-studio` | Logix Designer SDK and supervised controller | **off** | needs Studio 5000 installed |
59
- | `l5x-live` | EtherNet/IP polling and trends | **off** | needs a controller address |
60
- | `viewers` | ladder + ME display previews | on | adds no model context |
61
- | `ftview-read`, `ftview-read-skill`, `ftview-edit`, `ftview-studio` | FactoryTalk View ME read, edits, Studio handoff | on | small enough to default on |
62
- | `mwi-session`, `mwi-read`, `mwi-read-skill`, `mwi-verify` | MotionWorks IEC session, reads, verify + guidance | on | — |
63
- | `mwi-edit` | seven staged MotionWorks edits | **off** | the largest schemas in the bundle |
64
- | `optix` | FactoryTalk Optix Studio authoring | on | separate component package |
56
+ | Row | Mounts | Config options (default) |
57
+ |---|---|---|
58
+ | `l5x` | offline reads, checks, comparison and the `rockwell-l5x` guidance; optionally drafts, SDK, live | `editing` (off), `studio` (off), `live` (off) |
59
+ | `ftview` | FactoryTalk View ME read, guidance and edits; optionally the Studio handoff | `edit` (on), `studio` (on) |
60
+ | `mwi` | MotionWorks IEC session, reads, verify and guidance; optionally the edits | `edit` (off) |
61
+ | `viewers` | ladder + ME display previews | — |
62
+ | `optix` | FactoryTalk Optix Studio authoring | — |
63
+
64
+ **Why the row list collapsed.** The Plugins page lists a bundle's rows flat and skips `cordis:group`
65
+ containers (`plugin-manager/src/index.ts`: *"Group rows are containers … their children carry the
66
+ switches"*), so a group switch is a shell feature, not a bundle one. Five product rows with config is
67
+ what a bundle can do on its own — no harness change to carry across DSH upgrades.
65
68
 
66
69
  **No capability policy.** Earlier releases also carried a per-skill tool filter (`policyOnly` /
67
70
  `toolPolicy`) that gated tools by skill state. That filter is an AryaAI harness feature and is **not
@@ -108,6 +111,7 @@ Where each surface actually stands, based on what has been exercised.
108
111
 
109
112
  | Version | What landed |
110
113
  |---|---|
114
+ | **0.4.4** | One row per product: five rows, optional surfaces moved into each row's config |
111
115
  | **0.4.0** | Both previews fold into the bundle's own client face — one package, one browser bundle, 16 rows |
112
116
  | **0.3.0** | FactoryTalk Optix becomes a bundle component; 79 tools total |
113
117
  | **0.2.0** | MotionWorks IEC ports into the bundle — 24 tools over the COM bridge and saved-model engine, verified live; edit off by default |
@@ -142,38 +146,23 @@ another bundle owns.
142
146
  ```mermaid
143
147
  flowchart TB
144
148
  Profile["Profile bundle list"] --> Bundle["@aryacode/dsh-engineering"]
145
- Bundle -->|insert| L5XRead["l5x-read (on)"]
146
- L5XRead --> L5XSkill["l5x-read-skill (on)"]
147
- Bundle -->|insert| L5XEdit["l5x-editing (off)"]
148
- Bundle -->|insert| L5XStudio["l5x-studio (off)"]
149
- Bundle -->|insert| L5XLive["l5x-live (off)"]
149
+ Bundle -->|insert| L5X["l5x (on) — read + guidance; editing / studio / live off"]
150
+ Bundle -->|insert| FTV["ftview (on) — read, edits, Studio handoff"]
151
+ Bundle -->|insert| MWI["mwi (on) — session, read, verify; edit off"]
150
152
  Bundle -->|insert| Viewers["viewers (on) — ladder + ME display previews"]
151
- Bundle -->|insert| FTV["ftview-read / edit / studio (on)"]
152
- Bundle -->|insert| MWI["mwi-session / read / verify (on), edit (off)"]
153
153
  Bundle -->|insert| Optix["optix (on)"]
154
154
  ```
155
155
 
156
156
  Row ids are stable. Profiles and patches address these ids, so per-row enable state survives upgrades
157
157
  even when the implementation behind a row is replaced.
158
158
 
159
- | Row id | Package entry | Default |
159
+ | Row id | Package entry | Config options |
160
160
  |---|---|---|
161
- | `l5x-read` | `dsh-engineering-l5x` | on |
162
- | `l5x-read-skill` | `dsh-engineering-l5x/skill` | on |
163
- | `l5x-editing` | `dsh-engineering-l5x/editing` | off |
164
- | `l5x-studio` | `dsh-engineering-l5x/studio` | off |
165
- | `l5x-live` | `dsh-engineering-l5x/live` | off |
166
- | `viewers` | `@aryacode/dsh-engineering` (its own client face: ladder + ME display previews) | on |
167
- | `ftview-read` | `dsh-engineering-ftview` | on |
168
- | `ftview-read-skill` | `dsh-engineering-ftview/skill` | on |
169
- | `ftview-edit` | `dsh-engineering-ftview/edit` | on |
170
- | `ftview-studio` | `dsh-engineering-ftview/studio` | on |
171
- | `mwi-session` | `dsh-engineering-mwi` | on |
172
- | `mwi-read` | `dsh-engineering-mwi/read` | on |
173
- | `mwi-read-skill` | `dsh-engineering-mwi/skill` | on |
174
- | `mwi-verify` | `dsh-engineering-mwi/verify` | on |
175
- | `mwi-edit` | `dsh-engineering-mwi/edit` | off |
176
- | `optix` | `@aryacode/dsh-tool-ft-optix` | on |
161
+ | `l5x` | `dsh-engineering-l5x` | `editing` off · `studio` off · `live` off |
162
+ | `ftview` | `dsh-engineering-ftview` | `edit` on · `studio` on |
163
+ | `mwi` | `dsh-engineering-mwi` | `edit` off |
164
+ | `viewers` | `@aryacode/dsh-engineering` (its own client face: ladder + ME display previews) | — |
165
+ | `optix` | `@aryacode/dsh-tool-ft-optix` | — |
177
166
 
178
167
  ## Safety
179
168
 
package/cordis.patch.yml CHANGED
@@ -1,67 +1,42 @@
1
1
  # AryaCode engineering bundle.
2
2
  #
3
- # One layer lives here: the product rows. Each row mounts one surface of the
4
- # bundle, and the row is the switch — disabling `l5x-editing`, `l5x-studio`,
5
- # `l5x-live` or `mwi-edit` unloads that plugin, so its tool schemas never reach
6
- # the request. Row ids are stable, so per-entry enable state survives upgrades
7
- # even as the package behind a row is rebuilt.
3
+ # Five product rows, one switch each. A row mounts a product's whole surface —
4
+ # its read tools, its guidance and its optional parts — so the Plugins page
5
+ # shows a product per row instead of a surface per row.
6
+ #
7
+ # The optional parts are the row's config, not separate rows:
8
+ #
9
+ # l5x → editing, studio, live (all off by default)
10
+ # ftview → edit, studio (both on by default)
11
+ # mwi → edit (off by default)
12
+ #
13
+ # That keeps the context decision with the product it belongs to: a read-only
14
+ # profile pays for the read surface, and the expensive schemas are one switch
15
+ # inside the row instead of four more toggles in the list.
8
16
  #
9
17
  # The patch only ever inserts. It must never target a row another bundle owns:
10
18
  # a profile without that row makes composition fail ("patch: entry ... not
11
- # found"), and in 0.4.0/0.4.1 that is exactly why the bundle could not be
12
- # installed.
19
+ # found"), which is why 0.4.0 and 0.4.1 could not be installed.
13
20
  #
14
- # The per-skill tool filter (`policyOnly` / `toolPolicy` / `capabilities`) is an
15
- # AryaAI harness feature. The AryaCode line's `@deepseek-ai/dsh-tool-skill` has
16
- # no such config, so a capability layer here would either fail composition or be
17
- # rejected by the plugin's schema. Rows are the switch in this product; when
18
- # that filter ships here, it belongs in a bundle mount of its own.
21
+ # There is no per-skill tool filter here (`policyOnly` / `toolPolicy`): that is
22
+ # an AryaAI harness feature and the AryaCode line's `@deepseek-ai/dsh-tool-skill`
23
+ # has no such config. The row is the switch.
19
24
  - insert:
20
- - id: l5x-read
25
+ - id: l5x
21
26
  name: '@aryacode/dsh-engineering/l5x'
22
- - id: l5x-read-skill
23
- name: '@aryacode/dsh-engineering/l5x/skill'
24
- # Editing is its own entry so a read-only profile does not pay for nine
25
- # draft schemas. It consumes the read entry's project service.
26
- - id: l5x-editing
27
- name: '@aryacode/dsh-engineering/l5x/editing'
28
- disabled: true
29
- # The SDK entry needs Studio 5000 installed, so it stays off until asked for.
30
- - id: l5x-studio
31
- name: '@aryacode/dsh-engineering/l5x/studio'
32
- disabled: true
33
- # Live reads need a controller address; the row is the switch.
34
- - id: l5x-live
35
- name: '@aryacode/dsh-engineering/l5x/live'
36
- disabled: true
27
+ # FactoryTalk View ME: read, edits and the Studio handoff. Small enough that
28
+ # everything is on; the row's config can drop the edits or the handoff.
29
+ - id: ftview
30
+ name: '@aryacode/dsh-engineering/ftview'
31
+ # MotionWorks IEC: session, reads, verify and guidance on; edits opt-in.
32
+ - id: mwi
33
+ name: '@aryacode/dsh-engineering/mwi'
37
34
  # Both previews (the L5X ladder viewer and the FactoryTalk View ME display
38
35
  # preview) are this bundle's own client face. A package registers exactly one
39
- # browser bundle, so one row mounts both; switching the L5X or FTView *tools*
40
- # off leaves this row alone, because a client face adds no model context.
36
+ # browser bundle, so one row mounts both; a client face adds no model
37
+ # context, so this row is independent of every product row above.
41
38
  - id: viewers
42
39
  name: '@aryacode/dsh-engineering'
43
- # FactoryTalk View ME: read, edit and Studio entries plus the display
44
- # preview. The old plugin is retired, so these mount by default.
45
- - id: ftview-read
46
- name: '@aryacode/dsh-engineering/ftview'
47
- - id: ftview-read-skill
48
- name: '@aryacode/dsh-engineering/ftview/skill'
49
- - id: ftview-edit
50
- name: '@aryacode/dsh-engineering/ftview/edit'
51
- - id: ftview-studio
52
- name: '@aryacode/dsh-engineering/ftview/studio'
53
- # MotionWorks IEC: the redesigned rows. Editing is off by default, like L5X.
54
- - id: mwi-session
55
- name: '@aryacode/dsh-engineering/mwi'
56
- - id: mwi-read
57
- name: '@aryacode/dsh-engineering/mwi/read'
58
- - id: mwi-read-skill
59
- name: '@aryacode/dsh-engineering/mwi/skill'
60
- - id: mwi-verify
61
- name: '@aryacode/dsh-engineering/mwi/verify'
62
- - id: mwi-edit
63
- name: '@aryacode/dsh-engineering/mwi/edit'
64
- disabled: true
65
40
  # FactoryTalk Optix stays a separate package, mounted as a component row.
66
41
  - id: optix
67
42
  name: '@aryacode/dsh-tool-ft-optix'
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The FactoryTalk View ME product row: one switch for read, edits, Studio
3
+ * handoff and the skill.
4
+ *
5
+ * All four surfaces are on by default — the whole product is small enough that
6
+ * a reader who opens an export wants the edits and the handoff too.
7
+ */
8
+ import z from '@deepseek-ai/schemastery'
9
+ import * as read from '../vendor/ftview/lib/index.js'
10
+ import * as skill from '../vendor/ftview/lib/skill.js'
11
+ import * as edit from '../vendor/ftview/lib/edit.js'
12
+ import * as studio from '../vendor/ftview/lib/studio.js'
13
+
14
+ export const name = 'engineering-ftview'
15
+ /** Union of the parts' requirements: the read entry owns the view service. */
16
+ export const inject = ['tools', 'fs']
17
+
18
+ export const Config = z.object({
19
+ edit: z.boolean().default(true).description(
20
+ 'Staged display and HMI-tag edits, validated then written to a new export folder.',
21
+ ),
22
+ studio: z.boolean().default(true).description(
23
+ 'FactoryTalk View Studio discovery and the manual import plan. Runs no vendor utility.',
24
+ ),
25
+ })
26
+
27
+ /**
28
+ * Mount the FactoryTalk View surface.
29
+ * @param ctx - plugin context.
30
+ * @param config - the two optional surfaces, on by default.
31
+ */
32
+ export function apply(ctx, config = {}) {
33
+ ctx.plugin(read)
34
+ ctx.plugin(skill)
35
+ if (config.edit !== false) ctx.plugin(edit)
36
+ if (config.studio !== false) ctx.plugin(studio)
37
+ }
package/entries/l5x.js ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The Studio 5000 L5X product row: one switch for the whole L5X surface.
3
+ *
4
+ * The parts are the vendored entries; this module mounts them, so the Plugins
5
+ * page shows one row per product instead of one per surface. The three
6
+ * expensive surfaces stay off by default and are switched from this row's
7
+ * config form, which is the same decision the old separate rows encoded —
8
+ * just reachable from the product row instead of from the list.
9
+ */
10
+ import z from '@deepseek-ai/schemastery'
11
+ import * as read from '../vendor/l5x/lib/index.js'
12
+ import * as skill from '../vendor/l5x/lib/skill.js'
13
+ import * as editing from '../vendor/l5x/lib/editing.js'
14
+ import * as studio from '../vendor/l5x/lib/studio.js'
15
+ import * as live from '../vendor/l5x/lib/live.js'
16
+
17
+ export const name = 'engineering-l5x'
18
+ /** Union of the parts' requirements: the read entry owns the project service. */
19
+ export const inject = ['tools', 'fs']
20
+
21
+ export const Config = z.object({
22
+ editing: z.boolean().default(false).description(
23
+ 'Nine staged draft tools (draft_rung, draft_apply, ...). Off by default: a read-only profile should not pay for these schemas.',
24
+ ),
25
+ studio: z.boolean().default(false).description(
26
+ 'Logix Designer SDK and supervised controller tools. Needs Studio 5000 with the SDK service installed.',
27
+ ),
28
+ live: z.boolean().default(false).description(
29
+ 'EtherNet/IP polling and trend tools. Needs a reachable controller address.',
30
+ ),
31
+ })
32
+
33
+ /**
34
+ * Mount the L5X surface.
35
+ * @param ctx - plugin context.
36
+ * @param config - the three optional surfaces, all off unless enabled.
37
+ */
38
+ export function apply(ctx, config = {}) {
39
+ ctx.plugin(read)
40
+ ctx.plugin(skill)
41
+ if (config.editing === true) ctx.plugin(editing)
42
+ if (config.studio === true) ctx.plugin(studio)
43
+ if (config.live === true) ctx.plugin(live)
44
+ }
package/entries/mwi.js ADDED
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The MotionWorks IEC product row: one switch for the session, read, verify and
3
+ * edit surfaces plus the skill.
4
+ *
5
+ * Editing is the largest schema set in the bundle, so it stays off until the
6
+ * row's config form turns it on.
7
+ */
8
+ import z from '@deepseek-ai/schemastery'
9
+ import * as session from '../vendor/mwi/lib/index.js'
10
+ import * as read from '../vendor/mwi/lib/read.js'
11
+ import * as skill from '../vendor/mwi/lib/skill.js'
12
+ import * as verify from '../vendor/mwi/lib/verify.js'
13
+ import * as edit from '../vendor/mwi/lib/edit.js'
14
+
15
+ export const name = 'engineering-mwi'
16
+ /** The whole product needs the tool registry. */
17
+ export const inject = ['tools']
18
+
19
+ export const Config = z.object({
20
+ edit: z.boolean().default(false).description(
21
+ 'Seven staged edit tools (code, declarations, structure, blocks, POU packages). Off by default: the largest schemas in the bundle.',
22
+ ),
23
+ })
24
+
25
+ /**
26
+ * Mount the MotionWorks IEC surface.
27
+ * @param ctx - plugin context.
28
+ * @param config - the optional edit surface, off unless enabled.
29
+ */
30
+ export function apply(ctx, config = {}) {
31
+ ctx.plugin(session)
32
+ ctx.plugin(read)
33
+ ctx.plugin(skill)
34
+ ctx.plugin(verify)
35
+ if (config.edit === true) ctx.plugin(edit)
36
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aryacode/dsh-engineering",
3
- "version": "0.4.3",
4
- "description": "AryaCode engineering bundle: one install surface and one tool-exposure policy for the Studio 5000 L5X, FactoryTalk View and MotionWorks IEC plugins, with skill links for Optix and CAD.",
3
+ "version": "0.4.4",
4
+ "description": "AryaCode engineering bundle: one install surface for the Studio 5000 L5X, FactoryTalk View ME, MotionWorks IEC and FactoryTalk Optix surfaces, one row per product, with the ladder and display previews.",
5
5
  "keywords": [
6
6
  "dsh",
7
7
  "deepseek-harness",
@@ -30,6 +30,7 @@
30
30
  },
31
31
  "files": [
32
32
  "cordis.patch.yml",
33
+ "entries/**/*",
33
34
  "lib/**/*",
34
35
  "locale/*.json",
35
36
  "vendor/**/*",
@@ -75,16 +76,19 @@
75
76
  },
76
77
  "./client": "./lib/client.js",
77
78
  "./package.json": "./package.json",
78
- "./l5x": "./vendor/l5x/lib/index.js",
79
+ "./l5x": "./entries/l5x.js",
80
+ "./ftview": "./entries/ftview.js",
81
+ "./mwi": "./entries/mwi.js",
82
+ "./l5x/read": "./vendor/l5x/lib/index.js",
79
83
  "./l5x/skill": "./vendor/l5x/lib/skill.js",
80
84
  "./l5x/editing": "./vendor/l5x/lib/editing.js",
81
85
  "./l5x/live": "./vendor/l5x/lib/live.js",
82
86
  "./l5x/studio": "./vendor/l5x/lib/studio.js",
83
- "./ftview": "./vendor/ftview/lib/index.js",
87
+ "./ftview/read": "./vendor/ftview/lib/index.js",
84
88
  "./ftview/skill": "./vendor/ftview/lib/skill.js",
85
89
  "./ftview/edit": "./vendor/ftview/lib/edit.js",
86
90
  "./ftview/studio": "./vendor/ftview/lib/studio.js",
87
- "./mwi": "./vendor/mwi/lib/index.js",
91
+ "./mwi/session": "./vendor/mwi/lib/index.js",
88
92
  "./mwi/read": "./vendor/mwi/lib/read.js",
89
93
  "./mwi/skill": "./vendor/mwi/lib/skill.js",
90
94
  "./mwi/verify": "./vendor/mwi/lib/verify.js",