@spardutti/claude-skills 2.33.0 → 2.33.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 CHANGED
@@ -133,7 +133,7 @@ Portable slash commands installed to `.claude/commands/`. Some orchestrate paral
133
133
  |---------|--------------|
134
134
  | `/ship` | Unified delivery pipeline — commit → gate → PR → merge → release. The gate is the one enforcement moment: it checks the diff's file lengths, audits it against the skills installed in the project, and mutation-tests the changed lines to prove the tests would catch a break — **fixing what it finds** rather than handing you a list. It runs before the **PR**, not before every commit: its scope is the whole branch, so gating each commit re-mutated every file the branch had ever touched. `--force` skips it. No argument steps through interactively; `/ship pr` runs through PR creation; `/ship release` runs the full pipeline |
135
135
  | `/discover` | Find the right problem before deciding what to build — diverges first: generates competing framings through blind subagents under forced constraints, stress-tests the winner with a blind critic, and refuses to converge until every open question is answered or deferred, then drafts scope, non-goals, edge cases and success criteria for you to correct. Run before `/plan-feature` |
136
- | `/plan-feature` | Integration-first feature planning, then building — 3 parallel subagents scan for reusable code, patterns and touch points, and the plan lands with a contract and a per-worker file split; on your go it dispatches parallel implementation workers that each load their own skills, then mutation-tests their work once and sends each test gap back to the worker that wrote it, and reports one diff |
136
+ | `/plan-feature` | Integration-first feature planning, then building — 3 parallel subagents scan for reusable code, patterns and touch points, grounded clarifying questions follow, and on your go the same agent builds the plan |
137
137
  | `/refactor` | Detect size / complexity / duplication / coupling issues via 4 parallel subagents, then refactor |
138
138
  | `/deep-review` | Multi-agent deep code review — 5 parallel subagents catch guard bypasses, lost async state, wrong-table queries, dead references, protocol violations |
139
139
  | `/test-review` | Write-then-verify test review — scopes to the diff, runs red-green + mutation gates, then an isolated read-only subagent proves each test would catch a regression instead of rubber-stamping it |
@@ -52,6 +52,14 @@ mutmut_unchecked() { # mutmut_unchecked <label> <base> <count> <run log>
52
52
  echo " it ahead of every host-local option."
53
53
  }
54
54
 
55
+ # A scoped --baseline replaces only the changed modules' names. Rebuilding the whole
56
+ # file re-mutated an entire API to accept eleven of them.
57
+ baseline_write() { # baseline_write <baseline file> <survivors file> <scope regex, or empty>
58
+ if [ -z "$3" ]; then cp "$2" "$1"; return; fi
59
+ grep -vE "^($3)\.x" "$1" | cat - "$2" | sort -u > "$1.new"
60
+ mv "$1.new" "$1"
61
+ }
62
+
55
63
  family_of() { # js, py, or any when no manifest says
56
64
  o=$(owner_of "$1")
57
65
  if [ -f "$o/package.json" ]; then echo js
@@ -291,15 +291,15 @@ for owner in $OWNERS; do
291
291
  continue
292
292
  elif [ -n "$(py_mutmut "$base")" ]; then
293
293
  TOOL="mutmut"
294
- # 3.x has no per-line scoping, only fnmatch globs over mutant NAMES, so a
295
- # compare run is scoped to the changed modules. A baseline is recorded whole.
294
+ # 3.x has no per-line scoping, only fnmatch globs over mutant NAMES, so once a
295
+ # baseline exists every run, --baseline included, is scoped to the changed modules.
296
296
  #
297
297
  # `mutmut run` prints 🙁 for a survivor and exits 0 either way — parsing it
298
298
  # reports clean with survivors sitting there, which is a false green and
299
299
  # worse than reporting nothing. `mutmut results` is the readable source:
300
300
  # it prints "<mutant name>: survived" per survivor.
301
301
  M="$(py_mutmut "$base")"
302
- [ "$MODE" != baseline ] && [ -f "$base.mutmut-baseline" ] && MODS=$(printf '%s\n' "$OWNED" \
302
+ [ -f "$base.mutmut-baseline" ] && MODS=$(printf '%s\n' "$OWNED" \
303
303
  | sed -n "s#^$base\(.*\)\.py\$#\1#p" | tr / . | sed 's#^src\.##' | sort -u)
304
304
  [ -n "$MODS" ] && GLOBS=$(printf " '%s.x*'" $MODS) \
305
305
  && SCOPE_RE=$(printf '%s\n' "$MODS" | sed 's/\./\\./g' | paste -sd'|' -)
@@ -405,7 +405,7 @@ for owner in $OWNERS; do
405
405
  fi
406
406
 
407
407
  if [ "$MODE" = baseline ]; then
408
- cp "$NOWF" "$BL"
408
+ baseline_write "$BL" "$NOWF" "$SCOPE_RE"
409
409
  NOTE=" $label mutmut — baseline set: $(wc -l < "$BL") survivor(s) accepted. Commit $BL."
410
410
  SURVIVED=""
411
411
  elif [ -f "$BL" ]; then
@@ -127,7 +127,7 @@ export async function setupHook(targetDir = process.cwd()) {
127
127
  console.log(` Hook installed: .claude/hooks/${AUTO_MARK_FILENAME}`);
128
128
  console.log(` Hook installed: .claude/hooks/${APPLICATION_GATE_FILENAME}`);
129
129
  console.log(` Hook installed: .claude/hooks/${GAUNTLET_FILENAME}`);
130
- console.log(` Installed: .claude/hooks/${SHIP_GATE_FILENAME} (used by /ship and /plan-feature)`);
130
+ console.log(` Installed: .claude/hooks/${SHIP_GATE_FILENAME} (used by /ship)`);
131
131
  console.log(` Hook installed: .claude/hooks/${SHIP_GATE_HOOK_FILENAME}`);
132
132
  console.log(` Settings updated: .claude/settings.json`);
133
133
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spardutti/claude-skills",
3
- "version": "2.33.0",
3
+ "version": "2.33.2",
4
4
  "description": "Guardrails for Claude Code — best-practice skills, planning commands, and delivery gates.",
5
5
  "type": "module",
6
6
  "repository": {