create-pmos 0.500.0 → 0.501.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-pmos",
3
- "version": "0.500.0",
3
+ "version": "0.501.0",
4
4
  "description": "Scaffold the PMOS portable kit — run the PMOS product-management workflow (initiative → lane-fit spec → contract → build → three gates, with work-type lanes for features, research, maintenance, incidents, and content) entirely inside your own repo, with all state as git-versioned files. Includes `workflow-sweep`, which audits the state every board derives from and separates real defects from work you simply have not done. `create-pmos workspace` also installs + launches the local Terminal Workspace GUI. No database, no network, no telemetry.",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -32,6 +32,19 @@
32
32
  "audit"
33
33
  ],
34
34
  "pmosChanges": [
35
+ {
36
+ "v": "0.501.0",
37
+ "at": "2026-11-03T04:44:45.129Z",
38
+ "f": 3,
39
+ "prs": [
40
+ {
41
+ "n": 1184,
42
+ "t": "Home's list toggle always opens and closes the list",
43
+ "s": "Home's list toggle always opens and closes the list",
44
+ "k": "fix"
45
+ }
46
+ ]
47
+ },
35
48
  {
36
49
  "v": "0.500.0",
37
50
  "at": "2026-11-03T04:17:03.191Z",
@@ -410,18 +423,6 @@
410
423
  "k": "fix"
411
424
  }
412
425
  ]
413
- },
414
- {
415
- "v": "0.481.0",
416
- "at": "2026-11-01T15:21:25.176Z",
417
- "f": 3,
418
- "prs": [
419
- {
420
- "n": 1141,
421
- "t": "Batch 22: feedback fixes (held for one merge)",
422
- "s": "Batch 22: feedback fixes (held for one merge)"
423
- }
424
- ]
425
426
  }
426
427
  ]
427
428
  }
@@ -1,3 +1,3 @@
1
- kernel-source: pmos@74d94d5f
1
+ kernel-source: pmos@01e14514
2
2
  assembled: 2026-11-03
3
3
  mode: vendor
@@ -2,7 +2,7 @@
2
2
  type: Reference
3
3
  title: "Eval calibration log"
4
4
  description: "Append-only record of every PM override of an evaluator verdict."
5
- generated: {by: process:create-pmos, at: "2026-11-03T04:17:00Z"}
5
+ generated: {by: process:create-pmos, at: "2026-11-03T04:44:41Z"}
6
6
  status: stable
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  type: Reference
3
3
  title: "Health budgets"
4
4
  description: "Closed registry of health-budget anchors (D59), edited only by the PM."
5
- generated: {by: process:create-pmos, at: "2026-11-03T04:17:00Z"}
5
+ generated: {by: process:create-pmos, at: "2026-11-03T04:44:41Z"}
6
6
  status: stable
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  type: Reference
3
3
  title: "Discoveries and friction log"
4
4
  description: "Append-only record of what runs discovered and where the process rubbed."
5
- generated: {by: process:create-pmos, at: "2026-11-03T04:17:00Z"}
5
+ generated: {by: process:create-pmos, at: "2026-11-03T04:44:41Z"}
6
6
  status: stable
7
7
  ---
8
8
 
@@ -1,4 +1,17 @@
1
1
  [
2
+ {
3
+ "v": "0.501.0",
4
+ "at": "2026-11-03T04:44:45.129Z",
5
+ "f": 3,
6
+ "prs": [
7
+ {
8
+ "n": 1184,
9
+ "t": "Home's list toggle always opens and closes the list",
10
+ "s": "Home's list toggle always opens and closes the list",
11
+ "k": "fix"
12
+ }
13
+ ]
14
+ },
2
15
  {
3
16
  "v": "0.500.0",
4
17
  "at": "2026-11-03T04:17:03.191Z",
@@ -109,6 +109,14 @@ Press an initiative's name in the list, or open `?ini=<id>`. The list stays as i
109
109
  - A linked Jira ticket opens in place too. Its name and status stay Jira's ("In Progress in Jira · read 4 min ago"). Its dates can change, and it can be a milestone. It has no **Delete**.
110
110
  - **Delete a task.** Press the caret under a task's box (on a phone, press and hold the box) and press the trash at the end of the status picker. The task goes at once and the message shows **Undo**. In the Task Viewer, the trash is the last icon of the Status row, and **Delete** is the last entry of its ⋯ menu. You can delete every PMOS task, also a task that Claude planned in the breakdown and a task that a stage's To finish list made. A deleted To finish task does not come back when the stage is read again or when the initiative moves back to that stage. A Jira ticket has no Delete: change it in Jira. A task deleted in a draft leaves only the draft.
111
111
 
112
+ ## Show or hide the list
113
+
114
+ The button with the panel icon shows or hides the list on the left. It works in every layout: with a Viewer open beside the chat, with a Viewer on the full screen, with two Viewers, and in a narrow window.
115
+
116
+ - When a Viewer takes the full screen, the list starts as a narrow column of group icons. Press the panel icon at its top to show the full list. The Viewer stays open and becomes narrower.
117
+ - Press the panel icon in the list's header to hide the list again.
118
+ - PMOS keeps your choice on this computer. After you show or hide the list one time, a Viewer on the full screen does not change it.
119
+
112
120
  ## Back and forward
113
121
 
114
122
  The Viewer keeps one trail on Home, the Board and Insights.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pmos-workspace",
3
- "version": "0.500.0",
3
+ "version": "0.501.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pmos-workspace",
9
- "version": "0.500.0",
9
+ "version": "0.501.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@anthropic-ai/sdk": "^1.3.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmos-workspace",
3
- "version": "0.500.0",
3
+ "version": "0.501.0",
4
4
  "private": true,
5
5
  "description": "PMOS Terminal Workspace — local companion hosting real PTYs beside the library and gates (D62)",
6
6
  "license": "MIT",
@@ -148,8 +148,11 @@ function layout() {
148
148
  if (man && !phone && !S.page) {
149
149
  const room = S.desk.clientWidth - 64 - (S.row.length - 1) * 22; // the desk less its padding and the gaps
150
150
  const list = document.getElementById('hmList'), lw = list ? list.offsetWidth || 316 : 0;
151
- const own = P.owned ? P.owned() : null; // Home owns its list's fold (batch 20 item 6): only full screen takes its room, and it comes back as it was
152
- const fold = own !== null ? own || (S.row.length === 1 && S.row[0] !== C) : !S.keepList && (!S.row.includes(C) || room - lw < S.row.length * PANEL);
151
+ // Home owns its list's fold (batch 20 item 6). A full Viewer folds it only as a starting default: never once the PM has pressed the fold or
152
+ // unfold (remembered), and not after the rail's "Show the list" in this layout (batch 25 item 12: the PM can always open or close it)
153
+ const own = P.owned ? P.owned() : null;
154
+ const startFold = !S.keepList && !(P.chosen && P.chosen()) && S.row.length === 1 && S.row[0] !== C;
155
+ const fold = own !== null ? own || startFold : !S.keepList && (!S.row.includes(C) || room - lw < S.row.length * PANEL);
153
156
  if (fold !== P.railOn()) P.rail(fold);
154
157
  }
155
158
  if (back) P.rest(); else P.relayout();
@@ -122,6 +122,8 @@ const G = { subs: [], card: null, railKey: null, rail: false, lw: 0, hold: 0, ti
122
122
  * a Viewer's width, its reset, open wide and its close never do. null: the Viewer folds the list to a rail as it needs (a page without one). */
123
123
  export function listFold(o) { G.own = o && typeof o.folded === 'function' ? o : null; }
124
124
  const owned = () => (G.own ? !!G.own.folded() : null);
125
+ /** true: the PM has pressed the list's fold or unfold, so a full Viewer keeps the list as the PM left it (no starting fold). */
126
+ const chosen = () => !!(G.own && typeof G.own.chosen === 'function' && G.own.chosen());
125
127
  const mk = (i) => ({ i, el: null, cur: null, back: null, stack: [], fwd: [], wide: false, w: 0, drill: false, over: false, used: 0, ph: false, via: '' });
126
128
  let V = mk(0);
127
129
  const ALL = [V];
@@ -279,7 +281,7 @@ function setRail(on) {
279
281
  bar.innerHTML = `<button type="button" class="cz-vw-ib" data-cz-vw-rail="show" aria-label="Show the list" title="Show the list">${svg(P.list, 18)}</button><div class="cz-vw-railtiles"></div>`;
280
282
  bar.addEventListener('click', (e) => {
281
283
  const b = e.target.closest('[data-cz-vw-rail]'); if (!b) return;
282
- if (b.dataset.czVwRail === 'show' && G.own) { if (G.own.show) G.own.show(); return; } // the page unfolds its own list
284
+ if (b.dataset.czVwRail === 'show' && G.own) { if (G.own.show) G.own.show(); if (G.rail) setRail(false); return; } // the page unfolds its own list; a layout that folded it never holds it folded
283
285
  if (b.dataset.czVwRail === 'show' && G.managed && ALL.some((x) => shown(x) && G.managed('v' + x.i))) { setRail(false); return; } // cozy-panels.js lays it out
284
286
  if (b.dataset.czVwRail === 'show') { V.wide = false; apply(Math.min(V.w, sideMax())); redraw(); return; }
285
287
  // a group's tile: the page's card of that group's rows, beside the tile (batch 18 item 14, FlA1); the rail and the Viewer stay
@@ -785,6 +787,6 @@ export const panels = {
785
787
  relayout() { ALL.filter(shown).forEach((x) => on(x, () => { apply(V.wide ? room().wideMax : V.w || room().def); redraw(); })); },
786
788
  /** Back beside the chat after the engine laid it out: the width its kind keeps, else the default. */
787
789
  rest() { ALL.filter(shown).forEach((x) => on(x, () => { const k = widthOf(V.cur.kind); V.wide = false; apply(k || room().def); redraw(); })); },
788
- rail(v) { setRail(!!v); }, railOn: () => G.rail, owned,
790
+ rail(v) { setRail(!!v); }, railOn: () => G.rail, owned, chosen,
789
791
  };
790
792
  if (typeof window !== 'undefined') window.czViewer = { open, close, back, forward, trail, replaceUrl, drill, setPresses, setChip, setCheck, isOpen, current, body, onChange, placeholder, retitle, czSummary, czSections, widthOf, setWidth, wide, railOn, railCard, railSync, keepWide, ICONS };
@@ -636,8 +636,12 @@ function drawList() {
636
636
  }
637
637
  /** The list's own fold (batch 20 item 6): kept on this computer, the one thing that folds or unfolds the list. With a Viewer open it is the rail. */
638
638
  function setFold(on) {
639
- S.folded = !!on; store.set('pmos.home.fold', on ? '1' : null); drawList();
640
- if (VW.isOpen() && VW.panels) VW.panels.relayout();
639
+ S.folded = !!on; store.set('pmos.home.fold', on ? '1' : '0'); drawList(); // '0': the PM opened it, and a full Viewer keeps it open from now on
640
+ if (VW.isOpen() && VW.panels) {
641
+ VW.panels.relayout();
642
+ // a Viewer the panels lay out (full, two side by side) does not ask the page again: the press folds or unfolds the list now, in every layout
643
+ if (VW.panels.railOn() !== (S.folded && !isPhone())) VW.panels.rail(S.folded && !isPhone());
644
+ }
641
645
  }
642
646
  /* ── the folded rail's card (batch 18 item 14, FlA1–FlA5) ──
643
647
  * With the Viewer wide, Home's list folds to a rail of group tiles (cozy-viewer.js). A tile's press opens a card beside it with that group's
@@ -1907,7 +1911,7 @@ async function todayPress(k, b) {
1907
1911
  }
1908
1912
  $('#hmDesk').insertAdjacentHTML('afterbegin', `<button type="button" class="hm-unfold" id="hmUnfold" aria-label="Show the list" title="Show the list">${SVG(I.fold, 16)}</button>`);
1909
1913
  $('#hmUnfold').onclick = () => setFold(false);
1910
- VW.listFold({ folded: () => S.folded && !isPhone(), show: () => setFold(false) });
1914
+ VW.listFold({ folded: () => S.folded && !isPhone(), chosen: () => store.get('pmos.home.fold') !== null, show: () => setFold(false) });
1911
1915
  function cta() {
1912
1916
  if (S.ini === 'product') { const C = H.productCard(S.D); if (C.sent) openUpdateViewer(); else { select('n:update'); } return; }
1913
1917
  const h = S.H || {};