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 +14 -13
- package/payload/KIT-VERSION +1 -1
- package/payload/planning/evals/eval-calibration.md +1 -1
- package/payload/planning/okrs/health-budgets.md +1 -1
- package/payload/state/discoveries.md +1 -1
- package/workspace/changelog.json +13 -0
- package/workspace/guide/home.md +8 -0
- package/workspace/package-lock.json +2 -2
- package/workspace/package.json +1 -1
- package/workspace/public/pm/cozy-panels.js +5 -2
- package/workspace/public/pm/cozy-viewer.js +4 -2
- package/workspace/public/pm/home-app.js +7 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-pmos",
|
|
3
|
-
"version": "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
|
}
|
package/payload/KIT-VERSION
CHANGED
|
@@ -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:
|
|
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:
|
|
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:
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-11-03T04:44:41Z"}
|
|
6
6
|
status: stable
|
|
7
7
|
---
|
|
8
8
|
|
package/workspace/changelog.json
CHANGED
|
@@ -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",
|
package/workspace/guide/home.md
CHANGED
|
@@ -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.
|
|
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.
|
|
9
|
+
"version": "0.501.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@anthropic-ai/sdk": "^1.3.0",
|
package/workspace/package.json
CHANGED
|
@@ -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
|
-
|
|
152
|
-
|
|
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' :
|
|
640
|
-
if (VW.isOpen() && VW.panels)
|
|
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 || {};
|