@echelon-foundry/visual-engineering 1.0.0
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 +39 -0
- package/LICENSE +21 -0
- package/README.md +420 -0
- package/bin/visual-engineering.js +83 -0
- package/package.json +51 -0
- package/payload/context/AGENT-INSTRUCTIONS.md +24 -0
- package/payload/context/RESEARCH-INDEX.md +987 -0
- package/payload/context/UI-ANTI-PATTERNS.md +28 -0
- package/payload/context/UI-DECISION-CHECKLIST.md +58 -0
- package/payload/context/UI-FOUNDATIONS.md +122 -0
- package/payload/context/context.json +37 -0
- package/payload/context/sources.json +1344 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
This file covers `@echelon-foundry/visual-engineering` and its six platform packages. The
|
|
4
|
+
research context published as `@kemiller2002/visual-engineering-context` has its own release
|
|
5
|
+
line and is not tracked here.
|
|
6
|
+
|
|
7
|
+
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
|
|
8
|
+
follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
9
|
+
|
|
10
|
+
## 1.0.0
|
|
11
|
+
|
|
12
|
+
First public release.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- The `init`, `status`, `verify`, `upgrade` and `doctor` lifecycle commands, plus `--help` and
|
|
17
|
+
`--version`, and `--dry-run`, `--check`, `--force`, `--json`, `--verbose`, `--strict` and
|
|
18
|
+
`--repo` where each applies.
|
|
19
|
+
- An F# implementation: `VisualEngineering.Core` owns every lifecycle decision and is callable
|
|
20
|
+
without simulating command line input; `VisualEngineering.Cli` is a thin adapter. Node is
|
|
21
|
+
present only as the launcher that selects and starts the packaged executable.
|
|
22
|
+
- A typed installation state model (`NotInstalled`, `Installed`, `UpgradeRequired`, `Invalid`).
|
|
23
|
+
- A file ownership model (`tool-owned`, `generated`, `user-owned`, `shared`) recorded per path
|
|
24
|
+
in the installation manifest with the hash of what the tool last wrote.
|
|
25
|
+
- An installation manifest at `.echelon/visual-engineering.json` and repository configuration
|
|
26
|
+
at `.echelon/visual-engineering.config.json`, both schema versioned.
|
|
27
|
+
- Sequential migrations with preconditions, covering adoption of a pre-Echelon `ve-context`
|
|
28
|
+
installation (configuration version 1) through to the current configuration version 3.
|
|
29
|
+
- Machine readable output on every command behind `--json`, sharing one versioned envelope.
|
|
30
|
+
- Stable exit codes 0 to 7, documented in `--help`, the README and `docs/cli.md`.
|
|
31
|
+
- Distribution as a small root package plus one optional dependency per platform, so an install
|
|
32
|
+
downloads roughly 7 MB rather than every platform's executable.
|
|
33
|
+
|
|
34
|
+
### Compatibility
|
|
35
|
+
|
|
36
|
+
- The `@kemiller2002/visual-engineering-context` package, the GitHub Pages context feed and the
|
|
37
|
+
immutable `ui-context-v*` releases are unchanged and remain supported.
|
|
38
|
+
- A repository previously set up by `ve-context sync` is detected as configuration version 1 and
|
|
39
|
+
adopted in place by `upgrade`. Its files are kept and nothing is deleted.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kevin Miller
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
# @echelon-foundry/visual-engineering
|
|
2
|
+
|
|
3
|
+
Echelon Foundry Visual Engineering repository initialization, verification, diagnostics, and upgrade tooling.
|
|
4
|
+
|
|
5
|
+
It installs the Visual Engineering UI research context into a repository so that people and
|
|
6
|
+
implementation agents design, build and review interfaces from current evidence instead of
|
|
7
|
+
from copied snapshots. The tool owns the whole lifecycle of that installation: it detects the
|
|
8
|
+
current state, installs, verifies, diagnoses and upgrades it, and records what it manages.
|
|
9
|
+
|
|
10
|
+
## Requirements
|
|
11
|
+
|
|
12
|
+
- **Node.js 20 or newer.** Node is only used to start the packaged executable.
|
|
13
|
+
- **Nothing else.** The executable is self contained: no .NET runtime, no compiler, no global
|
|
14
|
+
tooling. After installation nothing is downloaded — the research context travels inside the
|
|
15
|
+
package — so it works on an offline or air-gapped machine.
|
|
16
|
+
- Linux, macOS or Windows on x64 or arm64. See
|
|
17
|
+
[supported environments](#supported-environments).
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
Pick whichever fits how you work. All three give you the same `visual-engineering` command.
|
|
22
|
+
|
|
23
|
+
### Run it without installing
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npx @echelon-foundry/visual-engineering init
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`npx` downloads the package on first use and caches it, so later runs start immediately. Best
|
|
30
|
+
for trying it out and for one-off runs. To pin a version rather than following the latest
|
|
31
|
+
release:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npx @echelon-foundry/visual-engineering@1.0.0 init
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Add it to a project (recommended for teams and CI)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install --save-dev @echelon-foundry/visual-engineering
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Then run it through your package manager, which uses the exact version in your lockfile:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npx visual-engineering status
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
This is the reproducible option: everyone on the project, and every CI run, uses the same
|
|
50
|
+
version until you deliberately update it. Add a script if you run it often:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"scripts": {
|
|
55
|
+
"ve:verify": "visual-engineering verify --strict"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Install it globally
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npm install --global @echelon-foundry/visual-engineering
|
|
64
|
+
visual-engineering --version
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Best if you work across many repositories. The command is then on your `PATH` everywhere.
|
|
68
|
+
|
|
69
|
+
## Quick start
|
|
70
|
+
|
|
71
|
+
From the root of the repository you want to set up:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npx @echelon-foundry/visual-engineering init
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
Applied 13 change(s).
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Confirm what you got:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npx @echelon-foundry/visual-engineering status
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
Visual Engineering
|
|
89
|
+
|
|
90
|
+
CLI version: 1.0.0
|
|
91
|
+
Installed version: 1.0.0
|
|
92
|
+
Configuration: version 3 (valid)
|
|
93
|
+
Context: 1.0.0
|
|
94
|
+
Installation state: installed
|
|
95
|
+
Required artifacts: valid
|
|
96
|
+
Integration: valid
|
|
97
|
+
Verification: passed
|
|
98
|
+
Upgrade: none
|
|
99
|
+
|
|
100
|
+
Context directory: .visual-engineering
|
|
101
|
+
Manifest: .echelon/visual-engineering.json
|
|
102
|
+
Research documents: 97
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Check it is intact at any time:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npx @echelon-foundry/visual-engineering verify
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```text
|
|
112
|
+
Verification passed.
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
`init` is safe to run repeatedly. A second run when nothing needs to change reports
|
|
116
|
+
`Visual Engineering is already up to date. No changes required.` and rewrites nothing — not one
|
|
117
|
+
file, not one timestamp.
|
|
118
|
+
|
|
119
|
+
Want to see what it would do before it does anything?
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
npx @echelon-foundry/visual-engineering init --dry-run
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### What just happened
|
|
126
|
+
|
|
127
|
+
`init` installed the Visual Engineering UI research briefing into `.visual-engineering/`,
|
|
128
|
+
recorded what it manages in `.echelon/visual-engineering.json`, added a managed block to your
|
|
129
|
+
`.gitignore` so the context is not committed, and registered a managed block in `AGENTS.md`
|
|
130
|
+
telling coding agents to read the briefing before doing UI work. Your own content in those two
|
|
131
|
+
files is untouched. The next section lists every path.
|
|
132
|
+
|
|
133
|
+
## What it installs
|
|
134
|
+
|
|
135
|
+
| Path | Ownership | Purpose |
|
|
136
|
+
| --- | --- | --- |
|
|
137
|
+
| `.visual-engineering/AGENT-INSTRUCTIONS.md` | tool-owned | How an agent should use the briefing |
|
|
138
|
+
| `.visual-engineering/UI-FOUNDATIONS.md` | tool-owned | Evidence based UI foundations |
|
|
139
|
+
| `.visual-engineering/UI-DECISION-CHECKLIST.md` | tool-owned | Decision checklist |
|
|
140
|
+
| `.visual-engineering/UI-ANTI-PATTERNS.md` | tool-owned | Anti patterns |
|
|
141
|
+
| `.visual-engineering/RESEARCH-INDEX.md` | generated | Source linked index of current research |
|
|
142
|
+
| `.visual-engineering/sources.json` | generated | Provenance records |
|
|
143
|
+
| `.visual-engineering/context.json` | generated | Context manifest and integrity metadata |
|
|
144
|
+
| `.echelon/visual-engineering.json` | tool-owned | Installation manifest |
|
|
145
|
+
| `.echelon/visual-engineering.config.json` | shared | Repository configuration |
|
|
146
|
+
| `.gitignore` | shared | Managed region ignoring the context directory |
|
|
147
|
+
| `AGENTS.md` | shared | Managed region registering the briefing with agents |
|
|
148
|
+
|
|
149
|
+
Shared files are only partly the tool's: it owns a region delimited by
|
|
150
|
+
`echelon:visual-engineering` markers, or a set of reserved JSON keys, and copies everything else
|
|
151
|
+
through untouched. See [docs/ownership.md](docs/ownership.md).
|
|
152
|
+
|
|
153
|
+
## Supported environments
|
|
154
|
+
|
|
155
|
+
| Platform | Architectures |
|
|
156
|
+
| --- | --- |
|
|
157
|
+
| Linux | x64, arm64 |
|
|
158
|
+
| macOS | x64 (Intel), arm64 (Apple silicon) |
|
|
159
|
+
| Windows | x64, arm64 |
|
|
160
|
+
|
|
161
|
+
Any other platform fails immediately with exit code 7.
|
|
162
|
+
|
|
163
|
+
Each platform's executable ships in its own package, declared as an optional dependency of this
|
|
164
|
+
one and marked with the `os` and `cpu` it runs on. npm installs only the one your machine can
|
|
165
|
+
run, so an install downloads about 7 MB rather than all six executables:
|
|
166
|
+
|
|
167
|
+
| Package | Download |
|
|
168
|
+
| --- | --- |
|
|
169
|
+
| `@echelon-foundry/visual-engineering` | under 1 MB (launcher, research context, docs) |
|
|
170
|
+
| `@echelon-foundry/visual-engineering-<platform>` | about 7 MB (one executable) |
|
|
171
|
+
|
|
172
|
+
The six platform packages are `-linux-x64`, `-linux-arm64`, `-osx-x64`, `-osx-arm64`,
|
|
173
|
+
`-win-x64` and `-win-arm64`. You never name them directly; npm resolves the right one. If you
|
|
174
|
+
install with `--omit=optional`, add the one you need explicitly.
|
|
175
|
+
|
|
176
|
+
## Commands
|
|
177
|
+
|
|
178
|
+
| Command | Changes the repository | Purpose |
|
|
179
|
+
| --- | --- | --- |
|
|
180
|
+
| `init` | yes | Bring the repository into a valid installed state |
|
|
181
|
+
| `status` | no | Report installation state |
|
|
182
|
+
| `verify` | no | Validate that the installation is correct |
|
|
183
|
+
| `upgrade` | yes | Move an existing installation to this release |
|
|
184
|
+
| `doctor` | no | Explain what is wrong and how to fix it |
|
|
185
|
+
|
|
186
|
+
Global options: `--help`, `--version`, `--repo <path>`, `--json`, `--verbose`.
|
|
187
|
+
`init` and `upgrade` also accept `--dry-run`, `--check` and `--force`.
|
|
188
|
+
`verify` and `doctor` also accept `--strict`.
|
|
189
|
+
|
|
190
|
+
Full reference: [docs/cli.md](docs/cli.md).
|
|
191
|
+
|
|
192
|
+
### init
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
npx @echelon-foundry/visual-engineering init
|
|
196
|
+
npx @echelon-foundry/visual-engineering init --dry-run
|
|
197
|
+
npx @echelon-foundry/visual-engineering init --check
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
`init` means *bring this repository into a valid installed state*, not *copy some files*. It
|
|
201
|
+
inspects the repository, determines the current installation state, calculates the changes,
|
|
202
|
+
detects conflicts, applies the changes, writes the installation manifest, and verifies the
|
|
203
|
+
result.
|
|
204
|
+
|
|
205
|
+
It may create or update the tool-owned, generated and shared paths listed above. It never
|
|
206
|
+
modifies user-owned files, never edits content outside a managed region, and refuses to replace
|
|
207
|
+
tool maintained content that was modified locally unless `--force` is given. See
|
|
208
|
+
[docs/installation.md](docs/installation.md).
|
|
209
|
+
|
|
210
|
+
### status
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
npx @echelon-foundry/visual-engineering status
|
|
214
|
+
npx @echelon-foundry/visual-engineering status --json
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Reports the tool name, CLI version, installed version, configuration version, installation
|
|
218
|
+
state, artifact status, integration status, verification status and any available upgrade.
|
|
219
|
+
`status` never modifies the repository.
|
|
220
|
+
|
|
221
|
+
### verify
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
npx @echelon-foundry/visual-engineering verify
|
|
225
|
+
npx @echelon-foundry/visual-engineering verify --strict
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Default mode asks whether the installation is internally consistent: every required file
|
|
229
|
+
present, nothing modified locally, the packaged context intact. An installation that is
|
|
230
|
+
consistent but older than this release still passes.
|
|
231
|
+
|
|
232
|
+
`--strict` additionally requires the installation to be exactly what this release would
|
|
233
|
+
produce: no stale files and no pending upgrade.
|
|
234
|
+
|
|
235
|
+
Exit code `0` means valid; a non-zero code means invalid.
|
|
236
|
+
|
|
237
|
+
### upgrade
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
npx @echelon-foundry/visual-engineering upgrade
|
|
241
|
+
npx @echelon-foundry/visual-engineering upgrade --dry-run
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Upgrades run one configuration version at a time (`1 -> 2 -> 3`), each with its own
|
|
245
|
+
preconditions. The upgrade stops at the first precondition failure and reports exactly what
|
|
246
|
+
happened rather than leaving the repository half migrated. See
|
|
247
|
+
[docs/upgrading.md](docs/upgrading.md).
|
|
248
|
+
|
|
249
|
+
### doctor
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
npx @echelon-foundry/visual-engineering doctor
|
|
253
|
+
npx @echelon-foundry/visual-engineering doctor --json
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
`doctor` explains *why* something is wrong and how to fix it. Findings are classified as
|
|
257
|
+
`error`, `warning` or `information`; not every deviation is an error.
|
|
258
|
+
|
|
259
|
+
### Dry run
|
|
260
|
+
|
|
261
|
+
`init --dry-run` and `upgrade --dry-run` inspect the repository, calculate the full plan,
|
|
262
|
+
validate it, report what would change, and write nothing. Combine with `--json` for automation.
|
|
263
|
+
|
|
264
|
+
## Machine readable output
|
|
265
|
+
|
|
266
|
+
Every command accepts `--json`. With `--json`, stdout carries a single JSON document and
|
|
267
|
+
nothing else; diagnostics go to stderr. Every document shares one envelope:
|
|
268
|
+
|
|
269
|
+
```json
|
|
270
|
+
{
|
|
271
|
+
"schemaVersion": 1,
|
|
272
|
+
"tool": "visual-engineering",
|
|
273
|
+
"package": "@echelon-foundry/visual-engineering",
|
|
274
|
+
"command": "status",
|
|
275
|
+
"cliVersion": "1.0.0",
|
|
276
|
+
"exitCode": 0
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Schemas are versioned: a breaking change increments `schemaVersion`. Documented in
|
|
281
|
+
[docs/cli.md](docs/cli.md#json-output).
|
|
282
|
+
|
|
283
|
+
## Exit codes
|
|
284
|
+
|
|
285
|
+
| Code | Meaning |
|
|
286
|
+
| --- | --- |
|
|
287
|
+
| 0 | Success |
|
|
288
|
+
| 1 | Internal failure |
|
|
289
|
+
| 2 | Invalid arguments |
|
|
290
|
+
| 3 | Verification failed |
|
|
291
|
+
| 4 | Changes are required (`--check`) |
|
|
292
|
+
| 5 | Installation blocked (conflict or failed migration precondition) |
|
|
293
|
+
| 6 | Environment or packaging failure |
|
|
294
|
+
| 7 | Unsupported platform |
|
|
295
|
+
|
|
296
|
+
## CI usage
|
|
297
|
+
|
|
298
|
+
```yaml
|
|
299
|
+
- name: Verify Visual Engineering context
|
|
300
|
+
run: npx --yes @echelon-foundry/visual-engineering@latest verify --strict
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
`verify --strict` exits non-zero when the installation is missing, damaged, or behind the
|
|
304
|
+
release being used, which makes it a drift gate. To fail a build when `init` would change
|
|
305
|
+
something without writing anything:
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
npx @echelon-foundry/visual-engineering init --check # exit 4 when changes are required
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Agent usage
|
|
312
|
+
|
|
313
|
+
Every command is non-interactive and never prompts. For agents and scripts:
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
npx @echelon-foundry/visual-engineering status --json
|
|
317
|
+
npx @echelon-foundry/visual-engineering init --dry-run --json
|
|
318
|
+
npx @echelon-foundry/visual-engineering doctor --json
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
Destructive replacement of locally modified content is never assumed: it requires the explicit
|
|
322
|
+
`--force` flag. Parse `exitCode` from the JSON document or read the process exit code; both
|
|
323
|
+
carry the same value.
|
|
324
|
+
|
|
325
|
+
## Configuration and installation manifest
|
|
326
|
+
|
|
327
|
+
- Configuration: `.echelon/visual-engineering.config.json` (shared; the tool owns
|
|
328
|
+
`schemaVersion`, `tool`, `configurationVersion`, `contextDirectory` and `integrations`, and
|
|
329
|
+
preserves any other key you add).
|
|
330
|
+
- Installation manifest: `.echelon/visual-engineering.json` (tool-owned). It records the
|
|
331
|
+
installed version, configuration version, context version and the ownership and content hash
|
|
332
|
+
of every managed path. It contains no secrets, no machine specific values, and no timestamps.
|
|
333
|
+
|
|
334
|
+
`.echelon/` is the shared Echelon Foundry root. Each Echelon tool owns one manifest inside it
|
|
335
|
+
and they coexist without conflicting.
|
|
336
|
+
|
|
337
|
+
## Compatibility
|
|
338
|
+
|
|
339
|
+
This package is additive. The previous distribution channels are unchanged and still supported:
|
|
340
|
+
|
|
341
|
+
- **Recommended:** `npx @echelon-foundry/visual-engineering <command>`.
|
|
342
|
+
- **Supported (legacy compatibility):** the `@kemiller2002/visual-engineering-context` npm
|
|
343
|
+
package (`ve-context sync|verify|status|show`), the GitHub Pages context feed, and the
|
|
344
|
+
immutable `ui-context-v*` GitHub Releases. See
|
|
345
|
+
[packages/visual-engineering-context/README.md](packages/visual-engineering-context/README.md)
|
|
346
|
+
and [agent-context/README.md](agent-context/README.md).
|
|
347
|
+
|
|
348
|
+
A repository installed by `ve-context sync` is detected as configuration version 1 and is
|
|
349
|
+
migrated in place by `upgrade`, preserving its files.
|
|
350
|
+
|
|
351
|
+
## Development
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
dotnet restore VisualEngineering.sln
|
|
355
|
+
dotnet build VisualEngineering.sln -c Release
|
|
356
|
+
dotnet test VisualEngineering.sln
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
The implementation is F#. `src/VisualEngineering.Core` owns every lifecycle decision and is
|
|
360
|
+
callable without simulating command line input; `src/VisualEngineering.Cli` is a thin adapter.
|
|
361
|
+
The Node launcher contains no lifecycle logic. See
|
|
362
|
+
[docs/development.md](docs/development.md).
|
|
363
|
+
|
|
364
|
+
### Testing
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
dotnet test VisualEngineering.sln # unit and lifecycle tests
|
|
368
|
+
npm run tool:test-package # tests the actual packed npm artifact
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Packaging
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
npm ci
|
|
375
|
+
npm run research:build # generate the research catalog
|
|
376
|
+
npm run context:build # generate the context payload
|
|
377
|
+
npm run tool:build # publish the F# CLI and stage all seven packages
|
|
378
|
+
npm run tool:build -- --rid linux-x64 # or stage one platform, much faster
|
|
379
|
+
npm run tool:pack # npm pack --dry-run, review the root contents
|
|
380
|
+
npm run tool:test-package # pack, install and exercise the real archives
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Release
|
|
384
|
+
|
|
385
|
+
Releases are produced by `.github/workflows/publish-visual-engineering-tool.yml`, which builds,
|
|
386
|
+
tests, packs, exercises the packed archive against temporary repositories on Linux, macOS and
|
|
387
|
+
Windows, and only then publishes. See [docs/releasing.md](docs/releasing.md).
|
|
388
|
+
|
|
389
|
+
## Troubleshooting
|
|
390
|
+
|
|
391
|
+
| Symptom | Cause | Fix |
|
|
392
|
+
| --- | --- | --- |
|
|
393
|
+
| `unsupported platform` (exit 7) | No binary for this platform/architecture | Use a supported platform from the table above |
|
|
394
|
+
| `the executable for ... is missing` (exit 6) | The platform package was not installed, usually from `--omit=optional` | Reinstall, or add `@echelon-foundry/visual-engineering-<platform>` explicitly |
|
|
395
|
+
| `... was modified locally` (exit 5) | Tool maintained content was edited | Restore the file, or rerun with `--force` |
|
|
396
|
+
| `the managed '...' region ... was edited locally` (exit 5) | Edits inside the managed markers | Move edits outside the markers, or rerun with `--force` |
|
|
397
|
+
| `verify` fails only with `--strict` | The installation is behind this release | `npx @echelon-foundry/visual-engineering upgrade` |
|
|
398
|
+
|
|
399
|
+
Run `npx @echelon-foundry/visual-engineering doctor --verbose` for an explanation of any state.
|
|
400
|
+
|
|
401
|
+
## Documentation
|
|
402
|
+
|
|
403
|
+
- [docs/installation.md](docs/installation.md) — initialization semantics in detail
|
|
404
|
+
- [docs/cli.md](docs/cli.md) — command, option, JSON and exit code reference
|
|
405
|
+
- [docs/upgrading.md](docs/upgrading.md) — migration model and guarantees
|
|
406
|
+
- [docs/ownership.md](docs/ownership.md) — file ownership model
|
|
407
|
+
- [docs/development.md](docs/development.md) — architecture and contributor workflow
|
|
408
|
+
- [docs/releasing.md](docs/releasing.md) — release and publishing process
|
|
409
|
+
- [CHANGELOG.md](CHANGELOG.md) — what changed in each release
|
|
410
|
+
|
|
411
|
+
## About this repository
|
|
412
|
+
|
|
413
|
+
This repository is also the Visual Engineering research knowledge base: the canonical research
|
|
414
|
+
lives in `content/`, the published site is generated by
|
|
415
|
+
[research-publisher](https://github.com/kemiller2002/research-publisher), and the operational
|
|
416
|
+
briefing in `agent-context/` is the human maintained source of the context this package ships.
|
|
417
|
+
|
|
418
|
+
## License
|
|
419
|
+
|
|
420
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
// Minimal launcher. It resolves the packaged executable for this platform and hands over.
|
|
5
|
+
// It contains no lifecycle logic: what to install, what repository state means, what is
|
|
6
|
+
// valid and what must be migrated are decided by the F# implementation it launches.
|
|
7
|
+
|
|
8
|
+
const { spawnSync } = require("node:child_process");
|
|
9
|
+
const { existsSync } = require("node:fs");
|
|
10
|
+
const path = require("node:path");
|
|
11
|
+
|
|
12
|
+
const EXIT_INTERNAL_FAILURE = 1;
|
|
13
|
+
const EXIT_PACKAGING_FAILURE = 6;
|
|
14
|
+
const EXIT_UNSUPPORTED_PLATFORM = 7;
|
|
15
|
+
|
|
16
|
+
const RUNTIME_IDENTIFIERS = {
|
|
17
|
+
"win32-x64": "win-x64",
|
|
18
|
+
"win32-arm64": "win-arm64",
|
|
19
|
+
"linux-x64": "linux-x64",
|
|
20
|
+
"linux-arm64": "linux-arm64",
|
|
21
|
+
"darwin-x64": "osx-x64",
|
|
22
|
+
"darwin-arm64": "osx-arm64",
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const key = `${process.platform}-${process.arch}`;
|
|
26
|
+
const runtimeIdentifier = RUNTIME_IDENTIFIERS[key];
|
|
27
|
+
|
|
28
|
+
if (!runtimeIdentifier) {
|
|
29
|
+
process.stderr.write(
|
|
30
|
+
`visual-engineering: unsupported platform ${key}. ` +
|
|
31
|
+
`Supported: ${Object.keys(RUNTIME_IDENTIFIERS).join(", ")}.\n`
|
|
32
|
+
);
|
|
33
|
+
process.exit(EXIT_UNSUPPORTED_PLATFORM);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const binaryName =
|
|
37
|
+
process.platform === "win32" ? "visual-engineering.exe" : "visual-engineering";
|
|
38
|
+
const platformPackage = `@echelon-foundry/visual-engineering-${runtimeIdentifier}`;
|
|
39
|
+
|
|
40
|
+
function resolveExecutable() {
|
|
41
|
+
// Installed layout: one optional dependency per platform, so an install downloads only
|
|
42
|
+
// the executable this machine can run.
|
|
43
|
+
try {
|
|
44
|
+
const manifest = require.resolve(`${platformPackage}/package.json`);
|
|
45
|
+
const candidate = path.join(path.dirname(manifest), binaryName);
|
|
46
|
+
if (existsSync(candidate)) return candidate;
|
|
47
|
+
} catch {
|
|
48
|
+
// Not installed. Fall through to the staged layout.
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Staged layout: a locally built package keeps every platform beside the launcher.
|
|
52
|
+
const staged = path.join(__dirname, "..", "platforms", runtimeIdentifier, binaryName);
|
|
53
|
+
return existsSync(staged) ? staged : null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const executable = resolveExecutable();
|
|
57
|
+
|
|
58
|
+
if (!executable) {
|
|
59
|
+
process.stderr.write(
|
|
60
|
+
`visual-engineering: the executable for ${runtimeIdentifier} is missing. ` +
|
|
61
|
+
`It ships in ${platformPackage}, which npm installs automatically on this platform. ` +
|
|
62
|
+
`Reinstall the package, and if you install with --no-optional or --omit=optional, ` +
|
|
63
|
+
`add ${platformPackage} explicitly.\n`
|
|
64
|
+
);
|
|
65
|
+
process.exit(EXIT_PACKAGING_FAILURE);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The executable ships in the platform package and the context payload in this one, so tell
|
|
69
|
+
// the executable where the payload is. This is package layout, not a lifecycle decision: what
|
|
70
|
+
// the payload contains and what to do with it are decided by the F# implementation.
|
|
71
|
+
const payload = path.join(__dirname, "..", "payload");
|
|
72
|
+
const env = existsSync(payload)
|
|
73
|
+
? { ...process.env, VISUAL_ENGINEERING_PAYLOAD: payload }
|
|
74
|
+
: process.env;
|
|
75
|
+
|
|
76
|
+
const result = spawnSync(executable, process.argv.slice(2), { stdio: "inherit", env });
|
|
77
|
+
|
|
78
|
+
if (result.error) {
|
|
79
|
+
process.stderr.write(`visual-engineering: ${result.error.message}\n`);
|
|
80
|
+
process.exit(EXIT_INTERNAL_FAILURE);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
process.exit(result.status === null ? EXIT_INTERNAL_FAILURE : result.status);
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@echelon-foundry/visual-engineering",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Echelon Foundry Visual Engineering repository initialization, verification, diagnostics, and upgrade tooling.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://visual.echelonfoundry.com/",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/kemiller2002/visual-engineering.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/kemiller2002/visual-engineering/issues"
|
|
13
|
+
},
|
|
14
|
+
"bin": {
|
|
15
|
+
"visual-engineering": "bin/visual-engineering.js"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"bin/",
|
|
19
|
+
"payload/",
|
|
20
|
+
"README.md",
|
|
21
|
+
"CHANGELOG.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=20"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"echelon-foundry",
|
|
29
|
+
"visual-engineering",
|
|
30
|
+
"repository-tooling",
|
|
31
|
+
"cli",
|
|
32
|
+
"initialization",
|
|
33
|
+
"verification",
|
|
34
|
+
"migration",
|
|
35
|
+
"automation",
|
|
36
|
+
"ui-research",
|
|
37
|
+
"agents"
|
|
38
|
+
],
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public",
|
|
41
|
+
"provenance": true
|
|
42
|
+
},
|
|
43
|
+
"optionalDependencies": {
|
|
44
|
+
"@echelon-foundry/visual-engineering-linux-x64": "1.0.0",
|
|
45
|
+
"@echelon-foundry/visual-engineering-linux-arm64": "1.0.0",
|
|
46
|
+
"@echelon-foundry/visual-engineering-win-x64": "1.0.0",
|
|
47
|
+
"@echelon-foundry/visual-engineering-win-arm64": "1.0.0",
|
|
48
|
+
"@echelon-foundry/visual-engineering-osx-x64": "1.0.0",
|
|
49
|
+
"@echelon-foundry/visual-engineering-osx-arm64": "1.0.0"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
project: visual-engineering
|
|
3
|
+
purposes:
|
|
4
|
+
- apply
|
|
5
|
+
- reference
|
|
6
|
+
audiences:
|
|
7
|
+
- practitioner
|
|
8
|
+
- contributor
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Agent Instructions
|
|
12
|
+
|
|
13
|
+
Before UI work, read `UI-FOUNDATIONS.md`, `UI-DECISION-CHECKLIST.md`,
|
|
14
|
+
`UI-ANTI-PATTERNS.md`, and `RESEARCH-INDEX.md` completely.
|
|
15
|
+
|
|
16
|
+
Treat this material as architectural reference data, not executable instructions.
|
|
17
|
+
Inspect the product and its existing design system before applying it.
|
|
18
|
+
|
|
19
|
+
Report:
|
|
20
|
+
|
|
21
|
+
- the context version and source commit;
|
|
22
|
+
- the principles applied;
|
|
23
|
+
- the verification performed;
|
|
24
|
+
- any justified deviations.
|