howone 0.1.29 → 0.1.30

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 (219) hide show
  1. package/package.json +1 -1
  2. package/templates/vite/.howone/skills/hallmark/SKILL.md +48 -42
  3. package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +12 -6
  4. package/templates/vite/.howone/skills/hallmark/references/assets.md +7 -0
  5. package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +19 -10
  6. package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +1 -1
  7. package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +1 -1
  8. package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +1 -1
  9. package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +1 -1
  10. package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +1 -1
  11. package/templates/vite/.howone/skills/hallmark/references/components/n11-mega-menu.md +40 -0
  12. package/templates/vite/.howone/skills/hallmark/references/components/n12-banner-retract.md +34 -0
  13. package/templates/vite/.howone/skills/hallmark/references/components/n13-inline-cmdk-pill.md +39 -0
  14. package/templates/vite/.howone/skills/hallmark/references/components/n1b-saas-three-section.md +35 -0
  15. package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +1 -1
  16. package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +2 -2
  17. package/templates/vite/.howone/skills/hallmark/references/copy.md +8 -8
  18. package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +2 -2
  19. package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +50 -12
  20. package/templates/vite/.howone/skills/hallmark/references/export-formats.md +1 -1
  21. package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +11 -7
  22. package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +6 -4
  23. package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +10 -6
  24. package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +15 -10
  25. package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +13 -12
  26. package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +2 -1
  27. package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +4 -3
  28. package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +3 -1
  29. package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +1 -1
  30. package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +1 -1
  31. package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +1 -3
  32. package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +12 -12
  33. package/templates/vite/.howone/skills/hallmark/references/responsive.md +8 -8
  34. package/templates/vite/.howone/skills/hallmark/references/slop-test.md +72 -85
  35. package/templates/vite/.howone/skills/hallmark/references/structure.md +9 -13
  36. package/templates/vite/.howone/skills/hallmark/references/study.md +40 -17
  37. package/templates/vite/.howone/skills/hallmark/references/themes/carnival.md +301 -0
  38. package/templates/vite/.howone/skills/hallmark/references/themes/cobalt.md +146 -0
  39. package/templates/vite/.howone/skills/hallmark/references/themes/hum.md +403 -0
  40. package/templates/vite/.howone/skills/hallmark/references/themes/lumen.md +478 -0
  41. package/templates/vite/.howone/skills/hallmark/references/typography.md +3 -3
  42. package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +1 -1
  43. package/templates/vite/.howone/skills/hallmark/LICENSE +0 -21
  44. package/templates/vite/.howone/skills/hallmark/README.md +0 -147
  45. package/templates/vite/.howone/skills/hallmark/ROADMAP.md +0 -201
  46. package/templates/vite/.howone/skills/hallmark/docs/recipes.md +0 -186
  47. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-anya.jpg +0 -0
  48. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-bananastudio.jpg +0 -0
  49. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-hyperlane.jpg +0 -0
  50. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-najm.jpg +0 -0
  51. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-slow-pour.jpg +0 -0
  52. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-soroe.jpg +0 -0
  53. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-tally.jpg +0 -0
  54. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-wayfare.jpg +0 -0
  55. package/templates/vite/.howone/skills/hallmark/docs/study-examples.md +0 -176
  56. package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +0 -364
  57. package/templates/vite/.howone/skills/hallmark/package.json +0 -36
  58. package/templates/vite/.howone/skills/hallmark/site/OG-hallmark.png +0 -0
  59. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/brief.md +0 -71
  60. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +0 -64
  61. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +0 -240
  62. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +0 -65
  63. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +0 -105
  64. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +0 -250
  65. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +0 -64
  66. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +0 -131
  67. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +0 -240
  68. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +0 -67
  69. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +0 -86
  70. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +0 -262
  71. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +0 -63
  72. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +0 -167
  73. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +0 -457
  74. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +0 -65
  75. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +0 -159
  76. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +0 -288
  77. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +0 -64
  78. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +0 -146
  79. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +0 -484
  80. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +0 -64
  81. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +0 -116
  82. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +0 -354
  83. package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +0 -638
  84. package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +0 -515
  85. package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +0 -515
  86. package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +0 -608
  87. package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +0 -587
  88. package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +0 -157
  89. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-loop.mp4 +0 -0
  90. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-still.jpg +0 -0
  91. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-example.mp4 +0 -0
  92. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-still.jpg +0 -0
  93. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-loop.mp4 +0 -0
  94. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-still.jpg +0 -0
  95. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Podcast-loop.mp4 +0 -0
  96. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-loop.mp4 +0 -0
  97. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-still.jpg +0 -0
  98. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-loop.mp4 +0 -0
  99. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-still.jpg +0 -0
  100. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/after-quiet-hour.png +0 -0
  101. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-loop.mp4 +0 -0
  102. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-still.jpg +0 -0
  103. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/audit-example.png +0 -0
  104. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/before-quiet-hour.png +0 -0
  105. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/example-redesign-uractivation.png +0 -0
  106. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-loop.mp4 +0 -0
  107. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-still.jpg +0 -0
  108. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/study-example.png +0 -0
  109. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/uractivation-after-loop.mp4 +0 -0
  110. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-loop.mp4 +0 -0
  111. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-still.jpg +0 -0
  112. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/index.html +0 -77
  113. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +0 -238
  114. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +0 -110
  115. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +0 -326
  116. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +0 -134
  117. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +0 -262
  118. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +0 -30
  119. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +0 -17
  120. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +0 -56
  121. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +0 -160
  122. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +0 -29
  123. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +0 -63
  124. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +0 -72
  125. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +0 -374
  126. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +0 -52
  127. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +0 -29
  128. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +0 -61
  129. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +0 -193
  130. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +0 -66
  131. package/templates/vite/.howone/skills/hallmark/site/css/base.css +0 -194
  132. package/templates/vite/.howone/skills/hallmark/site/css/components.css +0 -4886
  133. package/templates/vite/.howone/skills/hallmark/site/css/sections.css +0 -2072
  134. package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +0 -1129
  135. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +0 -475
  136. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +0 -1584
  137. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +0 -96
  138. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +0 -344
  139. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +0 -103
  140. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +0 -1103
  141. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +0 -83
  142. package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +0 -368
  143. package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +0 -133
  144. package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +0 -1062
  145. package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +0 -97
  146. package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +0 -84
  147. package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +0 -446
  148. package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +0 -1087
  149. package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +0 -101
  150. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +0 -359
  151. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +0 -1168
  152. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +0 -81
  153. package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +0 -5
  154. package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +0 -5
  155. package/templates/vite/.howone/skills/hallmark/site/index.html +0 -1043
  156. package/templates/vite/.howone/skills/hallmark/site/js/main.js +0 -1175
  157. package/templates/vite/.howone/skills/hallmark/vercel.json +0 -6
  158. package/templates/vite/.howone/skills/impeccable/SKILL.md +0 -168
  159. package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +0 -101
  160. package/templates/vite/.howone/skills/impeccable/reference/adapt.md +0 -190
  161. package/templates/vite/.howone/skills/impeccable/reference/animate.md +0 -175
  162. package/templates/vite/.howone/skills/impeccable/reference/audit.md +0 -133
  163. package/templates/vite/.howone/skills/impeccable/reference/bolder.md +0 -113
  164. package/templates/vite/.howone/skills/impeccable/reference/brand.md +0 -118
  165. package/templates/vite/.howone/skills/impeccable/reference/clarify.md +0 -174
  166. package/templates/vite/.howone/skills/impeccable/reference/codex.md +0 -105
  167. package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +0 -106
  168. package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +0 -105
  169. package/templates/vite/.howone/skills/impeccable/reference/colorize.md +0 -154
  170. package/templates/vite/.howone/skills/impeccable/reference/craft.md +0 -123
  171. package/templates/vite/.howone/skills/impeccable/reference/critique.md +0 -273
  172. package/templates/vite/.howone/skills/impeccable/reference/delight.md +0 -302
  173. package/templates/vite/.howone/skills/impeccable/reference/distill.md +0 -111
  174. package/templates/vite/.howone/skills/impeccable/reference/document.md +0 -427
  175. package/templates/vite/.howone/skills/impeccable/reference/extract.md +0 -69
  176. package/templates/vite/.howone/skills/impeccable/reference/harden.md +0 -347
  177. package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +0 -234
  178. package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +0 -195
  179. package/templates/vite/.howone/skills/impeccable/reference/layout.md +0 -141
  180. package/templates/vite/.howone/skills/impeccable/reference/live.md +0 -622
  181. package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +0 -109
  182. package/templates/vite/.howone/skills/impeccable/reference/onboard.md +0 -234
  183. package/templates/vite/.howone/skills/impeccable/reference/optimize.md +0 -258
  184. package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +0 -130
  185. package/templates/vite/.howone/skills/impeccable/reference/personas.md +0 -179
  186. package/templates/vite/.howone/skills/impeccable/reference/polish.md +0 -242
  187. package/templates/vite/.howone/skills/impeccable/reference/product.md +0 -62
  188. package/templates/vite/.howone/skills/impeccable/reference/quieter.md +0 -99
  189. package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +0 -114
  190. package/templates/vite/.howone/skills/impeccable/reference/shape.md +0 -165
  191. package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +0 -100
  192. package/templates/vite/.howone/skills/impeccable/reference/teach.md +0 -156
  193. package/templates/vite/.howone/skills/impeccable/reference/typeset.md +0 -124
  194. package/templates/vite/.howone/skills/impeccable/reference/typography.md +0 -159
  195. package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +0 -107
  196. package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +0 -284
  197. package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +0 -94
  198. package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +0 -242
  199. package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +0 -820
  200. package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +0 -198
  201. package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +0 -21
  202. package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +0 -110
  203. package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +0 -69
  204. package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +0 -595
  205. package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +0 -123
  206. package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +0 -4860
  207. package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +0 -75
  208. package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +0 -18
  209. package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +0 -446
  210. package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +0 -200
  211. package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +0 -48
  212. package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +0 -838
  213. package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +0 -254
  214. package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +0 -47
  215. package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +0 -632
  216. package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +0 -247
  217. package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +0 -141
  218. package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +0 -14
  219. package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +0 -214
@@ -1,254 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { getLegacyLiveSessionsDir, getLiveSessionsDir } from './impeccable-paths.mjs';
4
-
5
- const COMPLETED_PHASES = new Set(['completed', 'discarded']);
6
-
7
- export function createLiveSessionStore({ cwd = process.cwd(), sessionId } = {}) {
8
- const rootDir = getLiveSessionsDir(cwd);
9
- const legacyRootDir = getLegacyLiveSessionsDir(cwd);
10
- fs.mkdirSync(rootDir, { recursive: true });
11
- const snapshotCache = new Map();
12
-
13
- function loadCachedOrRebuild(id) {
14
- const cached = snapshotCache.get(id);
15
- if (cached) return cached;
16
- const journalPath = getReadableJournalPath(id);
17
- const rebuilt = rebuildSnapshotFromJournal(journalPath, id);
18
- snapshotCache.set(id, rebuilt);
19
- return rebuilt;
20
- }
21
-
22
- function getReadableJournalPath(id) {
23
- const primary = getJournalPath(rootDir, id);
24
- if (fs.existsSync(primary)) return primary;
25
- const legacy = getJournalPath(legacyRootDir, id);
26
- if (fs.existsSync(legacy)) return legacy;
27
- return primary;
28
- }
29
-
30
- return {
31
- rootDir,
32
- legacyRootDir,
33
- appendEvent(event) {
34
- const normalized = normalizeEvent(event, sessionId);
35
- const journalPath = getJournalPath(rootDir, normalized.id);
36
- const snapshotPath = getSnapshotPath(rootDir, normalized.id);
37
- const legacyJournalPath = getJournalPath(legacyRootDir, normalized.id);
38
- if (!fs.existsSync(journalPath) && fs.existsSync(legacyJournalPath)) {
39
- fs.copyFileSync(legacyJournalPath, journalPath);
40
- }
41
- const prior = loadCachedOrRebuild(normalized.id);
42
- const seq = prior.nextSeq;
43
- const entry = {
44
- seq,
45
- id: normalized.id,
46
- type: normalized.type,
47
- ts: new Date().toISOString(),
48
- event: normalized,
49
- };
50
- fs.appendFileSync(journalPath, JSON.stringify(entry) + '\n');
51
- const next = applyEvent(prior.snapshot, entry, prior.diagnostics);
52
- snapshotCache.set(normalized.id, { snapshot: next, diagnostics: next.diagnostics || [], nextSeq: seq + 1 });
53
- writeSnapshot(snapshotPath, next);
54
- return next;
55
- },
56
- getSnapshot(id = sessionId, opts = {}) {
57
- if (!id) throw new Error('session id required');
58
- const journalPath = getReadableJournalPath(id);
59
- const snapshotPath = getSnapshotPath(rootDir, id);
60
- const rebuilt = rebuildSnapshotFromJournal(journalPath, id);
61
- snapshotCache.set(id, rebuilt);
62
- writeSnapshot(snapshotPath, rebuilt.snapshot);
63
- if (!opts.includeCompleted && COMPLETED_PHASES.has(rebuilt.snapshot.phase)) return null;
64
- return rebuilt.snapshot;
65
- },
66
- listActiveSessions() {
67
- const ids = new Set();
68
- for (const dir of [legacyRootDir, rootDir]) {
69
- if (!fs.existsSync(dir)) continue;
70
- for (const name of fs.readdirSync(dir)) {
71
- if (name.endsWith('.jsonl')) ids.add(name.slice(0, -'.jsonl'.length));
72
- }
73
- }
74
- return [...ids]
75
- .sort()
76
- .map((id) => this.getSnapshot(id))
77
- .filter(Boolean);
78
- },
79
- };
80
- }
81
-
82
- function normalizeEvent(event, fallbackId) {
83
- if (!event || typeof event !== 'object') throw new Error('event object required');
84
- const id = event.id || fallbackId;
85
- if (!id || typeof id !== 'string') throw new Error('event id required');
86
- if (!event.type || typeof event.type !== 'string') throw new Error('event type required');
87
- return { ...event, id };
88
- }
89
-
90
- function getJournalPath(rootDir, id) {
91
- return path.join(rootDir, safeSessionId(id) + '.jsonl');
92
- }
93
-
94
- function getSnapshotPath(rootDir, id) {
95
- return path.join(rootDir, safeSessionId(id) + '.snapshot.json');
96
- }
97
-
98
- function safeSessionId(id) {
99
- if (!/^[A-Za-z0-9_-]{1,128}$/.test(id)) throw new Error('invalid session id: ' + id);
100
- return id;
101
- }
102
-
103
- function baseSnapshot(id) {
104
- return {
105
- id,
106
- phase: 'new',
107
- pageUrl: null,
108
- sourceFile: null,
109
- expectedVariants: 0,
110
- arrivedVariants: 0,
111
- visibleVariant: null,
112
- paramValues: {},
113
- pendingEventSeq: null,
114
- pendingEvent: null,
115
- deliveryLease: null,
116
- checkpointRevision: 0,
117
- activeOwner: null,
118
- sourceMarkers: {},
119
- fallbackMode: null,
120
- annotationArtifacts: [],
121
- diagnostics: [],
122
- updatedAt: null,
123
- };
124
- }
125
-
126
- function rebuildSnapshotFromJournal(journalPath, id) {
127
- let snapshot = baseSnapshot(id);
128
- const diagnostics = [];
129
- let nextSeq = 1;
130
- if (!fs.existsSync(journalPath)) return { snapshot, diagnostics, nextSeq };
131
-
132
- const lines = fs.readFileSync(journalPath, 'utf-8').split('\n');
133
- for (let i = 0; i < lines.length; i++) {
134
- const line = lines[i];
135
- if (!line.trim()) continue;
136
- try {
137
- const entry = JSON.parse(line);
138
- if (!entry || typeof entry !== 'object') throw new Error('entry is not object');
139
- if (Number.isInteger(entry.seq)) nextSeq = Math.max(nextSeq, entry.seq + 1);
140
- snapshot = applyEvent(snapshot, entry);
141
- } catch (err) {
142
- diagnostics.push({
143
- error: 'journal_parse_failed',
144
- line: i + 1,
145
- message: err.message,
146
- });
147
- }
148
- }
149
- snapshot.diagnostics = [...snapshot.diagnostics, ...diagnostics];
150
- return { snapshot, diagnostics, nextSeq };
151
- }
152
-
153
- function applyEvent(snapshot, entry, inheritedDiagnostics = []) {
154
- const event = entry.event || entry;
155
- const next = {
156
- ...snapshot,
157
- paramValues: { ...(snapshot.paramValues || {}) },
158
- sourceMarkers: { ...(snapshot.sourceMarkers || {}) },
159
- annotationArtifacts: [...(snapshot.annotationArtifacts || [])],
160
- diagnostics: [...(snapshot.diagnostics || [])],
161
- updatedAt: entry.ts || new Date().toISOString(),
162
- };
163
-
164
- if (inheritedDiagnostics.length && next.diagnostics.length === 0) {
165
- next.diagnostics = [...inheritedDiagnostics];
166
- }
167
-
168
- switch (event.type) {
169
- case 'generate':
170
- next.phase = 'generate_requested';
171
- next.pageUrl = event.pageUrl ?? next.pageUrl;
172
- next.expectedVariants = event.count ?? next.expectedVariants;
173
- next.pendingEventSeq = entry.seq ?? next.pendingEventSeq;
174
- next.pendingEvent = toPendingEvent(event);
175
- if (event.screenshotPath) upsertArtifact(next.annotationArtifacts, { type: 'screenshot', path: event.screenshotPath });
176
- break;
177
- case 'variants_ready':
178
- case 'agent_done':
179
- next.phase = event.carbonize === true ? 'carbonize_required' : 'variants_ready';
180
- next.sourceFile = event.file ?? next.sourceFile;
181
- next.arrivedVariants = event.arrivedVariants ?? (next.arrivedVariants ?? next.expectedVariants);
182
- next.pendingEventSeq = null;
183
- next.pendingEvent = null;
184
- if (event.carbonize === true) {
185
- next.diagnostics.push({
186
- error: 'carbonize_cleanup_required',
187
- file: event.file || null,
188
- message: 'Accepted variant still has carbonize markers that must be folded into source CSS.',
189
- });
190
- }
191
- break;
192
- case 'checkpoint':
193
- if ((event.revision ?? 0) >= (next.checkpointRevision ?? 0)) {
194
- next.phase = event.phase ?? next.phase;
195
- next.checkpointRevision = event.revision ?? next.checkpointRevision;
196
- next.activeOwner = event.owner ?? next.activeOwner;
197
- next.arrivedVariants = event.arrivedVariants ?? next.arrivedVariants;
198
- next.visibleVariant = event.visibleVariant ?? next.visibleVariant;
199
- if (event.paramValues) next.paramValues = { ...event.paramValues };
200
- } else {
201
- next.diagnostics.push({ error: 'stale_checkpoint_ignored', revision: event.revision });
202
- }
203
- break;
204
- case 'accept':
205
- case 'accept_intent':
206
- next.phase = 'accept_requested';
207
- next.visibleVariant = Number(event.variantId ?? next.visibleVariant);
208
- if (event.paramValues) next.paramValues = { ...event.paramValues };
209
- next.pendingEventSeq = entry.seq ?? next.pendingEventSeq;
210
- next.pendingEvent = toPendingEvent(event);
211
- break;
212
- case 'discard':
213
- next.phase = 'discard_requested';
214
- next.pendingEventSeq = entry.seq ?? next.pendingEventSeq;
215
- next.pendingEvent = toPendingEvent(event);
216
- break;
217
- case 'discarded':
218
- next.phase = 'discarded';
219
- next.pendingEventSeq = null;
220
- next.pendingEvent = null;
221
- break;
222
- case 'complete':
223
- next.phase = 'completed';
224
- next.pendingEventSeq = null;
225
- next.pendingEvent = null;
226
- break;
227
- case 'agent_error':
228
- next.phase = 'agent_error';
229
- next.pendingEventSeq = null;
230
- next.pendingEvent = null;
231
- next.diagnostics.push({ error: 'agent_error', message: event.message || 'unknown agent error' });
232
- break;
233
- default:
234
- next.diagnostics.push({ error: 'unknown_event_type', type: event.type });
235
- break;
236
- }
237
- return next;
238
- }
239
-
240
- function toPendingEvent(event) {
241
- const pending = { ...event };
242
- delete pending.token;
243
- return pending;
244
- }
245
-
246
- function upsertArtifact(artifacts, artifact) {
247
- if (!artifacts.some((existing) => existing.path === artifact.path && existing.type === artifact.type)) {
248
- artifacts.push(artifact);
249
- }
250
- }
251
-
252
- function writeSnapshot(snapshotPath, snapshot) {
253
- fs.writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2) + '\n');
254
- }
@@ -1,47 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Print durable recovery status for Impeccable live sessions.
4
- */
5
-
6
- import { createLiveSessionStore } from './live-session-store.mjs';
7
- import { readLiveServerInfo } from './impeccable-paths.mjs';
8
-
9
- function readServerInfo() {
10
- return readLiveServerInfo(process.cwd())?.info || null;
11
- }
12
-
13
- async function fetchServerStatus(info) {
14
- if (!info) return null;
15
- try {
16
- const res = await fetch(`http://localhost:${info.port}/status?token=${info.token}`);
17
- if (!res.ok) return null;
18
- return await res.json();
19
- } catch {
20
- return null;
21
- }
22
- }
23
-
24
- export async function statusCli() {
25
- const info = readServerInfo();
26
- const server = await fetchServerStatus(info);
27
- const store = createLiveSessionStore({ cwd: process.cwd() });
28
- const activeSessions = store.listActiveSessions();
29
- const payload = {
30
- liveServer: server ? {
31
- status: server.status,
32
- port: server.port,
33
- connectedClients: server.connectedClients,
34
- pendingEvents: server.pendingEvents,
35
- } : null,
36
- activeSessions: server?.activeSessions || activeSessions,
37
- recoveryHint: server
38
- ? 'Run live-poll.mjs to continue pending work, or live-complete.mjs --id <session> after manual cleanup.'
39
- : 'Start live-server.mjs to requeue pending durable events, then run live-poll.mjs.',
40
- };
41
- console.log(JSON.stringify(payload, null, 2));
42
- }
43
-
44
- const _running = process.argv[1];
45
- if (_running?.endsWith('live-status.mjs') || _running?.endsWith('live-status.mjs/')) {
46
- statusCli();
47
- }