specweave 1.0.257 → 1.0.260
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/CLAUDE.md +68 -53
- package/README.md +31 -0
- package/bin/specweave.js +28 -0
- package/dist/dashboard/assets/index-DdtF4K1G.css +1 -0
- package/dist/dashboard/assets/index-cZA6rz8s.js +11 -0
- package/dist/dashboard/index.html +14 -0
- package/dist/src/adapters/README.md +4 -4
- package/dist/src/adapters/agents-md-generator.d.ts.map +1 -1
- package/dist/src/adapters/agents-md-generator.js +0 -2
- package/dist/src/adapters/agents-md-generator.js.map +1 -1
- package/dist/src/adapters/claude/README.md +3 -3
- package/dist/src/adapters/claude/adapter.js +3 -3
- package/dist/src/adapters/claude-md-generator.js +1 -1
- package/dist/src/adapters/claude-md-generator.js.map +1 -1
- package/dist/src/adapters/registry.yaml +1 -1
- package/dist/src/cli/commands/create-increment.d.ts +24 -0
- package/dist/src/cli/commands/create-increment.d.ts.map +1 -0
- package/dist/src/cli/commands/create-increment.js +53 -0
- package/dist/src/cli/commands/create-increment.js.map +1 -0
- package/dist/src/cli/commands/dashboard.d.ts +18 -0
- package/dist/src/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/src/cli/commands/dashboard.js +142 -0
- package/dist/src/cli/commands/dashboard.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +48 -31
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/update.d.ts.map +1 -1
- package/dist/src/cli/commands/update.js +36 -0
- package/dist/src/cli/commands/update.js.map +1 -1
- package/dist/src/cli/helpers/init/directory-structure.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/directory-structure.js +13 -1
- package/dist/src/cli/helpers/init/directory-structure.js.map +1 -1
- package/dist/src/cli/helpers/init/summary-banner.d.ts +11 -0
- package/dist/src/cli/helpers/init/summary-banner.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/summary-banner.js +49 -3
- package/dist/src/cli/helpers/init/summary-banner.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +0 -1
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js +6 -2
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js.map +1 -1
- package/dist/src/core/config/types.d.ts +24 -1
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js +6 -1
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/doctor/checkers/project-structure-checker.d.ts +1 -0
- package/dist/src/core/doctor/checkers/project-structure-checker.d.ts.map +1 -1
- package/dist/src/core/doctor/checkers/project-structure-checker.js +53 -3
- package/dist/src/core/doctor/checkers/project-structure-checker.js.map +1 -1
- package/dist/src/core/fabric/security-scanner.d.ts.map +1 -1
- package/dist/src/core/fabric/security-scanner.js +70 -9
- package/dist/src/core/fabric/security-scanner.js.map +1 -1
- package/dist/src/core/increment/increment-utils.d.ts +6 -0
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
- package/dist/src/core/increment/increment-utils.js +5 -0
- package/dist/src/core/increment/increment-utils.js.map +1 -1
- package/dist/src/core/lazy-loading/llm-plugin-detector.d.ts +9 -4
- package/dist/src/core/lazy-loading/llm-plugin-detector.d.ts.map +1 -1
- package/dist/src/core/lazy-loading/llm-plugin-detector.js +9 -4
- package/dist/src/core/lazy-loading/llm-plugin-detector.js.map +1 -1
- package/dist/src/core/living-docs/discovery.d.ts +2 -0
- package/dist/src/core/living-docs/discovery.d.ts.map +1 -1
- package/dist/src/core/living-docs/discovery.js +91 -17
- package/dist/src/core/living-docs/discovery.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts +5 -0
- package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/index.js +3 -3
- package/dist/src/core/living-docs/intelligent-analyzer/index.js.map +1 -1
- package/dist/src/core/living-docs/lsp-bootstrapper.d.ts +64 -0
- package/dist/src/core/living-docs/lsp-bootstrapper.d.ts.map +1 -0
- package/dist/src/core/living-docs/lsp-bootstrapper.js +118 -0
- package/dist/src/core/living-docs/lsp-bootstrapper.js.map +1 -0
- package/dist/src/dashboard/server/command-runner.d.ts +21 -0
- package/dist/src/dashboard/server/command-runner.d.ts.map +1 -0
- package/dist/src/dashboard/server/command-runner.js +92 -0
- package/dist/src/dashboard/server/command-runner.js.map +1 -0
- package/dist/src/dashboard/server/dashboard-server.d.ts +33 -0
- package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -0
- package/dist/src/dashboard/server/dashboard-server.js +812 -0
- package/dist/src/dashboard/server/dashboard-server.js.map +1 -0
- package/dist/src/dashboard/server/data/activity-stream.d.ts +27 -0
- package/dist/src/dashboard/server/data/activity-stream.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/activity-stream.js +142 -0
- package/dist/src/dashboard/server/data/activity-stream.js.map +1 -0
- package/dist/src/dashboard/server/data/claude-log-parser.d.ts +34 -0
- package/dist/src/dashboard/server/data/claude-log-parser.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/claude-log-parser.js +218 -0
- package/dist/src/dashboard/server/data/claude-log-parser.js.map +1 -0
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts +35 -0
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.js +219 -0
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.js.map +1 -0
- package/dist/src/dashboard/server/data/plugin-scanner.d.ts +35 -0
- package/dist/src/dashboard/server/data/plugin-scanner.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/plugin-scanner.js +96 -0
- package/dist/src/dashboard/server/data/plugin-scanner.js.map +1 -0
- package/dist/src/dashboard/server/data/sync-audit-reader.d.ts +38 -0
- package/dist/src/dashboard/server/data/sync-audit-reader.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/sync-audit-reader.js +94 -0
- package/dist/src/dashboard/server/data/sync-audit-reader.js.map +1 -0
- package/dist/src/dashboard/server/file-watcher.d.ts +19 -0
- package/dist/src/dashboard/server/file-watcher.d.ts.map +1 -0
- package/dist/src/dashboard/server/file-watcher.js +104 -0
- package/dist/src/dashboard/server/file-watcher.js.map +1 -0
- package/dist/src/dashboard/server/router.d.ts +16 -0
- package/dist/src/dashboard/server/router.d.ts.map +1 -0
- package/dist/src/dashboard/server/router.js +110 -0
- package/dist/src/dashboard/server/router.js.map +1 -0
- package/dist/src/dashboard/server/sse-manager.d.ts +25 -0
- package/dist/src/dashboard/server/sse-manager.d.ts.map +1 -0
- package/dist/src/dashboard/server/sse-manager.js +75 -0
- package/dist/src/dashboard/server/sse-manager.js.map +1 -0
- package/dist/src/dashboard/types.d.ts +183 -0
- package/dist/src/dashboard/types.d.ts.map +1 -0
- package/dist/src/dashboard/types.js +2 -0
- package/dist/src/dashboard/types.js.map +1 -0
- package/package.json +12 -2
- package/plugins/specweave/PLUGIN.md +0 -3
- package/plugins/specweave/commands/living-docs.md +0 -2
- package/plugins/specweave/hooks/user-prompt-submit.sh +157 -153
- package/plugins/specweave/lib/hooks/sync-living-docs.js +4 -2
- package/plugins/specweave/scripts/skill-context.sh +22 -7
- package/plugins/specweave/skills/archive-increments/SKILL.md +13 -3
- package/plugins/specweave/skills/do/SKILL.md +31 -1
- package/plugins/specweave/skills/docs/SKILL.md +62 -44
- package/plugins/specweave/skills/increment/SKILL.md +2 -2
- package/plugins/specweave/skills/increment-planner/SKILL.md +35 -3
- package/plugins/specweave/skills/increment-work-router/SKILL.md +37 -9
- package/plugins/specweave/skills/jobs/SKILL.md +52 -0
- package/src/templates/config.json.template +5 -1
- package/plugins/specweave/commands/brownfield-analyzer.md +0 -408
- package/plugins/specweave/commands/brownfield-onboarder.md +0 -837
- package/plugins/specweave/commands/export-skills.md +0 -179
package/CLAUDE.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- SW:META template="claude" version="1.0.
|
|
1
|
+
<!-- SW:META template="claude" version="1.0.260" sections="header,lsp,start,autodetect,metarule,rules,workflow,execution-strategy,reflect,context,structure,taskformat,secrets,syncing,testing,tdd,api,limits,troubleshooting,lazyloading,principles,linking,mcp,auto,docs" -->
|
|
2
2
|
|
|
3
3
|
<!-- SW:SECTION:hook-priority version="1.0.171" -->
|
|
4
4
|
## ⛔ Hook Instructions Override Everything
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
| **"SKILL FIRST"** | Call shown skill FIRST → chain domain skills → implement |
|
|
12
12
|
<!-- SW:END:hook-priority -->
|
|
13
13
|
|
|
14
|
-
<!-- SW:SECTION:header version="1.0.
|
|
14
|
+
<!-- SW:SECTION:header version="1.0.259" -->
|
|
15
15
|
**Framework**: SpecWeave | **Truth**: `spec.md` + `tasks.md`
|
|
16
16
|
<!-- SW:END:header -->
|
|
17
17
|
|
|
@@ -39,7 +39,13 @@ If auto-activation fails, invoke explicitly: `Skill({ skill: "name" })`
|
|
|
39
39
|
|
|
40
40
|
Use: `specweave lsp refs|def|hover src/file.ts SymbolName`
|
|
41
41
|
|
|
42
|
-
<!-- SW:SECTION:
|
|
42
|
+
<!-- SW:SECTION:lsp version="1.0.259" -->
|
|
43
|
+
## LSP (Code Intelligence)
|
|
44
|
+
|
|
45
|
+
**Native LSP broken in v2.1.0+.** Use: `specweave lsp refs|def|hover src/file.ts SymbolName`
|
|
46
|
+
<!-- SW:END:lsp -->
|
|
47
|
+
|
|
48
|
+
<!-- SW:SECTION:start version="1.0.259" -->
|
|
43
49
|
## Getting Started
|
|
44
50
|
|
|
45
51
|
**Initial increment**: `0001-project-setup` (auto-created by `specweave init`)
|
|
@@ -49,7 +55,7 @@ Use: `specweave lsp refs|def|hover src/file.ts SymbolName`
|
|
|
49
55
|
2. **Customize**: Edit spec.md and use for setup tasks
|
|
50
56
|
<!-- SW:END:start -->
|
|
51
57
|
|
|
52
|
-
<!-- SW:SECTION:autodetect version="1.0.
|
|
58
|
+
<!-- SW:SECTION:autodetect version="1.0.259" -->
|
|
53
59
|
## Auto-Detection
|
|
54
60
|
|
|
55
61
|
SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
@@ -59,7 +65,7 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
59
65
|
**Opt-out phrases**: "Just brainstorm first" | "Don't plan yet" | "Quick discussion" | "Let's explore ideas"
|
|
60
66
|
<!-- SW:END:autodetect -->
|
|
61
67
|
|
|
62
|
-
<!-- SW:SECTION:metarule version="1.0.
|
|
68
|
+
<!-- SW:SECTION:metarule version="1.0.259" -->
|
|
63
69
|
## Workflow Orchestration
|
|
64
70
|
|
|
65
71
|
### 1. Plan Mode Default
|
|
@@ -81,12 +87,12 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
81
87
|
### 4. Think-Before-Act (Dependencies)
|
|
82
88
|
**Satisfy dependencies BEFORE dependent operations.**
|
|
83
89
|
```
|
|
84
|
-
|
|
85
|
-
|
|
90
|
+
Bad: node script.js → Error → npm run build
|
|
91
|
+
Good: npm run build → node script.js → Success
|
|
86
92
|
```
|
|
87
93
|
<!-- SW:END:metarule -->
|
|
88
94
|
|
|
89
|
-
<!-- SW:SECTION:rules version="1.0.
|
|
95
|
+
<!-- SW:SECTION:rules version="1.0.259" -->
|
|
90
96
|
## Rules
|
|
91
97
|
|
|
92
98
|
1. **Files** → `.specweave/increments/####-name/` (see Structure section for details)
|
|
@@ -96,18 +102,13 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
96
102
|
find .specweave/increments -maxdepth 2 -type d -name "[0-9]*" | grep -oE '[0-9]{4}E?' | sort -u | tail -5
|
|
97
103
|
```
|
|
98
104
|
4. **Emergency**: "emergency mode" → 1 edit, 50 lines max, no agents
|
|
99
|
-
5.
|
|
100
|
-
6.
|
|
101
|
-
7.
|
|
102
|
-
|
|
103
|
-
ls docs/ | grep -E '^[0-9]{2}-' | cut -d'-' -f1 | sort -u
|
|
104
|
-
```
|
|
105
|
-
Use next available number. **NEVER create duplicate prefixes.**
|
|
106
|
-
8. **⛔ Multi-repo**: ALL repos MUST be at `repositories/{org}/{repo-name}/` — NEVER directly under `repositories/`
|
|
107
|
-
Discover org from config: `repository.organization` → `sync.profiles` → `umbrella.childRepos` → filesystem
|
|
105
|
+
5. **Initialization guard**: `.specweave/` folders MUST ONLY exist where `specweave init` was run
|
|
106
|
+
6. **Marketplace refresh**: Use `specweave refresh-marketplace` CLI (not `scripts/refresh-marketplace.sh`)
|
|
107
|
+
7. **Numbered folder collisions**: Before creating `docs/NN-*` folders, CHECK existing prefixes
|
|
108
|
+
8. **Multi-repo**: ALL repos MUST be at `repositories/{org}/{repo-name}/` — NEVER directly under `repositories/`
|
|
108
109
|
<!-- SW:END:rules -->
|
|
109
110
|
|
|
110
|
-
<!-- SW:SECTION:workflow version="1.0.
|
|
111
|
+
<!-- SW:SECTION:workflow version="1.0.259" -->
|
|
111
112
|
## Workflow
|
|
112
113
|
|
|
113
114
|
`/sw:increment "X"` → `/sw:do` → `/sw:progress` → `/sw:done 0001`
|
|
@@ -118,7 +119,7 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
118
119
|
| `/sw:do` | Execute tasks |
|
|
119
120
|
| `/sw:auto` | Autonomous execution |
|
|
120
121
|
| `/sw:auto-status` | Check auto session |
|
|
121
|
-
| `/sw:cancel-auto` |
|
|
122
|
+
| `/sw:cancel-auto` | EMERGENCY ONLY manual cancel |
|
|
122
123
|
| `/sw:validate` | Quality check |
|
|
123
124
|
| `/sw:done` | Close |
|
|
124
125
|
| `/sw:progress-sync` | Sync progress to all external tools |
|
|
@@ -127,13 +128,27 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
127
128
|
**Natural language**: "Let's build X" → `/sw:increment` | "What's status?" → `/sw:progress` | "We're done" → `/sw:done` | "Ship while sleeping" → `/sw:auto`
|
|
128
129
|
<!-- SW:END:workflow -->
|
|
129
130
|
|
|
131
|
+
<!-- SW:SECTION:execution-strategy version="1.0.260" -->
|
|
132
|
+
## Execution Strategy
|
|
133
|
+
|
|
134
|
+
Choose execution mode based on increment complexity:
|
|
135
|
+
|
|
136
|
+
| Complexity | Tasks | Domains | Recommended | Trade-off |
|
|
137
|
+
|-----------|-------|---------|-------------|-----------|
|
|
138
|
+
| Low | ≤8 | 1 | `/sw:do` | Full control, manual |
|
|
139
|
+
| Medium | 9-15 | 1-2 | `/sw:auto` | Unattended, sequential |
|
|
140
|
+
| High | >15 OR any | 3+ | `/sw:team-lead` | Parallel agents, higher token cost, best quality |
|
|
141
|
+
|
|
142
|
+
Skills auto-recommend based on this matrix. In non-auto mode: ask user. In auto mode: use team-lead automatically for 3+ domains.
|
|
143
|
+
<!-- SW:END:execution-strategy -->
|
|
144
|
+
|
|
130
145
|
<!-- SW:SECTION:save-nested-repos version="1.0.194" -->
|
|
131
146
|
## Nested Repos
|
|
132
147
|
|
|
133
148
|
Before git operations, scan: `for d in repositories packages services apps libs workspace; do [ -d "$d" ] && find "$d" -maxdepth 2 -name ".git" -type d; done`
|
|
134
149
|
<!-- SW:END:save-nested-repos -->
|
|
135
150
|
|
|
136
|
-
<!-- SW:SECTION:reflect version="1.0.
|
|
151
|
+
<!-- SW:SECTION:reflect version="1.0.259" -->
|
|
137
152
|
## Skill Memories
|
|
138
153
|
|
|
139
154
|
SpecWeave learns from corrections. Learnings saved here automatically. Edit or delete as needed.
|
|
@@ -154,7 +169,7 @@ SpecWeave learns from corrections. Learnings saved here automatically. Edit or d
|
|
|
154
169
|
- Prefer leaderboard-style reporting for analysis
|
|
155
170
|
- Auto mode: Stop hook creates implicit loops via block/approve pattern
|
|
156
171
|
|
|
157
|
-
<!-- SW:SECTION:context version="1.0.
|
|
172
|
+
<!-- SW:SECTION:context version="1.0.259" -->
|
|
158
173
|
## Context
|
|
159
174
|
|
|
160
175
|
**Before implementing**: Check ADRs at `.specweave/docs/internal/architecture/adr/`
|
|
@@ -162,7 +177,7 @@ SpecWeave learns from corrections. Learnings saved here automatically. Edit or d
|
|
|
162
177
|
**Load context**: `/sw:docs <topic>` loads relevant living docs into conversation
|
|
163
178
|
<!-- SW:END:context -->
|
|
164
179
|
|
|
165
|
-
<!-- SW:SECTION:structure version="1.0.
|
|
180
|
+
<!-- SW:SECTION:structure version="1.0.259" -->
|
|
166
181
|
## Structure
|
|
167
182
|
|
|
168
183
|
```
|
|
@@ -172,12 +187,12 @@ SpecWeave learns from corrections. Learnings saved here automatically. Edit or d
|
|
|
172
187
|
└── config.json
|
|
173
188
|
```
|
|
174
189
|
|
|
175
|
-
|
|
190
|
+
**Increment root**: ONLY `metadata.json`, `spec.md`, `plan.md`, `tasks.md`
|
|
176
191
|
|
|
177
192
|
**Everything else → subfolders**: `reports/` | `logs/` | `scripts/` | `backups/`
|
|
178
193
|
<!-- SW:END:structure -->
|
|
179
194
|
|
|
180
|
-
<!-- SW:SECTION:taskformat version="1.0.
|
|
195
|
+
<!-- SW:SECTION:taskformat version="1.0.259" -->
|
|
181
196
|
## Task Format
|
|
182
197
|
|
|
183
198
|
```markdown
|
|
@@ -187,69 +202,67 @@ SpecWeave learns from corrections. Learnings saved here automatically. Edit or d
|
|
|
187
202
|
```
|
|
188
203
|
<!-- SW:END:taskformat -->
|
|
189
204
|
|
|
190
|
-
<!-- SW:SECTION:secrets version="1.0.
|
|
205
|
+
<!-- SW:SECTION:secrets version="1.0.259" -->
|
|
191
206
|
## Secrets
|
|
192
207
|
|
|
193
|
-
|
|
208
|
+
Before CLI tools, check existing config (`grep -q` only — never display values).
|
|
194
209
|
<!-- SW:END:secrets -->
|
|
195
210
|
|
|
196
|
-
<!-- SW:SECTION:syncing version="1.0.
|
|
211
|
+
<!-- SW:SECTION:syncing version="1.0.259" -->
|
|
197
212
|
## External Sync
|
|
198
213
|
|
|
199
214
|
Primary: `/sw:progress-sync`. Individual: `/sw-github:push`, `/sw-github:close`. Mapping: Feature→Milestone | Story→Issue | Task→Checkbox.
|
|
200
215
|
<!-- SW:END:syncing -->
|
|
201
216
|
|
|
202
|
-
<!-- SW:SECTION:testing version="1.0.
|
|
217
|
+
<!-- SW:SECTION:testing version="1.0.259" -->
|
|
203
218
|
## Testing
|
|
204
219
|
|
|
205
220
|
BDD in tasks.md | Unit >80% | `.test.ts` (Vitest) | ESM mocking: `vi.hoisted()` + `vi.mock()`
|
|
206
221
|
<!-- SW:END:testing -->
|
|
207
222
|
|
|
208
|
-
<!-- SW:SECTION:tdd version="1.0.
|
|
223
|
+
<!-- SW:SECTION:tdd version="1.0.259" -->
|
|
209
224
|
## TDD
|
|
210
225
|
|
|
211
|
-
When `testing.defaultTestMode: "TDD"` in config.json: RED→GREEN→REFACTOR. Use `/sw:tdd-cycle`. Enforcement via `testing.tddEnforcement` (strict|warn|off).
|
|
226
|
+
When `testing.defaultTestMode: "TDD"` in config.json: RED→GREEN→REFACTOR. Use `/sw:tdd-cycle`. Enforcement via `testing.tddEnforcement` (strict|warn|off).
|
|
212
227
|
<!-- SW:END:tdd -->
|
|
213
228
|
|
|
214
|
-
<!-- SW:SECTION:api version="1.0.
|
|
215
|
-
<!-- API
|
|
229
|
+
<!-- SW:SECTION:api version="1.0.259" -->
|
|
230
|
+
<!-- API: Enable `apiDocs` in config.json. Commands: /sw:api-docs -->
|
|
216
231
|
<!-- SW:END:api -->
|
|
217
232
|
|
|
218
|
-
<!-- SW:SECTION:limits version="1.0.
|
|
233
|
+
<!-- SW:SECTION:limits version="1.0.259" -->
|
|
219
234
|
## Limits
|
|
220
235
|
|
|
221
236
|
**Max 1500 lines/file** — extract before adding
|
|
222
237
|
<!-- SW:END:limits -->
|
|
223
238
|
|
|
224
|
-
<!-- SW:SECTION:troubleshooting version="1.0.
|
|
239
|
+
<!-- SW:SECTION:troubleshooting version="1.0.259" -->
|
|
225
240
|
## Troubleshooting
|
|
226
241
|
|
|
227
|
-
|
|
242
|
+
| Issue | Fix |
|
|
243
|
+
|-------|-----|
|
|
244
|
+
| Skills missing | Restart Claude Code |
|
|
245
|
+
| Plugins outdated | `specweave refresh-marketplace` |
|
|
246
|
+
| Out of sync | `/sw:sync-tasks` |
|
|
247
|
+
| Session stuck | `rm -f .specweave/state/*.lock` + restart |
|
|
228
248
|
<!-- SW:END:troubleshooting -->
|
|
229
249
|
|
|
230
|
-
<!-- SW:SECTION:lazyloading version="1.0.
|
|
231
|
-
##
|
|
250
|
+
<!-- SW:SECTION:lazyloading version="1.0.259" -->
|
|
251
|
+
## Plugin Auto-Loading
|
|
232
252
|
|
|
233
|
-
|
|
253
|
+
Plugins load automatically. Manual: `claude plugin install sw-frontend@specweave`. Disable: `export SPECWEAVE_DISABLE_AUTO_LOAD=1`
|
|
234
254
|
<!-- SW:END:lazyloading -->
|
|
235
255
|
|
|
236
|
-
<!-- SW:SECTION:principles version="1.0.
|
|
256
|
+
<!-- SW:SECTION:principles version="1.0.259" -->
|
|
237
257
|
## Principles
|
|
238
258
|
|
|
239
|
-
### SpecWeave Principles
|
|
240
259
|
1. **Spec-first**: `/sw:increment` before coding
|
|
241
260
|
2. **Docs = truth**: Specs guide implementation
|
|
242
|
-
3. **
|
|
243
|
-
4. **
|
|
244
|
-
|
|
245
|
-
### Core Principles (Quality)
|
|
246
|
-
- **Simplicity First**: Make every change as simple as possible. Impact minimal code.
|
|
247
|
-
- **No Laziness**: Find root causes. No temporary fixes. Senior developer standards.
|
|
248
|
-
- **Minimal Impact**: Changes should only touch what's necessary. Avoid introducing bugs.
|
|
249
|
-
- **Demand Elegance**: For non-trivial changes, pause and ask "is there a more elegant way?" - but skip this for simple, obvious fixes (don't over-engineer).
|
|
261
|
+
3. **Simplicity First**: Minimal code, minimal impact
|
|
262
|
+
4. **No Laziness**: Root causes, senior standards
|
|
250
263
|
<!-- SW:END:principles -->
|
|
251
264
|
|
|
252
|
-
<!-- SW:SECTION:linking version="1.0.
|
|
265
|
+
<!-- SW:SECTION:linking version="1.0.259" -->
|
|
253
266
|
## Bidirectional Linking
|
|
254
267
|
|
|
255
268
|
Tasks ↔ User Stories auto-linked via AC-IDs: `AC-US1-01` → `US-001`
|
|
@@ -257,19 +270,21 @@ Tasks ↔ User Stories auto-linked via AC-IDs: `AC-US1-01` → `US-001`
|
|
|
257
270
|
Task format: `**AC**: AC-US1-01, AC-US1-02` (CRITICAL for linking)
|
|
258
271
|
<!-- SW:END:linking -->
|
|
259
272
|
|
|
260
|
-
<!-- SW:SECTION:mcp version="1.0.
|
|
273
|
+
<!-- SW:SECTION:mcp version="1.0.259" -->
|
|
261
274
|
## External Services
|
|
262
275
|
|
|
263
276
|
CLI tools first (`gh`, `wrangler`, `supabase`) → MCP for complex integrations.
|
|
264
277
|
<!-- SW:END:mcp -->
|
|
265
278
|
|
|
266
|
-
<!-- SW:SECTION:auto version="1.0.
|
|
279
|
+
<!-- SW:SECTION:auto version="1.0.259" -->
|
|
267
280
|
## Auto Mode
|
|
268
281
|
|
|
269
|
-
`/sw:auto` (start) | `/sw:auto-status` (check) | `/sw:cancel-auto` (emergency)
|
|
282
|
+
`/sw:auto` (start) | `/sw:auto-status` (check) | `/sw:cancel-auto` (emergency)
|
|
283
|
+
|
|
284
|
+
Pattern: IMPLEMENT → TEST → FAIL? → FIX → PASS → NEXT. STOP & ASK if spec conflicts or ambiguity.
|
|
270
285
|
<!-- SW:END:auto -->
|
|
271
286
|
|
|
272
|
-
<!-- SW:SECTION:docs version="1.0.
|
|
287
|
+
<!-- SW:SECTION:docs version="1.0.259" -->
|
|
273
288
|
## Docs
|
|
274
289
|
|
|
275
290
|
[spec-weave.com](https://spec-weave.com)
|
package/README.md
CHANGED
|
@@ -153,6 +153,36 @@ SpecWeave is built for the reality of enterprise development.
|
|
|
153
153
|
|
|
154
154
|
---
|
|
155
155
|
|
|
156
|
+
## LSP Code Intelligence
|
|
157
|
+
|
|
158
|
+
AI agents waste tokens on grep — slow, noisy, full of false positives. SpecWeave ships with **LSP integration** that gives agents semantic understanding of your codebase.
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
Grep (text search) LSP (semantic)
|
|
162
|
+
────────────────── ──────────────
|
|
163
|
+
Speed: 69ms 0.35ms (198x faster)
|
|
164
|
+
"read" symbol: 254 matches 32 references
|
|
165
|
+
False positives: 222 noise results 0
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Grep matches `read`, `readFile`, `readFileSync`, `readdir`, and every comment containing "read". LSP resolves the actual `MetadataManager.read()` calls — nothing else.
|
|
169
|
+
|
|
170
|
+

|
|
171
|
+
|
|
172
|
+
**Supported languages:** TypeScript, Python, Go, Rust, Java, C#
|
|
173
|
+
|
|
174
|
+
**How it works:** SpecWeave starts a language server alongside your agent session. Every "find references", "go to definition", and "show type" query goes through the LSP instead of grep — 198x faster with zero false positives.
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
specweave lsp refs src/core/metadata.ts read # Semantic references
|
|
178
|
+
specweave lsp def src/cli/commands/init.ts init # Go to definition
|
|
179
|
+
specweave lsp hover src/core/config.ts Config # Type information
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**[LSP documentation](https://spec-weave.com/docs/guides/lsp-code-intelligence)**
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
156
186
|
## Extensible Skills (Open/Closed Principle)
|
|
157
187
|
|
|
158
188
|
**Customize any skill without forking.**
|
|
@@ -248,6 +278,7 @@ When you close an increment, external tools update automatically.
|
|
|
248
278
|
| **Enterprise compliance** | SOC 2, HIPAA, FDA audit trails | No | No |
|
|
249
279
|
| **External sync** | GitHub / JIRA / ADO bidirectional | No | No |
|
|
250
280
|
| **Brownfield support** | Analyzer + migration patterns | No | No |
|
|
281
|
+
| **LSP code intelligence** | 198x faster, semantic accuracy | No | No |
|
|
251
282
|
| **Specialized skills** | 100+ (PM, QA, DevOps, ML...) | 21 agents | None |
|
|
252
283
|
| **Spec/plan/tasks workflow** | Yes | Yes | Yes |
|
|
253
284
|
| **Agent-agnostic** | Claude Code + OpenClaw + Copilot + Codex | Multi-IDE | Multi-IDE |
|
package/bin/specweave.js
CHANGED
|
@@ -300,6 +300,23 @@ program
|
|
|
300
300
|
await completeCommand(incrementId, options);
|
|
301
301
|
});
|
|
302
302
|
|
|
303
|
+
// Create Increment command - Create template files for a new increment
|
|
304
|
+
program
|
|
305
|
+
.command('create-increment')
|
|
306
|
+
.description('Create increment template files (metadata.json, spec.md, plan.md, tasks.md)')
|
|
307
|
+
.requiredOption('--id <increment-id>', 'Increment ID (e.g., "0042-my-feature")')
|
|
308
|
+
.requiredOption('--title <title>', 'Feature title')
|
|
309
|
+
.requiredOption('--description <description>', 'Feature description')
|
|
310
|
+
.requiredOption('--project <project-id>', 'Project ID from specweave context projects')
|
|
311
|
+
.option('--board <board-id>', 'Board ID for 2-level structures')
|
|
312
|
+
.option('--type <type>', 'Increment type (feature, hotfix, bug, refactor, experiment)', 'feature')
|
|
313
|
+
.option('--priority <priority>', 'Priority (P1, P2, P3)', 'P1')
|
|
314
|
+
.option('--json', 'Output result as JSON (for programmatic use)')
|
|
315
|
+
.action(async (options) => {
|
|
316
|
+
const { createIncrementCommand } = await import('../dist/src/cli/commands/create-increment.js');
|
|
317
|
+
await createIncrementCommand(options);
|
|
318
|
+
});
|
|
319
|
+
|
|
303
320
|
// Archive command - Archive completed increments and sync living docs
|
|
304
321
|
program
|
|
305
322
|
.command('archive [increments...]')
|
|
@@ -1291,6 +1308,17 @@ async function checkForDuplicates() {
|
|
|
1291
1308
|
}
|
|
1292
1309
|
}
|
|
1293
1310
|
|
|
1311
|
+
// Dashboard command - Real-time observability dashboard
|
|
1312
|
+
program
|
|
1313
|
+
.command('dashboard')
|
|
1314
|
+
.description('Launch real-time observability dashboard in browser')
|
|
1315
|
+
.option('-p, --port <number>', 'Port number (default: 3456)')
|
|
1316
|
+
.option('--no-browser', 'Do not open browser automatically')
|
|
1317
|
+
.action(async (options) => {
|
|
1318
|
+
const { dashboardCommand } = await import('../dist/src/cli/commands/dashboard.js');
|
|
1319
|
+
await dashboardCommand(options);
|
|
1320
|
+
});
|
|
1321
|
+
|
|
1294
1322
|
// Run startup check, then parse arguments
|
|
1295
1323
|
(async () => {
|
|
1296
1324
|
await checkForDuplicates();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@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-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-tracking: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-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@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;--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@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%;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]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-0\.5{top:calc(var(--spacing)*.5)}.left-0\.5{left:calc(var(--spacing)*.5)}.left-\[18px\]{left:18px}.my-2{margin-block:calc(var(--spacing)*2)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.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)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-7{margin-left:calc(var(--spacing)*7)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-24{height:calc(var(--spacing)*24)}.h-64{height:calc(var(--spacing)*64)}.h-\[18px\]{height:18px}.h-full{height:100%}.h-screen{height:100vh}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-\[500px\]{max-height:500px}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-2{width:calc(var(--spacing)*2)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-24{width:calc(var(--spacing)*24)}.w-28{width:calc(var(--spacing)*28)}.w-48{width:calc(var(--spacing)*48)}.w-56{width:calc(var(--spacing)*56)}.w-full{width:100%}.w-px{width:1px}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[200px\]{max-width:200px}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[18px\]{min-width:18px}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.-rotate-90{rotate:-90deg}.rotate-180{rotate:180deg}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-800\/50>:not(:last-child)){border-color:#1e293980}@supports (color:color-mix(in lab,red,red)){:where(.divide-gray-800\/50>:not(:last-child)){border-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/50{border-color:color-mix(in oklab,var(--color-amber-500)50%,transparent)}}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/20{border-color:color-mix(in oklab,var(--color-cyan-500)20%,transparent)}}.border-emerald-500{border-color:var(--color-emerald-500)}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500)30%,transparent)}}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-800\/50{border-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.border-gray-800\/50{border-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.border-indigo-500{border-color:var(--color-indigo-500)}.border-indigo-500\/20{border-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/20{border-color:color-mix(in oklab,var(--color-indigo-500)20%,transparent)}}.border-indigo-500\/30{border-color:#625fff4d}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/30{border-color:color-mix(in oklab,var(--color-indigo-500)30%,transparent)}}.border-rose-500\/20{border-color:#ff235733}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/20{border-color:color-mix(in oklab,var(--color-rose-500)20%,transparent)}}.border-rose-500\/30{border-color:#ff23574d}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/30{border-color:color-mix(in oklab,var(--color-rose-500)30%,transparent)}}.border-rose-500\/50{border-color:#ff235780}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/50{border-color:color-mix(in oklab,var(--color-rose-500)50%,transparent)}}.border-l-amber-500{border-left-color:var(--color-amber-500)}.border-l-blue-500{border-left-color:var(--color-blue-500)}.border-l-rose-500{border-left-color:var(--color-rose-500)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500)15%,transparent)}}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500)10%,transparent)}}.bg-cyan-500\/15{background-color:#00b7d726}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/15{background-color:color-mix(in oklab,var(--color-cyan-500)15%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500)15%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.bg-emerald-500\/60{background-color:#00bb7f99}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/60{background-color:color-mix(in oklab,var(--color-emerald-500)60%,transparent)}}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-500\/10{background-color:#6a72821a}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/10{background-color:color-mix(in oklab,var(--color-gray-500)10%,transparent)}}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/10{background-color:color-mix(in oklab,var(--color-indigo-500)10%,transparent)}}.bg-indigo-500\/20{background-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/20{background-color:color-mix(in oklab,var(--color-indigo-500)20%,transparent)}}.bg-indigo-500\/40{background-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/40{background-color:color-mix(in oklab,var(--color-indigo-500)40%,transparent)}}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-rose-400{background-color:var(--color-rose-400)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-500\/10{background-color:#ff23571a}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/10{background-color:color-mix(in oklab,var(--color-rose-500)10%,transparent)}}.bg-rose-500\/15{background-color:#ff235726}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/15{background-color:color-mix(in oklab,var(--color-rose-500)15%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-amber-500\/10{--tw-gradient-from:#f99c001a}@supports (color:color-mix(in lab,red,red)){.from-amber-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.from-amber-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-cyan-500)10%,transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-emerald-500\/10{--tw-gradient-from:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.from-emerald-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-emerald-500)10%,transparent)}}.from-emerald-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:#625fff1a}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-indigo-500)10%,transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-rose-500\/10{--tw-gradient-from:#ff23571a}@supports (color:color-mix(in lab,red,red)){.from-rose-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-rose-500)10%,transparent)}}.from-rose-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-amber-500\/5{--tw-gradient-to:#f99c000d}@supports (color:color-mix(in lab,red,red)){.to-amber-500\/5{--tw-gradient-to:color-mix(in oklab,var(--color-amber-500)5%,transparent)}}.to-amber-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-cyan-500\/5{--tw-gradient-to:#00b7d70d}@supports (color:color-mix(in lab,red,red)){.to-cyan-500\/5{--tw-gradient-to:color-mix(in oklab,var(--color-cyan-500)5%,transparent)}}.to-cyan-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-emerald-500\/5{--tw-gradient-to:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.to-emerald-500\/5{--tw-gradient-to:color-mix(in oklab,var(--color-emerald-500)5%,transparent)}}.to-emerald-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-500\/5{--tw-gradient-to:#625fff0d}@supports (color:color-mix(in lab,red,red)){.to-indigo-500\/5{--tw-gradient-to:color-mix(in oklab,var(--color-indigo-500)5%,transparent)}}.to-indigo-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-rose-500\/5{--tw-gradient-to:#ff23570d}@supports (color:color-mix(in lab,red,red)){.to-rose-500\/5{--tw-gradient-to:color-mix(in oklab,var(--color-rose-500)5%,transparent)}}.to-rose-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-5{padding-block:calc(var(--spacing)*5)}.py-16{padding-block:calc(var(--spacing)*16)}.pt-4{padding-top:calc(var(--spacing)*4)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.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-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.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-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.text-amber-400{color:var(--color-amber-400)}.text-blue-400{color:var(--color-blue-400)}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-indigo-400{color:var(--color-indigo-400)}.text-rose-400{color:var(--color-rose-400)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.line-through{text-decoration-line:line-through}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-25{opacity:.25}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.ring-1{--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)}.ring-amber-500\/50{--tw-ring-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.ring-amber-500\/50{--tw-ring-color:color-mix(in oklab,var(--color-amber-500)50%,transparent)}}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-500{--tw-duration:.5s;transition-duration:.5s}@media(hover:hover){.group-hover\:text-gray-400:is(:where(.group):hover *){color:var(--color-gray-400)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-gray-800\/20:hover{background-color:#1e293933}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/20:hover{background-color:color-mix(in oklab,var(--color-gray-800)20%,transparent)}}.hover\:bg-gray-800\/30:hover{background-color:#1e29394d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/30:hover{background-color:color-mix(in oklab,var(--color-gray-800)30%,transparent)}}.hover\:bg-indigo-500:hover{background-color:var(--color-indigo-500)}.hover\:bg-indigo-500\/60:hover{background-color:#625fff99}@supports (color:color-mix(in lab,red,red)){.hover\:bg-indigo-500\/60:hover{background-color:color-mix(in oklab,var(--color-indigo-500)60%,transparent)}}.hover\:text-emerald-300:hover{color:var(--color-emerald-300)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-gray-300:hover{color:var(--color-gray-300)}.hover\:text-indigo-300:hover{color:var(--color-indigo-300)}.hover\:text-rose-300:hover{color:var(--color-rose-300)}.hover\:text-white:hover{color:var(--color-white)}}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#374151;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#4b5563}@keyframes slideIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.animate-slide-in{animation:.2s ease-out slideIn}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.4}}.animate-pulse-dot{animation:2s ease-in-out infinite pulse-dot}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
|