Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
842f760
chore(deps): update dependency @vanilla-extract/vite-plugin to v5 (#2…
renovate[bot] May 13, 2025
7cc034e
feat!: react 19 support (#2368)
dagatsoin May 14, 2025
71030ba
chore(deps): update node.js to v22 (#2339)
renovate[bot] May 14, 2025
f463ef7
chore(deps): update dependency cypress to v14 (#2367)
renovate[bot] May 14, 2025
7116bba
fix(deps): update dependency cookie to v1 (#2348)
renovate[bot] May 14, 2025
195c479
chore: v10.0.0
joshuaellis May 14, 2025
de1244b
fix: spring does not start (#2372)
dagatsoin May 21, 2025
2dec583
v10.0.1
joshuaellis May 21, 2025
197e0a7
fix: remove accessing elem.ref in renderTransitions (#2373)
robertjarske May 27, 2025
7cc1c90
fix: respect `immediate` option to `useResize` hook (#2375)
LoganDark May 27, 2025
8631391
v10.0.2
joshuaellis Sep 7, 2025
f69b748
fix: ref access issue in jest and legacy react apps (#2394)
dimitris-tsetsonis Sep 18, 2025
b6fbb98
v10.0.3
joshuaellis Sep 18, 2025
949bb28
docs: add gtm
joshuaellis Sep 28, 2025
b2d53b9
chore: update readme (#2399)
joshuaellis Sep 28, 2025
2ff6de7
Update README.md
joshuaellis Dec 9, 2025
6c37f69
fix: exitBeforeEnter in useTransition doesn't work when used with tra…
hiebj Feb 17, 2026
e0c2004
chore: update README
joshuaellis Mar 2, 2026
f6e6dee
chore: add claude.md
joshuaellis May 21, 2026
c31e03e
chore: absorb mock-raf (#2421)
joshuaellis May 21, 2026
7c46e7a
chore: add speckit (#2422)
joshuaellis May 21, 2026
099581a
chore: move to use PNPM (#2423)
joshuaellis May 21, 2026
2ee448c
test: migrate to vitest browser (#2424)
joshuaellis May 21, 2026
f000df6
chore(lint): replace eslint with oxlint (#2425)
joshuaellis May 21, 2026
5e92d00
chore(format): consolidate prettier configs (#2426)
joshuaellis May 21, 2026
45ece28
chore(format): replace prettier with oxfmt (#2427)
joshuaellis May 21, 2026
0b6dfbc
chore: migrate husky hooks to v9 syntax (#2428)
joshuaellis May 21, 2026
6b61ebe
fix: replace react-spring.io with react-spring.dev (#2429)
joshuaellis May 21, 2026
8da5e50
fix: events not firing when SpringRef attached manually under StrictM…
joshuaellis May 21, 2026
98d9f52
chore(test): run hook tests under React.StrictMode (#2431)
joshuaellis May 21, 2026
1fb03f4
fix(core): clear stale updates in useSprings layout effect (#2410)
gumob May 21, 2026
e5107dc
fix(shared): report border-box dimensions from useResize (#2432)
joshuaellis May 21, 2026
d332183
chore(ci): upgrade node to 22 lts (test on 22 and 24) (#2433)
joshuaellis May 21, 2026
0237157
chore(deps): update actions/setup-node action to v6 (#2412)
renovate[bot] May 21, 2026
a115ae4
chore(deps): update actions/checkout action to v6 (#2405)
renovate[bot] May 21, 2026
7a6545f
chore: add release PR workflow and npm provenance (#2434)
joshuaellis May 21, 2026
452a6ae
chore(ci): trim redundant node matrix and adopt .nvmrc in tests workf…
joshuaellis May 21, 2026
46f97db
fix(core): phase-sync useTrail children on loop iterations (#2435)
joshuaellis May 21, 2026
01810a4
fix(core): run async script `to` to completion under skipAnimation (#…
joshuaellis May 21, 2026
e84a977
chore(renovate): group deps by ecosystem and isolate majors (#2440)
joshuaellis May 21, 2026
344972e
fix(web): remove animated attributes when value is undefined (#2439)
joshuaellis May 21, 2026
85cd49e
chore: use workspace protocol for internal deps
joshuaellis May 21, 2026
6825233
chore: remove circular deps issue
joshuaellis May 21, 2026
ee556ba
chore: version packages (#2449)
github-actions[bot] May 21, 2026
84559f9
chore(deps): update actions/cache action to v5 (#2448)
renovate[bot] May 21, 2026
59beca9
chore(deps): update actions/download-artifact action to v8 (#2444)
renovate[bot] May 21, 2026
81db029
chore(deps): update actions/upload-artifact action to v7 (#2445)
renovate[bot] May 21, 2026
8c07a64
chore(deps): update dorny/paths-filter action to v4 (#2446)
renovate[bot] May 21, 2026
4141389
chore(deps): update pnpm/action-setup action to v6 (#2447)
renovate[bot] May 21, 2026
122059b
chore(ci): refresh typescript test matrix to 5.0, 5.4, 5.7 (#2443)
joshuaellis May 21, 2026
4994f17
chore: rennovate should still group majors
joshuaellis May 21, 2026
743b517
chore(deps): update dependency @commitlint/cli to v21 (#2451)
renovate[bot] May 21, 2026
78f33d6
chore(deps): update build-tooling (#2460)
renovate[bot] May 22, 2026
b97ce23
fix(deps): update react (#2459)
renovate[bot] May 22, 2026
517c755
chore(deps): update dependency @changesets/cli to v2.31.0 (#2461)
renovate[bot] May 22, 2026
145a912
chore(deps): update vitest (#2450)
renovate[bot] May 22, 2026
230fe44
chore(deps): update dependency @commitlint/config-conventional to v21…
renovate[bot] May 22, 2026
6338cef
test(types): restore TypeScript 5.9 to CI matrix (#2464)
joshuaellis May 22, 2026
7ccf419
test(types): restore TypeScript 6.0 to CI matrix (#2465)
joshuaellis May 22, 2026
027a133
test(core): write bodies for skipped and todo tests (#2466)
joshuaellis May 22, 2026
f9a1857
fix(shared): preserve decimal precision in string interpolator (#2469)
joshuaellis May 22, 2026
f1448dd
feat(docs): migrate from Remix 2 to React Router 7 (#2468)
joshuaellis May 22, 2026
ecfad58
fix(deps): update react-three (#2462)
renovate[bot] May 22, 2026
24f96f6
chore(deps): update dependency react-native to >=0.85.3 (#2472)
renovate[bot] May 22, 2026
8e9876f
fix(core): stop superseded loop chains on re-render (#2471)
joshuaellis May 22, 2026
a399e1f
fix(deps): update dependency csstype to ^3.2.3 (#2473)
renovate[bot] May 22, 2026
9523dde
fix(deps): update dependency react-select to v5.10.2 (#2475)
renovate[bot] May 22, 2026
a147b8b
fix(deps): update dependency isbot to v5.1.40 (#2474)
renovate[bot] May 22, 2026
27ed33d
fix(deps): update radix-ui (#2478)
renovate[bot] May 22, 2026
3a32ad2
chore(deps): update dependency concurrently to v9.2.1 (#2479)
renovate[bot] May 22, 2026
cb5202c
chore(deps): update styfle/cancel-workflow-action action to v0.13.1 (…
renovate[bot] May 22, 2026
f6d518b
fix(deps): update dependency @codesandbox/sandpack-react to v2.20.0 (…
renovate[bot] May 22, 2026
7c1493d
fix(deps): update dependency @vercel/analytics to v2 (#2497)
renovate[bot] May 22, 2026
8177b19
fix(deps): update dependency zod to v4 (#2501)
renovate[bot] May 22, 2026
07e2e30
chore(deps): update node.js to v24 (#2493)
renovate[bot] May 22, 2026
eaecfbb
chore(deps): update dependency fs-extra to v11 (#2490)
renovate[bot] May 22, 2026
439e880
fix(deps): update dependency lodash-es to v4.18.1 (#2485)
renovate[bot] May 22, 2026
ec6f07a
chore(deps): update remark-rehype (#2494)
renovate[bot] May 22, 2026
3687915
fix(deps): update dependency @react-spring/web to v10 (#2496)
renovate[bot] May 22, 2026
5e241ac
fix(deps): update dependency lorem-ipsum to v3 (#2498)
renovate[bot] May 22, 2026
7b8afcb
fix(deps): update dependency sass to v1.100.0 (#2486)
renovate[bot] May 22, 2026
10677b6
fix(deps): update dependency cookie to v1.1.1 (#2483)
renovate[bot] May 22, 2026
d741d0d
chore(deps): update dependency chokidar to v5 (#2489)
renovate[bot] May 22, 2026
73ca1b7
fix(deps): update dependency wouter to v3 (#2500)
renovate[bot] May 22, 2026
fdc2efa
fix(deps): update dependency leva to v0.10.1 (#2484)
renovate[bot] May 22, 2026
73fcd1d
chore(deps): update konva (#2492)
renovate[bot] May 22, 2026
4338c49
fix(deps): update mdx to v3.1.1 (#2477)
renovate[bot] May 22, 2026
68eb39e
chore(deps): update dependency esbuild to v0.28.0 (#2480)
renovate[bot] May 22, 2026
70ac369
fix(deps): update dependency react-use-measure to v2.1.7 (#2476)
renovate[bot] May 22, 2026
2bf8467
fix(deps): update dependency next to v16 (#2499)
renovate[bot] May 22, 2026
313e92d
fix(deps): update vanilla-extract (#2488)
renovate[bot] May 22, 2026
9948bb7
fix(deps): update dependency styled-components to v6.4.2 (#2487)
renovate[bot] May 22, 2026
2e5b97a
test(core): regression tests for issue #1638 (#2504)
joshuaellis May 22, 2026
39f78e1
chore: replace deprecated @vitejs/plugin-react-refresh (#2505)
joshuaellis May 22, 2026
4400f9e
fix(deps): update docsearch to v4 (#2502)
renovate[bot] May 22, 2026
444fb11
chore(demo): replace deprecated react-use-gesture with @use-gesture/r…
joshuaellis May 22, 2026
bdf01d8
fix(deps): update vite (#2495)
renovate[bot] May 22, 2026
020410e
chore(deps): lock file maintenance (#2503)
renovate[bot] May 22, 2026
9765d75
fix(core): expose new phase to useTransition render fn (#2507)
joshuaellis May 22, 2026
f2990d4
docs: clarify SpringValues typing vs CSSProperties (#2508)
joshuaellis May 22, 2026
9d2a2e0
fix(docs): adapt rehype-highlight to refractor v5 export map
joshuaellis May 22, 2026
db69980
fix(docs): @vanilla-extract v1.20 compatibility
joshuaellis May 22, 2026
853c625
fix(docs): satisfy React 19 cloneElement typing in AccessibleIcon
joshuaellis May 22, 2026
a5d9d4b
test(core): regression test for issue #1661 (#2509)
joshuaellis May 22, 2026
cd13304
feat(core): add `reverse` prop to useTransition (#2510)
joshuaellis May 22, 2026
78bbfa7
docs(claude): refresh stale Node version notes (#2512)
joshuaellis May 22, 2026
d886f1b
refactor(build): migrate tsup → tsdown (#2513)
joshuaellis May 22, 2026
84b058a
fix(core): fire onRest when animation is cancelled before its first f…
joshuaellis May 22, 2026
ea58a76
chore(deps): update typescript to v6 (#2514)
joshuaellis May 22, 2026
5812ef4
chore(docs): move to GCP
joshuaellis May 22, 2026
c220465
fix(web): exact-match transform function names in style key regex (#2…
joshuaellis May 22, 2026
6bd6613
fix(core): preserve velocity across retargets for decay animations (#…
joshuaellis May 22, 2026
b400824
chore: update pnpm lock file
joshuaellis May 22, 2026
3d0ca63
chore: version packages (#2517)
github-actions[bot] May 22, 2026
79804ba
chore: update CONTRIBUTING
joshuaellis May 23, 2026
831a1bd
fix(core): floor adaptive precision at float resolution to let spring…
joshuaellis May 23, 2026
4c29e92
chore(deps): update build-tooling (#2524)
renovate[bot] Jun 8, 2026
27bfec7
chore(deps): update commitlint to v21.0.2 (#2525)
renovate[bot] Jun 8, 2026
822ceb0
fix(parallax): pin container to top-left to prevent double scrollbar …
joshuaellis Jun 8, 2026
5c39616
docs(core): clarify null/undefined goals are skipped, not animated (#…
joshuaellis Jun 9, 2026
6110c76
fix(shared): guard string interpolator against number-less output val…
joshuaellis Jun 9, 2026
5c5972b
test(parallax): pin #2052 sticky-layer-in-component regression (#2530)
joshuaellis Jun 9, 2026
328f2bc
test(core): cover declarative useSpring auto-start under StrictMode (…
joshuaellis Jun 9, 2026
4eed726
fix(core): auto-start useTransition when props is a function (#2287) …
joshuaellis Jun 9, 2026
4bf13b7
fix(animated): use WeakMap fallback for non-extensible component caching
AndreiCalazans Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 5 additions & 2 deletions .changeset/config.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
{
"$schema": "https://unpkg.com/@changesets/config@1.6.0/schema.json",
"changelog": false,
"changelog": [
"@changesets/changelog-github",
{ "repo": "pmndrs/react-spring" }
],
"commit": false,
"fixed": [["@react-spring/*"]],
"linked": [],
"access": "public",
"baseBranch": "main",
"baseBranch": "next",
"updateInternalDependencies": "patch",
"ignore": ["@react-spring/demo", "@react-spring/docs"]
}
5 changes: 5 additions & 0 deletions .changeset/parallax-pin-container.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@react-spring/parallax': patch
---

Pin the `Parallax` container to its top-left corner (`top: 0; left: 0`). The container is `position: absolute` but previously set no offsets, so it inherited its static position. Host layouts that shift that position — such as the `place-items: center` in Vite's default `index.css` — pushed the viewport-height container below the viewport, giving the document its own scrollbar on top of the container's, hence the "double scrollbar". Closes #2255.
5 changes: 5 additions & 0 deletions .changeset/spring-precision-floor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@react-spring/core': patch
---

Floor the spring's adaptive precision at the smallest difference doubles can represent around the values being animated. Previously, when a caller's layout math introduced tiny floating-point drift on the target (e.g. `Math.cos(Math.PI / 2)` returning `6e-17` instead of `0`, so a "logical 160" arrived as `159.99999999999997`), the adaptive precision collapsed to a value smaller than any delta the spring could express, so the animation never settled and the awaited `start()` promise never resolved. Closes #2208.
5 changes: 5 additions & 0 deletions .changeset/string-interpolator-null-match.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@react-spring/shared': patch
---

Stop the string interpolator throwing `Cannot read properties of null (reading 'map')` when an output value contains no numbers. Strings like `boxShadow: 'none'` or an unresolved CSS variable that falls through as its literal `var(--x)` text now extract to no numeric tokens and interpolate gracefully instead of hitting a null `String.match`. Closes #2327.
5 changes: 5 additions & 0 deletions .changeset/transition-function-autostart.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@react-spring/core': patch
---

Auto-start `useTransition` when `props` is a function. The function/`deps` form creates an internal `SpringRef`, which was assigned to every controller and treated like an injected ref, so the documented `useTransition(data, () => ({ ... }))` form never started its enter animation. `useTransition` now matches `useSpring`/`useSprings`: only an _injected_ ref (via `config.ref`) defers auto-start, so `useChain` and StrictMode remounts keep working. Note: if you previously worked around this by calling `api.start()` manually on the function form, the transition now also auto-starts. Closes #2287.
269 changes: 269 additions & 0 deletions .claude/skills/speckit-analyze/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,269 @@
---
name: 'speckit-analyze'
description: 'Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation.'
argument-hint: 'Optional focus areas for analysis'
compatibility: 'Requires spec-kit project structure with .specify/ directory'
metadata:
author: 'github-spec-kit'
source: 'templates/commands/analyze.md'
user-invocable: true
disable-model-invocation: false
---

## User Input

```text
$ARGUMENTS
```

You **MUST** consider the user input before proceeding (if not empty).

## Pre-Execution Checks

**Check for extension hooks (before analysis)**:

- Check if `.specify/extensions.yml` exists in the project root.
- If it exists, read it and look for entries under the `hooks.before_analyze` key
- If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally
- Filter out hooks where `enabled` is explicitly `false`. Treat hooks without an `enabled` field as enabled by default.
- For each remaining hook, do **not** attempt to interpret or evaluate hook `condition` expressions:
- If the hook has no `condition` field, or it is null/empty, treat the hook as executable
- If the hook defines a non-empty `condition`, skip the hook and leave condition evaluation to the HookExecutor implementation
- When constructing slash commands from hook command names, replace dots (`.`) with hyphens (`-`). For example, `speckit.git.commit` → `/speckit-git-commit`.
- For each executable hook, output the following based on its `optional` flag:
- **Optional hook** (`optional: true`):

```
## Extension Hooks

**Optional Pre-Hook**: {extension}
Command: `/{command}`
Description: {description}

Prompt: {prompt}
To execute: `/{command}`
```

- **Mandatory hook** (`optional: false`):

```
## Extension Hooks

**Automatic Pre-Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}

Wait for the result of the hook command before proceeding to the Goal.
```

- If no hooks are registered or `.specify/extensions.yml` does not exist, skip silently

## Goal

Identify inconsistencies, duplications, ambiguities, and underspecified items across the three core artifacts (`spec.md`, `plan.md`, `tasks.md`) before implementation. This command MUST run only after `/speckit-tasks` has successfully produced a complete `tasks.md`.

## Operating Constraints

**STRICTLY READ-ONLY**: Do **not** modify any files. Output a structured analysis report. Offer an optional remediation plan (user must explicitly approve before any follow-up editing commands would be invoked manually).

**Constitution Authority**: The project constitution (`.specify/memory/constitution.md`) is **non-negotiable** within this analysis scope. Constitution conflicts are automatically CRITICAL and require adjustment of the spec, plan, or tasks—not dilution, reinterpretation, or silent ignoring of the principle. If a principle itself needs to change, that must occur in a separate, explicit constitution update outside `/speckit-analyze`.

## Execution Steps

### 1. Initialize Analysis Context

Run `.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks` once from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS. Derive absolute paths:

- SPEC = FEATURE_DIR/spec.md
- PLAN = FEATURE_DIR/plan.md
- TASKS = FEATURE_DIR/tasks.md

Abort with an error message if any required file is missing (instruct the user to run missing prerequisite command).
For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot").

### 2. Load Artifacts (Progressive Disclosure)

Load only the minimal necessary context from each artifact:

**From spec.md:**

- Overview/Context
- Functional Requirements
- Success Criteria (measurable outcomes — e.g., performance, security, availability, user success, business impact)
- User Stories
- Edge Cases (if present)

**From plan.md:**

- Architecture/stack choices
- Data Model references
- Phases
- Technical constraints

**From tasks.md:**

- Task IDs
- Descriptions
- Phase grouping
- Parallel markers [P]
- Referenced file paths

**From constitution:**

- Load `.specify/memory/constitution.md` for principle validation

### 3. Build Semantic Models

Create internal representations (do not include raw artifacts in output):

- **Requirements inventory**: For each Functional Requirement (FR-###) and Success Criterion (SC-###), record a stable key. Use the explicit FR-/SC- identifier as the primary key when present, and optionally also derive an imperative-phrase slug for readability (e.g., "User can upload file" → `user-can-upload-file`). Include only Success Criteria items that require buildable work (e.g., load-testing infrastructure, security audit tooling), and exclude post-launch outcome metrics and business KPIs (e.g., "Reduce support tickets by 50%").
- **User story/action inventory**: Discrete user actions with acceptance criteria
- **Task coverage mapping**: Map each task to one or more requirements or stories (inference by keyword / explicit reference patterns like IDs or key phrases)
- **Constitution rule set**: Extract principle names and MUST/SHOULD normative statements

### 4. Detection Passes (Token-Efficient Analysis)

Focus on high-signal findings. Limit to 50 findings total; aggregate remainder in overflow summary.

#### A. Duplication Detection

- Identify near-duplicate requirements
- Mark lower-quality phrasing for consolidation

#### B. Ambiguity Detection

- Flag vague adjectives (fast, scalable, secure, intuitive, robust) lacking measurable criteria
- Flag unresolved placeholders (TODO, TKTK, ???, `<placeholder>`, etc.)

#### C. Underspecification

- Requirements with verbs but missing object or measurable outcome
- User stories missing acceptance criteria alignment
- Tasks referencing files or components not defined in spec/plan

#### D. Constitution Alignment

- Any requirement or plan element conflicting with a MUST principle
- Missing mandated sections or quality gates from constitution

#### E. Coverage Gaps

- Requirements with zero associated tasks
- Tasks with no mapped requirement/story
- Success Criteria requiring buildable work (performance, security, availability) not reflected in tasks

#### F. Inconsistency

- Terminology drift (same concept named differently across files)
- Data entities referenced in plan but absent in spec (or vice versa)
- Task ordering contradictions (e.g., integration tasks before foundational setup tasks without dependency note)
- Conflicting requirements (e.g., one requires Next.js while other specifies Vue)

### 5. Severity Assignment

Use this heuristic to prioritize findings:

- **CRITICAL**: Violates constitution MUST, missing core spec artifact, or requirement with zero coverage that blocks baseline functionality
- **HIGH**: Duplicate or conflicting requirement, ambiguous security/performance attribute, untestable acceptance criterion
- **MEDIUM**: Terminology drift, missing non-functional task coverage, underspecified edge case
- **LOW**: Style/wording improvements, minor redundancy not affecting execution order

### 6. Produce Compact Analysis Report

Output a Markdown report (no file writes) with the following structure:

## Specification Analysis Report

| ID | Category | Severity | Location(s) | Summary | Recommendation |
| --- | ----------- | -------- | ---------------- | ---------------------------- | ------------------------------------ |
| A1 | Duplication | HIGH | spec.md:L120-134 | Two similar requirements ... | Merge phrasing; keep clearer version |

(Add one row per finding; generate stable IDs prefixed by category initial.)

**Coverage Summary Table:**

| Requirement Key | Has Task? | Task IDs | Notes |
| --------------- | --------- | -------- | ----- |

**Constitution Alignment Issues:** (if any)

**Unmapped Tasks:** (if any)

**Metrics:**

- Total Requirements
- Total Tasks
- Coverage % (requirements with >=1 task)
- Ambiguity Count
- Duplication Count
- Critical Issues Count

### 7. Provide Next Actions

At end of report, output a concise Next Actions block:

- If CRITICAL issues exist: Recommend resolving before `/speckit-implement`
- If only LOW/MEDIUM: User may proceed, but provide improvement suggestions
- Provide explicit command suggestions: e.g., "Run /speckit-specify with refinement", "Run /speckit-plan to adjust architecture", "Manually edit tasks.md to add coverage for 'performance-metrics'"

### 8. Offer Remediation

Ask the user: "Would you like me to suggest concrete remediation edits for the top N issues?" (Do NOT apply them automatically.)

### 9. Check for extension hooks

After reporting, check if `.specify/extensions.yml` exists in the project root.

- If it exists, read it and look for entries under the `hooks.after_analyze` key
- If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally
- Filter out hooks where `enabled` is explicitly `false`. Treat hooks without an `enabled` field as enabled by default.
- For each remaining hook, do **not** attempt to interpret or evaluate hook `condition` expressions:
- If the hook has no `condition` field, or it is null/empty, treat the hook as executable
- If the hook defines a non-empty `condition`, skip the hook and leave condition evaluation to the HookExecutor implementation
- When constructing slash commands from hook command names, replace dots (`.`) with hyphens (`-`). For example, `speckit.git.commit` → `/speckit-git-commit`.
- For each executable hook, output the following based on its `optional` flag:
- **Optional hook** (`optional: true`):

```
## Extension Hooks

**Optional Hook**: {extension}
Command: `/{command}`
Description: {description}

Prompt: {prompt}
To execute: `/{command}`
```

- **Mandatory hook** (`optional: false`):

```
## Extension Hooks

**Automatic Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
```

- If no hooks are registered or `.specify/extensions.yml` does not exist, skip silently

## Operating Principles

### Context Efficiency

- **Minimal high-signal tokens**: Focus on actionable findings, not exhaustive documentation
- **Progressive disclosure**: Load artifacts incrementally; don't dump all content into analysis
- **Token-efficient output**: Limit findings table to 50 rows; summarize overflow
- **Deterministic results**: Rerunning without changes should produce consistent IDs and counts

### Analysis Guidelines

- **NEVER modify files** (this is read-only analysis)
- **NEVER hallucinate missing sections** (if absent, report them accurately)
- **Prioritize constitution violations** (these are always CRITICAL)
- **Use examples over exhaustive rules** (cite specific instances, not generic patterns)
- **Report zero issues gracefully** (emit success report with coverage statistics)

## Context

$ARGUMENTS
Loading