create-pmos 0.121.0 → 0.123.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 +2 -2
- 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/payload/state/log.md +1 -1
- package/workspace/guide/notes.md +2 -2
- package/workspace/package-lock.json +2 -2
- package/workspace/package.json +1 -1
- package/workspace/public/pm/view-notes.js +5 -4
- package/workspace/server.js +5 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-pmos",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.123.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
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
kernel-source: pmos@
|
|
2
|
-
assembled: 2026-10-
|
|
1
|
+
kernel-source: pmos@d13a7b9
|
|
2
|
+
assembled: 2026-10-09
|
|
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-10-
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-09T03:00:14Z"}
|
|
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-
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-09T03:00:14Z"}
|
|
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-
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-09T03:00:14Z"}
|
|
6
6
|
status: stable
|
|
7
7
|
---
|
|
8
8
|
|
package/payload/state/log.md
CHANGED
package/workspace/guide/notes.md
CHANGED
|
@@ -62,8 +62,8 @@ The Notes view shows one meeting, top to bottom. A bar at the top shows whether
|
|
|
62
62
|
|
|
63
63
|
1. Press **Listen**. Select what to listen to:
|
|
64
64
|
- **My microphone**: what you say.
|
|
65
|
-
- **The meeting**: the other people in an online meeting.
|
|
66
|
-
2. Press **Start**. The header shows a red dot, the time, and the sources. Tell people that you are taking notes. If the meeting stays completely silent for 20 seconds while your microphone works, a red message says that the other people are not being recorded. Most often the sharing window had the wrong
|
|
65
|
+
- **The meeting**: the other people in an online meeting. The meeting can be in any app, such as Zoom, or in any browser tab. In the sharing window, choose **Entire screen** and tick **Also share system audio**, so that the sound of every app is recorded. To record one browser tab, choose that tab and tick **Share tab audio**. Chrome offers system audio on Windows and ChromeOS; on macOS use a tab.
|
|
66
|
+
2. Press **Start**. The header shows a red dot, the time, and the sources. Tell people that you are taking notes. If the meeting stays completely silent for 20 seconds while your microphone works, a red message says that the other people are not being recorded. Most often the sharing window had the wrong source. Press **Stop**, press **Listen** again, choose **Entire screen** (or the meeting's tab), and tick **Also share system audio** (or **Share tab audio**). The message goes away when sound arrives or when you press **Stop**.
|
|
67
67
|
3. Each line shows in the transcript a few seconds after it is said, with who said it, the time and its label. Your lines are **You**. The meeting's lines are **Meeting**: click the name to change it. The transcript cannot tell the people in the meeting apart.
|
|
68
68
|
4. Press **Stop** to end. The summary shows at the top of your notes. To carry on, press **Listen again**: the clock carries on from where it stopped, and the time between does not count. Line times and the kept audio use the same clock.
|
|
69
69
|
5. If the workspace does not take a part of the audio, the page sends it again two times. If it still fails, a red message tells you how many seconds were not saved. Listening goes on. That part of the recording has a gap.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pmos-workspace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.123.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.123.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@xterm/addon-fit": "^0.11.0",
|
package/workspace/package.json
CHANGED
|
@@ -624,11 +624,12 @@ async function cleanNow(ctx, n) {
|
|
|
624
624
|
async function openSource(kind) {
|
|
625
625
|
const md = navigator.mediaDevices;
|
|
626
626
|
if (kind === 'mic') return md.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, channelCount: 1 } });
|
|
627
|
-
//
|
|
628
|
-
|
|
627
|
+
// The meeting is often in Zoom or another app, not in this tab: offer the whole screen first (its system audio carries every app),
|
|
628
|
+
// keep every window and tab selectable, and leave PMOS's own tab out, because it has no sound. Chrome ignores a hint it does not know.
|
|
629
|
+
const s = await md.getDisplayMedia({ video: { displaySurface: 'monitor' }, audio: { echoCancellation: false, noiseSuppression: false, autoGainControl: false }, systemAudio: 'include', monitorTypeSurfaces: 'include', surfaceSwitching: 'include', selfBrowserSurface: 'exclude' });
|
|
629
630
|
const tracks = s.getAudioTracks();
|
|
630
631
|
for (const t of s.getVideoTracks()) t.stop(); // only the sound is used
|
|
631
|
-
if (!tracks.length) throw Object.assign(new Error('The shared
|
|
632
|
+
if (!tracks.length) throw Object.assign(new Error('The shared screen, window or tab has no audio. Share it again, and tick "Also share system audio" (entire screen) or "Share tab audio" (a tab).'), { noAudio: true });
|
|
632
633
|
return new MediaStream(tracks);
|
|
633
634
|
}
|
|
634
635
|
/** The meeting source reaches PMOS as exact silence while the microphone is heard: the other people are not being recorded. Most often the
|
|
@@ -642,7 +643,7 @@ function checkSilence(ctx, a) {
|
|
|
642
643
|
const limit = (typeof window !== 'undefined' && window.__ntSilenceMs) || SILENCE_MS; // the suites shorten it
|
|
643
644
|
if (Date.now() - a.began < limit || (a.peak.mic || 0) < HEARD_PEAK || banner) return;
|
|
644
645
|
banner = { tone: 'bad', silent: true, audioMsg: true, text: 'The meeting\'s audio has been silent for ' + Math.round((Date.now() - a.began) / 1000) + ' seconds, while your microphone is working, so the other people are not being recorded. '
|
|
645
|
-
+ 'If the meeting is talking, press Stop, press Listen again, choose
|
|
646
|
+
+ 'If the meeting is talking, press Stop, press Listen again, choose Entire screen in the sharing window (or the meeting\'s tab) and tick "Share tab audio" or "Also share system audio".' };
|
|
646
647
|
ctx.setState({});
|
|
647
648
|
}
|
|
648
649
|
async function startAudio(ctx, n, want) {
|
package/workspace/server.js
CHANGED
|
@@ -3342,6 +3342,9 @@ function spawnSession({ name, agent, cwd, ws, origin, initialInput, profile, ini
|
|
|
3342
3342
|
// `pres.id` is null whenever the overlay was not applied — including when a profile was asked for
|
|
3343
3343
|
// and could not be read — so the pane line can never name a profile that did nothing (R3/R9).
|
|
3344
3344
|
// `profileRefusal` is server-internal: callers that can refuse read it and say why.
|
|
3345
|
+
// A start that names no profile (`undefined`) gets the agent's default Claude profile, whoever started it: a skill, a
|
|
3346
|
+
// schedule, a note, a doc check. Only the composer used to apply it, so every other start ran under Claude's own config.
|
|
3347
|
+
if (profile === undefined && !isShell) profile = defaultProfileFor(agent);
|
|
3345
3348
|
const pres = resolveProfileForSpawn(profile);
|
|
3346
3349
|
const penv = sessionEnvWithProfile(pres.profile);
|
|
3347
3350
|
// sessionEnvWithProfile returns a fresh object (sessionEnv copies process.env), so these touch this session only.
|
|
@@ -3493,6 +3496,8 @@ function spawnWithBranch({ name, agent, cwd, ws, branch, createBranch, isolate,
|
|
|
3493
3496
|
// The profile is checked BEFORE any git operation. A composer that picked a profile PMOS cannot
|
|
3494
3497
|
// read must not leave a branch checked out and a session running under the wrong environment —
|
|
3495
3498
|
// and a session that claims a profile it never got is the quietest failure this feature has.
|
|
3499
|
+
// `undefined` is "not asked", so it takes the agent's default; the resolved id below is explicit, so spawnSession adds none.
|
|
3500
|
+
if (profile === undefined && agent && agent !== 'shell') profile = defaultProfileFor(agent);
|
|
3496
3501
|
const pres = resolveProfileForSpawn(profile);
|
|
3497
3502
|
if (!pres.ok) return { ok: false, error: pres.error };
|
|
3498
3503
|
// The model choice is checked on the same terms (D75): a refused choice starts nothing, and leaves no branch moved.
|