create-pmos 0.511.0 → 0.513.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/package.json +27 -31
  2. package/payload/KIT-VERSION +1 -1
  3. package/payload/planning/evals/eval-calibration.md +1 -1
  4. package/payload/planning/okrs/health-budgets.md +1 -1
  5. package/payload/state/discoveries.md +1 -1
  6. package/workspace/briefing-premium-adddoc-test.js +3 -3
  7. package/workspace/briefing-premium-board-test.js +2 -2
  8. package/workspace/briefing-premium-initiative-test.js +3 -3
  9. package/workspace/briefing-premium-insights-test.js +2 -2
  10. package/workspace/briefing-premium-sources-test.js +4 -5
  11. package/workspace/briefing-premium-test.js +2 -2
  12. package/workspace/changelog.json +26 -0
  13. package/workspace/fixtures/next-prompt-replay.json +40 -0
  14. package/workspace/guide/home.md +1 -1
  15. package/workspace/guide/index.md +1 -0
  16. package/workspace/guide/next-prompt.md +62 -0
  17. package/workspace/guide/settings.md +3 -1
  18. package/workspace/intel-report-ui-test.js +1 -1
  19. package/workspace/intelligence-gaps-ui-test.js +1 -1
  20. package/workspace/lib/next-prompt.js +199 -0
  21. package/workspace/lib/premium-console-type.js +15 -12
  22. package/workspace/lib/route-modules.js +1 -0
  23. package/workspace/lib/routes-next-prompt.js +248 -0
  24. package/workspace/metric-drafts-ui-test.js +2 -2
  25. package/workspace/package-lock.json +2 -2
  26. package/workspace/package.json +1 -1
  27. package/workspace/premium-menu-rows-test.js +1 -1
  28. package/workspace/premium-vw-doc-test.js +1 -1
  29. package/workspace/public/pm/bd-pin-card.css +4 -4
  30. package/workspace/public/pm/bd-publish.css +11 -11
  31. package/workspace/public/pm/bd-shared.css +17 -17
  32. package/workspace/public/pm/c3-capture.css +9 -9
  33. package/workspace/public/pm/c3-initiatives.css +23 -23
  34. package/workspace/public/pm/c3-listen.css +1 -1
  35. package/workspace/public/pm/components.css +572 -572
  36. package/workspace/public/pm/console3.css +374 -373
  37. package/workspace/public/pm/cozy-adler.css +4 -4
  38. package/workspace/public/pm/cozy-aud.css +1 -1
  39. package/workspace/public/pm/cozy-board.css +328 -328
  40. package/workspace/public/pm/cozy-ev.css +80 -78
  41. package/workspace/public/pm/cozy-home-rows.css +32 -32
  42. package/workspace/public/pm/cozy-home.css +285 -241
  43. package/workspace/public/pm/cozy-insights.css +200 -200
  44. package/workspace/public/pm/cozy-live-pill.css +5 -5
  45. package/workspace/public/pm/cozy-mtg-present.css +28 -28
  46. package/workspace/public/pm/cozy-onboard.css +15 -15
  47. package/workspace/public/pm/cozy-panel.css +39 -39
  48. package/workspace/public/pm/cozy-pick.css +5 -5
  49. package/workspace/public/pm/cozy-rec-now.css +23 -23
  50. package/workspace/public/pm/cozy-rec-present.css +11 -11
  51. package/workspace/public/pm/cozy-rec-tab.css +13 -13
  52. package/workspace/public/pm/cozy-settings.js +37 -2
  53. package/workspace/public/pm/cozy-steps.css +14 -14
  54. package/workspace/public/pm/cozy-today.css +95 -95
  55. package/workspace/public/pm/cozy-viewer.css +27 -27
  56. package/workspace/public/pm/cozy-vw-mtg.css +113 -113
  57. package/workspace/public/pm/cozy-vw-rp.css +79 -79
  58. package/workspace/public/pm/cozy-vw-shell.css +43 -43
  59. package/workspace/public/pm/cozy-vw.css +129 -129
  60. package/workspace/public/pm/cozy-xv.css +15 -15
  61. package/workspace/public/pm/cozy.css +53 -21
  62. package/workspace/public/pm/dash-view.css +27 -27
  63. package/workspace/public/pm/hi-pop.css +26 -26
  64. package/workspace/public/pm/home-chat.js +21 -4
  65. package/workspace/public/pm/home-impact.css +8 -8
  66. package/workspace/public/pm/home-ini.css +36 -36
  67. package/workspace/public/pm/home-line.css +7 -7
  68. package/workspace/public/pm/impact.css +9 -9
  69. package/workspace/public/pm/ini-view.css +243 -243
  70. package/workspace/public/pm/load-shapes.css +1 -1
  71. package/workspace/public/pm/loose-props.css +14 -14
  72. package/workspace/public/pm/metric-drafts.css +20 -20
  73. package/workspace/public/pm/ms-suggest.css +9 -9
  74. package/workspace/public/pm/next-prompt-ui.js +117 -0
  75. package/workspace/public/pm/ov-view.css +14 -14
  76. package/workspace/public/pm/premium-insights.js +3 -3
  77. package/workspace/public/pm/premium-report-frame.css +1 -1
  78. package/workspace/public/pm/premium-report-intel.css +17 -17
  79. package/workspace/public/pm/premium-report-print.css +1 -1
  80. package/workspace/public/pm/premium-vw-backlog.css +13 -13
  81. package/workspace/public/pm/premium-vw-cal.css +32 -32
  82. package/workspace/public/pm/premium-vw-copy.css +7 -7
  83. package/workspace/public/pm/premium-vw-doc.css +69 -69
  84. package/workspace/public/pm/premium-vw-item.css +12 -12
  85. package/workspace/public/pm/premium-vw-jira.css +39 -39
  86. package/workspace/public/pm/premium-vw-meet.css +28 -28
  87. package/workspace/public/pm/premium-vw-notepad.css +13 -13
  88. package/workspace/public/pm/premium-vw-notes.css +11 -11
  89. package/workspace/public/pm/premium-vw-rec.css +27 -27
  90. package/workspace/public/pm/premium-vw-report.css +21 -21
  91. package/workspace/public/pm/premium-vw-slides.css +28 -28
  92. package/workspace/public/pm/premium.css +618 -618
  93. package/workspace/public/pm/prog-order.css +6 -6
  94. package/workspace/public/pm/prog-page.css +17 -17
  95. package/workspace/public/pm/program-charter.css +33 -33
  96. package/workspace/public/pm/ready-lib.css +6 -6
  97. package/workspace/public/pm/sort-order.css +1 -1
  98. package/workspace/public/pm/split-merge.css +18 -18
  99. package/workspace/public/pm/task-card.css +24 -24
  100. package/workspace/public/pm/tk-tasks.css +42 -42
  101. package/workspace/public/pm/tk-view.css +6 -6
  102. package/workspace/public/pm/wf-page.css +31 -31
  103. package/workspace/public/premium-aud.html +1 -1
  104. package/workspace/public/premium-board.html +1 -1
  105. package/workspace/public/premium-intelligence.html +1 -1
  106. package/workspace/public/premium-rec.html +1 -1
  107. package/workspace/public/premium-viewer.html +1 -1
  108. package/workspace/public/premium-workflows.html +1 -1
  109. package/workspace/public/premium.html +1 -1
  110. package/workspace/public/vendor/plus-jakarta-sans-var.woff2 +0 -0
  111. package/workspace/server.js +1 -0
  112. package/workspace/test-lists/next-prompt.json +5 -0
  113. package/workspace/third-party/README.md +2 -1
  114. package/workspace/third-party/plus-jakarta-sans-OFL.LICENSE +93 -0
@@ -14,18 +14,18 @@
14
14
  .rxp-pop { position: fixed; z-index: 1100; left: var(--rxp-x, 16px); bottom: var(--rxp-b, 96px); width: min(360px, calc(100vw - 32px)); max-height: calc(100vh - 140px); overflow: auto;
15
15
  padding: 8px; border-radius: 18px; background: var(--cz-card); color: var(--cz-ink); box-shadow: var(--cz-lift); font-family: var(--cz-sans); }
16
16
  .rxp-pick { display: flex; flex-direction: column; }
17
- .rxp-ph { margin: 6px 10px 4px; font-size: var(--fs-2); font-weight: 700; color: var(--cz-ink2); }
17
+ .rxp-ph { margin: 6px 10px 4px; font-size: var(--fs-label); font-weight: var(--fw-strong); color: var(--cz-ink2); line-height: var(--lh-label); }
18
18
  .rxp-row { width: 100%; display: flex; align-items: center; gap: 12px; min-height: 48px; padding: 6px 10px; border: 0; border-radius: 12px; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; }
19
19
  .rxp-row:focus-visible { background: var(--cz-well); }
20
20
  @media (hover: hover) { .rxp-row:hover { background: var(--cz-well); } }
21
21
  .rxp-fi { width: 32px; height: 32px; border-radius: 10px; display: grid; place-items: center; background: var(--cz-well); color: var(--cz-ink2); flex: none; }
22
- .rxp-w { flex: 1; min-width: 0; display: flex; flex-direction: column; font-size: var(--fs-3); font-weight: 700; }
23
- .rxp-w span { font-size: var(--fs-2); font-weight: 500; color: var(--cz-ink3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
22
+ .rxp-w { flex: 1; min-width: 0; display: flex; flex-direction: column; font-size: var(--fs-row); font-weight: var(--fw-strong); line-height: var(--lh-row); }
23
+ .rxp-w span { font-size: var(--fs-meta); font-weight: var(--fw-regular); color: var(--cz-ink3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: var(--lh-meta); }
24
24
  .rxp-pick hr { border: 0; border-top: 1px solid var(--cz-hair); margin: 6px 10px; }
25
25
  .rxp-in { display: flex; align-items: center; gap: 12px; min-height: 48px; padding: 6px 10px; }
26
- .rxp-in input { flex: 1; min-width: 0; min-height: 32px; border: 0; background: transparent; font: inherit; font-size: var(--fs-3); color: var(--cz-ink); outline: none; }
26
+ .rxp-in input { flex: 1; min-width: 0; min-height: 32px; border: 0; background: transparent; font: inherit; font-size: var(--fs-body); color: var(--cz-ink); outline: none; line-height: var(--lh-body); }
27
27
  .rxp-in input::placeholder { color: var(--cz-ink3); }
28
- .rxp-none, .rxp-err { margin: 2px 10px 6px 54px; font-size: var(--fs-2); color: var(--cz-ink3); }
28
+ .rxp-none, .rxp-err { margin: 2px 10px 6px 54px; font-size: var(--fs-meta); color: var(--cz-ink3); line-height: var(--lh-meta); }
29
29
  .rxp-err { color: var(--cz-red); }
30
30
  .rxp-pop .rxp-ib { color: var(--cz-ink2); background: var(--cz-well); }
31
31
 
@@ -38,7 +38,7 @@
38
38
  .rxp-main.rxp-one { grid-template-columns: minmax(0, 1fr); }
39
39
  .rxp-they { position: relative; min-width: 0; min-height: 0; display: flex; align-items: center; justify-content: center; padding: 56px 24px 24px; border-radius: 16px; background: var(--cz-c-17191c); overflow: hidden; }
40
40
  .rxp-pill { position: absolute; left: 12px; top: 12px; z-index: 1; display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 11px; border-radius: 999px;
41
- background: var(--cz-c-2546b8); color: var(--cz-c-ffffff); font-size: var(--fs-2); font-weight: 800; }
41
+ background: var(--cz-c-2546b8); color: var(--cz-c-ffffff); font-size: var(--fs-label); font-weight: var(--fw-strong); line-height: var(--lh-label); }
42
42
  .rxp-audb { position: absolute; right: 12px; top: 10px; z-index: 1; }
43
43
  .rxp-ib { width: 40px; height: 40px; border-radius: 50%; display: inline-grid; place-items: center; flex: none; border: 0; padding: 0; cursor: pointer; background: var(--cz-c-2a2d33); color: var(--cz-c-ffffff); }
44
44
  .rxp-ib:disabled { opacity: .35; cursor: default; }
@@ -49,17 +49,17 @@
49
49
  .rxp-img { max-width: 100%; max-height: 100%; display: block; }
50
50
  .rxp-pdf { width: 100%; height: 100%; border: 0; border-radius: 6px; background: var(--cz-c-ffffff); pointer-events: none; }
51
51
  .rxp-video { width: 100%; height: 100%; object-fit: contain; display: block; }
52
- .rxp-msg { max-width: 520px; display: flex; align-items: center; gap: 14px; font-size: var(--fs-3); line-height: 1.5; color: var(--cz-c-d9dce1); }
52
+ .rxp-msg { max-width: 520px; display: flex; align-items: center; gap: 14px; font-size: var(--fs-body); line-height: 1.5; color: var(--cz-c-d9dce1); }
53
53
  .rxp-col { min-height: 0; display: flex; flex-direction: column; gap: 12px; overflow: auto; }
54
- .rxp-card { padding: 14px 14px 16px; border-radius: 14px; background: var(--cz-c-2a2d33); font-size: var(--fs-3); line-height: 1.5; }
55
- .rxp-card h4 { display: flex; align-items: center; gap: 6px; margin: 0 0 8px; font-size: var(--fs-2); font-weight: 700; color: var(--cz-c-9aa1ab); }
54
+ .rxp-card { padding: 14px 14px 16px; border-radius: 14px; background: var(--cz-c-2a2d33); font-size: var(--fs-body); line-height: 1.5; }
55
+ .rxp-card h4 { display: flex; align-items: center; gap: 6px; margin: 0 0 8px; font-size: var(--fs-label); font-weight: var(--fw-strong); color: var(--cz-c-9aa1ab); line-height: var(--lh-label); }
56
56
  .rxp-card ul { margin: 0; padding-left: 18px; }
57
57
  .rxp-card li + li { margin-top: 8px; }
58
58
  .rxp-nx { height: 160px; display: grid; place-items: center; border-radius: 10px; overflow: hidden; }
59
59
  .rxp-nav { display: flex; align-items: center; gap: 10px; min-height: 44px; }
60
- .rxp-count { min-width: 56px; text-align: center; font-size: var(--fs-3); font-weight: 800; font-variant-numeric: tabular-nums; }
60
+ .rxp-count { min-width: 56px; text-align: center; font-size: var(--fs-row); font-weight: var(--fw-strong); font-variant-numeric: tabular-nums; line-height: var(--lh-row); }
61
61
  .rxp-sp { flex: 1; }
62
- .rxp-on { font-size: var(--fs-3); font-weight: 700; color: var(--cz-c-9aa1ab); font-variant-numeric: tabular-nums; }
62
+ .rxp-on { font-size: var(--fs-row); font-weight: var(--fw-strong); color: var(--cz-c-9aa1ab); font-variant-numeric: tabular-nums; line-height: var(--lh-row); }
63
63
  .rxp-shots { display: flex; gap: 8px; }
64
64
  .rxp-shots img { width: 56px; height: 32px; object-fit: cover; border-radius: 6px; background: var(--cz-c-33363c); }
65
65
 
@@ -13,17 +13,17 @@ body.rt-page { height: 100vh; overflow: hidden; }
13
13
  .rt-hd { display: flex; align-items: center; gap: 10px; min-height: 40px; }
14
14
  .rt-dot { width: 10px; height: 10px; border-radius: 50%; background: var(--cz-dot-q); flex: none; }
15
15
  .rt[data-mode="screen"] .rt-dot, .rt[data-mode="room"] .rt-dot { background: var(--cz-dot-red); animation: rt-breathe 2.4s ease-in-out infinite; }
16
- .rt-clock { font-size: var(--fs-4); font-weight: 800; font-variant-numeric: tabular-nums; color: var(--cz-ink3); }
16
+ .rt-clock { font-size: var(--fs-row); font-weight: var(--fw-strong); font-variant-numeric: tabular-nums; color: var(--cz-ink3); line-height: var(--lh-row); }
17
17
  .rt[data-mode="screen"] .rt-clock, .rt[data-mode="room"] .rt-clock { color: var(--cz-dot-red); }
18
18
  .rt.late .rt-clock, .rt-past { color: var(--cz-dot-risk); }
19
- .rt-title { margin: 0; font-size: var(--fs-4); font-weight: 800; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
20
- .rt-past { font-size: var(--fs-3); font-weight: 700; }
19
+ .rt-title { margin: 0; font-size: var(--fs-row); font-weight: var(--fw-strong); min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: var(--lh-row); }
20
+ .rt-past { font-size: var(--fs-row); font-weight: var(--fw-strong); line-height: var(--lh-row); }
21
21
  .rt-ad { display: inline-flex; align-items: center; flex: none; } /* Adler with headphones (AdH5) */
22
22
  .rt-ad[hidden] { display: none; }
23
23
  @keyframes rt-breathe { 0%, 100% { opacity: 1 } 50% { opacity: .45 } }
24
24
  @media (prefers-reduced-motion: reduce) { .rt-dot { animation: none !important; } }
25
25
 
26
- .rt-alert { margin: 6px 0 0; display: flex; align-items: center; gap: 10px; padding: 6px 6px 6px 14px; border-radius: 14px; background: var(--cz-riskbg); color: var(--cz-risk); font-weight: 700; font-size: var(--fs-3); }
26
+ .rt-alert { margin: 6px 0 0; display: flex; align-items: center; gap: 10px; padding: 6px 6px 6px 14px; border-radius: 14px; background: var(--cz-riskbg); color: var(--cz-risk); font-weight: var(--fw-strong); font-size: var(--fs-row); line-height: var(--lh-row); }
27
27
  .rt-alert span { flex: 1; }
28
28
 
29
29
  .rt-stage { flex: 1; min-height: 0; display: flex; flex-direction: column; margin-top: 10px; position: relative; }
@@ -32,10 +32,10 @@ body.rt-page { height: 100vh; overflow: hidden; }
32
32
  .rt-scr { flex: 1; min-height: 0; border-radius: 12px; background: var(--cz-c-17191c); display: flex; align-items: center; justify-content: center; overflow: hidden; }
33
33
  .rt-scr video { max-width: 100%; max-height: 100%; display: block; }
34
34
  .rt-scr.off { flex-direction: column; gap: 12px; background: var(--cz-c-2a2d33); }
35
- .rt-scr.off p { margin: 0; font-size: var(--fs-4); font-weight: 800; color: var(--cz-c-9ea4ad); }
35
+ .rt-scr.off p { margin: 0; font-size: var(--fs-row); font-weight: var(--fw-strong); color: var(--cz-c-9ea4ad); line-height: var(--lh-row); }
36
36
  .rt-wait { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; text-align: center; }
37
- .rt-wait h2 { margin: 0; font-size: var(--fs-5); font-weight: 800; }
38
- .rt-wait p { margin: 0 0 8px; font-size: var(--fs-3); color: var(--cz-ink3); max-width: 420px; }
37
+ .rt-wait h2 { margin: 0; font-size: var(--fs-panel); font-weight: var(--fw-strong); line-height: var(--lh-panel); }
38
+ .rt-wait p { margin: 0 0 8px; font-size: var(--fs-body); color: var(--cz-ink3); max-width: 420px; line-height: var(--lh-body); }
39
39
 
40
40
  /* the meeting so far: one mark per highlight, a card with the moment on hover or focus */
41
41
  .rt-line { position: relative; height: 28px; margin: 12px 4px 0; }
@@ -46,12 +46,12 @@ body.rt-page { height: 100vh; overflow: hidden; }
46
46
  .rt-star { width: 28px; height: 28px; border: 0; padding: 0; border-radius: 50%; background: transparent; color: var(--cz-dot-risk); display: inline-flex; align-items: center; justify-content: center; cursor: pointer; }
47
47
  .rt-star svg { fill: currentColor; stroke: none; }
48
48
  .rt-star:focus-visible { outline: 2px solid var(--cz-blue); outline-offset: 1px; }
49
- .rt-hv { display: none; position: absolute; bottom: 34px; left: 50%; transform: translateX(-50%); width: 240px; padding: 10px; border-radius: 14px; background: var(--cz-card); color: var(--cz-ink); box-shadow: var(--cz-sheet); font-size: var(--fs-3); z-index: 3; flex-direction: column; gap: 4px; }
50
- .rt-hv b { font-size: var(--fs-2); color: var(--cz-ink3); }
49
+ .rt-hv { display: none; position: absolute; bottom: 34px; left: 50%; transform: translateX(-50%); width: 240px; padding: 10px; border-radius: 14px; background: var(--cz-card); color: var(--cz-ink); box-shadow: var(--cz-sheet); font-size: var(--fs-body); z-index: 3; flex-direction: column; gap: 4px; line-height: var(--lh-body); }
50
+ .rt-hv b { font-size: var(--fs-meta); color: var(--cz-ink3); line-height: var(--lh-meta); }
51
51
  .rt-hv img { width: 100%; border-radius: 8px; margin-top: 4px; display: block; }
52
52
  .rt-mk:hover .rt-hv, .rt-mk:focus-within .rt-hv { display: flex; }
53
53
 
54
- .rt-msg { margin: 8px 0 0; font-size: var(--fs-2); font-weight: 700; color: var(--cz-ink3); text-align: center; }
54
+ .rt-msg { margin: 8px 0 0; font-size: var(--fs-label); font-weight: var(--fw-strong); color: var(--cz-ink3); text-align: center; line-height: var(--lh-label); }
55
55
  .rt[data-mode="screen"] .rt-msg { color: var(--cz-c-9ea4ad); }
56
56
 
57
57
  /* the bar: icon only; Stop is the one red press */
@@ -74,10 +74,10 @@ body.rt-page { height: 100vh; overflow: hidden; }
74
74
  /* Stop asks first; the next meeting asks once */
75
75
  .rt-ask { position: fixed; inset: 0; display: flex; align-items: center; justify-content: center; background: color-mix(in srgb, var(--cz-c-17191c) 35%, transparent); z-index: 5; }
76
76
  .rt-askc { width: min(420px, calc(100vw - 32px)); box-sizing: border-box; padding: 20px; border-radius: 20px; background: var(--cz-card); color: var(--cz-ink); box-shadow: var(--cz-sheet); }
77
- .rt-askc b { font-size: var(--fs-4); }
78
- .rt-askc p { margin: 8px 0 0; font-size: var(--fs-3); color: var(--cz-ink2); }
77
+ .rt-askc b { font-size: var(--fs-body); line-height: var(--lh-body); }
78
+ .rt-askc p { margin: 8px 0 0; font-size: var(--fs-body); color: var(--cz-ink2); line-height: var(--lh-body); }
79
79
  .rt-acts { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; }
80
- .rt-t { min-height: 40px; padding: 0 16px; border-radius: 999px; border: 1px solid var(--cz-hair); background: var(--cz-card); color: var(--cz-ink); font: 700 var(--fs-3) var(--cz-sans); cursor: pointer; }
80
+ .rt-t { min-height: 40px; padding: 0 16px; border-radius: 999px; border: 1px solid var(--cz-hair); background: var(--cz-card); color: var(--cz-ink); font: var(--fw-strong) var(--fs-row)/var(--lh-row) var(--cz-sans); cursor: pointer; }
81
81
  .rt-t.red { background: var(--cz-dot-red); color: var(--cz-onsolid); border-color: transparent; }
82
82
  .rt-t.blue { background: var(--cz-solid); color: var(--cz-onsolid); border-color: transparent; }
83
83
 
@@ -3,6 +3,8 @@
3
3
  * (this device), Product (which products Home reads: the Products card), Your day (when the end-of-day card shows:
4
4
  * time.workEnd, POST /api/settings), Your impact (impact.on, POST /api/settings; canvas GmP1Switch, batch 16 item 7: the one switch
5
5
  * for Adler's leaf, the impact log and the weekly check; the page hears `pmos:impact`), Agents write to Jira (fixed: only after Commit)
6
+ * Claude the Claude profile, the API key, and Sharpen prompts: suggestions after a reply, Sharpen as I type, the style and Your own rules
7
+ * (GET/POST /api/next-prompt/prefs; batch 26 item 2)
6
8
  * Claude’s checks Grill by itself (Full, Only at stage exits, Off) and the monthly credit for checks with what this month used (grill.mode,
7
9
  * grill.cap, POST /api/settings; GET /api/grill; canvas GrillEntry). At the cap Claude pauses and says so once here.
8
10
  * Jev and Laya the TypeSafe key, Laya on this computer and the per-repository switches (pm/cozy-jl.js; canvas JlA1Empty–JlA4Phone)
@@ -262,7 +264,35 @@ function claudeSec() {
262
264
  const keyRight = `<span class="ev-dr-pl"><label class="ev-vh" for="evKey">Anthropic API key</label><input id="evKey" class="ev-inp" type="password" autocomplete="off" spellcheck="false" placeholder="${k.present ? 'Replace the key' : 'sk-ant-\u2026'}" data-ev-key><button type="button" class="ev-btn sm pri" data-ev-keysave>Save</button>${k.source === 'settings' ? '<button type="button" class="ev-btn sm" data-ev-keyclear>Remove</button>' : ''}</span>`;
263
265
  return '<h4>Claude login and profile</h4><div data-claude-setup></div>'
264
266
  + trow('API key', keySub, keyRight)
265
- + (k.present && C.off ? trow('Runs on the API', 'Off: PMOS_GRILL_API is off in the environment.', '<span class="ev-pill">Off</span>') : '');
267
+ + (k.present && C.off ? trow('Runs on the API', 'Off: PMOS_GRILL_API is off in the environment.', '<span class="ev-pill">Off</span>') : '')
268
+ + sharpenRows(k.present);
269
+ }
270
+ /* Settings › Claude › Sharpen prompts (batch 26 item 2; pm/next-prompt-ui.js, lib/routes-next-prompt.js): the suggestions after a reply, Sharpen as I
271
+ * type ('auto' is on when Claude runs on the API key, where a sharpen takes about 2 s), the style, and the PM's own rules for Your own.
272
+ * The same style and switch are in the chat's Sharper card menu; a save here tells the chat (the event pmos:prompt-prefs). */
273
+ const NPK = { 'prompt.next': ['nextSet', 'next'], 'prompt.sharpen': ['sharpenSet', 'sharpen'], 'prompt.style': ['style', 'style'], 'prompt.rules': ['rulesText', 'rules'] }; // row key → [GET field, POST key]
274
+ const setVal = (k, d) => { const v = T.np ? T.np[NPK[k][0]] : undefined; return v !== undefined && v !== null ? v : d; };
275
+ function sharpenRows(api) {
276
+ const next = setVal('prompt.next', true) !== false, sh = setVal('prompt.sharpen', 'auto'), style = setVal('prompt.style', 'engineer'), rules = String(setVal('prompt.rules', '') || '');
277
+ const on = sh === 'on' || (sh === 'auto' && api);
278
+ const shSub = sh === 'auto' ? (api ? 'On, because Claude runs on your API key: the sharper version shows in about 2 seconds.' : 'Off for now: without an API key each one takes 10 seconds or more. Turn it on to use it anyway.')
279
+ : on ? 'When you pause on a rough prompt, a sharper version shows above the box.' : 'Off. No spinner and no Sharper card.';
280
+ const styleSub = style === 'polish' ? 'Clearer and shorter, your meaning kept.' : style === 'own' ? (rules.trim() ? 'Your rules below.' : 'Write your rules below first.') : 'Builds the best prompt for the job.';
281
+ return '<h4>Sharpen prompts</h4>'
282
+ + trow('Suggest the next prompt', 'After a reply, up to two prompts above the box. A tap puts one in the box. Nothing sends.', sw(next, 'data-ev-np="prompt.next"', 'Suggest the next prompt'))
283
+ + trow('Sharpen as I type', shSub, sw(on, 'data-ev-np="prompt.sharpen"', 'Sharpen as I type'))
284
+ + trow('Sharpen as', styleSub, seg('Sharpen as', 'prompt.style', style, [['polish', 'Polish'], ['engineer', 'Prompt engineer'], ['own', 'Your own']]))
285
+ + `<div class="ev-trow"><div class="ev-tx"><label for="evRules"><b>Your own rules</b></label><p class="ev-small ev-mut">For Your own. For example: short, always name the initiative, ask for sources.</p>`
286
+ + `<textarea id="evRules" class="ev-inp ev-rules" rows="3" maxlength="1000" spellcheck="true">${esc(rules)}</textarea></div><button type="button" class="ev-btn sm pri" data-ev-rulesave>Save</button></div>`;
287
+ }
288
+ async function savePrompt(key, value, said) {
289
+ const r = await pmPost('/api/next-prompt/prefs', { key: NPK[key][1], value });
290
+ if (r && r.ok) {
291
+ T.np = { ...(T.np || {}), [NPK[key][0]]: value };
292
+ document.dispatchEvent(new CustomEvent('pmos:prompt-prefs', { detail: { key, value } }));
293
+ }
294
+ T.msg = r && r.ok ? said : (r && r.error) || 'Not saved.';
295
+ draw();
266
296
  }
267
297
  /* Settings > Claude's checks (GrillEntry): Claude grills by itself, so this is the only control: when, and how much it may spend a month */
268
298
  const CAPS = [5, 10, 20, 50];
@@ -343,6 +373,10 @@ async function press(e) {
343
373
  T.msg = r && r.ok ? (key === 'grill.mode' ? (value === 'off' ? 'Saved. Claude no longer grills by itself.' : value === 'exits' ? 'Saved. Claude grills only before a stage ends.' : 'Saved. Claude grills by itself when it matters.') : 'Saved. Claude’s checks spend at most ' + usd(value) + ' a month.') : (r && r.error) || 'Not saved.';
344
374
  draw(); return;
345
375
  }
376
+ if (t.dataset.evSeg === 'prompt.style') { await savePrompt('prompt.style', t.dataset.v, 'Saved. Sharper prompts follow this style.'); return; }
377
+ if (t.dataset.evNp === 'prompt.next') { const on = setVal('prompt.next', true) === false; await savePrompt('prompt.next', on, on ? 'Saved. Claude suggests the next prompt after a reply.' : 'Saved. No suggestions after a reply.'); return; }
378
+ if (t.dataset.evNp === 'prompt.sharpen') { const api = !!(T.cl && T.cl.key && T.cl.key.present), sh = setVal('prompt.sharpen', 'auto'), was = sh === 'on' || (sh === 'auto' && api); await savePrompt('prompt.sharpen', was ? 'off' : 'on', was ? 'Saved. Sharpen as I type is off.' : 'Saved. Sharpen as I type is on.'); return; }
379
+ if ('evRulesave' in t.dataset) { const ta = T.el.querySelector('#evRules'); await savePrompt('prompt.rules', ta ? ta.value.slice(0, 1000) : '', 'Saved. Your own rules are used when Sharpen as is Your own.'); return; }
346
380
  if (t.dataset.evSeg && t.dataset.evSeg.startsWith('adler.')) { const r = await AD.savePref(pmPost, t.dataset.evSeg, t.dataset.v); T.msg = r && r.ok ? 'Saved.' : (r && r.error) || 'Not saved.'; draw(); return; }
347
381
  if (t.dataset.evDress) {
348
382
  const a = t.dataset.evDress;
@@ -459,6 +493,7 @@ async function readAgain(id) {
459
493
  async function load() {
460
494
  readFresh();
461
495
  pmGet('/api/grill').then((g) => { T.gr = g && g.ok ? g : { ok: false, error: (g && g.error) || '' }; draw(); }).catch(() => { T.gr = { ok: false }; draw(); });
496
+ pmGet('/api/next-prompt/prefs').then((n) => { T.np = n && n.ok ? n : null; draw(); }).catch(() => { T.np = null; });
462
497
  pmGet('/api/profiles').then(async (pr) => { const k = await pmGet('/api/anthropic'); T.cl = { profiles: pr && Array.isArray(pr.profiles) ? pr.profiles : [], prefs: (pr && pr.prefs) || {}, perr: pr && pr.ok === false ? (pr.error || 'the server did not answer') : '', key: k && k.ok ? k.key : { present: false, source: null }, off: !!(k && k.off) }; draw(); }).catch(() => { T.cl = { profiles: [], prefs: {}, perr: 'the server did not answer', key: { present: false, source: null } }; draw(); });
463
498
  const [w, p, s, b] = await Promise.all([pmGet('/api/workspaces'), pmGet('/api/proactive/settings'), pmGet('/api/settings'), pmGet('/api/briefing-premium')]);
464
499
  T.ws = w && Array.isArray(w.workspaces) ? w.workspaces : [];
@@ -477,7 +512,7 @@ async function load() {
477
512
  export function openSettings(section) {
478
513
  const el = mount();
479
514
  if (section === 'dress') { T.sec = 'adler'; T.dress = true; } else if (section && BODY[section]) { T.sec = section; T.dress = false; }
480
- if (el.hidden) { const ae = document.activeElement; T.back = ae && ae !== document.body ? ae : null; T.ws = null; T.src = null; T.msg = ''; T.phase = ''; T.auto = false; T.wkOpen = new Set(); T.wkMore = new Set(); T.arc = false; T.fresh = null; T.note = {}; T.dset = {}; T.cl = null; T.gr = null; JL.reset(); }
515
+ if (el.hidden) { const ae = document.activeElement; T.back = ae && ae !== document.body ? ae : null; T.ws = null; T.src = null; T.msg = ''; T.phase = ''; T.auto = false; T.wkOpen = new Set(); T.wkMore = new Set(); T.arc = false; T.fresh = null; T.note = {}; T.dset = {}; T.cl = null; T.gr = null; T.np = null; JL.reset(); }
481
516
  el.hidden = false; document.getElementById('evStScrim').hidden = false; el.setAttribute('data-esc-layer', '');
482
517
  draw();
483
518
  const f = el.querySelector('[aria-current="page"]'); if (f) f.focus();
@@ -15,8 +15,8 @@ button.cz-st:focus-visible, .cz-sact:focus-visible, .cz-more:focus-visible, .cz-
15
15
  .cz-nd.done { background: var(--cz-bluebg); color: var(--cz-blueink); }
16
16
  .cz-nd.you { border: 2px solid var(--cz-blue); }
17
17
  .cz-nd.you::after { content: ""; position: absolute; inset: -2px; border-radius: 50%; background: var(--cz-blue); animation: cz-st-info 6s ease-out infinite; }
18
- .cz-nd.risk { border: 2px solid var(--cz-risk); color: var(--cz-risk); font-size: var(--fs-2); }
19
- .cz-nd.risk b { font-weight: 900; }
18
+ .cz-nd.risk { border: 2px solid var(--cz-risk); color: var(--cz-risk); font-size: var(--fs-meta); line-height: var(--lh-meta); }
19
+ .cz-nd.risk b { font-weight: var(--fw-strong); }
20
20
  .cz-nd.risk::after { content: ""; position: absolute; inset: -2px; border-radius: 50%; background: var(--cz-risk); animation: cz-st-warn 3.2s ease-out infinite; }
21
21
  .cz-nd.tl { border: 1.6px dashed var(--cz-sl-line); }
22
22
  .cz-nd.go { background: var(--cz-solid); color: var(--cz-onsolid); }
@@ -31,26 +31,26 @@ button.cz-st:focus-visible, .cz-sact:focus-visible, .cz-more:focus-visible, .cz-
31
31
  @media (prefers-reduced-motion: reduce) { .cz-spin svg, .cz-nd.you::after, .cz-nd.risk::after { animation: none; } .cz-nd.you::after, .cz-nd.risk::after { opacity: 0; } }
32
32
 
33
33
  /* the words */
34
- .cz-st .tx { flex: 1; min-width: 0; font-size: var(--fs-3); line-height: 1.35; padding-top: 1px; }
35
- .cz-st .tx small { display: block; font-size: var(--fs-2); color: var(--cz-ink3); font-weight: 600; margin-top: 2px; }
34
+ .cz-st .tx { flex: 1; min-width: 0; font-size: var(--fs-body); line-height: 1.35; padding-top: 1px; }
35
+ .cz-st .tx small { display: block; font-size: var(--fs-label); color: var(--cz-ink3); font-weight: var(--fw-strong); margin-top: 2px; line-height: var(--lh-label); }
36
36
  .cz-st .tx small.warn { color: var(--cz-risk); }
37
- .cz-st .tx code { display: block; margin-top: 3px; font-family: var(--cz-mono); font-size: var(--fs-1); color: var(--cz-ink3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
37
+ .cz-st .tx code { display: block; margin-top: 3px; font-family: var(--cz-mono); font-size: var(--fs-meta); color: var(--cz-ink3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: var(--lh-meta); }
38
38
  .cz-st.dn .tx { color: var(--cz-ink3); }
39
- .cz-st.now .tx .lb { font-weight: 800; }
40
- .cz-st.rk .tx .lb { font-weight: 800; }
39
+ .cz-st.now .tx .lb { font-weight: var(--fw-strong); }
40
+ .cz-st.rk .tx .lb { font-weight: var(--fw-strong); }
41
41
  .cz-st.wt .tx { color: var(--cz-ink2); }
42
42
  .cz-st.sk .tx .lb { text-decoration: line-through; color: var(--cz-ink3); }
43
- .cz-fold { align-items: center; min-height: 40px; padding-bottom: 6px; color: var(--cz-ink3); font-size: var(--fs-2); font-weight: 600; }
44
- .cz-fold .tx { font-size: var(--fs-2); color: var(--cz-ink3); padding-top: 0; }
43
+ .cz-fold { align-items: center; min-height: 40px; padding-bottom: 6px; color: var(--cz-ink3); font-size: var(--fs-label); font-weight: var(--fw-strong); line-height: var(--lh-label); }
44
+ .cz-fold .tx { font-size: var(--fs-meta); color: var(--cz-ink3); padding-top: 0; line-height: var(--lh-meta); }
45
45
  .cz-fold[aria-expanded="false"] .tx { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
46
46
  .cz-cv { display: inline-flex; color: var(--cz-ink3); margin-top: 3px; flex: none; }
47
47
  .cz-fold .cz-cv { margin-top: 0; }
48
- .cz-more { display: flex; align-items: center; min-height: 36px; width: 100%; padding: 0 0 6px 34px; font: inherit; font-size: var(--fs-2); font-weight: 700; color: var(--cz-ink2); background: transparent; border: 0; cursor: pointer; text-align: left; }
48
+ .cz-more { display: flex; align-items: center; min-height: 36px; width: 100%; padding: 0 0 6px 34px; font: inherit; font-size: var(--fs-label); font-weight: var(--fw-strong); color: var(--cz-ink2); background: transparent; border: 0; cursor: pointer; text-align: left; line-height: var(--lh-label); }
49
49
  .cz-sli:has(> .cz-more)::before { display: none; }
50
50
 
51
51
  /* the go button (the one primary), the owner, the trailing act */
52
52
  .cz-gob { flex: none; width: 32px; height: 32px; margin-top: -4px; border-radius: 50%; background: var(--cz-solid); color: var(--cz-onsolid); display: inline-flex; align-items: center; justify-content: center; }
53
- .cz-own { flex: none; width: 24px; height: 24px; margin-top: -1px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: var(--fs-1); font-weight: 800; background: var(--cz-riskbg); color: var(--cz-risk); }
53
+ .cz-own { flex: none; width: 24px; height: 24px; margin-top: -1px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: var(--fs-badge); font-weight: var(--fw-strong); background: var(--cz-riskbg); color: var(--cz-risk); line-height: var(--lh-badge); }
54
54
  .cz-own.c { background: var(--cz-solid); color: var(--cz-onsolid); }
55
55
  .cz-own.cw { background: var(--cz-well); color: var(--cz-ink2); }
56
56
  .cz-own.j { background: var(--cz-well); color: var(--cz-ink2); border-radius: 6px; }
@@ -64,9 +64,9 @@ button.cz-st:focus-visible, .cz-sact:focus-visible, .cz-more:focus-visible, .cz-
64
64
  .cz-jb + small { margin-top: 4px !important; }
65
65
 
66
66
  /* the last node: the next stage, then the button when every step is done */
67
- .cz-st.mv .tx .nm { display: flex; align-items: center; gap: 6px; font-weight: 800; color: var(--cz-ink); }
68
- .cz-st.mv .tx small { font-weight: 600; }
67
+ .cz-st.mv .tx .nm { display: flex; align-items: center; gap: 6px; font-weight: var(--fw-strong); color: var(--cz-ink); }
68
+ .cz-st.mv .tx small { font-weight: var(--fw-strong); }
69
69
  .cz-auto { display: inline-flex; color: var(--cz-blue); }
70
70
  .cz-st.mvr { align-items: center; padding-bottom: 4px; }
71
- .cz-mvb { flex: 1; min-height: 44px; border-radius: 14px; background: var(--cz-solid); color: var(--cz-onsolid); font: inherit; font-weight: 800; font-size: var(--fs-3); display: inline-flex; align-items: center; justify-content: center; gap: 8px; border: 0; cursor: pointer; padding: 0 16px; }
71
+ .cz-mvb { flex: 1; min-height: 44px; border-radius: 14px; background: var(--cz-solid); color: var(--cz-onsolid); font: inherit; font-weight: var(--fw-strong); font-size: var(--fs-row); display: inline-flex; align-items: center; justify-content: center; gap: 8px; border: 0; cursor: pointer; padding: 0 16px; line-height: var(--lh-row); }
72
72
  .cz-mvb span { display: inline-flex; align-items: center; gap: 4px; }