@victortomaili/skill-cli 0.6.0 → 0.6.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/CHANGELOG.md CHANGED
@@ -11,6 +11,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
11
11
  - Cursor adapter (`.cursor/rules` format) for `init -g` bootstrap.
12
12
  - Per-agent hook adapters for automatic `/X` triggering (push model).
13
13
 
14
+ ## [0.6.1] - 2026-07-07
15
+
16
+ ### Changed
17
+ - Renamed the agent catalog command `skill defaults` → **`skill active`** (`skill
18
+ status` is an alias; `skill defaults` is kept as a legacy alias so already-bootstrapped
19
+ agents keep working). It now lists ONLY the skills active in the current project
20
+ (defaults + project allow, minus deny) with full descriptions — not every installed
21
+ skill. `skill default <name>` / `skill undefault <name>` (marking) are unchanged.
22
+ - AGENTS.md START GATE updated to run `skill active` and scope the catalog to
23
+ active skills.
24
+
14
25
  ## [0.6.0] - 2026-07-07
15
26
 
16
27
  ### Changed
package/README.md CHANGED
@@ -83,7 +83,7 @@ short bootstrap block telling it to run `skill` on `/X`.
83
83
  | `skill disable <name> [-g]` | Deny in project, or remove global default with `-g` |
84
84
  | `skill default <name>` | Mark a default skill (global: active + auto-load) |
85
85
  | `skill undefault <name>` | Remove the default flag |
86
- | `skill defaults` | List default skills (the command your agent runs on start) |
86
+ | `skill active` | List ACTIVE skills + descriptions (the command your agent runs on start; alias: `status`) |
87
87
  | `skill list` | Show installed + active skills (cwd-aware, ★ = default) |
88
88
  | `skill show <name>` | Skill metadata (path, triggers, version) |
89
89
  | `skill cat <name>` | Dump skill content into context |
@@ -181,8 +181,8 @@ with no source also opens it.
181
181
  A **default** is a skill that is **active by default in every project** AND
182
182
  **auto-loaded on agent session start** — one unified global list in `config.yaml`
183
183
  (`defaults:`). Mark one with `skill default <name>`, remove with
184
- `skill undefault <name>`, list them with `skill defaults`. The AGENTS.md bootstrap
185
- block tells your agent to run `skill defaults` on start, then `skill cat <name>`
184
+ `skill undefault <name>`, list them with `skill active`. The AGENTS.md bootstrap
185
+ block tells your agent to run `skill active` on start, then `skill cat <name>`
186
186
  for each.
187
187
 
188
188
  Defaults are a **global** concept (never per-project). A project can still turn a
@@ -197,7 +197,7 @@ default; `space` toggles the per-project override.
197
197
  instruction file (`CLAUDE.md`, `AGENTS.md`, `GEMINI.md`):
198
198
 
199
199
  > **START GATE:** on the first user message, your VERY FIRST action — BEFORE
200
- > ANYTHING ELSE (before thinking, before any tool call) — is `skill defaults`, the
200
+ > ANYTHING ELSE (before thinking, before any tool call) — is `skill active`, the
201
201
  > skill **catalog** (every skill's name + full description; never the body). Read
202
202
  > it and decide per skill from its description: **functional** for the task → load
203
203
  > it (`skill cat <name>`); **context-altering** (changes HOW you respond —
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@victortomaili/skill-cli",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Cross-agent skill manager — one global store, clean agent folders, activation via skill.config",
5
5
  "license": "MIT",
6
6
  "author": "Victor Tomaili <victor@tomaili.com>",
package/src/cli.js CHANGED
@@ -12,7 +12,7 @@ import { cmdUpdate } from './commands/update.js'
12
12
  import { cmdRemove } from './commands/remove.js'
13
13
  import { cmdSearch } from './commands/search.js'
14
14
  import { cmdManager } from './commands/manager.js'
15
- import { cmdDefaults, cmdDefault, cmdUndefault } from './commands/defaults.js'
15
+ import { cmdActive, cmdDefault, cmdUndefault } from './commands/defaults.js'
16
16
  import { isInteractive } from './lib/interactive.js'
17
17
  import { VERSION } from './lib/version.js'
18
18
 
@@ -33,11 +33,11 @@ ${c.bold('Activation')}
33
33
  ${c.cyan('skill enable')} ${c.gray('<name> [-g]')} allow in project, or global default (-g)
34
34
  ${c.cyan('skill disable')} ${c.gray('<name> [-g]')} deny in project, or remove global default (-g)
35
35
  ${c.cyan('skill list')} installed + active skills (cwd-aware)
36
+ ${c.cyan('skill active')} active skills + descriptions (agent runs on start; alias: status)
36
37
 
37
38
  ${c.bold('Defaults (active + auto-load)')}
38
39
  ${c.cyan('skill default')} ${c.gray('<name>')} mark a default skill (global: active in every project)
39
40
  ${c.cyan('skill undefault')} ${c.gray('<name>')} remove the default flag
40
- ${c.cyan('skill defaults')} list default skills (agent runs this on start)
41
41
 
42
42
  ${c.bold('Usage (agent)')}
43
43
  ${c.cyan('skill show')} ${c.gray('<name>')} metadata + path + triggers
@@ -90,7 +90,7 @@ async function main() {
90
90
  case 'enable': cmdEnable(rest); break
91
91
  case 'disable': cmdDisable(rest); break
92
92
  case 'list': case 'ls': cmdList(rest); break
93
- case 'defaults': cmdDefaults(rest); break
93
+ case 'active': case 'status': case 'defaults': cmdActive(rest); break
94
94
  case 'default': case 'def': cmdDefault(rest); break
95
95
  case 'undefault': case 'undef': cmdUndefault(rest); break
96
96
  case 'show': case 'info': cmdShow(rest); break
@@ -1,40 +1,46 @@
1
1
  import c from 'picocolors'
2
2
  import { listStore } from '../lib/store.js'
3
- import { readGlobalConfig, writeGlobalConfig } from '../lib/config.js'
3
+ import { readGlobalConfig, writeGlobalConfig, readProjectConfig, computeEffective } from '../lib/config.js'
4
4
 
5
- // `skill defaults` list the skills marked as defaults. In the unified model a
6
- // default skill is BOTH active-by-default in every project AND auto-loaded on
7
- // agent session start (one global `defaults` list). This is the agent-facing
8
- // command the AGENTS.md block tells the agent to run, then `skill cat <name>`
9
- // for each. Defaults are a GLOBAL concept (never per-folder).
10
- export function cmdDefaults() {
5
+ // `skill active` (aliases: `status`, legacy `defaults`) the description-only
6
+ // catalog of ACTIVE skills in the current project (defaults + project allow,
7
+ // minus deny). The agent runs this at session start: it lists each active skill's
8
+ // name + FULL description (never the body), then the agent itself decides per
9
+ // skill functional `skill cat`, context-altering propose. Detection of
10
+ // context-altering is the agent's judgment from the description (no flag, no fixed
11
+ // list), so it works for any skill, including ones installed later.
12
+ export function cmdActive() {
11
13
  const installed = listStore()
12
14
  const globalCfg = readGlobalConfig()
15
+ const projCfg = readProjectConfig()
16
+ const eff = computeEffective(installed, globalCfg, projCfg)
13
17
  const defs = new Set((globalCfg.defaults || []).map(d => String(d).toLowerCase()))
14
18
 
15
- console.log(c.bold('skill defaults') + c.gray(' — skill catalog (descriptions only; the agent decides: functional → `skill cat`, context-altering → propose)'))
19
+ console.log(c.bold('skill active') + c.gray(' — active skills in this project (descriptions only; functional → `skill cat`, context-altering → propose)'))
16
20
  console.log()
17
21
 
18
- if (installed.length === 0) {
19
- console.log(c.gray(' No skills installed. Install with: ') + c.cyan('skill install <source>'))
22
+ if (eff.length === 0) {
23
+ console.log(c.gray(' No active skills in this project.'))
20
24
  return
21
25
  }
22
26
 
23
- // CATALOG, not a loader: print every installed skill's name + FULL description
24
- // (collapsed to one line) + triggers. Never dump the skill body here the
25
- // agent reads descriptions, then itself decides per skill: load (skill cat) if
26
- // it's functional for the task, or PROPOSE if it's context-altering (changes
27
- // HOW the agent responds). Detection is the agent's judgment from the
28
- // description, so it works for any skill — including ones loaded later — with
29
- // no hardcoded list or flag.
30
- for (const s of installed) {
27
+ // CATALOG of ACTIVE skills only (not all installed): defaults + project allow,
28
+ // minus deny. Print each one's name + FULL description (one line) + triggers
29
+ // never the body. The agent reads descriptions and itself decides per skill:
30
+ // load (skill cat) if functional for the task, or PROPOSE if context-altering
31
+ // (changes HOW the agent responds). Detection is the agent's judgment from the
32
+ // description, so it works for any skill — including ones installed later —
33
+ // with no hardcoded list or flag.
34
+ for (const name of eff) {
35
+ const s = installed.find(x => x.name === name)
36
+ if (!s) continue
31
37
  const star = defs.has(s.name.toLowerCase()) ? c.yellow('★') + ' ' : ' '
32
38
  const trg = s.triggers.length ? ' ' + c.gray('/' + s.triggers.join(', /')) : ''
33
39
  console.log(` ${star}${c.bold(s.name)}${trg}`)
34
40
  if (s.description) console.log(c.gray(' ' + String(s.description).replace(/[\r\n]+/g, ' ').trim()))
35
41
  }
36
42
  console.log()
37
- console.log(c.yellow('★') + c.gray(' = default (active by default). Load a skill: ') + c.cyan('skill cat <name>'))
43
+ console.log(c.yellow('★') + c.gray(' = default. Load a skill: ') + c.cyan('skill cat <name>'))
38
44
  }
39
45
 
40
46
  // `skill default <name>` — mark a skill as a default (active by default in every
@@ -6,7 +6,7 @@ const BEGIN = '<!-- BEGIN skill-cli -->'
6
6
  const END = '<!-- END skill-cli -->'
7
7
 
8
8
  // Global instruction block — injected into each agent's global instruction file.
9
- // `skill defaults` is a description-only CATALOG; the agent reads it, then itself
9
+ // `skill active` (alias: `status`) is a description-only CATALOG of ACTIVE skills;
10
10
  // decides per skill: functional → `skill cat`, context-altering → propose. No flag
11
11
  // or fixed list — detection is the agent's judgment from the description, so it
12
12
  // covers any skill (including ones installed later).
@@ -25,15 +25,15 @@ Usage:
25
25
 
26
26
  START GATE (mandatory): On the FIRST user message of a session, your VERY FIRST
27
27
  action — BEFORE ANYTHING ELSE: before you start thinking/reasoning about the task
28
- and before any tool call — MUST be to run \`skill defaults\`. It prints the skill
29
- CATALOG — every installed skill's name + FULL description (NOT the skill body).
28
+ and before any tool call — MUST be to run \`skill active\`. It prints the skill
29
+ CATALOG — every ACTIVE skill's name + FULL description (NOT the skill body).
30
30
  Read it, then for EACH skill decide FROM ITS DESCRIPTION:
31
31
  - Functional / useful for THIS task → load it: \`skill cat <name>\`.
32
32
  - Changes HOW you respond (a style, tone, format, or persistent MODE — e.g. a
33
33
  brevity/compression style) → it is CONTEXT-ALTERING: PROPOSE it to the user and
34
34
  apply ONLY after they confirm (\`/X\` = confirm). Do NOT load/apply it yourself.
35
35
  LOADED ≠ LISTED. A skill is loaded ONLY if you have run \`skill cat <name>\` for
36
- it THIS session. Seeing a skill in \`skill defaults\` / \`skill list\` does NOT load
36
+ it THIS session. Seeing a skill in \`skill active\` / \`skill list\` does NOT load
37
37
  it — you then know only its name + description, nothing more. Never infer a skill
38
38
  is in your context from its name, the \u2605 marker, or an \`active\` status: if you
39
39
  haven't catted it, treat it as NOT loaded (then decide: cat it, or propose it).