@jarel/myskills 0.1.0-beta.2 → 0.1.0-beta.20

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.
Files changed (4) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +721 -16
  3. package/dist/index.js +42015 -16335
  4. package/package.json +8 -5
package/README.md CHANGED
@@ -25,21 +25,61 @@ Responsibilities:
25
25
  - install/export/update/rollback packages
26
26
  - submit drafts
27
27
  - support maintainer/admin workflows through role-gated API calls
28
+ - enroll a personal Codex workspace and execute approved updates with an explicit companion command
29
+ - inspect an explicitly selected local Codex profile with a read-only metadata observation or health report
30
+ - enroll global and project Codex and Claude skill directories as separate read-only inventory scopes
31
+ - create a dry-run-only work/team bootstrap plan from explicit approved roots and skill selectors
28
32
 
29
33
  CLI tokens should be stored in the platform secret store where possible.
30
34
 
31
35
  ## Current Slice
32
36
 
37
+ This document describes the `0.1.0-beta.20` source candidate, including resumable browser login, named
38
+ CLI configuration profiles and global/project inventory scopes. Source,
39
+ GitHub releases, npm publication, and hosted deployment are separate states;
40
+ see [release verification](../../docs/RELEASE.md) for their checks. Historical
41
+ [beta.7 delivery evidence](../../docs/BETA7_RELEASE_DELIVERY.md) records that
42
+ release only. The API and web expose their deployed version and commit at
43
+ `/version.json`.
44
+
45
+ ### Beta.3 breaking security changes
46
+
47
+ Beta.3 tightens the API boundary for team and sharing mutations. Team
48
+ creation, team-owner invitation/member lifecycle changes, and
49
+ sharing expansions to team or organization scope require an interactive
50
+ MFA-verified session. Privileged sharing reads/writes and the deprecated
51
+ `skills edit --visibility` alias use the same session/MFA boundary. API tokens
52
+ remain useful for scoped reads, but they cannot perform these mutations.
53
+
54
+ Migration before upgrading to beta.3: enroll TOTP through the API's
55
+ `POST /v1/auth/mfa/totp/enroll` and `POST /v1/auth/mfa/totp/confirm` routes
56
+ with password reauthentication, save the one-time recovery codes, then run
57
+ `myskills login` and complete the `POST /v1/auth/mfa/verify` challenge. Move
58
+ mutation automation to an explicitly managed session; keep API-token
59
+ automation read-only. Invitation acceptance remains session-only where the API
60
+ route permits it.
61
+
62
+ For install guidance, use the generated `myskills install ...` or
63
+ `myskills export ... --output ...` command. The corresponding MCP tool no longer
64
+ returns `apiBundleEndpoint` or a bundle URL, so clients must not construct one;
65
+ the CLI's authenticated export/install path remains the replacement flow.
66
+ Generated commands do not embed an API URL or bearer token; configure the CLI
67
+ with `myskills config set api-url ...` or `MYSKILLS_API_URL`, then authenticate
68
+ separately.
69
+
33
70
  Implemented commands:
34
71
 
35
72
  ```text
36
73
  myskills version
37
74
  myskills --version
75
+ myskills init <name> [--output <dir>] [--title <text>] [--summary <text>] [--license <text>] [--json]
38
76
  myskills validate --path <file-directory-or-zip>
39
77
  myskills scan --path <file-directory-or-zip>
40
- myskills search [query] [--api-url <url>]
41
- myskills info <skill-slug> [--api-url <url>]
42
- myskills login [--api-url <url>] [--method <password|api-key>] [--email <email>]
78
+ myskills package --path <directory> --output <file.zip> [--json]
79
+ myskills search [query] [--limit <1-100>] [--cursor <cursor>] [--api-url <url>]
80
+ myskills info <skill-slug> [--version <exact-version>] [--api-url <url>]
81
+ myskills login [--api-url <url>] [--method <password|api-key|browser>] [--email <email>]
82
+ myskills login --method browser [--api-url <url>] [--scopes <comma-separated-scopes>] [--no-resume]
43
83
  myskills login --api-key [--api-url <url>]
44
84
  myskills logout [--api-url <url>] [--token <token>]
45
85
  myskills whoami [--api-url <url>] [--token <token>]
@@ -49,13 +89,14 @@ myskills config get api-url
49
89
  myskills config set api-url <url>
50
90
  myskills config reset api-url
51
91
  myskills config list
92
+ myskills bootstrap codex --dry-run --profile work --context <file> [--work-source-root <dir>] [--shared-source-root <dir>] --live-root <dir> --include-slug <slug> [--include-slug <slug>] --output <report.json>
52
93
  myskills submit --path <file-directory-or-zip> [--api-url <url>] [--token <token>]
53
- myskills review submissions [--api-url <url>] [--token <token>]
94
+ myskills review submissions [--limit <1-100>] [--cursor <cursor>] [--api-url <url>] [--token <token>]
54
95
  myskills review bundle <submission-id> [--platform <name>] [--output <file>] [--api-url <url>] [--token <token>]
55
96
  myskills review action <submission-id> --action <approve|request-changes|reject|publish> [--artifact-sha256 <hash>] [--reason <text>] [--api-url <url>] [--token <token>]
56
97
  myskills submissions list [--api-url <url>] [--token <token>]
57
98
  myskills submissions withdraw <submission-id> [--reason <text>] [--api-url <url>] [--token <token>]
58
- myskills skills edit <skill-slug> [--title <text>] [--summary <text>] [--visibility <scope>] [--tag <tag>] [--reason <text>] [--api-url <url>] [--token <token>]
99
+ myskills skills edit <skill-slug> [--title <text>] [--summary <text>] [--tag <tag>] [--visibility <scope>] [--reason <text>] [--api-url <url>] [--token <token>] (deprecated visibility compatibility alias; use sharing set)
59
100
  myskills skills archive|restore|delete <skill-slug> [--reason <text>] [--api-url <url>] [--token <token>]
60
101
  myskills releases list <skill-slug> [--api-url <url>] [--token <token>]
61
102
  myskills releases deprecate|unpublish|revoke|restore|delete <skill-slug>@<version> [--reason <text>] [--replacement <version>] [--api-url <url>] [--token <token>]
@@ -64,46 +105,517 @@ myskills teams create <team-name> [--name <team-name>] [--api-url <url>] [--toke
64
105
  myskills teams invite <team-id> --email <email> [--api-url <url>] [--token <token>]
65
106
  myskills teams accept <invitation-id> [--api-url <url>] [--token <token>]
66
107
  myskills sharing get <skill-slug> [--api-url <url>] [--token <token>]
67
- myskills sharing set <skill-slug> --visibility <scope> [--team <team-id>] [--user <email>]
108
+ myskills sharing set <skill-slug> --visibility <scope> [--team <team-id>] [--user <email>] [--organization <organization-id>] [--organization-id <organization-id>] [--clear-organizations]
109
+ myskills architectures patterns [--api-url <url>] [--token <token>]
110
+ myskills architectures list [--api-url <url>] [--token <token>]
111
+ myskills architectures show <architecture-id> [--revision <revision-id>] [--api-url <url>] [--token <token>]
112
+ myskills architectures preview|compile <architecture-id> [--revision <revision-id>] [--profile <profile-id>] [--environment <environment-id>] [--organization-id <organization-id>|--organization <organization-id>] [--api-url <url>] [--token <token>]
113
+ myskills architectures plan|dry-run <architecture-id> --observed <fixture.json> [--revision <revision-id>] [--profile <profile-id>] [--environment <environment-id>] [--organization-id <organization-id>|--organization <organization-id>] [--api-url <url>] [--token <token>]
114
+ myskills architectures observe --root <absolute-dir> --profile <personal|work|shared> (--context <file> | --target-id <id> --generation <number> --architecture-id <id> --environment-id <id> --profile-id <id> --adapter-digest <sha256> --capabilities-digest <sha256>) [--json]
115
+ myskills architectures health --root <absolute-dir> --profile <personal|work|shared> (--context <file> | --target-id <id> --generation <number> --architecture-id <id> --environment-id <id> --profile-id <id> --adapter-digest <sha256> --capabilities-digest <sha256>) [--json]
68
116
  myskills admin sharing get [--api-url <url>] [--token <token>]
69
- myskills admin sharing set [--public <true|false>] [--authenticated <true|false>] [--teams <true|false>] [--team-visibility <true|false>] [--user-visibility <true|false>]
117
+ myskills admin sharing set [--public <true|false>] [--authenticated <true|false>] [--teams <true|false>] [--team-visibility <true|false>] [--user-visibility <true|false>] [--organization-visibility <true|false>]
70
118
  myskills export <skill-slug> --version <version> --platform <platform> --output <dir>
71
119
  myskills install <skill-slug> [--version <version>] [--platform <platform>] [--dir <install-root>]
72
120
  myskills list [--dir <install-root>]
73
121
  myskills update [skill-slug] [--version <version>] [--platform <platform>] [--dir <install-root>]
74
122
  myskills rollback <skill-slug> [--dir <install-root>]
123
+ myskills codex enroll --workspace <absolute-dir> --architecture-id <id> --environment-id <id> --profile-id <id> [--name <name>]
124
+ myskills codex observe --workspace <absolute-dir> [--upload] [--json]
125
+ myskills scopes inventory --provider codex|claude --root <absolute-skills-dir> [--json]
126
+ myskills scopes enroll --provider codex|claude --scope global --root <absolute-skills-dir> --architecture-id <id> --environment-id <id> --profile-id <id> [--name <name>]
127
+ myskills scopes enroll --provider codex|claude --scope project --project <absolute-dir> --architecture-id <id> --environment-id <id> --profile-id <id> [--name <name>]
128
+ myskills scopes observe --provider codex|claude --scope global|project [--project <absolute-dir>] [--upload] [--json]
129
+ myskills scopes list [--provider codex|claude]
130
+ myskills scopes resolve --provider codex|claude --path <absolute-dir>
131
+ myskills scopes exclude|include --provider codex|claude --project <absolute-dir>
132
+ myskills scopes unbind --provider codex|claude --scope global|project [--project <absolute-dir>]
133
+ myskills scopes migrate plan|apply --provider codex|claude --project <absolute-dir> [--plan-digest <sha256>]
134
+ myskills install <skill-slug> --version <version> --workspace <absolute-dir>
135
+ myskills update [skill-slug] [--version <version>] --workspace <absolute-dir>
136
+ myskills rollback <skill-slug> --workspace <absolute-dir>
137
+ myskills companion run-once --workspace <absolute-dir> --holder <name>
75
138
  myskills token create --name <name> --scope <scope> [--scope <scope>]
76
139
  myskills token list
77
140
  myskills token revoke <token-id>
78
141
  ```
79
142
 
80
- ## Published And Candidate Channels
143
+ ### Registry and collaboration workflows
144
+
145
+ The commands below describe the current repository source. Consult the
146
+ [capabilities matrix](../../docs/CAPABILITY_PARITY.md) for coverage and
147
+ verification status; an implemented command does not establish npm publication
148
+ or hosted deployment. All these commands accept `--api-url`, `--token` and
149
+ `--json`. The API enforces current roles, ownership, membership and MFA.
150
+ Use `myskills login` with password/MFA for session-only operations; an API key
151
+ does not replace the required session or MFA verification.
152
+
153
+ ```text
154
+ myskills skills managed [--query <text>] [--limit <1-100>] [--cursor <cursor>]
155
+ myskills submissions show <submission-id>
156
+ myskills submissions export <submission-id> [--platform <name>] [--output <new-file>]
157
+ myskills review show <submission-id>
158
+ myskills teams revoke-invitation <team-id> <invitation-id>
159
+ myskills teams set-role <team-id> <member-id> --role <owner|member>
160
+ myskills teams remove-member <team-id> <member-id>
161
+ myskills organizations list|pending-invitations
162
+ myskills organizations show|members|invitations|policies|teams|update-policy <organization-id>
163
+ myskills organizations create <name> [--slug <slug>]
164
+ myskills organizations create --input <request.json>
165
+ myskills organizations archive <organization-id>
166
+ myskills organizations invite <organization-id> --email <email> [--role <owner|admin|member>]
167
+ myskills organizations accept <invitation-id>
168
+ myskills organizations set-role <organization-id> <member-id> --role <owner|admin|member>
169
+ myskills organizations remove-member <organization-id> <member-id>
170
+ myskills organizations append-policy|set-update-policy <organization-id> --input <request.json>
171
+ myskills organizations activate-policy <organization-id> <revision-id>
172
+ myskills organizations create-team <organization-id> <name> [--slug <slug>]
173
+ myskills organizations create-team <organization-id> --input <request.json>
174
+ myskills organizations adopt-team <organization-id> <team-id>
175
+ ```
176
+
177
+ `submissions show` and `submissions export` inspect the author's submission;
178
+ `review show` uses the review permission boundary. An export prints the JSON
179
+ bundle unless `--output` selects a new file. Its parent directory must exist,
180
+ and an existing destination is never overwritten.
181
+
182
+ `search`, `skills managed` and `review submissions` return one page at a time.
183
+ Use the response's `nextCursor` with `--cursor` and retain the same query and
184
+ filters. `--json` preserves the response and pagination metadata. Inspect an
185
+ exact release with `myskills info <slug> --version <version>`; the version must
186
+ be a semantic version such as `1.2.3`, and the response is JSON release metadata.
187
+
188
+ ### Local package authoring
189
+
190
+ `myskills init <name>` creates a minimal private Codex package in a new
191
+ directory. The default output is `./<name>`; use `--output` to select another
192
+ destination under an existing parent directory. The command writes `skill.json` and `SKILL.md` with
193
+ version `0.1.0`, `UNLICENSED`, and the `codex-skill` platform target. It does
194
+ not authenticate, call the network, or overwrite an existing file, directory,
195
+ or symlink. Edit the generated `SKILL.md`, then run `myskills validate --path`
196
+ and `myskills scan --path` before any separate authenticated submission.
197
+
198
+ `myskills package --path ./my-skill --output ./my-skill.zip` creates a
199
+ deterministic ZIP from one checked snapshot of a local package directory.
200
+ It validates the root manifest, portable paths, and bounded UTF-8 text, then
201
+ blocks credential and other blocking scan findings before creating output.
202
+ Warnings remain visible for review. The output reports the archive SHA-256,
203
+ byte size, and a separate `myskills submit --path ...` command. `--json` returns
204
+ the manifest, scan findings, output path, checksum, size, and next command.
205
+ Packaging does not contact the registry or bypass submission and review.
206
+
207
+ The output must end in `.zip` and have an existing parent directory outside
208
+ the source tree. Existing files, directories, symlinks, and symlink ancestors
209
+ are refused. All regular source files are included; there is no ignore file.
210
+ Keep credentials and unrelated files outside the source directory. The package
211
+ limits are 500 files, 1 MiB of text, 1,000 filesystem entries, and a 10 MiB
212
+ archive. Binary files,
213
+ symlinks, and special files are rejected. Text bytes, including BOMs and line
214
+ endings, are preserved. Entries use ordinal UTF-8 path order, fixed timestamps
215
+ and permissions, and uncompressed ZIP storage, so source mtimes and locale do
216
+ not change the archive checksum. Empty directories and executable bits are not
217
+ preserved. The archive checksum identifies the ZIP bytes, not the registry's
218
+ package-content digest.
219
+
220
+ Local authoring requires macOS or Linux. The archive is created with private
221
+ file permissions and exclusive creation; it never overwrites a destination
222
+ that appears during the command. A disk or write failure can leave a partial
223
+ output, which the error asks you to inspect before removal. Work in directories
224
+ owned by your user; this does not isolate writes from a hostile process running
225
+ as the same operating-system user.
226
+
227
+ The API-backed architecture preview includes the compiled graph, escaped
228
+ Mermaid, and a versioned diagram artifact with a plain-text accessible outline.
229
+ Use `--json` when a caller needs the complete JSON/Mermaid/outline projection;
230
+ the human-readable preview prints the bounded topology summary and Mermaid.
231
+ The browser workbench additionally offers derived JSON and Mermaid downloads.
232
+
233
+ ### Local Codex observation
234
+
235
+ `architectures observe` and `architectures health` run the Codex adapter locally
236
+ against an explicitly supplied absolute root. The profile must be selected
237
+ explicitly as `personal`, `work`, or `shared`. Supply either `--context` with a
238
+ JSON object containing exactly `targetId`, `targetGeneration`,
239
+ `architectureId`, `environmentId`, `profileId`, `adapterDigest`, and
240
+ `capabilitiesDigest`, or pass those seven values through their corresponding
241
+ flags.
242
+
243
+ The command reads only bounded, allowlisted metadata and safe skill
244
+ frontmatter. It does not search home directories, follow profile pointers,
245
+ read prompt or skill bodies, emit local paths, retain credentials, call the
246
+ network, upload observations, or modify a target. Review the JSON output before
247
+ any separately authorized/manual upload to an API observation route. No live
248
+ apply, rollback, installation, or other target mutation is available through
249
+ this command.
250
+
251
+ ### Fixture-only sync and recovery
252
+
253
+ `architectures plan` and `architectures dry-run` accept a bounded observed
254
+ fixture and return a dry-run plan. The fixture is not an implicit target and
255
+ the command does not apply changes. General architecture graph execution remains
256
+ fixture-only, even though its API persistence and recovery/rollback evidence
257
+ can be stored in Postgres. The separate Codex workspace and managed skill
258
+ operation commands below support one explicit filesystem installation path.
259
+ Each bounded architecture fixture run allows at most 500 steps and 2,004 append-only
260
+ receipts: a 1,002-receipt max-step lifecycle, one full apply/verify retry, and
261
+ two recovery/terminal receipts. Further retries require a new bounded run.
262
+
263
+ ### Architecture and target management
264
+
265
+ Create architectures, append revisions, manage organization grants and derive
266
+ another architecture pattern through the API:
267
+
268
+ ```text
269
+ myskills architectures create --input <request.json>
270
+ myskills architectures revisions|grants <architecture-id>
271
+ myskills architectures revise|draft-preview|set-grants|migration-preview|migrate <architecture-id> --input <request.json>
272
+ myskills targets list
273
+ myskills targets show|updates|operations|update-policy|revoke <target-id>
274
+ myskills targets observations <target-id> [--limit <positive-integer>]
275
+ myskills targets register --input <request.json>
276
+ myskills targets consent|observe|health|schedule|set-update-policy <target-id> --input <request.json>
277
+ myskills operations show|cancel <operation-id>
278
+ myskills operations batch --input <request.json>
279
+ ```
280
+
281
+ Review each JSON request file before passing it to `--input`. These commands
282
+ use the API body schema and retain its revision, artifact and idempotency
283
+ fields. For example, a consent file contains `{"decision":"grant"}` or
284
+ `{"decision":"deny"}`. A scheduled update contains `action`, `slug`, an exact
285
+ `version`, optional `platform`, and a caller-chosen `idempotencyKey`. Batch
286
+ requests wrap rows in `operations`, with each row also containing `targetId`.
287
+
288
+ Use `draft-preview` before `revise` and `migration-preview` before `migrate`.
289
+ Supply the inspected `expectedCurrentRevisionId` when editing or migrating;
290
+ target upgrade policies use `expectedRevisionNumber`. Organization policy and
291
+ grant writes likewise retain the API's required revision fields. On a conflict,
292
+ read the current state and review the change again. Retrying the same migration
293
+ or scheduled operation must retain the same idempotency key and request body.
294
+ The CLI does not generate a replacement key or refresh revision fields for you.
295
+
296
+ Target management uses a login session, and protected writes require MFA.
297
+ `targets observe` uploads the supplied observation; `architectures observe`
298
+ generates local metadata as described above. Scheduling returns an operation
299
+ for the enrolled companion to execute. Read its state and receipt with
300
+ `operations show`; a queued operation is not proof that files changed.
301
+
302
+ ## Published CLI And Local Builds
81
303
 
82
- The currently published package remains available under npm's `alpha` tag:
304
+ The published beta channel is installed with:
83
305
 
84
306
  ```bash
85
- npm install -g @jarel/myskills@alpha
307
+ npm install -g @jarel/myskills@beta
86
308
  myskills --version
87
309
  myskills login
88
310
  ```
89
311
 
90
- Update the CLI with:
312
+ The npm `beta` tag selects the published prerelease. It can differ from this
313
+ source candidate and the deployed API/web revision. To test source changes
314
+ before npm publication, build and run them locally:
91
315
 
92
316
  ```bash
93
- npm install -g @jarel/myskills@alpha
317
+ npm ci
318
+ npm run build
319
+ node apps/cli/dist/index.js --version
320
+ node apps/cli/dist/index.js login
321
+ npm pack -w @jarel/myskills
94
322
  ```
95
323
 
96
- The `0.1.0-beta.2` source manifest is configured for the `beta` dist-tag, but package publication is a separate maintainer approval step. The release-verification workflow packs and installs the candidate without publishing it.
324
+ Use the resulting tarball for a fresh isolated installation, or run the bundle
325
+ directly. The release gate verifies the packed executable and Apache license.
326
+ Public npm publication is a separate release step.
97
327
 
98
328
  `validate`, `scan`, and `submit` accept a manifest file, package directory, or local `.zip` package. `login` prompts for the API URL when one is not supplied; the default is the local API at `http://localhost:3001`, and custom hosted URLs can be entered manually. Successful login stores the selected API URL in local CLI config so later commands can omit `--api-url`. API URL resolution is `--api-url`, then `MYSKILLS_API_URL`, then saved config, then `http://localhost:3001`.
99
329
 
100
- `login` supports an email/password session flow and an API-key flow. The email/password flow handles MFA challenges with a TOTP or recovery code prompt and stores only the verified session token. The API-key flow validates the key with `/v1/me` before storing it. Token resolution is `--token`, then `MYSKILLS_TOKEN`, then the stored login token. The default token store uses the platform credential store through `@napi-rs/keyring` and falls back to `tokens.json` with user-only file permissions when keyring storage is unavailable or `MYSKILLS_TOKEN_STORE=file`/`MYSKILLS_TOKEN_FILE` is set. `auth status` validates the current token without printing it. `logout` revokes stored session tokens and clears the local entry; stored API tokens are removed locally and must be revoked with `token revoke`.
330
+ `login` supports email/password, API-key and browser/device flows. Password
331
+ login handles MFA challenges and stores the verified session token. API-key
332
+ login validates the key with `/v1/me`. Token resolution is `--token`, then
333
+ `MYSKILLS_TOKEN`, then the stored token. The default store uses the platform
334
+ credential store through `@napi-rs/keyring`. Credential-store failures are
335
+ reported; a failed write does not silently store the credential in a file.
336
+ An existing legacy file credential can be read when the keyring entry is
337
+ confirmed absent. Explicit `MYSKILLS_TOKEN_STORE=file` or `MYSKILLS_TOKEN_FILE`
338
+ selects file storage with user-only permissions. A successful keyring write
339
+ clears the obsolete file entry.
340
+
341
+ `login --method browser` displays the consent URL, user code and deadline. Repeat
342
+ the command with the same API URL, configuration profile and `--scopes` choice to
343
+ resume after an interruption, including after browser approval. The pending
344
+ device secret stays in a separate OS keyring entry; it never enters config,
345
+ token files or terminal output. A process lock serializes polling and logout
346
+ for that API/profile. Its nonsecret owner metadata lives under the actual OS
347
+ account home, independent of `HOME` and configuration-directory overrides.
348
+ Only confirmed dead owners are reclaimed; ambiguous locks require operator
349
+ recovery. Denial, expiry during polling, redemption and logout clear the pending
350
+ entry. After process loss, expired keyring state is removed on the next login
351
+ or logout for that API/profile; there is no background cleanup process. Logout
352
+ discards a pending-only login locally; it does not cancel consent on the API.
353
+
354
+ Resume keeps the original server expiry and a conservative deadline measured
355
+ before the start request. Polling honors the saved interval, including
356
+ `slow_down`, and bounds each request to the remaining deadline. It never renews
357
+ consent, widens scopes, extends MFA assurance or changes token lifetime.
358
+ Changing `--scopes` while a login is pending requires logout first.
359
+
360
+ Keyring access is required for automatic resume even when final token storage
361
+ was explicitly set to a file. A host without keyring access, including many
362
+ cloud runners, can explicitly choose `--no-resume` for an in-memory request.
363
+ That option cannot replace a readable existing pending login: logout first.
364
+ If keyring access is unavailable, the CLI warns that old pending state could
365
+ not be checked; restore access and run logout before using resume again.
366
+ There is no plaintext fallback for pending state.
367
+
368
+ Expiry, interruption, denial, token-save failure and config-save failure have
369
+ distinct JSON error codes. If the server redeemed approval but the response was
370
+ lost, or credential saving was not confirmed, the one-time code cannot recover
371
+ the token. Check `auth status` with the same API/profile and, when needed,
372
+ revoke the CLI browser login token in account settings before starting again.
373
+ A config-save failure explicitly reports that the credential was saved; pass
374
+ `--api-url` until the configuration store is repaired. Cleanup failures remain
375
+ visible, and keyring-unavailable logout still attempts the selected credential's
376
+ normal local deletion or remote session revocation.
377
+
378
+ `auth status` validates the token without printing it. `logout` revokes stored
379
+ sessions and clears local credentials. If a malformed keyring entry prevents
380
+ revocation, logout attempts local deletion and reports that remote revocation
381
+ is unconfirmed. It reports deletion failures. Stored API tokens are removed
382
+ locally and must be revoked with `token revoke`. Malformed file-store JSON
383
+ requires repair or removal of that file; other stored accounts are not silently
384
+ discarded.
101
385
 
102
386
  `config get api-url`, `config set api-url <url>`, `config reset api-url`, and `config list` manage the saved API URL. `doctor` checks the CLI version, Node version, resolved API URL, `/health`, auth status, token-store backend, install-directory writability, and `/v1/capabilities`. If the CLI is pointed at the web app instead of the API, or a newer command is sent to an older server, command errors include concrete next steps and `--json` returns structured error codes.
103
387
 
104
- `submit` validates and scans locally before sending package directories as normalized text entries or `.zip` packages as base64 archive uploads for server-side extraction. Authors can inspect their submitted versions with `submissions list` and withdraw unreviewed or changes-requested submissions with `submissions withdraw`. Maintainers can fetch the reviewed artifact and approval hash with `review bundle`, then approve, request changes, reject, and publish submitted versions through `review action`.
388
+ ### Older workspace scope identities
389
+
390
+ Scope state now records both device and inode. Existing inode-only state stays
391
+ readable, but observation and ordinary re-enrollment stop with
392
+ `SCOPE_ROOT_IDENTITY_LEGACY`. After confirming the same directory, repeat its
393
+ original `scopes enroll` command with `--accept-current-root` and the original
394
+ configuration profile. The command verifies the account, registry, architecture,
395
+ and existing target, then backs up local state and updates only the root identity.
396
+ It does not register targets, grant consent, or upload inventory. Pending
397
+ enrollments retain their recovery identity and can resume with normal enrollment
398
+ after acknowledgment. A repeated acknowledgment is a no-op; it cannot override
399
+ a known device/inode mismatch. Device and inode do not detect every same-device
400
+ inode reuse. See [scope identity migration](../../docs/WORKSPACE_SCOPES.md#upgrade-an-inode-only-scope-identity)
401
+ for the exact upgrade and recovery behavior.
402
+
403
+ ### Separate work and personal configuration
404
+
405
+ Every command accepts `--config-profile <name>` before or after the command.
406
+ It overrides `MYSKILLS_CONFIG_PROFILE`. Names contain 1–64 lowercase letters,
407
+ digits, hyphens or underscores and start with a letter or digit. For example:
408
+
409
+ ```bash
410
+ myskills config set api-url https://work-registry.example/api --config-profile work
411
+ myskills login --config-profile work
412
+ myskills whoami --config-profile work
413
+ myskills scopes list --config-profile work
414
+ myskills config list --config-profile work --json
415
+ ```
416
+
417
+ There is no create or persistent select command. Writes create the selected
418
+ profile's state as needed; keep the flag on each command or set
419
+ `MYSKILLS_CONFIG_PROFILE` in that shell. `help`, `config list`, and `doctor`
420
+ show the selected configuration. JSON uses `configProfile: null` for the
421
+ legacy default. This selector is separate from architecture `--profile-id`
422
+ and provider inspection `--profile`.
423
+
424
+ Without a selector, existing config, credentials, and scope bindings remain at
425
+ their current locations. A named `personal` profile starts empty; it does not
426
+ copy or migrate the default. Each named profile has independent saved API URL,
427
+ credentials, and scope state, including for different accounts at one API URL.
428
+ A missing credential never falls back to another profile or the default.
429
+
430
+ The base directory is `MYSKILLS_CONFIG_DIR`, then
431
+ `$XDG_CONFIG_HOME/myskills-app`, then `~/.config/myskills-app`. Named state lives
432
+ under `<base>/profiles/<name>/` (`config.json`, optional `tokens.json`, and
433
+ `scopes/`). OS credential keys include the canonical profile directory and API
434
+ URL. Aliases for the base directory are supported; linked profile directories
435
+ are rejected so they cannot share another profile’s files. Changing the base
436
+ directory selects separate credentials. Named profiles
437
+ reject `MYSKILLS_CONFIG_FILE` and `MYSKILLS_TOKEN_FILE`; these retain their
438
+ existing precedence when no profile is selected. `MYSKILLS_TOKEN_STORE=file`
439
+ remains available for profile-local file storage.
440
+
441
+ Managed workspace overlap checks use one protected index under the actual OS
442
+ account home at `.config/myskills-app/workspace-enrollments`. `HOME`,
443
+ `XDG_CONFIG_HOME`, registry URLs and configuration profiles cannot split this
444
+ authority. The selected older XDG/home index is read for reservation migration;
445
+ its files are preserved. This coordinates normal CLI processes. Preserve the
446
+ index and workspace bindings when a conflicting root requires explicit recovery.
447
+
448
+ Explicit API and token overrides still apply: `--api-url` then
449
+ `MYSKILLS_API_URL` override the saved registry, and `--token` then
450
+ `MYSKILLS_TOKEN` override the stored credential. Clear inherited overrides when
451
+ you want the profile's saved registry/account. `auth status` reports the token
452
+ source without printing its value. Selection does not move skill directories,
453
+ change native provider profiles, or unbind existing targets.
454
+
455
+ `bootstrap codex --dry-run` is a work/team-only local planner. It requires an
456
+ explicit `work` context, a normalized HTTPS target origin, stable target
457
+ instance/workspace/actor identifiers, explicit source and target trust
458
+ compartments (`work`, `shared`, or `work+shared` for sources, and `work-team`
459
+ for the target), typed `work` and/or `shared` source roots, a target root, and
460
+ a positive `--include-slug` allowlist. The context must approve the computed
461
+ source-root type/digests and target-root digest. Personal, consumer, public,
462
+ and unclassified sources are rejected, and candidates are never selected by
463
+ implicit inventory discovery. A plan accepts at most eight selected candidates;
464
+ each candidate snapshot accepts at most 1,000 entries and 32 nested directory
465
+ levels. A one-skill work-owned canary is supported.
466
+
467
+ The context JSON must include `profile: "work"`, `targetOrigin`,
468
+ `instanceId`, one `tenantId` or `workspaceId`, `actorId`, the canonical trust
469
+ compartments, `approvedSourceRoots` entries of `{type, identityDigest}`, and
470
+ `approvedTargetRootIdentityDigest`.
471
+
472
+ The planner reads selected source and target content without network or
473
+ registry access. It opens each selected tree through a bootstrap-owned secure
474
+ snapshot reader, then hashes, parses, scans, and reports only those held bytes.
475
+ It writes only the explicitly requested new private report (`0600`) under a
476
+ user-controlled private parent. Reserved package manifests remain strict:
477
+ invalid or multiple manifests fail closed, and no metadata is relocated. The
478
+ full report contains the work binding, approved root digests, owning package
479
+ contract identifiers, candidate content identities, execution identities, the
480
+ exact target precondition (`absent` or `present-identical` with its expected
481
+ artifact identity), and private snapshots. Terminal output is a redacted DTO
482
+ with counts and digests; it does not contain paths, candidate names, inventory,
483
+ or private identifiers.
484
+ There is no apply, publishing, adoption, or target-write mode in this command.
485
+ `ready` means that the held snapshot passed deterministic checks only. It is
486
+ not approval to apply. Sensitive configuration and credential paths are
487
+ excluded before content enters the report, and heuristic scan-clean never
488
+ replaces explicit human content review. Any future executor must repeat the
489
+ retained source/target identity check immediately before its first write
490
+ (compare-and-swap) and require that review at that boundary.
491
+
492
+ `validate`, `scan`, and `submit` read one bounded snapshot of the local package.
493
+ `submit` sends those same validated and scanned text entries for directory and
494
+ ZIP inputs. Authors can inspect and withdraw submissions; maintainers fetch the
495
+ reviewed artifact and approval hash before approving, requesting changes,
496
+ rejecting, or publishing it. The browser shows review reasons and scan findings.
497
+ Corrections create another immutable version.
498
+
499
+ Published artifacts remain immutable. `skills edit` changes metadata;
500
+ `releases deprecate`, `unpublish`, `revoke`, `restore`, and `delete` change
501
+ server-owned lifecycle state. Deprecated releases remain installable. Hidden,
502
+ revoked, archived, or deleted releases cannot be installed or exported.
503
+ `export` verifies artifact size and SHA-256 before writing normalized paths.
504
+
505
+ `install`, `update`, and `rollback` share an exclusive install-root lock and
506
+ verify package bytes and current eligibility before promotion. Updates retain
507
+ a verified rollback snapshot. Interrupted transactions preserve unknown or
508
+ edited local bytes for investigation. Each installation binds the API origin
509
+ and registry instance ID. Legacy records without that identity are not adopted
510
+ automatically: keep their files as a backup, review the source, and install into
511
+ a new root. A registry change requires a separate root.
512
+
513
+ New installation and snapshot records declare
514
+ `contentDigestAlgorithm: "sha256-json-ordinal-v1"`; transaction journals use
515
+ `targetContentDigestAlgorithm` for the candidate. This scheme normalizes paths,
516
+ sorts them by JavaScript string ordinal order (UTF-16 code units), then hashes
517
+ the UTF-8 JSON array of `{path, content}` entries with SHA-256. It does not
518
+ depend on the process locale. Readers reject unknown algorithm identifiers.
105
519
 
106
- Published artifacts remain immutable. `skills edit` changes mutable skill metadata only, while `releases deprecate`, `releases unpublish`, `releases revoke`, `releases restore`, and `releases delete` update server-owned lifecycle state for a specific version. Deprecated releases remain visible and installable; unpublished, revoked, archived, and deleted releases are hidden from install/export queries. `export` downloads server-authorized bundle content, verifies byte size and SHA-256 against release metadata, and writes normalized package paths under the requested output directory. `install` uses the same verified bundle path, writes into `--dir`, `MYSKILLS_INSTALL_DIR`, or the user data directory, and records local state in `.myskills-app/installed.json`; `update` preserves a rollback snapshot before replacing files, and `rollback` restores the most recent snapshot. `token create` prints the plaintext API token only once and does not overwrite the stored login session. Browser/device login, platform-specific install adapters, and archive creation are still planned.
520
+ A missing algorithm field identifies the legacy `localeCompare` scheme.
521
+ The CLI verifies these records with the current process's legacy comparison
522
+ rules. It does not retry with a different algorithm. If a locale change makes
523
+ legacy bytes unverifiable, return to the original verification locale and
524
+ compatible Node/ICU environment before a trusted migration. Preserve the files
525
+ and recovery copies if their identity still cannot be proved. Never add an
526
+ algorithm field to an old hash by hand. After verification, an install or
527
+ update records the held bytes with an ordinal digest in the new journal and
528
+ snapshot; rollback does the same for its verified source snapshot. Untouched
529
+ legacy history and journals retain their original verification rules.
530
+
531
+ Local package intake, install, export, and rollback support macOS and Linux.
532
+ No-follow payload reads and writes, private staging directories, and drift
533
+ checks protect these operations. They do not isolate the workspace from a
534
+ hostile process already running as the same OS user. Other operating systems
535
+ can use the API's portable buffer upload path; native Windows filesystem
536
+ installation is unsupported.
537
+
538
+ ### Personal Codex workspace
539
+
540
+ Create a personal architecture in the browser and note its architecture,
541
+ environment, and profile IDs. Enable MFA and sign in with a password session.
542
+ Enroll an existing absolute workspace directory using the command above.
543
+ Enrollment creates a user-owned target, grants consent, and stores a local
544
+ binding. A fresh workspace cannot attach to an existing target ID; that option
545
+ only confirms or resumes its existing local binding.
546
+
547
+ Use `--workspace` for all managed writes. Skills are installed under
548
+ `.agents/skills`, and records stay under `.myskills-app` in that workspace.
549
+ The CLI checks Codex compatibility and valid `SKILL.md` YAML frontmatter with a
550
+ matching name and text description. `--dir` cannot bypass an enrolled workspace's
551
+ binding. Team-shared skills can be installed when your account can read them;
552
+ team-owned execution targets are outside this adapter's beta scope.
553
+
554
+ ### Global and project skill inventories (workspace scopes)
555
+
556
+ `myskills scopes` enrolls a provider's user-level skills directory, or a
557
+ project, as a personal read-only inventory target: `codex-inventory` for Codex
558
+ and `claude-inventory` for Claude. Pass each directory explicitly; the CLI does
559
+ not search your home directory. Run `scopes inventory` first to review locally
560
+ what an upload would contain. Uploads carry skill slugs, counts, and
561
+ `SKILL.md` digests only. Absolute paths, exclusions, skill bodies, and names of
562
+ linked or invalid entries stay local.
563
+
564
+ Projects resolve to the provider's global scope unless you exclude them or
565
+ enroll them separately. Resolution uses real paths and whole path segments, the
566
+ deepest rule wins, and an excluded project never falls back to the global
567
+ scope. Scopes are MySkills ownership only: they do not change how Codex or
568
+ Claude load or inherit skills, and they never write skill files. Existing
569
+ managed Codex workspace bindings can be adopted with a previewed
570
+ `scopes migrate plan` and `scopes migrate apply`. See
571
+ [Workspace Scopes](../../docs/WORKSPACE_SCOPES.md) for the rules, recovery
572
+ steps, and local state format.
573
+
574
+ `codex observe --upload` records verified filesystem state. Confirm separately
575
+ that Codex loaded the skill. To process one browser-queued update, supply a
576
+ separate token with `skills:read` and `targets:execute` through `MYSKILLS_TOKEN`
577
+ and run `companion run-once`. If the workspace has a skill installed with
578
+ `--library-entry`, the token also needs `libraries:read`: the companion rechecks
579
+ that adoption before it changes files. Without it, the operation fails with
580
+ `API_TOKEN_SCOPE_REQUIRED` and a message that names the scope; files are not
581
+ changed. The CLI never widens a token's scopes. This command checks current
582
+ authorization, consent, policy, lease, and exact release identity. It does not
583
+ start a background daemon.
584
+ Additional provider install adapters remain planned.
585
+
586
+ To change skill visibility, use the canonical `myskills sharing set
587
+ <skill-slug> --visibility <scope>` command. It accepts either
588
+ `--organization <organization-id>` or `--organization-id <organization-id>` for
589
+ the complete organization grant set. Omitting both organization options keeps
590
+ the beta.2 compatibility behavior and preserves already-issued organization
591
+ grants. Pass `--clear-organizations` to send `organizationIds: []` and revoke
592
+ the complete organization grant set; this flag is mutually exclusive with both
593
+ organization ID options.
594
+
595
+ `myskills skills edit --visibility <scope>` remains a deprecated beta.2
596
+ compatibility alias. It preserves omitted organization grants and does not
597
+ provide complete-set organization controls; use the canonical sharing command
598
+ to grant or clear organization access. Canonical sharing remains subject to
599
+ the API's session and MFA security rules; the beta.2 metadata alias is also
600
+ session-only and requires an MFA-verified session before it reads or replaces
601
+ grants. API tokens cannot widen a skill through the alias. Neither path
602
+ bypasses server policy. Organization policy and membership remain API-owned.
603
+ Do not treat a successful CLI command for another scope as evidence of
604
+ organization sharing.
605
+
606
+ Use `architectures grants` and `architectures set-grants --input <request.json>`
607
+ for the separate architecture organization-grant replacement workflow. Supply
608
+ the architecture ID and retain the current revision in the request body.
609
+ The read-only `architectures preview`, `compile`, `plan`, and `dry-run`
610
+ commands already accept `--organization-id <organization-id>` (with
611
+ `--organization <organization-id>` retained as an input alias). The server
612
+ authorizes that exact organization projection; it is a scope filter, not an
613
+ ownership shortcut.
614
+
615
+ The beta.2 compatibility shims remain available and are planned for removal only
616
+ at a later, separately published prerelease boundary that includes migration
617
+ guidance and release verification. The source release does not imply a hosted
618
+ deployment.
107
619
 
108
620
  Common scopes:
109
621
 
@@ -111,3 +623,196 @@ Common scopes:
111
623
  - `profile:read` for `whoami`.
112
624
  - `skills:submit` for author submissions.
113
625
  - `review:read` and `review:write` for maintainer review workflows.
626
+ - `architectures:read` for architecture list, detail, preview, and fixture-plan reads.
627
+ - `libraries:read` for library reads and for install, update, and companion runs of library-bound skills.
628
+ - `libraries:write` for library changes.
629
+
630
+ ## Account and instance administration
631
+
632
+ Account commands use the existing registration, session and MFA rules. Passwords,
633
+ emailed verification/reset tokens, invitation tokens and authenticator codes are
634
+ read from hidden prompts. New passwords require confirmation. These secrets are
635
+ not accepted as command options.
636
+
637
+ ```text
638
+ myskills account register --email <email> [--name <name>]
639
+ myskills account verify-email-request|password-reset-request --email <email>
640
+ myskills account verify-email|confirm-email-change
641
+ myskills account password-reset|change-password
642
+ myskills account change-email --email <new-email>
643
+ myskills account mfa-status
644
+ myskills account mfa-enroll --output <new-file> [--label <label>]
645
+ myskills account mfa-confirm <factor-id> --output <new-file>
646
+ myskills account mfa-disable
647
+ myskills connections info|list
648
+ myskills connections revoke <connection-id>
649
+ myskills instance info|health|ready|version|capabilities|branding|site
650
+ ```
651
+
652
+ `mfa-enroll` writes the authenticator setup secret to the new private JSON file
653
+ selected by `--output`; it prints the factor ID and output path without the
654
+ secret. Configure the authenticator, then use that factor ID with `mfa-confirm`.
655
+ Confirmation prompts for the current code and writes recovery codes to another
656
+ new private JSON file. Choose files in an existing directory outside the
657
+ repository; existing destinations are refused. Save the recovery codes securely,
658
+ then run `myskills login` and complete MFA to obtain a verified session.
659
+
660
+ Administration commands retain the API's owner/admin role, MFA and last-owner
661
+ safeguards. `admin users roles` replaces the user's role set with the repeated
662
+ `--role` values. `admin audit` returns one page and supports its `nextCursor`.
663
+
664
+ ```text
665
+ myskills admin branding get
666
+ myskills admin branding set --input <branding.json>
667
+ myskills admin site get
668
+ myskills admin site set --landing-page enabled|disabled
669
+ myskills admin registration get
670
+ myskills admin registration set --mode closed|request|open
671
+ myskills admin registration invite --email <email> [--name <name>]
672
+ myskills admin providers list
673
+ myskills admin providers set <provider-key> --input <provider.json>
674
+ myskills admin users list
675
+ myskills admin users action <user-id> --action approve|activate|disable|delete [--reason <text>]
676
+ myskills admin users roles <user-id> --role <owner|admin|maintainer|author|user> [--role <role>] [--reason <text>]
677
+ myskills admin tokens list
678
+ myskills admin tokens revoke <token-id>
679
+ myskills admin audit [--limit <1-100>] [--cursor <cursor>]
680
+ ```
681
+
682
+ Review branding and provider JSON bodies before passing `--input`. Provider
683
+ configuration accepts non-secret settings; configure provider credentials in the
684
+ deployment secret store. `connections` manages the signed-in user's remote MCP
685
+ connections. `instance` reads public instance information without credentials.
686
+
687
+ ## Libraries
688
+
689
+ `myskills libraries help` lists the source, import, review, tracking, subscription
690
+ and adoption commands. Requests use the [Libraries API contract](../../docs/plans/2026-09-26-library-api-contract.md)
691
+ and reviewed JSON files supplied with `--input`. The [Libraries guide](../../docs/LIBRARIES.md)
692
+ contains a complete workflow and scope requirements.
693
+
694
+ Filter library entries with
695
+ `myskills libraries entries <library-id> --kind source` (or `skill`). Filter
696
+ candidates with `myskills libraries candidates <entry-id> --state ready-for-review`;
697
+ other states are `blocked`, `accepted`, `ignored`, `superseded` and `expired`.
698
+ List reads accept `--limit <1-100>` and `--cursor <cursor>`; retain the filters
699
+ when continuing a page. Library deletion requires the current revision:
700
+ `myskills libraries remove <library-id> --revision <current-revision>`.
701
+
702
+ Collections and Groups organize existing skill entries in one Library. List with
703
+ `libraries collections <library-id>` or `libraries groups <library-id>`; inspect
704
+ with `libraries collection <collection-id>` or `libraries group <group-id>`.
705
+ `collection-members` and `group-members` list ordered entries with the same
706
+ `--limit` and `--cursor` pagination. Collection summaries include source tracking
707
+ health and authorized pending candidate counts.
708
+
709
+ Create with `libraries create-collection <library-id> --input reviewed.json`
710
+ or `libraries create-group <library-id> --input reviewed.json`. The JSON contains
711
+ `name`, optional `description`, `memberEntryIds` (up to 200 existing skill entry
712
+ IDs), and an optional `clientMutationId`. Preserve the mutation ID and payload
713
+ for retries. Edit with `edit-collection <collection-id>` or `edit-group <group-id>`
714
+ and `--input reviewed.json`; include `expectedRevision` from the latest read.
715
+ Supplying `memberEntryIds` replaces the complete ordered membership. An empty
716
+ array clears it; omitting the field preserves it. Use `remove-collection` or
717
+ `remove-group` with `--revision <current-revision>` to delete the organization
718
+ only. Library entries, source tracking, adoptions and installations remain intact.
719
+ Reads require `libraries:read`; changes require `libraries:write`, current
720
+ Library curation permission and MFA for team Libraries. Groups can overlap and
721
+ are independent of Collections.
722
+
723
+ Bind an installation to an adopted version with
724
+ `myskills install <slug> --library-entry <entry-id>`. If the adopted release
725
+ requires user action, read its notes and add `--accept-user-action`. Updates
726
+ resolve that exact recommendation and recheck it before changing files. A
727
+ deleted or inaccessible entry never falls back to the newest registry release.
728
+ Local drift still stops replacement. Use
729
+ `myskills libraries unbind-local <slug> --dir <root>` to detach that local
730
+ binding explicitly while retaining files and rollback history.
731
+
732
+ `updates` and `update` report each skill separately. If an entry is deleted,
733
+ access is lost, the adopted release is revoked, or the entry has no adoption,
734
+ that skill shows `curation-unavailable` with the reason (`library.state` and
735
+ `library.reason` in `--json`). Its files and binding stay unchanged, other skills
736
+ are still evaluated and updated, and `update` exits 1. `install` fails closed
737
+ with `LIBRARY_CURATION_UNAVAILABLE`. A malformed or mismatched resolution stops
738
+ the command with `LIBRARY_RESOLUTION_INVALID`.
739
+
740
+ If a library adopts a version older than the installed one, the skill shows
741
+ `library-adopts-older` (`adoption-older-than-installed` in `--json`). MySkills
742
+ never downgrades automatically. When the last rollback snapshot is exactly the
743
+ adopted release, run `myskills rollback <slug>`; otherwise install the adopted
744
+ version into a new root with `--dir <new-root>`. `libraries unbind-local` keeps
745
+ the installed version instead.
746
+
747
+ `libraries review-bundle <submission-id>` prints only after the SHA-256 of the
748
+ response body matches `x-myskills-artifact-sha256`. The JSON output labels its
749
+ `payload` as `parsed-for-inspection`. Use `--output <new-file>` to keep the
750
+ exact verified bytes; an existing file is never replaced. Supply
751
+ `--artifact-sha256 <digest-from-review-requests>` to also verify the immutable
752
+ artifact requested for review. Without it, verification covers the response
753
+ header only; `expectedDigestVerified` reports this distinction in JSON output.
754
+
755
+ ## Skill improvement
756
+
757
+ Prepare local skill reviews with `myskills improve`, inspect the report, export a draft, and submit it through normal review. Registry plans pin source/reviewer versions and apply user, team or organization policy. Execution requires the exact local plan digest and explicit cloud consent. See [the feature guide](../../docs/SKILL_IMPROVEMENT.md) for commands, JSON bodies, evaluation suites and current adapter limits. The first runner is Claude Code 2.1.283 or newer. Use an exact model ID and an existing Claude sign-in. Codex improvement execution remains disabled pending its isolation gate; final release verification is recorded in the feature guide.
758
+
759
+ Inspect a saved registry plan and its runs with
760
+ `myskills improve show-plan --id <plan-id> --json`. This reads the plan without
761
+ starting local execution. `myskills improve compatibility --release <slug>@<version>`
762
+ supports anonymous reads of public releases and uses available credentials for
763
+ authorized private releases.
764
+
765
+ Share evidence from either a local job or an authorized completed registry run:
766
+
767
+ ```text
768
+ myskills improve share --job <dir> --disclosure summary --subject baseline|candidate --release <slug>@<version>
769
+ myskills improve share --run <run-id> --disclosure summary|selected-evidence --subject baseline|candidate --release <slug>@<version>
770
+ myskills improve share --run <run-id> --disclosure summary --proposals-file <proposals.json>
771
+ ```
772
+
773
+ `--job` retains the original registry endpoint, plan and confirmed report digest
774
+ checks and supports summary disclosure only. `--run` reads the completed run and
775
+ uses its recorded report digest; API tokens need `improvements:read` and
776
+ `improvements:report`. Both forms accept a reviewed proposals file in place of
777
+ `--subject` and `--release`:
778
+
779
+ ```json
780
+ {"proposals":[{"subject":"baseline","slug":"example-skill","version":"1.0.0"}]}
781
+ ```
782
+
783
+ The file accepts zero to four proposals, each with only `subject`, `slug` and an
784
+ exact `version`. Choose exactly one of `--job` or `--run`, and one proposal input
785
+ form. Repeating the same run, report digest, disclosure and proposals reuses the
786
+ same evidence request identity. Evidence sharing does not run an evaluation or
787
+ publish a skill release.
788
+
789
+ ### Skill bundles
790
+
791
+ Browse related skills without installing them:
792
+
793
+ ```bash
794
+ myskills bundles list --view grouped --query engineering
795
+ myskills bundles show <bundle-id>
796
+ myskills bundles members <bundle-id> --limit 25
797
+ myskills bundles memberships <skill-slug>
798
+ myskills bundles sources
799
+ ```
800
+
801
+ Create or edit with `myskills bundles create --input reviewed-bundle.json` or
802
+ `myskills bundles edit <bundle-id> --input reviewed-bundle.json`. The request
803
+ contains `kind`, `name`, `purpose`, `owner`, `visibility` and `memberSlugs`.
804
+ Source groups also require `sourceEntryId`; edits require `expectedRevision`.
805
+ The API validates current ownership, author privileges and member access.
806
+
807
+ Save with `myskills bundles save <bundle-id> --input save-reference.json`, where
808
+ the file contains `libraryId` and `expectedRevision`. This saves one reference;
809
+ it does not adopt, install or follow any skill. Use `--cursor` with list/member
810
+ reads. Refresh from the first page if the authorized catalog changes.
811
+
812
+ ### GitHub connection controls
813
+
814
+ Use `myskills account github status` to inspect the connected account and `myskills account github disconnect` to revoke it. Administrators can use `myskills admin github get` and `myskills admin github test` for safe configuration status and verification. These commands preserve API scope, account, role and MFA checks.
815
+
816
+ `myskills account github connect` and `myskills admin github configure` return instructions for the trusted browser flow. They do not open a browser, enter credentials, grant consent or claim completion. Keep GitHub App secrets and private keys in the trusted Admin form. Inspect the safe status command after completing that flow.
817
+
818
+ Use `myskills skills managed <slug>` to inspect an authorized archived or unpublished skill from the managed inventory. The public `info` command retains the public release contract.