#!/usr/bin/env bash set -euo pipefail REQUIRED_FILES=( "docs/PI-RESEARCH.md" "docs/PI.md" "docs/PI-SUPERPOWERS.md" "skills/atlassian/pi/SKILL.md" "skills/create-plan/pi/SKILL.md" "skills/create-plan/pi/templates/continuation-runbook.md" "skills/create-plan/pi/templates/milestone-plan.md" "skills/create-plan/pi/templates/story-tracker.md" "skills/do-task/pi/SKILL.md" "skills/do-task/pi/templates/task-plan.md" "skills/implement-plan/pi/SKILL.md" "skills/web-automation/pi/SKILL.md" "skills/reviewer-runtime/pi/run-review.sh" "skills/reviewer-runtime/pi/notify-telegram.sh" "package.json" ) # These required-file checks are intentionally hard failures: removing any # required artifact should make this script exit non-zero immediately. for file in "${REQUIRED_FILES[@]}"; do test -f "$file" done test -x skills/reviewer-runtime/pi/run-review.sh test -x skills/reviewer-runtime/pi/notify-telegram.sh find skills/web-automation/pi/scripts -type f -print -quit | grep -q . find skills/atlassian/pi/scripts -type f -print -quit | grep -q . for file in skills/create-plan/pi/SKILL.md skills/do-task/pi/SKILL.md skills/implement-plan/pi/SKILL.md; do grep -q 'docs/PI-SUPERPOWERS.md' "$file" done ! grep -nE 'update_plan|plan mode|sub-agent|subagents' \ skills/create-plan/pi/SKILL.md \ skills/do-task/pi/SKILL.md \ skills/implement-plan/pi/SKILL.md node <<'EOF' const fs = require("fs"); const pkg = JSON.parse(fs.readFileSync("package.json", "utf8")); if (!pkg.pi || !Array.isArray(pkg.pi.skills) || pkg.pi.skills.length !== 5) { console.error("package.json must define pi.skills with exactly 5 entries"); process.exit(1); } if (!Array.isArray(pkg.files) || pkg.files.length === 0) { console.error("package.json must define a non-empty files allowlist"); process.exit(1); } if (!Array.isArray(pkg.keywords) || !pkg.keywords.includes("pi-package")) { console.error("package.json must include the pi-package keyword"); process.exit(1); } console.log("package metadata ok"); EOF echo "pi resources verified"