overlord-cli 0.2607121101.0 → 0.2607141312.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/README.md +18 -10
- package/dist/contract/conformance-manifest.schema.yaml +328 -0
- package/dist/index.js +646 -236
- package/dist/index.js.map +4 -4
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -130,9 +130,12 @@ Both the desktop app and the CLI authenticate to `/api/*` with a bearer token:
|
|
|
130
130
|
sign-in on the **local** backend. Stored in `~/.ovld/auth.json` for the CLI
|
|
131
131
|
and in the desktop shell's encrypted settings for each backend profile.
|
|
132
132
|
- **USER_TOKEN** (`out_…`) — long-lived token from Settings → Tokens. Works for
|
|
133
|
-
headless/CI use via `OVERLORD_USER_TOKEN` or `ovld auth login --token`.
|
|
134
|
-
|
|
135
|
-
|
|
133
|
+
headless/CI use via `OVERLORD_USER_TOKEN` or `ovld auth login --token`.
|
|
134
|
+
Interactive email/password login creates and stores a full 90-day `USER_TOKEN`
|
|
135
|
+
automatically **in both local and cloud modes**, so runner/protocol CLI
|
|
136
|
+
surfaces authenticate with a consistent, long-lived credential. (Local logins
|
|
137
|
+
previously stored the raw 7-day Better Auth session token, which is why they
|
|
138
|
+
expired far sooner than cloud logins.)
|
|
136
139
|
|
|
137
140
|
For the **local** backend, desktop and CLI share `~/.ovld/auth.json`:
|
|
138
141
|
|
|
@@ -146,13 +149,18 @@ For the **local** backend, desktop and CLI share `~/.ovld/auth.json`:
|
|
|
146
149
|
desktop app updates `~/.ovld/overlord.toml` with the new `backend_url`, but it
|
|
147
150
|
does **not** update CLI auth. After switching backends in either surface, run
|
|
148
151
|
`ovld auth status` to confirm the CLI is pointed at the same URL and still
|
|
149
|
-
logged in.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
`
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
152
|
+
logged in. `auth status` also reports `expires_at` (with days remaining) when the
|
|
153
|
+
stored credential is a minted `USER_TOKEN`, so you can see a credential's
|
|
154
|
+
lifetime instead of just a logged-in boolean. If `credentialSource` is
|
|
155
|
+
`stored_mismatch` or `loggedIn` is false, run `ovld config set cloud <url>` (if
|
|
156
|
+
needed) and `ovld auth login`. Email/password login uses the session only once to
|
|
157
|
+
create a 90-day full `USER_TOKEN`, then stores that token in `auth.json`.
|
|
158
|
+
|
|
159
|
+
When a stored CLI credential is rejected with HTTP 401, `ovld` leaves `auth.json`
|
|
160
|
+
in place (a 401 can be transient) and tells you to run `ovld auth login` again.
|
|
161
|
+
To reconcile a broken login in one step, run `ovld auth repair`: it validates the
|
|
162
|
+
current credential, reports "healthy" when nothing is wrong, and otherwise clears
|
|
163
|
+
the stale stored credential and walks you through a fresh login.
|
|
156
164
|
|
|
157
165
|
### Headless / container setup
|
|
158
166
|
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
# Overlord Conformance Manifest Schema
|
|
2
|
+
# JSON Schema (YAML format) — every component that ships against Overlord
|
|
3
|
+
# must provide a conformance-manifest.yaml in its root that validates against this schema.
|
|
4
|
+
#
|
|
5
|
+
# Validate with: ovld contract check <manifest-file>
|
|
6
|
+
#
|
|
7
|
+
# Example manifests live in contract/examples/
|
|
8
|
+
|
|
9
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema"
|
|
10
|
+
"$id": "openoverllord/conformance-manifest/v1"
|
|
11
|
+
title: "Overlord Conformance Manifest"
|
|
12
|
+
description: >
|
|
13
|
+
Every connector, extension, database adapter, auth provider, REST module, desktop shell, or MCP server that ships
|
|
14
|
+
against Overlord must provide a conformance-manifest.yaml at its root.
|
|
15
|
+
The manifest declares which contract version the component was validated against,
|
|
16
|
+
what kind of component it is, and which extension points and vocabulary values it uses.
|
|
17
|
+
|
|
18
|
+
type: object
|
|
19
|
+
required:
|
|
20
|
+
- contractVersion
|
|
21
|
+
- componentType
|
|
22
|
+
- componentKey
|
|
23
|
+
- label
|
|
24
|
+
|
|
25
|
+
additionalProperties: false
|
|
26
|
+
|
|
27
|
+
properties:
|
|
28
|
+
|
|
29
|
+
contractVersion:
|
|
30
|
+
type: string
|
|
31
|
+
description: "The Overlord contract version this component was validated against (e.g. '0')"
|
|
32
|
+
examples:
|
|
33
|
+
- "0"
|
|
34
|
+
|
|
35
|
+
componentType:
|
|
36
|
+
type: string
|
|
37
|
+
enum:
|
|
38
|
+
- connector
|
|
39
|
+
- extension
|
|
40
|
+
- database-adapter
|
|
41
|
+
- auth-provider
|
|
42
|
+
- rest-module
|
|
43
|
+
- rest-consumer
|
|
44
|
+
- desktop-shell
|
|
45
|
+
- mcp-server
|
|
46
|
+
description: "The kind of component being shipped"
|
|
47
|
+
|
|
48
|
+
componentKey:
|
|
49
|
+
type: string
|
|
50
|
+
pattern: "^[a-z][a-z0-9_-]*$"
|
|
51
|
+
description: "Stable lowercase identifier for this component (e.g. claude, my-custom-harness)"
|
|
52
|
+
|
|
53
|
+
label:
|
|
54
|
+
type: string
|
|
55
|
+
description: "Human-readable display name"
|
|
56
|
+
|
|
57
|
+
description:
|
|
58
|
+
type: string
|
|
59
|
+
description: "Optional description of what this component does"
|
|
60
|
+
|
|
61
|
+
# ── Connector-specific fields ────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
connector:
|
|
64
|
+
type: object
|
|
65
|
+
description: "Required when componentType is 'connector'"
|
|
66
|
+
required:
|
|
67
|
+
- agentIdentifier
|
|
68
|
+
- capabilities
|
|
69
|
+
additionalProperties: false
|
|
70
|
+
properties:
|
|
71
|
+
agentIdentifier:
|
|
72
|
+
type: string
|
|
73
|
+
description: "The stable agent identifier used by this connector (e.g. claude, codex, cursor)"
|
|
74
|
+
capabilities:
|
|
75
|
+
type: array
|
|
76
|
+
description: "Capability flags this connector supports — must be from the approvedConnectorCapabilities list in contract/extension-points.yaml"
|
|
77
|
+
items:
|
|
78
|
+
type: string
|
|
79
|
+
enum:
|
|
80
|
+
- followUpHook
|
|
81
|
+
- permissionHook
|
|
82
|
+
- stopHook
|
|
83
|
+
- nativeResume
|
|
84
|
+
- modelFlag
|
|
85
|
+
- effortFlag
|
|
86
|
+
- contextFilePrompt
|
|
87
|
+
- permissionRules
|
|
88
|
+
- slashCommands
|
|
89
|
+
uniqueItems: true
|
|
90
|
+
hookTypes:
|
|
91
|
+
type: array
|
|
92
|
+
description: "Hook types this connector uses — must be from approvedHookTypes in contract/extension-points.yaml"
|
|
93
|
+
items:
|
|
94
|
+
type: string
|
|
95
|
+
enum:
|
|
96
|
+
- UserPromptSubmit
|
|
97
|
+
- PermissionRequest
|
|
98
|
+
- Stop
|
|
99
|
+
uniqueItems: true
|
|
100
|
+
managedFiles:
|
|
101
|
+
type: array
|
|
102
|
+
description: "Paths of files this connector installs and manages (relative to install location)"
|
|
103
|
+
items:
|
|
104
|
+
type: string
|
|
105
|
+
installPath:
|
|
106
|
+
type: string
|
|
107
|
+
description: "Default install location for connector files (e.g. ~/.codex/plugins/overlord)"
|
|
108
|
+
|
|
109
|
+
# ── Extension-specific fields ────────────────────────────────────────────────
|
|
110
|
+
|
|
111
|
+
extension:
|
|
112
|
+
type: object
|
|
113
|
+
description: "Required when componentType is 'extension'"
|
|
114
|
+
additionalProperties: false
|
|
115
|
+
properties:
|
|
116
|
+
tablePrefix:
|
|
117
|
+
type: string
|
|
118
|
+
pattern: "^ext_[a-z][a-z0-9_]*_$"
|
|
119
|
+
description: "Database table prefix — must follow ext_<name>_ pattern"
|
|
120
|
+
examples:
|
|
121
|
+
- "ext_myfeature_"
|
|
122
|
+
migrationComponent:
|
|
123
|
+
type: string
|
|
124
|
+
pattern: "^ext:[a-z][a-z0-9_-]*$"
|
|
125
|
+
description: "schema_migrations.component value — must follow ext:<name> pattern"
|
|
126
|
+
examples:
|
|
127
|
+
- "ext:myfeature"
|
|
128
|
+
metadataKeyPrefix:
|
|
129
|
+
type: string
|
|
130
|
+
description: "Namespace prefix for JSON metadata keys stored in core table columns (e.g. com.example or mypackage)"
|
|
131
|
+
usesExtensionPoints:
|
|
132
|
+
type: array
|
|
133
|
+
description: "Extension points from contract/extension-points.yaml that this extension uses"
|
|
134
|
+
items:
|
|
135
|
+
type: string
|
|
136
|
+
enum:
|
|
137
|
+
- database-extension
|
|
138
|
+
- custom-harness
|
|
139
|
+
- open-vocabulary-value
|
|
140
|
+
uniqueItems: true
|
|
141
|
+
|
|
142
|
+
# ── Database adapter-specific fields ─────────────────────────────────────────
|
|
143
|
+
|
|
144
|
+
databaseAdapter:
|
|
145
|
+
type: object
|
|
146
|
+
description: "Required when componentType is 'database-adapter'"
|
|
147
|
+
required:
|
|
148
|
+
- adapterKey
|
|
149
|
+
- schemaContractVersion
|
|
150
|
+
additionalProperties: false
|
|
151
|
+
properties:
|
|
152
|
+
adapterKey:
|
|
153
|
+
type: string
|
|
154
|
+
description: "Adapter identifier (e.g. sqlite, postgres)"
|
|
155
|
+
examples:
|
|
156
|
+
- sqlite
|
|
157
|
+
- postgres
|
|
158
|
+
schemaContractVersion:
|
|
159
|
+
type: string
|
|
160
|
+
description: "Database schema contract version this adapter implements (from 09-database-schema-contract.md)"
|
|
161
|
+
conformanceTestStatus:
|
|
162
|
+
type: string
|
|
163
|
+
enum:
|
|
164
|
+
- passing
|
|
165
|
+
- partial
|
|
166
|
+
- pending
|
|
167
|
+
description: "Current status of adapter conformance test suite"
|
|
168
|
+
conformanceTestPath:
|
|
169
|
+
type: string
|
|
170
|
+
description: "Path to adapter conformance test results or test suite"
|
|
171
|
+
|
|
172
|
+
# ── Auth provider-specific fields ────────────────────────────────────────────
|
|
173
|
+
|
|
174
|
+
authProvider:
|
|
175
|
+
type: object
|
|
176
|
+
description: "Required when componentType is 'auth-provider'"
|
|
177
|
+
additionalProperties: false
|
|
178
|
+
properties:
|
|
179
|
+
authMechanisms:
|
|
180
|
+
type: array
|
|
181
|
+
items:
|
|
182
|
+
type: string
|
|
183
|
+
description: "Auth mechanisms this provider supports (e.g. user-token, oauth, passkey)"
|
|
184
|
+
examples:
|
|
185
|
+
- - user-token
|
|
186
|
+
- - oauth
|
|
187
|
+
- - passkey
|
|
188
|
+
preservesAuditAttribution:
|
|
189
|
+
type: boolean
|
|
190
|
+
description: "Declares that this provider writes actor_workspace_user_id and actor_token_id to audit_log correctly"
|
|
191
|
+
preservesTokenHashRules:
|
|
192
|
+
type: boolean
|
|
193
|
+
description: "Declares that raw token secrets are never persisted — hash and prefix only"
|
|
194
|
+
|
|
195
|
+
# ── REST module-specific fields ───────────────────────────────────────────────
|
|
196
|
+
|
|
197
|
+
restModule:
|
|
198
|
+
type: object
|
|
199
|
+
description: "Required when componentType is 'rest-module'"
|
|
200
|
+
required:
|
|
201
|
+
- endpointPrefix
|
|
202
|
+
additionalProperties: false
|
|
203
|
+
properties:
|
|
204
|
+
endpointPrefix:
|
|
205
|
+
type: string
|
|
206
|
+
pattern: "^/ext/[a-z][a-z0-9/_-]*$"
|
|
207
|
+
description: "Namespaced URL prefix for all endpoints this module adds — must start with /ext/<name>/"
|
|
208
|
+
examples:
|
|
209
|
+
- "/ext/my-integration"
|
|
210
|
+
usesServiceLayer:
|
|
211
|
+
type: boolean
|
|
212
|
+
description: "Declares that this module uses the service layer for database access (no direct table writes)"
|
|
213
|
+
|
|
214
|
+
# ── REST consumer-specific fields ─────────────────────────────────────────────
|
|
215
|
+
|
|
216
|
+
restConsumer:
|
|
217
|
+
type: object
|
|
218
|
+
description: "Required when componentType is 'rest-consumer'"
|
|
219
|
+
required:
|
|
220
|
+
- authMechanisms
|
|
221
|
+
- vendoredContractPath
|
|
222
|
+
- endpoints
|
|
223
|
+
- exportedTypes
|
|
224
|
+
additionalProperties: false
|
|
225
|
+
properties:
|
|
226
|
+
authMechanisms:
|
|
227
|
+
type: array
|
|
228
|
+
description: "Auth mechanisms this client uses against the REST surface"
|
|
229
|
+
items:
|
|
230
|
+
type: string
|
|
231
|
+
enum:
|
|
232
|
+
- bearer-token
|
|
233
|
+
- active-workspace-header
|
|
234
|
+
- better-auth-email
|
|
235
|
+
uniqueItems: true
|
|
236
|
+
vendoredContractPath:
|
|
237
|
+
type: string
|
|
238
|
+
description: "Repo-relative path to the vendored @overlord/contract subset"
|
|
239
|
+
examples:
|
|
240
|
+
- src/lib/contract.ts
|
|
241
|
+
upstreamContractRef:
|
|
242
|
+
type: string
|
|
243
|
+
description: "Path to the canonical contract source inside the OpenOverlord repo"
|
|
244
|
+
examples:
|
|
245
|
+
- packages/contract/src/index.ts
|
|
246
|
+
endpoints:
|
|
247
|
+
type: array
|
|
248
|
+
description: "REST endpoints this client calls"
|
|
249
|
+
items:
|
|
250
|
+
type: object
|
|
251
|
+
required:
|
|
252
|
+
- method
|
|
253
|
+
- path
|
|
254
|
+
additionalProperties: false
|
|
255
|
+
properties:
|
|
256
|
+
method:
|
|
257
|
+
type: string
|
|
258
|
+
enum:
|
|
259
|
+
- GET
|
|
260
|
+
- POST
|
|
261
|
+
- PATCH
|
|
262
|
+
- PUT
|
|
263
|
+
- DELETE
|
|
264
|
+
path:
|
|
265
|
+
type: string
|
|
266
|
+
description: "Route template, e.g. /api/missions/:id"
|
|
267
|
+
responseType:
|
|
268
|
+
type: string
|
|
269
|
+
requestBodyType:
|
|
270
|
+
type: string
|
|
271
|
+
exportedTypes:
|
|
272
|
+
type: array
|
|
273
|
+
description: "DTO/type names vendored from @overlord/contract"
|
|
274
|
+
items:
|
|
275
|
+
type: string
|
|
276
|
+
|
|
277
|
+
# ── Desktop shell-specific fields ─────────────────────────────────────────────
|
|
278
|
+
|
|
279
|
+
desktopShell:
|
|
280
|
+
type: object
|
|
281
|
+
description: "Required when componentType is 'desktop-shell'"
|
|
282
|
+
additionalProperties: false
|
|
283
|
+
properties:
|
|
284
|
+
wrapsModule:
|
|
285
|
+
type: string
|
|
286
|
+
description: "The component whose web surface this shell wraps (e.g. webapp/rest)"
|
|
287
|
+
supervisedProcesses:
|
|
288
|
+
type: array
|
|
289
|
+
description: "CLI/server processes this shell launches and supervises"
|
|
290
|
+
items:
|
|
291
|
+
type: string
|
|
292
|
+
bridgeNamespace:
|
|
293
|
+
type: string
|
|
294
|
+
description: "The contextBridge global exposed to the renderer (e.g. window.overlord)"
|
|
295
|
+
packagingTargets:
|
|
296
|
+
type: array
|
|
297
|
+
description: "Distribution artifacts this shell can produce (e.g. dmg, zip, AppImage, deb)"
|
|
298
|
+
items:
|
|
299
|
+
type: string
|
|
300
|
+
|
|
301
|
+
# ── Shared: vocabulary extensions ────────────────────────────────────────────
|
|
302
|
+
|
|
303
|
+
vocabularyExtensions:
|
|
304
|
+
type: array
|
|
305
|
+
description: "Open vocabulary values this component adds — must be namespaced (reverse-DNS or package-style)"
|
|
306
|
+
items:
|
|
307
|
+
type: object
|
|
308
|
+
required:
|
|
309
|
+
- vocabulary
|
|
310
|
+
- value
|
|
311
|
+
additionalProperties: false
|
|
312
|
+
properties:
|
|
313
|
+
vocabulary:
|
|
314
|
+
type: string
|
|
315
|
+
description: "The open vocabulary column being extended (e.g. artifacts.type)"
|
|
316
|
+
examples:
|
|
317
|
+
- artifacts.type
|
|
318
|
+
- mission_events.source
|
|
319
|
+
- entity_changes.entity_type
|
|
320
|
+
value:
|
|
321
|
+
type: string
|
|
322
|
+
description: "The namespaced value being added (e.g. com.example.my-artifact-type)"
|
|
323
|
+
examples:
|
|
324
|
+
- "com.example.custom-artifact"
|
|
325
|
+
- "mypackage:review-event"
|
|
326
|
+
description:
|
|
327
|
+
type: string
|
|
328
|
+
description: "Optional human description of what this vocabulary value represents"
|