create-pmos 0.494.0 → 0.496.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 (80) hide show
  1. package/package.json +75 -27
  2. package/payload/AGENTS.md +2 -0
  3. package/payload/KIT-VERSION +2 -2
  4. package/payload/planning/evals/eval-calibration.md +1 -1
  5. package/payload/planning/okrs/health-budgets.md +1 -1
  6. package/payload/state/discoveries.md +1 -1
  7. package/payload/state/log.md +1 -1
  8. package/workspace/adler-moments-test.js +3 -1
  9. package/workspace/board-programs-test.js +6 -6
  10. package/workspace/board-shared-ui-test.js +2 -2
  11. package/workspace/briefing-premium-adddoc-test.js +3 -49
  12. package/workspace/briefing-premium-board-test.js +23 -23
  13. package/workspace/briefing-premium-initiative-test.js +2 -1
  14. package/workspace/changelog.json +74 -0
  15. package/workspace/guide/adler.md +1 -1
  16. package/workspace/guide/briefing-premium.md +3 -1
  17. package/workspace/guide/claude-proposes.md +6 -2
  18. package/workspace/guide/data-freshness.md +2 -0
  19. package/workspace/guide/home.md +1 -1
  20. package/workspace/guide/initiatives-screen.md +1 -1
  21. package/workspace/guide/published-board.md +1 -1
  22. package/workspace/guide/report-slides.md +6 -6
  23. package/workspace/guide/reports.md +1 -1
  24. package/workspace/guide/workflows.md +18 -5
  25. package/workspace/ini-workflow-test.js +2 -1
  26. package/workspace/lib/board-premium.js +17 -2
  27. package/workspace/lib/engine/workflows.js +19 -6
  28. package/workspace/lib/initiative-chat.js +4 -1
  29. package/workspace/lib/initiative-cli.js +15 -1
  30. package/workspace/lib/open-mission.js +14 -0
  31. package/workspace/lib/proposals.js +18 -4
  32. package/workspace/lib/report-export.js +5 -3
  33. package/workspace/lib/report-pyramid.js +134 -33
  34. package/workspace/lib/report-templates.js +33 -3
  35. package/workspace/lib/routes-board-premium.js +2 -2
  36. package/workspace/lib/routes-boards.js +35 -2
  37. package/workspace/lib/routes-brief-page.js +2 -1
  38. package/workspace/lib/routes-initiatives.js +1 -0
  39. package/workspace/lib/routes-proposals.js +14 -2
  40. package/workspace/lib/routes-report-design.js +1 -1
  41. package/workspace/lib/routes-report-flow.js +11 -4
  42. package/workspace/lib/routes-report-setups.js +3 -2
  43. package/workspace/lib/routes-workflows.js +6 -1
  44. package/workspace/lib/split-merge-suggest.js +37 -3
  45. package/workspace/lib/split-merge.js +10 -4
  46. package/workspace/lib/task-cli.js +5 -1
  47. package/workspace/lib/workflow-cli.js +70 -15
  48. package/workspace/lib/workflows-store.js +15 -1
  49. package/workspace/metric-drafts-ui-test.js +2 -1
  50. package/workspace/package-lock.json +2 -2
  51. package/workspace/package.json +1 -1
  52. package/workspace/premium-board-actions-test.js +9 -10
  53. package/workspace/premium-core-doc-issue-test.js +9 -38
  54. package/workspace/premium-vw-backlog-test.js +3 -2
  55. package/workspace/premium-vw-item-test.js +3 -2
  56. package/workspace/premium-vw-jira-test.js +3 -2
  57. package/workspace/program-panel-test.js +2 -1
  58. package/workspace/public/pm/cozy-board.css +17 -5
  59. package/workspace/public/pm/cozy-home.css +1 -0
  60. package/workspace/public/pm/home-app.js +15 -5
  61. package/workspace/public/pm/home-chat.js +49 -8
  62. package/workspace/public/pm/home-today.js +11 -4
  63. package/workspace/public/pm/ini-view.js +2 -2
  64. package/workspace/public/pm/load-shapes.css +57 -0
  65. package/workspace/public/pm/load-shapes.js +57 -0
  66. package/workspace/public/pm/premium-board.js +82 -57
  67. package/workspace/public/pm/premium-shell.js +57 -6
  68. package/workspace/public/pm/premium.css +1 -0
  69. package/workspace/public/pm/readonly.js +3 -3
  70. package/workspace/public/pm/split-merge.js +3 -2
  71. package/workspace/public/pm/wf-page.css +8 -0
  72. package/workspace/public/pm/wf-page.js +33 -5
  73. package/workspace/public/premium-board.html +7 -10
  74. package/workspace/public/premium.html +1 -0
  75. package/workspace/skills/report-template.skill +4 -2
  76. package/workspace/split-merge-ui-test.js +4 -3
  77. package/workspace/stage-card-test.js +2 -1
  78. package/workspace/task-press-test.js +2 -1
  79. package/workspace/test-lists/page-open-speed.json +1 -1
  80. package/workspace/tk-tasks-test.js +2 -1
@@ -46,7 +46,9 @@ When the lines after this procedure say "This report has a saved structure" (a s
46
46
  When the lines after this procedure name a draft and a change ("The draft: <path> (slot <slot>)" and "The change the PM asked for"), this run is a change, not a new cycle. Steps 4 to 6 change as follows, and every rule stays:
47
47
  - Work on THAT file only. Do not draft a new slot. Never run `pmos report draft <id>` without the slot: it drafts today's slot, which is a second file.
48
48
  - If the named file does not exist, stop and say so in one line. Do not write it yourself.
49
- - A change to the words: rewrite the note or notes that the change is about, even when they already have text. Keep every other note as it is. Rules 3, 6 and 7 still apply.
49
+ - A change to the words: edit only the note or notes that the change is about, in the file, between their markers, even when they already have text. Keep every other note and every line outside the notes as it is. Rules 3, 6 and 7 still apply.
50
+ - Do NOT redraft for a change to the words. A redraft reads today's data and rewrites every block, so the numbers, the block titles and the place of the notes can change. Run `pmos report draft <id> <slot> --redraft`, with the slot from the lines, only when the PM asks for fresh numbers (for example "refresh", "update the numbers", "use today's data"). Then read the file once more.
51
+ - KEEP EVERY CAVEAT. A sentence that says something is provisional, not decided, unverified, at risk, not reached or a warning stays, word for word, also when the change asks for shorter text. Make the other sentences shorter. If the change cannot be made without removing a caveat, keep the caveat and say so.
50
52
  - A change to a number, a date, a section, a slide or the order: you cannot make it, because the script writes every number and the template sets the sections (rules 6 and 7). Change nothing. Say in one line which setting it needs: a structured report changes in the studio (it applies from the next cycle); other reports change in the template.
51
- - Then run `pmos report draft <id> <slot> --redraft`, with the slot from the lines, so the script rewrites the file, keeps every note and writes every number. Read the file once more.
53
+ - When you finish, say in one line which notes you changed, and quote each sentence you removed.
52
54
  - A message that starts with `[PMOS report change]` is the same: it names the draft, its slot and the change.
@@ -14,6 +14,7 @@ const fs = require('fs');
14
14
  const path = require('path');
15
15
  const { spawn } = require('child_process');
16
16
  const { findBrowser } = require('./lib/find-browser');
17
+ const { openMission } = require('./lib/open-mission');
17
18
  const T = require('./test-run').configure({ name: 'split-merge-ui' });
18
19
  const { makeRepos, codeRepo, write, git } = require('./plan-test-repos');
19
20
 
@@ -68,7 +69,7 @@ const shot = (p, name) => (SHOTS ? p.screenshot({ path: path.join(SHOTS, name) }
68
69
 
69
70
  browser = await chromium.launch({ executablePath: exe });
70
71
  const open = async (o = {}) => {
71
- const ctx = await browser.newContext({ viewport: { width: o.w || 1440, height: o.h || 900 } });
72
+ const ctx = await openMission(await browser.newContext({ viewport: { width: o.w || 1440, height: o.h || 900 } }));
72
73
  const page = await ctx.newPage();
73
74
  const errors = [];
74
75
  page.on('pageerror', (e) => errors.push(String((e && e.stack) || e)));
@@ -133,7 +134,7 @@ const shot = (p, name) => (SHOTS ? p.screenshot({ path: path.join(SHOTS, name) }
133
134
 
134
135
  /* H — the merged one on Home */
135
136
  {
136
- const ctx = await browser.newContext({ viewport: { width: 1440, height: 900 } });
137
+ const ctx = await openMission(await browser.newContext({ viewport: { width: 1440, height: 900 } }));
137
138
  const p = await ctx.newPage();
138
139
  const errors = [];
139
140
  p.on('pageerror', (e) => errors.push(String((e && e.message) || e)));
@@ -166,7 +167,7 @@ const shot = (p, name) => (SHOTS ? p.screenshot({ path: path.join(SHOTS, name) }
166
167
  await shot(p, 'phone-suggest.png');
167
168
  await p.click('#czViewer [data-sm="no"]');
168
169
  const t = await until(async () => { const x = await toast(p); return /^Not now/.test(x) ? x : null; });
169
- ok('P ✕ Not now: the toast says Claude asks again when the tasks change', /^Not now/.test(t || ''), t);
170
+ ok('P ✕ Not now: the toast says Claude will not suggest it again', /^Not now/.test(t || ''), t);
170
171
  ok('P ✕ Not now hides the card and the dot', await until(() => p.evaluate(() => !document.querySelector('#czViewer .sm-card') && !document.querySelector('#ibBody .sm-dot')), 20000));
171
172
  ok('P no page error', !errors.length, errors.join(' | '));
172
173
  await ctx.close();
@@ -13,6 +13,7 @@ const fs = require('fs');
13
13
  const { spawn } = require('child_process');
14
14
  const { pathToFileURL } = require('url');
15
15
  const { findBrowser } = require('./lib/find-browser');
16
+ const { openMission } = require('./lib/open-mission');
16
17
  const T = require('./test-run').configure({ name: 'stage-card' });
17
18
  const IP = require('./lib/initiative-premium.js');
18
19
  const F = require('./fixtures/initiative-premium-facts.js');
@@ -100,7 +101,7 @@ async function pure() {
100
101
  // the board the page reads (the one view draws the board's row): the scenario's stage, so the page and the board agree as the records do
101
102
  const boardAt = (stage) => { const f = BF.facts(); f.rows = f.rows.map((r) => (r.id === 'self-serve-v2' ? { ...r, stage } : r)); return BP.build(f); };
102
103
  const open = async ({ w = 1280, h = 900, theme = 'light', model = SCEN.build(), board = BOARD, sessions = null, trail = null } = {}) => {
103
- const ctx = await browser.newContext({ viewport: { width: w, height: h } });
104
+ const ctx = await openMission(await browser.newContext({ viewport: { width: w, height: h } }));
104
105
  const page = await ctx.newPage();
105
106
  const errors = [], posts = [];
106
107
  page.on('pageerror', (e) => errors.push(String(e)));
@@ -10,6 +10,7 @@
10
10
  const path = require('path');
11
11
  const { spawn } = require('child_process');
12
12
  const { findBrowser } = require('./lib/find-browser');
13
+ const { openMission } = require('./lib/open-mission');
13
14
  const T = require('./test-run').configure({ name: 'task-press' });
14
15
  const IP = require('./lib/initiative-premium.js');
15
16
  const F = require('./fixtures/initiative-premium-facts.js');
@@ -47,7 +48,7 @@ const json = (r, b, status = 200) => r.fulfill({ status, contentType: 'applicati
47
48
  const shot = async (p, name) => { if (SHOTS) await p.screenshot({ path: path.join(SHOTS, name) }).catch(() => {}); };
48
49
 
49
50
  async function page(url) {
50
- const ctx = await browser.newContext({ viewport: { width: 1440, height: 900 } });
51
+ const ctx = await openMission(await browser.newContext({ viewport: { width: 1440, height: 900 } }));
51
52
  const p = await ctx.newPage();
52
53
  const errors = [], posts = [];
53
54
  p.on('pageerror', (e) => errors.push(String((e && e.message) || e)));
@@ -1,5 +1,5 @@
1
1
  {
2
- "_comment": "Page open speed (2026-11-02): the file-stamp caches that replace git runs on a page open stay as fresh as a git run; the start-up warm-up can be turned off and asks one path at a time.",
2
+ "_comment": "Page open speed (2026-11-02): the file-stamp caches that replace git runs on a page open stay as fresh as a git run; the start-up warm-up can be turned off and asks one path at a time; the loading shapes claim nothing and the last view kept is capped.",
3
3
  "modules": ["page-open-speed.test.js"],
4
4
  "seconds": { "page-open-speed.test.js": 2 }
5
5
  }
@@ -12,6 +12,7 @@ const fs = require('fs');
12
12
  const path = require('path');
13
13
  const { spawn } = require('child_process');
14
14
  const { findBrowser } = require('./lib/find-browser');
15
+ const { openMission } = require('./lib/open-mission');
15
16
  const T = require('./test-run').configure({ name: 'tk-tasks' });
16
17
  const IP = require('./lib/initiative-premium.js');
17
18
  const F = require('./fixtures/initiative-premium-facts.js');
@@ -79,7 +80,7 @@ const LAYOUT = { ok: true, auto: true, held: [], by: 'stage', names: [], of: {},
79
80
 
80
81
  // the layout answers like lib/initiative-layout.js folds it: a press changes it, and the next read sees the change
81
82
  const open = async ({ w = 1440, h = 900, theme = 'light', view = VIEW, layout = {}, page: pg = 'home', touch = false } = {}) => {
82
- const ctx = await browser.newContext({ viewport: { width: w, height: h }, hasTouch: touch, isMobile: touch });
83
+ const ctx = await openMission(await browser.newContext({ viewport: { width: w, height: h }, hasTouch: touch, isMobile: touch }));
83
84
  const page = await ctx.newPage();
84
85
  const errors = [], posts = [];
85
86
  let cur = view, L = { ...LAYOUT, ...layout };