create-pmos 0.60.0 → 0.60.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.
- 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/guide/layout.md +1 -1
- package/workspace/lib/kit-update.js +15 -1
- package/workspace/package-lock.json +1 -1
- package/workspace/package.json +1 -1
- package/workspace/server.js +8 -5
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-pmos",
|
|
3
|
-
"version": "0.60.
|
|
3
|
+
"version": "0.60.1",
|
|
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-06T15:
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-06T15:28:53Z"}
|
|
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-06T15:
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-06T15:28:53Z"}
|
|
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-06T15:
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-06T15:28:53Z"}
|
|
6
6
|
status: stable
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -35,7 +35,7 @@ Settings holds settings only, in seven sections:
|
|
|
35
35
|
- **Theme**: Dark or Light.
|
|
36
36
|
- **Updates**: the version of the workspace app and the version of the kit in the current repository. Press **Check for updates** to compare them with the latest published version of PMOS. This is the only time the workspace asks the internet for a version, and it asks only when you press. When a newer version is available, a button shows for each part that is older:
|
|
37
37
|
- **Update the kit** does what `npx create-pmos@latest --update` does in a terminal. It changes only the kit's own files under `pmos/` (skills, scripts, templates and guides). Your records in `state/`, `planning/` and `okf/product/` do not change. The last lines of the output show under the button. The changed files are under `pmos/`, which Sync treats as records, so Sync (or automatic sync) sends them with your other records. To read them first, look at `git diff pmos/` before you sync.
|
|
38
|
-
- **Update the workspace** does what `pmos upgrade` does in a terminal. It asks you first. The workspace stops, installs the new version and starts again, and the page reloads when the new version starts. Sessions keep running in tmux.
|
|
38
|
+
- **Update the workspace** does what `pmos upgrade` does in a terminal. It asks you first. The workspace stops, installs the new version and starts again, and the page reloads when the new version starts. Sessions keep running in tmux. It works on the computer that runs the workspace and at its Online address, because the page comes back there after the restart. It also works on a phone or public address that signs in with a token set in `PMOS_TOKEN`, which the workspace keeps. When the workspace made its own token at start, the token changes on the restart, so the page refuses and says where to press it. When the workspace runs from a PMOS checkout, update it with `git pull` instead.
|
|
39
39
|
|
|
40
40
|
Your work is never in Settings. It is in Agenda, Initiatives, Board and Reports.
|
|
41
41
|
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* compare(st, latestVersion) → { appBehind, kitBehind }
|
|
8
8
|
* updateKit(root, { version, exec }) → Promise<{ ok, output, kit } | { ok:false, error, output }>
|
|
9
9
|
* upgradeApp(root, { version, logFile, spawn }) → { ok, log } | { ok:false, error }
|
|
10
|
+
* whereFrom({ desktop, onlineHost, tokenKept }) → { ok } | { ok:false, error } may this page start the app update?
|
|
10
11
|
*
|
|
11
12
|
* The page does what the terminal does, and nothing more. Each action runs the command the README tells the PM to type:
|
|
12
13
|
* check npm view create-pmos version
|
|
@@ -133,6 +134,19 @@ async function updateKit(root, { version, exec = cp.execFile } = {}) {
|
|
|
133
134
|
return { ok: true, output, kit: readKit(root) };
|
|
134
135
|
}
|
|
135
136
|
|
|
137
|
+
/**
|
|
138
|
+
* May the page that pressed Update the workspace start it? The update stops this server and starts a new one with the
|
|
139
|
+
* same environment (create-pmos and the pmos launcher pass it on), so the page can come back when its way in survives:
|
|
140
|
+
* desktop a direct loopback request on the computer that runs the workspace
|
|
141
|
+
* onlineHost the Online address (D89): the switch is kept in the state folder and the Access sign-in is the edge's
|
|
142
|
+
* tokenKept a phone or public address signed in with a token set in PMOS_TOKEN: the new server keeps that token
|
|
143
|
+
* A token the server generated at start is new after the restart, so a page signed in with it cannot come back.
|
|
144
|
+
*/
|
|
145
|
+
function whereFrom({ desktop = false, onlineHost = false, tokenKept = false } = {}) {
|
|
146
|
+
if (desktop || onlineHost || tokenKept) return { ok: true };
|
|
147
|
+
return { ok: false, error: 'This page signed in with a token that changes when the workspace restarts, so it could not come back. Update the workspace on the computer it runs on, or at its Online address' };
|
|
148
|
+
}
|
|
149
|
+
|
|
136
150
|
/**
|
|
137
151
|
* Start the app reinstall and return at once. The child is detached from this server, because create-pmos stops this
|
|
138
152
|
* server before it reinstalls, and it starts the new one after. Its output goes to `logFile`.
|
|
@@ -158,4 +172,4 @@ function upgradeApp(root, { version, logFile, spawn = cp.spawn } = {}) {
|
|
|
158
172
|
}
|
|
159
173
|
}
|
|
160
174
|
|
|
161
|
-
module.exports = { PKG_NAME, cmpVer, validVersion, readKit, fromCheckout, status, compare, latest, updateKit, upgradeApp };
|
|
175
|
+
module.exports = { PKG_NAME, cmpVer, validVersion, readKit, fromCheckout, status, compare, latest, updateKit, upgradeApp, whereFrom };
|
package/workspace/package.json
CHANGED
package/workspace/server.js
CHANGED
|
@@ -7017,11 +7017,14 @@ async function handleRequest(req, res) {
|
|
|
7017
7017
|
return json(res, { ws: w.id, ...r, ...st() }, r.ok ? 200 : 502);
|
|
7018
7018
|
} finally { kitBusy = null; }
|
|
7019
7019
|
}
|
|
7020
|
-
// The app update stops this server and starts a new one
|
|
7021
|
-
//
|
|
7022
|
-
|
|
7023
|
-
|
|
7024
|
-
|
|
7020
|
+
// The app update stops this server and starts a new one, so the page must be able to come back (kitUpdate.whereFrom).
|
|
7021
|
+
// It is refused from a checkout, which git updates.
|
|
7022
|
+
const where = kitUpdate.whereFrom({
|
|
7023
|
+
desktop: remoteAccess.isLoopbackAddr(req.socket.remoteAddress) && !remoteAccess.isProxied(req.headers, publicHost()),
|
|
7024
|
+
onlineHost: viaOnlineHost(req.headers),
|
|
7025
|
+
tokenKept: !!TOKEN && !BIND.generated,
|
|
7026
|
+
});
|
|
7027
|
+
if (!where.ok) return json(res, { ok: false, error: where.error }, 403);
|
|
7025
7028
|
if (st().app.fromCheckout) return json(res, { ok: false, error: 'This workspace runs from a PMOS checkout. Update it with git pull' }, 409);
|
|
7026
7029
|
const r = kitUpdate.upgradeApp(w.root, { version: body.version, logFile: path.join(STATE, 'app-update.log') });
|
|
7027
7030
|
if (!r.ok) return json(res, { ok: false, error: r.error }, 400);
|