diff --git a/.github/workflows/ensure-skill-version-check.yml b/.github/workflows/ensure-skill-version-check.yml
new file mode 100644
index 000000000..c78f6a189
--- /dev/null
+++ b/.github/workflows/ensure-skill-version-check.yml
@@ -0,0 +1,58 @@
+name: validate-skill-version-check
+
+on:
+ pull_request:
+ branches:
+ - main
+ paths:
+ - "plugins/power-pages/skills/**"
+
+permissions:
+ contents: write
+
+jobs:
+ validate-skill-version-check:
+ name: validate-skill-version-check
+ runs-on: ubuntu-latest
+ steps:
+ - name: generate app token
+ if: ${{ github.event.pull_request.head.repo.fork == false }}
+ id: app-token
+ uses: actions/create-github-app-token@v1
+ with:
+ app-id: 3189942
+ private-key: ${{ secrets.POWER_PLATFORM_SKILLS_APP_PRIVATE_KEY }}
+
+ - name: checkout (non-fork)
+ if: ${{ github.event.pull_request.head.repo.fork == false }}
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.head_ref }}
+ token: ${{ steps.app-token.outputs.token }}
+
+ - name: checkout (fork)
+ if: ${{ github.event.pull_request.head.repo.fork == true }}
+ uses: actions/checkout@v4
+
+ - name: setup-node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+
+ - name: check-only (fork)
+ if: ${{ github.event.pull_request.head.repo.fork == true }}
+ run: node scripts/ensure-skill-version-check.js --check
+
+ - name: add missing version checks (non-fork)
+ if: ${{ github.event.pull_request.head.repo.fork == false }}
+ run: node scripts/ensure-skill-version-check.js
+
+ - name: commit and push if changed (non-fork)
+ if: ${{ github.event.pull_request.head.repo.fork == false }}
+ run: |
+ git diff --quiet && exit 0
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+ git add "plugins/power-pages/skills/*/SKILL.md"
+ git commit -m "Auto-add plugin version check to SKILL.md files"
+ git push
diff --git a/plugins/power-pages/.claude-plugin/plugin.json b/plugins/power-pages/.claude-plugin/plugin.json
index b1b60b616..7bed12d64 100644
--- a/plugins/power-pages/.claude-plugin/plugin.json
+++ b/plugins/power-pages/.claude-plugin/plugin.json
@@ -1,6 +1,6 @@
{
"name": "power-pages",
- "version": "1.1.2",
+ "version": "1.2.0",
"description": "Create and deploy Power Pages sites using modern development approaches. Supports code sites (SPAs) with React, Angular, Vue, or Astro, with more site types coming soon.",
"author": {
"name": "Microsoft",
diff --git a/plugins/power-pages/AGENTS.md b/plugins/power-pages/AGENTS.md
index c3ce179f7..d3a4cc088 100644
--- a/plugins/power-pages/AGENTS.md
+++ b/plugins/power-pages/AGENTS.md
@@ -44,7 +44,17 @@ model: opus
---
```
-Note: `allowed-tools` must be a comma-separated list, not JSON array or YAML list syntax.
+Note: `allowed-tools` must be a comma-separated list, not JSON array or YAML list syntax. Do not add `hooks` to skill frontmatter; Power Pages skills register lifecycle hooks centrally.
+
+### Plugin Version Check
+
+Every SKILL.md must include the following line immediately after the closing `---` of the frontmatter (before the `#` title):
+
+```markdown
+> **Plugin check**: Run `node "${CLAUDE_PLUGIN_ROOT}/scripts/check-version.js"` — if it outputs a message, show it to the user before proceeding.
+```
+
+This runs a lightweight check comparing the local plugin version against `origin/main` and shows an update notice if a newer version is available.
### Key Patterns
@@ -58,6 +68,16 @@ Note: `allowed-tools` must be a comma-separated list, not JSON array or YAML lis
- **Skill tracking** — Every skill must record usage in its final phase via `> Reference: ${CLAUDE_PLUGIN_ROOT}/references/skill-tracking-reference.md` (pointer pattern, not hardcoded command). When adding a new skill, also add its entry to the skill name mapping table in `references/skill-tracking-reference.md`.
- **Dataverse API calls** — Use deterministic Node.js scripts (in the skill's `scripts/` directory) for Dataverse API queries. Scripts should import `getAuthToken` and `makeRequest` from `scripts/lib/validation-helpers.js`. Never use inline PowerShell `Invoke-RestMethod` for API calls — scripts are more reliable, testable, and cross-platform.
+## Common Review Pitfalls
+
+These patterns have caused repeated PR review feedback. Check for them before submitting changes to skills, validators, or hooks.
+
+- **Phase cross-references break silently** — When renumbering or reordering phases in a SKILL.md, also update: `references/` docs that mention phase numbers, the Key Decision Points section, and any other files that cross-reference this skill's phases. After any phase reorder, grep for the old phase number across the skill directory and its references.
+- **Validators must match the exact constraint** — If the rule is "no exports at all", block all `module.exports`/`exports` — don't just check if exported names are in an allowlist. If the rule is "try/catch required", verify both `try` AND `catch` exist. Re-read the exact constraint from SKILL.md and test the boundary cases.
+- **Hook scripts run on every Skill tool use** — The PostToolUse hook fires for all tracked skills, so unconditional `process.stderr.write` creates noise. Gate debug logging behind `process.env.DEBUG`. Only errors should go to stderr unconditionally.
+- **Template placeholders in `
+
+