create-pmos 0.10.1 → 0.11.1

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.
@@ -31,15 +31,17 @@
31
31
 
32
32
  const SIDE_MIN = 160, SIDE_MAX = 520;
33
33
  const READ_MIN = 280, READ_MAX = 1000;
34
+ const LIB_MIN = 15, LIB_MAX = 80; // the library/document divider, percent
34
35
  const BOTTOM_H = 300; // the reader's height when docked bottom
36
+ const LIB_DEFAULT = 46;
35
37
 
36
38
  // `review` is byte-for-byte the arrangement that shipped before this feature (R2): a PM who
37
39
  // never opens the layout control must see no change at all.
38
40
  const STOCK = [
39
- { id: 'focus', name: 'focus', key: 1, side: 'off', reader: 'off', split: 'off', sideW: 262, readW: 400 },
40
- { id: 'read', name: 'read', key: 2, side: 'left', reader: 'left', split: 'off', sideW: 214, readW: 760 },
41
- { id: 'compare', name: 'compare', key: 3, side: 'left', reader: 'off', split: 'on', sideW: 214, readW: 400 },
42
- { id: 'review', name: 'review', key: 4, side: 'left', reader: 'right', split: 'off', sideW: 262, readW: 400 },
41
+ { id: 'focus', name: 'focus', key: 1, side: 'off', reader: 'off', split: 'off', sideW: 262, readW: 400, libSplit: LIB_DEFAULT },
42
+ { id: 'read', name: 'read', key: 2, side: 'left', reader: 'left', split: 'off', sideW: 214, readW: 760, libSplit: LIB_DEFAULT },
43
+ { id: 'compare', name: 'compare', key: 3, side: 'left', reader: 'off', split: 'on', sideW: 214, readW: 400, libSplit: LIB_DEFAULT },
44
+ { id: 'review', name: 'review', key: 4, side: 'left', reader: 'right', split: 'off', sideW: 262, readW: 400, libSplit: LIB_DEFAULT },
43
45
  ];
44
46
  const DEFAULT_ID = 'review';
45
47
  const STOCK_IDS = STOCK.map((l) => l.id);
@@ -86,6 +88,11 @@
86
88
  split: oneOf(r.split, SPLIT, base ? base.split : 'off'),
87
89
  sideW: Math.round(clamp(num(r.sideW, base ? base.sideW : 262), SIDE_MIN, SIDE_MAX)),
88
90
  readW: Math.round(clamp(num(r.readW, base ? base.readW : 400), READ_MIN, READ_MAX)),
91
+ // the library/document divider. It lives IN the tuple rather than in localStorage because R8
92
+ // promises to carry it across the upgrade and dimension 1 counts it as "nothing lost" — a
93
+ // global client key can satisfy neither: it is not per-workspace, and it goes on being read
94
+ // from the pre-feature store on every boot, which R8 explicitly forbids.
95
+ libSplit: Math.round(clamp(num(r.libSplit, base ? base.libSplit : LIB_DEFAULT), LIB_MIN, LIB_MAX) * 10) / 10,
89
96
  folds: folds(r.folds),
90
97
  lastUsedAt: Math.max(0, Math.round(num(r.lastUsedAt, 0))),
91
98
  };
@@ -140,16 +147,26 @@
140
147
  }
141
148
 
142
149
  /* A layout that hides every pane is legal (`focus` is exactly that) — but a layout the PM
143
- cannot get OUT of is not. The header control is always rendered, so the only real dead end
144
- would be a template with no terminal track; assert it here so a future edit cannot introduce
145
- one silently (rubric dimension 1, checklist item 4). */
150
+ cannot get OUT of is not.
151
+
152
+ HONEST SCOPE, and read this before trusting it: every branch of gridFor() unconditionally
153
+ emits a `term` cell, so this can only fail if someone edits gridFor. It is a change-detector
154
+ for that one function — NOT evidence for rubric dimension 1's checklist item 4. A Review-Gate
155
+ evaluator fuzzed 38,416 layouts through it for zero failures and correctly called it vacuous.
156
+ The property item 4 actually names — the control that un-hides a pane is itself always
157
+ reachable — is a fact about the DOM (the chip lives in `.bar`, a grid sibling of `#bodyGrid`,
158
+ and the position controls in `.lay-pos` can always restore a pane), and it is asserted where
159
+ it can genuinely fail: ui-test.js walks all twelve side × reader states in a real engine. */
146
160
  function hasEscape(l) {
147
161
  return gridFor(l).areas.indexOf('term') !== -1;
148
162
  }
149
163
 
150
164
  /* R8 — carry the pre-feature client keys into this workspace's `review` so nobody's tuning is
151
165
  lost on upgrade. Reads the five localStorage values the shipped app wrote:
152
- rail(on|off) railw(<n>px) libsplit(<n>%) fold-lib(on|off) fold-doc(on|off). */
166
+ rail(on|off) railw(<n>px) libsplit(<n>%) fold-lib(on|off) fold-doc(on|off).
167
+ It formerly said "five" and read four — `libsplit` was collected by the caller and dropped
168
+ here, so R8's promise was false for it and the pre-feature key went on being read at every
169
+ boot. Review-Gate finding: the comment was the spec, and the code disagreed with it. */
153
170
  function migrateLegacy(legacy) {
154
171
  const g = (k) => (legacy && typeof legacy === 'object' ? legacy[k] : null);
155
172
  const review = stockLayout(DEFAULT_ID);
@@ -157,6 +174,8 @@
157
174
  if (railOff) review.reader = 'off';
158
175
  const w = num(String(g('railw') || '').replace('px', ''), null);
159
176
  if (w !== null) review.readW = Math.round(clamp(w, READ_MIN, READ_MAX));
177
+ const ls = num(String(g('libsplit') || '').replace('%', ''), null);
178
+ if (ls !== null) review.libSplit = Math.round(clamp(ls, LIB_MIN, LIB_MAX) * 10) / 10;
160
179
  if (g('fold-lib') === 'off') review.folds.lib = false;
161
180
  if (g('fold-doc') === 'off') review.folds.doc = false;
162
181
  const layouts = stockLayouts().map((l) => (l.id === DEFAULT_ID ? review : l));
@@ -180,7 +199,7 @@
180
199
 
181
200
  return {
182
201
  SIDE, READER, SPLIT, FOLD_KEYS, STOCK_IDS, DEFAULT_ID,
183
- SIDE_MIN, SIDE_MAX, READ_MIN, READ_MAX, BOTTOM_H,
202
+ SIDE_MIN, SIDE_MAX, READ_MIN, READ_MAX, LIB_MIN, LIB_MAX, LIB_DEFAULT, BOTTOM_H,
184
203
  isStock, stockLayout, stockLayouts, layout, sanitize, gridFor, hasEscape, migrateLegacy,
185
204
  loadAction,
186
205
  };
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pmos-workspace",
3
- "version": "0.1.0",
3
+ "version": "0.11.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pmos-workspace",
9
- "version": "0.1.0",
9
+ "version": "0.11.1",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@xterm/addon-fit": "^0.11.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmos-workspace",
3
- "version": "0.10.1",
3
+ "version": "0.11.1",
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",