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 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`. On
134
- cloud backends, interactive email/password login creates and stores a full
135
- `USER_TOKEN` automatically so runner/protocol CLI surfaces can authenticate.
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. If `credentialSource` is `stored_mismatch` or `loggedIn` is false, run
150
- `ovld config set cloud <url>` (if needed) and `ovld auth login`. Email/password
151
- login on a cloud backend uses the session only once to create a 90-day full
152
- `USER_TOKEN`, then stores that token in `auth.json`.
153
-
154
- When a stored CLI credential is rejected with HTTP 401, `ovld` clears
155
- `auth.json` and tells you to run `ovld auth login` again.
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"