@jarel/myskills 0.1.0-alpha.3 → 0.1.0-beta.19

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