skilldrop-cli 0.16.12 → 0.16.13
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/bin/skilldrop.js +36 -11
- package/catalogue.json +8 -6
- package/contracts/catalogue.schema.json +15 -1
- package/model-routing.json +1 -17
- package/package.json +1 -1
- package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +1 -1
- package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +2 -3
- package/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +1 -1
- package/packs/ai-engineering/skills/llm-eval-harness/manifest.json +2 -2
- package/packs/api-builder/pack.json +1 -1
- package/packs/api-builder/skills/eval-harness-generator/SKILL.md +1 -1
- package/packs/api-builder/skills/eval-harness-generator/manifest.json +2 -2
- package/packs/api-builder/skills/tool-use-schema-writer/SKILL.md +3 -3
- package/packs/api-builder/skills/tool-use-schema-writer/evals/evals.json +1 -1
- package/packs/api-builder/skills/tool-use-schema-writer/manifest.json +2 -2
- package/packs/core/skills/brief-intake/SKILL.md +2 -2
- package/packs/core/skills/brief-intake/manifest.json +3 -3
- package/packs/core/skills/brief-intake/templates/brief-tech-comparison.md +1 -1
- package/packs/core/skills/council-review/SKILL.md +2 -2
- package/packs/core/skills/council-review/manifest.json +2 -2
- package/packs/core/skills/council-review/reference.md +0 -1
- package/packs/core/skills/doc-critique/SKILL.md +1 -1
- package/packs/core/skills/doc-critique/manifest.json +2 -2
- package/packs/core/skills/doc-critique/rubrics/tech-comparison.md +1 -1
- package/packs/data-analytics/pack.json +8 -14
- package/packs/data-analytics/skills/dashboard-spec/SKILL.md +2 -2
- package/packs/data-analytics/skills/dashboard-spec/examples/support-staffing.md +1 -1
- package/packs/data-analytics/skills/dashboard-spec/manifest.json +1 -10
- package/packs/data-analytics/skills/dashboard-spec/templates/dashboard-spec.md +1 -1
- package/packs/data-analytics/skills/sql-review/SKILL.md +2 -2
- package/packs/data-analytics/skills/sql-review/manifest.json +1 -11
- package/packs/dev-team/skills/migration-plan/SKILL.md +1 -1
- package/packs/dev-team/skills/migration-plan/manifest.json +2 -2
- package/packs/product-manager/skills/business-case/SKILL.md +2 -2
- package/packs/product-manager/skills/business-case/manifest.json +3 -3
- package/packs/product-manager/skills/strategy-analysis/SKILL.md +3 -3
- package/packs/product-manager/skills/strategy-analysis/evals/evals.json +1 -1
- package/packs/product-manager/skills/strategy-analysis/manifest.json +2 -3
- package/packs/research/skills/hypothesis-comparison/SKILL.md +3 -3
- package/packs/research/skills/hypothesis-comparison/manifest.json +2 -3
- package/packs/research/skills/research-plan/SKILL.md +0 -1
- package/packs/research/skills/research-plan/manifest.json +2 -3
- package/packs/skill-engineering/skills/skill-author/SKILL.md +1 -1
- package/packs/skill-engineering/skills/skill-author/manifest.json +1 -2
- package/packs/skill-engineering/skills/skill-review/SKILL.md +1 -1
- package/packs/skill-engineering/skills/skill-review/manifest.json +1 -2
- package/packs/solution-architect/skills/api-contract-draft/SKILL.md +1 -1
- package/packs/solution-architect/skills/api-contract-draft/manifest.json +2 -2
- package/packs/data-analytics/skills/metric-definition/SKILL.md +0 -92
- package/packs/data-analytics/skills/metric-definition/evals/eval_queries.json +0 -34
- package/packs/data-analytics/skills/metric-definition/evals/evals.json +0 -79
- package/packs/data-analytics/skills/metric-definition/evals/files/2/tables.md +0 -42
- package/packs/data-analytics/skills/metric-definition/evals/files/2/thread.md +0 -40
- package/packs/data-analytics/skills/metric-definition/evals/files/4/tables.md +0 -32
- package/packs/data-analytics/skills/metric-definition/evals/files/4/thread.md +0 -31
- package/packs/data-analytics/skills/metric-definition/examples/refund-rate.md +0 -104
- package/packs/data-analytics/skills/metric-definition/manifest.json +0 -41
- package/packs/data-analytics/skills/metric-definition/reference.md +0 -67
- package/packs/data-analytics/skills/metric-definition/templates/metric-spec.md +0 -70
- package/packs/dev-team/skills/contribution-wizard/SKILL.md +0 -142
- package/packs/dev-team/skills/contribution-wizard/evals/eval_queries.json +0 -30
- package/packs/dev-team/skills/contribution-wizard/evals/evals.json +0 -78
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/AGENTS.md +0 -9
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/CATALOG.md +0 -18
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/CONTRIBUTING.md +0 -45
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/OWNERS.md +0 -7
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/INSTRUCTIONS.md +0 -20
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/skill.yaml +0 -11
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/tests/cases.yaml +0 -25
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/INSTRUCTIONS.md +0 -20
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/skill.yaml +0 -8
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/tests/cases.yaml +0 -32
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/CONTRIBUTING.md +0 -63
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/registry.json +0 -15
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/PROMPT.md +0 -10
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-expected.md +0 -2
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-input.md +0 -3
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-expected.md +0 -1
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-input.md +0 -2
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-expected.md +0 -1
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-input.md +0 -2
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/meta.json +0 -7
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/PROMPT.md +0 -11
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-expected.md +0 -4
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-input.md +0 -4
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-expected.md +0 -6
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-input.md +0 -2
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-expected.md +0 -1
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-input.md +0 -1
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/skill.toml +0 -6
- package/packs/dev-team/skills/contribution-wizard/manifest.json +0 -11
- package/packs/solution-architect/skills/db-schema-design/SKILL.md +0 -76
- package/packs/solution-architect/skills/db-schema-design/evals/eval_queries.json +0 -34
- package/packs/solution-architect/skills/db-schema-design/evals/evals.json +0 -75
- package/packs/solution-architect/skills/db-schema-design/evals/files/2/current_tables.sql +0 -29
- package/packs/solution-architect/skills/db-schema-design/evals/files/2/notes.md +0 -53
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/finance-email.md +0 -18
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/members_sample.csv +0 -5
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/points_txn_sample.csv +0 -17
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/requirements.md +0 -28
- package/packs/solution-architect/skills/db-schema-design/manifest.json +0 -11
- package/packs/solution-architect/skills/db-schema-design/reference.md +0 -56
- package/packs/solution-architect/skills/db-schema-design/templates/schema-design.md +0 -75
- package/packs/solution-architect/skills/tech-comparison-matrix/SKILL.md +0 -64
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/eval_queries.json +0 -30
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/evals.json +0 -76
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/2/requirements.md +0 -20
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/2/vendor-notes.md +0 -29
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/4/mobile-options.md +0 -45
- package/packs/solution-architect/skills/tech-comparison-matrix/examples/queue-selection.md +0 -41
- package/packs/solution-architect/skills/tech-comparison-matrix/manifest.json +0 -11
- package/packs/solution-architect/skills/tech-comparison-matrix/templates/matrix.md +0 -45
package/bin/skilldrop.js
CHANGED
|
@@ -226,7 +226,8 @@ function readPacksCatalog(dir, source) {
|
|
|
226
226
|
? fs.readdirSync(d).filter((x) => fs.existsSync(path.join(d, x, marker))).sort() : [];
|
|
227
227
|
const onDisk = children(packsDir, "pack.json");
|
|
228
228
|
const idx = path.join(dir, "catalogue.json");
|
|
229
|
-
const
|
|
229
|
+
const index = fs.existsSync(idx) ? readJSON(idx) : {};
|
|
230
|
+
const listed = (index.packs || []).filter((p) => onDisk.includes(p));
|
|
230
231
|
const order = [...listed, ...onDisk.filter((p) => !listed.includes(p))];
|
|
231
232
|
const skillIndex = {}, loopIndex = {}, packsData = {};
|
|
232
233
|
for (const pack of order) {
|
|
@@ -237,7 +238,15 @@ function readPacksCatalog(dir, source) {
|
|
|
237
238
|
for (const l of loops) if (!loopIndex[l]) loopIndex[l] = path.join(pdir, "loops", l);
|
|
238
239
|
packsData[pack] = Object.assign({}, readJSON(path.join(pdir, "pack.json")), { skills, loops });
|
|
239
240
|
}
|
|
240
|
-
return { dir, source, shape: "packs", skillIndex, loopIndex, packsData };
|
|
241
|
+
return { dir, source, shape: "packs", skillIndex, loopIndex, packsData, retired: index.retired || {} };
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* RFC-0046: a skill that left the catalogue keeps a record in catalogue.json `retired`, so an
|
|
245
|
+
installed copy can say why it stopped updating instead of looking like an unreachable source. */
|
|
246
|
+
function retiredNote(cat, s) {
|
|
247
|
+
const r = cat && cat.retired && cat.retired[s];
|
|
248
|
+
if (!r) return null;
|
|
249
|
+
return `'${s}' was retired in ${r.in}: ${r.why}` + (r.instead ? ` Use ${r.instead} instead.` : "");
|
|
241
250
|
}
|
|
242
251
|
|
|
243
252
|
/* Minimal TOML read — the [pack] table's basic-string scalars (name, version, description).
|
|
@@ -589,6 +598,12 @@ function target(flags) {
|
|
|
589
598
|
return { dest: path.join(os.homedir(), ...user), ide };
|
|
590
599
|
}
|
|
591
600
|
|
|
601
|
+
/* The target flags again, for a command line printed back to the user. */
|
|
602
|
+
function targetHint(flags) {
|
|
603
|
+
if (flags.dest) return ` --dest ${JSON.stringify(flags.dest)}`;
|
|
604
|
+
return (flags.ide && flags.ide !== "claude" ? ` --ide ${flags.ide}` : "") + (flags.local ? " --local" : flags.project ? " --project" : "");
|
|
605
|
+
}
|
|
606
|
+
|
|
592
607
|
/* Claude Code tool name -> Kiro built-in tool name. Confirmed against
|
|
593
608
|
kiro.dev/docs/cli/reference/built-in-tools/ — not inferred. Agent configs use these
|
|
594
609
|
simplified names; Kiro's *hook* matchers use internal names (fs_read, execute_bash)
|
|
@@ -985,7 +1000,7 @@ function expandNames(args, cat) {
|
|
|
985
1000
|
return packMembers(ps, args.flags.pack, "skills");
|
|
986
1001
|
}
|
|
987
1002
|
if (!args._.length) die("nothing to install — pass skill names, --pack <name>, or --all");
|
|
988
|
-
for (const s of args._) if (!skillExists(cat, s)) die(`unknown skill '${s}' in catalog '${cat.source}'`);
|
|
1003
|
+
for (const s of args._) if (!skillExists(cat, s)) die(retiredNote(cat, s) || `unknown skill '${s}' in catalog '${cat.source}'`);
|
|
989
1004
|
return args._.slice();
|
|
990
1005
|
}
|
|
991
1006
|
|
|
@@ -1285,11 +1300,12 @@ function installedRows(flags) {
|
|
|
1285
1300
|
const l = ledger(dest);
|
|
1286
1301
|
const rows = Object.keys(l.data).sort().map((s) => {
|
|
1287
1302
|
const src = lsrc(l.data[s]);
|
|
1288
|
-
let current = null, cat = null, changed = [];
|
|
1303
|
+
let current = null, cat = null, changed = [], retired = null;
|
|
1289
1304
|
const entry = l.data[s];
|
|
1290
1305
|
const loop = isLoopEntry(entry);
|
|
1291
1306
|
try {
|
|
1292
1307
|
cat = resolveCatalog(src === BUNDLED ? undefined : src);
|
|
1308
|
+
if (!loop && !unitExists(cat, s, loop)) retired = retiredNote(cat, s);
|
|
1293
1309
|
if (unitExists(cat, s, loop)) {
|
|
1294
1310
|
current = unitMeta(cat, s, loop).version || null;
|
|
1295
1311
|
// Same version, different files: the catalog changed the skill without bumping it.
|
|
@@ -1301,7 +1317,7 @@ function installedRows(flags) {
|
|
|
1301
1317
|
}
|
|
1302
1318
|
}
|
|
1303
1319
|
} catch (e) { /* unreachable source: current stays null */ }
|
|
1304
|
-
return { s, src, cat, loop, installed: lver(entry), current, changed, pinned: isPinned(src) };
|
|
1320
|
+
return { s, src, cat, loop, installed: lver(entry), current, changed, retired, pinned: isPinned(src) };
|
|
1305
1321
|
});
|
|
1306
1322
|
return { dest, ide, l, rows };
|
|
1307
1323
|
}
|
|
@@ -1325,6 +1341,7 @@ function update(args) {
|
|
|
1325
1341
|
let n = 0, conflicts = 0;
|
|
1326
1342
|
const silent = rows.filter((r) => r.current === r.installed && r.changed.length && !args.flags.changed);
|
|
1327
1343
|
for (const r of rows) {
|
|
1344
|
+
if (r.retired) { console.log(`skip ${r.retired}\n Remove it with: skilldrop uninstall ${r.s}${targetHint(args.flags)}`); continue; }
|
|
1328
1345
|
if (!r.current) { console.log(`skip ${unitLabel(r)}: source '${r.src}' unreachable, ${r.loop ? "loop" : "skill"} gone from it, or no version to compare`); continue; }
|
|
1329
1346
|
if (!isDue(r)) continue;
|
|
1330
1347
|
const problems = unitCheck(r.cat, r.s, r.loop);
|
|
@@ -1346,7 +1363,7 @@ function update(args) {
|
|
|
1346
1363
|
n++;
|
|
1347
1364
|
}
|
|
1348
1365
|
saveLedger(l);
|
|
1349
|
-
console.log(n ? `\n${n} skill(s) or loop(s) updated.` : (silent.length ? "no version changes." : "everything up to date."));
|
|
1366
|
+
console.log(n ? `\n${n} skill(s) or loop(s) updated.` : (silent.length ? "no version changes." : rows.some((r) => r.retired) ? "nothing else to update." : "everything up to date."));
|
|
1350
1367
|
if (silent.length)
|
|
1351
1368
|
console.log(`\nNot taken: ${silent.map((r) => r.s).join(", ")} changed upstream without a version bump.` +
|
|
1352
1369
|
`\n Read the change (skilldrop diff <skill>), then take it with: skilldrop update --changed`);
|
|
@@ -1371,6 +1388,7 @@ function planUpdate(dest, ide, l, rows, flags) {
|
|
|
1371
1388
|
console.log(`dry run — nothing will be written. Target: ${dest} (${ide})\n`);
|
|
1372
1389
|
let n = 0;
|
|
1373
1390
|
for (const r of rows) {
|
|
1391
|
+
if (r.retired) { console.log(`would skip ${r.retired}`); continue; }
|
|
1374
1392
|
if (!r.current) { console.log(`would skip ${unitLabel(r)}: source '${r.src}' unreachable, ${r.loop ? "loop" : "skill"} gone from it, or no version to compare`); continue; }
|
|
1375
1393
|
if (r.current === r.installed && !r.changed.length) continue;
|
|
1376
1394
|
if (r.current === r.installed && !flags.changed) {
|
|
@@ -1392,33 +1410,38 @@ function planUpdate(dest, ide, l, rows, flags) {
|
|
|
1392
1410
|
for (const f of orphaned) console.log(` would keep ${f} — dropped upstream, but you edited it`);
|
|
1393
1411
|
}
|
|
1394
1412
|
const held = rows.filter((r) => r.current && r.current === r.installed && r.changed.length && !flags.changed).length;
|
|
1395
|
-
console.log(n ? `\n${n} skill(s) or loop(s) would update. Rerun without --dry-run to apply.` : (held ? "no version changes." : "everything up to date."));
|
|
1413
|
+
console.log(n ? `\n${n} skill(s) or loop(s) would update. Rerun without --dry-run to apply.` : (held ? "no version changes." : rows.some((r) => r.retired) ? "nothing else to update." : "everything up to date."));
|
|
1396
1414
|
}
|
|
1397
1415
|
|
|
1398
1416
|
function outdated(args) {
|
|
1399
1417
|
const { dest, rows } = installedRows(args.flags);
|
|
1400
1418
|
const stale = rows.filter((r) => r.current && r.current !== r.installed);
|
|
1401
1419
|
const drift = rows.filter((r) => r.changed && r.changed.length);
|
|
1420
|
+
const gone = rows.filter((r) => r.retired);
|
|
1402
1421
|
if (args.flags.json)
|
|
1403
1422
|
return emitJSON({
|
|
1404
1423
|
dest,
|
|
1405
1424
|
count: rows.length,
|
|
1406
1425
|
outdatedCount: stale.length,
|
|
1407
1426
|
changedWithoutVersionCount: drift.length,
|
|
1427
|
+
retiredCount: gone.length,
|
|
1408
1428
|
skills: rows.map((r) => ({
|
|
1409
1429
|
name: r.s, loop: r.loop, installed: r.installed, current: r.current,
|
|
1410
1430
|
source: r.src, outdated: !!(r.current && r.current !== r.installed),
|
|
1411
|
-
changedWithoutVersion: r.changed || [], pinned: r.pinned,
|
|
1431
|
+
changedWithoutVersion: r.changed || [], pinned: r.pinned, retired: r.retired,
|
|
1412
1432
|
})),
|
|
1413
1433
|
});
|
|
1414
1434
|
if (!rows.length) return console.log(`nothing installed at ${dest}`);
|
|
1415
1435
|
for (const r of stale) console.log(`${unitLabel(r)}: installed ${r.installed}, current ${r.current} (${r.src})`);
|
|
1416
1436
|
for (const r of drift)
|
|
1417
1437
|
console.log(`${unitLabel(r)}: ${r.changed.length} file(s) changed in '${r.src}' without a version bump (${r.changed.slice(0, 3).join(", ")}${r.changed.length > 3 ? ", …" : ""})`);
|
|
1438
|
+
for (const r of gone) console.log(r.retired);
|
|
1418
1439
|
if (drift.length)
|
|
1419
1440
|
console.log(`\n${drift.length} skill(s) changed upstream with the same version. Read the change first (skilldrop diff <skill>),` +
|
|
1420
1441
|
`\nthen take it with: skilldrop update --changed`);
|
|
1421
|
-
|
|
1442
|
+
if (gone.length)
|
|
1443
|
+
console.log(`\n${gone.length} retired skill(s) will not update. Keep them as they are, or remove them: skilldrop uninstall ${gone.map((r) => r.s).join(" ")}${targetHint(args.flags)}`);
|
|
1444
|
+
console.log(stale.length ? `\n${stale.length} outdated — run: skilldrop update` : (drift.length || gone.length ? "" : "everything up to date."));
|
|
1422
1445
|
}
|
|
1423
1446
|
|
|
1424
1447
|
function uninstall(args) {
|
|
@@ -1470,7 +1493,7 @@ function diff(args) {
|
|
|
1470
1493
|
const loop = isLoopEntry(entry);
|
|
1471
1494
|
const src = args.flags.from || (entry ? lsrc(entry) : BUNDLED);
|
|
1472
1495
|
const cat = resolveCatalog(src === BUNDLED ? undefined : src);
|
|
1473
|
-
if (!unitExists(cat, s, loop)) die(`'${s}' is no longer in catalog '${cat.source}'`);
|
|
1496
|
+
if (!unitExists(cat, s, loop)) die(loop ? `'${s}' is no longer in catalog '${cat.source}'` : (retiredNote(cat, s) || `'${s}' is no longer in catalog '${cat.source}'`));
|
|
1474
1497
|
const theirs = unitHashes(cat, s, loop), mine = fileHashes(path.join(dest, s));
|
|
1475
1498
|
const base = (entry && entry.files) || {};
|
|
1476
1499
|
const changed = Object.keys(theirs).filter((f) => f in mine && mine[f] !== theirs[f]).sort();
|
|
@@ -1514,6 +1537,8 @@ function doctor(args) {
|
|
|
1514
1537
|
else try { data = JSON.parse(raw); } catch (e) { add("error", `${lp} is not valid JSON`, "fix or delete it; skilldrop can't track updates until then"); }
|
|
1515
1538
|
const names = Object.keys(data);
|
|
1516
1539
|
for (const n of names) {
|
|
1540
|
+
const note = !isLoopEntry(data[n]) && lsrc(data[n]) === BUNDLED && retiredNote(resolveCatalog(), n);
|
|
1541
|
+
if (note) add("warn", note, `skilldrop uninstall ${n}${targetHint(args.flags)}, or keep it as it is; it will not update`);
|
|
1517
1542
|
if (!fs.existsSync(path.join(dest, n))) add("error", `${n} is in the ledger but its folder is gone`, `skilldrop install ${n} (or uninstall ${n} to drop the record)`);
|
|
1518
1543
|
else if (!data[n].file) {
|
|
1519
1544
|
const loop = isLoopEntry(data[n]);
|
|
@@ -2031,7 +2056,7 @@ function info(args) {
|
|
|
2031
2056
|
if (args.flags.pack) return infoPack(args);
|
|
2032
2057
|
const cat = resolveCatalog(args.flags.from);
|
|
2033
2058
|
const s = args._[0] || die("pass a skill name, or --pack <name>");
|
|
2034
|
-
if (!skillExists(cat, s)) die(`unknown skill '${s}' in catalog '${cat.source}'`);
|
|
2059
|
+
if (!skillExists(cat, s)) die(retiredNote(cat, s) || `unknown skill '${s}' in catalog '${cat.source}'`);
|
|
2035
2060
|
const m = manifestOf(cat, s);
|
|
2036
2061
|
const ps = packsOf(cat) || {};
|
|
2037
2062
|
const inPacks = Object.entries(ps).filter(([, p]) => p.skills.includes(s)).map(([n]) => n);
|
package/catalogue.json
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
},
|
|
23
23
|
"design-the-system": {
|
|
24
24
|
"for": "Architects · tech leads",
|
|
25
|
-
"description": "Commit the shape before the code: decision records, design docs, diagrams, contracts,
|
|
25
|
+
"description": "Commit the shape before the code: decision records, design docs, diagrams, API and data contracts, migration and threat models, and the design of any agentic parts.",
|
|
26
26
|
"skills": [
|
|
27
27
|
"adr-generator",
|
|
28
28
|
"design-doc",
|
|
@@ -30,9 +30,7 @@
|
|
|
30
30
|
"reverse-architecture",
|
|
31
31
|
"figma-diagrams",
|
|
32
32
|
"api-contract-draft",
|
|
33
|
-
"db-schema-design",
|
|
34
33
|
"data-contract",
|
|
35
|
-
"tech-comparison-matrix",
|
|
36
34
|
"threat-model",
|
|
37
35
|
"agent-threat-model",
|
|
38
36
|
"migration-plan",
|
|
@@ -60,7 +58,6 @@
|
|
|
60
58
|
"agents-md-generator",
|
|
61
59
|
"llm-eval-harness",
|
|
62
60
|
"eval-harness-generator",
|
|
63
|
-
"contribution-wizard",
|
|
64
61
|
"backlog-triage",
|
|
65
62
|
"tracker-brief-sync"
|
|
66
63
|
]
|
|
@@ -161,10 +158,9 @@
|
|
|
161
158
|
},
|
|
162
159
|
"define-and-trust-the-numbers": {
|
|
163
160
|
"for": "Data analysts · analytics engineers",
|
|
164
|
-
"description": "Make the numbers a business runs on mean one thing:
|
|
161
|
+
"description": "Make the numbers a business runs on mean one thing: SQL reviewed for wrong answers, and dashboards specced before they're built, with every number on them defined.",
|
|
165
162
|
"skills": [
|
|
166
163
|
"dashboard-spec",
|
|
167
|
-
"metric-definition",
|
|
168
164
|
"sql-review"
|
|
169
165
|
]
|
|
170
166
|
},
|
|
@@ -196,5 +192,11 @@
|
|
|
196
192
|
"application-form-answers"
|
|
197
193
|
]
|
|
198
194
|
}
|
|
195
|
+
},
|
|
196
|
+
"retired": {
|
|
197
|
+
"tech-comparison-matrix": { "in": "0.16.13", "why": "On evals it was never revised against, the agent without it did as well, and its weighted totals were wrong in 4 of 8 runs." },
|
|
198
|
+
"db-schema-design": { "in": "0.16.13", "why": "On evals it was never revised against, the agent without it met as many checks (73% against 71%) and got types, time zones and constraints right unprompted." },
|
|
199
|
+
"metric-definition": { "in": "0.16.13", "why": "On evals it was never revised against, the agent without it did everything the skill teaches unprompted and won 13 of 16 blind verdicts." },
|
|
200
|
+
"contribution-wizard": { "in": "0.16.13", "why": "It prescribed a skill layout this catalogue no longer uses and imposed it on other repos. To add a skill to skilldrop, follow AGENTS.md and run validate.py." }
|
|
199
201
|
}
|
|
200
202
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://github.com/sananthanarayan/skilldrop/contracts/catalogue.schema.json",
|
|
4
4
|
"title": "skilldrop catalogue.json",
|
|
5
|
-
"$comment": "RFC-0026 / RFC-0034. The catalogue index: pack display order, and the
|
|
5
|
+
"$comment": "RFC-0026 / RFC-0034 / RFC-0046. The catalogue index: pack display order, the outcome axis, and the skills that have left the catalogue. Packs answer WHO needs a skill (the folder it sits in); outcomes answer WHY someone opened the catalogue.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["version", "packs", "outcomes"],
|
|
@@ -28,6 +28,20 @@
|
|
|
28
28
|
"skills": { "type": "array", "items": { "type": "string" }, "minItems": 1 }
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
+
},
|
|
32
|
+
"retired": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"description": "RFC-0046. Skills removed from the catalogue, so an installed copy can say why it stopped updating. A retired name has no folder and nothing references it; validate.py checks both.",
|
|
35
|
+
"additionalProperties": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"additionalProperties": false,
|
|
38
|
+
"required": ["in", "why"],
|
|
39
|
+
"properties": {
|
|
40
|
+
"in": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$", "description": "The skilldrop-cli version that removed it." },
|
|
41
|
+
"why": { "type": "string", "description": "One sentence, shown by outdated, update, doctor, diff, info and install." },
|
|
42
|
+
"instead": { "type": "string", "description": "A skill that covers the same job, when one does. Omit it when the agent without a skill does as well." }
|
|
43
|
+
}
|
|
44
|
+
}
|
|
31
45
|
}
|
|
32
46
|
}
|
|
33
47
|
}
|
package/model-routing.json
CHANGED
|
@@ -162,10 +162,6 @@
|
|
|
162
162
|
"tier": "standard",
|
|
163
163
|
"rationale": "The script lints and renders deterministically, but fixing a broken diagram means reading the author's intent and rewriting syntax without changing nodes, edges or labels, and knowing when to ask instead."
|
|
164
164
|
},
|
|
165
|
-
"metric-definition": {
|
|
166
|
-
"tier": "standard",
|
|
167
|
-
"rationale": "Structured specification against a fixed checklist (formula, grain, window, exclusions, edge cases, checks). Needs care with SQL and additivity but no adversarial judgment."
|
|
168
|
-
},
|
|
169
165
|
"research-plan": {
|
|
170
166
|
"tier": "standard",
|
|
171
167
|
"rationale": "Structured planning against a fixed shape (decision, sub-questions, methods, criteria, stopping rule); needs judgment to cut scope but no adversarial reasoning."
|
|
@@ -368,7 +364,7 @@
|
|
|
368
364
|
},
|
|
369
365
|
"business-case": {
|
|
370
366
|
"tier": "heavy",
|
|
371
|
-
"rationale": "Weighted multi-option judgment with a committal recommendation \u2014
|
|
367
|
+
"rationale": "Weighted multi-option judgment with a committal recommendation \u2014 cheaper models mis-weight costs, inflate benefits, and miss the flip-assumption. Never downgrade."
|
|
372
368
|
},
|
|
373
369
|
"incident-comms": {
|
|
374
370
|
"tier": "standard",
|
|
@@ -390,10 +386,6 @@
|
|
|
390
386
|
"tier": "heavy",
|
|
391
387
|
"rationale": "Adversarial review against WCAG success criteria \u2014 cheaper models fault alt-text presence over quality, under-call severity, miss focus-order/name-role-value issues, and claim AT passes from screenshots. Never downgrade."
|
|
392
388
|
},
|
|
393
|
-
"db-schema-design": {
|
|
394
|
-
"tier": "standard",
|
|
395
|
-
"rationale": "Design synthesis from access patterns against a fixed paradigm/indexing/anti-pattern reference. Paradigm and denormalization judgment is bounded; escalate via ambiguous-input on contested scale/consistency tradeoffs."
|
|
396
|
-
},
|
|
397
389
|
"observability-plan": {
|
|
398
390
|
"tier": "standard",
|
|
399
391
|
"rationale": "Methodology synthesis against fixed SRE practices (golden signals, burn-rate alerting, pillar split). SLO calibration needs judgment but is bounded; escalate via ambiguous-input on contested reliability targets."
|
|
@@ -414,10 +406,6 @@
|
|
|
414
406
|
"tier": "heavy",
|
|
415
407
|
"rationale": "Adversarial doc review against rubrics. Same as devils-advocate: the value is catching what a fast pass misses. Never downgrade."
|
|
416
408
|
},
|
|
417
|
-
"tech-comparison-matrix": {
|
|
418
|
-
"tier": "heavy",
|
|
419
|
-
"rationale": "Weighted multi-criteria judgment with a recommendation. Mis-weighting is the failure mode; heavy is worth it. Never downgrade."
|
|
420
|
-
},
|
|
421
409
|
"threat-model": {
|
|
422
410
|
"tier": "heavy",
|
|
423
411
|
"rationale": "Adversarial reasoning over a design \u2014 cheaper models emit checklist residue, miss authz/insider paths, and inflate severity. Never downgrade."
|
|
@@ -474,10 +462,6 @@
|
|
|
474
462
|
"tier": "standard",
|
|
475
463
|
"rationale": "Schema generation from natural-language description \u2014 structured output task that fits standard tier."
|
|
476
464
|
},
|
|
477
|
-
"contribution-wizard": {
|
|
478
|
-
"tier": "standard",
|
|
479
|
-
"rationale": "Intake plus structured generation \u2014 standard tier covers template-filling and schema-adherence judgment."
|
|
480
|
-
},
|
|
481
465
|
"ux-writing": {
|
|
482
466
|
"tier": "standard",
|
|
483
467
|
"rationale": "Short-form writing to fixed slot rules and character budgets, plus a terminology consistency pass. Bounded generation with clear checks."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skilldrop-cli",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.13",
|
|
4
4
|
"description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and 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",
|
|
@@ -70,7 +70,7 @@ Readiness assessments fail in one of two ways: a number with no evidence behind
|
|
|
70
70
|
- ❌ **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.
|
|
71
71
|
- ❌ **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.
|
|
72
72
|
- ❌ **Gaps with no owner.** An unowned action is a wish. Roles, not names.
|
|
73
|
-
- ❌ **Recommending tools.** This assesses readiness; vendor selection is a different decision
|
|
73
|
+
- ❌ **Recommending tools.** This assesses readiness; vendor selection is a different decision, and mixing them lets a vendor pitch masquerade as a diagnosis.
|
|
74
74
|
- ❌ **Showing the machinery.** The reply and the artifact are for the person who asked. Don't mention this skill, its files, templates, caps or internal terms, or that the run is non-interactive. Name another skill once, at the end, as a suggested next step, never inside the artifact.
|
|
75
75
|
|
|
76
76
|
**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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-readiness-assessment",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"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).",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -17,8 +17,7 @@
|
|
|
17
17
|
"ai-usage-policy",
|
|
18
18
|
"ai-usage-report",
|
|
19
19
|
"ai-use-case-triage",
|
|
20
|
-
"strategy-analysis"
|
|
21
|
-
"tech-comparison-matrix"
|
|
20
|
+
"strategy-analysis"
|
|
22
21
|
],
|
|
23
22
|
"tags": [
|
|
24
23
|
"ai-adoption",
|
|
@@ -66,7 +66,7 @@ Builds the measurement that turns "the new prompt feels better" into "the new pr
|
|
|
66
66
|
|
|
67
67
|
- ❌ Tabulating AI usage/adoption telemetry — that's `ai-usage-report`
|
|
68
68
|
- ❌ Product-outcome metrics for a feature (adoption, handle time) — that's `success-metrics`
|
|
69
|
-
- ❌ Picking which model/vendor to
|
|
69
|
+
- ❌ Picking which model/vendor to buy on price, terms or support — this measures quality on your task, which is one input to that decision
|
|
70
70
|
- ❌ The provider-specific API mechanics (token counting, streaming, tool-call format) — consult the provider's own reference; this skill is the eval methodology
|
|
71
71
|
|
|
72
72
|
## Anti-patterns to avoid
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "llm-eval-harness",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Design an evaluation harness for an LLM-powered feature — a versioned golden set (representative + adversarial + regression cases), the cheapest adequate grading method per case, a metric with a pre-set pass bar and regression gate, and a failure taxonomy that targets iteration. Use when the user is building or tuning an LLM feature (prompt, RAG, agent, classifier) and needs evals, a way to test prompt/model changes, or to stop shipping quality regressions on vibes.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
|
-
"related": ["ai-usage-report", "success-metrics"
|
|
8
|
+
"related": ["ai-usage-report", "success-metrics"],
|
|
9
9
|
"tags": ["llm", "evals", "ai-engineering", "testing", "llm-as-judge", "regression-gate"],
|
|
10
10
|
"model": { "tier": "standard", "rationale": "Methodology synthesis against a fixed decision tree and pitfall catalog. Grading-method and metric choices need judgment but are bounded; escalate via ambiguous-input on novel task types." }
|
|
11
11
|
}
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
{
|
|
31
31
|
"skill": "tool-use-schema-writer",
|
|
32
32
|
"you_do": "Describe each function the model should call.",
|
|
33
|
-
"you_get": "A tool_use JSON schema per function with types, required fields and parameter descriptions,
|
|
33
|
+
"you_get": "A tool_use JSON schema per function with types, required fields and parameter descriptions, and a Python client.messages.create snippet when you ask for one."
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
"skill": "token-budget-estimator",
|
|
@@ -82,7 +82,7 @@ Run: python3 validate.py # confirms the file is found
|
|
|
82
82
|
- **expected_shape items that can't be checked.** "Output is comprehensive" is not checkable. Name specific sections, fields, or behaviors.
|
|
83
83
|
- **Missing anti-pattern cases.** The most common eval gap is no cases that test the quality bar's failure modes. If a skill says "never present a hypothesis as the cause," there must be a case where the input tempts that failure.
|
|
84
84
|
|
|
85
|
-
For designing eval harnesses for general LLM features (not skilldrop skills specifically), use `llm-eval-harness` instead.
|
|
85
|
+
For designing eval harnesses for general LLM features (not skilldrop skills specifically), use `llm-eval-harness` instead.
|
|
86
86
|
|
|
87
87
|
## Quality bar
|
|
88
88
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eval-harness-generator",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Takes a skill's SKILL.md and generates a set of eval cases — trigger queries, expected output shape, and pass/fail criteria — ready to drop into the skill's evals/ directory. Use when adding evals to a new or existing skill, verifying a skill behaves as documented, or building a regression gate before modifying a skill.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
|
-
"related": ["llm-eval-harness"
|
|
8
|
+
"related": ["llm-eval-harness"],
|
|
9
9
|
"tags": ["claude-api", "evals", "testing", "quality", "skilldrop-meta"],
|
|
10
10
|
"model": { "tier": "standard", "rationale": "Reads a SKILL.md and synthesizes eval cases — requires understanding of the skill's intent but not heavy reasoning." }
|
|
11
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tool-use-schema-writer
|
|
3
|
-
description: Takes a function description (name, purpose, parameters) and writes a valid Anthropic tool_use JSON schema, with type annotations, required fields, and a description for each parameter.
|
|
3
|
+
description: Takes a function description (name, purpose, parameters) and writes a valid Anthropic tool_use JSON schema, with type annotations, required fields, and a description for each parameter. Adds a Python client.messages.create(tools=[...]) snippet only when asked. Use when wiring a Claude agent to a function or API, designing tools for a multi-agent system, or documenting an existing tool for agent consumption.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# tool-use-schema-writer
|
|
@@ -68,9 +68,9 @@ Check the definition against these rules before outputting:
|
|
|
68
68
|
- Enum values are listed in the parameter description with a one-phrase explanation each
|
|
69
69
|
- Nested objects have their own `"required"` arrays
|
|
70
70
|
|
|
71
|
-
### Step 4 — Python usage snippet
|
|
71
|
+
### Step 4 — Python usage snippet, only when asked
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
Skip this step unless the user asked for client code. The definition is the deliverable; an unrequested snippet is padding the reader has to scroll past. When they ask, use this shape:
|
|
74
74
|
|
|
75
75
|
```python
|
|
76
76
|
import anthropic
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"A required array is present and contains customer_id; every name in required exists in properties",
|
|
11
11
|
"Every parameter has a non-empty description, and limit states its valid range (1-100)",
|
|
12
12
|
"The status and sort enums list their values with a one-phrase explanation of each value",
|
|
13
|
-
"
|
|
13
|
+
"Gives the definition without a Python usage snippet, since none was asked for",
|
|
14
14
|
"Does not invent parameters, enum values, or behaviors not in the supplied signature and docstring"
|
|
15
15
|
]
|
|
16
16
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tool-use-schema-writer",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Takes a function description (name, purpose, parameters) and writes a valid Anthropic tool_use JSON schema, with type annotations, required fields, and a description for each parameter.
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "Takes a function description (name, purpose, parameters) and writes a valid Anthropic tool_use JSON schema, with type annotations, required fields, and a description for each parameter. Adds a Python client.messages.create(tools=[...]) snippet only when asked. Use when wiring a Claude agent to a function or API, designing tools for a multi-agent system, or documenting an existing tool for agent consumption.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: brief-intake
|
|
3
|
-
description: Turn raw mess — a Slack thread, meeting transcript, Jira ticket, half-written Notion page, email chain, or paragraph of free-form context — into a structured brief that the downstream skill (adr-generator, design-doc, runbook-generator, exec-summary, deck-builder
|
|
3
|
+
description: Turn raw mess — a Slack thread, meeting transcript, Jira ticket, half-written Notion page, email chain, or paragraph of free-form context — into a structured brief that the downstream skill (adr-generator, design-doc, runbook-generator, exec-summary, deck-builder) can consume without further intake. Use whenever the user has unstructured source material and is about to invoke another skilldrop skill, or when a draft is missing the load-bearing context the next step will need.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# brief-intake
|
|
@@ -16,7 +16,7 @@ You help the user (or the next skill in the chain) absorb raw unstructured input
|
|
|
16
16
|
| `adr-generator` | "ADR", "decision record", "capture a decision", "we decided X" |
|
|
17
17
|
| `design-doc` | "design doc", "tech proposal", "one-pager for review", "RFC" |
|
|
18
18
|
| `runbook-generator` | "runbook", "on-call doc", "operational doc", "prod-readiness" |
|
|
19
|
-
|
|
|
19
|
+
| _(tech comparison)_ | "compare X vs Y", "vendor selection", "tech selection" |
|
|
20
20
|
| `exec-summary` | "exec summary", "1-pager for the VP", "board update" |
|
|
21
21
|
| `deck-builder` / `slide-outliner` | "deck", "slides", "presentation", "pitch", "review meeting" |
|
|
22
22
|
| `decision-log` | "decisions and action items", "follow-ups from the meeting" |
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "brief-intake",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Turn raw mess — a Slack thread, meeting transcript, Jira ticket, half-written Notion page, email chain, or paragraph of free-form context — into a structured brief that the downstream skill (adr-generator, design-doc, runbook-generator, exec-summary, deck-builder
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Turn raw mess — a Slack thread, meeting transcript, Jira ticket, half-written Notion page, email chain, or paragraph of free-form context — into a structured brief that the downstream skill (adr-generator, design-doc, runbook-generator, exec-summary, deck-builder) can consume without further intake. Use whenever the user has unstructured source material and is about to invoke another skilldrop skill, or when a draft is missing the load-bearing context the next step will need.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
|
-
"related": ["adr-generator", "decision-log", "deck-builder", "design-doc", "exec-summary", "runbook-generator", "slide-outliner"
|
|
8
|
+
"related": ["adr-generator", "decision-log", "deck-builder", "design-doc", "exec-summary", "runbook-generator", "slide-outliner"],
|
|
9
9
|
"tags": ["intake", "brief", "extraction", "preprocessing", "pipeline"],
|
|
10
10
|
"model": { "tier": "standard", "rationale": "Extraction + [explicit]/[implied]/[inferred] tagging. The tagging needs care — above haiku, below opus." }
|
|
11
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Brief: Tech Comparison
|
|
2
2
|
|
|
3
|
-
> Target downstream skill
|
|
3
|
+
> Target downstream: whoever scores the candidates — the agent in the next turn, or the people making the choice. No dedicated skill.
|
|
4
4
|
|
|
5
5
|
## The question
|
|
6
6
|
{One sentence — what's being chosen and what for. e.g. "Pick a primary OLTP datastore for the new checkout service."} [explicit|implied|inferred|missing]
|
|
@@ -7,7 +7,7 @@ description: Convene a council of distinct senior-engineer personas (Architect,
|
|
|
7
7
|
|
|
8
8
|
You convene a **council of distinct expert personas** to deliberate something consequential, then reconcile their views into a decision. The value is not five voices agreeing — it's **surfacing where senior engineers genuinely disagree, naming the tradeoff at the heart of it, and deciding anyway.**
|
|
9
9
|
|
|
10
|
-
This is the deliberation counterpart to the single-voice reviewers. Use [`devils-advocate`](../../../dev-team/skills/devils-advocate/SKILL.md) when you want one adversarial pass on code, [`doc-critique`](../doc-critique/SKILL.md) for one pass on a doc
|
|
10
|
+
This is the deliberation counterpart to the single-voice reviewers. Use [`devils-advocate`](../../../dev-team/skills/devils-advocate/SKILL.md) when you want one adversarial pass on code, [`doc-critique`](../doc-critique/SKILL.md) for one pass on a doc. Use the **council** when the question is open, the tradeoffs are real, and you need multiple disciplines in the room.
|
|
11
11
|
|
|
12
12
|
## What the council reviews
|
|
13
13
|
|
|
@@ -89,7 +89,7 @@ The **Chair** is not a sixth opinion. The Chair facilitates, finds the cruxes, a
|
|
|
89
89
|
## When NOT to use this skill
|
|
90
90
|
|
|
91
91
|
- ❌ A trivial or one-line change — convening five voices is noise. Use `devils-advocate` or just review it.
|
|
92
|
-
- ❌ A single-lens task. Pure code review → `devils-advocate`. Pure doc review → `doc-critique`.
|
|
92
|
+
- ❌ A single-lens task. Pure code review → `devils-advocate`. Pure doc review → `doc-critique`.
|
|
93
93
|
- ❌ When you need **one** expert answer fast, not a deliberation. The council is for when the disagreement *is* the point.
|
|
94
94
|
- ❌ Greenfield spike/throwaway code — deliberation wastes effort on what won't survive.
|
|
95
95
|
- ❌ As a rubber stamp to manufacture consensus for a decision already made. If the call is final, don't stage a fake trial.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "council-review",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Convene a council of distinct senior-engineer personas (Architect, Security, Operator/SRE, Pragmatist, User-Advocate, plus optional bench seats) to deliberate a decision, design, or code change — each takes an independent stance, the genuine disagreements are surfaced as named cruxes, and a Chair issues a reconciled verdict that records dissents and states what would change the decision. The \"Claude Council.\" Use when a choice has real tradeoffs and one reviewer's voice isn't enough: architecture decisions, risky changes before merge, RFC/design scrutiny, \"should we adopt X?\", rewrite-vs-refactor, or a pre-mortem.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
|
-
"related": ["devils-advocate", "doc-critique"
|
|
8
|
+
"related": ["devils-advocate", "doc-critique"],
|
|
9
9
|
"tags": ["review", "deliberation", "council", "decision", "architecture", "pre-mortem", "multi-perspective", "dev-workflow"],
|
|
10
10
|
"model": { "tier": "heavy", "rationale": "Multi-perspective deliberation + weighted reconciliation. Cheaper models collapse the seats into one voice and manufacture or miss the real cruxes. Never downgrade." }
|
|
11
11
|
}
|
|
@@ -70,7 +70,6 @@ When two seats genuinely converge, that's a *stronger* signal — present it as
|
|
|
70
70
|
The council is heavier than the focused reviewers — use it when the multi-disciplinary tension is the point, not as a default. Rules of thumb:
|
|
71
71
|
- One adversarial pass on just-written code → [`devils-advocate`](../../../dev-team/skills/devils-advocate/SKILL.md).
|
|
72
72
|
- One rubric pass on a doc → [`doc-critique`](../doc-critique/SKILL.md).
|
|
73
|
-
- Score named options on weighted criteria → [`tech-comparison-matrix`](../../../solution-architect/skills/tech-comparison-matrix/SKILL.md).
|
|
74
73
|
- A decision/design/change where security, ops, maintainability, delivery, and correctness pull in different directions → **council-review**.
|
|
75
74
|
|
|
76
75
|
Don't chain these internally (per the repo's no-internal-chaining rule). A human runs the council, then hands a specific finding to `devils-advocate` if they want it drilled.
|
|
@@ -104,7 +104,7 @@ You help the user review an existing document with the same opinionated rubric t
|
|
|
104
104
|
|
|
105
105
|
## When NOT to use this skill
|
|
106
106
|
|
|
107
|
-
- ❌ For evaluating the *underlying decision* (is Postgres the right choice?). That's a tech
|
|
107
|
+
- ❌ For evaluating the *underlying decision* (is Postgres the right choice?). That's a tech debate, not a doc review — argue the decision itself, or put it to `council-review`.
|
|
108
108
|
- ❌ For grammar / spelling pass on a doc that's otherwise solid. Use a normal editor.
|
|
109
109
|
- ❌ For evaluating code. This skill reviews *documents*; for code review, the user has other tools.
|
|
110
110
|
- ❌ For generating the doc. If the user wants a draft, that's the matching generator skill.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "doc-critique",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Review an existing document — ADR, design doc, runbook, exec summary, tech-comparison matrix, deck outline, decision log — and produce a structured critique against the same quality bars the skilldrop generators enforce. Categorizes findings by severity (blocker / major / minor / nit), points to the exact section/line, and suggests a concrete fix for each. Use when the user wants a second-pair-of-eyes review before sharing a doc, or has been handed someone else's artifact and wants to know what to push back on.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
|
-
"related": ["
|
|
8
|
+
"related": ["council-review", "decision-log"],
|
|
9
9
|
"tags": ["review", "critique", "quality", "rubric", "feedback"],
|
|
10
10
|
"model": { "tier": "heavy", "rationale": "Adversarial doc review against rubrics. The value is catching what a fast pass misses. Never downgrade." }
|
|
11
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Rubric: Tech-Comparison Matrix
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
For any weighted comparison of named options: a vendor selection, a datastore pick, a build-vs-buy matrix.
|
|
4
4
|
|
|
5
5
|
## Blockers
|
|
6
6
|
- **The question is one sentence and answerable.** ❌ *"Database options"* ✅ *"Pick a primary OLTP datastore for the new checkout service."*
|