sillyspec 3.9.0 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +17 -0
  2. package/.claude/skills/sillyspec-auto/SKILL.md +78 -0
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +17 -0
  4. package/{templates/commit.md → .claude/skills/sillyspec-commit/SKILL.md} +32 -47
  5. package/.claude/skills/sillyspec-continue/SKILL.md +45 -0
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +27 -0
  7. package/.claude/skills/sillyspec-execute/SKILL.md +17 -0
  8. package/.claude/skills/sillyspec-explore/SKILL.md +105 -0
  9. package/.claude/skills/sillyspec-export/SKILL.md +53 -0
  10. package/.claude/skills/sillyspec-init/SKILL.md +170 -0
  11. package/.claude/skills/sillyspec-plan/SKILL.md +17 -0
  12. package/.claude/skills/sillyspec-propose/SKILL.md +17 -0
  13. package/.claude/skills/sillyspec-quick/SKILL.md +17 -0
  14. package/.claude/skills/sillyspec-resume/SKILL.md +111 -0
  15. package/.claude/skills/sillyspec-scan/SKILL.md +17 -0
  16. package/.claude/skills/sillyspec-state/SKILL.md +54 -0
  17. package/.claude/skills/sillyspec-status/SKILL.md +17 -0
  18. package/.claude/skills/sillyspec-verify/SKILL.md +17 -0
  19. package/.claude/skills/sillyspec-workspace/SKILL.md +149 -0
  20. package/README.md +19 -11
  21. package/SKILL.md +15 -10
  22. package/package.json +7 -9
  23. package/packages/dashboard/dist/assets/index-BcM2J-hv.css +1 -0
  24. package/packages/dashboard/dist/assets/index-DpLHK4jv.js +7446 -0
  25. package/packages/dashboard/dist/index.html +16 -16
  26. package/packages/dashboard/dist/prototype-dashboard.html +836 -0
  27. package/packages/dashboard/dist/prototype-overview.html +256 -0
  28. package/packages/dashboard/package-lock.json +226 -6
  29. package/packages/dashboard/package.json +8 -5
  30. package/packages/dashboard/public/logo.jpg +0 -0
  31. package/packages/dashboard/public/prototype-dashboard.html +836 -0
  32. package/packages/dashboard/public/prototype-overview.html +256 -0
  33. package/packages/dashboard/server/executor.js +1 -1
  34. package/packages/dashboard/server/index.js +341 -113
  35. package/packages/dashboard/server/parser.js +442 -30
  36. package/packages/dashboard/server/watcher.js +214 -134
  37. package/packages/dashboard/src/App.vue +475 -71
  38. package/packages/dashboard/src/components/ActionBar.vue +36 -43
  39. package/packages/dashboard/src/components/CommandPalette.vue +45 -66
  40. package/packages/dashboard/src/components/DetailPanel.vue +68 -53
  41. package/packages/dashboard/src/components/DocPreview.vue +257 -0
  42. package/packages/dashboard/src/components/DocTree.vue +114 -0
  43. package/packages/dashboard/src/components/HResizeHandle.vue +48 -0
  44. package/packages/dashboard/src/components/LogStream.vue +13 -33
  45. package/packages/dashboard/src/components/PipelineStage.vue +8 -8
  46. package/packages/dashboard/src/components/PipelineView.vue +99 -45
  47. package/packages/dashboard/src/components/ProjectCard.vue +187 -0
  48. package/packages/dashboard/src/components/ProjectList.vue +103 -45
  49. package/packages/dashboard/src/components/ProjectOverview.vue +152 -0
  50. package/packages/dashboard/src/components/StageBadge.vue +13 -13
  51. package/packages/dashboard/src/components/StepCard.vue +15 -15
  52. package/packages/dashboard/src/components/VResizeHandle.vue +61 -0
  53. package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -0
  54. package/packages/dashboard/src/components/detail/GitDetail.vue +61 -0
  55. package/packages/dashboard/src/components/detail/TechDetail.vue +43 -0
  56. package/packages/dashboard/src/composables/useDashboard.js +48 -6
  57. package/packages/dashboard/src/composables/useKeyboard.js +6 -4
  58. package/packages/dashboard/src/composables/useLayout.js +131 -0
  59. package/packages/dashboard/src/main.js +4 -1
  60. package/packages/dashboard/src/style.css +17 -17
  61. package/src/index.js +141 -22
  62. package/src/init.js +93 -231
  63. package/src/migrate.js +117 -0
  64. package/src/progress.js +460 -0
  65. package/src/run.js +635 -0
  66. package/src/setup.js +2 -72
  67. package/src/stages/archive.js +54 -0
  68. package/src/stages/brainstorm.js +264 -0
  69. package/src/stages/doctor.js +303 -0
  70. package/src/stages/execute.js +287 -0
  71. package/src/stages/explore.js +34 -0
  72. package/src/stages/index.js +28 -0
  73. package/src/stages/plan.js +354 -0
  74. package/src/stages/propose.js +115 -0
  75. package/src/stages/quick.js +64 -0
  76. package/src/stages/scan.js +141 -0
  77. package/src/stages/status.js +65 -0
  78. package/src/stages/verify.js +135 -0
  79. package/.sillyspec/changes/dashboard/design.md +0 -219
  80. package/.sillyspec/plans/2026-04-05-dashboard.md +0 -737
  81. package/.sillyspec/specs/2026-04-05-dashboard-design.md +0 -206
  82. package/dist/steps/brainstorm/01-load-context.md +0 -30
  83. package/dist/steps/brainstorm/02-reuse-check.md +0 -6
  84. package/dist/steps/brainstorm/03-prototype-analysis.md +0 -11
  85. package/dist/steps/brainstorm/04-module-split.md +0 -23
  86. package/dist/steps/brainstorm/05-dialog-explore.md +0 -8
  87. package/dist/steps/brainstorm/06-propose-approaches.md +0 -3
  88. package/dist/steps/brainstorm/07-present-design.md +0 -3
  89. package/dist/steps/brainstorm/08-write-design.md +0 -21
  90. package/dist/steps/brainstorm/09-self-review.md +0 -15
  91. package/dist/steps/brainstorm/10-user-confirm.md +0 -3
  92. package/dist/steps/brainstorm/11-output-spec.md +0 -7
  93. package/dist/steps/brainstorm/manifest.yaml +0 -26
  94. package/dist/steps/execute/01-load-context.md +0 -41
  95. package/dist/steps/execute/02-scan-conventions.md +0 -47
  96. package/dist/steps/execute/03-skill-mcp.md +0 -19
  97. package/dist/steps/execute/04-assign-task.md +0 -22
  98. package/dist/steps/execute/04b-prompt-template.md +0 -54
  99. package/dist/steps/execute/05-write-test.md +0 -7
  100. package/dist/steps/execute/06-write-code.md +0 -8
  101. package/dist/steps/execute/07-run-test.md +0 -26
  102. package/dist/steps/execute/08-fix-issues.md +0 -28
  103. package/dist/steps/execute/09-next-task.md +0 -33
  104. package/dist/steps/execute/manifest.yaml +0 -28
  105. package/dist/steps/plan/01-load-context.md +0 -22
  106. package/dist/steps/plan/02-anchor-confirm.md +0 -1
  107. package/dist/steps/plan/03-expand-tasks.md +0 -33
  108. package/dist/steps/plan/04-mark-order.md +0 -15
  109. package/dist/steps/plan/05-e2e-planning.md +0 -17
  110. package/dist/steps/plan/06-self-check.md +0 -16
  111. package/dist/steps/plan/07-save.md +0 -1
  112. package/dist/steps/plan/manifest.yaml +0 -18
  113. package/dist/steps/scan/01-env-detect.md +0 -51
  114. package/dist/steps/scan/02-tech-stack.md +0 -16
  115. package/dist/steps/scan/03-conventions.md +0 -16
  116. package/dist/steps/scan/04-structure.md +0 -19
  117. package/dist/steps/scan/05-quality.md +0 -18
  118. package/dist/steps/scan/06-complete.md +0 -49
  119. package/dist/steps/scan/manifest.yaml +0 -16
  120. package/dist/steps/verify/01-load-specs.md +0 -28
  121. package/dist/steps/verify/02-check-tasks.md +0 -1
  122. package/dist/steps/verify/03-check-design.md +0 -6
  123. package/dist/steps/verify/04-run-tests.md +0 -7
  124. package/dist/steps/verify/05-e2e-tests.md +0 -27
  125. package/dist/steps/verify/05b-e2e-fix.md +0 -33
  126. package/dist/steps/verify/06-code-quality.md +0 -25
  127. package/dist/steps/verify/07-lint-check.md +0 -27
  128. package/dist/steps/verify/08-output-report.md +0 -14
  129. package/dist/steps/verify/manifest.yaml +0 -22
  130. package/docs/.vitepress/config.mts +0 -45
  131. package/docs/.vitepress/dist/404.html +0 -25
  132. package/docs/.vitepress/dist/assets/app.YytxICdd.js +0 -1
  133. package/docs/.vitepress/dist/assets/chunks/framework.Czhw_PXq.js +0 -19
  134. package/docs/.vitepress/dist/assets/chunks/theme.DusTRZQk.js +0 -1
  135. package/docs/.vitepress/dist/assets/index.md.C3VCvtQA.js +0 -1
  136. package/docs/.vitepress/dist/assets/index.md.C3VCvtQA.lean.js +0 -1
  137. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  138. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  139. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  140. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  141. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  142. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  143. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  144. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  145. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  146. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  147. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  148. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  149. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  150. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  151. package/docs/.vitepress/dist/assets/sillyspec_commands.md.CXFFsj08.js +0 -15
  152. package/docs/.vitepress/dist/assets/sillyspec_commands.md.CXFFsj08.lean.js +0 -1
  153. package/docs/.vitepress/dist/assets/sillyspec_dashboard.md.BuPXHqjX.js +0 -4
  154. package/docs/.vitepress/dist/assets/sillyspec_dashboard.md.BuPXHqjX.lean.js +0 -1
  155. package/docs/.vitepress/dist/assets/sillyspec_file-io.md.Cz3x7llx.js +0 -1
  156. package/docs/.vitepress/dist/assets/sillyspec_file-io.md.Cz3x7llx.lean.js +0 -1
  157. package/docs/.vitepress/dist/assets/sillyspec_getting-started.md.ClcvV8k3.js +0 -4
  158. package/docs/.vitepress/dist/assets/sillyspec_getting-started.md.ClcvV8k3.lean.js +0 -1
  159. package/docs/.vitepress/dist/assets/sillyspec_install.md.CKuR2tiT.js +0 -5
  160. package/docs/.vitepress/dist/assets/sillyspec_install.md.CKuR2tiT.lean.js +0 -1
  161. package/docs/.vitepress/dist/assets/sillyspec_lifecycle.md.DY293cR1.js +0 -28
  162. package/docs/.vitepress/dist/assets/sillyspec_lifecycle.md.DY293cR1.lean.js +0 -1
  163. package/docs/.vitepress/dist/assets/sillyspec_structure.md.sVYS4zPs.js +0 -30
  164. package/docs/.vitepress/dist/assets/sillyspec_structure.md.sVYS4zPs.lean.js +0 -1
  165. package/docs/.vitepress/dist/assets/style.DFTx90Kk.css +0 -1
  166. package/docs/.vitepress/dist/hashmap.json +0 -1
  167. package/docs/.vitepress/dist/index.html +0 -28
  168. package/docs/.vitepress/dist/sillyspec/commands.html +0 -42
  169. package/docs/.vitepress/dist/sillyspec/dashboard.html +0 -31
  170. package/docs/.vitepress/dist/sillyspec/file-io.html +0 -28
  171. package/docs/.vitepress/dist/sillyspec/getting-started.html +0 -31
  172. package/docs/.vitepress/dist/sillyspec/install.html +0 -32
  173. package/docs/.vitepress/dist/sillyspec/lifecycle.html +0 -55
  174. package/docs/.vitepress/dist/sillyspec/structure.html +0 -57
  175. package/docs/.vitepress/dist/vp-icons.css +0 -1
  176. package/docs/index.md +0 -34
  177. package/docs/sillyspec/commands.md +0 -218
  178. package/docs/sillyspec/dashboard.md +0 -51
  179. package/docs/sillyspec/file-io.md +0 -34
  180. package/docs/sillyspec/getting-started.md +0 -61
  181. package/docs/sillyspec/install.md +0 -51
  182. package/docs/sillyspec/lifecycle.md +0 -146
  183. package/docs/sillyspec/structure.md +0 -62
  184. package/packages/dashboard/dist/assets/index-Bh-GPjKY.css +0 -1
  185. package/packages/dashboard/dist/assets/index-CrCn5Gg6.js +0 -17
  186. package/src/step.js +0 -543
  187. package/templates/archive.md +0 -120
  188. package/templates/brainstorm.md +0 -170
  189. package/templates/continue.md +0 -32
  190. package/templates/execute.md +0 -304
  191. package/templates/explore.md +0 -59
  192. package/templates/export.md +0 -21
  193. package/templates/init.md +0 -61
  194. package/templates/plan.md +0 -146
  195. package/templates/quick.md +0 -135
  196. package/templates/scan-quick.md +0 -49
  197. package/templates/scan.md +0 -156
  198. package/templates/skills/playwright-e2e/SKILL.md +0 -340
  199. package/templates/status.md +0 -75
  200. package/templates/verify.md +0 -236
  201. package/templates/workspace-sync.md +0 -99
  202. package/templates/workspace.md +0 -70
  203. /package/{docs/.vitepress/dist/logo.jpg → logo.jpg} +0 -0
  204. /package/{docs/.vitepress → packages/dashboard}/dist/favicon.jpg +0 -0
  205. /package/{docs/public → packages/dashboard/dist}/logo.jpg +0 -0
  206. /package/{docs → packages/dashboard}/public/favicon.jpg +0 -0
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: sillyspec:plan
3
+ description: 编写实现计划 — 2-5 分钟粒度,精确到文件路径和代码
4
+ ---
5
+
6
+ ## 执行
7
+
8
+ **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
9
+
10
+ 1. 运行 `sillyspec run plan` — 读取输出的步骤 prompt
11
+ 2. 按照输出的 prompt **严格执行**,不要跳过或自行添加步骤
12
+ 3. 步骤完成后,运行 `sillyspec run plan --done --output "你的摘要"`
13
+ 4. 重复 2-3 直到阶段完成
14
+ 5. **禁止**在没有运行 CLI 的情况下自行决定流程
15
+
16
+ ## 用户指令
17
+ $ARGUMENTS
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: sillyspec:propose
3
+ description: 生成结构化规范 — proposal + design + tasks
4
+ ---
5
+
6
+ ## 执行
7
+
8
+ **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
9
+
10
+ 1. 运行 `sillyspec run propose` — 读取输出的步骤 prompt
11
+ 2. 按照输出的 prompt **严格执行**,不要跳过或自行添加步骤
12
+ 3. 步骤完成后,运行 `sillyspec run propose --done --output "你的摘要"`
13
+ 4. 重复 2-3 直到阶段完成
14
+ 5. **禁止**在没有运行 CLI 的情况下自行决定流程
15
+
16
+ ## 用户指令
17
+ $ARGUMENTS
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: sillyspec:quick
3
+ description: 快速任务 — 跳过完整流程,直接做
4
+ ---
5
+
6
+ ## 执行
7
+
8
+ **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
9
+
10
+ 1. 运行 `sillyspec run quick` — 读取输出的步骤 prompt
11
+ 2. 按照输出的 prompt **严格执行**,不要跳过或自行添加步骤
12
+ 3. 步骤完成后,运行 `sillyspec run quick --done --output "你的摘要"`
13
+ 4. 重复 2-3 直到阶段完成
14
+ 5. **禁止**在没有运行 CLI 的情况下自行决定流程
15
+
16
+ ## 用户指令
17
+ $ARGUMENTS
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: sillyspec:resume
3
+ description: 恢复工作 — 从中断处继续
4
+ ---
5
+
6
+ ## 交互规范
7
+
8
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
9
+
10
+ 不要用编号列表让用户手动输入数字。
11
+ 如果需要自由输入,在 AskUserQuestion 的选项中加入"Other(自定义输入)"。
12
+
13
+ 你现在是 SillySpec 的恢复管理器。
14
+
15
+ ## 流程
16
+
17
+ ### 1. 读取 progress.json
18
+
19
+ ```bash
20
+ sillyspec progress show 2>/dev/null
21
+ ```
22
+
23
+ ### 2. 如果有 progress.json
24
+
25
+ 直接从 progress.json 中提取并展示:
26
+
27
+ > 🔄 工作状态恢复
28
+ >
29
+ > **当前变更**:<名称>
30
+ > **当前阶段**:<阶段名> <状态>
31
+ > **下一步**:<命令>
32
+ >
33
+ > **阶段进度**(大模块):
34
+ > | 阶段 | 状态 |
35
+ > |---|---|
36
+ > | stage-1 列表页 | ✅ |
37
+ > | stage-2 表单页 | 🔄 execute (2/6) |
38
+ > | stage-3 详情页 | ⬜ |
39
+ >
40
+ > **关键决策**:
41
+ > - xxx
42
+ >
43
+ > **下一步命令**:
44
+ > `/sillyspec:execute reward-punishment/stage-2`
45
+
46
+ **不需要执行 Git 操作或文件探测。** progress.json 已经包含所有信息。
47
+
48
+ 使用 `sillyspec progress show` 查看。
49
+
50
+ 然后问用户:
51
+ 1. 直接继续执行下一步
52
+ 2. 查看更多细节
53
+
54
+ ### 3. 如果没有 progress.json
55
+
56
+ **不要直接说"没有记录"。** 自动探测项目状态:
57
+
58
+ ```bash
59
+ # 检查主变更
60
+ ls .sillyspec/changes/*/MASTER.md 2>/dev/null
61
+
62
+ # 检查活跃变更
63
+ ls -d .sillyspec/changes/*/ | grep -v archive | grep -v stages | tail -1 2>/dev/null
64
+
65
+ # 检查子阶段
66
+ ls .sillyspec/changes/*/stages/*/proposal.md 2>/dev/null
67
+
68
+ # 检查代码库文档
69
+ ls .sillyspec/codebase/*.md 2>/dev/null
70
+
71
+ # 检查计划文件
72
+ ls -t .sillyspec/plans/*.md | head -1 2>/dev/null
73
+
74
+ # 检查需求/路线图
75
+ cat .sillyspec/REQUIREMENTS.md 2>/dev/null
76
+ cat .sillyspec/ROADMAP.md 2>/dev/null
77
+ ```
78
+
79
+ #### 如果检测到 MASTER.md(大模块)
80
+
81
+ 检查各阶段状态并输出阶段进度表(同步骤 2 格式)。
82
+
83
+ 同时**运行 `sillyspec progress init`**,将探测到的信息写入 progress.json,后续命令执行时会自动更新。
84
+
85
+ #### 如果是普通变更(无 MASTER.md)
86
+
87
+ 根据探测结果推断:
88
+
89
+ | 探测到的文件 | 推断阶段 | 建议操作 |
90
+ |---|---|---|
91
+ | 无任何 .sillyspec/ 内容 | 未开始 | `/sillyspec:init` 或 `/sillyspec:scan` |
92
+ | 有 SCAN-RAW.md 但缺失文档 | 扫描中断 | `/sillyspec:scan --deep`(断点续扫) |
93
+ | 有 codebase/ 但文档不全(快扫 3 份缺失) | 快扫中断 | `/sillyspec:scan`(补全缺失文档) |
94
+ | 有 codebase/ 7 份齐全但无 changes/ | 已扫描,未开始需求 | `/sillyspec:brainstorm "想法"` |
95
+ | 有 REQUIREMENTS.md 但无 changes/ | 绿地项目,已有需求 | `/sillyspec:brainstorm "想法"` |
96
+ | changes/ 下有 proposal,无 tasks | 已有规范,待计划 | `/sillyspec:plan` |
97
+ | changes/ 下有 tasks,有未完成 checkbox | 执行中 | `/sillyspec:execute` |
98
+ | tasks.md 全部完成 | 待验证 | `/sillyspec:verify` |
99
+
100
+ **扫描中断检测逻辑:**
101
+ - 有 `SCAN-RAW.md` → 说明深度扫描预处理已完成,检查 7 份文档缺哪些
102
+ - 有部分 codebase 文档(如只有 STACK 和 STRUCTURE)→ 说明快扫或深扫中断
103
+ - 缺失的文档列表直接展示给用户,告知 `/sillyspec:scan` 会自动跳过已存在的文档
104
+
105
+ **同时运行 `sillyspec progress init`** 记录推断的状态。
106
+
107
+ ### 4. 关键原则
108
+
109
+ - **不需要 HANDOFF.json**。progress.json 是唯一的恢复数据源。
110
+ - **progress.json 不需要 Git 提交**(已在 .runtime/ 下,被 .gitignore 忽略)。
111
+ - **每次命令执行完自动更新 progress.json**(通过 `sillyspec progress` CLI),不需要用户手动保存。
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: sillyspec:scan
3
+ description: 代码扫描 — 分析项目结构、约定和架构
4
+ ---
5
+
6
+ ## 执行
7
+
8
+ **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
9
+
10
+ 1. 运行 `sillyspec run scan` — 读取输出的步骤 prompt
11
+ 2. 按照输出的 prompt **严格执行**,不要跳过或自行添加步骤
12
+ 3. 步骤完成后,运行 `sillyspec run scan --done --output "你的摘要"`
13
+ 4. 重复 2-3 直到阶段完成
14
+ 5. **禁止**在没有运行 CLI 的情况下自行决定流程
15
+
16
+ ## 用户指令
17
+ $ARGUMENTS
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: sillyspec:state
3
+ description: 查看当前工作状态 — 显示 progress.json 内容
4
+ ---
5
+
6
+ 你现在是 SillySpec 的状态查看器。
7
+
8
+ ## 流程
9
+
10
+ ### 1. 读取 progress.json
11
+
12
+ ```bash
13
+ sillyspec progress show 2>/dev/null
14
+ ```
15
+
16
+ ### 2. 如果有 progress.json
17
+
18
+ 格式化展示当前状态:
19
+
20
+ > 📊 当前状态
21
+ >
22
+ > **变更**:<名称>
23
+ > **阶段**:<当前阶段>
24
+ > **进度**:<具体进度>
25
+ > **下一步**:<命令>
26
+ >
27
+ > **阶段进度**(大模块):
28
+ > (显示各阶段状态表)
29
+ >
30
+ > **关键决策**:
31
+ > - xxx
32
+ >
33
+ > **阻塞项**:
34
+ > - xxx(如无则省略)
35
+
36
+ ### 3. 如果没有 progress.json
37
+
38
+ 提示用户项目还没有开始,或 progress.json 尚未生成:
39
+
40
+ > 📊 还没有工作记录。
41
+ >
42
+ > 开始使用:
43
+ > - 新项目:`/sillyspec:init`
44
+ > - 已有项目:`/sillyspec:scan`
45
+ > - 恢复中断的工作:`/sillyspec:resume`
46
+ >
47
+ > progress.json 会在 `sillyspec init` 时自动创建。
48
+
49
+ ### 注意
50
+
51
+ - 这是只读命令,**不修改任何文件**
52
+ - `/sillyspec:status` 查看项目整体进度(change 文件级别)
53
+ - `/sillyspec:state` 查看当前工作状态(progress.json 级别)
54
+ - 两者互补:status 看"有什么",state 看"在做什么"
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: sillyspec:status
3
+ description: 查看项目进度和状态
4
+ ---
5
+
6
+ ## 执行
7
+
8
+ **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
9
+
10
+ 1. 运行 `sillyspec run status` — 读取输出的步骤 prompt
11
+ 2. 按照输出的 prompt **严格执行**,不要跳过或自行添加步骤
12
+ 3. 步骤完成后,运行 `sillyspec run status --done --output "你的摘要"`
13
+ 4. 重复 2-3 直到阶段完成
14
+ 5. **禁止**在没有运行 CLI 的情况下自行决定流程
15
+
16
+ ## 用户指令
17
+ $ARGUMENTS
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: sillyspec:verify
3
+ description: 验证实现 — 对照规范检查 + 测试套件
4
+ ---
5
+
6
+ ## 执行
7
+
8
+ **你必须使用 exec 工具(shell)执行以下命令,不要自己编造流程:**
9
+
10
+ 1. 运行 `sillyspec run verify` — 读取输出的步骤 prompt
11
+ 2. 按照输出的 prompt **严格执行**,不要跳过或自行添加步骤
12
+ 3. 步骤完成后,运行 `sillyspec run verify --done --output "你的摘要"`
13
+ 4. 重复 2-3 直到阶段完成
14
+ 5. **禁止**在没有运行 CLI 的情况下自行决定流程
15
+
16
+ ## 用户指令
17
+ $ARGUMENTS
@@ -0,0 +1,149 @@
1
+ ---
2
+ name: sillyspec:workspace
3
+ description: 工作区管理 — 初始化、管理多项目工作区,查看子项目状态
4
+ ---
5
+
6
+ ## 交互规范
7
+
8
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
9
+
10
+ 不要用编号列表让用户手动输入数字。
11
+ 如果需要自由输入,在 AskUserQuestion 的选项中加入"Other(自定义输入)"。
12
+
13
+ ---
14
+
15
+ 你现在是 SillySpec 的工作区管理器。
16
+
17
+ ## 用户指令
18
+ $ARGUMENTS
19
+
20
+ ## 核心流程
21
+
22
+ ### Step 1: 检查工作区配置
23
+
24
+ ```bash
25
+ ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q .
26
+ ```
27
+
28
+ 如果不存在 → 这是一个尚未配置工作区的项目。询问用户:
29
+ 1. 初始化工作区
30
+ 2. 跳过
31
+
32
+ ### Step 2: 解析指令
33
+
34
+ 根据 `$ARGUMENTS` 或默认行为:
35
+
36
+ - **无参数 / `status`** → 显示工作区状态
37
+ - **`add`** → 添加子项目
38
+ - **`remove`** → 移除子项目
39
+ - **`info`** → 显示某个子项目详情
40
+ - 无参数且 projects/*.yaml 不存在 → 初始化工作区
41
+
42
+ ### Step 3: 执行对应操作
43
+
44
+ #### 3a. 初始化工作区(projects/ 不存在时)
45
+
46
+ 1. 询问工作区名称(默认用当前目录名)
47
+ 2. 逐个添加子项目:
48
+ - 询问子项目名称(如 `frontend`、`backend`)
49
+ - 询问子项目路径(相对于工作区根目录,如 `./frontend`)
50
+ - 询问子项目角色描述(如 `前端 - Vue3 + TypeScript`)
51
+ - 询问仓库地址(可选)
52
+ - 验证路径存在
53
+ 添加完后询问:
54
+ > 1. 继续添加子项目
55
+ > 2. 完成,配置共享规范
56
+ 3. 询问共享规范文件
57
+ 4. 为每个子项目创建 `.sillyspec/projects/<name>.yaml`:
58
+ ```yaml
59
+ name: <name>
60
+ path: <relative-path>
61
+ status: active
62
+ role: <description>
63
+ repo: <repo-url> # 可选
64
+ ```
65
+ 5. 创建 `.sillyspec/shared/` 目录
66
+
67
+ #### 3b. 添加子项目(`add`)
68
+
69
+ 1. 询问名称、路径、角色
70
+ 2. 验证路径存在
71
+ 3. 创建/更新 `.sillyspec/projects/<name>.yaml`
72
+ 4. Git 提交
73
+
74
+ #### 3c. 移除子项目(`remove`)
75
+
76
+ 1. 显示当前所有子项目列表
77
+ 2. 询问要移除哪个:
78
+ > 1. (列出子项目名称)
79
+ > 2. 取消
80
+ 3. 删除 `.sillyspec/projects/<name>.yaml`
81
+ 4. Git 提交
82
+
83
+ #### 3d. 工作区状态(`status`,默认)
84
+
85
+ 读取所有 `projects/*.yaml`,对每个子项目检查:
86
+
87
+ ```bash
88
+ # 读取子项目列表
89
+ for f in .sillyspec/projects/*.yaml; do
90
+ [ -f "$f" ] || continue
91
+ proj_name=$(basename "$f" .yaml)
92
+ proj_path=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
93
+ proj_role=$(grep '^role:' "$f" | head -1 | sed 's/^role:[[:space:]]*//')
94
+ # 检查子项目状态
95
+ cd "$proj_path"
96
+ ls .sillyspec/ 2>/dev/null
97
+ cat .sillyspec/PROJECT.md 2>/dev/null
98
+ ls .sillyspec/docs/${proj_name}/scan/ 2>/dev/null | wc -l
99
+ cd -
100
+ done
101
+ ```
102
+
103
+ 输出格式:
104
+
105
+ ```
106
+ 🏢 工作区:<workspace-name>
107
+
108
+ 📦 子项目(N 个):
109
+ ✅ frontend ./frontend 前端 - Vue3 + TypeScript 已扫描(7 份文档)
110
+ ⚠️ backend ./backend 后端 - Node.js 已初始化(未扫描)
111
+ ❌ miniprogram ./miniprogram 小程序 - Taro 未初始化
112
+
113
+ 📄 共享规范:2 份
114
+ - api-contract.md
115
+ - data-models.md
116
+
117
+ 💡 操作:
118
+ /sillyspec:workspace add — 添加子项目
119
+ /sillyspec:workspace remove — 移除子项目
120
+ /sillyspec:init — 初始化子项目
121
+ /sillyspec:scan — 扫描子项目
122
+ ```
123
+
124
+ #### 3e. 子项目详情(`info <name>`)
125
+
126
+ 显示指定子项目的详细信息,包括 PROJECT.md、REQUIREMENTS.md 内容摘要、扫描文档列表。
127
+
128
+ ### Step 4: projects/*.yaml 格式
129
+
130
+ 每个子项目对应 `.sillyspec/projects/<name>.yaml`:
131
+
132
+ ```yaml
133
+ name: frontend
134
+ path: ./frontend
135
+ status: active
136
+ role: 前端 - Vue3 + TypeScript
137
+ repo: https://github.com/xxx/frontend.git # 可选
138
+ ```
139
+
140
+ ### 最后说:
141
+
142
+ > 工作区已更新。
143
+ > 下一步:对子项目运行 `/sillyspec:init` 或 `/sillyspec:scan`。
144
+
145
+ ## 绝对规则
146
+ - 不修改子项目目录下的任何文件
147
+ - projects/*.yaml 必须是合法 YAML
148
+ - 子项目路径必须是相对于工作区根目录的相对路径
149
+ - 路径必须验证存在性
package/README.md CHANGED
@@ -1,9 +1,15 @@
1
- # SillySpec v3.0 — 规范驱动开发工具包
1
+ <p align="center">
2
+ <img src="logo.jpg" width="80" />
3
+ </p>
4
+
5
+ # SillySpec v3.9 — 规范驱动开发工具包
2
6
 
3
7
  > 融合 Superpowers + OpenSpec + GSD,从"你说要啥"到"代码能跑"的完整流程。
4
8
  > Claude Code / Cursor / Codex / OpenCode / OpenClaw 都能用。
5
9
  >
6
10
  > 📖 **在线文档**:https://sillyspec.ppdmq.top/
11
+ >
12
+ > 💡 **核心理念:Code is Cheap, Context is Expensive.** 文档是核心资产,代码是文档的产物。没有文档就没有代码——文档是 AI 的记忆,是团队协作的基础,是后续维护的唯一依据。
7
13
 
8
14
  ## 安装
9
15
 
@@ -13,7 +19,7 @@
13
19
  npx sillyspec init
14
20
  ```
15
21
 
16
- > 📦 首次运行自动安装 CLI,之后 `sillyspec status`/`sillyspec next` 等命令也可直接使用。
22
+ > 📦 首次运行自动安装 CLI,之后 `sillyspec run brainstorm`/`sillyspec progress show` 等命令也可直接使用。
17
23
 
18
24
  **指定工具:**
19
25
  ```bash
@@ -36,10 +42,8 @@ npx sillyspec init --dir /path/to/project
36
42
 
37
43
  | 工具 | `--tool` 参数 | 输出目录 | 格式 |
38
44
  |---|---|---|---|
39
- | Claude Code (commands) | `claude` | `.claude/commands/sillyspec/` | slash commands |
40
- | Claude Code (skills) | `claude_skills` | `.claude/skills/sillyspec-<name>/` | SKILL.md |
41
- | Cursor | `cursor` | `.cursor/commands/` | custom commands |
42
- | Codex | `codex` | `~/.agents/skills/sillyspec-<name>/` | SKILL.md |
45
+ | Claude Code | `claude` | `.claude/skills/sillyspec-<name>/` | SKILL.md |
46
+ | Codex | `codex` | `.codex/skills/sillyspec-<name>/` | SKILL.md |
43
47
  | OpenCode | `opencode` | `.opencode/skills/sillyspec-<name>/` | SKILL.md |
44
48
  | OpenClaw | `openclaw` | `.openclaw/skills/sillyspec-<name>/` | SKILL.md |
45
49
 
@@ -64,7 +68,7 @@ claude --dangerously-skip-permissions
64
68
 
65
69
  ```
66
70
  绿地:init → brainstorm → plan → execute → [verify] → archive
67
- 棕地:scan → brainstorm → plan → execute → [verify] → archive
71
+ 棕地:scan → brainstorm → plan → execute → verify → archive
68
72
  大模块:brainstorm(多图) → 拆分 → MASTER.md → stage-1 全流程 → stage-2 全流程 → ... → archive
69
73
  ```
70
74
 
@@ -106,9 +110,13 @@ claude --dangerously-skip-permissions
106
110
  ## CLI 命令
107
111
 
108
112
  ```bash
109
- sillyspec status [--json] 显示当前项目状态
110
- sillyspec next [--json] 显示下一步命令
111
- sillyspec check [--json] 检查文档完整性
113
+ sillyspec run <stage> 执行阶段步骤(brainstorm/plan/execute/verify 等)
114
+ sillyspec run scan 代码扫描
115
+ sillyspec run quick 快速任务
116
+ sillyspec run explore 自由探索
117
+ sillyspec run <stage> --done 完成当前步骤并输出下一步
118
+ sillyspec run <stage> --status 查看阶段进度
119
+ sillyspec progress show 显示当前项目状态
112
120
  sillyspec setup 安装推荐 MCP 工具(交互式)
113
121
  sillyspec setup --list 查看已安装 MCP 状态
114
122
  sillyspec init 初始化(零交互,自动检测工具)
@@ -161,7 +169,7 @@ SillySpec 不仅仅是 prompt,还有硬校验:
161
169
  sillyspec/
162
170
  ├── bin/sillyspec.js # CLI 入口
163
171
  ├── src/
164
- │ ├── index.js # status/next/check 命令
172
+ │ ├── index.js # CLI 命令入口
165
173
  │ ├── init.js # init 逻辑 + 工具适配器
166
174
  │ └── setup.js # MCP 工具安装
167
175
  ├── templates/ # 命令模板(19 个)
package/SKILL.md CHANGED
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: sillyspec
3
- description: "规范驱动开发工具包 v3.6。绿地项目用 /sillyspec:init,棕地项目用 /sillyspec:scan。可用命令:init、scan、scan-quick、explore、brainstorm、plan、execute、verify、archive、commitexport、status、resume、continue、quickstate、workspace、workspace-sync。"
4
- version: "3.6.1"
3
+ description: "规范驱动开发工具包 v3.9。绿地项目用 /sillyspec:init,棕地项目用 /sillyspec:scan。主线:scan、brainstorm、plan、execute、verify、archive。辅助:quickexplore、status、doctor、resume、continue、commitexport、workspace。"
4
+ version: "3.9.1"
5
5
  ---
6
6
 
7
- # SillySpec v3.6
7
+ # SillySpec v3.9
8
8
 
9
9
  融合 Superpowers + OpenSpec + GSD,从"你说要啥"到"代码能跑"的完整流程。
10
10
  Claude Code / Cursor / Codex / OpenCode / OpenClaw 都能用。
@@ -22,11 +22,11 @@ Claude Code / Cursor / Codex / OpenCode / OpenClaw 都能用。
22
22
 
23
23
  ```
24
24
  绿地:init → brainstorm → plan → execute → [verify] → archive
25
- 棕地:scan → brainstorm → plan → execute → [verify] → archive
25
+ 棕地:scan → brainstorm → plan → execute → verify → archive
26
26
  工作区:workspace → (init/scan per project) → brainstorm → ...
27
27
  ```
28
28
 
29
- ## 19 个命令
29
+ ## 命令
30
30
 
31
31
  ### 核心流程
32
32
 
@@ -52,16 +52,21 @@ Claude Code / Cursor / Codex / OpenCode / OpenClaw 都能用。
52
52
  | `/sillyspec:state` | 查看当前工作状态 |
53
53
  | `/sillyspec:commit` | 智能提交 |
54
54
  | `/sillyspec:export` | 导出成功方案为可复用模板 |
55
- | `/sillyspec:scan-quick` | 快速扫描(STACK + STRUCTURE) |
55
+ | `/sillyspec:doctor` | 项目自检 |
56
56
  | `/sillyspec:workspace` | 多项目工作区管理 |
57
- | `/sillyspec:workspace-sync` | 同步工作区子项目状态 |
58
57
 
59
58
  ## CLI 命令
60
59
 
61
60
  ```bash
62
- sillyspec status [--json] 显示当前项目状态
63
- sillyspec next [--json] 显示下一步命令
64
- sillyspec check [--json] 检查文档完整性
61
+ sillyspec run scan 执行代码扫描阶段
62
+ sillyspec run brainstorm 执行需求探索阶段
63
+ sillyspec run plan 执行实现计划阶段
64
+ sillyspec run execute 执行开发阶段
65
+ sillyspec run verify 执行验证阶段
66
+ sillyspec run archive 执行归档阶段
67
+ sillyspec run quick 快速任务
68
+ sillyspec run explore 自由探索
69
+ sillyspec progress show 显示当前项目状态
65
70
  sillyspec setup 安装推荐 MCP 工具
66
71
  sillyspec setup --list 查看已安装 MCP 状态
67
72
  sillyspec init 初始化(零交互,自动检测工具)
package/package.json CHANGED
@@ -1,7 +1,13 @@
1
1
  {
2
2
  "name": "sillyspec",
3
- "version": "3.9.0",
3
+ "version": "3.10.0",
4
4
  "description": "SillySpec CLI — 流程状态机,让 AI 严格按步骤来",
5
+ "icon": "logo.jpg",
6
+ "homepage": "https://sillyspec.ppdmq.top/",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/q512426816/sillyspec.git"
10
+ },
5
11
  "type": "module",
6
12
  "bin": {
7
13
  "sillyspec": "./bin/sillyspec.js"
@@ -24,13 +30,5 @@
24
30
  "open": "^10.1",
25
31
  "ora": "^9.3.0",
26
32
  "ws": "^8.18"
27
- },
28
- "scripts": {
29
- "docs:dev": "vitepress dev docs",
30
- "docs:build": "vitepress build docs",
31
- "docs:preview": "vitepress preview docs"
32
- },
33
- "devDependencies": {
34
- "vitepress": "^1.6.4"
35
33
  }
36
34
  }
@@ -0,0 +1 @@
1
+ .line-clamp-2[data-v-4d22d782]{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.doc-tree[data-v-a51c27a2]{height:100%;min-height:0;display:flex;flex-direction:column;background:#fff}.doc-tree-search[data-v-a51c27a2]{flex-shrink:0;padding:10px 12px 8px;border-bottom:1px solid #F0F0F3}.doc-tree-list[data-v-a51c27a2]{flex:1;min-height:0;overflow:auto;padding:8px 12px 14px}.doc-tree-list[data-v-a51c27a2] .n-tree-node-content__text{white-space:normal;line-height:1.35;overflow-wrap:anywhere}.doc-preview-shell[data-v-a804f0ed]{height:100%;min-height:0;display:flex;flex-direction:column;background:#fff}.doc-empty[data-v-a804f0ed]{height:100%;display:flex;align-items:center;justify-content:center;padding:24px;text-align:center;font-size:12px;color:#636366;font-family:JetBrains Mono,monospace}.doc-toolbar[data-v-a804f0ed]{flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border-bottom:1px solid #F0F0F3}.doc-title[data-v-a804f0ed]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;color:#1c1c1e}.doc-preview-scroll[data-v-a804f0ed]{flex:1;min-height:0;overflow:auto;padding:14px 16px 22px}.doc-modal-body[data-v-a804f0ed]{max-height:min(72vh,760px);overflow:auto;padding-right:4px}.doc-preview[data-v-a804f0ed]{font-size:13px;line-height:1.7;color:#374151;overflow-wrap:anywhere}.doc-preview-large[data-v-a804f0ed]{font-size:14px;line-height:1.75}.doc-preview[data-v-a804f0ed] h1{color:#d97706;font-size:18px;font-weight:700;margin:0 0 16px;border-bottom:1px solid #E5E5EA;padding-bottom:8px}.doc-preview-large[data-v-a804f0ed] h1{font-size:22px}.doc-preview[data-v-a804f0ed] h2{color:#1c1c1e;font-size:15px;font-weight:600;margin:20px 0 10px}.doc-preview-large[data-v-a804f0ed] h2{font-size:17px}.doc-preview[data-v-a804f0ed] h3{color:#d97706;font-size:14px;font-weight:600;margin:16px 0 8px}.doc-preview[data-v-a804f0ed] p{margin:8px 0}.doc-preview[data-v-a804f0ed] strong{color:#1c1c1e;font-weight:600}.doc-preview[data-v-a804f0ed] a{color:#d97706;text-decoration:none}.doc-preview[data-v-a804f0ed] a:hover{text-decoration:underline}.doc-preview[data-v-a804f0ed] code{background:#e5e5ea;color:#1c1c1e;padding:1px 5px;border-radius:3px;font-size:12px;font-family:JetBrains Mono,monospace}.doc-preview[data-v-a804f0ed] pre{background:#1c1c1e;color:#e5e5e7;border:1px solid #E5E5EA;border-radius:6px;padding:12px 16px;overflow-x:auto;font-size:12px;margin:8px 0;line-height:1.5}.doc-preview[data-v-a804f0ed] pre code{background:none;color:inherit;padding:0;border-radius:0;font-size:inherit}.doc-preview[data-v-a804f0ed] ul,.doc-preview[data-v-a804f0ed] ol{padding-left:20px;margin:8px 0;color:#374151}.doc-preview[data-v-a804f0ed] li{margin:4px 0}.doc-preview[data-v-a804f0ed] blockquote{border-left:3px solid #D97706;padding-left:12px;margin:12px 0;color:#636366;font-style:italic}.doc-preview[data-v-a804f0ed] table{width:100%;border-collapse:collapse;margin:12px 0;font-size:12px}.doc-preview[data-v-a804f0ed] thead th{background:#f0f0f3;color:#1c1c1e;font-weight:600;text-align:left;padding:8px 12px;border:1px solid #E5E5EA}.doc-preview[data-v-a804f0ed] tbody td{padding:6px 12px;border:1px solid #E5E5EA;color:#374151}.doc-preview[data-v-a804f0ed] tbody tr:hover{background:#f9fafb}.doc-preview[data-v-a804f0ed] hr{border:none;border-top:1px solid #E5E5EA;margin:16px 0}.docs-panel[data-v-656ea40b]{min-height:0}.docs-tree-pane[data-v-656ea40b]{width:clamp(220px,42%,320px);min-width:180px}.project-card[data-v-814734b8]{width:280px;height:120px;background:#fff;border:2px solid #E5E7EB;border-radius:12px;padding:16px;display:flex;flex-direction:column;justify-content:space-between;cursor:pointer;transition:all .2s;flex-shrink:0}.project-card[data-v-814734b8]:hover{border-color:#d97706;box-shadow:0 4px 12px #d9770626}.project-card.selected[data-v-814734b8]{border-color:#d97706;box-shadow:0 0 0 3px #d9770633}.card-header[data-v-814734b8]{display:flex;justify-content:space-between;align-items:flex-start}.project-name[data-v-814734b8]{font-size:16px;font-weight:600;color:#1a1a1a}.last-active[data-v-814734b8]{font-size:11px;color:#9ca3af}.stage-badge[data-v-814734b8]{display:inline-block;padding:4px 10px;border-radius:12px;font-size:12px;font-weight:500}.stage-badge.in-progress[data-v-814734b8]{background:#dbeafe;color:#1d4ed8}.stage-badge.completed[data-v-814734b8]{background:#d1fae5;color:#047857}.stage-badge.pending[data-v-814734b8]{background:#f3f4f6;color:#6b7280}.progress-section[data-v-814734b8]{display:flex;align-items:center;gap:8px}.progress-bar[data-v-814734b8]{flex:1;height:6px;background:#e5e7eb;border-radius:3px;overflow:hidden}.progress-fill[data-v-814734b8]{height:100%;border-radius:3px;transition:width .3s}.progress-fill.in-progress[data-v-814734b8]{background:#3b82f6}.progress-fill.completed[data-v-814734b8]{background:#10b981}.progress-fill.pending[data-v-814734b8]{background:#9ca3af}.progress-text[data-v-814734b8]{font-size:12px;font-weight:600;color:#374151}.overview-section[data-v-863782e3]{height:100%;background:#fff;padding:16px 24px;display:flex;flex-direction:column}.section-header[data-v-863782e3]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.section-title[data-v-863782e3]{font-size:18px;font-weight:600;color:#1a1a1a;display:flex;align-items:center;gap:8px}.badge[data-v-863782e3]{font-size:12px;padding:2px 8px;background:#e5e7eb;border-radius:10px;color:#6b7280;font-weight:500}.section-actions[data-v-863782e3]{display:flex;gap:8px;align-items:center}.btn[data-v-863782e3]{padding:6px 12px;border-radius:6px;border:none;cursor:pointer;font-size:13px;font-weight:500;transition:all .2s}.btn[data-v-863782e3]:hover{opacity:.9}.btn-secondary[data-v-863782e3]{background:#e5e7eb;color:#374151}.btn-icon[data-v-863782e3]{padding:6px;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:#f3f4f6;border-radius:6px}.btn-icon[data-v-863782e3]:hover{background:#e5e7eb}.cards-container[data-v-863782e3]{flex:1;display:flex;gap:16px;overflow-x:auto;overflow-y:hidden;padding-bottom:8px}.cards-container[data-v-863782e3]::-webkit-scrollbar{height:8px}.cards-container[data-v-863782e3]::-webkit-scrollbar-track{background:#f3f4f6;border-radius:4px}.cards-container[data-v-863782e3]::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:4px}*{margin:0;padding:0;box-sizing:border-box}body{font-family:DM Sans,-apple-system,BlinkMacSystemFont,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-smoothing:grayscale}#app{width:100vw;height:100vh;overflow:hidden;min-width:0}body.resizing{-webkit-user-select:none;user-select:none}body.resizing *{cursor:inherit!important}@media(max-width:1280px){.detail-section-title{font-size:11px}.detail-value{font-size:13px}.log-entry{font-size:11px}}.detail-column,.activity-column{padding:18px 20px}.pipeline-column{border-left:1px solid #EEF0F4;border-right:1px solid #EEF0F4}.pipeline-column>*{min-width:0;padding-left:18px;padding-right:18px}.activity-column{gap:12px}.activity-column .detail-section-title{padding:0;margin-bottom:0}.activity-column>.flex-1{padding:0}.project-info{min-width:0}.detail-section-title{font-size:12px;font-weight:600;color:#9ca3af;text-transform:uppercase;margin-bottom:12px}.detail-item{margin-bottom:16px}.detail-label{font-size:11px;color:#9ca3af;margin-bottom:4px}.detail-value{font-size:14px;color:#1a1a1a;font-weight:500;min-width:0;overflow-wrap:anywhere;word-break:break-word;line-height:1.45}.detail-path{font-size:12px;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;white-space:normal}.log-entry{font-family:JetBrains Mono,monospace;font-size:12px;padding:8px;background:#f9fafb;border-radius:4px;margin-bottom:8px;color:#374151}.log-entry.success{color:#047857;background:#d1fae5}.log-entry.error{color:#dc2626;background:#fee2e2}.fade-in{animation:fadeIn .2s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--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-gray-400:oklch(70.7% .022 261.325);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--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);--animate-pulse-dot:pulse-dot 1.5s ease-in-out infinite}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-5{bottom:calc(var(--spacing) * 5)}.left-0{left:calc(var(--spacing) * 0)}.left-5{left:calc(var(--spacing) * 5)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-4{margin-inline:calc(var(--spacing) * 4)}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.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-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-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.h-1{height:calc(var(--spacing) * 1)}.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-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-\[2px\]{height:2px}.h-\[6px\]{height:6px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-72{max-height:calc(var(--spacing) * 72)}.w-0{width:calc(var(--spacing) * 0)}.w-1{width:calc(var(--spacing) * 1)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-\[2px\]{width:2px}.w-\[4px\]{width:4px}.w-\[340px\]{width:340px}.w-px{width:1px}.w-screen{width:100vw}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.border-collapse{border-collapse:collapse}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse-dot{animation:var(--animate-pulse-dot)}.cursor-col-resize{cursor:col-resize}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.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-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}: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-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-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px * var(--tw-space-y-reverse));margin-block-end:calc(1px * calc(1 - var(--tw-space-y-reverse)))}.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-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.bg-\[\#D97706\]{background-color:#d97706}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.bg-white\/30{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.p-3{padding:calc(var(--spacing) * 3)}.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-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-px{padding-block:1px}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-\[3px\]{padding-left:3px}.text-center{text-align:center}.font-\[DM_Sans\,sans-serif\]{font-family:DM Sans,sans-serif}.font-\[JetBrains_Mono\,monospace\]{font-family:JetBrains Mono,monospace}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[18px\]{font-size:18px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.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-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.25em\]{--tw-tracking:.25em;letter-spacing:.25em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-black{color:var(--color-black)}.text-gray-400{color:var(--color-gray-400)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);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,)}.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-filter{-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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.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-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.hover\:bg-\[\#D97706\]:hover{background-color:#d97706}.hover\:bg-\[\#FEF3C7\]:hover{background-color:#fef3c7}}.active\:bg-\[\#D97706\]:active{background-color:#d97706}}@keyframes pulse-glow{0%,to{box-shadow:0 0 #fbbf2466}50%{box-shadow:0 0 12px 2px #fbbf2426}}@keyframes pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(1.5)}}@keyframes breathe{0%,to{opacity:.5}50%{opacity:1}}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes slide-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes glow-border{0%,to{border-color:#fbbf2426}50%{border-color:#fbbf2480}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}.font-mono-log{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.noise-bg{position:relative}.noise-bg:before{content:"";pointer-events:none;z-index:0;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");position:absolute;top:0;right:0;bottom:0;left:0}.accent-stripe{background:repeating-linear-gradient(-45deg,#0000,#0000 8px,#fbbf2408 8px,#fbbf2408 9px)}.progress-gradient{background:linear-gradient(90deg,#fbbf24,#f59e0b,#fb923c)}.skeleton-shimmer{background:linear-gradient(90deg,#1a1e28 25%,#2a3040,#1a1e28 75%) 0 0/200% 100%;animation:1.5s ease-in-out infinite shimmer}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#2a3040;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:#3a4555}*{scrollbar-width:thin;scrollbar-color:#2a2a2d transparent}::selection{color:#fbbf24;background:#fbbf2433}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}