@delorenj/skillex 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,12 +2,39 @@
2
2
 
3
3
  A Node CLI for defining skills once, composing them by reference, and exposing the selected skills to agentic CLIs.
4
4
 
5
+ ## Core model
6
+
7
+ The user-confirmed definitions (2026-10-10) are:
8
+
9
+ | Term | Meaning |
10
+ | --- | --- |
11
+ | Skill root | A directory where an agent looks for skills, almost always named `skills/`. |
12
+ | Global skill root | A directory an agent automatically loads regardless of project scope. |
13
+ | Canonical skill root | Skillex's SSOT root: `~/.agents/skills/` globally; `<project>/.agents/skills/` locally. |
14
+ | Skill set | **Replaces** the canonical root with a symlink to the set's skill root. Sets are **mutually exclusive**. |
15
+ | Skill pack | **Populates** the existing root with individual skill symlinks. Packs are **composable**. |
16
+
17
+ **Sets select the root; packs add skills to it.** A ten-skill pack adds ten member
18
+ links; it does not take over the root. `all-skills/` owns the definition bytes,
19
+ not the canonical discovery root. See [AGENTS.md](AGENTS.md) for the vocabulary.
20
+
21
+ The Node implementation enforces this model. Older installed packages and the
22
+ retained Python migration reference may still implement the reversed semantics;
23
+ never run both writers on the same root. Existing manifests and foreign roots
24
+ need an explicit previewed migration, not a silent reinterpretation.
25
+
26
+ Adding a pack to a shared set-backed root derives a scope-owned set and switches
27
+ only that scope. The shared set and its other consumers remain unchanged. A
28
+ project set overrides Skillex's inherited global selection, but agent clients
29
+ also discover global skills independently: client isolation requires a supported
30
+ adapter and runtime verification, not merely `inherit_global: false`.
31
+
5
32
  ## Install
6
33
 
7
34
  Requires Node 24 or newer. The npm package contains the compiled CLI, typed ESM core, and JSON schemas. It has no Python or uv runtime dependency.
8
35
 
9
36
  ```sh
10
- npm install --global @delorenj/skillex@0.1.1
37
+ npm install --global @delorenj/skillex
11
38
  skillex --help
12
39
  ```
13
40
 
@@ -15,7 +42,10 @@ Keep a local registry checkout with its `all-skills/` submodule initialized. Sel
15
42
 
16
43
  ## Select and sync skills
17
44
 
18
- A global or project `.agents/skills.json` declares skills, sets, an optional exclusive pack, and exclusions. Projects inherit global selections by default.
45
+ Selection lives in global or project `.agents/skills.json`. Select at most one
46
+ set, any number of distinct packs, and residual individual skills. Use `-g` on
47
+ selection commands for global scope, or `--project PATH` for one project. Preview
48
+ mutating commands before applying; foreign content requires explicit adoption.
19
49
 
20
50
  ```sh
21
51
  skillex init --scope global
@@ -28,10 +58,46 @@ skillex status --project /workspace/example
28
58
  skillex explain code-reviewer --project /workspace/example
29
59
  ```
30
60
 
31
- `enable`, `disable`, and `inherit` save the selected scope's intent and immediately reconcile that scope. Disabling an inherited skill adds a local exclusion. A pack supplies the entire loadout; disabling it restores the retained ordinary selection.
61
+ `enable`, `disable`, and `inherit` save and reconcile one scope unless previewed.
62
+ `enable set NAME` switches its root, while `enable pack NAME@VERSION` adds that
63
+ pack without discarding other packs. `pack add REF MEMBERS...` edits pack
64
+ membership, not manifest selection. Exclusions and additions on a set-backed root
65
+ use a scope-owned derivation rather than modifying the shared set.
32
66
 
33
67
  Plain `sync` reconciles global plus the nearest project, or global alone outside a project. `--scope project --project PATH` restricts writes to that project while still resolving inheritance. Existing foreign files and installer-owned content are preserved. Only recorded owned links can be pruned.
34
68
 
69
+ ## Repeatable integration repairs
70
+
71
+ ```sh
72
+ # Compose references from a root, individual skill paths, or explicit Git sources.
73
+ skillex set create project-base --from-root /workspace/skills --dry-run
74
+ skillex pack create project-tools --version 1.0.0 --from /workspace/skill-a --from https://example.org/team/skills.git --import --dry-run
75
+
76
+ # Preview normalization; --base-set is required for ambiguous legacy multi-set declarations.
77
+ skillex normalize --project /workspace/example
78
+ skillex normalize --project /workspace/example --apply
79
+ skillex normalize -g --base-set min-global --dry-run
80
+
81
+ # Explicit ownership cutover preserves original roots when mapping entries.
82
+ skillex root adopt --project /workspace/example --map old-name=new-name --dry-run
83
+
84
+ # Project-set override for OpenCode V2; verify with a dedicated existing session.
85
+ skillex clients isolate --client opencode --project /workspace/example
86
+ skillex clients verify --client opencode --project /workspace/example --session ses_probe --agent build
87
+ ```
88
+
89
+ Source creation refuses differing same-name content and never silently skips
90
+ requested unknown skills. `--import` explicitly authorizes missing definitions
91
+ through the canonical importer; Git acquisition records a commit and never runs
92
+ source code. Normalization replaces exact groups with references without widening
93
+ membership. Root adoption and client isolation preview by default; apply with
94
+ `--apply`, then repeat the preview to prove convergence.
95
+
96
+ OpenCode isolation preserves unrelated configuration and uses owned permission
97
+ rules. Conflicting user rules require an explicit decision; other clients are not
98
+ certified by this adapter. `clients unisolate` removes only owned rules. Verification
99
+ checks canonical paths and actual permissions, not merely the raw registered list.
100
+
35
101
  ## Manage the catalog
36
102
 
37
103
  ```sh
@@ -58,6 +124,12 @@ skillex profile sync example-pm --project /workspace/example --dry-run
58
124
  skillex profile sync example-pm --project /workspace/example
59
125
  ```
60
126
 
127
+ Profiles normally combine global and project selections. A profile's generated
128
+ `config.yaml` can set `skills.inherit_global: false` to keep its loadout limited
129
+ to the explicit project selection. Ordinary `profile show` and later resyncs
130
+ honor this persistent boundary, including when the project manifest inherits
131
+ global skills. Change this setting through the profile's owning config renderer.
132
+
61
133
  ## Migrate an existing installation
62
134
 
63
135
  Preview the registry and each target before applying their migration. The migration result lists content choices, changed objects, and verification receipts. Missing mappings and unresolved local content remain visible as blocked items.
@@ -73,6 +145,26 @@ skillex migrate --project /workspace/example --apply
73
145
 
74
146
  Do not run the Python and Node reconcilers against the same target. The [migration contract](docs/implementation/cli-migration.md) covers legacy references, explicit choices, ownership handoff, interruption recovery, and profile conversion. The [CLI Revamp delivery record](docs/tasks/cli-revamp-tickets.md) tracks the remaining template and consumer cutover work; installing the package alone does not migrate consumers.
75
147
 
148
+ ## Retire skill-operation mise tasks
149
+
150
+ Existing mise tasks for skills are obsolete. Remove them rather than updating
151
+ their package pins or introducing replacement wrappers. Invoke `skillex` directly.
152
+
153
+ ```sh
154
+ skillex integrations retire-mise --project /workspace/example
155
+ skillex integrations retire-mise --project /workspace/example --apply
156
+ skillex integrations retire-mise --project /workspace/example
157
+ ```
158
+
159
+ The default is a read-only preview. Removal covers detected skill-operation task
160
+ tables, their dependencies, and supported watcher/enter-hook calls. Unrelated
161
+ configuration and tool installation remain. The final preview must be empty.
162
+ Use `--file PATH` for one explicit TOML source or `-g` for global mise configs.
163
+ Unsupported inline task definitions or mixed hooks refuse instead of dropping
164
+ unrelated behavior. This command does not change skill roots or run mise.
165
+ File-task scripts and externally included config sources are not yet scanned;
166
+ inspect those separately and extend the command before claiming their retirement.
167
+
76
168
  ## Automation and development
77
169
 
78
170
  Use `--json` for a schema-2 envelope with `schema`, `command`, `ok`, `exit`, `data`, and `findings`. Diagnostic output does not contaminate JSON stdout. Mutating commands support `--dry-run`; `migrate` previews by default and requires `--apply`. `sync --dry-run --exit-code` returns 6 for drift.