specli 0.0.11 → 0.0.13
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 +216 -325
- package/bin/cli.sh +27 -0
- package/dist/{src/ai → ai}/tools.d.ts +0 -1
- package/dist/ai/tools.js +161 -0
- package/dist/ai/tools.test.d.ts +1 -0
- package/dist/ai/tools.test.js +56 -0
- package/dist/{src/cli → cli}/auth-requirements.d.ts +0 -1
- package/dist/cli/auth-requirements.js +65 -0
- package/dist/cli/auth-requirements.test.d.ts +1 -0
- package/dist/cli/auth-requirements.test.js +16 -0
- package/dist/{src/cli → cli}/auth-schemes.d.ts +0 -1
- package/dist/cli/auth-schemes.js +112 -0
- package/dist/cli/auth-schemes.test.d.ts +1 -0
- package/dist/cli/auth-schemes.test.js +56 -0
- package/dist/{src/cli → cli}/capabilities.d.ts +0 -1
- package/dist/cli/capabilities.js +41 -0
- package/dist/cli/capabilities.test.d.ts +1 -0
- package/dist/cli/capabilities.test.js +84 -0
- package/dist/{src/cli → cli}/command-id.d.ts +0 -1
- package/dist/cli/command-id.js +8 -0
- package/dist/cli/command-id.test.d.ts +1 -0
- package/dist/cli/command-id.test.js +27 -0
- package/dist/{src/cli → cli}/command-index.d.ts +0 -1
- package/dist/cli/command-index.js +9 -0
- package/dist/{src/cli → cli}/command-model.d.ts +0 -1
- package/dist/cli/command-model.js +53 -0
- package/dist/cli/command-model.test.d.ts +1 -0
- package/dist/cli/command-model.test.js +40 -0
- package/dist/{src/cli → cli}/compile.d.ts +0 -1
- package/dist/cli/compile.js +79 -0
- package/dist/{src/cli → cli}/crypto.d.ts +0 -1
- package/dist/cli/crypto.js +9 -0
- package/dist/{src/cli → cli}/derive-name.d.ts +0 -1
- package/dist/cli/derive-name.js +96 -0
- package/dist/{src/cli → cli}/exec.d.ts +0 -1
- package/dist/cli/exec.js +50 -0
- package/dist/{src/cli → cli}/main.d.ts +0 -1
- package/dist/cli/main.js +177 -0
- package/dist/{src/cli → cli}/naming.d.ts +0 -1
- package/dist/cli/naming.js +191 -0
- package/dist/cli/naming.test.d.ts +1 -0
- package/dist/cli/naming.test.js +75 -0
- package/dist/{src/cli → cli}/operations.d.ts +0 -1
- package/dist/cli/operations.js +100 -0
- package/dist/cli/operations.test.d.ts +1 -0
- package/dist/cli/operations.test.js +51 -0
- package/dist/{src/cli → cli}/params.d.ts +0 -1
- package/dist/cli/params.js +36 -0
- package/dist/cli/params.test.d.ts +1 -0
- package/dist/cli/params.test.js +62 -0
- package/dist/{src/cli → cli}/pluralize.d.ts +0 -1
- package/dist/cli/pluralize.js +38 -0
- package/dist/{src/cli → cli}/positional.d.ts +0 -1
- package/dist/cli/positional.js +35 -0
- package/dist/cli/positional.test.d.ts +1 -0
- package/dist/cli/positional.test.js +60 -0
- package/dist/{src/cli → cli}/request-body.d.ts +0 -1
- package/dist/cli/request-body.js +44 -0
- package/dist/cli/request-body.test.d.ts +1 -0
- package/dist/cli/request-body.test.js +31 -0
- package/dist/{src/cli → cli}/runtime/argv.d.ts +0 -1
- package/dist/cli/runtime/argv.js +15 -0
- package/dist/{src/cli → cli}/runtime/auth/resolve.d.ts +0 -1
- package/dist/cli/runtime/auth/resolve.js +39 -0
- package/dist/{src/cli → cli}/runtime/body-flags.d.ts +0 -1
- package/dist/cli/runtime/body-flags.js +117 -0
- package/dist/cli/runtime/body-flags.test.d.ts +1 -0
- package/dist/cli/runtime/body-flags.test.js +192 -0
- package/dist/{src/cli → cli}/runtime/body.d.ts +0 -1
- package/dist/cli/runtime/body.js +16 -0
- package/dist/{src/cli → cli}/runtime/collect.d.ts +0 -1
- package/dist/cli/runtime/collect.js +3 -0
- package/dist/{src/cli → cli}/runtime/compat.d.ts +0 -1
- package/dist/cli/runtime/compat.js +78 -0
- package/dist/{src/cli → cli}/runtime/context.d.ts +0 -1
- package/dist/cli/runtime/context.js +44 -0
- package/dist/{src/cli → cli}/runtime/execute.d.ts +0 -1
- package/dist/cli/runtime/execute.js +106 -0
- package/dist/{src/cli → cli}/runtime/generated.d.ts +0 -1
- package/dist/cli/runtime/generated.js +168 -0
- package/dist/{src/cli → cli}/runtime/headers.d.ts +0 -1
- package/dist/cli/runtime/headers.js +30 -0
- package/dist/{src/cli → cli}/runtime/index.d.ts +0 -1
- package/dist/cli/runtime/index.js +3 -0
- package/dist/{src/cli → cli}/runtime/profile/secrets.d.ts +0 -1
- package/dist/cli/runtime/profile/secrets.js +53 -0
- package/dist/{src/cli → cli}/runtime/profile/store.d.ts +0 -1
- package/dist/cli/runtime/profile/store.js +63 -0
- package/dist/{src/cli → cli}/runtime/request.d.ts +0 -1
- package/dist/cli/runtime/request.js +283 -0
- package/dist/cli/runtime/request.test.d.ts +1 -0
- package/dist/cli/runtime/request.test.js +332 -0
- package/dist/{src/cli → cli}/runtime/server-url.d.ts +0 -1
- package/dist/cli/runtime/server-url.js +28 -0
- package/dist/{src/cli → cli}/runtime/template.d.ts +0 -1
- package/dist/cli/runtime/template.js +22 -0
- package/dist/cli/runtime/validate/ajv.d.ts +2 -0
- package/dist/cli/runtime/validate/ajv.js +11 -0
- package/dist/{src/cli → cli}/runtime/validate/coerce.d.ts +0 -1
- package/dist/cli/runtime/validate/coerce.js +63 -0
- package/dist/cli/runtime/validate/coerce.test.d.ts +1 -0
- package/dist/cli/runtime/validate/coerce.test.js +75 -0
- package/dist/{src/cli → cli}/runtime/validate/error.d.ts +0 -1
- package/dist/cli/runtime/validate/error.js +19 -0
- package/dist/{src/cli → cli}/runtime/validate/index.d.ts +0 -1
- package/dist/cli/runtime/validate/index.js +4 -0
- package/dist/{src/cli → cli}/runtime/validate/schema.d.ts +0 -1
- package/dist/cli/runtime/validate/schema.js +38 -0
- package/dist/{src/cli → cli}/schema-shape.d.ts +0 -1
- package/dist/cli/schema-shape.js +34 -0
- package/dist/{src/cli → cli}/schema.d.ts +0 -1
- package/dist/cli/schema.js +31 -0
- package/dist/{src/cli → cli}/server.d.ts +0 -1
- package/dist/cli/server.js +130 -0
- package/dist/cli/server.test.d.ts +1 -0
- package/dist/cli/server.test.js +49 -0
- package/dist/{src/cli → cli}/spec-id.d.ts +0 -1
- package/dist/cli/spec-id.js +8 -0
- package/dist/{src/cli → cli}/spec-loader.d.ts +0 -1
- package/dist/cli/spec-loader.js +40 -0
- package/dist/{src/cli → cli}/stable-json.d.ts +0 -1
- package/dist/cli/stable-json.js +29 -0
- package/dist/{src/cli → cli}/strings.d.ts +0 -1
- package/dist/cli/strings.js +20 -0
- package/dist/{src/cli → cli}/types.d.ts +0 -1
- package/dist/cli/types.js +3 -0
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +51 -2324
- package/dist/compiled.d.ts +2 -0
- package/{src/compiled.ts → dist/compiled.js} +8 -11
- package/dist/macros/env.d.ts +10 -0
- package/dist/macros/env.js +22 -0
- package/dist/macros/spec.d.ts +5 -0
- package/dist/macros/spec.js +16 -0
- package/package.json +17 -25
- package/bin/specli.js +0 -26
- package/cli.ts +0 -77
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -53
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -2032
- package/dist/index.js.map +0 -48
- package/dist/src/ai/tools.d.ts.map +0 -1
- package/dist/src/ai/tools.js +0 -1656
- package/dist/src/ai/tools.js.map +0 -45
- package/dist/src/cli/auth-requirements.d.ts.map +0 -1
- package/dist/src/cli/auth-requirements.js +0 -66
- package/dist/src/cli/auth-requirements.js.map +0 -10
- package/dist/src/cli/auth-schemes.d.ts.map +0 -1
- package/dist/src/cli/auth-schemes.js +0 -116
- package/dist/src/cli/auth-schemes.js.map +0 -11
- package/dist/src/cli/capabilities.d.ts.map +0 -1
- package/dist/src/cli/capabilities.js +0 -45
- package/dist/src/cli/capabilities.js.map +0 -10
- package/dist/src/cli/command-id.d.ts.map +0 -1
- package/dist/src/cli/command-id.js +0 -18
- package/dist/src/cli/command-id.js.map +0 -11
- package/dist/src/cli/command-index.d.ts.map +0 -1
- package/dist/src/cli/command-index.js +0 -15
- package/dist/src/cli/command-index.js.map +0 -10
- package/dist/src/cli/command-model.d.ts.map +0 -1
- package/dist/src/cli/command-model.js +0 -274
- package/dist/src/cli/command-model.js.map +0 -18
- package/dist/src/cli/compile.d.ts.map +0 -1
- package/dist/src/cli/compile.js +0 -146
- package/dist/src/cli/compile.js.map +0 -11
- package/dist/src/cli/crypto.d.ts.map +0 -1
- package/dist/src/cli/crypto.js +0 -15
- package/dist/src/cli/crypto.js.map +0 -10
- package/dist/src/cli/derive-name.d.ts.map +0 -1
- package/dist/src/cli/derive-name.js +0 -70
- package/dist/src/cli/derive-name.js.map +0 -10
- package/dist/src/cli/exec.d.ts.map +0 -1
- package/dist/src/cli/exec.js +0 -2077
- package/dist/src/cli/exec.js.map +0 -49
- package/dist/src/cli/main.d.ts.map +0 -1
- package/dist/src/cli/main.js +0 -2032
- package/dist/src/cli/main.js.map +0 -48
- package/dist/src/cli/naming.d.ts.map +0 -1
- package/dist/src/cli/naming.js +0 -216
- package/dist/src/cli/naming.js.map +0 -12
- package/dist/src/cli/operations.d.ts.map +0 -1
- package/dist/src/cli/operations.js +0 -103
- package/dist/src/cli/operations.js.map +0 -10
- package/dist/src/cli/params.d.ts.map +0 -1
- package/dist/src/cli/params.js +0 -79
- package/dist/src/cli/params.js.map +0 -12
- package/dist/src/cli/pluralize.d.ts.map +0 -1
- package/dist/src/cli/pluralize.js +0 -43
- package/dist/src/cli/pluralize.js.map +0 -10
- package/dist/src/cli/positional.d.ts.map +0 -1
- package/dist/src/cli/positional.js +0 -39
- package/dist/src/cli/positional.js.map +0 -10
- package/dist/src/cli/request-body.d.ts.map +0 -1
- package/dist/src/cli/request-body.js +0 -82
- package/dist/src/cli/request-body.js.map +0 -12
- package/dist/src/cli/runtime/argv.d.ts.map +0 -1
- package/dist/src/cli/runtime/argv.js +0 -22
- package/dist/src/cli/runtime/argv.js.map +0 -10
- package/dist/src/cli/runtime/auth/resolve.d.ts.map +0 -1
- package/dist/src/cli/runtime/auth/resolve.js +0 -38
- package/dist/src/cli/runtime/auth/resolve.js.map +0 -10
- package/dist/src/cli/runtime/body-flags.d.ts.map +0 -1
- package/dist/src/cli/runtime/body-flags.js +0 -86
- package/dist/src/cli/runtime/body-flags.js.map +0 -10
- package/dist/src/cli/runtime/body.d.ts.map +0 -1
- package/dist/src/cli/runtime/body.js +0 -40
- package/dist/src/cli/runtime/body.js.map +0 -11
- package/dist/src/cli/runtime/collect.d.ts.map +0 -1
- package/dist/src/cli/runtime/collect.js +0 -9
- package/dist/src/cli/runtime/collect.js.map +0 -10
- package/dist/src/cli/runtime/compat.d.ts.map +0 -1
- package/dist/src/cli/runtime/compat.js +0 -62
- package/dist/src/cli/runtime/compat.js.map +0 -10
- package/dist/src/cli/runtime/context.d.ts.map +0 -1
- package/dist/src/cli/runtime/context.js +0 -936
- package/dist/src/cli/runtime/context.js.map +0 -32
- package/dist/src/cli/runtime/execute.d.ts.map +0 -1
- package/dist/src/cli/runtime/execute.js +0 -670
- package/dist/src/cli/runtime/execute.js.map +0 -22
- package/dist/src/cli/runtime/generated.d.ts.map +0 -1
- package/dist/src/cli/runtime/generated.js +0 -869
- package/dist/src/cli/runtime/generated.js.map +0 -23
- package/dist/src/cli/runtime/headers.d.ts.map +0 -1
- package/dist/src/cli/runtime/headers.js +0 -36
- package/dist/src/cli/runtime/headers.js.map +0 -10
- package/dist/src/cli/runtime/index.d.ts.map +0 -1
- package/dist/src/cli/runtime/index.js +0 -1808
- package/dist/src/cli/runtime/index.js.map +0 -46
- package/dist/src/cli/runtime/profile/secrets.d.ts.map +0 -1
- package/dist/src/cli/runtime/profile/secrets.js +0 -51
- package/dist/src/cli/runtime/profile/secrets.js.map +0 -11
- package/dist/src/cli/runtime/profile/store.d.ts.map +0 -1
- package/dist/src/cli/runtime/profile/store.js +0 -102
- package/dist/src/cli/runtime/profile/store.js.map +0 -11
- package/dist/src/cli/runtime/request.d.ts.map +0 -1
- package/dist/src/cli/runtime/request.js +0 -571
- package/dist/src/cli/runtime/request.js.map +0 -21
- package/dist/src/cli/runtime/server-url.d.ts.map +0 -1
- package/dist/src/cli/runtime/server-url.js +0 -55
- package/dist/src/cli/runtime/server-url.js.map +0 -11
- package/dist/src/cli/runtime/template.d.ts.map +0 -1
- package/dist/src/cli/runtime/template.js +0 -29
- package/dist/src/cli/runtime/template.js.map +0 -10
- package/dist/src/cli/runtime/validate/ajv.d.ts +0 -3
- package/dist/src/cli/runtime/validate/ajv.d.ts.map +0 -1
- package/dist/src/cli/runtime/validate/ajv.js +0 -17
- package/dist/src/cli/runtime/validate/ajv.js.map +0 -10
- package/dist/src/cli/runtime/validate/coerce.d.ts.map +0 -1
- package/dist/src/cli/runtime/validate/coerce.js +0 -60
- package/dist/src/cli/runtime/validate/coerce.js.map +0 -10
- package/dist/src/cli/runtime/validate/error.d.ts.map +0 -1
- package/dist/src/cli/runtime/validate/error.js +0 -21
- package/dist/src/cli/runtime/validate/error.js.map +0 -10
- package/dist/src/cli/runtime/validate/index.d.ts.map +0 -1
- package/dist/src/cli/runtime/validate/index.js +0 -122
- package/dist/src/cli/runtime/validate/index.js.map +0 -13
- package/dist/src/cli/runtime/validate/schema.d.ts.map +0 -1
- package/dist/src/cli/runtime/validate/schema.js +0 -36
- package/dist/src/cli/runtime/validate/schema.js.map +0 -10
- package/dist/src/cli/schema-shape.d.ts.map +0 -1
- package/dist/src/cli/schema-shape.js +0 -41
- package/dist/src/cli/schema-shape.js.map +0 -10
- package/dist/src/cli/schema.d.ts.map +0 -1
- package/dist/src/cli/schema.js +0 -38
- package/dist/src/cli/schema.js.map +0 -10
- package/dist/src/cli/server.d.ts.map +0 -1
- package/dist/src/cli/server.js +0 -64
- package/dist/src/cli/server.js.map +0 -11
- package/dist/src/cli/spec-id.d.ts.map +0 -1
- package/dist/src/cli/spec-id.js +0 -21
- package/dist/src/cli/spec-id.js.map +0 -11
- package/dist/src/cli/spec-loader.d.ts.map +0 -1
- package/dist/src/cli/spec-loader.js +0 -110
- package/dist/src/cli/spec-loader.js.map +0 -15
- package/dist/src/cli/stable-json.d.ts.map +0 -1
- package/dist/src/cli/stable-json.js +0 -35
- package/dist/src/cli/stable-json.js.map +0 -10
- package/dist/src/cli/strings.d.ts.map +0 -1
- package/dist/src/cli/strings.js +0 -16
- package/dist/src/cli/strings.js.map +0 -10
- package/dist/src/cli/types.d.ts.map +0 -1
- package/dist/src/cli/types.js +0 -9
- package/dist/src/cli/types.js.map +0 -10
- package/index.ts +0 -1
- package/src/ai/tools.ts +0 -211
- package/src/cli/auth-requirements.ts +0 -91
- package/src/cli/auth-schemes.ts +0 -187
- package/src/cli/capabilities.ts +0 -88
- package/src/cli/command-id.ts +0 -16
- package/src/cli/command-index.ts +0 -19
- package/src/cli/command-model.ts +0 -128
- package/src/cli/compile.ts +0 -101
- package/src/cli/crypto.ts +0 -9
- package/src/cli/derive-name.ts +0 -101
- package/src/cli/exec.ts +0 -72
- package/src/cli/main.ts +0 -231
- package/src/cli/naming.ts +0 -224
- package/src/cli/operations.ts +0 -152
- package/src/cli/params.ts +0 -71
- package/src/cli/pluralize.ts +0 -41
- package/src/cli/positional.ts +0 -75
- package/src/cli/request-body.ts +0 -94
- package/src/cli/runtime/argv.ts +0 -14
- package/src/cli/runtime/auth/resolve.ts +0 -59
- package/src/cli/runtime/body-flags.ts +0 -176
- package/src/cli/runtime/body.ts +0 -24
- package/src/cli/runtime/collect.ts +0 -6
- package/src/cli/runtime/compat.ts +0 -89
- package/src/cli/runtime/context.ts +0 -62
- package/src/cli/runtime/execute.ts +0 -147
- package/src/cli/runtime/generated.ts +0 -242
- package/src/cli/runtime/headers.ts +0 -37
- package/src/cli/runtime/index.ts +0 -3
- package/src/cli/runtime/profile/secrets.ts +0 -83
- package/src/cli/runtime/profile/store.ts +0 -100
- package/src/cli/runtime/request.ts +0 -390
- package/src/cli/runtime/server-url.ts +0 -45
- package/src/cli/runtime/template.ts +0 -26
- package/src/cli/runtime/validate/ajv.ts +0 -13
- package/src/cli/runtime/validate/coerce.ts +0 -71
- package/src/cli/runtime/validate/error.ts +0 -29
- package/src/cli/runtime/validate/index.ts +0 -4
- package/src/cli/runtime/validate/schema.ts +0 -54
- package/src/cli/schema-shape.ts +0 -36
- package/src/cli/schema.ts +0 -76
- package/src/cli/server.ts +0 -88
- package/src/cli/spec-id.ts +0 -12
- package/src/cli/spec-loader.ts +0 -58
- package/src/cli/stable-json.ts +0 -35
- package/src/cli/strings.ts +0 -21
- package/src/cli/types.ts +0 -59
- package/src/macros/env.ts +0 -21
- package/src/macros/spec.ts +0 -17
package/README.md
CHANGED
|
@@ -1,464 +1,355 @@
|
|
|
1
1
|
# specli
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Turn any OpenAPI spec into a CLI.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
- **exec**: run commands dynamically from a spec URL/path.
|
|
8
|
-
- **compile**: bundle the spec into a standalone executable.
|
|
9
|
-
|
|
10
|
-
The guiding constraints:
|
|
5
|
+
## Install
|
|
11
6
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g specli
|
|
9
|
+
```
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
Or use directly with npx/bunx:
|
|
17
12
|
|
|
18
|
-
|
|
13
|
+
```bash
|
|
14
|
+
npx specli exec ./openapi.json __schema
|
|
15
|
+
bunx specli exec ./openapi.json __schema
|
|
16
|
+
```
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
- Path/query/header/cookie parameters.
|
|
22
|
-
- Request bodies via `--data` / `--file`.
|
|
23
|
-
- JSON request body parsing + schema validation.
|
|
24
|
-
- Body field flags matching OpenAPI schema properties (including nested objects with dot notation).
|
|
25
|
-
- Auth injection for common schemes (bearer/basic/apiKey).
|
|
26
|
-
- A deterministic `__schema` output for introspection.
|
|
18
|
+
## Commands
|
|
27
19
|
|
|
28
|
-
|
|
20
|
+
### exec
|
|
29
21
|
|
|
30
|
-
|
|
22
|
+
Run commands dynamically from any OpenAPI spec URL or file path. Works with both Node.js and Bun.
|
|
31
23
|
|
|
32
24
|
```bash
|
|
33
|
-
|
|
25
|
+
specli exec <spec> <resource> <action> [args...] [options]
|
|
34
26
|
```
|
|
35
27
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
Inspect what commands will be generated:
|
|
28
|
+
**Examples:**
|
|
39
29
|
|
|
40
30
|
```bash
|
|
41
|
-
|
|
42
|
-
|
|
31
|
+
# Inspect available commands
|
|
32
|
+
specli exec ./openapi.json __schema
|
|
43
33
|
|
|
44
|
-
Machine-readable schema output
|
|
34
|
+
# Machine-readable schema output
|
|
35
|
+
specli exec ./openapi.json __schema --json
|
|
45
36
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
```
|
|
37
|
+
# Minimal schema (best for large specs)
|
|
38
|
+
specli exec ./openapi.json __schema --json --min
|
|
49
39
|
|
|
50
|
-
|
|
40
|
+
# Run an operation
|
|
41
|
+
specli exec ./openapi.json users list
|
|
51
42
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
```
|
|
43
|
+
# Run with path parameters
|
|
44
|
+
specli exec ./openapi.json users get abc123
|
|
55
45
|
|
|
56
|
-
|
|
46
|
+
# Preview the curl command without executing
|
|
47
|
+
specli exec ./openapi.json users list --curl
|
|
57
48
|
|
|
58
|
-
|
|
59
|
-
|
|
49
|
+
# Dry run (show request details without executing)
|
|
50
|
+
specli exec ./openapi.json users list --dry-run
|
|
60
51
|
```
|
|
61
52
|
|
|
62
|
-
|
|
53
|
+
### compile
|
|
63
54
|
|
|
64
|
-
|
|
55
|
+
Bundle an OpenAPI spec into a standalone executable. **Requires Bun.**
|
|
65
56
|
|
|
66
57
|
```bash
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
# → ./dist/my-api (derived from info.title)
|
|
58
|
+
specli compile <spec> [options]
|
|
59
|
+
```
|
|
70
60
|
|
|
71
|
-
|
|
72
|
-
bunx specli compile ./path/to/openapi.yaml --name myapi
|
|
73
|
-
# → ./dist/myapi
|
|
61
|
+
**Options:**
|
|
74
62
|
|
|
75
|
-
|
|
76
|
-
|
|
63
|
+
| Option | Description |
|
|
64
|
+
|--------|-------------|
|
|
65
|
+
| `--name <name>` | Binary name (default: derived from spec title) |
|
|
66
|
+
| `--outfile <path>` | Output path (default: `./dist/<name>`) |
|
|
67
|
+
| `--target <target>` | Cross-compile target (e.g. `bun-linux-x64`) |
|
|
68
|
+
| `--minify` | Enable minification |
|
|
69
|
+
| `--bytecode` | Enable bytecode compilation |
|
|
70
|
+
| `--no-dotenv` | Disable .env autoload |
|
|
71
|
+
| `--no-bunfig` | Disable bunfig.toml autoload |
|
|
72
|
+
| `--server <url>` | Bake in a default server URL |
|
|
73
|
+
| `--server-var <k=v>` | Bake in server variables (repeatable) |
|
|
74
|
+
| `--auth <scheme>` | Bake in default auth scheme |
|
|
77
75
|
|
|
78
|
-
|
|
79
|
-
bunx specli compile ./path/to/openapi.yaml --no-dotenv --no-bunfig
|
|
76
|
+
**Examples:**
|
|
80
77
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
78
|
+
```bash
|
|
79
|
+
# Compile with auto-derived name
|
|
80
|
+
specli compile ./openapi.yaml
|
|
81
|
+
# Creates: ./dist/my-api
|
|
82
|
+
|
|
83
|
+
# Compile with explicit name
|
|
84
|
+
specli compile ./openapi.yaml --name myapi
|
|
85
|
+
# Creates: ./dist/myapi
|
|
86
|
+
|
|
87
|
+
# Cross-compile for Linux
|
|
88
|
+
specli compile ./openapi.json --target bun-linux-x64 --outfile ./dist/myapi-linux
|
|
89
|
+
|
|
90
|
+
# Bake in defaults
|
|
91
|
+
specli compile https://api.example.com/openapi.json \
|
|
92
|
+
--name myapi \
|
|
93
|
+
--server https://api.example.com \
|
|
94
|
+
--auth BearerAuth
|
|
86
95
|
```
|
|
87
96
|
|
|
88
|
-
The compiled binary
|
|
97
|
+
The compiled binary works standalone:
|
|
89
98
|
|
|
90
99
|
```bash
|
|
91
|
-
./dist/
|
|
92
|
-
./dist/
|
|
100
|
+
./dist/myapi users list
|
|
101
|
+
./dist/myapi users get abc123 --json
|
|
93
102
|
```
|
|
94
103
|
|
|
95
|
-
Notes:
|
|
96
|
-
|
|
97
|
-
- The spec is embedded at compile-time using a Bun macro.
|
|
98
|
-
- If `--name` is not provided, it is derived from the OpenAPI `info.title` or URL hostname.
|
|
99
|
-
- Runtime flags (e.g., `--server`) override baked-in defaults.
|
|
100
|
-
|
|
101
104
|
## CLI Shape
|
|
102
105
|
|
|
103
106
|
specli generates commands of the form:
|
|
104
107
|
|
|
105
108
|
```
|
|
106
|
-
|
|
109
|
+
<resource> <action> [...positionals] [options]
|
|
107
110
|
```
|
|
108
111
|
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
- Name collisions are disambiguated
|
|
112
|
+
- **resource**: Derived from `tags[0]`, `operationId` prefix, or first path segment
|
|
113
|
+
- **action**: Inferred from HTTP method or `operationId` suffix
|
|
114
|
+
- Name collisions are disambiguated automatically
|
|
112
115
|
|
|
113
|
-
Use `__schema` to see the
|
|
116
|
+
Use `__schema` to see the command mapping for any spec.
|
|
114
117
|
|
|
115
118
|
## Global Options
|
|
116
119
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
## Parameter Mapping
|
|
120
|
+
| Option | Description |
|
|
121
|
+
|--------|-------------|
|
|
122
|
+
| `--server <url>` | Override server/base URL |
|
|
123
|
+
| `--server-var <name=value>` | Server URL template variable (repeatable) |
|
|
124
|
+
| `--profile <name>` | Profile name |
|
|
125
|
+
| `--auth <scheme>` | Select auth scheme by key |
|
|
126
|
+
| `--bearer-token <token>` | Set `Authorization: Bearer <token>` |
|
|
127
|
+
| `--oauth-token <token>` | Alias for `--bearer-token` |
|
|
128
|
+
| `--username <user>` | Basic auth username |
|
|
129
|
+
| `--password <pass>` | Basic auth password |
|
|
130
|
+
| `--api-key <key>` | API key value |
|
|
131
|
+
| `--json` | Machine-readable output |
|
|
132
|
+
|
|
133
|
+
## Per-Operation Options
|
|
134
|
+
|
|
135
|
+
Every operation command includes:
|
|
136
|
+
|
|
137
|
+
| Option | Description |
|
|
138
|
+
|--------|-------------|
|
|
139
|
+
| `--header <header>` | Extra headers (repeatable, `Name: Value` or `Name=Value`) |
|
|
140
|
+
| `--accept <type>` | Override `Accept` header |
|
|
141
|
+
| `--timeout <ms>` | Request timeout in milliseconds |
|
|
142
|
+
| `--dry-run` | Print request details without sending |
|
|
143
|
+
| `--curl` | Print equivalent curl command without sending |
|
|
144
|
+
|
|
145
|
+
For operations with request bodies:
|
|
146
|
+
|
|
147
|
+
| Option | Description |
|
|
148
|
+
|--------|-------------|
|
|
149
|
+
| `--data <data>` | Inline request body |
|
|
150
|
+
| `--file <path>` | Read request body from file |
|
|
151
|
+
| `--content-type <type>` | Override `Content-Type` |
|
|
152
|
+
|
|
153
|
+
## Parameters
|
|
153
154
|
|
|
154
155
|
### Path Parameters
|
|
155
156
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
- Order is derived from the path template: `/users/{id}/keys/{key_id}` becomes `<id> <key-id>`.
|
|
159
|
-
- Values are URL-encoded when applied to the path.
|
|
160
|
-
|
|
161
|
-
### Query / Header / Cookie Parameters
|
|
162
|
-
|
|
163
|
-
OpenAPI parameters where `in: query|header|cookie` become flags.
|
|
164
|
-
|
|
165
|
-
Flag name rules:
|
|
166
|
-
|
|
167
|
-
- `--${kebabCase(parameter.name)}`
|
|
168
|
-
- Examples:
|
|
169
|
-
- `limit` -> `--limit`
|
|
170
|
-
- `X-Request-Id` -> `--x-request-id`
|
|
157
|
+
Path parameters become positional arguments in order:
|
|
171
158
|
|
|
172
|
-
|
|
159
|
+
```
|
|
160
|
+
/users/{id}/keys/{key_id} → <id> <key-id>
|
|
161
|
+
```
|
|
173
162
|
|
|
174
|
-
|
|
163
|
+
### Query/Header/Cookie Parameters
|
|
175
164
|
|
|
176
|
-
|
|
165
|
+
These become kebab-case flags:
|
|
177
166
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
-
|
|
181
|
-
|
|
182
|
-
- `object` -> JSON object literal string, parsed via `JSON.parse`
|
|
183
|
-
- `array` -> see below
|
|
167
|
+
```
|
|
168
|
+
limit → --limit
|
|
169
|
+
X-Request-Id → --x-request-id
|
|
170
|
+
```
|
|
184
171
|
|
|
185
|
-
|
|
172
|
+
Required parameters are enforced by the CLI.
|
|
186
173
|
|
|
187
|
-
|
|
174
|
+
### Arrays
|
|
188
175
|
|
|
189
|
-
|
|
176
|
+
Array parameters are repeatable:
|
|
190
177
|
|
|
191
178
|
```bash
|
|
179
|
+
# All produce ?tag=a&tag=b
|
|
192
180
|
specli ... --tag a --tag b
|
|
193
181
|
specli ... --tag a,b
|
|
194
182
|
specli ... --tag '["a","b"]'
|
|
195
183
|
```
|
|
196
184
|
|
|
197
|
-
Implementation notes:
|
|
198
|
-
|
|
199
|
-
- The query string is built with repeated keys (`URLSearchParams.append`).
|
|
200
|
-
- Array item types are derived from `schema.items.type` when present (e.g. integer arrays validate and coerce correctly).
|
|
201
|
-
|
|
202
185
|
## Request Bodies
|
|
203
186
|
|
|
204
187
|
### Body Field Flags
|
|
205
188
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
- For `string|number|integer`: `--<prop> <value>`
|
|
209
|
-
- For `boolean`: `--<prop>` (presence sets it to `true`)
|
|
210
|
-
- For nested objects: `--<parent>.<child> <value>` (dot notation)
|
|
211
|
-
|
|
212
|
-
Example (from `fixtures/openapi-body.json`):
|
|
189
|
+
For JSON request bodies, specli generates convenience flags matching schema properties:
|
|
213
190
|
|
|
214
191
|
```bash
|
|
215
|
-
|
|
192
|
+
specli exec ./openapi.json contacts create --name "Ada" --email "ada@example.com"
|
|
216
193
|
```
|
|
217
194
|
|
|
218
|
-
Produces
|
|
195
|
+
Produces:
|
|
219
196
|
|
|
220
197
|
```json
|
|
221
|
-
{"name":"Ada"}
|
|
198
|
+
{"name":"Ada","email":"ada@example.com"}
|
|
222
199
|
```
|
|
223
200
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
Nested object properties use dot notation. For a schema like:
|
|
227
|
-
|
|
228
|
-
```json
|
|
229
|
-
{
|
|
230
|
-
"type": "object",
|
|
231
|
-
"properties": {
|
|
232
|
-
"name": { "type": "string" },
|
|
233
|
-
"address": {
|
|
234
|
-
"type": "object",
|
|
235
|
-
"properties": {
|
|
236
|
-
"street": { "type": "string" },
|
|
237
|
-
"city": { "type": "string" }
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
```
|
|
201
|
+
### Nested Objects
|
|
243
202
|
|
|
244
|
-
|
|
203
|
+
Use dot notation for nested properties:
|
|
245
204
|
|
|
246
205
|
```bash
|
|
247
|
-
mycli contacts create --name "Ada" --address.
|
|
206
|
+
mycli contacts create --name "Ada" --address.city "NYC" --address.zip "10001"
|
|
248
207
|
```
|
|
249
208
|
|
|
250
|
-
|
|
209
|
+
Produces:
|
|
251
210
|
|
|
252
211
|
```json
|
|
253
|
-
{"name":"Ada","address":{"
|
|
212
|
+
{"name":"Ada","address":{"city":"NYC","zip":"10001"}}
|
|
254
213
|
```
|
|
255
214
|
|
|
256
|
-
Notes / edge cases:
|
|
257
|
-
|
|
258
|
-
- Body field flags are only supported for JSON bodies.
|
|
259
|
-
- Required fields in the schema are checked with friendly error messages:
|
|
260
|
-
- `Missing required body field 'name'. Provide --name.`
|
|
261
|
-
- If a body field flag would conflict with an operation parameter flag or `--curl`, the operation parameter takes precedence.
|
|
262
|
-
- Numeric coercion uses `Number(...)` / `parseInt(...)`.
|
|
263
|
-
|
|
264
215
|
## Servers
|
|
265
216
|
|
|
266
|
-
|
|
217
|
+
Server URL resolution order:
|
|
267
218
|
|
|
268
|
-
1. `--server <url>`
|
|
269
|
-
2.
|
|
270
|
-
3.
|
|
219
|
+
1. `--server <url>` flag
|
|
220
|
+
2. Profile `server` setting
|
|
221
|
+
3. First `servers[0].url` in the spec
|
|
271
222
|
|
|
272
|
-
|
|
223
|
+
For templated URLs (e.g. `https://{region}.api.example.com`):
|
|
273
224
|
|
|
274
|
-
|
|
275
|
-
|
|
225
|
+
```bash
|
|
226
|
+
specli ... --server-var region=us-east-1
|
|
227
|
+
```
|
|
276
228
|
|
|
277
229
|
## Authentication
|
|
278
230
|
|
|
279
|
-
### Supported
|
|
280
|
-
|
|
281
|
-
From `components.securitySchemes`, specli recognizes:
|
|
282
|
-
|
|
283
|
-
- HTTP bearer (`type: http`, `scheme: bearer`)
|
|
284
|
-
- HTTP basic (`type: http`, `scheme: basic`)
|
|
285
|
-
- API key (`type: apiKey`, `in: header|query|cookie`)
|
|
286
|
-
- OAuth2 (`type: oauth2`) (treated as bearer token injection)
|
|
287
|
-
- OpenID Connect (`type: openIdConnect`) (treated as bearer token injection)
|
|
231
|
+
### Supported Schemes
|
|
288
232
|
|
|
289
|
-
|
|
233
|
+
- HTTP Bearer (`type: http`, `scheme: bearer`)
|
|
234
|
+
- HTTP Basic (`type: http`, `scheme: basic`)
|
|
235
|
+
- API Key (`type: apiKey`, `in: header|query|cookie`)
|
|
236
|
+
- OAuth2 (`type: oauth2`) - treated as bearer token
|
|
237
|
+
- OpenID Connect (`type: openIdConnect`) - treated as bearer token
|
|
290
238
|
|
|
291
|
-
Scheme
|
|
239
|
+
### Scheme Selection
|
|
292
240
|
|
|
293
|
-
1. `--auth <scheme>` (explicit)
|
|
294
|
-
2.
|
|
295
|
-
3.
|
|
296
|
-
4.
|
|
297
|
-
|
|
298
|
-
This “only if present in current spec” behavior prevents accidental auth leakage between different specs.
|
|
241
|
+
1. `--auth <scheme>` flag (explicit)
|
|
242
|
+
2. Profile `authScheme` setting
|
|
243
|
+
3. If operation requires exactly one scheme, use it
|
|
244
|
+
4. If spec defines exactly one scheme, use it
|
|
299
245
|
|
|
300
246
|
### Providing Credentials
|
|
301
247
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
- or a profile token stored via `specli auth token ...`
|
|
306
|
-
|
|
307
|
-
Basic auth:
|
|
308
|
-
|
|
309
|
-
- `--username <username>` and `--password <password>`
|
|
310
|
-
|
|
311
|
-
API key:
|
|
312
|
-
|
|
313
|
-
- `--api-key <key>` (injected into the header/query/cookie location declared by the scheme)
|
|
314
|
-
|
|
315
|
-
## Profiles (Non-Interactive)
|
|
316
|
-
|
|
317
|
-
Profiles are for automation.
|
|
318
|
-
|
|
319
|
-
Config file:
|
|
248
|
+
```bash
|
|
249
|
+
# Bearer/OAuth2/OIDC
|
|
250
|
+
specli ... --bearer-token <token>
|
|
320
251
|
|
|
321
|
-
|
|
322
|
-
|
|
252
|
+
# Basic auth
|
|
253
|
+
specli ... --username <user> --password <pass>
|
|
323
254
|
|
|
324
|
-
|
|
255
|
+
# API key
|
|
256
|
+
specli ... --api-key <key>
|
|
257
|
+
```
|
|
325
258
|
|
|
326
|
-
|
|
259
|
+
## Profiles
|
|
327
260
|
|
|
328
|
-
|
|
261
|
+
Store configuration for automation:
|
|
329
262
|
|
|
330
263
|
```bash
|
|
264
|
+
# List profiles
|
|
331
265
|
specli profile list
|
|
266
|
+
|
|
267
|
+
# Create/update profile
|
|
332
268
|
specli profile set --name dev --server https://api.example.com --auth bearerAuth --default
|
|
269
|
+
|
|
270
|
+
# Switch default profile
|
|
333
271
|
specli profile use --name dev
|
|
272
|
+
|
|
273
|
+
# Delete profile
|
|
334
274
|
specli profile rm --name dev
|
|
335
275
|
|
|
276
|
+
# Manage tokens
|
|
336
277
|
specli auth token --name dev --set "..."
|
|
337
278
|
specli auth token --name dev --get
|
|
338
279
|
specli auth token --name dev --delete
|
|
339
280
|
```
|
|
340
281
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
### Default (Human + Agent Readable)
|
|
282
|
+
Config location: `~/.config/specli/profiles.json`
|
|
344
283
|
|
|
345
|
-
|
|
346
|
-
- if response `content-type` includes `json`, prints pretty JSON
|
|
347
|
-
- otherwise prints raw text
|
|
348
|
-
- On non-2xx HTTP:
|
|
349
|
-
- prints `HTTP <status>` and response body
|
|
350
|
-
- exits with code 1
|
|
351
|
-
- On CLI/validation errors:
|
|
352
|
-
- prints `error: <message>`
|
|
353
|
-
- exits with code 1
|
|
284
|
+
## Output Modes
|
|
354
285
|
|
|
355
|
-
###
|
|
286
|
+
### Default (Human Readable)
|
|
356
287
|
|
|
357
|
-
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
- With `--status` and/or `--headers`, wraps output:
|
|
361
|
-
|
|
362
|
-
```json
|
|
363
|
-
{ "status": 200, "headers": { "content-type": "..." }, "body": ... }
|
|
364
|
-
```
|
|
288
|
+
- Success: Pretty JSON for JSON responses, raw text otherwise
|
|
289
|
+
- HTTP errors: `HTTP <status>` + response body, exit code 1
|
|
290
|
+
- CLI errors: `error: <message>`, exit code 1
|
|
365
291
|
|
|
366
|
-
|
|
292
|
+
### --json (Machine Readable)
|
|
367
293
|
|
|
368
294
|
```json
|
|
369
|
-
|
|
370
|
-
|
|
295
|
+
// Success
|
|
296
|
+
{"status":200,"body":{...}}
|
|
371
297
|
|
|
372
|
-
|
|
298
|
+
// HTTP error
|
|
299
|
+
{"status":404,"body":{...}}
|
|
373
300
|
|
|
374
|
-
|
|
375
|
-
{
|
|
301
|
+
// CLI error
|
|
302
|
+
{"error":"..."}
|
|
376
303
|
```
|
|
377
304
|
|
|
378
|
-
###
|
|
379
|
-
|
|
380
|
-
Prints an equivalent curl invocation without sending the request.
|
|
381
|
-
|
|
382
|
-
### `--dry-run`
|
|
383
|
-
|
|
384
|
-
Prints the method, URL, headers, and body that would be sent without sending the request.
|
|
385
|
-
|
|
386
|
-
## `__schema`
|
|
387
|
-
|
|
388
|
-
`specli __schema` reports:
|
|
389
|
-
|
|
390
|
-
- OpenAPI title/version
|
|
391
|
-
- spec source + computed spec id + fingerprint
|
|
392
|
-
- servers/auth schemes counts
|
|
393
|
-
- list of normalized operations
|
|
394
|
-
- planned command mapping
|
|
395
|
-
|
|
396
|
-
Flags:
|
|
397
|
-
|
|
398
|
-
- `--json`: JSON output
|
|
399
|
-
- `--pretty`: pretty JSON
|
|
400
|
-
- `--min`: minimal schema payload (commands + metadata only)
|
|
401
|
-
|
|
402
|
-
## Recommended Public Specs to Test
|
|
403
|
-
|
|
404
|
-
A good “real world” smoke test matrix includes:
|
|
305
|
+
### --curl
|
|
405
306
|
|
|
406
|
-
|
|
407
|
-
- URL: `https://api.vercel.com/copper/_openapi.json`
|
|
408
|
-
- Focus: real-world parameter naming collisions (e.g. `accept`), large-ish spec
|
|
307
|
+
Prints equivalent curl command without sending the request.
|
|
409
308
|
|
|
410
|
-
|
|
411
|
-
- URL (huge): `https://raw.githubusercontent.com/github/rest-api-description/main/descriptions-next/api.github.com/api.github.com.json`
|
|
412
|
-
- Focus: size, OAS 3.1, many endpoints, varied parameter shapes
|
|
309
|
+
### --dry-run
|
|
413
310
|
|
|
414
|
-
|
|
415
|
-
- URL: `https://raw.githubusercontent.com/digitalocean/openapi/main/specification/DigitalOcean-public.v2.yaml`
|
|
416
|
-
- Focus: big spec + deref cycles, request bodies, auth schemes
|
|
311
|
+
Prints method, URL, headers, and body without sending.
|
|
417
312
|
|
|
418
|
-
|
|
419
|
-
- URL: `https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.yaml`
|
|
420
|
-
- Focus: very heavy schema usage (`anyOf`, large components)
|
|
313
|
+
## AI SDK Integration
|
|
421
314
|
|
|
422
|
-
|
|
315
|
+
specli exports an AI SDK tool for use with LLM agents:
|
|
423
316
|
|
|
424
|
-
|
|
317
|
+
```typescript
|
|
318
|
+
import { specli } from "specli/ai/tools";
|
|
319
|
+
import { generateText } from "ai";
|
|
425
320
|
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
321
|
+
const result = await generateText({
|
|
322
|
+
model: yourModel,
|
|
323
|
+
tools: {
|
|
324
|
+
api: specli({
|
|
325
|
+
spec: "https://api.example.com/openapi.json",
|
|
326
|
+
bearerToken: process.env.API_TOKEN,
|
|
327
|
+
}),
|
|
328
|
+
},
|
|
329
|
+
prompt: "List all users",
|
|
330
|
+
});
|
|
435
331
|
```
|
|
436
332
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
333
|
+
The tool supports three commands:
|
|
334
|
+
- `list` - Show available resources and actions
|
|
335
|
+
- `help` - Get details about a specific action
|
|
336
|
+
- `exec` - Execute an API call
|
|
440
337
|
|
|
441
|
-
|
|
338
|
+
## Limitations
|
|
442
339
|
|
|
443
|
-
- OpenAPI 3.x only (Swagger 2.0 not supported)
|
|
444
|
-
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
-
|
|
448
|
-
-
|
|
449
|
-
- Multipart, binary uploads, and file/form modeling are not implemented.
|
|
450
|
-
- `Content-Type`/`Accept` negotiation is basic (string includes checks for `json`).
|
|
451
|
-
- OAuth2 flows are not implemented (token acquisition is out of scope); oauth2 is treated as bearer token injection.
|
|
340
|
+
- OpenAPI 3.x only (Swagger 2.0 not supported)
|
|
341
|
+
- Array serialization uses repeated keys only (`?tag=a&tag=b`)
|
|
342
|
+
- OpenAPI `style`/`explode`/deepObject not implemented
|
|
343
|
+
- Body field flags only support JSON with scalar/nested object properties
|
|
344
|
+
- Multipart and binary uploads not implemented
|
|
345
|
+
- OAuth2 token acquisition not implemented (use `--bearer-token` with pre-acquired tokens)
|
|
452
346
|
|
|
453
347
|
## Development
|
|
454
348
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
- `cli.ts`: main CLI entry with `exec` and `compile` subcommands
|
|
464
|
-
- `src/compiled.ts`: entry point for compiled binaries (embedded spec via Bun macro)
|
|
349
|
+
```bash
|
|
350
|
+
bun install
|
|
351
|
+
bun run build
|
|
352
|
+
bun test
|
|
353
|
+
bun run lint
|
|
354
|
+
bun run typecheck
|
|
355
|
+
```
|