@revyl/verify 0.0.0-stage → 0.1.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 +15 -0
- package/LICENSE +201 -0
- package/README.md +100 -2
- package/SECURITY.md +13 -0
- package/dist/api/client.d.ts +63 -0
- package/dist/api/client.js +201 -0
- package/dist/api/types.d.ts +216 -0
- package/dist/api/types.js +1 -0
- package/dist/auth.d.ts +17 -0
- package/dist/auth.js +65 -0
- package/dist/cleanup.d.ts +13 -0
- package/dist/cleanup.js +72 -0
- package/dist/cli/init.d.ts +14 -0
- package/dist/cli/init.js +116 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.js +127 -0
- package/dist/computer-session.d.ts +37 -0
- package/dist/computer-session.js +322 -0
- package/dist/config.d.ts +88 -0
- package/dist/config.js +212 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.js +14 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +3 -0
- package/dist/open.d.ts +13 -0
- package/dist/open.js +36 -0
- package/dist/session.d.ts +144 -0
- package/dist/session.js +411 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +6 -0
- package/docs/README.md +18 -0
- package/docs/agents.md +38 -0
- package/docs/api.md +108 -0
- package/docs/ci.md +70 -0
- package/docs/computers.md +73 -0
- package/docs/configuration.md +91 -0
- package/docs/errors.md +38 -0
- package/docs/getting-started.md +79 -0
- package/docs/linux-computers-contract.md +107 -0
- package/docs/llms.txt +18 -0
- package/docs/mobile.md +43 -0
- package/docs/web.md +43 -0
- package/package.json +68 -4
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Linux computers: deferred implementation contract
|
|
2
|
+
|
|
3
|
+
Status: contract only. Verify accepts `platform: 'linux'` in types and target config, but rejects opening it with `NOT_AVAILABLE_ON_PLATFORM` before resolving credentials or making any network request. This applies to named and inline targets. `init` does not generate Linux projects. No Linux provider or live run is claimed.
|
|
4
|
+
|
|
5
|
+
This contract follows Revyl's existing computer API. The schema accepts `os: 'linux'`; that is a schema value, not a working Linux provider. Mac uses `os: 'macos'`. No backend changes are included here.
|
|
6
|
+
|
|
7
|
+
The current hosted implementation rejects any OS other than `macos` with `runtime_unavailable`. Linux needs backend provider work before Verify can enable it; removing the client refusal alone is insufficient.
|
|
8
|
+
|
|
9
|
+
## Intended public surface
|
|
10
|
+
|
|
11
|
+
Once Linux is authorized and implemented, the target is `{ platform: 'linux', startTimeout?: number }`, with no `app`, image, provider, cwd, TTL, or device selector. It returns the same `Session` shell/file/process surface as Mac:
|
|
12
|
+
|
|
13
|
+
- `exec(argv: string[], { timeout?, stdin?: string | Uint8Array, check?: boolean }?)` returns `{ exitCode, stdout, stderr }`, with UTF-8 strings. Nonzero exit throws `COMMAND_FAILED` unless `check: false`.
|
|
14
|
+
- `readFile(path, options?)` returns `Buffer`; `writeFile(path, string | Uint8Array, options?)` returns `void`.
|
|
15
|
+
- `stat(path, options?)` returns `{ kind: 'file' | 'directory', size: number }` in bytes.
|
|
16
|
+
- `processes(options?)` returns `{ id, state: 'running' | 'exited', exitCode?: number }[]`; `terminate(id, options?)` uses the run-owned handle id, never a PID.
|
|
17
|
+
- `close()` stops the computer and preserves the distinction between terminal state and confirmed release.
|
|
18
|
+
|
|
19
|
+
Instruction and validation stay unavailable until a separate agent-step contract ships. Staging has an authenticated screenshot endpoint, `GET /api/v1/computer-runs/{id}/screen/screenshot`, returning `{ width, height, observed_at, png, cursor }`: standard base64 PNG, UTC observation timestamp, and nullable `{ x, y }` cursor. Verify consumes the dimensions and PNG. Mac supports it in Verify; Linux screen availability must be confirmed separately and must not be inferred from shell readiness.
|
|
20
|
+
|
|
21
|
+
## Requests, responses, and readiness
|
|
22
|
+
|
|
23
|
+
All routes below use the selected `REVYL_BACKEND_URL` plus `/api/v1`, the existing bearer credentials, `X-Revyl-Client: verify`, and the versioned Verify user agent. Organization ownership comes from authentication, not UUID possession. Reads require same-org access; create, operations, and stop require an operator role and computer admission. Preserve the existing `REVYL_APP_URL` override for session links. No provider-specific credentials belong in Verify.
|
|
24
|
+
|
|
25
|
+
| Request | Response and client behavior |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| `POST /computer-runs` with `{ computer_session_id: C1, os: 'linux' }` | `ComputerReport`. Mint canonical nonzero UUID C1 once on the client. Do not remint/replay after an uncertain create. |
|
|
28
|
+
| `GET /computer-runs/C1/report` | `ComputerReport` for readiness. Poll only while `starting`; resolve open on `active` (owner route ready). `closing`, `stopped`, `failed`, or `owner_lost` are not ready; fail and attempt cleanup within bounds. |
|
|
29
|
+
| `POST /computer-runs/C1/operations` with `{ computer_session_id: C1, request_id: R1, command }`, `Prefer: respond-async` | `ComputerCommandResponse`, or HTTP `202` with exact JSON `null` while still running after the async wait. Mint R1 once per operation; C1 in path and body must agree. |
|
|
30
|
+
| `GET /computer-runs/C1/operations/O1` | Original retained `ComputerCommandResponse`, or `202`/`null` while running. O1 is UUIDv5(namespace=C1, name=canonical R1 string). Poll reads, never resubmit to poll. |
|
|
31
|
+
| `POST /computer-runs/C1/stop` | `ComputerReport` with separate execution end, evidence status, and release certainty. A stopped/failed/lost-owner state does not imply confirmed release. |
|
|
32
|
+
|
|
33
|
+
A report contains `kind: 'computer'`, `version: 1`, UUIDs `report_id`, `computer_session_id`, `org_id`, `os`, timestamps `created_at`, `expires_at`, `as_of`, lifecycle `state`, optional `failure_reason`, execution timestamps, `release: 'pending' | 'confirmed' | 'unknown'`, `released_at`, `evidence_completeness: 'complete' | 'partial'`, `evidence_write_status: 'recorded' | 'pending' | 'failed'`, and operation evidence `steps`. Verify must validate identities and the fields it consumes, without treating recording success as execution success.
|
|
34
|
+
|
|
35
|
+
Identical requests using the same R1 return the retained result; changed input conflicts. The original owner retains raw results; there is no cross-restart command recovery guarantee. Reads must be bounded by an overall deadline. Cancellation/timeout does not authorize an automatic mutation retry.
|
|
36
|
+
|
|
37
|
+
## Command payloads and results
|
|
38
|
+
|
|
39
|
+
Every command has integer `timeout_ms` from 1 to 300,000 (default 30,000), bounded by remaining run lifetime. Current run lifetime is 3,600 seconds and operation count is at most 256.
|
|
40
|
+
|
|
41
|
+
| `command` fields beyond timeout | Successful `result` |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| `{ kind: 'exec', argv: string[], stdin?: base64 }` | `{ kind: 'exec', exit_code, stdout: base64, stderr: base64 }` |
|
|
44
|
+
| `{ kind: 'file_read', path, max_bytes?: 1..1048576 }` | `{ kind: 'file_read', data: base64 }` |
|
|
45
|
+
| `{ kind: 'file_write', path, data: base64 }` | `{ kind: 'file_write', byte_count }` |
|
|
46
|
+
| `{ kind: 'file_stat', path }` | `{ kind: 'file_stat', file_kind: 'file' | 'directory', size_bytes }` |
|
|
47
|
+
| `{ kind: 'process_list', max_items?: 1..64 }` | `{ kind: 'process_list', processes: [{ handle: { computer_session_id: C1, handle_id }, state, exit_code: number | null }] }` |
|
|
48
|
+
| `{ kind: 'process_terminate', handle: { computer_session_id: C1, handle_id } }` | `{ kind: 'process_terminate', termination: 'confirmed' }` |
|
|
49
|
+
|
|
50
|
+
The backend also has `process_inspect`; Verify does not expose it in this release. Process handles belong to C1. Running processes have no exit code. Exit codes are integers from -255 to 255. Stdout/stderr/data/stdin are padded URL-safe base64 wire bytes (standard base64 input accepted); decode file reads losslessly and encode string inputs as UTF-8.
|
|
51
|
+
|
|
52
|
+
Exec has 1..64 argv entries; argv[0] must be nonempty, no entry may contain NUL, and total UTF-8 argv plus stdin is at most 16,384 bytes. Exec output retains the first 1 MiB combined, without stopping the process merely for output truncation. File reads return at most 1 MiB; writes accept at most 65,536 bytes. Paths are workspace-relative, at most 1,024 UTF-8 bytes, with no empty/dot/traversal components, controls, backslashes, or colons. Do not silently translate absolute paths or shell strings.
|
|
53
|
+
|
|
54
|
+
`ComputerCommandResponse` is `{ computer_session_id: C1, operation_id: O1, execution, evidence: 'recorded' | 'pending' | 'failed' }`. Its `execution` discriminant is:
|
|
55
|
+
|
|
56
|
+
- `succeeded`: typed `result`; exec exit code must be zero.
|
|
57
|
+
- `failed`: `error_code: 'not_found' | 'access_denied' | 'exec_nonzero'`; only `exec_nonzero` carries an exec result with an observed nonzero code.
|
|
58
|
+
- `timed_out`: `error_code: 'timed_out'`, `termination: 'confirmed' | 'unknown'`, optional `observed_exit_code`.
|
|
59
|
+
- `unknown`: error code `lost_ack`, `executor_error`, `invalid_executor_result`, `owner_lost`, `stopped`, or `start_evidence_failed`, plus termination certainty.
|
|
60
|
+
|
|
61
|
+
## Errors and uncertainty
|
|
62
|
+
|
|
63
|
+
HTTP errors use `{ detail: code }`, not an invented Linux-specific envelope. Current route/admission codes include:
|
|
64
|
+
|
|
65
|
+
| HTTP | Codes |
|
|
66
|
+
| --- | --- |
|
|
67
|
+
| 401 | `unauthenticated` |
|
|
68
|
+
| 402 | Compute-credit/billing admission refusal (`API_ERROR`; report only the sanitized reason, never raw response contents) |
|
|
69
|
+
| 403 | `forbidden`, `computer_not_enabled` |
|
|
70
|
+
| 404 | `inaccessible`, `invalid_handle`, `operation_not_found` |
|
|
71
|
+
| 409 | `request_conflict`, `run_conflict`, `owner_unavailable`, `run_closed`, `evidence_conflict` |
|
|
72
|
+
| 422 | `invalid_request` |
|
|
73
|
+
| 429 | `computer_limit`, `operation_limit` |
|
|
74
|
+
| 503 | `runtime_unavailable`, `start_failed`, `evidence_unavailable`, `authentication_unavailable` |
|
|
75
|
+
|
|
76
|
+
Do not collapse these into a missing-provider fallback or retry create/commands with a fresh id. Public Verify classifications follow Mac:
|
|
77
|
+
|
|
78
|
+
| Condition | Verify code |
|
|
79
|
+
| --- | --- |
|
|
80
|
+
| Invalid local input or `invalid_request` | `INVALID_ARGUMENT` |
|
|
81
|
+
| `computer_not_enabled` | `NOT_AVAILABLE_ON_PLATFORM` |
|
|
82
|
+
| HTTP 401/403 otherwise | `AUTH_REJECTED` |
|
|
83
|
+
| `runtime_unavailable`, `start_failed`, `computer_limit` | `SESSION_START_FAILED` |
|
|
84
|
+
| `run_closed` | `SESSION_ENDED` |
|
|
85
|
+
| `inaccessible`, `invalid_handle`, operation `not_found` | `NOT_FOUND` |
|
|
86
|
+
| Operation `access_denied` | `ACCESS_DENIED` |
|
|
87
|
+
| Operation `exec_nonzero` | `COMMAND_FAILED` (unless `check: false`) |
|
|
88
|
+
| Remaining 409 refusals or `operation_limit` | `SESSION_BUSY` |
|
|
89
|
+
| `operation_not_found`, `owner_unavailable`, unknown execution/release, or uncertain mutation transport | `ACTION_UNCERTAIN` |
|
|
90
|
+
| Operation timed out with confirmed termination | `TIMEOUT` |
|
|
91
|
+
| POST 5xx or redirect not covered above | `ACTION_UNCERTAIN` |
|
|
92
|
+
| Operation polling transport failure or an unclassified polling 5xx | `ACTION_UNCERTAIN` |
|
|
93
|
+
| Unclassified response, including HTTP 402 | `API_ERROR` |
|
|
94
|
+
|
|
95
|
+
A timed-out operation with unknown termination is `ACTION_UNCERTAIN`, not `TIMEOUT`. An observed successful operation can return its result while logging pending/failed evidence. Failed evidence is not proof that execution failed or never ran. Keep raw command/file contents and credentials out of diagnostics.
|
|
96
|
+
|
|
97
|
+
## Linux assumptions requiring confirmation
|
|
98
|
+
|
|
99
|
+
Before enabling Linux, the Computer runtime owner must confirm:
|
|
100
|
+
|
|
101
|
+
1. A real Linux provider is deployed and admitted for the selected environment/organization. Schema acceptance is insufficient; confirm provider identity, billing/concurrency lane, lifetime, start/stop behavior, and cleanup/release guarantees.
|
|
102
|
+
2. `active` means the Linux owner route accepts commands and files, with the same report identities, async operation polling, deduplication, and retained-result semantics. Verify this against a provider, not only a fake.
|
|
103
|
+
3. The workspace root, initial working directory, user privileges, permissions, filesystem/symlink policy, persistence/isolation, and installed executable/PATH baseline. Do not assume macOS tools, Darwin output, package managers, writable absolute paths, or host access.
|
|
104
|
+
4. Structured argv launches without an implicit shell; explicit `/bin/sh` availability, process-tree termination, negative exit/signal behavior, output truncation, and binary IO match the shared contract.
|
|
105
|
+
5. Linux process handles remain run-owned, not PIDs; listing limits and termination certainty have the same meaning. Confirm behavior on owner loss and run expiry.
|
|
106
|
+
6. Whether a graphical Linux desktop and screenshots exist. Until confirmed, do not promise screenshots, screen control, instruction, or validation.
|
|
107
|
+
7. Approved live acceptance coverage: create/readiness, argv/stdin and nonzero exit, binary file round trip/stat, missing/denied file, process list/terminate, 202 polling, timeout/unknown outcome, and confirmed close. This work performs no live runs.
|
package/docs/llms.txt
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Verify
|
|
2
|
+
|
|
3
|
+
> Verify (@revyl/verify) is an open-source TypeScript library for Revyl. It opens cloud browsers and iOS/Android devices for agent instruction/validation steps, or Mac computers for commands, files, processes, and screenshots. Linux is typed but cannot be opened yet. Call it from a plain script, coding agent, CI, or any test runner. It has no test runner of its own.
|
|
4
|
+
|
|
5
|
+
## Docs
|
|
6
|
+
|
|
7
|
+
Mac computers are early access and not yet available in Revyl production. They work only on Revyl staging for enabled organizations using the optional REVYL_BACKEND_URL override and matching staging credentials. See computers.md#availability-and-errors.
|
|
8
|
+
|
|
9
|
+
- [Getting started](getting-started.md): install, authenticate, init, run a script
|
|
10
|
+
- [API](api.md): open(), agent steps, screenshot(), exec(), file/process methods, close()
|
|
11
|
+
- [Configuration](configuration.md): verify.config.ts targets, environment variables, the init and whoami commands
|
|
12
|
+
- [Web](web.md): Revyl web sessions, URLs and builds, sign-in, steps, and optional staging access
|
|
13
|
+
- [Mobile](mobile.md): iOS and Android devices and installing apps
|
|
14
|
+
- [Computers](computers.md#availability-and-errors): staging-only Mac early access for enabled organizations; not yet available in Revyl production
|
|
15
|
+
- [Linux contract](linux-computers-contract.md): deferred implementation, requests/responses, readiness, errors, and assumptions to confirm
|
|
16
|
+
- [CI and test runners](ci.md): GitHub Actions, node:test, Vitest, Jest, Playwright Test
|
|
17
|
+
- [Errors](errors.md): every error code and what to do about it
|
|
18
|
+
- [For coding agents](agents.md): the workflow and rules for agents using Verify
|
package/docs/mobile.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# iOS and Android
|
|
2
|
+
|
|
3
|
+
An `ios` or `android` target opens your app on a Revyl cloud simulator or emulator.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
{ platform: 'ios', app: { appId: '…' }, device: { model: 'iPhone 16', osVersion: '18.5' } }
|
|
7
|
+
{ platform: 'android', app: { buildId: '…' }, device: { model: 'Pixel 8' } }
|
|
8
|
+
{ platform: 'android', app: { artifactUrl: 'https://ci.example.com/app-release.apk' } }
|
|
9
|
+
{ platform: 'ios', app: { bundleId: 'com.apple.Preferences' } } // an app already on the device
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Choosing the app
|
|
13
|
+
|
|
14
|
+
- `app.appId` installs the app's newest build in Revyl. Upload builds with the Revyl CLI (`revyl build upload`) or from your CI.
|
|
15
|
+
- `app.buildId` pins one build, so every session runs the same binary.
|
|
16
|
+
- `app.artifactUrl` installs from an HTTPS URL.
|
|
17
|
+
- `app.bundleId` launches an app that is already on the device, such as Settings, instead of installing one.
|
|
18
|
+
|
|
19
|
+
## Devices
|
|
20
|
+
|
|
21
|
+
`device.model` and `device.osVersion` pick the simulator or emulator. Without them, Revyl picks its default for the platform. To run the same script on several devices, give each its own target and open them one after another or in parallel:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
targets: {
|
|
25
|
+
'iphone-se': { platform: 'ios', app: { appId }, device: { model: 'iPhone SE (3rd generation)' } },
|
|
26
|
+
'iphone-16': { platform: 'ios', app: { appId }, device: { model: 'iPhone 16' } },
|
|
27
|
+
},
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
for (const name of ['iphone-se', 'iphone-16']) {
|
|
32
|
+
const session = await open(name);
|
|
33
|
+
try {
|
|
34
|
+
await session.validation('The onboarding screen fits without overlapping text');
|
|
35
|
+
} finally {
|
|
36
|
+
await session.close();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Steps
|
|
42
|
+
|
|
43
|
+
`instruction` and `validation` run as live steps on the device. Verify polls each step until Revyl reports it done, and cancels it on Revyl if it runs past its timeout.
|
package/docs/web.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Web
|
|
2
|
+
|
|
3
|
+
A web target opens your app in a Revyl cloud browser.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
{
|
|
7
|
+
platform: 'web',
|
|
8
|
+
app: { appId: '…', url: 'https://pr-123.preview.example.com' },
|
|
9
|
+
viewport: { width: 1440, height: 900 },
|
|
10
|
+
}
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## What it opens
|
|
14
|
+
|
|
15
|
+
- With `app.url`, each `open()` registers the URL as a build of the Revyl app (on `app.branch` when set) and opens it. The URL must be public HTTPS; Revyl's browser cannot reach `localhost` or a private network.
|
|
16
|
+
- With `app.buildId`, it opens that exact build.
|
|
17
|
+
- With neither, it opens the newest web build of the app, on `app.branch` when set and otherwise on the app's default branch.
|
|
18
|
+
|
|
19
|
+
## Signing in
|
|
20
|
+
|
|
21
|
+
Most apps need a signed-in user. Revyl can open a test-only sign-in route before the session starts, so the session begins signed in:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
signIn: { path: '/__test/sign-in', secret: 'E2E_SIGN_IN_TOKEN', persona: 'admin' }
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`secret` is the **name** of an organization secret in Revyl, never its value. Revyl sends the secret's value to `path` on your app, which should sign in a test user and redirect. Keep that route disabled in production.
|
|
28
|
+
|
|
29
|
+
## Steps on web
|
|
30
|
+
|
|
31
|
+
`instruction` and `validation` use the same Revyl endpoints on web as on iOS and Android, and each step shows up in the session's report.
|
|
32
|
+
|
|
33
|
+
Production is the default. **Optional staging access** is for users with a staging organization and matching credentials; it is not required for normal setup:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
export REVYL_BACKEND_URL=https://backend-staging.revyl.ai
|
|
37
|
+
export REVYL_APP_URL=https://staging.revyl.ai
|
|
38
|
+
export REVYL_API_KEY=... # a key from your Revyl staging organization
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
A Revyl backend that does not run steps on web yet answers with `step_output_not_available`, which Verify reports as `NOT_AVAILABLE_ON_PLATFORM`. The same script works there with no change once it does. `open`, `screenshot`, `viewerUrl`, and `close` work on web everywhere.
|
|
42
|
+
|
|
43
|
+
Revyl runs one step at a time on a session. A step sent while another is still running, for example one that just timed out and is still being cancelled, fails with `SESSION_BUSY`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,70 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revyl/verify",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Open Revyl cloud browsers and mobile devices for agent steps, or Mac computers for commands and files, from TypeScript.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"e2e",
|
|
7
|
+
"end-to-end",
|
|
8
|
+
"mobile",
|
|
9
|
+
"ios",
|
|
10
|
+
"android",
|
|
11
|
+
"web",
|
|
12
|
+
"macos",
|
|
13
|
+
"ai",
|
|
14
|
+
"agent",
|
|
15
|
+
"revyl"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://github.com/RevylAI/verify#readme",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/RevylAI/verify.git",
|
|
21
|
+
"directory": "packages/verify"
|
|
22
|
+
},
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/RevylAI/verify/issues"
|
|
25
|
+
},
|
|
26
|
+
"license": "Apache-2.0",
|
|
27
|
+
"author": "Revyl <support@revyl.ai>",
|
|
28
|
+
"type": "module",
|
|
29
|
+
"main": "./dist/index.js",
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./package.json": "./package.json"
|
|
37
|
+
},
|
|
38
|
+
"bin": {
|
|
39
|
+
"verify": "./dist/cli/main.js",
|
|
40
|
+
"revyl-verify": "./dist/cli/main.js"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist",
|
|
44
|
+
"docs",
|
|
45
|
+
"README.md",
|
|
46
|
+
"LICENSE",
|
|
47
|
+
"CHANGELOG.md",
|
|
48
|
+
"SECURITY.md"
|
|
49
|
+
],
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=22.18"
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json && chmod +x dist/cli/main.js",
|
|
55
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
56
|
+
"test": "vitest run",
|
|
57
|
+
"prepack": "npm run build && cp ../../LICENSE LICENSE && cp ../../README.md README.md && cp ../../CHANGELOG.md CHANGELOG.md && cp ../../SECURITY.md SECURITY.md"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"jiti": "^2.6.0"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/node": "^22.10.0",
|
|
64
|
+
"typescript": "^5.9.0",
|
|
65
|
+
"vitest": "^5.0.5"
|
|
66
|
+
},
|
|
67
|
+
"publishConfig": {
|
|
68
|
+
"access": "public"
|
|
69
|
+
}
|
|
70
|
+
}
|