vigiles 10.0.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +113 -83
  2. package/dist/adapters/claude-code/dialect.js +15 -0
  3. package/dist/audit-report.d.ts +1 -1
  4. package/dist/audit-report.template.html +1 -1
  5. package/dist/audit-score.d.ts +19 -12
  6. package/dist/audit-score.js +65 -11
  7. package/dist/cli.js +249 -0
  8. package/dist/core/CLAUDE.md.spec.d.ts +3 -0
  9. package/dist/core/CLAUDE.md.spec.js +26 -0
  10. package/dist/core/delegation-trifecta.d.ts +64 -0
  11. package/dist/core/delegation-trifecta.js +124 -0
  12. package/dist/core/dialect.d.ts +18 -0
  13. package/dist/core/hook-block-ineffective.d.ts +62 -0
  14. package/dist/core/hook-block-ineffective.js +153 -0
  15. package/dist/core/hook-matcher.d.ts +66 -0
  16. package/dist/core/hook-matcher.js +182 -0
  17. package/dist/core/hook-normalize.d.ts +43 -0
  18. package/dist/core/hook-normalize.js +78 -0
  19. package/dist/core/lethal-trifecta.d.ts +100 -0
  20. package/dist/core/lethal-trifecta.js +197 -0
  21. package/dist/core/plugin-dir-layout.d.ts +30 -0
  22. package/dist/core/plugin-dir-layout.js +73 -0
  23. package/dist/core/rule-meta.d.ts +82 -0
  24. package/dist/core/rule-meta.js +266 -0
  25. package/dist/core/skill-missing-fence.d.ts +47 -0
  26. package/dist/core/skill-missing-fence.js +119 -0
  27. package/dist/core/skill-resources.d.ts +27 -0
  28. package/dist/core/skill-resources.js +167 -0
  29. package/dist/core/types.d.ts +71 -0
  30. package/dist/core/validate.d.ts +1 -0
  31. package/dist/core/validate.js +26 -4
  32. package/dist/leaderboard.d.ts +1 -0
  33. package/dist/leaderboard.js +42 -4
  34. package/dist/scan.d.ts +106 -0
  35. package/dist/scan.js +251 -45
  36. package/dist/setup-plan.d.ts +6 -3
  37. package/dist/setup-plan.js +12 -2
  38. package/package.json +1 -1
package/README.md CHANGED
@@ -6,13 +6,16 @@
6
6
  SPINE = CONCEPT 5 (proof/demo-led). Lead with REAL, screenshotable catches on
7
7
  plugins people actually ship, THEN explain the mechanism. The proofs are not
8
8
  illustrative — every block traces to a real dogfood run captured in
9
- research/dogfood/. TWO COMMUNITY catches, anonymized (a skill-description collision
10
- wrong-skill-fires (claude-flow, Triggering F), an AskUserQuestion-never-available
11
- tool)both real GRADED defects that REPRODUCE on current main. NEVER replace a
12
- real catch with a fabricated one. (Proof 1 was a missing-SKILL.md/Truthfulness
13
- catch, swapped 2026-06-28: its source (superpowers) is clean on current main and NO
14
- reproducible dead-file-ref exists in popular OSS those are an adopt+strengthen
15
- payoff, see research/oss-audit-render-findings.md.)
9
+ research/dogfood/. THREE COMMUNITY catches, anonymized (2026-06-29: Proof 1 is now a
10
+ lethal-trifecta exfil path Safety 80, from madappgang's `tester` shown as
11
+ "my-plugin"added to pay off the new Safety-ring hero; Proof 2 a skill-description
12
+ collision wrong-skill-fires (claude-flow, Triggering F); Proof 3 an
13
+ AskUserQuestion-never-available tool) all real GRADED/structural defects that
14
+ REPRODUCE on current main. NEVER replace a real catch with a fabricated one. (The
15
+ earlier Proof 1 was a missing-SKILL.md/Truthfulness catch, swapped 2026-06-28: its
16
+ source (superpowers) is clean on current main and NO reproducible dead-file-ref
17
+ exists in popular OSS — those are an adopt+strengthen payoff, see
18
+ research/oss-audit-render-findings.md.)
16
19
 
17
20
  WHY ONLY TWO (decided 2026-06-28): the earlier Proofs 3-4 leaned on
18
21
  pr-review-toolkit's "review agents inherit all tools" as an official-plugin
@@ -45,13 +48,32 @@
45
48
  6. NO INTERNAL VOCABULARY (moat / measurement-authority / flywheel) and NO
46
49
  research/ links — name the user benefit.
47
50
  7. ASSETS: the hero vigiles-audit.png is a REAL current report (a community
48
- plugin rendered as "my-plugin" to anonymize) — A 92 with four rings and an
49
- inline subagent-tool-contract fix; no dialect-drift banner (HTML report is
50
- terminal-banner-free by design). Re-render via headless Chromium on the React
51
- report if the UI changes. (vigiles-demo.gif was removed
51
+ plugin rendered as "my-plugin" to anonymize) — C 72 with five rings, the
52
+ SAFETY ring (80) flagging a subagent holding all three lethal-trifecta legs
53
+ (a prompt-injection exfil path) + an inline subagent-tool-contract fix; the
54
+ dramatic Safety catch is the whole point of leading with this report (chose
55
+ the "bite" over a clean A 92 on 2026-06-29). No dialect-drift banner (HTML
56
+ report is terminal-banner-free by design). Re-render via headless Chromium on
57
+ the React report if the UI changes (recipe: copy a trifecta-bearing plugin to
58
+ my-plugin/, `node dist/cli.js audit my-plugin --no-json --no-serve`,
59
+ headless_shell `--window-size=820,1180 --force-device-scale-factor=2
60
+ --screenshot` on vigiles-report.html, then `rm -rf my-plugin
61
+ vigiles-report.html`). (vigiles-demo.gif was removed
52
62
  from Proof 1 — it rendered as a frozen half-typed terminal and was redundant
53
63
  with the code block; if a lint demo returns, it belongs in the Lint section
54
64
  with a non-frozen asset.)
65
+
66
+ READABILITY (the 2026-06-29 pass — why this reads the way it does):
67
+ A. ONE bold per block, on the single phrase the eye should catch. Bold
68
+ everywhere = bold nowhere. Link CTAs may stay bold (they're navigation).
69
+ B. ONE idea per sentence. No em-dash clause-chains, no stacked parentheticals.
70
+ If a clause needs a paren, cut it or give it its own line.
71
+ C. PLAIN words in every LEAD; push jargon (rings, recall/precision,
72
+ interceptTools, selector, deterministic) into the linked docs. A skimmer who
73
+ lives in Claude Code still may not know the vocabulary.
74
+ D. SHOW via the proofs/code blocks; don't stack adjectives ("real, popular,
75
+ free, model-less") on top of what the block already proves.
76
+ E. SELL the outcome before the mechanism; the instruments come AFTER the proofs.
55
77
  -->
56
78
 
57
79
  <p align="center">
@@ -61,7 +83,7 @@
61
83
  <h1 align="center">vigiles</h1>
62
84
 
63
85
  <p align="center">
64
- <strong>The tests your AI agent harness never had.</strong>
86
+ <strong>The tests your agent's skills and hooks never had.</strong>
65
87
  </p>
66
88
 
67
89
  <p align="center">
@@ -72,126 +94,133 @@
72
94
 
73
95
  ---
74
96
 
75
- **You installed a bunch of plugins and wrote a few skills but do they actually work?**
76
- A skill that never fires, two skills the agent can't tell apart, a subagent wired to
77
- a tool that doesn't exist your harness fails **silently**, and you find out mid-task.
97
+ **You installed some plugins and wrote a few skills. Do they actually work?**
98
+
99
+ Your skills, hooks, and instructions are your agent's **harness** the half you wrote
100
+ and own, and the half nothing checks. A skill that never fires. Two skills the agent
101
+ confuses. A subagent wired to a tool that doesn't exist. It breaks silently, and you
102
+ find out mid-task.
78
103
 
79
- **It's a library with no tests.** One command runs them — no key, no config, safe on
80
- any repo:
104
+ It's a library with no tests. This runs them:
81
105
 
82
106
  ```bash
83
107
  npx vigiles audit
84
108
  ```
85
109
 
86
- Here's what it found on real, popular plugins. ↓
110
+ No key, no config, safe on any repo. Here's what it caught on plugins people actually
111
+ ship. ↓
87
112
 
88
- ## The report
113
+ ## What it caught
89
114
 
90
115
  <p align="center">
91
- <img src="vigiles-audit.png" width="760" alt="vigiles audit report: an overall A (92/100) score with four category rings — Truthfulness, Triggering, Structure, Tested — and an inline fix card for a subagent declaring a tool that doesn't exist" />
116
+ <img src="vigiles-audit.png" width="760" alt="vigiles audit report scoring my-plugin C (72/100): five categories scored A–F — Truthfulness, Triggering, Structure, Safety, Tested — with the Safety category flagging a subagent that holds all three lethal-trifecta legs (a prompt-injection exfil path), plus an inline fix card for a subagent declaring a tool that doesn't exist" />
92
117
  </p>
93
118
 
94
- Four deterministic rings, **each finding's fix inline**, and a shareable HTML report.
95
- Like Lighthouse, `audit` is a **local report you run on your machine** — safe on any
96
- repo (even one wired to prod), identical on every OS. **Not a CI step** (CI uses
97
- `lint`). **[Audit a harness →](docs/for-plugin-authors.md)**
119
+ **Like Google's Lighthouse, but for your agent harness.** Five categories, each scored
120
+ A–F — Truthfulness, Triggering, Structure, Safety, Tested with every fix shown inline.
121
+
122
+ It runs locally and only reads, so it's safe on any repo and the same on every OS.
123
+ For CI gating, use `vigiles lint` instead. **[Audit a harness →](docs/for-plugin-authors.md)**
98
124
 
99
- ## Proof 1 — two skills your agent can't tell apart
125
+ ## Proof 1 — your agent can read your secrets and ship them out
100
126
 
101
127
  ```text
102
- Triggering 0
103
- 45 near-identical skill descriptions the selector can't tell them apart,
104
- so the wrong one fires (e.g. "agent-coder" "agent-tester", 83% alike)
128
+ Safety 80 (80/100)
129
+ subagent "tester" holds all three lethal-trifecta legs:
130
+ reads private data (Bash, Read) · takes in untrusted web content (WebFetch)
131
+ · can send data out (Bash, WebFetch)
105
132
  ```
106
133
 
107
- A real, popular plugin ships **45 skill pairs** described so similarly the model
108
- can't reliably pick between them so it fires the **wrong** skill. Valid markdown;
109
- the selector chooses by description, and near-identical text collides.
134
+ Give one subagent all three powers and it's a **prompt-injection exfil path**: a poisoned
135
+ web page can tell it to read your `.env` and POST it anywhere no exploit code, just the
136
+ tools it was handed. vigiles flags it from the tool list alone, free, no model.
137
+ **[How the Safety check works →](docs/for-plugin-authors.md)**
138
+
139
+ ## Proof 2 — two skills your agent can't tell apart
140
+
141
+ ```text
142
+ ✗ Triggering 0 (0/100)
143
+ └ 45 pairs of near-identical skill descriptions — the agent can't tell them
144
+ apart, so the wrong one fires (e.g. "agent-coder" ↔ "agent-tester", 83% alike)
145
+ ```
146
+
147
+ One popular plugin ships **45 pairs of skills** with near-identical descriptions. The
148
+ agent picks which skill to run by reading those descriptions, so when two match it
149
+ fires the wrong one. The markdown is perfectly valid.
110
150
  **[How triggering works →](docs/measuring-skills.md)**
111
151
 
112
- ## Proof 2 — a tool your subagent silently can't call
152
+ ## Proof 3 — a tool your subagent silently can't call
113
153
 
114
154
  ```text
115
155
  ✗ tester — Tool "AskUserQuestion" is never available to a subagent.
116
156
  → remove or correct it — it's silently dropped from the contract.
117
157
  ```
118
158
 
119
- A real upstream subagent declares a tool the harness **silently drops**, so it loses
120
- a capability it thinks it has. vigiles flags it _and_ hands you the one-line fix —
121
- **free, no model.** That's the difference from a markdown linter: it checks your
122
- harness against **reality**, not style — every file path, script, code symbol, and
123
- linter rule across **7 catalogs** (ESLint, Ruff, Clippy + four more), each verified
124
- to **exist _and_ be enabled**. **[Full guide →](docs/verifying-instruction-files.md)**
159
+ This subagent a helper your main agent hands a task to declares a tool that
160
+ doesn't exist. The harness drops it silently, so the agent loses a capability it
161
+ thinks it has. vigiles catches it and gives you the **one-line fix**.
125
162
 
126
- Two real catches, both **free and model-less** and audit ranks a whole
127
- marketplace the same way. **[Audit a marketplace →](docs/for-plugin-authors.md)**
163
+ That's the whole idea it checks your harness against reality, not style. Every path,
164
+ script, code symbol, and linter rule, verified to exist _and_ be enabled across 7
165
+ catalogs (ESLint, Ruff, Clippy + four more).
166
+ **[Full guide →](docs/verifying-instruction-files.md)**
128
167
 
129
- > **And it grades itself: 100/100, A, all four rings green** — and CI gates every
130
- > commit with `lint` + `test`. We eat what we cook.
168
+ All three catches are free and need no model — and vigiles **prevents** other whole
169
+ classes of bug by construction (a typed spec or compiled hook just won't compile).
170
+ **[Everything it catches and prevents →](docs/what-vigiles-catches.md)** · point `audit`
171
+ at a whole marketplace and it ranks every plugin the same way.
172
+ **[Audit a marketplace →](docs/for-plugin-authors.md)**
131
173
 
132
- ## How it does it — three instruments
174
+ ## How it works
133
175
 
134
- `Agent = Model + Harness`[^name]. The model gets the headlines; the **harness** is the
135
- half you own. `audit` is the dashboard these fix and prove what it finds.
176
+ The model isn't yours to fix. Your harness is. `audit` shows you the problems here's
177
+ what fixes and proves each one, almost all of it with no model and no key.
136
178
 
137
179
  ### 🔎 Lint — your CLAUDE.md stops lying
138
180
 
139
- Every path, script, symbol & linter rule resolved against reality (the catches
140
- above). **You don't write any of it** — `npx vigiles init` **adopts your existing
141
- CLAUDE.md _and every skill and subagent_ into verified specs**, non-destructively
142
- (untouched until you `compile`; `eject` reverses). After that, plain-English asks
143
- edit them for you. **[How →](docs/verifying-instruction-files.md)**
181
+ Every path, script, symbol, and rule verified against reality the catches above.
182
+ You don't write the checks: `npx vigiles init` turns your CLAUDE.md, skills, and
183
+ subagents into _specs_ (same content, plus a layer vigiles can verify). Non-destructive,
184
+ edited by your agent in plain English, undone by `eject`.
185
+ **[How →](docs/verifying-instruction-files.md)**
144
186
 
145
187
  ### 🧪 Test — does the harness actually do its job?
146
188
 
147
- A hook that blocks nothing, a skill that hijacks unrelated prompts, injected context
148
- that never reaches the model — all pass a naive "did it run?" check. Start at the
149
- cheapest tier: a hook, called directly. **No model, no key:**
150
-
151
- ```typescript
152
- import { runHook } from "vigiles/testing";
153
-
154
- const r = runHook(guard, {
155
- hook_event_name: "PreToolUse",
156
- tool_name: "Bash",
157
- tool_input: { command: "git commit --no-verify" },
158
- });
159
- assert(r.blocked); // a red ✗ means your guard silently lets it through
160
- ```
161
-
162
- Hooks **block** · skills **trigger** (recall _and_ precision) · subagents **finish**
163
- in the outcome they promised (no LLM judge) · **safety holds** — `interceptTools`
164
- catches a push or paid-API call as an _attempt_, so the side effect never happens.
165
- Almost every tier runs with **no model and no key**, on every commit.
189
+ A hook that blocks nothing, a skill that hijacks unrelated prompts, context that never
190
+ reaches the model — each passes a naive "did it run?" check. vigiles tests the real
191
+ thing: hooks **block**, skills **fire**, subagents **finish what they promised**, and a
192
+ stray `git push` is caught before it happens. No model, no key, on every commit.
166
193
  **[How testing works →](docs/harness-testing.md)**
167
194
 
168
195
  ### 📊 Eval — does a skill help, or just cost more?
169
196
 
170
- _"65% fewer tokens." Says who?_ vigiles A/Bs the claim on real coding tasks and reports
171
- the **bill**, the **target it claims to move**, and the **blast radius** (did the code
172
- still work?).
173
-
174
- **The eval you can actually afford:** promptfoo / DeepEval hit a metered API and bill
175
- **per token, every run**. vigiles answers most questions with **no model at all**, and
176
- runs the rest on your own **Claude Pro/Max subscription — $0 extra.**
177
- **[Measure a skill →](docs/measuring-skills.md)**
197
+ _"65% fewer tokens." Says who?_ vigiles[^name] A/Bs the claim on real coding tasks and reports
198
+ the token bill, whether it hit its target, and whether the code still works. promptfoo
199
+ and DeepEval bill **per token, every run**; vigiles runs on your own Claude Pro/Max
200
+ subscription. **[Measure a skill →](docs/measuring-skills.md)**
178
201
 
179
202
  ## Quick start
180
203
 
181
- **Paste into Claude Code or Codex:**
204
+ **1. See what's broken** read-only, no setup:
205
+
206
+ ```bash
207
+ npx vigiles audit
208
+ ```
209
+
210
+ **2. Set it up** when you like what you see. Paste into Claude Code or Codex:
182
211
 
183
212
  ```text
184
213
  Set up vigiles in this repo: run `npx vigiles init` and accept the defaults. If I
185
214
  already have a CLAUDE.md or AGENTS.md, adopt it into a spec and show me which
186
- references are stale. Then install the dep, compile, and write + run one harness
187
- test for a hook or skill of mine. Don't enforce a spec-per-file or add a real-model
188
- eval without asking me first.
215
+ references are stale. Then compile and write + run one harness test for a hook or
216
+ skill of mine. Don't run a real-model eval without asking me first.
189
217
  ```
190
218
 
191
- Or do it yourself:
219
+ Or run it yourself:
192
220
 
193
221
  ```bash
194
- npx vigiles init # lint + test: spec + harness test + CI + plugin
222
+ npx vigiles init # adopts your files (non-destructive eject reverses), adds CI,
223
+ # installs the Claude Code plugin globally
195
224
  ```
196
225
 
197
226
  Interactive in a terminal, non-interactive for agents/CI (or `--yes`).
@@ -227,6 +256,7 @@ JS **or** TS (`*.harness.{mjs,ts}`) — run with `npx vigiles test`.
227
256
 
228
257
  ## More
229
258
 
259
+ - **[What vigiles catches and prevents →](docs/what-vigiles-catches.md)** — the full matrix of harness problems it handles, biggest first, marked prevent / catch / measure.
230
260
  - **[CLI →](docs/cli.md)** · **[GitHub Action →](docs/github-action.md)** · the full **[lint rules matrix →](docs/verifying-instruction-files.md#the-validation-rules--the-full-matrix)** lives with the linting guide.
231
261
  - **[Skills →](docs/skills.md)** — the skills `init` installs, and how the model-invocable ones trigger.
232
262
  - **[Ship plugins? The plugin-author guide →](docs/for-plugin-authors.md)** — scan a draft, make your skills fire, rank a whole marketplace — no key.
@@ -79,6 +79,21 @@ exports.claudeCodeDialect = {
79
79
  "SessionStart",
80
80
  "SessionEnd",
81
81
  ],
82
+ // Events where a block decision is silently ignored ENTIRELY — no veto AND no
83
+ // model feedback (exit 2 there writes stderr only to the user). These are the
84
+ // ONLY events hook-block-ineffective flags as wrong-event. PostToolUse is NOT
85
+ // here: its exit 2 feeds stderr back to the model (a legitimate nudge/feedback
86
+ // channel), so flagging it would cry wolf (e.g. vigiles's own refs-nudge.sh).
87
+ noEffectHookEvents: [
88
+ "SessionStart",
89
+ "SessionEnd",
90
+ "Notification",
91
+ "PreCompact",
92
+ ],
93
+ // PreToolUse is the one event whose deny needs the structured
94
+ // `hookSpecificOutput.permissionDecision:"deny"`; the legacy top-level
95
+ // `decision` field is ignored there.
96
+ permissionDecisionHookEvents: ["PreToolUse"],
82
97
  // Claude Code natively reads CLAUDE.md only — it does NOT auto-load AGENTS.md
83
98
  // (anthropics/claude-code#34235 is open; AGENTS.md works solely via an
84
99
  // `@AGENTS.md` import inside CLAUDE.md or a symlink). AGENTS.md is the
@@ -77,7 +77,7 @@ export interface Adoptable {
77
77
  */
78
78
  export interface AuditReport {
79
79
  readonly meta: AuditReportMeta;
80
- /** The four deterministic category rings + the weighted overall + grade. */
80
+ /** The five deterministic category rings + the weighted overall + grade. */
81
81
  readonly score: AuditScore;
82
82
  /** The deterministic, ranked fixes (the inline recommendations). */
83
83
  readonly recommendations: readonly Recommendation[];
@@ -122,7 +122,7 @@ Error generating stack: `+a.message+`
122
122
  *
123
123
  * This source code is licensed under the ISC license.
124
124
  * See the LICENSE file in the root directory of this source tree.
125
- */const P0=Bt("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function Fd(f){var b,v,s="";if(typeof f=="string"||typeof f=="number")s+=f;else if(typeof f=="object")if(Array.isArray(f)){var E=f.length;for(b=0;b<E;b++)f[b]&&(v=Fd(f[b]))&&(s&&(s+=" "),s+=v)}else for(v in f)f[v]&&(s&&(s+=" "),s+=v);return s}function Id(){for(var f,b,v=0,s="",E=arguments.length;v<E;v++)(f=arguments[v])&&(b=Fd(f))&&(s&&(s+=" "),s+=b);return s}const Df="-",lh=f=>{const b=eh(f),{conflictingClassGroups:v,conflictingClassGroupModifiers:s}=f;return{getClassGroupId:j=>{const D=j.split(Df);return D[0]===""&&D.length!==1&&D.shift(),Pd(D,b)||th(j)},getConflictingClassGroupIds:(j,D)=>{const N=v[j]||[];return D&&s[j]?[...N,...s[j]]:N}}},Pd=(f,b)=>{var j;if(f.length===0)return b.classGroupId;const v=f[0],s=b.nextPart.get(v),E=s?Pd(f.slice(1),s):void 0;if(E)return E;if(b.validators.length===0)return;const O=f.join(Df);return(j=b.validators.find(({validator:D})=>D(O)))==null?void 0:j.classGroupId},Vd=/^\[(.+)\]$/,th=f=>{if(Vd.test(f)){const b=Vd.exec(f)[1],v=b==null?void 0:b.substring(0,b.indexOf(":"));if(v)return"arbitrary.."+v}},eh=f=>{const{theme:b,prefix:v}=f,s={nextPart:new Map,validators:[]};return uh(Object.entries(f.classGroups),v).forEach(([O,j])=>{Mf(j,s,O,b)}),s},Mf=(f,b,v,s)=>{f.forEach(E=>{if(typeof E=="string"){const O=E===""?b:Kd(b,E);O.classGroupId=v;return}if(typeof E=="function"){if(ah(E)){Mf(E(s),b,v,s);return}b.validators.push({validator:E,classGroupId:v});return}Object.entries(E).forEach(([O,j])=>{Mf(j,Kd(b,O),v,s)})})},Kd=(f,b)=>{let v=f;return b.split(Df).forEach(s=>{v.nextPart.has(s)||v.nextPart.set(s,{nextPart:new Map,validators:[]}),v=v.nextPart.get(s)}),v},ah=f=>f.isThemeGetter,uh=(f,b)=>b?f.map(([v,s])=>{const E=s.map(O=>typeof O=="string"?b+O:typeof O=="object"?Object.fromEntries(Object.entries(O).map(([j,D])=>[b+j,D])):O);return[v,E]}):f,nh=f=>{if(f<1)return{get:()=>{},set:()=>{}};let b=0,v=new Map,s=new Map;const E=(O,j)=>{v.set(O,j),b++,b>f&&(b=0,s=v,v=new Map)};return{get(O){let j=v.get(O);if(j!==void 0)return j;if((j=s.get(O))!==void 0)return E(O,j),j},set(O,j){v.has(O)?v.set(O,j):E(O,j)}}},lm="!",ih=f=>{const{separator:b,experimentalParseClassName:v}=f,s=b.length===1,E=b[0],O=b.length,j=D=>{const N=[];let S=0,Y=0,R;for(let el=0;el<D.length;el++){let fl=D[el];if(S===0){if(fl===E&&(s||D.slice(el,el+O)===b)){N.push(D.slice(Y,el)),Y=el+O;continue}if(fl==="/"){R=el;continue}}fl==="["?S++:fl==="]"&&S--}const L=N.length===0?D:D.substring(Y),bl=L.startsWith(lm),vl=bl?L.substring(1):L,P=R&&R>Y?R-Y:void 0;return{modifiers:N,hasImportantModifier:bl,baseClassName:vl,maybePostfixModifierPosition:P}};return v?D=>v({className:D,parseClassName:j}):j},ch=f=>{if(f.length<=1)return f;const b=[];let v=[];return f.forEach(s=>{s[0]==="["?(b.push(...v.sort(),s),v=[]):v.push(s)}),b.push(...v.sort()),b},fh=f=>({cache:nh(f.cacheSize),parseClassName:ih(f),...lh(f)}),sh=/\s+/,oh=(f,b)=>{const{parseClassName:v,getClassGroupId:s,getConflictingClassGroupIds:E}=b,O=[],j=f.trim().split(sh);let D="";for(let N=j.length-1;N>=0;N-=1){const S=j[N],{modifiers:Y,hasImportantModifier:R,baseClassName:L,maybePostfixModifierPosition:bl}=v(S);let vl=!!bl,P=s(vl?L.substring(0,bl):L);if(!P){if(!vl){D=S+(D.length>0?" "+D:D);continue}if(P=s(L),!P){D=S+(D.length>0?" "+D:D);continue}vl=!1}const el=ch(Y).join(":"),fl=R?el+lm:el,_l=fl+P;if(O.includes(_l))continue;O.push(_l);const Al=E(P,vl);for(let Dl=0;Dl<Al.length;++Dl){const wl=Al[Dl];O.push(fl+wl)}D=S+(D.length>0?" "+D:D)}return D};function rh(){let f=0,b,v,s="";for(;f<arguments.length;)(b=arguments[f++])&&(v=tm(b))&&(s&&(s+=" "),s+=v);return s}const tm=f=>{if(typeof f=="string")return f;let b,v="";for(let s=0;s<f.length;s++)f[s]&&(b=tm(f[s]))&&(v&&(v+=" "),v+=b);return v};function dh(f,...b){let v,s,E,O=j;function j(N){const S=b.reduce((Y,R)=>R(Y),f());return v=fh(S),s=v.cache.get,E=v.cache.set,O=D,D(N)}function D(N){const S=s(N);if(S)return S;const Y=oh(N,v);return E(N,Y),Y}return function(){return O(rh.apply(null,arguments))}}const zl=f=>{const b=v=>v[f]||[];return b.isThemeGetter=!0,b},em=/^\[(?:([a-z-]+):)?(.+)\]$/i,mh=/^\d+\/\d+$/,yh=new Set(["px","full","screen"]),hh=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,vh=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,gh=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,bh=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,ph=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ee=f=>qa(f)||yh.has(f)||mh.test(f),Ne=f=>Ba(f,"length",Mh),qa=f=>!!f&&!Number.isNaN(Number(f)),Ef=f=>Ba(f,"number",qa),ju=f=>!!f&&Number.isInteger(Number(f)),Sh=f=>f.endsWith("%")&&qa(f.slice(0,-1)),J=f=>em.test(f),De=f=>hh.test(f),zh=new Set(["length","size","percentage"]),xh=f=>Ba(f,zh,am),Ah=f=>Ba(f,"position",am),Th=new Set(["image","url"]),Eh=f=>Ba(f,Th,Nh),_h=f=>Ba(f,"",Oh),Ru=()=>!0,Ba=(f,b,v)=>{const s=em.exec(f);return s?s[1]?typeof b=="string"?s[1]===b:b.has(s[1]):v(s[2]):!1},Mh=f=>vh.test(f)&&!gh.test(f),am=()=>!1,Oh=f=>bh.test(f),Nh=f=>ph.test(f),Dh=()=>{const f=zl("colors"),b=zl("spacing"),v=zl("blur"),s=zl("brightness"),E=zl("borderColor"),O=zl("borderRadius"),j=zl("borderSpacing"),D=zl("borderWidth"),N=zl("contrast"),S=zl("grayscale"),Y=zl("hueRotate"),R=zl("invert"),L=zl("gap"),bl=zl("gradientColorStops"),vl=zl("gradientColorStopPositions"),P=zl("inset"),el=zl("margin"),fl=zl("opacity"),_l=zl("padding"),Al=zl("saturate"),Dl=zl("scale"),wl=zl("sepia"),Yl=zl("skew"),W=zl("space"),Gl=zl("translate"),Wl=()=>["auto","contain","none"],Ut=()=>["auto","hidden","clip","visible","scroll"],$l=()=>["auto",J,b],k=()=>[J,b],Ct=()=>["",ee,Ne],Fl=()=>["auto",qa,J],Il=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],z=()=>["solid","dashed","dotted","double","none"],U=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],X=()=>["start","end","center","between","around","evenly","stretch"],ul=()=>["","0",J],sl=()=>["auto","avoid","all","avoid-page","page","left","right","column"],r=()=>[qa,J];return{cacheSize:500,separator:":",theme:{colors:[Ru],spacing:[ee,Ne],blur:["none","",De,J],brightness:r(),borderColor:[f],borderRadius:["none","","full",De,J],borderSpacing:k(),borderWidth:Ct(),contrast:r(),grayscale:ul(),hueRotate:r(),invert:ul(),gap:k(),gradientColorStops:[f],gradientColorStopPositions:[Sh,Ne],inset:$l(),margin:$l(),opacity:r(),padding:k(),saturate:r(),scale:r(),sepia:ul(),skew:r(),space:k(),translate:k()},classGroups:{aspect:[{aspect:["auto","square","video",J]}],container:["container"],columns:[{columns:[De]}],"break-after":[{"break-after":sl()}],"break-before":[{"break-before":sl()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...Il(),J]}],overflow:[{overflow:Ut()}],"overflow-x":[{"overflow-x":Ut()}],"overflow-y":[{"overflow-y":Ut()}],overscroll:[{overscroll:Wl()}],"overscroll-x":[{"overscroll-x":Wl()}],"overscroll-y":[{"overscroll-y":Wl()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[P]}],"inset-x":[{"inset-x":[P]}],"inset-y":[{"inset-y":[P]}],start:[{start:[P]}],end:[{end:[P]}],top:[{top:[P]}],right:[{right:[P]}],bottom:[{bottom:[P]}],left:[{left:[P]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",ju,J]}],basis:[{basis:$l()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",J]}],grow:[{grow:ul()}],shrink:[{shrink:ul()}],order:[{order:["first","last","none",ju,J]}],"grid-cols":[{"grid-cols":[Ru]}],"col-start-end":[{col:["auto",{span:["full",ju,J]},J]}],"col-start":[{"col-start":Fl()}],"col-end":[{"col-end":Fl()}],"grid-rows":[{"grid-rows":[Ru]}],"row-start-end":[{row:["auto",{span:[ju,J]},J]}],"row-start":[{"row-start":Fl()}],"row-end":[{"row-end":Fl()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",J]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",J]}],gap:[{gap:[L]}],"gap-x":[{"gap-x":[L]}],"gap-y":[{"gap-y":[L]}],"justify-content":[{justify:["normal",...X()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...X(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...X(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[_l]}],px:[{px:[_l]}],py:[{py:[_l]}],ps:[{ps:[_l]}],pe:[{pe:[_l]}],pt:[{pt:[_l]}],pr:[{pr:[_l]}],pb:[{pb:[_l]}],pl:[{pl:[_l]}],m:[{m:[el]}],mx:[{mx:[el]}],my:[{my:[el]}],ms:[{ms:[el]}],me:[{me:[el]}],mt:[{mt:[el]}],mr:[{mr:[el]}],mb:[{mb:[el]}],ml:[{ml:[el]}],"space-x":[{"space-x":[W]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[W]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",J,b]}],"min-w":[{"min-w":[J,b,"min","max","fit"]}],"max-w":[{"max-w":[J,b,"none","full","min","max","fit","prose",{screen:[De]},De]}],h:[{h:[J,b,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[J,b,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[J,b,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[J,b,"auto","min","max","fit"]}],"font-size":[{text:["base",De,Ne]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Ef]}],"font-family":[{font:[Ru]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",J]}],"line-clamp":[{"line-clamp":["none",qa,Ef]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ee,J]}],"list-image":[{"list-image":["none",J]}],"list-style-type":[{list:["none","disc","decimal",J]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[f]}],"placeholder-opacity":[{"placeholder-opacity":[fl]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[f]}],"text-opacity":[{"text-opacity":[fl]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...z(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ee,Ne]}],"underline-offset":[{"underline-offset":["auto",ee,J]}],"text-decoration-color":[{decoration:[f]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:k()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",J]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",J]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[fl]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...Il(),Ah]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",xh]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Eh]}],"bg-color":[{bg:[f]}],"gradient-from-pos":[{from:[vl]}],"gradient-via-pos":[{via:[vl]}],"gradient-to-pos":[{to:[vl]}],"gradient-from":[{from:[bl]}],"gradient-via":[{via:[bl]}],"gradient-to":[{to:[bl]}],rounded:[{rounded:[O]}],"rounded-s":[{"rounded-s":[O]}],"rounded-e":[{"rounded-e":[O]}],"rounded-t":[{"rounded-t":[O]}],"rounded-r":[{"rounded-r":[O]}],"rounded-b":[{"rounded-b":[O]}],"rounded-l":[{"rounded-l":[O]}],"rounded-ss":[{"rounded-ss":[O]}],"rounded-se":[{"rounded-se":[O]}],"rounded-ee":[{"rounded-ee":[O]}],"rounded-es":[{"rounded-es":[O]}],"rounded-tl":[{"rounded-tl":[O]}],"rounded-tr":[{"rounded-tr":[O]}],"rounded-br":[{"rounded-br":[O]}],"rounded-bl":[{"rounded-bl":[O]}],"border-w":[{border:[D]}],"border-w-x":[{"border-x":[D]}],"border-w-y":[{"border-y":[D]}],"border-w-s":[{"border-s":[D]}],"border-w-e":[{"border-e":[D]}],"border-w-t":[{"border-t":[D]}],"border-w-r":[{"border-r":[D]}],"border-w-b":[{"border-b":[D]}],"border-w-l":[{"border-l":[D]}],"border-opacity":[{"border-opacity":[fl]}],"border-style":[{border:[...z(),"hidden"]}],"divide-x":[{"divide-x":[D]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[D]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[fl]}],"divide-style":[{divide:z()}],"border-color":[{border:[E]}],"border-color-x":[{"border-x":[E]}],"border-color-y":[{"border-y":[E]}],"border-color-s":[{"border-s":[E]}],"border-color-e":[{"border-e":[E]}],"border-color-t":[{"border-t":[E]}],"border-color-r":[{"border-r":[E]}],"border-color-b":[{"border-b":[E]}],"border-color-l":[{"border-l":[E]}],"divide-color":[{divide:[E]}],"outline-style":[{outline:["",...z()]}],"outline-offset":[{"outline-offset":[ee,J]}],"outline-w":[{outline:[ee,Ne]}],"outline-color":[{outline:[f]}],"ring-w":[{ring:Ct()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[f]}],"ring-opacity":[{"ring-opacity":[fl]}],"ring-offset-w":[{"ring-offset":[ee,Ne]}],"ring-offset-color":[{"ring-offset":[f]}],shadow:[{shadow:["","inner","none",De,_h]}],"shadow-color":[{shadow:[Ru]}],opacity:[{opacity:[fl]}],"mix-blend":[{"mix-blend":[...U(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":U()}],filter:[{filter:["","none"]}],blur:[{blur:[v]}],brightness:[{brightness:[s]}],contrast:[{contrast:[N]}],"drop-shadow":[{"drop-shadow":["","none",De,J]}],grayscale:[{grayscale:[S]}],"hue-rotate":[{"hue-rotate":[Y]}],invert:[{invert:[R]}],saturate:[{saturate:[Al]}],sepia:[{sepia:[wl]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[v]}],"backdrop-brightness":[{"backdrop-brightness":[s]}],"backdrop-contrast":[{"backdrop-contrast":[N]}],"backdrop-grayscale":[{"backdrop-grayscale":[S]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[Y]}],"backdrop-invert":[{"backdrop-invert":[R]}],"backdrop-opacity":[{"backdrop-opacity":[fl]}],"backdrop-saturate":[{"backdrop-saturate":[Al]}],"backdrop-sepia":[{"backdrop-sepia":[wl]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[j]}],"border-spacing-x":[{"border-spacing-x":[j]}],"border-spacing-y":[{"border-spacing-y":[j]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",J]}],duration:[{duration:r()}],ease:[{ease:["linear","in","out","in-out",J]}],delay:[{delay:r()}],animate:[{animate:["none","spin","ping","pulse","bounce",J]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[Dl]}],"scale-x":[{"scale-x":[Dl]}],"scale-y":[{"scale-y":[Dl]}],rotate:[{rotate:[ju,J]}],"translate-x":[{"translate-x":[Gl]}],"translate-y":[{"translate-y":[Gl]}],"skew-x":[{"skew-x":[Yl]}],"skew-y":[{"skew-y":[Yl]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",J]}],accent:[{accent:["auto",f]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",J]}],"caret-color":[{caret:[f]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":k()}],"scroll-mx":[{"scroll-mx":k()}],"scroll-my":[{"scroll-my":k()}],"scroll-ms":[{"scroll-ms":k()}],"scroll-me":[{"scroll-me":k()}],"scroll-mt":[{"scroll-mt":k()}],"scroll-mr":[{"scroll-mr":k()}],"scroll-mb":[{"scroll-mb":k()}],"scroll-ml":[{"scroll-ml":k()}],"scroll-p":[{"scroll-p":k()}],"scroll-px":[{"scroll-px":k()}],"scroll-py":[{"scroll-py":k()}],"scroll-ps":[{"scroll-ps":k()}],"scroll-pe":[{"scroll-pe":k()}],"scroll-pt":[{"scroll-pt":k()}],"scroll-pr":[{"scroll-pr":k()}],"scroll-pb":[{"scroll-pb":k()}],"scroll-pl":[{"scroll-pl":k()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",J]}],fill:[{fill:[f,"none"]}],"stroke-w":[{stroke:[ee,Ne,Ef]}],stroke:[{stroke:[f,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},Uh=dh(Dh);function _t(...f){return Uh(Id(f))}function Ue({className:f,...b}){return M.jsx("div",{className:_t("rounded-lg border border-border bg-card text-foreground shadow-sm",f),...b})}const wd=f=>typeof f=="boolean"?`${f}`:f===0?"0":f,Jd=Id,Ch=(f,b)=>v=>{var s;if((b==null?void 0:b.variants)==null)return Jd(f,v==null?void 0:v.class,v==null?void 0:v.className);const{variants:E,defaultVariants:O}=b,j=Object.keys(E).map(S=>{const Y=v==null?void 0:v[S],R=O==null?void 0:O[S];if(Y===null)return null;const L=wd(Y)||wd(R);return E[S][L]}),D=v&&Object.entries(v).reduce((S,Y)=>{let[R,L]=Y;return L===void 0||(S[R]=L),S},{}),N=b==null||(s=b.compoundVariants)===null||s===void 0?void 0:s.reduce((S,Y)=>{let{class:R,className:L,...bl}=Y;return Object.entries(bl).every(vl=>{let[P,el]=vl;return Array.isArray(el)?el.includes({...O,...D}[P]):{...O,...D}[P]===el})?[...S,R,L]:S},[]);return Jd(f,j,N,v==null?void 0:v.class,v==null?void 0:v.className)},jh=Ch("inline-flex items-center rounded-md border px-2 py-0.5 text-xs font-semibold uppercase tracking-wide",{variants:{variant:{default:"border-border bg-background text-muted-foreground",outline:"border-border text-muted-foreground"}},defaultVariants:{variant:"default"}});function Uf({className:f,variant:b,...v}){return M.jsx("span",{className:_t(jh({variant:b}),f),...v})}function um(f){return f===null?"na":f>=90?"good":f>=70?"warn":"bad"}const Dt={good:"text-good",warn:"text-warn",bad:"text-bad",na:"text-na"},Rh={good:"bg-good",warn:"bg-warn",bad:"bg-bad",na:"bg-na"},Hh={good:"stroke-good",warn:"stroke-warn",bad:"stroke-bad",na:"stroke-na"},qh={good:"fill-good",warn:"fill-warn",bad:"fill-bad",na:"fill-na"},nm={good:"border-l-good",warn:"border-l-warn",bad:"border-l-bad",na:"border-l-na"};function im({score:f,size:b=80,stroke:v=7,advisory:s=!1}){const E=b/2-v,O=2*Math.PI*E,j=f===null?0:Math.max(0,Math.min(100,f))/100,D=s?"na":um(f),N=b/2;return M.jsxs("svg",{width:b,height:b,viewBox:`0 0 ${b} ${b}`,role:"img",children:[M.jsx("circle",{cx:N,cy:N,r:E,fill:"none",strokeWidth:v,className:"stroke-border"}),M.jsx("circle",{cx:N,cy:N,r:E,fill:"none",strokeWidth:v,strokeLinecap:"round",strokeDasharray:`${j*O} ${O}`,transform:`rotate(-90 ${N} ${N})`,className:Hh[D]}),M.jsx("text",{x:"50%",y:"50%",textAnchor:"middle",dominantBaseline:"central",fontSize:Math.round(b*.28),className:_t("font-extrabold",qh[D]),children:f===null?"n/a":f})]})}const Bh={enforce:"rule",file:"file",cmd:"cmd",dir:"dir"};function Yh({r:f}){return M.jsxs("div",{className:_t("border-l-4 p-3",nm.bad),children:[M.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[M.jsx(Uf,{children:Bh[f.kind]}),M.jsx("code",{className:"font-mono text-xs text-foreground",children:f.ref})]}),M.jsx("div",{className:"mt-0.5 text-xs text-muted-foreground",children:f.issue})]})}function Gh({data:f}){if(f.total===0)return M.jsxs(Ue,{className:"p-4 text-sm text-muted-foreground",children:["No machine-verifiable references found — add"," ",M.jsx("code",{className:"font-mono text-xs",children:"enforce()"})," calls to a"," ",M.jsx("code",{className:"font-mono text-xs",children:".spec.ts"})," to unlock cross-referencing."]});const b=f.broken===0;return M.jsxs(Ue,{className:"p-5",children:[M.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[M.jsxs("div",{className:"flex items-baseline gap-1.5",children:[M.jsx("span",{className:_t("text-3xl font-bold tabular-nums",b?Dt.good:Dt.bad),children:f.broken}),M.jsxs("span",{className:"text-sm text-muted-foreground",children:["/ ",f.total," broken"]})]}),b?M.jsxs("span",{className:_t("flex items-center gap-1 text-sm",Dt.good),children:[M.jsx(Nf,{size:14})," all ",f.total," reference",f.total===1?"":"s"," resolve"]}):M.jsxs("span",{className:_t("flex items-center gap-1 text-sm",Dt.bad),children:[M.jsx(W0,{size:14})," ",f.broken," broken reference",f.broken===1?"":"s"," found"]})]}),f.brokenRefs.length>0&&M.jsx("div",{className:"mt-4 flex flex-col gap-2",children:f.brokenRefs.map((v,s)=>M.jsx(Yh,{r:v},s))})]})}function cm(){const f=window.__VIGILES_SERVE__;return f&&typeof f.token=="string"?f:null}async function Xh(f,b,v){try{const s=await fetch(f,{method:"POST",headers:{"content-type":"application/json","x-vigiles-token":v},body:JSON.stringify(b)}),E=await s.json();return{ok:E.ok??s.ok,message:E.message??""}}catch(s){return{ok:!1,message:s instanceof Error?s.message:String(s)}}}const fm="inline-flex items-center gap-2 rounded-md border border-border bg-card px-3 py-1.5 text-left text-xs font-medium hover:border-foreground disabled:opacity-60";function sm({command:f,label:b}){const[v,s]=ae.useState(!1),E=()=>{var O;(O=navigator.clipboard)==null||O.writeText(f).then(()=>{s(!0),setTimeout(()=>s(!1),1500)},()=>{})};return M.jsxs("button",{type:"button",onClick:E,title:`Copy: ${f}`,className:fm,children:[v?M.jsx(Wd,{size:14,className:Dt.good}):M.jsx(J0,{size:14,className:"text-muted-foreground"}),M.jsx("span",{className:_t(v&&Dt.good),children:v?"copied!":b})]})}function om({endpoint:f,body:b,token:v,label:s}){const[E,O]=ae.useState("idle"),[j,D]=ae.useState(""),N=()=>{O("running"),Xh(f,b,v).then(S=>{O(S.ok?"done":"error"),D(S.message)})};return M.jsxs("button",{type:"button",onClick:N,disabled:E==="running"||E==="done",title:E==="error"?j:s,className:fm,children:[E==="running"&&M.jsx($0,{size:14,className:"animate-spin text-muted-foreground"}),E==="done"&&M.jsx(Wd,{size:14,className:Dt.good}),E==="error"&&M.jsx(P0,{size:14,className:Dt.bad}),E==="idle"&&M.jsx($d,{size:14,className:"text-muted-foreground"}),M.jsx("span",{className:_t(E==="done"&&Dt.good,E==="error"&&Dt.bad),children:E==="done"?"created":E==="error"?"failed":E==="running"?"creating…":s})]})}function Qh({path:f,command:b}){const v=cm();return M.jsxs("div",{className:"flex flex-wrap items-center gap-3 border-l-4 border-l-warn p-3",children:[M.jsx("code",{className:"font-mono text-xs text-foreground",children:f}),M.jsx("div",{className:"ml-auto",children:v?M.jsx(om,{endpoint:"/adopt",body:{target:f},token:v.token,label:"Create spec"}):M.jsx(sm,{command:b,label:"Create spec"})})]})}function Zh({data:f}){const b=cm();return M.jsxs(Ue,{className:"p-5",children:[M.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[M.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[M.jsx($d,{size:16,className:"text-muted-foreground"}),f.surfaces.length," surface",f.surfaces.length===1?"":"s"," not yet spec-managed"]}),M.jsx("div",{className:"ml-auto",children:b?M.jsx(om,{endpoint:"/adopt-all",body:{},token:b.token,label:"Create all specs"}):M.jsx(sm,{command:f.createAllCommand,label:"Create all specs"})})]}),M.jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:b?"Click to create the typed spec — this report is live, so the CLI writes it for you (re-run audit to see it spec-managed).":"Copy the command and run it in your terminal — the CLI writes the typed spec (the browser can’t write files)."}),f.surfaces.length>0&&M.jsx("div",{className:"mt-4 flex flex-col gap-2",children:f.surfaces.map(v=>M.jsx(Qh,{path:v.path,command:v.command},v.path))})]})}function Lh({c:f}){return M.jsxs(Ue,{className:"flex flex-col items-center gap-3 p-5 text-center",children:[M.jsx(im,{score:f.score,advisory:f.advisory}),M.jsxs("div",{children:[M.jsxs("div",{className:"flex items-center justify-center gap-1.5 text-sm font-semibold",children:[f.key,f.advisory&&M.jsx(Uf,{variant:"outline",className:"text-na",children:"advisory"})]}),M.jsxs("div",{className:"mt-1 min-h-8 text-xs text-muted-foreground",children:[f.advisory&&M.jsx("div",{className:"text-na",children:"not graded — hardening signal"}),f.findings.length>0?f.findings.join("; "):M.jsxs("span",{className:"inline-flex items-center gap-1 text-good",children:[M.jsx(Nf,{size:12})," clean"]})]})]})]})}function Vh({r:f}){const b=f.action==="fix"?I0:k0,v=f.confidence==="likely"?"bad":"warn";return M.jsxs(Ue,{className:_t("border-l-4 p-4",nm[v]),children:[M.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[M.jsxs(Uf,{children:[M.jsx(b,{size:12,className:"mr-1"}),f.action]}),M.jsx("strong",{children:f.surface}),M.jsx("span",{className:"ml-auto font-mono text-xs text-muted-foreground",children:f.detector})]}),M.jsx("div",{className:"mt-1.5 text-sm text-muted-foreground",children:f.rationale}),M.jsxs("div",{className:"mt-1 text-sm text-good",children:["→ ",f.fix]})]})}function Ha({n:f,label:b}){return M.jsxs(Ue,{className:"p-4 text-center",children:[M.jsx("div",{className:"text-2xl font-bold",children:f}),M.jsx("div",{className:"mt-0.5 text-xs uppercase tracking-wide text-muted-foreground",children:b})]})}function Kh({data:f}){const{score:b,recommendations:v,inventory:s,meta:E,adoptability:O,adoptable:j}=f,D=b.empty?null:b.overall,N=um(D);return M.jsxs("div",{className:"mx-auto max-w-5xl px-6 pb-16 pt-10",children:[M.jsxs(Ue,{className:"flex items-center gap-7 p-7",children:[M.jsx(im,{score:D,size:128,stroke:11}),M.jsxs("div",{children:[M.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Harness audit"}),M.jsxs("div",{className:"mt-1 text-sm text-muted-foreground",children:[E.dir," · ",E.harness]}),M.jsxs("div",{className:_t("mt-3 inline-flex items-center gap-2 rounded-full border border-border px-3 py-1 text-sm font-semibold",Dt[N]),children:[M.jsx("span",{className:_t("h-2 w-2 rounded-full",Rh[N])}),"Harness health: ",b.grade," (",b.overall,"/100)"]})]})]}),M.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Categories"}),M.jsx("div",{className:"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-5",children:b.categories.map(S=>M.jsx(Lh,{c:S},S.key))}),M.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:v.length>0?`Fixes (${v.length})`:"Fixes"}),v.length>0?M.jsx("div",{className:"flex flex-col gap-2.5",children:v.map((S,Y)=>M.jsx(Vh,{r:S},Y))}):M.jsxs(Ue,{className:"flex items-center gap-2 p-4 text-sm text-good",children:[M.jsx(Nf,{size:16})," No deterministic fixes — the structure is clean."]}),j&&j.surfaces.length>0&&M.jsxs(M.Fragment,{children:[M.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Create specs"}),M.jsx("p",{className:"mb-3 text-xs text-muted-foreground",children:"Turn these surfaces into typed specs so vigiles can verify their references — fully, or one at a time."}),M.jsx(Zh,{data:j})]}),O&&M.jsxs(M.Fragment,{children:[M.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Adoptability"}),M.jsx("p",{className:"mb-3 text-xs text-muted-foreground",children:"What vigiles would catch in your repo — machine-verifiable references in your instruction file checked against your actual config."}),M.jsx(Gh,{data:O})]}),M.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"What it ships"}),M.jsxs("div",{className:"grid grid-cols-3 gap-2.5 sm:grid-cols-6",children:[M.jsx(Ha,{n:s.skills,label:"skills"}),M.jsx(Ha,{n:s.agents,label:"agents"}),M.jsx(Ha,{n:s.hooks,label:"hooks"}),M.jsx(Ha,{n:s.commands,label:"commands"}),M.jsx(Ha,{n:s.mcp?"yes":"no",label:"MCP"}),M.jsx(Ha,{n:s.untested,label:"untested"})]}),M.jsxs("footer",{className:"mt-12 flex items-center justify-center gap-1.5 text-center text-xs text-muted-foreground",children:[M.jsx(F0,{size:12})," Generated by vigiles — we run your harness, not just read it."]})]})}const wh={meta:{schemaVersion:1,tool:"vigiles",vigilesVersion:"0.0.0",harness:"claude-code",dir:"demo"},score:{overall:77,grade:"C",empty:!1,categories:[{key:"Truthfulness",score:100,weight:1,findings:[]},{key:"Triggering",score:92,weight:1,findings:["1 near-identical skill description(s) (wrong one fires)"]},{key:"Structure",score:92,weight:1,findings:["1 agent tool(s) that don't exist (typo / never-available)"]},{key:"Tested",score:88,weight:1,findings:["4 untested surface(s)"]}]},recommendations:[{surface:"reviewer",action:"fix",rationale:`Unknown tool "Reed" — silently dropped, the agent can't use it.`,fix:'change the tool "Reed" to "Read"',detector:"subagent-tool-contract",confidence:"likely"},{surface:"deploy ↔ ship",action:"differentiate",rationale:"Near-identical descriptions (0.92 similar) — the selector can't tell them apart.",fix:"differentiate the descriptions of deploy and ship",detector:"description-overlap",confidence:"possible"}],inventory:{skills:2,agents:1,hooks:1,commands:0,mcp:!1,untested:4},adoptable:{createAllCommand:"npx vigiles init",surfaces:[{path:"skills/deploy/SKILL.md",command:"npx vigiles init --target=skills/deploy/SKILL.md"},{path:"agents/reviewer.md",command:"npx vigiles init --target=agents/reviewer.md"}]},adoptability:{total:5,broken:2,brokenRefs:[{kind:"enforce",ref:"@typescript-eslint/no-floating-promises",issue:"rule not found in eslint config"},{kind:"file",ref:"src/auth/login.ts",issue:"file does not exist"}]}},_f=window.__VIGILES_DATA__,Jh=_f&&typeof _f=="object"?_f:wh;L0.createRoot(document.getElementById("root")).render(M.jsx(ae.StrictMode,{children:M.jsx(Kh,{data:Jh})}));</script>
125
+ */const P0=Bt("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function Fd(f){var b,v,s="";if(typeof f=="string"||typeof f=="number")s+=f;else if(typeof f=="object")if(Array.isArray(f)){var E=f.length;for(b=0;b<E;b++)f[b]&&(v=Fd(f[b]))&&(s&&(s+=" "),s+=v)}else for(v in f)f[v]&&(s&&(s+=" "),s+=v);return s}function Id(){for(var f,b,v=0,s="",E=arguments.length;v<E;v++)(f=arguments[v])&&(b=Fd(f))&&(s&&(s+=" "),s+=b);return s}const Df="-",lh=f=>{const b=eh(f),{conflictingClassGroups:v,conflictingClassGroupModifiers:s}=f;return{getClassGroupId:j=>{const D=j.split(Df);return D[0]===""&&D.length!==1&&D.shift(),Pd(D,b)||th(j)},getConflictingClassGroupIds:(j,D)=>{const N=v[j]||[];return D&&s[j]?[...N,...s[j]]:N}}},Pd=(f,b)=>{var j;if(f.length===0)return b.classGroupId;const v=f[0],s=b.nextPart.get(v),E=s?Pd(f.slice(1),s):void 0;if(E)return E;if(b.validators.length===0)return;const O=f.join(Df);return(j=b.validators.find(({validator:D})=>D(O)))==null?void 0:j.classGroupId},Vd=/^\[(.+)\]$/,th=f=>{if(Vd.test(f)){const b=Vd.exec(f)[1],v=b==null?void 0:b.substring(0,b.indexOf(":"));if(v)return"arbitrary.."+v}},eh=f=>{const{theme:b,prefix:v}=f,s={nextPart:new Map,validators:[]};return uh(Object.entries(f.classGroups),v).forEach(([O,j])=>{Mf(j,s,O,b)}),s},Mf=(f,b,v,s)=>{f.forEach(E=>{if(typeof E=="string"){const O=E===""?b:Kd(b,E);O.classGroupId=v;return}if(typeof E=="function"){if(ah(E)){Mf(E(s),b,v,s);return}b.validators.push({validator:E,classGroupId:v});return}Object.entries(E).forEach(([O,j])=>{Mf(j,Kd(b,O),v,s)})})},Kd=(f,b)=>{let v=f;return b.split(Df).forEach(s=>{v.nextPart.has(s)||v.nextPart.set(s,{nextPart:new Map,validators:[]}),v=v.nextPart.get(s)}),v},ah=f=>f.isThemeGetter,uh=(f,b)=>b?f.map(([v,s])=>{const E=s.map(O=>typeof O=="string"?b+O:typeof O=="object"?Object.fromEntries(Object.entries(O).map(([j,D])=>[b+j,D])):O);return[v,E]}):f,nh=f=>{if(f<1)return{get:()=>{},set:()=>{}};let b=0,v=new Map,s=new Map;const E=(O,j)=>{v.set(O,j),b++,b>f&&(b=0,s=v,v=new Map)};return{get(O){let j=v.get(O);if(j!==void 0)return j;if((j=s.get(O))!==void 0)return E(O,j),j},set(O,j){v.has(O)?v.set(O,j):E(O,j)}}},lm="!",ih=f=>{const{separator:b,experimentalParseClassName:v}=f,s=b.length===1,E=b[0],O=b.length,j=D=>{const N=[];let S=0,Y=0,R;for(let el=0;el<D.length;el++){let fl=D[el];if(S===0){if(fl===E&&(s||D.slice(el,el+O)===b)){N.push(D.slice(Y,el)),Y=el+O;continue}if(fl==="/"){R=el;continue}}fl==="["?S++:fl==="]"&&S--}const L=N.length===0?D:D.substring(Y),bl=L.startsWith(lm),vl=bl?L.substring(1):L,P=R&&R>Y?R-Y:void 0;return{modifiers:N,hasImportantModifier:bl,baseClassName:vl,maybePostfixModifierPosition:P}};return v?D=>v({className:D,parseClassName:j}):j},ch=f=>{if(f.length<=1)return f;const b=[];let v=[];return f.forEach(s=>{s[0]==="["?(b.push(...v.sort(),s),v=[]):v.push(s)}),b.push(...v.sort()),b},fh=f=>({cache:nh(f.cacheSize),parseClassName:ih(f),...lh(f)}),sh=/\s+/,oh=(f,b)=>{const{parseClassName:v,getClassGroupId:s,getConflictingClassGroupIds:E}=b,O=[],j=f.trim().split(sh);let D="";for(let N=j.length-1;N>=0;N-=1){const S=j[N],{modifiers:Y,hasImportantModifier:R,baseClassName:L,maybePostfixModifierPosition:bl}=v(S);let vl=!!bl,P=s(vl?L.substring(0,bl):L);if(!P){if(!vl){D=S+(D.length>0?" "+D:D);continue}if(P=s(L),!P){D=S+(D.length>0?" "+D:D);continue}vl=!1}const el=ch(Y).join(":"),fl=R?el+lm:el,_l=fl+P;if(O.includes(_l))continue;O.push(_l);const Al=E(P,vl);for(let Dl=0;Dl<Al.length;++Dl){const wl=Al[Dl];O.push(fl+wl)}D=S+(D.length>0?" "+D:D)}return D};function rh(){let f=0,b,v,s="";for(;f<arguments.length;)(b=arguments[f++])&&(v=tm(b))&&(s&&(s+=" "),s+=v);return s}const tm=f=>{if(typeof f=="string")return f;let b,v="";for(let s=0;s<f.length;s++)f[s]&&(b=tm(f[s]))&&(v&&(v+=" "),v+=b);return v};function dh(f,...b){let v,s,E,O=j;function j(N){const S=b.reduce((Y,R)=>R(Y),f());return v=fh(S),s=v.cache.get,E=v.cache.set,O=D,D(N)}function D(N){const S=s(N);if(S)return S;const Y=oh(N,v);return E(N,Y),Y}return function(){return O(rh.apply(null,arguments))}}const zl=f=>{const b=v=>v[f]||[];return b.isThemeGetter=!0,b},em=/^\[(?:([a-z-]+):)?(.+)\]$/i,mh=/^\d+\/\d+$/,yh=new Set(["px","full","screen"]),hh=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,vh=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,gh=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,bh=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,ph=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ee=f=>qa(f)||yh.has(f)||mh.test(f),Ne=f=>Ba(f,"length",Mh),qa=f=>!!f&&!Number.isNaN(Number(f)),Ef=f=>Ba(f,"number",qa),ju=f=>!!f&&Number.isInteger(Number(f)),Sh=f=>f.endsWith("%")&&qa(f.slice(0,-1)),J=f=>em.test(f),De=f=>hh.test(f),zh=new Set(["length","size","percentage"]),xh=f=>Ba(f,zh,am),Ah=f=>Ba(f,"position",am),Th=new Set(["image","url"]),Eh=f=>Ba(f,Th,Nh),_h=f=>Ba(f,"",Oh),Ru=()=>!0,Ba=(f,b,v)=>{const s=em.exec(f);return s?s[1]?typeof b=="string"?s[1]===b:b.has(s[1]):v(s[2]):!1},Mh=f=>vh.test(f)&&!gh.test(f),am=()=>!1,Oh=f=>bh.test(f),Nh=f=>ph.test(f),Dh=()=>{const f=zl("colors"),b=zl("spacing"),v=zl("blur"),s=zl("brightness"),E=zl("borderColor"),O=zl("borderRadius"),j=zl("borderSpacing"),D=zl("borderWidth"),N=zl("contrast"),S=zl("grayscale"),Y=zl("hueRotate"),R=zl("invert"),L=zl("gap"),bl=zl("gradientColorStops"),vl=zl("gradientColorStopPositions"),P=zl("inset"),el=zl("margin"),fl=zl("opacity"),_l=zl("padding"),Al=zl("saturate"),Dl=zl("scale"),wl=zl("sepia"),Yl=zl("skew"),W=zl("space"),Gl=zl("translate"),Wl=()=>["auto","contain","none"],Ut=()=>["auto","hidden","clip","visible","scroll"],$l=()=>["auto",J,b],k=()=>[J,b],Ct=()=>["",ee,Ne],Fl=()=>["auto",qa,J],Il=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],z=()=>["solid","dashed","dotted","double","none"],U=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],X=()=>["start","end","center","between","around","evenly","stretch"],ul=()=>["","0",J],sl=()=>["auto","avoid","all","avoid-page","page","left","right","column"],r=()=>[qa,J];return{cacheSize:500,separator:":",theme:{colors:[Ru],spacing:[ee,Ne],blur:["none","",De,J],brightness:r(),borderColor:[f],borderRadius:["none","","full",De,J],borderSpacing:k(),borderWidth:Ct(),contrast:r(),grayscale:ul(),hueRotate:r(),invert:ul(),gap:k(),gradientColorStops:[f],gradientColorStopPositions:[Sh,Ne],inset:$l(),margin:$l(),opacity:r(),padding:k(),saturate:r(),scale:r(),sepia:ul(),skew:r(),space:k(),translate:k()},classGroups:{aspect:[{aspect:["auto","square","video",J]}],container:["container"],columns:[{columns:[De]}],"break-after":[{"break-after":sl()}],"break-before":[{"break-before":sl()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...Il(),J]}],overflow:[{overflow:Ut()}],"overflow-x":[{"overflow-x":Ut()}],"overflow-y":[{"overflow-y":Ut()}],overscroll:[{overscroll:Wl()}],"overscroll-x":[{"overscroll-x":Wl()}],"overscroll-y":[{"overscroll-y":Wl()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[P]}],"inset-x":[{"inset-x":[P]}],"inset-y":[{"inset-y":[P]}],start:[{start:[P]}],end:[{end:[P]}],top:[{top:[P]}],right:[{right:[P]}],bottom:[{bottom:[P]}],left:[{left:[P]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",ju,J]}],basis:[{basis:$l()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",J]}],grow:[{grow:ul()}],shrink:[{shrink:ul()}],order:[{order:["first","last","none",ju,J]}],"grid-cols":[{"grid-cols":[Ru]}],"col-start-end":[{col:["auto",{span:["full",ju,J]},J]}],"col-start":[{"col-start":Fl()}],"col-end":[{"col-end":Fl()}],"grid-rows":[{"grid-rows":[Ru]}],"row-start-end":[{row:["auto",{span:[ju,J]},J]}],"row-start":[{"row-start":Fl()}],"row-end":[{"row-end":Fl()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",J]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",J]}],gap:[{gap:[L]}],"gap-x":[{"gap-x":[L]}],"gap-y":[{"gap-y":[L]}],"justify-content":[{justify:["normal",...X()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...X(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...X(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[_l]}],px:[{px:[_l]}],py:[{py:[_l]}],ps:[{ps:[_l]}],pe:[{pe:[_l]}],pt:[{pt:[_l]}],pr:[{pr:[_l]}],pb:[{pb:[_l]}],pl:[{pl:[_l]}],m:[{m:[el]}],mx:[{mx:[el]}],my:[{my:[el]}],ms:[{ms:[el]}],me:[{me:[el]}],mt:[{mt:[el]}],mr:[{mr:[el]}],mb:[{mb:[el]}],ml:[{ml:[el]}],"space-x":[{"space-x":[W]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[W]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",J,b]}],"min-w":[{"min-w":[J,b,"min","max","fit"]}],"max-w":[{"max-w":[J,b,"none","full","min","max","fit","prose",{screen:[De]},De]}],h:[{h:[J,b,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[J,b,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[J,b,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[J,b,"auto","min","max","fit"]}],"font-size":[{text:["base",De,Ne]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Ef]}],"font-family":[{font:[Ru]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",J]}],"line-clamp":[{"line-clamp":["none",qa,Ef]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ee,J]}],"list-image":[{"list-image":["none",J]}],"list-style-type":[{list:["none","disc","decimal",J]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[f]}],"placeholder-opacity":[{"placeholder-opacity":[fl]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[f]}],"text-opacity":[{"text-opacity":[fl]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...z(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ee,Ne]}],"underline-offset":[{"underline-offset":["auto",ee,J]}],"text-decoration-color":[{decoration:[f]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:k()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",J]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",J]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[fl]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...Il(),Ah]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",xh]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Eh]}],"bg-color":[{bg:[f]}],"gradient-from-pos":[{from:[vl]}],"gradient-via-pos":[{via:[vl]}],"gradient-to-pos":[{to:[vl]}],"gradient-from":[{from:[bl]}],"gradient-via":[{via:[bl]}],"gradient-to":[{to:[bl]}],rounded:[{rounded:[O]}],"rounded-s":[{"rounded-s":[O]}],"rounded-e":[{"rounded-e":[O]}],"rounded-t":[{"rounded-t":[O]}],"rounded-r":[{"rounded-r":[O]}],"rounded-b":[{"rounded-b":[O]}],"rounded-l":[{"rounded-l":[O]}],"rounded-ss":[{"rounded-ss":[O]}],"rounded-se":[{"rounded-se":[O]}],"rounded-ee":[{"rounded-ee":[O]}],"rounded-es":[{"rounded-es":[O]}],"rounded-tl":[{"rounded-tl":[O]}],"rounded-tr":[{"rounded-tr":[O]}],"rounded-br":[{"rounded-br":[O]}],"rounded-bl":[{"rounded-bl":[O]}],"border-w":[{border:[D]}],"border-w-x":[{"border-x":[D]}],"border-w-y":[{"border-y":[D]}],"border-w-s":[{"border-s":[D]}],"border-w-e":[{"border-e":[D]}],"border-w-t":[{"border-t":[D]}],"border-w-r":[{"border-r":[D]}],"border-w-b":[{"border-b":[D]}],"border-w-l":[{"border-l":[D]}],"border-opacity":[{"border-opacity":[fl]}],"border-style":[{border:[...z(),"hidden"]}],"divide-x":[{"divide-x":[D]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[D]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[fl]}],"divide-style":[{divide:z()}],"border-color":[{border:[E]}],"border-color-x":[{"border-x":[E]}],"border-color-y":[{"border-y":[E]}],"border-color-s":[{"border-s":[E]}],"border-color-e":[{"border-e":[E]}],"border-color-t":[{"border-t":[E]}],"border-color-r":[{"border-r":[E]}],"border-color-b":[{"border-b":[E]}],"border-color-l":[{"border-l":[E]}],"divide-color":[{divide:[E]}],"outline-style":[{outline:["",...z()]}],"outline-offset":[{"outline-offset":[ee,J]}],"outline-w":[{outline:[ee,Ne]}],"outline-color":[{outline:[f]}],"ring-w":[{ring:Ct()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[f]}],"ring-opacity":[{"ring-opacity":[fl]}],"ring-offset-w":[{"ring-offset":[ee,Ne]}],"ring-offset-color":[{"ring-offset":[f]}],shadow:[{shadow:["","inner","none",De,_h]}],"shadow-color":[{shadow:[Ru]}],opacity:[{opacity:[fl]}],"mix-blend":[{"mix-blend":[...U(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":U()}],filter:[{filter:["","none"]}],blur:[{blur:[v]}],brightness:[{brightness:[s]}],contrast:[{contrast:[N]}],"drop-shadow":[{"drop-shadow":["","none",De,J]}],grayscale:[{grayscale:[S]}],"hue-rotate":[{"hue-rotate":[Y]}],invert:[{invert:[R]}],saturate:[{saturate:[Al]}],sepia:[{sepia:[wl]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[v]}],"backdrop-brightness":[{"backdrop-brightness":[s]}],"backdrop-contrast":[{"backdrop-contrast":[N]}],"backdrop-grayscale":[{"backdrop-grayscale":[S]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[Y]}],"backdrop-invert":[{"backdrop-invert":[R]}],"backdrop-opacity":[{"backdrop-opacity":[fl]}],"backdrop-saturate":[{"backdrop-saturate":[Al]}],"backdrop-sepia":[{"backdrop-sepia":[wl]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[j]}],"border-spacing-x":[{"border-spacing-x":[j]}],"border-spacing-y":[{"border-spacing-y":[j]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",J]}],duration:[{duration:r()}],ease:[{ease:["linear","in","out","in-out",J]}],delay:[{delay:r()}],animate:[{animate:["none","spin","ping","pulse","bounce",J]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[Dl]}],"scale-x":[{"scale-x":[Dl]}],"scale-y":[{"scale-y":[Dl]}],rotate:[{rotate:[ju,J]}],"translate-x":[{"translate-x":[Gl]}],"translate-y":[{"translate-y":[Gl]}],"skew-x":[{"skew-x":[Yl]}],"skew-y":[{"skew-y":[Yl]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",J]}],accent:[{accent:["auto",f]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",J]}],"caret-color":[{caret:[f]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":k()}],"scroll-mx":[{"scroll-mx":k()}],"scroll-my":[{"scroll-my":k()}],"scroll-ms":[{"scroll-ms":k()}],"scroll-me":[{"scroll-me":k()}],"scroll-mt":[{"scroll-mt":k()}],"scroll-mr":[{"scroll-mr":k()}],"scroll-mb":[{"scroll-mb":k()}],"scroll-ml":[{"scroll-ml":k()}],"scroll-p":[{"scroll-p":k()}],"scroll-px":[{"scroll-px":k()}],"scroll-py":[{"scroll-py":k()}],"scroll-ps":[{"scroll-ps":k()}],"scroll-pe":[{"scroll-pe":k()}],"scroll-pt":[{"scroll-pt":k()}],"scroll-pr":[{"scroll-pr":k()}],"scroll-pb":[{"scroll-pb":k()}],"scroll-pl":[{"scroll-pl":k()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",J]}],fill:[{fill:[f,"none"]}],"stroke-w":[{stroke:[ee,Ne,Ef]}],stroke:[{stroke:[f,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},Uh=dh(Dh);function _t(...f){return Uh(Id(f))}function Ue({className:f,...b}){return M.jsx("div",{className:_t("rounded-lg border border-border bg-card text-foreground shadow-sm",f),...b})}const wd=f=>typeof f=="boolean"?`${f}`:f===0?"0":f,Jd=Id,Ch=(f,b)=>v=>{var s;if((b==null?void 0:b.variants)==null)return Jd(f,v==null?void 0:v.class,v==null?void 0:v.className);const{variants:E,defaultVariants:O}=b,j=Object.keys(E).map(S=>{const Y=v==null?void 0:v[S],R=O==null?void 0:O[S];if(Y===null)return null;const L=wd(Y)||wd(R);return E[S][L]}),D=v&&Object.entries(v).reduce((S,Y)=>{let[R,L]=Y;return L===void 0||(S[R]=L),S},{}),N=b==null||(s=b.compoundVariants)===null||s===void 0?void 0:s.reduce((S,Y)=>{let{class:R,className:L,...bl}=Y;return Object.entries(bl).every(vl=>{let[P,el]=vl;return Array.isArray(el)?el.includes({...O,...D}[P]):{...O,...D}[P]===el})?[...S,R,L]:S},[]);return Jd(f,j,N,v==null?void 0:v.class,v==null?void 0:v.className)},jh=Ch("inline-flex items-center rounded-md border px-2 py-0.5 text-xs font-semibold uppercase tracking-wide",{variants:{variant:{default:"border-border bg-background text-muted-foreground",outline:"border-border text-muted-foreground"}},defaultVariants:{variant:"default"}});function Uf({className:f,variant:b,...v}){return M.jsx("span",{className:_t(jh({variant:b}),f),...v})}function um(f){return f===null?"na":f>=90?"good":f>=70?"warn":"bad"}const Dt={good:"text-good",warn:"text-warn",bad:"text-bad",na:"text-na"},Rh={good:"bg-good",warn:"bg-warn",bad:"bg-bad",na:"bg-na"},Hh={good:"stroke-good",warn:"stroke-warn",bad:"stroke-bad",na:"stroke-na"},qh={good:"fill-good",warn:"fill-warn",bad:"fill-bad",na:"fill-na"},nm={good:"border-l-good",warn:"border-l-warn",bad:"border-l-bad",na:"border-l-na"};function im({score:f,size:b=80,stroke:v=7,advisory:s=!1}){const E=b/2-v,O=2*Math.PI*E,j=f===null?0:Math.max(0,Math.min(100,f))/100,D=s?"na":um(f),N=b/2;return M.jsxs("svg",{width:b,height:b,viewBox:`0 0 ${b} ${b}`,role:"img",children:[M.jsx("circle",{cx:N,cy:N,r:E,fill:"none",strokeWidth:v,className:"stroke-border"}),M.jsx("circle",{cx:N,cy:N,r:E,fill:"none",strokeWidth:v,strokeLinecap:"round",strokeDasharray:`${j*O} ${O}`,transform:`rotate(-90 ${N} ${N})`,className:Hh[D]}),M.jsx("text",{x:"50%",y:"50%",textAnchor:"middle",dominantBaseline:"central",fontSize:Math.round(b*.28),className:_t("font-extrabold",qh[D]),children:f===null?"n/a":f})]})}const Bh={enforce:"rule",file:"file",cmd:"cmd",dir:"dir"};function Yh({r:f}){return M.jsxs("div",{className:_t("border-l-4 p-3",nm.bad),children:[M.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[M.jsx(Uf,{children:Bh[f.kind]}),M.jsx("code",{className:"font-mono text-xs text-foreground",children:f.ref})]}),M.jsx("div",{className:"mt-0.5 text-xs text-muted-foreground",children:f.issue})]})}function Gh({data:f}){if(f.total===0)return M.jsxs(Ue,{className:"p-4 text-sm text-muted-foreground",children:["No machine-verifiable references found — add"," ",M.jsx("code",{className:"font-mono text-xs",children:"enforce()"})," calls to a"," ",M.jsx("code",{className:"font-mono text-xs",children:".spec.ts"})," to unlock cross-referencing."]});const b=f.broken===0;return M.jsxs(Ue,{className:"p-5",children:[M.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[M.jsxs("div",{className:"flex items-baseline gap-1.5",children:[M.jsx("span",{className:_t("text-3xl font-bold tabular-nums",b?Dt.good:Dt.bad),children:f.broken}),M.jsxs("span",{className:"text-sm text-muted-foreground",children:["/ ",f.total," broken"]})]}),b?M.jsxs("span",{className:_t("flex items-center gap-1 text-sm",Dt.good),children:[M.jsx(Nf,{size:14})," all ",f.total," reference",f.total===1?"":"s"," resolve"]}):M.jsxs("span",{className:_t("flex items-center gap-1 text-sm",Dt.bad),children:[M.jsx(W0,{size:14})," ",f.broken," broken reference",f.broken===1?"":"s"," found"]})]}),f.brokenRefs.length>0&&M.jsx("div",{className:"mt-4 flex flex-col gap-2",children:f.brokenRefs.map((v,s)=>M.jsx(Yh,{r:v},s))})]})}function cm(){const f=window.__VIGILES_SERVE__;return f&&typeof f.token=="string"?f:null}async function Xh(f,b,v){try{const s=await fetch(f,{method:"POST",headers:{"content-type":"application/json","x-vigiles-token":v},body:JSON.stringify(b)}),E=await s.json();return{ok:E.ok??s.ok,message:E.message??""}}catch(s){return{ok:!1,message:s instanceof Error?s.message:String(s)}}}const fm="inline-flex items-center gap-2 rounded-md border border-border bg-card px-3 py-1.5 text-left text-xs font-medium hover:border-foreground disabled:opacity-60";function sm({command:f,label:b}){const[v,s]=ae.useState(!1),E=()=>{var O;(O=navigator.clipboard)==null||O.writeText(f).then(()=>{s(!0),setTimeout(()=>s(!1),1500)},()=>{})};return M.jsxs("button",{type:"button",onClick:E,title:`Copy: ${f}`,className:fm,children:[v?M.jsx(Wd,{size:14,className:Dt.good}):M.jsx(J0,{size:14,className:"text-muted-foreground"}),M.jsx("span",{className:_t(v&&Dt.good),children:v?"copied!":b})]})}function om({endpoint:f,body:b,token:v,label:s}){const[E,O]=ae.useState("idle"),[j,D]=ae.useState(""),N=()=>{O("running"),Xh(f,b,v).then(S=>{O(S.ok?"done":"error"),D(S.message)})};return M.jsxs("button",{type:"button",onClick:N,disabled:E==="running"||E==="done",title:E==="error"?j:s,className:fm,children:[E==="running"&&M.jsx($0,{size:14,className:"animate-spin text-muted-foreground"}),E==="done"&&M.jsx(Wd,{size:14,className:Dt.good}),E==="error"&&M.jsx(P0,{size:14,className:Dt.bad}),E==="idle"&&M.jsx($d,{size:14,className:"text-muted-foreground"}),M.jsx("span",{className:_t(E==="done"&&Dt.good,E==="error"&&Dt.bad),children:E==="done"?"created":E==="error"?"failed":E==="running"?"creating…":s})]})}function Qh({path:f,command:b}){const v=cm();return M.jsxs("div",{className:"flex flex-wrap items-center gap-3 border-l-4 border-l-warn p-3",children:[M.jsx("code",{className:"font-mono text-xs text-foreground",children:f}),M.jsx("div",{className:"ml-auto",children:v?M.jsx(om,{endpoint:"/adopt",body:{target:f},token:v.token,label:"Create spec"}):M.jsx(sm,{command:b,label:"Create spec"})})]})}function Zh({data:f}){const b=cm();return M.jsxs(Ue,{className:"p-5",children:[M.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[M.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[M.jsx($d,{size:16,className:"text-muted-foreground"}),f.surfaces.length," surface",f.surfaces.length===1?"":"s"," not yet spec-managed"]}),M.jsx("div",{className:"ml-auto",children:b?M.jsx(om,{endpoint:"/adopt-all",body:{},token:b.token,label:"Create all specs"}):M.jsx(sm,{command:f.createAllCommand,label:"Create all specs"})})]}),M.jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:b?"Click to create the typed spec — this report is live, so the CLI writes it for you (re-run audit to see it spec-managed).":"Copy the command and run it in your terminal — the CLI writes the typed spec (the browser can’t write files)."}),f.surfaces.length>0&&M.jsx("div",{className:"mt-4 flex flex-col gap-2",children:f.surfaces.map(v=>M.jsx(Qh,{path:v.path,command:v.command},v.path))})]})}function Lh({c:f}){return M.jsxs(Ue,{className:"flex flex-col items-center gap-3 p-5 text-center",children:[M.jsx(im,{score:f.score,advisory:f.advisory}),M.jsxs("div",{children:[M.jsxs("div",{className:"flex items-center justify-center gap-1.5 text-sm font-semibold",children:[f.key,f.advisory&&M.jsx(Uf,{variant:"outline",className:"text-na",children:"advisory"})]}),M.jsxs("div",{className:"mt-1 min-h-8 text-xs text-muted-foreground",children:[f.advisory&&M.jsx("div",{className:"text-na",children:"not graded — hardening signal"}),f.findings.length>0?f.findings.join("; "):M.jsxs("span",{className:"inline-flex items-center gap-1 text-good",children:[M.jsx(Nf,{size:12})," clean"]})]})]})]})}function Vh({r:f}){const b=f.action==="fix"?I0:k0,v=f.confidence==="likely"?"bad":"warn";return M.jsxs(Ue,{className:_t("border-l-4 p-4",nm[v]),children:[M.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[M.jsxs(Uf,{children:[M.jsx(b,{size:12,className:"mr-1"}),f.action]}),M.jsx("strong",{children:f.surface}),M.jsx("span",{className:"ml-auto font-mono text-xs text-muted-foreground",children:f.detector})]}),M.jsx("div",{className:"mt-1.5 text-sm text-muted-foreground",children:f.rationale}),M.jsxs("div",{className:"mt-1 text-sm text-good",children:["→ ",f.fix]})]})}function Ha({n:f,label:b}){return M.jsxs(Ue,{className:"p-4 text-center",children:[M.jsx("div",{className:"text-2xl font-bold",children:f}),M.jsx("div",{className:"mt-0.5 text-xs uppercase tracking-wide text-muted-foreground",children:b})]})}function Kh({data:f}){const{score:b,recommendations:v,inventory:s,meta:E,adoptability:O,adoptable:j}=f,D=b.empty?null:b.overall,N=um(D);return M.jsxs("div",{className:"mx-auto max-w-5xl px-6 pb-16 pt-10",children:[M.jsxs(Ue,{className:"flex items-center gap-7 p-7",children:[M.jsx(im,{score:D,size:128,stroke:11}),M.jsxs("div",{children:[M.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Harness audit"}),M.jsxs("div",{className:"mt-1 text-sm text-muted-foreground",children:[E.dir," · ",E.harness]}),M.jsxs("div",{className:_t("mt-3 inline-flex items-center gap-2 rounded-full border border-border px-3 py-1 text-sm font-semibold",Dt[N]),children:[M.jsx("span",{className:_t("h-2 w-2 rounded-full",Rh[N])}),"Harness health: ",b.grade," (",b.overall,"/100)"]})]})]}),M.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Categories"}),M.jsx("div",{className:"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-5",children:b.categories.map(S=>M.jsx(Lh,{c:S},S.key))}),M.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:v.length>0?`Fixes (${v.length})`:"Fixes"}),v.length>0?M.jsx("div",{className:"flex flex-col gap-2.5",children:v.map((S,Y)=>M.jsx(Vh,{r:S},Y))}):M.jsxs(Ue,{className:"flex items-center gap-2 p-4 text-sm text-good",children:[M.jsx(Nf,{size:16})," No deterministic fixes — the structure is clean."]}),j&&j.surfaces.length>0&&M.jsxs(M.Fragment,{children:[M.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Create specs"}),M.jsx("p",{className:"mb-3 text-xs text-muted-foreground",children:"Turn these surfaces into typed specs so vigiles can verify their references — fully, or one at a time."}),M.jsx(Zh,{data:j})]}),O&&M.jsxs(M.Fragment,{children:[M.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Adoptability"}),M.jsx("p",{className:"mb-3 text-xs text-muted-foreground",children:"What vigiles would catch in your repo — machine-verifiable references in your instruction file checked against your actual config."}),M.jsx(Gh,{data:O})]}),M.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"What it ships"}),M.jsxs("div",{className:"grid grid-cols-3 gap-2.5 sm:grid-cols-6",children:[M.jsx(Ha,{n:s.skills,label:"skills"}),M.jsx(Ha,{n:s.agents,label:"agents"}),M.jsx(Ha,{n:s.hooks,label:"hooks"}),M.jsx(Ha,{n:s.commands,label:"commands"}),M.jsx(Ha,{n:s.mcp?"yes":"no",label:"MCP"}),M.jsx(Ha,{n:s.untested,label:"untested"})]}),M.jsxs("footer",{className:"mt-12 flex items-center justify-center gap-1.5 text-center text-xs text-muted-foreground",children:[M.jsx(F0,{size:12})," Generated by vigiles — we run your harness, not just read it."]})]})}const wh={meta:{schemaVersion:1,tool:"vigiles",vigilesVersion:"0.0.0",harness:"claude-code",dir:"demo"},score:{overall:77,grade:"C",empty:!1,categories:[{key:"Truthfulness",score:100,weight:1,findings:[]},{key:"Triggering",score:92,weight:1,findings:["1 near-identical skill description(s) (wrong one fires)"]},{key:"Structure",score:92,weight:1,findings:["1 agent tool(s) that don't exist (typo / never-available)"]},{key:"Safety",score:80,weight:1,findings:["1 unit(s) holding all three lethal-trifecta legs (prompt-injection exfil path)"]},{key:"Tested",score:88,weight:1,findings:["4 untested surface(s)"]}]},recommendations:[{surface:"reviewer",action:"fix",rationale:`Unknown tool "Reed" — silently dropped, the agent can't use it.`,fix:'change the tool "Reed" to "Read"',detector:"subagent-tool-contract",confidence:"likely"},{surface:"deploy ↔ ship",action:"differentiate",rationale:"Near-identical descriptions (0.92 similar) — the selector can't tell them apart.",fix:"differentiate the descriptions of deploy and ship",detector:"description-overlap",confidence:"possible"}],inventory:{skills:2,agents:1,hooks:1,commands:0,mcp:!1,untested:4},adoptable:{createAllCommand:"npx vigiles init",surfaces:[{path:"skills/deploy/SKILL.md",command:"npx vigiles init --target=skills/deploy/SKILL.md"},{path:"agents/reviewer.md",command:"npx vigiles init --target=agents/reviewer.md"}]},adoptability:{total:5,broken:2,brokenRefs:[{kind:"enforce",ref:"@typescript-eslint/no-floating-promises",issue:"rule not found in eslint config"},{kind:"file",ref:"src/auth/login.ts",issue:"file does not exist"}]}},_f=window.__VIGILES_DATA__,Jh=_f&&typeof _f=="object"?_f:wh;L0.createRoot(document.getElementById("root")).render(M.jsx(ae.StrictMode,{children:M.jsx(Kh,{data:Jh})}));</script>
126
126
  <style rel="stylesheet" crossorigin>/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--animate-spin:spin 1s linear infinite;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-good:var(--good)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{background-color:var(--background);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@layer components;@layer utilities{.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mr-1{margin-right:var(--spacing)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing) * 2)}.min-h-8{min-height:calc(var(--spacing) * 8)}.w-2{width:calc(var(--spacing) * 2)}.max-w-5xl{max-width:var(--container-5xl)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-7{gap:calc(var(--spacing) * 7)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-border{border-color:var(--border)}.border-l-bad{border-left-color:var(--bad)}.border-l-good{border-left-color:var(--good)}.border-l-na{border-left-color:var(--na)}.border-l-warn{border-left-color:var(--warn)}.bg-background{background-color:var(--background)}.bg-bad{background-color:var(--bad)}.bg-card{background-color:var(--card)}.bg-good{background-color:var(--good)}.bg-na{background-color:var(--na)}.bg-warn{background-color:var(--warn)}.fill-bad{fill:var(--bad)}.fill-good{fill:var(--good)}.fill-na{fill:var(--na)}.fill-warn{fill:var(--warn)}.stroke-bad{stroke:var(--bad)}.stroke-border{stroke:var(--border)}.stroke-good{stroke:var(--good)}.stroke-na{stroke:var(--na)}.stroke-warn{stroke:var(--warn)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-7{padding:calc(var(--spacing) * 7)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-bad{color:var(--bad)}.text-foreground{color:var(--foreground)}.text-good{color:var(--good)}.text-muted-foreground{color:var(--muted)}.text-na{color:var(--na)}.text-warn{color:var(--warn)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}@media(hover:hover){.hover\:border-foreground:hover{border-color:var(--foreground)}}.disabled\:opacity-60:disabled{opacity:.6}@media(min-width:40rem){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media(min-width:64rem){.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}}:root{--background:#fafafa;--card:#fff;--border:#e4e4e7;--foreground:#09090b;--muted:#71717a;--good:#16a34a;--warn:#f59e0b;--bad:#ef4444;--na:#a1a1aa;--radius:.75rem}@media(prefers-color-scheme:dark){:root{--background:#0b0f17;--card:#121826;--border:#1e2636;--foreground:#e6e9ef;--muted:#9aa4b2;--good:#16c784;--warn:#ffb020;--bad:#ff5c5c;--na:#6b7280}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}</style>
127
127
  </head>
128
128
  <body>