From 6bf3a6a427c97d8080a07bf5ee60ce7a8ffa1ddc Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 02:39:57 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=AA=20Add=20tests=20for=20idstack-gen-?= =?UTF-8?q?skills?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds test/test-gen-skills.sh to verify generation targets and error paths. Integrates the test suite into the existing smoke-test.sh flow. Co-authored-by: savvides <1580637+savvides@users.noreply.github.com> --- test/smoke-test.sh | 5 ++ test/test-gen-skills.sh | 120 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100755 test/test-gen-skills.sh diff --git a/test/smoke-test.sh b/test/smoke-test.sh index b18ec85..5376444 100755 --- a/test/smoke-test.sh +++ b/test/smoke-test.sh @@ -140,6 +140,11 @@ if [ -x "$IDSTACK_DIR/test/test-manifest-merge.sh" ]; then check "manifest-merge unit tests pass" "'$IDSTACK_DIR/test/test-manifest-merge.sh'" fi +# Gen-skills tool unit tests must pass. +if [ -x "$IDSTACK_DIR/test/test-gen-skills.sh" ]; then + check "gen-skills unit tests pass" "'$IDSTACK_DIR/test/test-gen-skills.sh'" +fi + # Version classifier (shared by setup + bin/idstack-doctor) must classify # multi-digit versions correctly. Pinned to catch the pattern-fragility # regression Gemini flagged twice. diff --git a/test/test-gen-skills.sh b/test/test-gen-skills.sh new file mode 100755 index 0000000..ec24d4f --- /dev/null +++ b/test/test-gen-skills.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash +# Unit tests for bin/idstack-gen-skills. +# Run from the repo root (or sourced by smoke-test.sh). + +set -e + +PASS=0 +FAIL=0 +TOTAL=0 + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +GEN_SKILLS="$REPO_ROOT/bin/idstack-gen-skills" + +assert() { + TOTAL=$((TOTAL + 1)) + if eval "$2" >/dev/null 2>&1; then + PASS=$((PASS + 1)) + echo " PASS: $1" + else + FAIL=$((FAIL + 1)) + echo " FAIL: $1" + fi +} + +if [ ! -x "$GEN_SKILLS" ]; then + echo "test-gen-skills: $GEN_SKILLS missing or not executable" + exit 1 +fi + +WORK=$(mktemp -d) +trap 'rm -rf "$WORK"' EXIT + +seed_workspace() { + # Clean existing items before seeding to avoid permission issues or stale files + rm -rf "$WORK"/* "$WORK"/.??* 2>/dev/null || true + mkdir -p "$WORK/bin" "$WORK/templates/assets" "$WORK/skills/test-skill" + cp "$GEN_SKILLS" "$WORK/bin/" + + echo "PREAMBLE CONTENT" > "$WORK/templates/preamble.md" + echo "SCHEMA CONTENT" > "$WORK/templates/manifest-schema.md" + touch "$WORK/templates/report.html.tmpl" + touch "$WORK/templates/index.html.tmpl" + touch "$WORK/templates/assets/idstack.css" + echo "AGENT CONTEXT" > "$WORK/templates/agent-context.md" + + cat > "$WORK/skills/test-skill/SKILL.md.tmpl" <<'INNER_EOF' +--- +name: test-skill +allowed-tools: + - tool1 + - tool2 +description: test +--- +{{PREAMBLE}} +some content +{{MANIFEST_SCHEMA}} +INNER_EOF +} + +echo "test-gen-skills" +echo "" + +# --- Test 1: Missing templates fail --- +seed_workspace +rm "$WORK/templates/preamble.md" +set +e +"$WORK/bin/idstack-gen-skills" --target claude >/dev/null 2>&1 +EC=$? +set -e +assert "missing template exits 1" "[ $EC -eq 1 ]" + +# --- Test 2: claude target generation --- +seed_workspace +"$WORK/bin/idstack-gen-skills" --target claude >/dev/null 2>&1 +assert "claude target creates SKILL.md" "[ -f \"$WORK/skills/test-skill/SKILL.md\" ]" +assert "claude target substitutes PREAMBLE" "grep -q 'PREAMBLE CONTENT' \"$WORK/skills/test-skill/SKILL.md\"" +assert "claude target substitutes MANIFEST_SCHEMA" "grep -q 'SCHEMA CONTENT' \"$WORK/skills/test-skill/SKILL.md\"" +assert "claude target preserves allowed-tools" "grep -q 'allowed-tools:' \"$WORK/skills/test-skill/SKILL.md\"" +assert "claude target injects auto-generated header" "grep -q 'AUTO-GENERATED' \"$WORK/skills/test-skill/SKILL.md\"" +assert "codex target NOT created" "[ ! -f \"$WORK/dist/codex/skills/idstack-test-skill/SKILL.md\" ]" +assert "AGENTS.md NOT created" "[ ! -f \"$WORK/AGENTS.md\" ]" + +# --- Test 3: codex target generation --- +seed_workspace +"$WORK/bin/idstack-gen-skills" --target codex >/dev/null 2>&1 +assert "codex target creates SKILL.md" "[ -f \"$WORK/dist/codex/skills/idstack-test-skill/SKILL.md\" ]" +assert "codex target substitutes PREAMBLE" "grep -q 'PREAMBLE CONTENT' \"$WORK/dist/codex/skills/idstack-test-skill/SKILL.md\"" +assert "codex target strips allowed-tools" "! grep -q 'allowed-tools:' \"$WORK/dist/codex/skills/idstack-test-skill/SKILL.md\"" +assert "AGENTS.md is created" "[ -f \"$WORK/AGENTS.md\" ]" +assert "claude target NOT created" "[ ! -f \"$WORK/skills/test-skill/SKILL.md\" ]" + +# --- Test 4: all target generation --- +seed_workspace +"$WORK/bin/idstack-gen-skills" >/dev/null 2>&1 +assert "all target creates claude SKILL.md" "[ -f \"$WORK/skills/test-skill/SKILL.md\" ]" +assert "all target creates codex SKILL.md" "[ -f \"$WORK/dist/codex/skills/idstack-test-skill/SKILL.md\" ]" +assert "all target creates AGENTS.md" "[ -f \"$WORK/AGENTS.md\" ]" + +# --- Test 5: --dry-run behavior --- +seed_workspace +"$WORK/bin/idstack-gen-skills" --target claude >/dev/null 2>&1 +assert "dry-run passes when fresh" "$WORK/bin/idstack-gen-skills --dry-run --target claude >/dev/null 2>&1" +echo "stale" >> "$WORK/skills/test-skill/SKILL.md" +set +e +"$WORK/bin/idstack-gen-skills" --dry-run --target claude >/dev/null 2>&1 +EC=$? +set -e +assert "dry-run exits 1 when stale" "[ $EC -eq 1 ]" + +# --- Test 6: Invalid target --- +seed_workspace +set +e +"$WORK/bin/idstack-gen-skills" --target bogus >/dev/null 2>&1 +EC=$? +set -e +assert "invalid target exits 2" "[ $EC -eq 2 ]" + +echo "" +echo "test-gen-skills: $PASS/$TOTAL passed, $FAIL failed" +[ "$FAIL" -eq 0 ] && exit 0 || exit 1