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,200 +0,0 @@
1
- /**
2
- * CLI client for the live variant mode poll/reply protocol.
3
- *
4
- * Usage:
5
- * npx impeccable poll # Block until browser event, print JSON
6
- * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly
7
- * npx impeccable poll --reply <id> done # Reply "done" to event <id>
8
- * npx impeccable poll --reply <id> error "msg" # Reply with error
9
- */
10
-
11
- import { execFileSync } from 'node:child_process';
12
- import path from 'node:path';
13
- import { fileURLToPath } from 'node:url';
14
- import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live-completion.mjs';
15
- import { readLiveServerInfo } from './impeccable-paths.mjs';
16
-
17
- // Node's built-in fetch (undici under the hood) enforces a 300s headers
18
- // timeout that can't be lowered per-request. We cap each request below
19
- // that ceiling and loop in `pollOnce` to synthesize a long poll without
20
- // depending on the standalone undici package.
21
- const PER_REQUEST_TIMEOUT_MS = 270_000;
22
-
23
- function readServerInfo() {
24
- const record = readLiveServerInfo(process.cwd());
25
- if (!record) {
26
- console.error('No running live server found. Start one with: npx impeccable live');
27
- process.exit(1);
28
- }
29
- return record.info;
30
- }
31
-
32
- export function buildPollReplyPayload(token, { id, type, message, file, data }) {
33
- return { token, id, type, message, file, data };
34
- }
35
-
36
- async function postReply(base, token, reply) {
37
- const res = await fetch(`${base}/poll`, {
38
- method: 'POST',
39
- headers: { 'Content-Type': 'application/json' },
40
- body: JSON.stringify(buildPollReplyPayload(token, reply)),
41
- });
42
- if (!res.ok) {
43
- const body = await res.json().catch(() => ({}));
44
- throw new Error(body.error || res.statusText);
45
- }
46
- }
47
-
48
- export async function pollCli() {
49
- const args = process.argv.slice(2);
50
-
51
- if (args.includes('--help') || args.includes('-h')) {
52
- console.log(`Usage: impeccable poll [options]
53
-
54
- Wait for a browser event from the live variant server, or reply to one.
55
-
56
- Modes:
57
- poll Block until a browser event arrives, print JSON
58
- poll --reply <id> done Reply "done" to event <id>
59
- poll --reply <id> error "msg" Reply with an error message
60
-
61
- Options:
62
- --timeout=MS Long-poll timeout in ms (default: 600000). Use the default unless the user asked to pause live; never use a short timeout to end the chat turn
63
- --help Show this help message`);
64
- process.exit(0);
65
- }
66
-
67
- const info = readServerInfo();
68
- const base = `http://localhost:${info.port}`;
69
-
70
- // Reply mode: npx impeccable poll --reply <id> <status> [--file path] [message]
71
- const replyIdx = args.indexOf('--reply');
72
- if (replyIdx !== -1) {
73
- const id = args[replyIdx + 1];
74
- const status = args[replyIdx + 2] || 'done';
75
- const fileIdx = args.indexOf('--file');
76
- const filePath = fileIdx !== -1 && fileIdx + 1 < args.length ? args[fileIdx + 1] : undefined;
77
- // Message is any remaining positional arg that isn't a flag
78
- const message = args.find((a, i) => i > replyIdx + 2 && !a.startsWith('--') && i !== fileIdx + 1) || undefined;
79
-
80
- if (!id) {
81
- console.error('Usage: npx impeccable poll --reply <id> <status> [--file path] [message]');
82
- process.exit(1);
83
- }
84
-
85
- try {
86
- await postReply(base, info.token, { id, type: status, message, file: filePath });
87
-
88
- // Success — silent exit (agent doesn't need output for replies)
89
- } catch (err) {
90
- if (err.cause?.code === 'ECONNREFUSED') {
91
- console.error('Live server not running. Start one with: npx impeccable live');
92
- } else {
93
- console.error('Reply failed:', err.message);
94
- }
95
- process.exit(1);
96
- }
97
- return;
98
- }
99
-
100
- // Poll mode: block until browser event. Default 10 min. Node's built-in
101
- // fetch enforces a 300s headers timeout, so we loop in slices under that
102
- // ceiling and keep re-polling until we get a real event or the user's
103
- // total timeout runs out.
104
- const timeoutArg = args.find(a => a.startsWith('--timeout='));
105
- const totalTimeout = timeoutArg ? parseInt(timeoutArg.split('=')[1], 10) : 600000;
106
-
107
- const deadline = Date.now() + totalTimeout;
108
- let event;
109
- try {
110
- while (true) {
111
- const remaining = deadline - Date.now();
112
- if (remaining <= 0) {
113
- event = { type: 'timeout' };
114
- break;
115
- }
116
- const slice = Math.min(remaining, PER_REQUEST_TIMEOUT_MS);
117
- const res = await fetch(`${base}/poll?token=${info.token}&timeout=${slice}`);
118
-
119
- if (res.status === 401) {
120
- console.error('Authentication failed. The server token may have changed.');
121
- console.error('Try restarting: npx impeccable live stop && npx impeccable live');
122
- process.exit(1);
123
- }
124
-
125
- if (!res.ok) {
126
- console.error(`Poll failed: ${res.status} ${res.statusText}`);
127
- process.exit(1);
128
- }
129
-
130
- const next = await res.json();
131
- // Server-side timeout means no browser event arrived in this slice.
132
- // Loop and re-poll until we get a real event or we hit the user's
133
- // total deadline.
134
- if (next?.type === 'timeout' && Date.now() < deadline) continue;
135
- event = next;
136
- break;
137
- }
138
-
139
- // Auto-handle accept/discard via deterministic script
140
- if (event.type === 'accept' || event.type === 'discard') {
141
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
142
- const acceptScript = path.join(__dirname, 'live-accept.mjs');
143
- const scriptArgs = event.type === 'discard'
144
- ? ['--id', event.id, '--discard']
145
- : ['--id', event.id, '--variant', event.variantId];
146
- if (event.type === 'accept' && event.paramValues && Object.keys(event.paramValues).length > 0) {
147
- scriptArgs.push('--param-values', JSON.stringify(event.paramValues));
148
- }
149
- try {
150
- const out = execFileSync(
151
- 'node',
152
- [acceptScript, ...scriptArgs],
153
- { encoding: 'utf-8', cwd: process.cwd(), timeout: 30_000 }
154
- );
155
- event._acceptResult = JSON.parse(out.trim());
156
- } catch (err) {
157
- event._acceptResult = { handled: false, mode: 'error', error: err.message };
158
- }
159
-
160
- const completionType = completionTypeForAcceptResult(event.type, event._acceptResult);
161
- try {
162
- await postReply(base, info.token, {
163
- id: event.id,
164
- type: completionType,
165
- message: event._acceptResult?.error,
166
- file: event._acceptResult?.file,
167
- data: event._acceptResult?.carbonize === true ? { carbonize: true } : undefined,
168
- });
169
- } catch (err) {
170
- event._completionAck = { ok: false, error: err.message };
171
- }
172
- if (!event._completionAck) {
173
- event._completionAck = completionAckForAcceptResult(event.id, completionType, event._acceptResult);
174
- }
175
- }
176
-
177
- // Second signal path: stderr banner in case the agent parses stdout
178
- // JSON but skips nested fields. One line is enough — the full checklist
179
- // is in reference/live.md.
180
- if (event._acceptResult?.carbonize === true) {
181
- process.stderr.write('\n⚠ Carbonize cleanup REQUIRED before next poll. After cleanup, run live-complete.mjs --id ' + event.id + '. See reference/live.md "Required after accept".\n\n');
182
- }
183
-
184
- // Print the event as JSON — the agent reads this from stdout
185
- console.log(JSON.stringify(event));
186
- } catch (err) {
187
- if (err.cause?.code === 'ECONNREFUSED') {
188
- console.error('Live server not running. Start one with: npx impeccable live');
189
- } else {
190
- console.error('Poll failed:', err.message);
191
- }
192
- process.exit(1);
193
- }
194
- }
195
-
196
- // Auto-execute when run directly
197
- const _running = process.argv[1];
198
- if (_running?.endsWith('live-poll.mjs') || _running?.endsWith('live-poll.mjs/')) {
199
- pollCli();
200
- }
@@ -1,48 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Recover the next agent action from the durable live-session journal.
4
- */
5
-
6
- import { createLiveSessionStore } from './live-session-store.mjs';
7
-
8
- function parseArgs(argv) {
9
- const out = { id: null };
10
- for (let i = 0; i < argv.length; i++) {
11
- const arg = argv[i];
12
- if (arg === '--id') out.id = argv[++i];
13
- else if (arg.startsWith('--id=')) out.id = arg.slice('--id='.length);
14
- else if (arg === '--help' || arg === '-h') out.help = true;
15
- }
16
- return out;
17
- }
18
-
19
- export async function resumeCli() {
20
- const args = parseArgs(process.argv.slice(2));
21
- if (args.help) {
22
- console.log(`Usage: node live-resume.mjs [--id SESSION_ID]\n\nPrint the active durable session checkpoint and the next safe agent action.`);
23
- return;
24
- }
25
-
26
- const store = createLiveSessionStore({ cwd: process.cwd(), sessionId: args.id || undefined });
27
- const snapshot = args.id ? store.getSnapshot(args.id) : store.listActiveSessions()[0] || null;
28
- if (!snapshot) {
29
- console.log(JSON.stringify({ active: false, nextAction: 'No active durable live session found.' }, null, 2));
30
- return;
31
- }
32
-
33
- const pending = snapshot.pendingEvent || null;
34
- const nextAction = pending
35
- ? `Run live-poll.mjs, handle ${pending.type} ${pending.id}, then acknowledge with live-poll.mjs --reply ${pending.id} done.`
36
- : snapshot.phase === 'carbonize_required'
37
- ? `Finish carbonize cleanup${snapshot.sourceFile ? ` in ${snapshot.sourceFile}` : ''}, then run live-complete.mjs --id ${snapshot.id}.`
38
- : snapshot.phase === 'accept_requested'
39
- ? `Run live-complete.mjs --id ${snapshot.id} after verifying the accepted variant is written.`
40
- : `Inspect ${snapshot.id}; no pending agent event is currently queued.`;
41
-
42
- console.log(JSON.stringify({ active: true, snapshot, pendingEvent: pending, nextAction }, null, 2));
43
- }
44
-
45
- const _running = process.argv[1];
46
- if (_running?.endsWith('live-resume.mjs') || _running?.endsWith('live-resume.mjs/')) {
47
- resumeCli();
48
- }