sillyspec 3.7.13 → 3.7.15

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 (91) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +77 -0
  2. package/.claude/skills/sillyspec-brainstorm/SKILL.md +591 -0
  3. package/.claude/skills/sillyspec-continue/SKILL.md +44 -0
  4. package/.claude/skills/sillyspec-execute/SKILL.md +233 -0
  5. package/.claude/skills/sillyspec-explore/SKILL.md +96 -0
  6. package/.claude/skills/sillyspec-export/SKILL.md +53 -0
  7. package/.claude/skills/sillyspec-init/SKILL.md +171 -0
  8. package/.claude/skills/sillyspec-plan/SKILL.md +263 -0
  9. package/.claude/skills/sillyspec-propose/SKILL.md +248 -0
  10. package/.claude/skills/sillyspec-quick/SKILL.md +102 -0
  11. package/.claude/skills/sillyspec-resume/SKILL.md +111 -0
  12. package/{templates/scan.md → .claude/skills/sillyspec-scan/SKILL.md} +22 -60
  13. package/.claude/skills/sillyspec-state/SKILL.md +54 -0
  14. package/.claude/skills/sillyspec-status/SKILL.md +131 -0
  15. package/.claude/skills/sillyspec-verify/SKILL.md +146 -0
  16. package/.claude/skills/sillyspec-workspace/SKILL.md +149 -0
  17. package/.sillyspec/changes/run-command-design/design.md +1230 -0
  18. package/.sillyspec/docs/sillyspec/scan/.gitkeep +0 -0
  19. package/.sillyspec/knowledge/INDEX.md +8 -0
  20. package/.sillyspec/knowledge/uncategorized.md +3 -0
  21. package/.sillyspec/projects/sillyspec.yaml +3 -0
  22. package/README.md +4 -0
  23. package/logo.jpg +0 -0
  24. package/package.json +7 -1
  25. package/packages/dashboard/dist/assets/index-Bx0cgoK_.js +7446 -0
  26. package/packages/dashboard/dist/assets/index-DbkUSsNO.css +1 -0
  27. package/packages/dashboard/dist/favicon.jpg +0 -0
  28. package/packages/dashboard/dist/index.html +2 -2
  29. package/packages/dashboard/dist/logo.jpg +0 -0
  30. package/packages/dashboard/package-lock.json +220 -0
  31. package/packages/dashboard/package.json +8 -5
  32. package/packages/dashboard/public/favicon.jpg +0 -0
  33. package/packages/dashboard/public/logo.jpg +0 -0
  34. package/packages/dashboard/server/index.js +92 -4
  35. package/packages/dashboard/server/parser.js +252 -28
  36. package/packages/dashboard/src/App.vue +139 -9
  37. package/packages/dashboard/src/components/ActionBar.vue +23 -39
  38. package/packages/dashboard/src/components/CommandPalette.vue +40 -65
  39. package/packages/dashboard/src/components/DetailPanel.vue +68 -53
  40. package/packages/dashboard/src/components/DocPreview.vue +137 -20
  41. package/packages/dashboard/src/components/DocTree.vue +48 -26
  42. package/packages/dashboard/src/components/LogStream.vue +12 -32
  43. package/packages/dashboard/src/components/PipelineStage.vue +8 -8
  44. package/packages/dashboard/src/components/PipelineView.vue +35 -43
  45. package/packages/dashboard/src/components/ProjectList.vue +52 -77
  46. package/packages/dashboard/src/components/ProjectOverview.vue +178 -0
  47. package/packages/dashboard/src/components/StageBadge.vue +13 -13
  48. package/packages/dashboard/src/components/StepCard.vue +11 -11
  49. package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -0
  50. package/packages/dashboard/src/components/detail/GitDetail.vue +61 -0
  51. package/packages/dashboard/src/components/detail/TechDetail.vue +43 -0
  52. package/packages/dashboard/src/main.js +4 -1
  53. package/packages/dashboard/src/style.css +13 -13
  54. package/src/index.js +55 -8
  55. package/src/init.js +66 -196
  56. package/src/migrate.js +1 -18
  57. package/src/progress.js +279 -281
  58. package/src/run.js +320 -0
  59. package/src/setup.js +1 -9
  60. package/src/stages/brainstorm.js +210 -0
  61. package/src/stages/execute.js +190 -0
  62. package/src/stages/index.js +22 -0
  63. package/src/stages/plan.js +118 -0
  64. package/src/stages/propose.js +115 -0
  65. package/src/stages/verify.js +98 -0
  66. package/packages/dashboard/dist/assets/index-5Rrvs0Rl.css +0 -1
  67. package/packages/dashboard/dist/assets/index-ZNToqi9V.js +0 -17
  68. package/templates/archive.md +0 -121
  69. package/templates/brainstorm.md +0 -246
  70. package/templates/commit.md +0 -123
  71. package/templates/continue.md +0 -32
  72. package/templates/execute.md +0 -314
  73. package/templates/explore.md +0 -60
  74. package/templates/export.md +0 -21
  75. package/templates/init.md +0 -61
  76. package/templates/plan.md +0 -157
  77. package/templates/progress-format.md +0 -90
  78. package/templates/propose.md +0 -73
  79. package/templates/quick.md +0 -135
  80. package/templates/resume-dialog.md +0 -55
  81. package/templates/resume.md +0 -53
  82. package/templates/scan-quick.md +0 -49
  83. package/templates/skills/playwright-e2e/SKILL.md +0 -340
  84. package/templates/status.md +0 -72
  85. package/templates/verify.md +0 -253
  86. package/templates/workspace-sync.md +0 -89
  87. package/templates/workspace.md +0 -67
  88. /package/.sillyspec/{docs/sillyspec/brainstorm → changes/brainstorm-archive}/2026-04-05-dashboard-design.md +0 -0
  89. /package/.sillyspec/{docs/sillyspec/brainstorm → changes/brainstorm-archive}/2026-04-05-unified-docs-design.md +0 -0
  90. /package/.sillyspec/{specs/2026-04-05-dashboard-design.md → changes/dashboard/design.md.braindraft} +0 -0
  91. /package/.sillyspec/{specs/2026-04-05-unified-docs-design.md → changes/unified-docs-design/design.md} +0 -0
@@ -0,0 +1 @@
1
+ .slide-enter-active[data-v-b5f771a9],.slide-leave-active[data-v-b5f771a9]{transition:all .2s ease}.slide-enter-from[data-v-b5f771a9],.slide-leave-to[data-v-b5f771a9]{opacity:0;max-height:0;overflow:hidden}.slide-enter-to[data-v-b5f771a9],.slide-leave-from[data-v-b5f771a9]{max-height:300px}.line-clamp-2[data-v-0511fd83]{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.doc-preview[data-v-fc57afbe]{font-size:13px;line-height:1.7;color:#374151}.doc-preview[data-v-fc57afbe] h1{color:#d97706;font-size:18px;font-weight:700;margin:0 0 16px;border-bottom:1px solid #E5E5EA;padding-bottom:8px}.doc-preview[data-v-fc57afbe] h2{color:#1c1c1e;font-size:15px;font-weight:600;margin:20px 0 10px}.doc-preview[data-v-fc57afbe] h3{color:#d97706;font-size:14px;font-weight:600;margin:16px 0 8px}.doc-preview[data-v-fc57afbe] p{margin:8px 0}.doc-preview[data-v-fc57afbe] strong{color:#1c1c1e;font-weight:600}.doc-preview[data-v-fc57afbe] a{color:#d97706;text-decoration:none}.doc-preview[data-v-fc57afbe] a:hover{text-decoration:underline}.doc-preview[data-v-fc57afbe] code{background:#e5e5ea;color:#1c1c1e;padding:1px 5px;border-radius:3px;font-size:12px;font-family:JetBrains Mono,monospace}.doc-preview[data-v-fc57afbe] 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-fc57afbe] pre code{background:none;color:inherit;padding:0;border-radius:0;font-size:inherit}.doc-preview[data-v-fc57afbe] ul,.doc-preview[data-v-fc57afbe] ol{padding-left:20px;margin:8px 0;color:#374151}.doc-preview[data-v-fc57afbe] li{margin:4px 0}.doc-preview[data-v-fc57afbe] blockquote{border-left:3px solid #D97706;padding-left:12px;margin:12px 0;color:#636366;font-style:italic}.doc-preview[data-v-fc57afbe] table{width:100%;border-collapse:collapse;margin:12px 0;font-size:12px}.doc-preview[data-v-fc57afbe] thead th{background:#f0f0f3;color:#1c1c1e;font-weight:600;text-align:left;padding:8px 12px;border:1px solid #E5E5EA}.doc-preview[data-v-fc57afbe] tbody td{padding:6px 12px;border:1px solid #E5E5EA;color:#374151}.doc-preview[data-v-fc57afbe] tbody tr:hover{background:#f9fafb}.doc-preview[data-v-fc57afbe] hr{border:none;border-top:1px solid #E5E5EA;margin:16px 0}.project-overview[data-v-543019d4]{display:flex;align-items:center;background:#fff;border-bottom:1px solid #E5E5EA;padding:8px 16px;min-height:48px;gap:8px;flex-shrink:0;overflow-x:auto}.ov-section[data-v-543019d4]{display:flex;align-items:center;gap:6px;white-space:nowrap;flex-shrink:0}.ov-clickable[data-v-543019d4]{cursor:pointer;border-radius:4px;padding:2px 6px;margin:-2px -6px;transition:background .15s}.ov-clickable[data-v-543019d4]:hover{background:#d977060f}.ov-name[data-v-543019d4]{font-weight:600;font-size:13px;color:#1c1c1e}.ov-path[data-v-543019d4],.ov-label[data-v-543019d4]{font-size:11px;color:#636366}.ov-value[data-v-543019d4]{font-size:12px;color:#1c1c1e;font-weight:500}.ov-tag[data-v-543019d4]{font-size:10px;padding:1px 8px;border-radius:10px;background:#d9770614;color:#d97706;font-weight:500}.ov-divider[data-v-543019d4]{width:1px;height:20px;background:#e5e5ea;flex-shrink:0}.ov-git[data-v-543019d4]{margin-left:auto;gap:10px}.ov-branch[data-v-543019d4]{font-size:11px;color:#636366;background:#f5f5f7;padding:1px 8px;border-radius:4px}.ov-commit[data-v-543019d4]{font-size:11px;color:#636366;max-width:200px;overflow:hidden;text-overflow:ellipsis}.ov-dirty[data-v-543019d4]{font-size:11px;color:#d97706;font-weight:500}*{margin:0;padding:0;box-sizing:border-box}body{font-family:DM Sans,-apple-system,BlinkMacSystemFont,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#app{width:100vw;height:100vh;overflow:hidden}/*! 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-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking: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-black:#000;--spacing:.25rem;--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}.absolute{position:absolute}.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)}.top-0{top:calc(var(--spacing) * 0)}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-20{z-index:20}.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}.flex{display:flex}.hidden{display:none}.inline-flex{display:inline-flex}.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-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-\[2px\]{width:2px}.w-\[200px\]{width:200px}.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}.border-collapse{border-collapse:collapse}.rotate-180{rotate:180deg}.animate-pulse-dot{animation:var(--animate-pulse-dot)}.cursor-col-resize{cursor:col-resize}.cursor-pointer{cursor:pointer}.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}.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-4{padding-block:calc(var(--spacing) * 4)}.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-3{padding-right:calc(var(--spacing) * 3)}.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-3\.5{padding-left:calc(var(--spacing) * 3.5)}.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-\[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)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.opacity-0{opacity:0}.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-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-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}
@@ -7,8 +7,8 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
9
  <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
10
- <script type="module" crossorigin src="/assets/index-ZNToqi9V.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-5Rrvs0Rl.css">
10
+ <script type="module" crossorigin src="/assets/index-Bx0cgoK_.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-DbkUSsNO.css">
12
12
  </head>
13
13
  <body style="background-color: #0A0A0B; margin: 0;">
14
14
  <div id="app"></div>
Binary file
@@ -8,7 +8,10 @@
8
8
  "name": "@sillyspec/dashboard",
9
9
  "version": "1.0.0",
10
10
  "dependencies": {
11
+ "@vicons/ionicons5": "^0.13.0",
11
12
  "chokidar": "^4.0",
13
+ "marked": "^17.0.6",
14
+ "naive-ui": "^2.44.1",
12
15
  "open": "^10.1",
13
16
  "vue": "^3.5",
14
17
  "ws": "^8.18"
@@ -66,6 +69,30 @@
66
69
  "node": ">=6.9.0"
67
70
  }
68
71
  },
72
+ "node_modules/@css-render/plugin-bem": {
73
+ "version": "0.15.14",
74
+ "resolved": "https://registry.npmmirror.com/@css-render/plugin-bem/-/plugin-bem-0.15.14.tgz",
75
+ "integrity": "sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==",
76
+ "license": "MIT",
77
+ "peerDependencies": {
78
+ "css-render": "~0.15.14"
79
+ }
80
+ },
81
+ "node_modules/@css-render/vue3-ssr": {
82
+ "version": "0.15.14",
83
+ "resolved": "https://registry.npmmirror.com/@css-render/vue3-ssr/-/vue3-ssr-0.15.14.tgz",
84
+ "integrity": "sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==",
85
+ "license": "MIT",
86
+ "peerDependencies": {
87
+ "vue": "^3.0.11"
88
+ }
89
+ },
90
+ "node_modules/@emotion/hash": {
91
+ "version": "0.8.0",
92
+ "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz",
93
+ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==",
94
+ "license": "MIT"
95
+ },
69
96
  "node_modules/@esbuild/aix-ppc64": {
70
97
  "version": "0.25.12",
71
98
  "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
@@ -557,6 +584,12 @@
557
584
  "@jridgewell/sourcemap-codec": "^1.4.14"
558
585
  }
559
586
  },
587
+ "node_modules/@juggle/resize-observer": {
588
+ "version": "3.4.0",
589
+ "resolved": "https://registry.npmmirror.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
590
+ "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==",
591
+ "license": "Apache-2.0"
592
+ },
560
593
  "node_modules/@rollup/rollup-android-arm-eabi": {
561
594
  "version": "4.60.1",
562
595
  "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz",
@@ -1186,6 +1219,27 @@
1186
1219
  "dev": true,
1187
1220
  "license": "MIT"
1188
1221
  },
1222
+ "node_modules/@types/lodash": {
1223
+ "version": "4.17.24",
1224
+ "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.24.tgz",
1225
+ "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==",
1226
+ "license": "MIT"
1227
+ },
1228
+ "node_modules/@types/lodash-es": {
1229
+ "version": "4.17.12",
1230
+ "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
1231
+ "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
1232
+ "license": "MIT",
1233
+ "dependencies": {
1234
+ "@types/lodash": "*"
1235
+ }
1236
+ },
1237
+ "node_modules/@vicons/ionicons5": {
1238
+ "version": "0.13.0",
1239
+ "resolved": "https://registry.npmmirror.com/@vicons/ionicons5/-/ionicons5-0.13.0.tgz",
1240
+ "integrity": "sha512-zvZKBPjEXKN7AXNo2Na2uy+nvuv6SP4KAMQxpKL2vfHMj0fSvuw7JZcOPCjQC3e7ayssKnaoFVAhbYcW6v41qQ==",
1241
+ "license": "MIT"
1242
+ },
1189
1243
  "node_modules/@vitejs/plugin-vue": {
1190
1244
  "version": "5.2.4",
1191
1245
  "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
@@ -1300,6 +1354,12 @@
1300
1354
  "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==",
1301
1355
  "license": "MIT"
1302
1356
  },
1357
+ "node_modules/async-validator": {
1358
+ "version": "4.2.5",
1359
+ "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
1360
+ "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
1361
+ "license": "MIT"
1362
+ },
1303
1363
  "node_modules/bundle-name": {
1304
1364
  "version": "4.1.0",
1305
1365
  "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz",
@@ -1330,12 +1390,47 @@
1330
1390
  "url": "https://paulmillr.com/funding/"
1331
1391
  }
1332
1392
  },
1393
+ "node_modules/css-render": {
1394
+ "version": "0.15.14",
1395
+ "resolved": "https://registry.npmmirror.com/css-render/-/css-render-0.15.14.tgz",
1396
+ "integrity": "sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==",
1397
+ "license": "MIT",
1398
+ "dependencies": {
1399
+ "@emotion/hash": "~0.8.0",
1400
+ "csstype": "~3.0.5"
1401
+ }
1402
+ },
1403
+ "node_modules/css-render/node_modules/csstype": {
1404
+ "version": "3.0.11",
1405
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.0.11.tgz",
1406
+ "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==",
1407
+ "license": "MIT"
1408
+ },
1333
1409
  "node_modules/csstype": {
1334
1410
  "version": "3.2.3",
1335
1411
  "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz",
1336
1412
  "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
1337
1413
  "license": "MIT"
1338
1414
  },
1415
+ "node_modules/date-fns": {
1416
+ "version": "4.1.0",
1417
+ "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-4.1.0.tgz",
1418
+ "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
1419
+ "license": "MIT",
1420
+ "funding": {
1421
+ "type": "github",
1422
+ "url": "https://github.com/sponsors/kossnocorp"
1423
+ }
1424
+ },
1425
+ "node_modules/date-fns-tz": {
1426
+ "version": "3.2.0",
1427
+ "resolved": "https://registry.npmmirror.com/date-fns-tz/-/date-fns-tz-3.2.0.tgz",
1428
+ "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==",
1429
+ "license": "MIT",
1430
+ "peerDependencies": {
1431
+ "date-fns": "^3.0.0 || ^4.0.0"
1432
+ }
1433
+ },
1339
1434
  "node_modules/default-browser": {
1340
1435
  "version": "5.5.0",
1341
1436
  "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.5.0.tgz",
@@ -1460,6 +1555,12 @@
1460
1555
  "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
1461
1556
  "license": "MIT"
1462
1557
  },
1558
+ "node_modules/evtd": {
1559
+ "version": "0.2.4",
1560
+ "resolved": "https://registry.npmmirror.com/evtd/-/evtd-0.2.4.tgz",
1561
+ "integrity": "sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==",
1562
+ "license": "MIT"
1563
+ },
1463
1564
  "node_modules/fdir": {
1464
1565
  "version": "6.5.0",
1465
1566
  "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz",
@@ -1500,6 +1601,15 @@
1500
1601
  "dev": true,
1501
1602
  "license": "ISC"
1502
1603
  },
1604
+ "node_modules/highlight.js": {
1605
+ "version": "11.11.1",
1606
+ "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.11.1.tgz",
1607
+ "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
1608
+ "license": "BSD-3-Clause",
1609
+ "engines": {
1610
+ "node": ">=12.0.0"
1611
+ }
1612
+ },
1503
1613
  "node_modules/is-docker": {
1504
1614
  "version": "3.0.0",
1505
1615
  "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz",
@@ -1819,6 +1929,18 @@
1819
1929
  "url": "https://opencollective.com/parcel"
1820
1930
  }
1821
1931
  },
1932
+ "node_modules/lodash": {
1933
+ "version": "4.18.1",
1934
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.18.1.tgz",
1935
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
1936
+ "license": "MIT"
1937
+ },
1938
+ "node_modules/lodash-es": {
1939
+ "version": "4.18.1",
1940
+ "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.18.1.tgz",
1941
+ "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
1942
+ "license": "MIT"
1943
+ },
1822
1944
  "node_modules/magic-string": {
1823
1945
  "version": "0.30.21",
1824
1946
  "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
@@ -1828,6 +1950,50 @@
1828
1950
  "@jridgewell/sourcemap-codec": "^1.5.5"
1829
1951
  }
1830
1952
  },
1953
+ "node_modules/marked": {
1954
+ "version": "17.0.6",
1955
+ "resolved": "https://registry.npmmirror.com/marked/-/marked-17.0.6.tgz",
1956
+ "integrity": "sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==",
1957
+ "license": "MIT",
1958
+ "bin": {
1959
+ "marked": "bin/marked.js"
1960
+ },
1961
+ "engines": {
1962
+ "node": ">= 20"
1963
+ }
1964
+ },
1965
+ "node_modules/naive-ui": {
1966
+ "version": "2.44.1",
1967
+ "resolved": "https://registry.npmmirror.com/naive-ui/-/naive-ui-2.44.1.tgz",
1968
+ "integrity": "sha512-reo8Esw0p58liZwbUutC7meW24Xbn3EwNv91zReWKm2W4JPu+zfgJRn/F7aO0BFmvN+h2brA2M5lRvYqLq4kuA==",
1969
+ "license": "MIT",
1970
+ "dependencies": {
1971
+ "@css-render/plugin-bem": "^0.15.14",
1972
+ "@css-render/vue3-ssr": "^0.15.14",
1973
+ "@types/lodash": "^4.17.20",
1974
+ "@types/lodash-es": "^4.17.12",
1975
+ "async-validator": "^4.2.5",
1976
+ "css-render": "^0.15.14",
1977
+ "csstype": "^3.1.3",
1978
+ "date-fns": "^4.1.0",
1979
+ "date-fns-tz": "^3.2.0",
1980
+ "evtd": "^0.2.4",
1981
+ "highlight.js": "^11.8.0",
1982
+ "lodash": "^4.17.21",
1983
+ "lodash-es": "^4.17.21",
1984
+ "seemly": "^0.3.10",
1985
+ "treemate": "^0.3.11",
1986
+ "vdirs": "^0.1.8",
1987
+ "vooks": "^0.2.12",
1988
+ "vueuc": "^0.4.65"
1989
+ },
1990
+ "engines": {
1991
+ "node": ">=20"
1992
+ },
1993
+ "peerDependencies": {
1994
+ "vue": "^3.0.0"
1995
+ }
1996
+ },
1831
1997
  "node_modules/nanoid": {
1832
1998
  "version": "3.3.11",
1833
1999
  "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
@@ -1981,6 +2147,12 @@
1981
2147
  "url": "https://github.com/sponsors/sindresorhus"
1982
2148
  }
1983
2149
  },
2150
+ "node_modules/seemly": {
2151
+ "version": "0.3.10",
2152
+ "resolved": "https://registry.npmmirror.com/seemly/-/seemly-0.3.10.tgz",
2153
+ "integrity": "sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==",
2154
+ "license": "MIT"
2155
+ },
1984
2156
  "node_modules/source-map-js": {
1985
2157
  "version": "1.2.1",
1986
2158
  "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -2028,6 +2200,24 @@
2028
2200
  "url": "https://github.com/sponsors/SuperchupuDev"
2029
2201
  }
2030
2202
  },
2203
+ "node_modules/treemate": {
2204
+ "version": "0.3.11",
2205
+ "resolved": "https://registry.npmmirror.com/treemate/-/treemate-0.3.11.tgz",
2206
+ "integrity": "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==",
2207
+ "license": "MIT"
2208
+ },
2209
+ "node_modules/vdirs": {
2210
+ "version": "0.1.8",
2211
+ "resolved": "https://registry.npmmirror.com/vdirs/-/vdirs-0.1.8.tgz",
2212
+ "integrity": "sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==",
2213
+ "license": "MIT",
2214
+ "dependencies": {
2215
+ "evtd": "^0.2.2"
2216
+ },
2217
+ "peerDependencies": {
2218
+ "vue": "^3.0.11"
2219
+ }
2220
+ },
2031
2221
  "node_modules/vite": {
2032
2222
  "version": "6.4.1",
2033
2223
  "resolved": "https://registry.npmmirror.com/vite/-/vite-6.4.1.tgz",
@@ -2103,6 +2293,18 @@
2103
2293
  }
2104
2294
  }
2105
2295
  },
2296
+ "node_modules/vooks": {
2297
+ "version": "0.2.12",
2298
+ "resolved": "https://registry.npmmirror.com/vooks/-/vooks-0.2.12.tgz",
2299
+ "integrity": "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==",
2300
+ "license": "MIT",
2301
+ "dependencies": {
2302
+ "evtd": "^0.2.2"
2303
+ },
2304
+ "peerDependencies": {
2305
+ "vue": "^3.0.0"
2306
+ }
2307
+ },
2106
2308
  "node_modules/vue": {
2107
2309
  "version": "3.5.32",
2108
2310
  "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.32.tgz",
@@ -2124,6 +2326,24 @@
2124
2326
  }
2125
2327
  }
2126
2328
  },
2329
+ "node_modules/vueuc": {
2330
+ "version": "0.4.65",
2331
+ "resolved": "https://registry.npmmirror.com/vueuc/-/vueuc-0.4.65.tgz",
2332
+ "integrity": "sha512-lXuMl+8gsBmruudfxnMF9HW4be8rFziylXFu1VHVNbLVhRTXXV4njvpRuJapD/8q+oFEMSfQMH16E/85VoWRyQ==",
2333
+ "license": "MIT",
2334
+ "dependencies": {
2335
+ "@css-render/vue3-ssr": "^0.15.10",
2336
+ "@juggle/resize-observer": "^3.3.1",
2337
+ "css-render": "^0.15.10",
2338
+ "evtd": "^0.2.4",
2339
+ "seemly": "^0.3.6",
2340
+ "vdirs": "^0.1.4",
2341
+ "vooks": "^0.2.4"
2342
+ },
2343
+ "peerDependencies": {
2344
+ "vue": "^3.0.11"
2345
+ }
2346
+ },
2127
2347
  "node_modules/ws": {
2128
2348
  "version": "8.20.0",
2129
2349
  "resolved": "https://registry.npmmirror.com/ws/-/ws-8.20.0.tgz",
@@ -8,15 +8,18 @@
8
8
  "preview": "vite preview"
9
9
  },
10
10
  "dependencies": {
11
- "vue": "^3.5",
12
- "ws": "^8.18",
11
+ "@vicons/ionicons5": "^0.13.0",
13
12
  "chokidar": "^4.0",
14
- "open": "^10.1"
13
+ "marked": "^17.0.6",
14
+ "naive-ui": "^2.44.1",
15
+ "open": "^10.1",
16
+ "vue": "^3.5",
17
+ "ws": "^8.18"
15
18
  },
16
19
  "devDependencies": {
20
+ "@tailwindcss/vite": "^4.0",
17
21
  "@vitejs/plugin-vue": "^5.2",
18
- "vite": "^6.0",
19
22
  "tailwindcss": "^4.0",
20
- "@tailwindcss/vite": "^4.0"
23
+ "vite": "^6.0"
21
24
  }
22
25
  }
@@ -1,11 +1,11 @@
1
1
  import { createServer } from 'http'
2
2
  import { WebSocketServer } from 'ws'
3
- import { existsSync, readFileSync, readdirSync, realpathSync } from 'fs'
4
- import { join, dirname, basename, sep } from 'path'
3
+ import { existsSync, readFileSync, readdirSync, realpathSync, watch } from 'fs'
4
+ import { join, dirname, basename, sep, resolve } from 'path'
5
5
  import { fileURLToPath } from 'url'
6
6
  import { homedir } from 'os'
7
7
  import open from 'open'
8
- import { parseProjectState, parseDocsTree } from './parser.js'
8
+ import { parseProjectState, parseDocsTree, parseProjectOverview, parseGitDetail, parseTechStackDetail, parseDocsList } from './parser.js'
9
9
  import { startWatcher, stopWatcher, addCustomScanPath, removeCustomScanPath, getCustomScanPaths, customScanPaths } from './watcher.js'
10
10
  import { executeCommand } from './executor.js'
11
11
 
@@ -15,6 +15,44 @@ const __dirname = dirname(fileURLToPath(import.meta.url))
15
15
  let wss = null
16
16
  const activeProcesses = new Map()
17
17
 
18
+ // Progress file watchers: projectPath -> { watcher, timer, refCount }
19
+ const progressWatchers = new Map()
20
+
21
+ function startProgressWatch(projectPath) {
22
+ if (progressWatchers.has(projectPath)) {
23
+ progressWatchers.get(projectPath).refCount++
24
+ return
25
+ }
26
+ const progressFile = join(projectPath, '.sillyspec', '.runtime', 'progress.json')
27
+ if (!existsSync(progressFile)) return
28
+
29
+ let timer = null
30
+ try {
31
+ const watcher = watch(progressFile, (eventType) => {
32
+ if (timer) clearTimeout(timer)
33
+ timer = setTimeout(() => {
34
+ timer = null
35
+ try {
36
+ const state = parseProjectState(projectPath)
37
+ broadcast({ type: 'project:update', data: { path: projectPath, state } })
38
+ } catch {}
39
+ }, 200)
40
+ })
41
+ progressWatchers.set(projectPath, { watcher, timer, refCount: 1 })
42
+ } catch {}
43
+ }
44
+
45
+ function stopProgressWatch(projectPath) {
46
+ const entry = progressWatchers.get(projectPath)
47
+ if (!entry) return
48
+ entry.refCount--
49
+ if (entry.refCount <= 0) {
50
+ entry.watcher.close()
51
+ if (entry.timer) clearTimeout(entry.timer)
52
+ progressWatchers.delete(projectPath)
53
+ }
54
+ }
55
+
18
56
  /**
19
57
  * Broadcast message to all connected WebSocket clients
20
58
  * @param {object} data - Data to broadcast
@@ -205,6 +243,44 @@ function startServer({ port = 3456, open: openBrowser = true } = {}) {
205
243
  return
206
244
  }
207
245
 
246
+ // Detail API
247
+ const detailMatch = req.url?.match(/^\/api\/projects\/(.+)\/detail(\?|$)/)
248
+ if (detailMatch) {
249
+ const projectPath = decodeURIComponent(detailMatch[1])
250
+ const url = new URL(req.url, `http://${req.headers.host}`)
251
+ const type = url.searchParams.get('type')
252
+ let data
253
+ try {
254
+ if (type === 'git') data = parseGitDetail(projectPath)
255
+ else if (type === 'tech') data = parseTechStackDetail(projectPath)
256
+ else if (type === 'docs') data = parseDocsList(projectPath)
257
+ else { res.writeHead(400); res.end(JSON.stringify({ error: 'Invalid type' })); return }
258
+ res.setHeader('Content-Type', 'application/json')
259
+ res.writeHead(200)
260
+ res.end(JSON.stringify(data))
261
+ } catch (err) {
262
+ res.writeHead(500)
263
+ res.end(JSON.stringify({ error: err.message }))
264
+ }
265
+ return
266
+ }
267
+
268
+ // Overview API
269
+ if (req.url?.startsWith('/api/projects/') && req.url.endsWith('/overview')) {
270
+ const parts = req.url.replace('/api/projects/', '').replace('/overview', '').split('/')
271
+ const projectPath = decodeURIComponent(parts.join('/'))
272
+ try {
273
+ const overview = parseProjectOverview(projectPath)
274
+ res.setHeader('Content-Type', 'application/json')
275
+ res.writeHead(200)
276
+ res.end(JSON.stringify(overview))
277
+ } catch (err) {
278
+ res.writeHead(500)
279
+ res.end(JSON.stringify({ error: err.message }))
280
+ }
281
+ return
282
+ }
283
+
208
284
  if (req.url?.startsWith('/api/project/')) {
209
285
  const projectName = decodeURIComponent(req.url.split('/').pop())
210
286
  discoverProjects().then(projects => {
@@ -311,7 +387,8 @@ function startServer({ port = 3456, open: openBrowser = true } = {}) {
311
387
  discoverProjects().then(projects => {
312
388
  const projectsWithState = projects.map(p => ({
313
389
  ...p,
314
- state: parseProjectState(p.path)
390
+ state: parseProjectState(p.path),
391
+ overview: parseProjectOverview(p.path)
315
392
  }))
316
393
 
317
394
  ws.send(JSON.stringify({
@@ -319,6 +396,11 @@ function startServer({ port = 3456, open: openBrowser = true } = {}) {
319
396
  data: projectsWithState
320
397
  }))
321
398
 
399
+ // Start watching progress files for all discovered projects
400
+ for (const p of projectsWithState) {
401
+ startProgressWatch(p.path)
402
+ }
403
+
322
404
  // Send current scan paths
323
405
  ws.send(JSON.stringify({
324
406
  type: 'scan:paths',
@@ -382,6 +464,12 @@ function startServer({ port = 3456, open: openBrowser = true } = {}) {
382
464
 
383
465
  ws.on('close', () => {
384
466
  console.log('WebSocket client disconnected')
467
+ // Decrement progress watchers — we track which projects this client was watching
468
+ // via the initial projects:init. For simplicity, stop all that we started.
469
+ // (Other clients will re-start via their connection if still active)
470
+ for (const [path] of progressWatchers) {
471
+ stopProgressWatch(path)
472
+ }
385
473
  })
386
474
 
387
475
  ws.on('error', (err) => {