@victortomaili/skill-cli 0.6.0 → 0.6.2
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 +21 -0
- package/README.md +12 -11
- package/package.json +1 -1
- package/src/cli.js +3 -3
- package/src/commands/defaults.js +25 -19
- package/src/lib/agents-md.js +17 -8
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,27 @@ 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.2] - 2026-07-07
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
- AGENTS.md START GATE: stricter, broader PROPOSE rule. The agent now auto-loads
|
|
18
|
+
only skills STRICTLY NECESSARY to attempt the task, and PROPOSES (waits for user
|
|
19
|
+
confirmation) everything else — explicitly including: response STYLE/format/mode
|
|
20
|
+
skills, CONTEXT-COST / token optimizers, ACTIVATE-BEFORE-WORK workflows, and any
|
|
21
|
+
facilitator/accelerator that would make the job EASIER or FASTER. When unsure,
|
|
22
|
+
propose (propose is the safe default; loading is silent).
|
|
23
|
+
|
|
24
|
+
## [0.6.1] - 2026-07-07
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- Renamed the agent catalog command `skill defaults` → **`skill active`** (`skill
|
|
28
|
+
status` is an alias; `skill defaults` is kept as a legacy alias so already-bootstrapped
|
|
29
|
+
agents keep working). It now lists ONLY the skills active in the current project
|
|
30
|
+
(defaults + project allow, minus deny) with full descriptions — not every installed
|
|
31
|
+
skill. `skill default <name>` / `skill undefault <name>` (marking) are unchanged.
|
|
32
|
+
- AGENTS.md START GATE updated to run `skill active` and scope the catalog to
|
|
33
|
+
active skills.
|
|
34
|
+
|
|
14
35
|
## [0.6.0] - 2026-07-07
|
|
15
36
|
|
|
16
37
|
### 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
|
|
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
|
|
185
|
-
block tells your agent to run `skill
|
|
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,14 +197,15 @@ 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
|
|
201
|
-
> skill **catalog** (every skill's name + full description; never the body).
|
|
202
|
-
> it and decide per skill from its description: **
|
|
203
|
-
> it (`skill cat <name>`); **
|
|
204
|
-
>
|
|
205
|
-
>
|
|
206
|
-
>
|
|
207
|
-
>
|
|
200
|
+
> ANYTHING ELSE (before thinking, before any tool call) — is `skill active`, the
|
|
201
|
+
> skill **catalog** (every active skill's name + full description; never the body).
|
|
202
|
+
> Read it and decide per skill from its description: **strictly necessary** to even
|
|
203
|
+
> attempt the task → load it (`skill cat <name>`); **otherwise PROPOSE** — including
|
|
204
|
+
> any skill that changes your response *style/format*, optimizes *context cost*, is
|
|
205
|
+
> meant to be *activated before the work*, or would make the job *easier/faster*
|
|
206
|
+
> (a facilitator). Apply only after the user confirms (`/X` = confirm); when unsure,
|
|
207
|
+
> propose. **LOADED ≠ LISTED**: a skill is loaded only if you `cat`-ed it this
|
|
208
|
+
> session — listing it (or its ★ / `active` status) is not loading.
|
|
208
209
|
> `/X` → `skill trigger X`.
|
|
209
210
|
|
|
210
211
|
It's wrapped in `<!-- BEGIN skill-cli --> … <!-- END skill-cli -->` markers, never
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@victortomaili/skill-cli",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
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 {
|
|
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':
|
|
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
|
package/src/commands/defaults.js
CHANGED
|
@@ -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
|
|
6
|
-
//
|
|
7
|
-
// agent
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
|
|
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
|
|
19
|
+
console.log(c.bold('skill active') + c.gray(' — active skills (descriptions only). Load only what is STRICTLY necessary; PROPOSE style/cost/workflow/facilitator skills and wait for confirmation.'))
|
|
16
20
|
console.log()
|
|
17
21
|
|
|
18
|
-
if (
|
|
19
|
-
console.log(c.gray(' No skills
|
|
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
|
|
24
|
-
//
|
|
25
|
-
// agent reads descriptions
|
|
26
|
-
//
|
|
27
|
-
// HOW the agent responds). Detection is the agent's judgment from the
|
|
28
|
-
// description, so it works for any skill — including ones
|
|
29
|
-
// no hardcoded list or flag.
|
|
30
|
-
for (const
|
|
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
|
|
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
|
package/src/lib/agents-md.js
CHANGED
|
@@ -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
|
|
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,24 @@ 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
|
|
29
|
-
CATALOG — every
|
|
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
|
-
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
- It is STRICTLY NECESSARY to even attempt the task (you cannot do it without
|
|
32
|
+
this knowledge) → load it: \`skill cat <name>\`.
|
|
33
|
+
- OTHERWISE PROPOSE it — tell the user it's available and what it does, then apply
|
|
34
|
+
ONLY after they confirm (\`/X\` = confirm). You MUST propose (never silently apply)
|
|
35
|
+
any skill that:
|
|
36
|
+
• changes your communication / response STYLE, tone, format, or a persistent
|
|
37
|
+
mode (e.g. a brevity / compression style);
|
|
38
|
+
• optimizes CONTEXT COST / token usage;
|
|
39
|
+
• is meant to be ACTIVATED BEFORE the work (a workflow / methodology);
|
|
40
|
+
• would make the job EASIER or FASTER — a facilitator / accelerator / tool —
|
|
41
|
+
even if optional. Surface it so the user can opt in.
|
|
42
|
+
When unsure whether a skill is necessary or optional → PROPOSE (proposing is the
|
|
43
|
+
safe default; loading is silent).
|
|
35
44
|
LOADED ≠ LISTED. A skill is loaded ONLY if you have run \`skill cat <name>\` for
|
|
36
|
-
it THIS session. Seeing a skill in \`skill
|
|
45
|
+
it THIS session. Seeing a skill in \`skill active\` / \`skill list\` does NOT load
|
|
37
46
|
it — you then know only its name + description, nothing more. Never infer a skill
|
|
38
47
|
is in your context from its name, the \u2605 marker, or an \`active\` status: if you
|
|
39
48
|
haven't catted it, treat it as NOT loaded (then decide: cat it, or propose it).
|