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.
- package/README.md +113 -83
- package/dist/adapters/claude-code/dialect.js +15 -0
- package/dist/audit-report.d.ts +1 -1
- package/dist/audit-report.template.html +1 -1
- package/dist/audit-score.d.ts +19 -12
- package/dist/audit-score.js +65 -11
- package/dist/cli.js +249 -0
- package/dist/core/CLAUDE.md.spec.d.ts +3 -0
- package/dist/core/CLAUDE.md.spec.js +26 -0
- package/dist/core/delegation-trifecta.d.ts +64 -0
- package/dist/core/delegation-trifecta.js +124 -0
- package/dist/core/dialect.d.ts +18 -0
- package/dist/core/hook-block-ineffective.d.ts +62 -0
- package/dist/core/hook-block-ineffective.js +153 -0
- package/dist/core/hook-matcher.d.ts +66 -0
- package/dist/core/hook-matcher.js +182 -0
- package/dist/core/hook-normalize.d.ts +43 -0
- package/dist/core/hook-normalize.js +78 -0
- package/dist/core/lethal-trifecta.d.ts +100 -0
- package/dist/core/lethal-trifecta.js +197 -0
- package/dist/core/plugin-dir-layout.d.ts +30 -0
- package/dist/core/plugin-dir-layout.js +73 -0
- package/dist/core/rule-meta.d.ts +82 -0
- package/dist/core/rule-meta.js +266 -0
- package/dist/core/skill-missing-fence.d.ts +47 -0
- package/dist/core/skill-missing-fence.js +119 -0
- package/dist/core/skill-resources.d.ts +27 -0
- package/dist/core/skill-resources.js +167 -0
- package/dist/core/types.d.ts +71 -0
- package/dist/core/validate.d.ts +1 -0
- package/dist/core/validate.js +26 -4
- package/dist/leaderboard.d.ts +1 -0
- package/dist/leaderboard.js +42 -4
- package/dist/scan.d.ts +106 -0
- package/dist/scan.js +251 -45
- package/dist/setup-plan.d.ts +6 -3
- package/dist/setup-plan.js +12 -2
- 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/.
|
|
10
|
-
→
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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) —
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
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
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
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
|
|
110
|
+
No key, no config, safe on any repo. Here's what it caught on plugins people actually
|
|
111
|
+
ship. ↓
|
|
87
112
|
|
|
88
|
-
##
|
|
113
|
+
## What it caught
|
|
89
114
|
|
|
90
115
|
<p align="center">
|
|
91
|
-
<img src="vigiles-audit.png" width="760" alt="vigiles audit report
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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 —
|
|
125
|
+
## Proof 1 — your agent can read your secrets and ship them out
|
|
100
126
|
|
|
101
127
|
```text
|
|
102
|
-
|
|
103
|
-
└
|
|
104
|
-
|
|
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
|
-
|
|
108
|
-
can
|
|
109
|
-
the
|
|
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
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
127
|
-
|
|
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
|
-
|
|
130
|
-
|
|
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
|
|
174
|
+
## How it works
|
|
133
175
|
|
|
134
|
-
|
|
135
|
-
|
|
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
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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,
|
|
148
|
-
|
|
149
|
-
|
|
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
|
|
172
|
-
|
|
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
|
-
**
|
|
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
|
|
187
|
-
|
|
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
|
|
219
|
+
Or run it yourself:
|
|
192
220
|
|
|
193
221
|
```bash
|
|
194
|
-
npx vigiles init #
|
|
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
|
package/dist/audit-report.d.ts
CHANGED
|
@@ -77,7 +77,7 @@ export interface Adoptable {
|
|
|
77
77
|
*/
|
|
78
78
|
export interface AuditReport {
|
|
79
79
|
readonly meta: AuditReportMeta;
|
|
80
|
-
/** The
|
|
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>
|