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.
Files changed (134) hide show
  1. package/CLAUDE.md +68 -53
  2. package/README.md +31 -0
  3. package/bin/specweave.js +28 -0
  4. package/dist/dashboard/assets/index-DdtF4K1G.css +1 -0
  5. package/dist/dashboard/assets/index-cZA6rz8s.js +11 -0
  6. package/dist/dashboard/index.html +14 -0
  7. package/dist/src/adapters/README.md +4 -4
  8. package/dist/src/adapters/agents-md-generator.d.ts.map +1 -1
  9. package/dist/src/adapters/agents-md-generator.js +0 -2
  10. package/dist/src/adapters/agents-md-generator.js.map +1 -1
  11. package/dist/src/adapters/claude/README.md +3 -3
  12. package/dist/src/adapters/claude/adapter.js +3 -3
  13. package/dist/src/adapters/claude-md-generator.js +1 -1
  14. package/dist/src/adapters/claude-md-generator.js.map +1 -1
  15. package/dist/src/adapters/registry.yaml +1 -1
  16. package/dist/src/cli/commands/create-increment.d.ts +24 -0
  17. package/dist/src/cli/commands/create-increment.d.ts.map +1 -0
  18. package/dist/src/cli/commands/create-increment.js +53 -0
  19. package/dist/src/cli/commands/create-increment.js.map +1 -0
  20. package/dist/src/cli/commands/dashboard.d.ts +18 -0
  21. package/dist/src/cli/commands/dashboard.d.ts.map +1 -0
  22. package/dist/src/cli/commands/dashboard.js +142 -0
  23. package/dist/src/cli/commands/dashboard.js.map +1 -0
  24. package/dist/src/cli/commands/init.d.ts.map +1 -1
  25. package/dist/src/cli/commands/init.js +48 -31
  26. package/dist/src/cli/commands/init.js.map +1 -1
  27. package/dist/src/cli/commands/update.d.ts.map +1 -1
  28. package/dist/src/cli/commands/update.js +36 -0
  29. package/dist/src/cli/commands/update.js.map +1 -1
  30. package/dist/src/cli/helpers/init/directory-structure.d.ts.map +1 -1
  31. package/dist/src/cli/helpers/init/directory-structure.js +13 -1
  32. package/dist/src/cli/helpers/init/directory-structure.js.map +1 -1
  33. package/dist/src/cli/helpers/init/summary-banner.d.ts +11 -0
  34. package/dist/src/cli/helpers/init/summary-banner.d.ts.map +1 -1
  35. package/dist/src/cli/helpers/init/summary-banner.js +49 -3
  36. package/dist/src/cli/helpers/init/summary-banner.js.map +1 -1
  37. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  38. package/dist/src/cli/helpers/issue-tracker/index.js +0 -1
  39. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  40. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts.map +1 -1
  41. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js +6 -2
  42. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js.map +1 -1
  43. package/dist/src/core/config/types.d.ts +24 -1
  44. package/dist/src/core/config/types.d.ts.map +1 -1
  45. package/dist/src/core/config/types.js +6 -1
  46. package/dist/src/core/config/types.js.map +1 -1
  47. package/dist/src/core/doctor/checkers/project-structure-checker.d.ts +1 -0
  48. package/dist/src/core/doctor/checkers/project-structure-checker.d.ts.map +1 -1
  49. package/dist/src/core/doctor/checkers/project-structure-checker.js +53 -3
  50. package/dist/src/core/doctor/checkers/project-structure-checker.js.map +1 -1
  51. package/dist/src/core/fabric/security-scanner.d.ts.map +1 -1
  52. package/dist/src/core/fabric/security-scanner.js +70 -9
  53. package/dist/src/core/fabric/security-scanner.js.map +1 -1
  54. package/dist/src/core/increment/increment-utils.d.ts +6 -0
  55. package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
  56. package/dist/src/core/increment/increment-utils.js +5 -0
  57. package/dist/src/core/increment/increment-utils.js.map +1 -1
  58. package/dist/src/core/lazy-loading/llm-plugin-detector.d.ts +9 -4
  59. package/dist/src/core/lazy-loading/llm-plugin-detector.d.ts.map +1 -1
  60. package/dist/src/core/lazy-loading/llm-plugin-detector.js +9 -4
  61. package/dist/src/core/lazy-loading/llm-plugin-detector.js.map +1 -1
  62. package/dist/src/core/living-docs/discovery.d.ts +2 -0
  63. package/dist/src/core/living-docs/discovery.d.ts.map +1 -1
  64. package/dist/src/core/living-docs/discovery.js +91 -17
  65. package/dist/src/core/living-docs/discovery.js.map +1 -1
  66. package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts +5 -0
  67. package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts.map +1 -1
  68. package/dist/src/core/living-docs/intelligent-analyzer/index.js +3 -3
  69. package/dist/src/core/living-docs/intelligent-analyzer/index.js.map +1 -1
  70. package/dist/src/core/living-docs/lsp-bootstrapper.d.ts +64 -0
  71. package/dist/src/core/living-docs/lsp-bootstrapper.d.ts.map +1 -0
  72. package/dist/src/core/living-docs/lsp-bootstrapper.js +118 -0
  73. package/dist/src/core/living-docs/lsp-bootstrapper.js.map +1 -0
  74. package/dist/src/dashboard/server/command-runner.d.ts +21 -0
  75. package/dist/src/dashboard/server/command-runner.d.ts.map +1 -0
  76. package/dist/src/dashboard/server/command-runner.js +92 -0
  77. package/dist/src/dashboard/server/command-runner.js.map +1 -0
  78. package/dist/src/dashboard/server/dashboard-server.d.ts +33 -0
  79. package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -0
  80. package/dist/src/dashboard/server/dashboard-server.js +812 -0
  81. package/dist/src/dashboard/server/dashboard-server.js.map +1 -0
  82. package/dist/src/dashboard/server/data/activity-stream.d.ts +27 -0
  83. package/dist/src/dashboard/server/data/activity-stream.d.ts.map +1 -0
  84. package/dist/src/dashboard/server/data/activity-stream.js +142 -0
  85. package/dist/src/dashboard/server/data/activity-stream.js.map +1 -0
  86. package/dist/src/dashboard/server/data/claude-log-parser.d.ts +34 -0
  87. package/dist/src/dashboard/server/data/claude-log-parser.d.ts.map +1 -0
  88. package/dist/src/dashboard/server/data/claude-log-parser.js +218 -0
  89. package/dist/src/dashboard/server/data/claude-log-parser.js.map +1 -0
  90. package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts +35 -0
  91. package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts.map +1 -0
  92. package/dist/src/dashboard/server/data/dashboard-data-aggregator.js +219 -0
  93. package/dist/src/dashboard/server/data/dashboard-data-aggregator.js.map +1 -0
  94. package/dist/src/dashboard/server/data/plugin-scanner.d.ts +35 -0
  95. package/dist/src/dashboard/server/data/plugin-scanner.d.ts.map +1 -0
  96. package/dist/src/dashboard/server/data/plugin-scanner.js +96 -0
  97. package/dist/src/dashboard/server/data/plugin-scanner.js.map +1 -0
  98. package/dist/src/dashboard/server/data/sync-audit-reader.d.ts +38 -0
  99. package/dist/src/dashboard/server/data/sync-audit-reader.d.ts.map +1 -0
  100. package/dist/src/dashboard/server/data/sync-audit-reader.js +94 -0
  101. package/dist/src/dashboard/server/data/sync-audit-reader.js.map +1 -0
  102. package/dist/src/dashboard/server/file-watcher.d.ts +19 -0
  103. package/dist/src/dashboard/server/file-watcher.d.ts.map +1 -0
  104. package/dist/src/dashboard/server/file-watcher.js +104 -0
  105. package/dist/src/dashboard/server/file-watcher.js.map +1 -0
  106. package/dist/src/dashboard/server/router.d.ts +16 -0
  107. package/dist/src/dashboard/server/router.d.ts.map +1 -0
  108. package/dist/src/dashboard/server/router.js +110 -0
  109. package/dist/src/dashboard/server/router.js.map +1 -0
  110. package/dist/src/dashboard/server/sse-manager.d.ts +25 -0
  111. package/dist/src/dashboard/server/sse-manager.d.ts.map +1 -0
  112. package/dist/src/dashboard/server/sse-manager.js +75 -0
  113. package/dist/src/dashboard/server/sse-manager.js.map +1 -0
  114. package/dist/src/dashboard/types.d.ts +183 -0
  115. package/dist/src/dashboard/types.d.ts.map +1 -0
  116. package/dist/src/dashboard/types.js +2 -0
  117. package/dist/src/dashboard/types.js.map +1 -0
  118. package/package.json +12 -2
  119. package/plugins/specweave/PLUGIN.md +0 -3
  120. package/plugins/specweave/commands/living-docs.md +0 -2
  121. package/plugins/specweave/hooks/user-prompt-submit.sh +157 -153
  122. package/plugins/specweave/lib/hooks/sync-living-docs.js +4 -2
  123. package/plugins/specweave/scripts/skill-context.sh +22 -7
  124. package/plugins/specweave/skills/archive-increments/SKILL.md +13 -3
  125. package/plugins/specweave/skills/do/SKILL.md +31 -1
  126. package/plugins/specweave/skills/docs/SKILL.md +62 -44
  127. package/plugins/specweave/skills/increment/SKILL.md +2 -2
  128. package/plugins/specweave/skills/increment-planner/SKILL.md +35 -3
  129. package/plugins/specweave/skills/increment-work-router/SKILL.md +37 -9
  130. package/plugins/specweave/skills/jobs/SKILL.md +52 -0
  131. package/src/templates/config.json.template +5 -1
  132. package/plugins/specweave/commands/brownfield-analyzer.md +0 -408
  133. package/plugins/specweave/commands/brownfield-onboarder.md +0 -837
  134. 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.256" sections="header,start,autodetect,metarule,rules,workflow,reflect,context,structure,taskformat,secrets,syncing,testing,tdd,api,limits,troubleshooting,lazyloading,principles,linking,mcp,auto,docs" -->
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.256" -->
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:start version="1.0.256" -->
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.256" -->
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.256" -->
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
- node script.js → Error → npm run build
85
- npm run build → node script.js → Success
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.256" -->
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. **⛔ Initialization guard**: `.specweave/` folders MUST ONLY exist where `specweave init` was run
100
- 6. **⛔ Marketplace refresh**: Use `specweave refresh-marketplace` CLI (not `scripts/refresh-marketplace.sh`)
101
- 7. **⛔ Numbered folder collisions**: Before creating `docs/NN-*` folders, CHECK existing prefixes:
102
- ```bash
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.256" -->
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` | ⚠️ EMERGENCY ONLY manual cancel |
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.256" -->
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.256" -->
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.256" -->
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
- **⛔ Increment root**: ONLY `metadata.json`, `spec.md`, `plan.md`, `tasks.md`
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.256" -->
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.257" -->
205
+ <!-- SW:SECTION:secrets version="1.0.259" -->
191
206
  ## Secrets
192
207
 
193
- Check credentials exist before CLI tools (`grep -q`, never display values). NEVER `grep TOKEN .env` without `-q`.
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.257" -->
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.257" -->
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.257" -->
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). Tasks use `[RED]`/`[GREEN]`/`[REFACTOR]` markers with dependencies.
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.257" -->
215
- <!-- API docs: use /sw:api-docs when apiDocs.enabled in config -->
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.256" -->
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.257" -->
239
+ <!-- SW:SECTION:troubleshooting version="1.0.259" -->
225
240
  ## Troubleshooting
226
241
 
227
- Skills missing → restart Claude Code | Plugins outdated → `specweave refresh-marketplace` | Stuck → `rm -f .specweave/state/*.lock` + restart
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.257" -->
231
- ## Plugins
250
+ <!-- SW:SECTION:lazyloading version="1.0.259" -->
251
+ ## Plugin Auto-Loading
232
252
 
233
- Auto-loaded by project type. Manual: `claude plugin install sw-frontend@specweave`. Disable: `SPECWEAVE_DISABLE_AUTO_LOAD=1`.
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" -->
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. **Incremental**: Small, validated increments
243
- 4. **Traceable**: All work specs → ACs
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.256" -->
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.257" -->
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.257" -->
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). Pattern: IMPLEMENT→TEST→FIX→NEXT. STOP & ASK if spec conflicts or ambiguous requirements.
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.256" -->
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
+ ![LSP Benchmark Results](docs/assets/lsp-benchmark.png)
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)}}