task install destroys/skips skill symlinks — use install.sh instead #7

Open
opened 2026-07-03 22:26:40 +00:00 by mathias · 0 comments
Owner

Problem

The repo's task install (and targets like task install:claude:global) break the per-skill symlink wiring instead of establishing it. Observed 2026-07-04:

  • After task install: claude:0/40 crush:0/40 vibe:0/40 — every per-skill symlink gone.
  • A second task install:claude:global gave 22/40 (non-deterministic).
  • The identical link loop as plain bash, and install.sh, wire 40/40 every time (all four harnesses).

So the Taskfile installer is unreliable/destructive; install.sh is correct.

Likely cause

The multi-line - | install blocks mix Go-template {{.TASKFILE_DIR}}/{{.NON_SKILL_ENTRIES}} with shell $(...) and ${skill}. Suspects: task's default parallel execution of the install aggregate deps, or template/quoting of the regex. task list (single-line) works, so it's the multi-line-block handling, not TASKFILE_DIR resolution.

Repro

git clone https://git.d-ma.be/mathias/skills.git /tmp/skills && cd /tmp/skills
task install
for s in $(ls -1 | grep -Ev '^(Taskfile.yml|install.sh|README.md|SKILLS_INDEX.md)$'); do [ -L ~/.claude/skills/$s ] && echo x; done | wc -l   # << 40
SKILLS_CHECKOUT_DIR="$PWD" bash install.sh   # now 40/40

Fix options

  1. Make task install delegate to install.sh (proven path) instead of reimplementing the loop — simplest, removes duplication.
  2. If keeping the loops: disable parallel deps, audit template/quoting, add a post-condition assert (links == skills).

Workaround (already documented)

install.shcurl -fsSL .../install.sh | bash, or SKILLS_CHECKOUT_DIR="$PWD" bash install.sh. SKILLS_INDEX.md now points here.

Surfaced consolidating local-dev's embedded .skills/ into this repo (2026-07-04).

## Problem The repo's `task install` (and targets like `task install:claude:global`) break the per-skill symlink wiring instead of establishing it. Observed 2026-07-04: - After `task install`: `claude:0/40 crush:0/40 vibe:0/40` — every per-skill symlink gone. - A second `task install:claude:global` gave `22/40` (non-deterministic). - The identical link loop as plain bash, and `install.sh`, wire `40/40` every time (all four harnesses). So the Taskfile installer is unreliable/destructive; `install.sh` is correct. ## Likely cause The multi-line `- |` install blocks mix Go-template `{{.TASKFILE_DIR}}`/`{{.NON_SKILL_ENTRIES}}` with shell `$(...)` and `${skill}`. Suspects: task's default parallel execution of the `install` aggregate deps, or template/quoting of the regex. `task list` (single-line) works, so it's the multi-line-block handling, not TASKFILE_DIR resolution. ## Repro git clone https://git.d-ma.be/mathias/skills.git /tmp/skills && cd /tmp/skills task install for s in $(ls -1 | grep -Ev '^(Taskfile.yml|install.sh|README.md|SKILLS_INDEX.md)$'); do [ -L ~/.claude/skills/$s ] && echo x; done | wc -l # << 40 SKILLS_CHECKOUT_DIR="$PWD" bash install.sh # now 40/40 ## Fix options 1. Make `task install` delegate to `install.sh` (proven path) instead of reimplementing the loop — simplest, removes duplication. 2. If keeping the loops: disable parallel deps, audit template/quoting, add a post-condition assert (links == skills). ## Workaround (already documented) `install.sh` — `curl -fsSL .../install.sh | bash`, or `SKILLS_CHECKOUT_DIR="$PWD" bash install.sh`. SKILLS_INDEX.md now points here. Surfaced consolidating local-dev's embedded `.skills/` into this repo (2026-07-04).
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mathias/skills#7