skilldrop-cli 0.9.0 → 0.9.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/README.md +7 -2
- package/bin/skilldrop.js +179 -3
- package/model-routing.json +4 -0
- package/package.json +2 -2
- package/packs.json +8 -3
- package/skills/adr-generator/evals/eval_queries.json +34 -0
- package/skills/adr-generator/evals/evals.json +17 -0
- package/skills/ai-adoption-rollout/SKILL.md +61 -0
- package/skills/ai-adoption-rollout/evals/eval_queries.json +34 -0
- package/skills/ai-adoption-rollout/evals/evals.json +19 -0
- package/skills/ai-adoption-rollout/manifest.json +33 -0
- package/skills/ai-readiness-assessment/SKILL.md +66 -0
- package/skills/ai-readiness-assessment/evals/eval_queries.json +34 -0
- package/skills/ai-readiness-assessment/evals/evals.json +17 -0
- package/skills/ai-readiness-assessment/manifest.json +34 -0
- package/skills/ai-usage-policy/SKILL.md +67 -0
- package/skills/ai-usage-policy/evals/eval_queries.json +34 -0
- package/skills/ai-usage-policy/evals/evals.json +19 -0
- package/skills/ai-usage-policy/manifest.json +33 -0
- package/skills/ai-use-case-triage/SKILL.md +59 -0
- package/skills/ai-use-case-triage/evals/eval_queries.json +34 -0
- package/skills/ai-use-case-triage/evals/evals.json +18 -0
- package/skills/ai-use-case-triage/manifest.json +34 -0
- package/skills/api-contract-draft/evals/eval_queries.json +34 -0
- package/skills/api-contract-draft/evals/evals.json +18 -0
- package/skills/architecture-diagrams/evals/eval_queries.json +34 -0
- package/skills/architecture-diagrams/evals/evals.json +16 -0
- package/skills/audience-profile/evals/eval_queries.json +34 -0
- package/skills/audience-profile/evals/evals.json +15 -0
- package/skills/brief-intake/evals/eval_queries.json +34 -0
- package/skills/brief-intake/evals/evals.json +16 -0
- package/skills/bug-triage/evals/eval_queries.json +34 -0
- package/skills/bug-triage/evals/evals.json +17 -0
- package/skills/council-review/evals/eval_queries.json +38 -0
- package/skills/council-review/evals/evals.json +18 -0
- package/skills/data-contract/evals/eval_queries.json +34 -0
- package/skills/data-contract/evals/evals.json +16 -0
- package/skills/db-schema-design/evals/eval_queries.json +34 -0
- package/skills/db-schema-design/evals/evals.json +16 -0
- package/skills/decision-log/evals/eval_queries.json +34 -0
- package/skills/decision-log/evals/evals.json +17 -0
- package/skills/deck-builder/evals/eval_queries.json +34 -0
- package/skills/deck-builder/evals/evals.json +17 -0
- package/skills/design-doc/evals/eval_queries.json +34 -0
- package/skills/design-doc/evals/evals.json +17 -0
- package/skills/devils-advocate/evals/eval_queries.json +38 -0
- package/skills/devils-advocate/evals/evals.json +19 -0
- package/skills/doc-critique/evals/eval_queries.json +38 -0
- package/skills/doc-critique/evals/evals.json +17 -0
- package/skills/exec-summary/evals/eval_queries.json +34 -0
- package/skills/exec-summary/evals/evals.json +17 -0
- package/skills/figma-diagrams/evals/eval_queries.json +34 -0
- package/skills/figma-diagrams/evals/evals.json +15 -0
- package/skills/incident-comms/evals/eval_queries.json +34 -0
- package/skills/incident-comms/evals/evals.json +16 -0
- package/skills/migration-plan/evals/eval_queries.json +34 -0
- package/skills/migration-plan/evals/evals.json +16 -0
- package/skills/nfr-spec/evals/eval_queries.json +34 -0
- package/skills/nfr-spec/evals/evals.json +16 -0
- package/skills/observability-plan/evals/eval_queries.json +34 -0
- package/skills/observability-plan/evals/evals.json +16 -0
- package/skills/postmortem-generator/evals/eval_queries.json +34 -0
- package/skills/postmortem-generator/evals/evals.json +17 -0
- package/skills/prd-draft/evals/eval_queries.json +34 -0
- package/skills/prd-draft/evals/evals.json +17 -0
- package/skills/requirements-interview/evals/eval_queries.json +34 -0
- package/skills/requirements-interview/evals/evals.json +16 -0
- package/skills/reverse-architecture/evals/eval_queries.json +34 -0
- package/skills/reverse-architecture/evals/evals.json +16 -0
- package/skills/runbook-generator/evals/eval_queries.json +34 -0
- package/skills/runbook-generator/evals/evals.json +17 -0
- package/skills/slide-outliner/evals/eval_queries.json +34 -0
- package/skills/slide-outliner/evals/evals.json +16 -0
- package/skills/sonar-onboard/evals/eval_queries.json +34 -0
- package/skills/sonar-onboard/evals/evals.json +16 -0
- package/skills/sonar-review/evals/eval_queries.json +34 -0
- package/skills/sonar-review/evals/evals.json +16 -0
- package/skills/test-plan-generator/evals/eval_queries.json +34 -0
- package/skills/test-plan-generator/evals/evals.json +16 -0
- package/skills/threat-model/evals/eval_queries.json +34 -0
- package/skills/threat-model/evals/evals.json +18 -0
- package/skills/user-story-splitter/evals/eval_queries.json +34 -0
- package/skills/user-story-splitter/evals/evals.json +16 -0
package/README.md
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/skilldrop-cli)
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
|
|
6
|
-
**[Browse the catalogue →](https://sananthanarayan.github.io/skilldrop/)** — all
|
|
6
|
+
**[Browse the catalogue →](https://sananthanarayan.github.io/skilldrop/)** — all 55 skills, filterable by pack, tag, and model tier.
|
|
7
7
|
|
|
8
|
-
**
|
|
8
|
+
**55 portable AI-agent skills for the deliverables knowledge workers actually ship** — diagrams, design docs, ADRs, PRDs, runbooks, decks, decision logs, threat models, adversarial reviews — installable into **Claude Code**, **Cursor**, **Kiro**, **Codex**, **GitHub Copilot**, and any AI tool that accepts custom instructions, one skill or one role-based pack at a time:
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
11
|
npx skilldrop-cli install --pack product-manager # or: solution-architect, dev-team,
|
|
@@ -160,6 +160,10 @@ Designing the agentic systems themselves — the loops, orchestrations, and budg
|
|
|
160
160
|
|
|
161
161
|
| Skill | What it does |
|
|
162
162
|
|---|---|
|
|
163
|
+
| [`ai-readiness-assessment`](skills/ai-readiness-assessment/SKILL.md) | Score readiness to adopt AI across **six fixed dimensions** — data, tooling, skills, governance, process, culture — each 0–4 with a **one-line evidence reference**, or `[insufficient evidence]` rather than a guessed middle number. Gaps are ranked by **what blocks first**, not by lowest score, with the dependency named ("Skills can't move until Tooling ≥ 2"), and each carries a first action and an owner *role*. Ends with a posture sentence that takes a position and names what would change it — never a bare maturity label, because "you are Level 2 of 5" is not something a leader can fund. |
|
|
164
|
+
| [`ai-use-case-triage`](skills/ai-use-case-triage/SKILL.md) | Rank candidate AI use cases on value × feasibility × risk with the **weights shown** (default 40/35/25). Each candidate is restated as *a workflow and a person*, never a technology; feasibility asks whether the output can be **verified before it matters**, not whether a model can produce it. Produces a recommended first slice with an **observable kill condition** and a time box, plus a mandatory **not-yet list** where every rejection carries the condition that would promote it. A portfolio with no rejections hasn't triaged anything. |
|
|
165
|
+
| [`ai-adoption-rollout`](skills/ai-adoption-rollout/SKILL.md) | Plan the **human** rollout (the counterpart to `migration-plan`'s technical one) — cohorts smallest-first with a reason each is next, per-cohort hands-on enablement built from what the pilot actually got stuck on, champions as roles **with protected hours**, and an adoption **gate per wave** (observable + threshold + bake time + rollback). The comms plan must state explicitly **what will not change** about headcount and evaluation; silence there is read as bad news and is the biggest driver of quiet non-adoption. Licences activated is not adoption. |
|
|
166
|
+
| [`ai-usage-policy`](skills/ai-usage-policy/SKILL.md) | Draft the organisation-wide acceptable-use policy — **three** data tiers (five aren't memorable at the moment of pasting) with concrete examples from *this* org, permitted/prohibited uses stated as behaviours, and a human-review matrix keyed to **consequence** rather than to model names that age out in months. Every prohibition names a permitted alternative, because a ban with no sanctioned path moves the work to personal accounts where you can't see it — and there's always an exception route with a turnaround time. |
|
|
163
167
|
| [`ai-usage-report`](skills/ai-usage-report/SKILL.md) | Turn a CSV/JSONL of AI usage events (exported from an MCP server or other telemetry source) into a per-user, team-rollup, or effectiveness-focused report. Surfaces volume, breadth, session depth, and — where the data supports it — whether AI outputs were actually consumed in shipped artifacts vs generated and discarded (the "AI theater" question). Refuses to generate an aggregate rollup for teams smaller than 5 to preserve anonymity. |
|
|
164
168
|
| [`llm-eval-harness`](skills/llm-eval-harness/SKILL.md) | Design the **dev-loop quality gate** for an LLM-powered feature (prompt, RAG, agent, classifier) — so prompt and model changes ship on numbers, not vibes. A versioned golden set in three deliberate buckets (representative from real logs, adversarial/edge, and regression cases frozen from every past failure); the **cheapest adequate grading method per case** (programmatic → structured assertions → LLM-as-judge only when quality is genuinely subjective, and then validated against human labels with bias controls); a metric matched to the task with **both gates set before the first run** (no-regression + critical-subset-at-100%); a failure taxonomy that points iteration at the biggest bucket; and cost/latency tracked beside quality. Enforces the held-out split and the no-tuning-on-test rule. Provider-neutral. |
|
|
165
169
|
|
|
@@ -264,6 +268,7 @@ npx skilldrop-cli install --agent devils-advocate # -> ~/.claude/agents/ (
|
|
|
264
268
|
npx skilldrop-cli install --panel review # the whole review fleet: 3 subagents + the pre-merge-review orchestrator (RFC-0020)
|
|
265
269
|
npx skilldrop-cli outdated && npx skilldrop-cli update # skills improve; cp -R never tells you
|
|
266
270
|
npx skilldrop-cli list | skilldrop info <skill> | skilldrop packs | skilldrop uninstall <skill>
|
|
271
|
+
npx skilldrop-cli list --json # machine-readable: list/info/packs/agents/outdated (RFC-0021)
|
|
267
272
|
```
|
|
268
273
|
|
|
269
274
|
`--with-related` also pulls each skill's companions. From a clone (or before the package is published): `node bin/skilldrop.js <same args>`. Scope and design: [RFC-0002](docs/rfcs/0002-skilldrop-cli.md), full command surface in [`docs/designs/skilldrop-cli-design.md`](docs/designs/skilldrop-cli-design.md).
|
package/bin/skilldrop.js
CHANGED
|
@@ -48,6 +48,9 @@ Usage:
|
|
|
48
48
|
skilldrop uninstall <skill...> remove skills (and wiring files this tool wrote)
|
|
49
49
|
skilldrop uninstall --agent <name...> remove subagents
|
|
50
50
|
skilldrop validate [--from <src>] structural check of a catalog (for catalog authors)
|
|
51
|
+
skilldrop scan [<skill...>] [--from <src>] supply-chain scan — flag network/exec/credential
|
|
52
|
+
patterns in scripts and injection-shaped instructions
|
|
53
|
+
in SKILL.md before you trust a catalog (RFC-0022)
|
|
51
54
|
|
|
52
55
|
Catalogs:
|
|
53
56
|
(default) the catalog bundled with this package
|
|
@@ -72,6 +75,8 @@ Options:
|
|
|
72
75
|
--ide antigravity ~/.gemini/config/agents markdown, subagent: true
|
|
73
76
|
--dest <dir> any directory copied as-is
|
|
74
77
|
Cursor has no agent format — use a custom mode (agents/README.md).
|
|
78
|
+
--json machine-readable output for list | info | packs | agents | outdated —
|
|
79
|
+
one JSON object on stdout, nothing else (for agents, scripts, CI)
|
|
75
80
|
--with-related also install each skill's related companions (one level)
|
|
76
81
|
--with-hooks also wire any hooks a skill declares (RFC-0006) — git pre-commit
|
|
77
82
|
reminders and Claude Code session-start context; degrades where the
|
|
@@ -82,6 +87,11 @@ Options:
|
|
|
82
87
|
function die(msg) { console.error("error: " + msg); process.exit(1); }
|
|
83
88
|
function readJSON(p) { return JSON.parse(fs.readFileSync(p, "utf8")); }
|
|
84
89
|
|
|
90
|
+
/* --json (RFC-0021): the read commands emit one machine-readable object on stdout and nothing
|
|
91
|
+
else, so an agent or script can consume them without scraping aligned columns. Human output is
|
|
92
|
+
unchanged by default — this is additive. Errors still go to stderr and exit non-zero. */
|
|
93
|
+
function emitJSON(obj) { console.log(JSON.stringify(obj, null, 2)); }
|
|
94
|
+
|
|
85
95
|
function parseArgs(argv) {
|
|
86
96
|
const out = { _: [], flags: {} };
|
|
87
97
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -276,6 +286,117 @@ function gate(cat, names) {
|
|
|
276
286
|
if (bad) die(`${bad} skill(s) failed the structural check — nothing was installed`);
|
|
277
287
|
}
|
|
278
288
|
|
|
289
|
+
/* ---------- supply-chain scan (RFC-0022) ----------
|
|
290
|
+
A skill is instruction prose an agent will obey, and its scripts are code that runs on the
|
|
291
|
+
user's machine — so installing a third-party catalog is a supply-chain event. Anthropic's own
|
|
292
|
+
Skills guidance says to audit a skill's files for "unexpected network calls, file access
|
|
293
|
+
patterns, or operations that don't match the Skill's stated purpose"; this automates that first
|
|
294
|
+
pass. It is a HEURISTIC that reports — it never blocks and never replaces reading the skill.
|
|
295
|
+
|
|
296
|
+
Two rule sets, deliberately different:
|
|
297
|
+
- SCRIPT_RULES run over executable files (real code): network, exec, credential, obfuscation.
|
|
298
|
+
- PROSE_RULES run over SKILL.md and only match *instructions to misbehave* — not security
|
|
299
|
+
vocabulary, so a skill that legitimately discusses injection (threat-model) isn't flagged. */
|
|
300
|
+
|
|
301
|
+
const SCRIPT_EXT = new Set([".py", ".js", ".mjs", ".cjs", ".sh", ".bash", ".zsh", ".rb", ".pl", ".ps1"]);
|
|
302
|
+
|
|
303
|
+
const SCRIPT_RULES = [
|
|
304
|
+
{ id: "exec-remote", sev: "🟥", why: "downloads and executes remote content — the classic supply-chain payload",
|
|
305
|
+
re: /(curl|wget)[^\n|]*\|\s*(sudo\s+)?(ba|z|)sh|eval\s*\(\s*(requests|urllib|fetch)|base64\s+(-d|--decode)[^\n|]*\|\s*(ba|z|)sh/i },
|
|
306
|
+
{ id: "shell-exec", sev: "🟧", why: "executes shell commands",
|
|
307
|
+
re: /\b(os\.system|subprocess\.(run|call|Popen|check_output)|child_process|execSync|spawnSync|shell_exec|`[^`\n]*\$\()/ },
|
|
308
|
+
{ id: "network", sev: "🟧", why: "makes outbound network calls",
|
|
309
|
+
re: /\b(requests\.(get|post|put)|urllib\.request|httpx\.|axios\.|node-fetch|\bfetch\s*\(\s*["'`]https?:|curl\s+https?:|wget\s+https?:)/i },
|
|
310
|
+
{ id: "credentials", sev: "🟧", why: "reads credentials or secret material",
|
|
311
|
+
re: /\b(os\.environ|process\.env)\b[^\n]{0,40}(TOKEN|KEY|SECRET|PASSWORD|CREDENTIAL)|~\/\.(aws|ssh|npmrc|netrc)|\.env\b|id_rsa/i },
|
|
312
|
+
{ id: "broad-fs", sev: "🟨", why: "writes outside the skill's own directory",
|
|
313
|
+
re: /\b(shutil\.rmtree|rm\s+-rf\s+[~/]|open\s*\(\s*["'`]\/(etc|usr|bin)|fs\.(unlink|rmSync)\s*\([^)]*\.\.\/)/ },
|
|
314
|
+
];
|
|
315
|
+
|
|
316
|
+
const PROSE_RULES = [
|
|
317
|
+
{ id: "instruction-override", sev: "🟥", why: "tells the agent to ignore its prior instructions",
|
|
318
|
+
re: /ignore\s+(all\s+)?(previous|prior|earlier|above|preceding)\s+(instructions|prompts|rules)/i },
|
|
319
|
+
{ id: "conceal-from-user", sev: "🟥", why: "tells the agent to hide actions from the user",
|
|
320
|
+
re: /(do\s*n[o']?t|never|without)\s+(tell|telling|inform|informing|notify|notifying|mention|mentioning)\s+(the\s+)?(user|human)/i },
|
|
321
|
+
{ id: "memory-overwrite", sev: "🟥", why: "instructs the agent to rewrite its own persistent memory/identity",
|
|
322
|
+
re: /(update|overwrite|append\s+to|modify)\s+your\s+(own\s+)?(SOUL|MEMORY|CLAUDE|AGENTS)\.md/i },
|
|
323
|
+
{ id: "prose-exfil", sev: "🟧", why: "instructs the agent to send data to an external endpoint",
|
|
324
|
+
re: /\b(POST|send|upload|transmit)\b[^\n.]{0,60}\bto\s+https?:\/\//i },
|
|
325
|
+
];
|
|
326
|
+
|
|
327
|
+
function walkFiles(dir, out = []) {
|
|
328
|
+
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
329
|
+
const p = path.join(dir, e.name);
|
|
330
|
+
if (e.isDirectory()) walkFiles(p, out);
|
|
331
|
+
else out.push(p);
|
|
332
|
+
}
|
|
333
|
+
return out;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* Scan one skill. Returns [{sev, id, why, file, line, text}] — worst first. */
|
|
337
|
+
function scanSkill(cat, s) {
|
|
338
|
+
const dir = skillDir(cat, s);
|
|
339
|
+
const findings = [];
|
|
340
|
+
if (!dir || !fs.existsSync(dir)) return findings;
|
|
341
|
+
for (const file of walkFiles(dir)) {
|
|
342
|
+
const rel = path.relative(dir, file);
|
|
343
|
+
const ext = path.extname(file).toLowerCase();
|
|
344
|
+
const isScript = SCRIPT_EXT.has(ext);
|
|
345
|
+
const isProse = path.basename(file) === "SKILL.md";
|
|
346
|
+
if (!isScript && !isProse) continue;
|
|
347
|
+
let body = "";
|
|
348
|
+
try { body = fs.readFileSync(file, "utf8"); } catch (e) { continue; }
|
|
349
|
+
const rules = isScript ? SCRIPT_RULES : PROSE_RULES;
|
|
350
|
+
body.split(/\r?\n/).forEach((line, i) => {
|
|
351
|
+
if (line.length > 400) return; // minified/data line — not reviewable prose or code
|
|
352
|
+
for (const r of rules) {
|
|
353
|
+
if (r.re.test(line))
|
|
354
|
+
findings.push({ sev: r.sev, id: r.id, why: r.why, file: rel, line: i + 1, text: line.trim().slice(0, 120) });
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
const order = { "🟥": 0, "🟧": 1, "🟨": 2, "⚪": 3 };
|
|
359
|
+
return findings.sort((a, b) => order[a.sev] - order[b.sev]);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function printScan(cat, names, { compact = false } = {}) {
|
|
363
|
+
let total = 0, worst = null;
|
|
364
|
+
for (const s of names) {
|
|
365
|
+
const f = scanSkill(cat, s);
|
|
366
|
+
if (!f.length) continue;
|
|
367
|
+
total += f.length;
|
|
368
|
+
if (!worst || f[0].sev === "🟥") worst = worst === "🟥" ? worst : f[0].sev;
|
|
369
|
+
console.log(`\n${s}`);
|
|
370
|
+
for (const x of (compact ? f.slice(0, 3) : f))
|
|
371
|
+
console.log(` ${x.sev} ${x.id} — ${x.why}\n ${x.file}:${x.line} ${x.text}`);
|
|
372
|
+
if (compact && f.length > 3) console.log(` … ${f.length - 3} more (skilldrop scan ${s} --from ${cat.source})`);
|
|
373
|
+
}
|
|
374
|
+
return { total, worst };
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function scan(args) {
|
|
378
|
+
const cat = resolveCatalog(args.flags.from);
|
|
379
|
+
const names = args._.length ? args._.slice() : skillsIn(cat);
|
|
380
|
+
for (const s of names) if (!skillExists(cat, s)) die(`unknown skill '${s}' in catalog '${cat.source}'`);
|
|
381
|
+
|
|
382
|
+
if (args.flags.json) {
|
|
383
|
+
const out = names.map((s) => ({ skill: s, findings: scanSkill(cat, s) })).filter((r) => r.findings.length);
|
|
384
|
+
return emitJSON({
|
|
385
|
+
catalog: cat.source, scanned: names.length,
|
|
386
|
+
flagged: out.length, findingCount: out.reduce((n, r) => n + r.findings.length, 0), skills: out,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
console.log(`Scanning ${names.length} skill(s) in catalog '${cat.source}' for supply-chain patterns…`);
|
|
390
|
+
const { total } = printScan(cat, names);
|
|
391
|
+
if (!total) {
|
|
392
|
+
console.log("\nNo flagged patterns found.");
|
|
393
|
+
} else {
|
|
394
|
+
console.log(`\n${total} flagged pattern(s). These are HEURISTICS, not verdicts — a match can be` +
|
|
395
|
+
` entirely legitimate (a skill that is *about* security, or a script that genuinely needs the network).`);
|
|
396
|
+
console.log("Read the cited lines before installing. Nothing here is executed by skilldrop; installs copy files only.");
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
279
400
|
/* ---------- install targets & ledger ---------- */
|
|
280
401
|
|
|
281
402
|
function target(flags) {
|
|
@@ -643,8 +764,15 @@ function install(args) {
|
|
|
643
764
|
console.log(`\n${withHooks.join(", ")} declare hooks — re-run with --with-hooks to wire them (git pre-commit reminders / session-start context).`);
|
|
644
765
|
}
|
|
645
766
|
|
|
646
|
-
if (cat.source !== BUNDLED)
|
|
767
|
+
if (cat.source !== BUNDLED) {
|
|
647
768
|
console.log(`\nWARNING: third-party catalog '${cat.source}'. Skills are instructions your AI agent will follow — review each installed SKILL.md under ${dest} before first use. Install copied files only; nothing was executed.`);
|
|
769
|
+
// Supply-chain scan (RFC-0022): surface risky patterns at the moment of trust. Reports only —
|
|
770
|
+
// the files are already copied, and a match is a prompt to read, not a verdict.
|
|
771
|
+
const { total } = printScan(cat, names, { compact: true });
|
|
772
|
+
console.log(total
|
|
773
|
+
? `\n${total} pattern(s) worth reading before you trust these skills. Full detail: skilldrop scan --from ${cat.source}`
|
|
774
|
+
: "\nSupply-chain scan: no flagged patterns.");
|
|
775
|
+
}
|
|
648
776
|
if (ide === "generic")
|
|
649
777
|
console.log("wiring: attach each skill's SKILL.md to your agent (Continue/Cline: @file, Aider: /add, Codex: reference it from AGENTS.md) — see the repo README's per-IDE steps.");
|
|
650
778
|
for (const s of pipDeps)
|
|
@@ -687,8 +815,18 @@ function update(args) {
|
|
|
687
815
|
|
|
688
816
|
function outdated(args) {
|
|
689
817
|
const { dest, rows } = installedRows(args.flags);
|
|
690
|
-
if (!rows.length) return console.log(`nothing installed at ${dest}`);
|
|
691
818
|
const stale = rows.filter((r) => r.current && r.current !== r.installed);
|
|
819
|
+
if (args.flags.json)
|
|
820
|
+
return emitJSON({
|
|
821
|
+
dest,
|
|
822
|
+
count: rows.length,
|
|
823
|
+
outdatedCount: stale.length,
|
|
824
|
+
skills: rows.map((r) => ({
|
|
825
|
+
name: r.s, installed: r.installed, current: r.current,
|
|
826
|
+
source: r.src, outdated: !!(r.current && r.current !== r.installed),
|
|
827
|
+
})),
|
|
828
|
+
});
|
|
829
|
+
if (!rows.length) return console.log(`nothing installed at ${dest}`);
|
|
692
830
|
for (const r of stale) console.log(`${r.s}: installed ${r.installed}, current ${r.current} (${r.src})`);
|
|
693
831
|
console.log(stale.length ? `\n${stale.length} outdated — run: skilldrop update` : "everything up to date.");
|
|
694
832
|
}
|
|
@@ -712,6 +850,15 @@ function uninstall(args) {
|
|
|
712
850
|
function listAgents(args) {
|
|
713
851
|
const cat = resolveCatalog(args.flags.from);
|
|
714
852
|
const names = agentsIn(cat);
|
|
853
|
+
if (args.flags.json)
|
|
854
|
+
return emitJSON({
|
|
855
|
+
catalog: cat.source,
|
|
856
|
+
count: names.length,
|
|
857
|
+
agents: names.map((a) => {
|
|
858
|
+
const m = agentMeta(cat, a);
|
|
859
|
+
return { name: a, description: m.description || null, tools: m.tools || null, model: m.model || null };
|
|
860
|
+
}),
|
|
861
|
+
});
|
|
715
862
|
if (!names.length) return console.log(`catalog '${cat.source}' ships no agents.`);
|
|
716
863
|
const w = Math.max(...names.map((n) => n.length));
|
|
717
864
|
for (const a of names) {
|
|
@@ -779,6 +926,12 @@ function list(args) {
|
|
|
779
926
|
try { const m = manifestOf(cat, s); return [s, m.version || "?", (m.model && m.model.tier) || "?"]; }
|
|
780
927
|
catch (e) { return [s, "?", "?"]; }
|
|
781
928
|
});
|
|
929
|
+
if (args.flags.json)
|
|
930
|
+
return emitJSON({
|
|
931
|
+
catalog: cat.source,
|
|
932
|
+
count: rows.length,
|
|
933
|
+
skills: rows.map(([name, version, tier]) => ({ name, version, tier })),
|
|
934
|
+
});
|
|
782
935
|
const w = Math.max(...rows.map((r) => r[0].length));
|
|
783
936
|
for (const [s, v, t] of rows) console.log(`${s.padEnd(w)} ${v} ${t}`);
|
|
784
937
|
console.log(`\n${rows.length} skills in catalog '${cat.source}'. Details: skilldrop info <skill>`);
|
|
@@ -791,6 +944,21 @@ function info(args) {
|
|
|
791
944
|
const m = manifestOf(cat, s);
|
|
792
945
|
const ps = packsOf(cat) || {};
|
|
793
946
|
const inPacks = Object.entries(ps).filter(([, p]) => p.skills.includes(s)).map(([n]) => n);
|
|
947
|
+
const needsPip = ((m.deps || {}).pip || []).length > 0 || fs.existsSync(path.join(skillDir(cat, s), "requirements.txt"));
|
|
948
|
+
if (args.flags.json)
|
|
949
|
+
return emitJSON({
|
|
950
|
+
catalog: cat.source,
|
|
951
|
+
name: m.name,
|
|
952
|
+
version: m.version || null,
|
|
953
|
+
description: m.description || null,
|
|
954
|
+
tier: (m.model && m.model.tier) || null,
|
|
955
|
+
packs: inPacks,
|
|
956
|
+
related: m.related || [],
|
|
957
|
+
tags: m.tags || [],
|
|
958
|
+
deps: { pip: (m.deps || {}).pip || [], npm: (m.deps || {}).npm || [], requirementsTxt: needsPip },
|
|
959
|
+
env: { required: (m.env || {}).required || [], optional: (m.env || {}).optional || [] },
|
|
960
|
+
hooks: m.hooks || [],
|
|
961
|
+
});
|
|
794
962
|
console.log(`${m.name}@${m.version} (tier: ${(m.model && m.model.tier) || "n/a"})\n\n${m.description}\n`);
|
|
795
963
|
console.log(`catalog: ${cat.source}`);
|
|
796
964
|
console.log(`packs: ${inPacks.join(", ") || "-"}`);
|
|
@@ -803,6 +971,14 @@ function info(args) {
|
|
|
803
971
|
function listPacks(args) {
|
|
804
972
|
const cat = resolveCatalog(args.flags.from);
|
|
805
973
|
const ps = packsOf(cat);
|
|
974
|
+
if (args.flags.json)
|
|
975
|
+
return emitJSON({
|
|
976
|
+
catalog: cat.source,
|
|
977
|
+
count: ps ? Object.keys(ps).length : 0,
|
|
978
|
+
packs: Object.entries(ps || {}).map(([name, p]) => ({
|
|
979
|
+
name, description: p.description || null, skills: p.skills || [],
|
|
980
|
+
})),
|
|
981
|
+
});
|
|
806
982
|
if (!ps) return console.log(`catalog '${cat.source}' defines no packs.`);
|
|
807
983
|
const w = Math.max(...Object.keys(ps).map((n) => n.length));
|
|
808
984
|
for (const [n, p] of Object.entries(ps))
|
|
@@ -830,7 +1006,7 @@ function validateCmd(args) {
|
|
|
830
1006
|
|
|
831
1007
|
const args = parseArgs(process.argv.slice(2));
|
|
832
1008
|
const cmd = args._.shift();
|
|
833
|
-
const commands = { list, info, packs: listPacks, agents: listAgents, install, update, outdated, uninstall, validate: validateCmd };
|
|
1009
|
+
const commands = { list, info, packs: listPacks, agents: listAgents, install, update, outdated, uninstall, validate: validateCmd, scan };
|
|
834
1010
|
if (!cmd || cmd === "help" || args.flags.help) console.log(HELP);
|
|
835
1011
|
else if (commands[cmd]) commands[cmd](args);
|
|
836
1012
|
else die(`unknown command '${cmd}' — run: skilldrop help`);
|
package/model-routing.json
CHANGED
|
@@ -114,6 +114,10 @@
|
|
|
114
114
|
"slide-outliner": { "tier": "standard", "rationale": "Outlines a deck to a time budget. Structuring, not deep reasoning." },
|
|
115
115
|
"sonar-review": { "tier": "standard", "rationale": "Formats Sonar API findings into a report. The hard analysis is Sonar's; this is synthesis. Escalate on very large diffs." },
|
|
116
116
|
"ai-usage-report": { "tier": "standard", "rationale": "Tabulates telemetry into a report. Mostly mechanical, but the 'AI theater' effectiveness call needs judgment." },
|
|
117
|
+
"ai-readiness-assessment": { "tier": "standard", "rationale": "Scores six fixed dimensions against a rubric and ranks gaps by blocking order. Bounded structured judgment, not adversarial reasoning; escalate via ambiguous-input when the evidence is thin or contested." },
|
|
118
|
+
"ai-use-case-triage": { "tier": "standard", "rationale": "Scores candidates on weighted axes and forces a rejection list. Structured comparison with stated weights; escalate via ambiguous-input when candidates are numerous or the value data is contested." },
|
|
119
|
+
"ai-adoption-rollout": { "tier": "standard", "rationale": "Generates a phased people-rollout with gates and enablement from a stated tool and population. Structured planning against a fixed shape; escalate via ambiguous-input for large or politically contested rollouts." },
|
|
120
|
+
"ai-usage-policy": { "tier": "standard", "rationale": "Drafts a policy document against a fixed structure (tiers, behaviours, review matrix, exception route). Bounded generation; escalate via ambiguous-input where a regulatory regime is named or contested." },
|
|
117
121
|
"feature-implement-loop": { "tier": "standard", "rationale": "Code + test generation against acceptance criteria. The adversarial pass delegates to devils-advocate (heavy) where available; the loop itself is generation." },
|
|
118
122
|
"pre-merge-review": { "tier": "standard", "rationale": "Orchestration: runs a deterministic gate script, dispatches the (heavy) reviewer subagents, and renders a rule-based go/no-go. The adversarial reasoning is delegated to the panel, so the skill itself is coordination." },
|
|
119
123
|
"user-story-splitter": { "tier": "standard", "rationale": "Decomposes an epic into INVEST slices with testable ACs. Structured synthesis; escalation rules cover large or contradictory PRDs." },
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skilldrop-cli",
|
|
3
|
-
"version": "0.9.
|
|
4
|
-
"description": "Portable AI-agent skills for the deliverables knowledge workers ship
|
|
3
|
+
"version": "0.9.2",
|
|
4
|
+
"description": "Portable AI-agent skills for the deliverables knowledge workers ship — diagrams, ADRs, PRDs, runbooks, decks, reviews — installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Sanjay Ananthanarayan",
|
|
7
7
|
"url": "https://github.com/sananthanarayan"
|
package/packs.json
CHANGED
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"user-story-splitter",
|
|
39
39
|
"success-metrics",
|
|
40
40
|
"exec-summary",
|
|
41
|
-
"doc-critique"
|
|
41
|
+
"doc-critique",
|
|
42
|
+
"ai-use-case-triage"
|
|
42
43
|
]
|
|
43
44
|
},
|
|
44
45
|
"dev-team": {
|
|
@@ -83,7 +84,7 @@
|
|
|
83
84
|
]
|
|
84
85
|
},
|
|
85
86
|
"ai-engineering": {
|
|
86
|
-
"description": "
|
|
87
|
+
"description": "Adopt and build AI systems: readiness assessment, use-case triage, rollout and acceptable-use policy, plus agent loop design, subagent orchestration, spend budgets, agent security review, eval harnesses, AI-usage reporting, and the data contracts AI pipelines depend on.",
|
|
87
88
|
"skills": [
|
|
88
89
|
"agent-loop-design",
|
|
89
90
|
"subagent-design",
|
|
@@ -91,7 +92,11 @@
|
|
|
91
92
|
"agent-threat-model",
|
|
92
93
|
"llm-eval-harness",
|
|
93
94
|
"ai-usage-report",
|
|
94
|
-
"data-contract"
|
|
95
|
+
"data-contract",
|
|
96
|
+
"ai-readiness-assessment",
|
|
97
|
+
"ai-use-case-triage",
|
|
98
|
+
"ai-adoption-rollout",
|
|
99
|
+
"ai-usage-policy"
|
|
95
100
|
]
|
|
96
101
|
}
|
|
97
102
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"query": "Write an ADR for this decision",
|
|
4
|
+
"should_trigger": true
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
"query": "Document the 'we decided X because Y' moment as an architecture decision record",
|
|
8
|
+
"should_trigger": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"query": "Capture this architectural decision in MADR format",
|
|
12
|
+
"should_trigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"query": "We picked Postgres over Dynamo — record the decision properly",
|
|
16
|
+
"should_trigger": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"query": "Extract the decisions and owners from these meeting notes",
|
|
20
|
+
"should_trigger": false
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"query": "Write a full engineering design doc for this feature",
|
|
24
|
+
"should_trigger": false
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"query": "Critique the ADR I already wrote",
|
|
28
|
+
"should_trigger": false
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"query": "Convene a council to decide which database we should use",
|
|
32
|
+
"should_trigger": false
|
|
33
|
+
}
|
|
34
|
+
]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "adr-generator",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Write an ADR: we decided to use Postgres as our primary datastore instead of DynamoDB, because our access patterns are relational and the team already operates Postgres.",
|
|
7
|
+
"assertions": [
|
|
8
|
+
"Status is one of Proposed / Accepted / Deprecated / Superseded by ADR-NNNN, defaulting to Proposed unless the user says it was agreed",
|
|
9
|
+
"Title is a noun phrase naming the decision, not a verb phrase naming the activity",
|
|
10
|
+
"Consequences include real trade-offs and downsides, not only upsides",
|
|
11
|
+
"The alternatives considered each carry a why-not, not just a description",
|
|
12
|
+
"The chosen format is MADR by default; Nygard only when explicitly requested",
|
|
13
|
+
"No invented context — facts not supplied by the user are marked rather than fabricated"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ai-adoption-rollout
|
|
3
|
+
description: Plan the human rollout of an AI tool or workflow to an organisation — sized cohorts, enablement per cohort, named champions, a comms plan that states what will not change, and an adoption gate every wave must pass before the next one opens. Use when a tool has been chosen and the question is how it reaches people without stalling or backlash. Do NOT use to phase a technical cutover (that's migration-plan) or to choose which use case to roll out (that's ai-use-case-triage).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ai-adoption-rollout
|
|
7
|
+
|
|
8
|
+
The tool is chosen; the risk now is **people**. This plans the human rollout: who gets it when, what they're taught, who they ask, what they're told, and the observable that must hold before the next cohort opens.
|
|
9
|
+
|
|
10
|
+
Rollouts fail quietly. Licences get assigned, a launch email goes out, usage spikes for a week and decays, and nobody can say which step failed. Every wave here carries a gate so that decay is visible while it's still fixable.
|
|
11
|
+
|
|
12
|
+
## How to respond
|
|
13
|
+
|
|
14
|
+
1. **Restate what's being rolled out, to whom, and the adoption outcome.** Not "increase AI usage" — a behaviour: "support agents draft first responses with assistance on the top 3 categories". Usage is a proxy; the behaviour is the goal. Cap clarifying questions at 2.
|
|
15
|
+
|
|
16
|
+
2. **Design cohorts, smallest first.** Default three waves — **pilot** (5–15 volunteers, highest tolerance) → **early** (one whole team or function, includes sceptics) → **general**. Each cohort names who is in it and *why they're next*: the pilot proves the workflow, the early wave proves it survives people who didn't ask for it. Skipping straight to general is the most common failure and this skill refuses it.
|
|
17
|
+
|
|
18
|
+
3. **Specify enablement per cohort, not one training deck.** What each cohort must be able to *do* before they're counted as enabled — a 30-minute hands-on with their own real task beats an hour of slides. Name the format, the time cost, and who delivers it. Later cohorts get shorter enablement built from what the pilot actually got stuck on.
|
|
19
|
+
|
|
20
|
+
4. **Name champions by role, with a time budget.** One per cohort, with hours protected. An unbudgeted champion is a volunteer who quietly stops answering. State what they own: first-line questions, collecting friction, running the office hour.
|
|
21
|
+
|
|
22
|
+
5. **Write the comms plan — including what will not change.** Three messages: the announcement (what, why, what's in it for the reader), the reassurance (**explicitly: whether this affects headcount, evaluation, or how work is judged**), and the follow-up. Silence on the reassurance point is read as bad news and is the single biggest driver of quiet non-adoption.
|
|
23
|
+
|
|
24
|
+
6. **Put an adoption gate on every wave.** Observable, with a threshold and a bake time, before the next cohort opens. ✅ "≥60% of the pilot used it on a real task in week 2, and no unresolved 🟥 issue in the friction log — hold 1 week." A gate that is "the pilot went well" is not a gate. Each wave also names its **rollback**: what happens if the gate fails — extend, narrow, or stop.
|
|
25
|
+
|
|
26
|
+
7. **Name the friction loop.** Where friction is captured, who triages it weekly, and how a fix reaches the next cohort. A rollout with no feedback path teaches the organisation that complaints go nowhere.
|
|
27
|
+
|
|
28
|
+
## Quality bar
|
|
29
|
+
|
|
30
|
+
- **Cohorts get smaller-to-larger with a stated reason each**, and the plan refuses a single big-bang wave.
|
|
31
|
+
- **Every wave has an adoption gate with an observable, a threshold, and a bake time** — plus a rollback if it fails.
|
|
32
|
+
- **The outcome is a behaviour, not a usage number.** Licences activated is not adoption.
|
|
33
|
+
- **The comms plan states explicitly what will not change** (headcount, evaluation, how work is judged). Omitting it is a defect, not a tone choice.
|
|
34
|
+
- **Champions are roles with protected hours**, never names, and never unbudgeted.
|
|
35
|
+
- **Enablement is per cohort and hands-on with the participant's own work** — a single deck for everyone is the failure mode.
|
|
36
|
+
- **The friction loop names an owner and a cadence.**
|
|
37
|
+
|
|
38
|
+
## When to use this skill
|
|
39
|
+
|
|
40
|
+
- ✅ A tool or AI workflow is chosen and now has to reach real people.
|
|
41
|
+
- ✅ A previous rollout decayed after launch and you're planning the retry.
|
|
42
|
+
- ✅ Leadership wants a timeline with checkpoints rather than a launch date.
|
|
43
|
+
|
|
44
|
+
## When NOT to use this skill
|
|
45
|
+
|
|
46
|
+
- ❌ Phasing a *technical* cutover (schema, API version, datastore) — that's `migration-plan`, which sequences systems, not people.
|
|
47
|
+
- ❌ Choosing which use case to roll out — that's [`ai-use-case-triage`](../ai-use-case-triage/SKILL.md).
|
|
48
|
+
- ❌ Deciding whether the organisation is ready at all — that's [`ai-readiness-assessment`](../ai-readiness-assessment/SKILL.md).
|
|
49
|
+
- ❌ Writing the rules for what may be put into the tool — that's [`ai-usage-policy`](../ai-usage-policy/SKILL.md).
|
|
50
|
+
- ❌ Reporting on adoption that already happened — that's `ai-usage-report`.
|
|
51
|
+
|
|
52
|
+
## Anti-patterns to avoid
|
|
53
|
+
|
|
54
|
+
- ❌ **Big-bang rollout.** Everyone at once means no cohort to learn from and no way to stop. The gate structure exists to prevent exactly this.
|
|
55
|
+
- ❌ **Counting licences as adoption.** Seats assigned, logins, "activated users" — all measure procurement, not behaviour change.
|
|
56
|
+
- ❌ **A launch email as the comms plan.** One announcement with no reassurance and no follow-up is how a rollout gets read as a threat.
|
|
57
|
+
- ❌ **Champions with no time.** Naming an enthusiastic person and adding nothing to their calendar is delegation of blame.
|
|
58
|
+
- ❌ **Training everyone identically.** The pilot's stumbling blocks should shorten the next cohort's enablement; if the deck never changes, nobody was listening.
|
|
59
|
+
- ❌ **A gate with no rollback.** "Proceed if it goes well" is not a decision rule — say what happens when it doesn't.
|
|
60
|
+
|
|
61
|
+
**Non-interactive:** with no user to ask, derive cohorts from the stated org size and tag them `[assumption]`. If the input names no tool or workflow to roll out — only a wish to "drive AI adoption" — emit `BLOCKED: need the specific tool or workflow being rolled out and the population it reaches`.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"query": "Plan how we roll this AI tool out to the org",
|
|
4
|
+
"should_trigger": true
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
"query": "How do we drive adoption without a backlash?",
|
|
8
|
+
"should_trigger": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"query": "Design the cohorts and enablement for our AI launch",
|
|
12
|
+
"should_trigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"query": "Our last AI rollout decayed after launch — plan the retry",
|
|
16
|
+
"should_trigger": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"query": "Plan the phased migration of our database schema",
|
|
20
|
+
"should_trigger": false
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"query": "Which use case should we roll out first?",
|
|
24
|
+
"should_trigger": false
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"query": "Write the rules for what people can put into these tools",
|
|
28
|
+
"should_trigger": false
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"query": "Report on how much AI our team is using",
|
|
32
|
+
"should_trigger": false
|
|
33
|
+
}
|
|
34
|
+
]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "ai-adoption-rollout",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "We've picked an AI assistant for our 300-person support org. Plan the rollout.",
|
|
7
|
+
"assertions": [
|
|
8
|
+
"Cohorts are sized smallest-first (pilot, early, general) with a stated reason each cohort is next",
|
|
9
|
+
"A single big-bang wave is explicitly refused",
|
|
10
|
+
"Every wave has an adoption gate with an observable, a threshold, and a bake time, plus a rollback if the gate fails",
|
|
11
|
+
"The adoption outcome is stated as a behaviour rather than a usage or licence number",
|
|
12
|
+
"The comms plan explicitly states what will not change regarding headcount, evaluation, or how work is judged",
|
|
13
|
+
"Champions are named as roles with protected hours",
|
|
14
|
+
"Enablement differs per cohort and is hands-on with the participant's own work",
|
|
15
|
+
"A friction loop names an owner and a cadence"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ai-adoption-rollout",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Plan the human rollout of an AI tool or workflow to an organisation — sized cohorts, enablement per cohort, named champions, a comms plan that states what will not change, and an adoption gate every wave must pass before the next one opens. Use when a tool has been chosen and the question is how it reaches people without stalling or backlash. Do NOT use to phase a technical cutover (that's migration-plan) or to choose which use case to roll out (that's ai-use-case-triage).",
|
|
5
|
+
"entrypoint": "SKILL.md",
|
|
6
|
+
"deps": {
|
|
7
|
+
"npm": [],
|
|
8
|
+
"pip": []
|
|
9
|
+
},
|
|
10
|
+
"env": {
|
|
11
|
+
"required": [],
|
|
12
|
+
"optional": []
|
|
13
|
+
},
|
|
14
|
+
"related": [
|
|
15
|
+
"ai-readiness-assessment",
|
|
16
|
+
"ai-usage-policy",
|
|
17
|
+
"ai-usage-report",
|
|
18
|
+
"ai-use-case-triage",
|
|
19
|
+
"migration-plan"
|
|
20
|
+
],
|
|
21
|
+
"tags": [
|
|
22
|
+
"ai-adoption",
|
|
23
|
+
"rollout",
|
|
24
|
+
"change-management",
|
|
25
|
+
"enablement",
|
|
26
|
+
"cohorts",
|
|
27
|
+
"comms"
|
|
28
|
+
],
|
|
29
|
+
"model": {
|
|
30
|
+
"tier": "standard",
|
|
31
|
+
"rationale": "Generates a phased people-rollout with gates and enablement from a stated tool and population. Structured planning against a fixed shape; escalate via ambiguous-input for large or politically contested rollouts."
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ai-readiness-assessment
|
|
3
|
+
description: Score an organisation's or team's readiness to adopt AI tooling across six gating dimensions — data, tooling, skills, governance, process, and culture — with an evidence line per score and the blocking gaps ranked by what stops adoption first. Use when the user asks "are we ready for AI", wants an AI maturity or readiness baseline, or needs to know what to fix before rolling tools out. Do NOT use to pick which use cases to build (that's ai-use-case-triage) or to plan the rollout itself (that's ai-adoption-rollout).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ai-readiness-assessment
|
|
7
|
+
|
|
8
|
+
Produce a **baseline a leadership team can act on**: where the organisation actually stands on the six things that gate AI adoption, what the evidence is for each score, and which gaps block adoption *first*. The output is a scored table plus a ranked gap list — not a maturity label and not a slide.
|
|
9
|
+
|
|
10
|
+
Readiness assessments fail in one of two ways: a number with no evidence behind it, or a diagnosis with no next action. This skill refuses both.
|
|
11
|
+
|
|
12
|
+
## How to respond
|
|
13
|
+
|
|
14
|
+
1. **Establish scope and the decision it feeds.** Whose readiness — one team, a function, the whole company? And what happens with the answer (a go/no-go, a budget request, a sequencing decision)? Scope changes what counts as evidence. Cap clarifying questions at 2.
|
|
15
|
+
|
|
16
|
+
2. **Score the six dimensions.** These are fixed — do not invent new ones for a single engagement, and do not drop one because it's awkward to assess. Score each **0–4** (0 absent · 1 ad hoc · 2 repeatable · 3 managed · 4 optimised):
|
|
17
|
+
|
|
18
|
+
| Dimension | The question it answers |
|
|
19
|
+
|---|---|
|
|
20
|
+
| **Data** | Is the material these tools need reachable, current, and permitted to be used? |
|
|
21
|
+
| **Tooling** | Are licences, access, and environments actually in people's hands? |
|
|
22
|
+
| **Skills** | Can people write a decent prompt, judge an output, and know when not to trust it? |
|
|
23
|
+
| **Governance** | Is there a rule for what may be put in, and a named owner for it? |
|
|
24
|
+
| **Process** | Does the workflow have a place for a machine draft plus a human review gate? |
|
|
25
|
+
| **Culture** | Is the incentive to use it, or to hide that it was used? |
|
|
26
|
+
|
|
27
|
+
3. **Attach evidence to every score.** One line naming what you observed — a system, a document, a stated practice, a number. A score with no evidence line is deleted, not softened. Where the input doesn't support a score, emit `[insufficient evidence: <what to collect>]` rather than guessing a middle number.
|
|
28
|
+
|
|
29
|
+
4. **Rank the gaps by what blocks first, not by what scores lowest.** A 1 in Governance that blocks every use case outranks a 0 in Culture that blocks nothing yet. Name the dependency: "Skills cannot move until Tooling ≥ 2 — people can't practise on access they don't have."
|
|
30
|
+
|
|
31
|
+
5. **Give each gap a first action and an owner role.** Concrete and small enough to start this quarter. ❌ "Improve data governance." ✅ "Name a data owner for the three systems in scope and publish an allowed-use tier for each — legal + platform lead, 2 weeks."
|
|
32
|
+
|
|
33
|
+
6. **State the overall posture in one sentence, and what would change it.** ✅ "Ready for a bounded pilot in engineering; not ready for company-wide rollout until Governance reaches 2." Never a bare maturity label.
|
|
34
|
+
|
|
35
|
+
## Quality bar
|
|
36
|
+
|
|
37
|
+
- **Every score carries an evidence line.** A number with nothing behind it is the failure mode this skill exists to prevent — cut it or mark it `[insufficient evidence]`.
|
|
38
|
+
- **All six dimensions appear**, including the ones the input is thin on. Silence on a dimension reads as a pass, and that's how readiness reports mislead.
|
|
39
|
+
- **Gaps are ranked by blocking order, not by score.** The lowest number is not automatically the first problem, and the plan must say why.
|
|
40
|
+
- **Every gap has a first action and an owner role** — a role, never a person's name, so the assessment doesn't go stale when someone changes teams.
|
|
41
|
+
- **The posture sentence takes a position** and names the condition that would change it. "It depends" is a refusal to do the job.
|
|
42
|
+
- **No invented facts.** Where the input is silent, say so; a fabricated observation is worse than an admitted gap.
|
|
43
|
+
|
|
44
|
+
## When to use this skill
|
|
45
|
+
|
|
46
|
+
- ✅ "Are we ready to roll out AI tooling?" — before committing budget or a timeline.
|
|
47
|
+
- ✅ Establishing a baseline to re-measure against in two quarters.
|
|
48
|
+
- ✅ A leadership team disagrees about whether the blocker is tools, skills, or policy.
|
|
49
|
+
|
|
50
|
+
## When NOT to use this skill
|
|
51
|
+
|
|
52
|
+
- ❌ Choosing *which* workflows to automate — that's [`ai-use-case-triage`](../ai-use-case-triage/SKILL.md).
|
|
53
|
+
- ❌ Planning the rollout once you've decided to go — that's [`ai-adoption-rollout`](../ai-adoption-rollout/SKILL.md).
|
|
54
|
+
- ❌ Writing the rules for what people may put into a tool — that's [`ai-usage-policy`](../ai-usage-policy/SKILL.md).
|
|
55
|
+
- ❌ A market or competitive question ("should we enter this space?") — that's `strategy-analysis`.
|
|
56
|
+
- ❌ Measuring adoption that has already happened — that's `ai-usage-report`.
|
|
57
|
+
|
|
58
|
+
## Anti-patterns to avoid
|
|
59
|
+
|
|
60
|
+
- ❌ **A maturity label as the deliverable.** "You are Level 2 of 5" tells a leader nothing they can fund. The ranked gap list is the product; the score is just its index.
|
|
61
|
+
- ❌ **Scoring what's easy to score.** Tooling is countable, Culture is not — and a report that goes deep on licences and hand-waves incentives has measured the wrong thing.
|
|
62
|
+
- ❌ **Middle scores as a hedge.** A 2 everywhere means the assessment refused to commit. If the evidence is thin, say `[insufficient evidence]` and name what to collect.
|
|
63
|
+
- ❌ **Gaps with no owner.** An unowned action is a wish. Roles, not names.
|
|
64
|
+
- ❌ **Recommending tools.** This assesses readiness; vendor selection is a different decision (`tech-comparison-matrix`) and mixing them lets a vendor pitch masquerade as a diagnosis.
|
|
65
|
+
|
|
66
|
+
**Non-interactive:** with no user to ask, derive the scope from the input and tag it `[assumption]`. If the input contains no observable evidence for any dimension — a request with no organisational context — emit `BLOCKED: need observable context (systems, current practice, or stated policy) for at least three dimensions` rather than scoring from imagination.
|