create-pmos 0.101.0 → 0.102.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 +1 -1
- 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/lib/kit-update.js +15 -1
- package/workspace/package-lock.json +2 -2
- package/workspace/package.json +1 -1
- package/workspace/public/pm/dest-settings.js +10 -5
- package/workspace/public/pm/panel-cockpit.js +6 -2
- package/workspace/public/pm/view-notes-menu.js +2 -5
- package/workspace/server.js +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-pmos",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.102.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": {
|
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-10-08T00:
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-08T00:36:21Z"}
|
|
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-10-08T00:
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-08T00:36:21Z"}
|
|
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-10-08T00:
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-08T00:36:21Z"}
|
|
6
6
|
status: stable
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -166,6 +166,20 @@ async function latest({ exec = cp.execFile, source: src = source() } = {}) {
|
|
|
166
166
|
return { ok: true, version: v };
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
+
/** Check the local repository's package version (for dev/testing without npm). Reads npm-pkg/package.json for kit. */
|
|
170
|
+
function latestLocal({ repoRoot = null } = {}) {
|
|
171
|
+
try {
|
|
172
|
+
const pkgPath = path.join(String(repoRoot || ''), 'npm-pkg', 'package.json');
|
|
173
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
174
|
+
if (!pkg.version || !validVersion(pkg.version)) {
|
|
175
|
+
return { ok: false, error: 'Local package.json has no valid version' };
|
|
176
|
+
}
|
|
177
|
+
return { ok: true, version: pkg.version, source: 'local-git' };
|
|
178
|
+
} catch (e) {
|
|
179
|
+
return { ok: false, error: `Could not read local version: ${e.message}` };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
169
183
|
/**
|
|
170
184
|
* npm lists a new version in the check a moment before its download is served everywhere. A download asked for in that
|
|
171
185
|
* gap answers 404, and npm's CDN keeps the 404 for up to five minutes (Cache-Control max-age=300), so the same press
|
|
@@ -250,4 +264,4 @@ function upgradeApp(root, { version, logFile, spawn = cp.spawn, env = updateEnv(
|
|
|
250
264
|
}
|
|
251
265
|
}
|
|
252
266
|
|
|
253
|
-
module.exports = { PKG_NAME, cmpVer, notServedYet, validVersion, source, npxArgs, readKit, fromCheckout, status, compare, latest, updateKit, updateEnv, upgradeApp, whereFrom };
|
|
267
|
+
module.exports = { PKG_NAME, cmpVer, notServedYet, validVersion, source, npxArgs, readKit, fromCheckout, status, compare, latest, latestLocal, updateKit, updateEnv, upgradeApp, whereFrom };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pmos-workspace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.102.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.102.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@xterm/addon-fit": "^0.11.0",
|
package/workspace/package.json
CHANGED
|
@@ -395,12 +395,12 @@ function readKitStatus(ws, force) {
|
|
|
395
395
|
|
|
396
396
|
const say = (fields) => { Object.assign(upd, fields); setState({}); };
|
|
397
397
|
|
|
398
|
-
async function checkUpdates(ws) {
|
|
398
|
+
async function checkUpdates(ws, local) {
|
|
399
399
|
say({ phase: 'check', message: '', error: '', output: '' });
|
|
400
|
-
const j = await pmPost('/api/kit/check', { ws });
|
|
400
|
+
const j = await pmPost('/api/kit/check', { ws, local });
|
|
401
401
|
if (j && j.ok !== false) {
|
|
402
402
|
kitByWs.set(ws, { st: j, at: Date.now() });
|
|
403
|
-
say({ phase: null, latest: j.latest, compare: { appBehind: !!j.appBehind, kitBehind: !!j.kitBehind } });
|
|
403
|
+
say({ phase: null, latest: j.latest, compare: { appBehind: !!j.appBehind, kitBehind: !!j.kitBehind }, source: j.source });
|
|
404
404
|
} else say({ phase: null, error: (j && j.error) || P.updateFailed });
|
|
405
405
|
}
|
|
406
406
|
|
|
@@ -480,9 +480,14 @@ function updatesSection(scope) {
|
|
|
480
480
|
onClick: () => updateAll(ws, app, { appBehind: !!cmp.appBehind, kitBehind: !!cmp.kitBehind && kitPresent }),
|
|
481
481
|
})));
|
|
482
482
|
}
|
|
483
|
+
kids.push(el('div', { class: 'fr-set__line' }, el('label', { class: 'fr-set__checkbox' },
|
|
484
|
+
el('input', { type: 'checkbox', checked: !!upd.checkLocal, onChange: (e) => { upd.checkLocal = e.target.checked; setState({}); } }),
|
|
485
|
+
el('span', null, 'Check local git version')
|
|
486
|
+
)));
|
|
483
487
|
const line = upd.phase === 'check' ? P.updatesChecking : upd.phase === 'kit' ? P.updateKitBusy
|
|
484
488
|
: upd.message ? upd.message : upd.latest ? (cmp.appBehind || cmp.kitBehind ? P.updatesLatest(upd.latest) : P.updatesCurrent(upd.latest)) : P.updatesNever;
|
|
485
|
-
|
|
489
|
+
const sourceNote = upd.source === 'local-git' ? ' (from local git)' : upd.source ? ` (from ${upd.source})` : '';
|
|
490
|
+
kids.push(el('p', { class: 'fr-set__note', role: 'status', 'aria-live': 'polite', 'data-fr': 'update-state' }, line + sourceNote));
|
|
486
491
|
if (upd.error) kids.push(el('p', { class: 'fr-set__note fr-set__error', role: 'alert', 'data-fr': 'update-error' }, upd.error));
|
|
487
492
|
if (upd.output) kids.push(el('pre', { class: 'fr-set__output', 'data-fr': 'update-output' }, upd.output));
|
|
488
493
|
kids.push(el('p', { class: 'fr-set__note' }, P.updatesNote));
|
|
@@ -495,7 +500,7 @@ function checkButton(scope) {
|
|
|
495
500
|
const ws = wsOfRepo(repo) || wsOfRepo(activeProduct());
|
|
496
501
|
return button({
|
|
497
502
|
label: P.updatesCheck, variant: 'outline', size: 'sm', icon: 'refresh-cw', disabled: !!upd.phase || !ws,
|
|
498
|
-
attrs: { 'data-fr': 'check-updates' }, onClick: () => checkUpdates(ws),
|
|
503
|
+
attrs: { 'data-fr': 'check-updates' }, onClick: () => checkUpdates(ws, upd.checkLocal),
|
|
499
504
|
});
|
|
500
505
|
}
|
|
501
506
|
|
|
@@ -124,8 +124,12 @@ export function mountView(host, tab) {
|
|
|
124
124
|
if (!v) inner.appendChild(el('div', { style: 'color:var(--muted-foreground);font-size:12px' }, 'this view is not known to this version'));
|
|
125
125
|
else if (board) {
|
|
126
126
|
inner.style.maxWidth = 'none';
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
const ctx = { tab, view: tab.view, renderMode, ready: !v.mode || !!m, el, setChildren, state, setState, FIXTURE, openView, repo: currentProduct() };
|
|
128
|
+
board.renderBoard(inner, ctx)
|
|
129
|
+
.then((boardEl) => {
|
|
130
|
+
if (boardEl) setChildren(inner, [boardEl]);
|
|
131
|
+
})
|
|
132
|
+
.catch((e) => { console.error('[pm] board ' + tab.view + ' failed:', e); renderMode(inner); });
|
|
129
133
|
} else if (boardMods[tab.view] === null) {
|
|
130
134
|
// the board module is still loading: draw nothing rather than flash the old list
|
|
131
135
|
} else if (m && typeof m.renderMode === 'function') {
|
|
@@ -54,12 +54,9 @@ function groupByInitiative(notes) {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
function renderNoteRow(note, isSelected, onClick) {
|
|
57
|
-
const
|
|
58
|
-
const summaryText =
|
|
59
|
-
.split('\n')
|
|
57
|
+
const summaryLines = (note.summary_lines || []);
|
|
58
|
+
const summaryText = summaryLines
|
|
60
59
|
.slice(0, 2)
|
|
61
|
-
.map((line) => line.trim())
|
|
62
|
-
.filter(Boolean)
|
|
63
60
|
.join(' ')
|
|
64
61
|
.substring(0, 60);
|
|
65
62
|
|
package/workspace/server.js
CHANGED
|
@@ -7329,12 +7329,12 @@ async function handleRequest(req, res) {
|
|
|
7329
7329
|
// the page did not show.
|
|
7330
7330
|
const w = body.ws ? workspaces.get(String(body.ws)) : null;
|
|
7331
7331
|
if (!w) return json(res, { ok: false, error: 'no such workspace' }, 400);
|
|
7332
|
-
const st = () => kitUpdate.status({ root: w.root, appVersion: APP_VERSION, appDir: __dirname });
|
|
7332
|
+
const st = () => kitUpdate.status({ root: w.root, appVersion: APP_VERSION, appDir: __dirname, env: process.env });
|
|
7333
7333
|
if (p === '/api/kit/check') {
|
|
7334
7334
|
const r = await kitUpdate.latest({ source: kitUpdate.source() });
|
|
7335
7335
|
const now = st();
|
|
7336
7336
|
if (!r.ok) return json(res, { ok: false, error: r.error, ws: w.id, ...now }, 502);
|
|
7337
|
-
return json(res, { ok: true, ws: w.id, ...now, latest: r.version, ...kitUpdate.compare(now, r.version) });
|
|
7337
|
+
return json(res, { ok: true, ws: w.id, ...now, latest: r.version, source: r.source || 'npm', ...kitUpdate.compare(now, r.version) });
|
|
7338
7338
|
}
|
|
7339
7339
|
if (kitBusy) return json(res, { ok: false, error: kitBusy === 'app' ? 'The workspace is already updating' : 'A kit update is already running' }, 409);
|
|
7340
7340
|
if (p === '/api/kit/update') {
|