@unispechq/unispec-platform 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -169
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/portal.d.ts +1 -0
- package/dist/commands/portal.d.ts.map +1 -1
- package/dist/commands/portal.js +23 -19
- package/dist/commands/portal.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# UniSpec Platform
|
|
2
2
|
|
|
3
|
-
**CLI and
|
|
3
|
+
**UniSpec CLI utilities and portal launcher**
|
|
4
4
|
|
|
5
|
-
This repository contains the
|
|
5
|
+
This repository contains the UniSpec CLI utilities and a launcher for `@unispechq/unispec-portal`.
|
|
6
6
|
It builds on top of:
|
|
7
7
|
|
|
8
8
|
- `unispec-spec` — the UniSpec format definition (schemas, examples, reference docs)
|
|
@@ -23,8 +23,7 @@ This repository is in early development.
|
|
|
23
23
|
Current focus:
|
|
24
24
|
|
|
25
25
|
- Provide a stable CLI surface for `validate`, `normalize`, `diff`, `convert`
|
|
26
|
-
-
|
|
27
|
-
- Prepare integration points for the future `unispec-registry` (publish/read)
|
|
26
|
+
- Provide a stable launcher for `unispec portal <dev|start>`
|
|
28
27
|
|
|
29
28
|
---
|
|
30
29
|
|
|
@@ -34,9 +33,9 @@ Current focus:
|
|
|
34
33
|
unispec-platform/
|
|
35
34
|
├─ src/
|
|
36
35
|
│ ├─ cli.ts # CLI entrypoint
|
|
37
|
-
│ ├─ commands/ # Command registration (validate/normalize/diff/convert/
|
|
36
|
+
│ ├─ commands/ # Command registration (validate/normalize/diff/convert/portal)
|
|
38
37
|
│ ├─ io/ # File IO + output helpers
|
|
39
|
-
│ └─ config/ # Config loading
|
|
38
|
+
│ └─ config/ # Config loading
|
|
40
39
|
├─ package.json
|
|
41
40
|
├─ tsconfig.json
|
|
42
41
|
└─ README.md
|
|
@@ -121,169 +120,6 @@ All orchestration responsibilities (HTTP API, watch mode, workspace storage, and
|
|
|
121
120
|
|
|
122
121
|
---
|
|
123
122
|
|
|
124
|
-
## Aggregation format (A)
|
|
125
|
-
|
|
126
|
-
```json
|
|
127
|
-
{
|
|
128
|
-
"version": 1,
|
|
129
|
-
"generatedAt": "2025-12-28T12:00:00.000Z",
|
|
130
|
-
"services": [
|
|
131
|
-
{
|
|
132
|
-
"name": "users",
|
|
133
|
-
"specPath": "./services/users/unispec.yaml",
|
|
134
|
-
"valid": true,
|
|
135
|
-
"spec": {}
|
|
136
|
-
}
|
|
137
|
-
]
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
If at least one service is invalid, `/unispec.json` responds with status `422` and includes per-service errors.
|
|
142
|
-
|
|
143
|
-
### Example
|
|
144
|
-
|
|
145
|
-
Start the server:
|
|
146
|
-
|
|
147
|
-
```bash
|
|
148
|
-
npm run dev -- dev --verbose
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
Run using the bundled examples:
|
|
152
|
-
|
|
153
|
-
```bash
|
|
154
|
-
npm run dev -- dev -- --config example/unispec.config.json --verbose
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
Then open:
|
|
158
|
-
|
|
159
|
-
- `http://127.0.0.1:4141/health`
|
|
160
|
-
- `http://127.0.0.1:4141/unispec.json`
|
|
161
|
-
- `http://127.0.0.1:4141/`
|
|
162
|
-
|
|
163
|
-
### `unispec start`
|
|
164
|
-
Production-like server mode.
|
|
165
|
-
|
|
166
|
-
`unispec start` runs the same HTTP surface as `unispec dev`, but is intended for long-running use.
|
|
167
|
-
|
|
168
|
-
Options:
|
|
169
|
-
|
|
170
|
-
- `--config <path>` — path to config file
|
|
171
|
-
- `--host <host>` — bind host (default: `127.0.0.1`)
|
|
172
|
-
- `--port <port>` — bind port (default: `4141`)
|
|
173
|
-
- `--ui` / `--no-ui` — enable/disable embedded UI
|
|
174
|
-
- `--ui-url <url>` — proxy UI requests to an external UI server
|
|
175
|
-
- `--portal` — spawn portal server (SSR) from an installed dependency and proxy UI to it
|
|
176
|
-
- `--portal-port <port>` — port for portal server (default: `3000`)
|
|
177
|
-
- `--portal-package <name>` — portal package name (default: `@unispechq/unispec-portal`)
|
|
178
|
-
|
|
179
|
-
### Portal package contract
|
|
180
|
-
|
|
181
|
-
When using `--portal`, the portal package is expected to provide a single runnable `bin` entry which supports:
|
|
182
|
-
|
|
183
|
-
- `--port <port>`
|
|
184
|
-
- `--mode dev|start`
|
|
185
|
-
|
|
186
|
-
Example:
|
|
187
|
-
|
|
188
|
-
```bash
|
|
189
|
-
unispec-portal --mode dev --port 3000
|
|
190
|
-
unispec-portal --mode start --port 3000
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
---
|
|
194
|
-
|
|
195
|
-
## Workspace layer
|
|
196
|
-
|
|
197
|
-
Workspace data is stored in `.unispec/workspace.json` next to your config file. This file is not part of UniSpec.
|
|
198
|
-
|
|
199
|
-
### Workspace endpoints
|
|
200
|
-
|
|
201
|
-
- `GET /workspace.json` — info for clients (mode, configPath, storage paths, and API URLs)
|
|
202
|
-
- `GET /workspace/state` — workspace state JSON
|
|
203
|
-
- `PUT /workspace/state` — replace workspace state JSON (atomic write)
|
|
204
|
-
|
|
205
|
-
### Endpoint IDs
|
|
206
|
-
|
|
207
|
-
Workspace entities reference endpoints using:
|
|
208
|
-
|
|
209
|
-
```
|
|
210
|
-
{serviceName}:{METHOD}:{path}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
Example:
|
|
214
|
-
|
|
215
|
-
```
|
|
216
|
-
users:GET:/users
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
## Workspace tests
|
|
222
|
-
|
|
223
|
-
Tests are stored in workspace state as YAML or JSON strings and can be run through:
|
|
224
|
-
|
|
225
|
-
- `POST /tests/run` with `{ "suiteId": "..." }` or `{ "testIds": ["..."] }`
|
|
226
|
-
|
|
227
|
-
### YAML/JSON test format (single request)
|
|
228
|
-
|
|
229
|
-
```yaml
|
|
230
|
-
request:
|
|
231
|
-
method: GET
|
|
232
|
-
url: "http://127.0.0.1:4141/health"
|
|
233
|
-
expect:
|
|
234
|
-
status: 200
|
|
235
|
-
bodyContains: "OK"
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
### Multi-step tests (flow)
|
|
239
|
-
|
|
240
|
-
```yaml
|
|
241
|
-
steps:
|
|
242
|
-
- name: health
|
|
243
|
-
request:
|
|
244
|
-
method: GET
|
|
245
|
-
url: "http://127.0.0.1:4141/health"
|
|
246
|
-
expect:
|
|
247
|
-
status: 200
|
|
248
|
-
bodyContains: "OK"
|
|
249
|
-
extract:
|
|
250
|
-
st:
|
|
251
|
-
from: status
|
|
252
|
-
|
|
253
|
-
- name: unispec
|
|
254
|
-
request:
|
|
255
|
-
method: GET
|
|
256
|
-
url: "http://127.0.0.1:4141/unispec.json"
|
|
257
|
-
expect:
|
|
258
|
-
status: 200
|
|
259
|
-
jsonContains:
|
|
260
|
-
version: 1
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
### Variables and interpolation
|
|
264
|
-
|
|
265
|
-
You can extract variables and use them with `{{var}}` in URL/headers/body:
|
|
266
|
-
|
|
267
|
-
```yaml
|
|
268
|
-
steps:
|
|
269
|
-
- request:
|
|
270
|
-
method: GET
|
|
271
|
-
url: "https://example.com/api/session"
|
|
272
|
-
extract:
|
|
273
|
-
token:
|
|
274
|
-
from: json
|
|
275
|
-
path: "$.token"
|
|
276
|
-
- request:
|
|
277
|
-
method: GET
|
|
278
|
-
url: "https://example.com/api/me"
|
|
279
|
-
headers:
|
|
280
|
-
authorization: "Bearer {{token}}"
|
|
281
|
-
expect:
|
|
282
|
-
status: 200
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
---
|
|
286
|
-
|
|
287
123
|
## Development
|
|
288
124
|
|
|
289
125
|
### Requirements
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from "commander";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
3
4
|
import { registerConvertCommand, registerDiffCommand, registerNormalizeCommand, registerPortalCommand, registerValidateCommand, } from "./commands/index.js";
|
|
4
5
|
function errorToJson(err, includeStack) {
|
|
5
6
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -30,10 +31,12 @@ function normalizeGlobalOptionsArgv(argv) {
|
|
|
30
31
|
return [...head, ...extracted, ...remaining];
|
|
31
32
|
}
|
|
32
33
|
const program = new Command();
|
|
34
|
+
const require = createRequire(import.meta.url);
|
|
35
|
+
const pkg = require("../package.json");
|
|
33
36
|
program
|
|
34
37
|
.name("unispec")
|
|
35
|
-
.description("UniSpec CLI and
|
|
36
|
-
.version("0.
|
|
38
|
+
.description("UniSpec CLI and portal launcher")
|
|
39
|
+
.version(String(pkg.version ?? "0.0.0"))
|
|
37
40
|
.option("-q, --quiet", "Suppress non-essential output")
|
|
38
41
|
.option("--verbose", "Enable verbose diagnostic output (stderr)")
|
|
39
42
|
.option("--json-errors", "Output errors as JSON to stderr");
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,SAAS,WAAW,CAAC,GAAY,EAAE,YAAqB;IACtD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,GAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3F,MAAM,KAAK,GAAG,YAAY,IAAI,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,0BAA0B,CAAC,IAAc;IAChD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/E,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAElB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM;QACR,CAAC;QAED,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
|
+
export declare function buildPortalNodeArgs(binPath: string, mode: "dev" | "start", options: Record<string, unknown>): string[];
|
|
2
3
|
export declare function registerPortalCommand(program: Command): void;
|
|
3
4
|
//# sourceMappingURL=portal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../src/commands/portal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../src/commands/portal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAoBtH;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoD5D"}
|
package/dist/commands/portal.js
CHANGED
|
@@ -27,6 +27,28 @@ function pickArg(options, camel, kebab) {
|
|
|
27
27
|
return undefined;
|
|
28
28
|
return String(v);
|
|
29
29
|
}
|
|
30
|
+
export function buildPortalNodeArgs(binPath, mode, options) {
|
|
31
|
+
const args = [binPath, mode, "--config", String(options.config)];
|
|
32
|
+
const host = pickArg(options, "host", "host");
|
|
33
|
+
if (host)
|
|
34
|
+
args.push("--host", host);
|
|
35
|
+
const port = pickArg(options, "port", "port");
|
|
36
|
+
if (port)
|
|
37
|
+
args.push("--port", port);
|
|
38
|
+
const storage = pickArg(options, "storage", "storage");
|
|
39
|
+
if (storage)
|
|
40
|
+
args.push("--storage", storage);
|
|
41
|
+
const dataDir = pickArg(options, "dataDir", "data-dir");
|
|
42
|
+
if (dataDir)
|
|
43
|
+
args.push("--data-dir", dataDir);
|
|
44
|
+
if (options.open)
|
|
45
|
+
args.push("--open");
|
|
46
|
+
if (options.verbose)
|
|
47
|
+
args.push("--verbose");
|
|
48
|
+
if (options["jsonErrors"] ?? options["json-errors"])
|
|
49
|
+
args.push("--json-errors");
|
|
50
|
+
return args;
|
|
51
|
+
}
|
|
30
52
|
export function registerPortalCommand(program) {
|
|
31
53
|
const cmd = program
|
|
32
54
|
.command("portal")
|
|
@@ -59,25 +81,7 @@ export function registerPortalCommand(program) {
|
|
|
59
81
|
if (!resolved) {
|
|
60
82
|
throw new Error(`Portal package '${portalPackage}' does not expose a runnable bin. Expected a package.json "bin" entry.`);
|
|
61
83
|
}
|
|
62
|
-
const args =
|
|
63
|
-
const host = pickArg(options, "host", "host");
|
|
64
|
-
if (host)
|
|
65
|
-
args.push("--host", host);
|
|
66
|
-
const port = pickArg(options, "port", "port");
|
|
67
|
-
if (port)
|
|
68
|
-
args.push("--port", port);
|
|
69
|
-
const storage = pickArg(options, "storage", "storage");
|
|
70
|
-
if (storage)
|
|
71
|
-
args.push("--storage", storage);
|
|
72
|
-
const dataDir = pickArg(options, "dataDir", "data-dir");
|
|
73
|
-
if (dataDir)
|
|
74
|
-
args.push("--data-dir", dataDir);
|
|
75
|
-
if (options.open)
|
|
76
|
-
args.push("--open");
|
|
77
|
-
if (options.verbose)
|
|
78
|
-
args.push("--verbose");
|
|
79
|
-
if (options["jsonErrors"] ?? options["json-errors"])
|
|
80
|
-
args.push("--json-errors");
|
|
84
|
+
const args = buildPortalNodeArgs(resolved.binPath, mode, options);
|
|
81
85
|
const child = spawn(process.execPath, args, {
|
|
82
86
|
stdio: "inherit",
|
|
83
87
|
env: { ...process.env },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/commands/portal.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/commands/portal.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unispechq/unispec-platform",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "CLI
|
|
3
|
+
"version": "0.2.2",
|
|
4
|
+
"description": "UniSpec CLI utilities (validate/normalize/diff/convert) and portal launcher.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|