skillmds 1.0.10 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  All notable changes to `skillmds` are documented here. Versions follow [semver](https://semver.org).
4
4
 
5
+ ## 1.0.11
6
+
7
+ - Security flags render with full readable labels, each with its own marker: `⚑ Executes Scripts ⚑ Calls Network ⚑ Reads Secrets`.
8
+
5
9
  ## 1.0.10
6
10
 
7
11
  - Quality score is now a composite of spec correctness, completeness, and **security risk** — skills that read secrets, execute scripts, or make network calls score lower (a risky/stub skill is no longer a green 100).
package/dist/cli.js CHANGED
@@ -397,11 +397,12 @@ function chips(result) {
397
397
  for (const d of result.diagnostics) bySev[d.severity].push(d.id);
398
398
  return SEV_ORDER.filter((s) => bySev[s].length).map((s) => `${GLYPH[s]} ${SEV_COLOR[s](bySev[s].join(" "))}`).join(" ");
399
399
  }
400
- var SEC_SHORT = {
401
- network_calls: "net",
402
- executes_scripts: "exec",
403
- reads_secrets: "secrets"
400
+ var SEC_LABEL = {
401
+ network_calls: "Calls Network",
402
+ executes_scripts: "Executes Scripts",
403
+ reads_secrets: "Reads Secrets"
404
404
  };
405
+ var titleCase = (flag) => flag.split("_").map((w) => w[0].toUpperCase() + w.slice(1)).join(" ");
405
406
  var scoreColor = (s) => s >= 80 ? pc.green : s >= 50 ? pc.yellow : pc.red;
406
407
  function label(file) {
407
408
  const parts = file.split(/[\\/]/).filter(Boolean);
@@ -411,8 +412,9 @@ function label(file) {
411
412
  function securityFlags(result) {
412
413
  return result.security.flags.filter((f) => f !== "docs_only");
413
414
  }
414
- function secCodes(result) {
415
- return securityFlags(result).map((f) => SEC_SHORT[f] ?? f);
415
+ function secLabels(result) {
416
+ const flags = securityFlags(result);
417
+ return flags.map((f) => pc.magenta(`${SEC_GLYPH} ${SEC_LABEL[f] ?? titleCase(f)}`)).join(" ");
416
418
  }
417
419
  function statusDot(result) {
418
420
  if (!result.ok) return pc.red("\u25CF");
@@ -435,8 +437,8 @@ function renderOne(file, result) {
435
437
  const loc = d.line !== void 0 ? pc.dim(`:${d.line}`) : "";
436
438
  out.push(` ${GLYPH[d.severity]} ${SEV_COLOR[d.severity](d.id)}${loc} ${d.message}`);
437
439
  }
438
- const codes = secCodes(result);
439
- if (codes.length) out.push(` ${pc.magenta(`${SEC_GLYPH} ${codes.join(", ")}`)}`);
440
+ const sec = secLabels(result);
441
+ if (sec) out.push(` ${sec}`);
440
442
  return out.join("\n");
441
443
  }
442
444
  function renderMany(results) {
@@ -448,9 +450,9 @@ function renderMany(results) {
448
450
  const score = scoreColor(result.score)(String(result.score).padStart(3));
449
451
  const nm = names[i];
450
452
  const name = (nm.length > w ? nm.slice(0, w - 1) + "\u2026" : nm).padEnd(w);
451
- const codes = secCodes(result);
452
- if (codes.length) anySec = true;
453
- const sec = codes.length ? ` ${pc.magenta(`${SEC_GLYPH} ${codes.join(" ")}`)}` : "";
453
+ const secStr = secLabels(result);
454
+ if (secStr) anySec = true;
455
+ const sec = secStr ? ` ${secStr}` : "";
454
456
  out.push(`${statusDot(result)} ${score} ${name} ${chips(result)}${sec}`.trimEnd());
455
457
  });
456
458
  const failed = results.filter((r) => !r.result.ok).length;
@@ -462,7 +464,7 @@ function renderMany(results) {
462
464
  if (warned) parts.push(pc.yellow(`${warned} warn`));
463
465
  if (failed) parts.push(pc.red(`${failed} fail`));
464
466
  out.push(`${parts.join(pc.dim(" \xB7 "))} ${pc.dim("avg score")} ${scoreColor(avg)(`${avg}/100`)}`);
465
- if (anySec) out.push(pc.dim("score = spec + completeness + security risk; magenta \u2691 = risky behaviour (net, exec, secrets)"));
467
+ if (anySec) out.push(pc.dim(`${SEC_GLYPH} = risky behaviour, factored into the score alongside spec correctness and completeness`));
466
468
  const fails = results.filter((r) => !r.result.ok);
467
469
  if (fails.length) {
468
470
  out.push("");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillmds",
3
- "version": "1.0.10",
3
+ "version": "1.0.11",
4
4
  "description": "SkillMD for agents: the `skillmds` MCP server + the `skillmd` CLI (lint, scan, search, install, publish Agent Skills) from skillmd.com.",
5
5
  "type": "module",
6
6
  "bin": {