create-pmos 0.180.0 → 0.181.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/c3-driver-test.js +6 -1
- package/workspace/guide/initiative-driver.md +2 -2
- package/workspace/package-lock.json +2 -2
- package/workspace/package.json +1 -1
- package/workspace/public/pm/c3-ini-ui.js +15 -1
- package/workspace/public/pm/c3-initiatives.js +3 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-pmos",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.181.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-
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-13T03:13:28Z"}
|
|
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-13T03:13:28Z"}
|
|
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-13T03:13:28Z"}
|
|
6
6
|
status: stable
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* work a Work task with a follow-up shows the agent line; Review opens the sheet with the draft and "the agent sent nothing";
|
|
14
14
|
* Keep records the keep; a task with a next-step shows Keep and Drop in the line
|
|
15
15
|
* setting Board settings has the Agent setting; pressing Shadow posts /api/driver/mode and the ledger holds it
|
|
16
|
-
* briefing Needs you shows the agent's two kinds of row and a press opens the initiative
|
|
16
|
+
* briefing Needs you shows the agent's two kinds of row, a long title wraps inside the row, and a press opens the initiative
|
|
17
17
|
* phone at 400 wide the strip has no horizontal scroll
|
|
18
18
|
* Every wait polls the page. The page must raise no script error.
|
|
19
19
|
*/
|
|
@@ -150,6 +150,11 @@ process.on('unhandledRejection', (e) => { console.error(e); finish(1); });
|
|
|
150
150
|
await sel('[data-drv-need]');
|
|
151
151
|
const needs = await st(() => [...document.querySelectorAll('[data-drv-need]')].map((r) => r.dataset.drvNeed + ':' + r.textContent.replace(/\s+/g, ' ')));
|
|
152
152
|
ok('B1 Needs you shows the agent\'s rows: the drafts left on the initiative, and the initiative waiting on you', needs.some((t) => /^driver-drafts:Agent has 1 draft on Partner API onboarding/.test(t)) && needs.some((t) => /^driver-blocked:.*Partner API onboarding is waiting on you/.test(t)), needs.join(' | '));
|
|
153
|
+
const fit = await st(() => { const r = [...document.querySelectorAll('[data-drv-need="driver-drafts"]')].find((x) => x.offsetParent); const t = r.querySelector('.tt'); const was = t.textContent;
|
|
154
|
+
t.textContent = 'Agent has 2 drafts on I need to create recommendations for Scarlet product strategy, including whether to change it with something else entirely or keep it';
|
|
155
|
+
const nb = r.querySelector('.nb'); const out = { ws: getComputedStyle(t).whiteSpace, over: nb.scrollWidth - nb.clientWidth, right: t.getBoundingClientRect().right - r.getBoundingClientRect().right };
|
|
156
|
+
t.textContent = was; return out; });
|
|
157
|
+
ok('B3 a long title wraps inside the row: the title button is not nowrap and nothing runs past the card', fit.ws !== 'nowrap' && fit.over <= 1 && fit.right <= 1, JSON.stringify(fit));
|
|
153
158
|
await page.click('[data-drv-need="driver-drafts"] .tt');
|
|
154
159
|
await until(() => page.$('[data-drv="strip"]'));
|
|
155
160
|
ok('B2 a press on the row opens the initiative with its Agent strip', !!(await page.$('[data-drv="strip"]')));
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: Guide
|
|
3
3
|
title: "The Initiative Driver: drafts the agent files for you"
|
|
4
4
|
description: "What the Initiative Driver does when an initiative is created or moved, what stops it, how it files proposals you keep, send back or drop, the board modes, and the pmos driver commands."
|
|
5
|
-
timestamp: 2026-10-
|
|
5
|
+
timestamp: 2026-10-13
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# The Initiative Driver: drafts the agent files for you
|
|
@@ -55,7 +55,7 @@ In Discover, the agent writes the problem statement, the evidence, the opportuni
|
|
|
55
55
|
- **The Agent strip.** Open an initiative and stay on Overview. The Agent section is at the top. It shows the state of the agent (working, idle, waiting on you, paused or off), the last thing it did, and what stops it ("Stopped by: ..."). Each open proposal is one row with Keep, Send back and Drop. Press a row to read its text and its sources. A source that is a link opens in a new tab. Pause and Resume are in the header. The text "1 of 3 runs used today" opens the list of today's runs.
|
|
56
56
|
- **Keep, Send back and Drop on a row.** A kept row stays in the strip, marked "Kept by you", until you leave the page. Send back asks for a one-line note. A kept stage move changes the stage on the page at once. These three acts cannot be undone: each adds one line to the ledger.
|
|
57
57
|
- **One line in Work.** A Work task with an open proposal shows one line under its title, for example "Agent drafted a follow-up to Dana. Nothing is sent." Press Review to read the draft. Keep copies the text so you can send it yourself, and records your decision. If the browser does not allow copying, the text is selected and you press Ctrl+C. A suggested next step shows Keep and Drop in the line. Shadow and Off show no line.
|
|
58
|
-
- **Needs you.** In Briefing, the agent has two kinds of row: "Agent has 3 drafts on ..." and "... is waiting on you". Press a row to open the initiative.
|
|
58
|
+
- **Needs you.** In Briefing, the agent has two kinds of row: "Agent has 3 drafts on ..." and "... is waiting on you". Press a row to open the initiative. A long title wraps inside the card.
|
|
59
59
|
- **The Agent setting.** Open the board, press Board settings, and find Agent. Choose Off, Shadow or Approve. The setting is saved when you press it.
|
|
60
60
|
|
|
61
61
|
## Keep, send back, drop
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pmos-workspace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.181.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.181.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@xterm/addon-fit": "^0.11.0",
|
package/workspace/package.json
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* day(iso) '12 Oct' · dayLong(iso) 'Mon 12 Oct 2026' · ago(iso, today) · daysBetween(a, b) · plural(n, one, many) · trunc(s, n)
|
|
25
25
|
*/
|
|
26
26
|
import { el, frag } from './dom.js';
|
|
27
|
-
import { button } from './primitives.js';
|
|
27
|
+
import { button, ensureComponentsCss } from './primitives.js';
|
|
28
28
|
import { c3ic } from './pm-work-view.js';
|
|
29
29
|
import { makeXp, attachExpand } from './c3-expand.js';
|
|
30
30
|
|
|
@@ -59,9 +59,23 @@ export function put(node, ...kids) {
|
|
|
59
59
|
return node;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Link c3-initiatives.css once, after components.css, so the `ini-b` reset comes after the primitive's own rules. btn() calls it: the
|
|
64
|
+
* Briefing, Work, Reports and Scan pages draw rows with these builders too, and without the reset a row title kept the primitive's nowrap
|
|
65
|
+
* and ran past its card. Every rule in the sheet is under an `ini-` or `in-` class, so it changes nothing else on those pages.
|
|
66
|
+
*/
|
|
67
|
+
export function ensureIniCss() {
|
|
68
|
+
if (typeof document === 'undefined' || document.querySelector('link[data-c3-ini]')) return;
|
|
69
|
+
ensureComponentsCss();
|
|
70
|
+
const l = document.createElement('link');
|
|
71
|
+
l.rel = 'stylesheet'; l.href = new URL('./c3-initiatives.css', import.meta.url).href; l.setAttribute('data-c3-ini', '');
|
|
72
|
+
document.head.appendChild(l);
|
|
73
|
+
}
|
|
74
|
+
|
|
62
75
|
/* ── controls ── */
|
|
63
76
|
/** A native button drawn as a console3 control. attrs: class (the console3 class), onclick, and any attribute. */
|
|
64
77
|
export function btn(attrs, ...kids) {
|
|
78
|
+
ensureIniCss();
|
|
65
79
|
const { onclick, class: cls, disabled, ...rest } = attrs || {};
|
|
66
80
|
const b = button({ variant: 'ghost', onClick: onclick, disabled: !!disabled, attrs: { ...rest, class: 'ini-b' + (cls ? ' ' + cls : '') } });
|
|
67
81
|
b.replaceChildren(frag(...kids.filter((k) => k != null && k !== false)));
|
|
@@ -43,7 +43,7 @@ import { openSheet, closeSheet } from './c3-sheet.js';
|
|
|
43
43
|
import { toast } from './c3-toast.js';
|
|
44
44
|
import {
|
|
45
45
|
btn, geo, icon, pbtn, pill, lk, ib, chip, tag, st, note, lbl, mono, sw, jiraLabel, plural, trunc, day, daysBetween, statusChip, healthSt, HEALTH, ownerChip, ownerText,
|
|
46
|
-
stageChip, stepsMini, progChip, dateChip, list, empty, sect, card, nrow, crumbs, lh, segTabs, cols, hbs, hbr, kv, chgl, chgli, openMenu, closeMenu, CATS, PORTFOLIO, put
|
|
46
|
+
stageChip, stepsMini, progChip, dateChip, list, empty, sect, card, nrow, crumbs, lh, segTabs, cols, hbs, hbr, kv, chgl, chgli, openMenu, closeMenu, CATS, PORTFOLIO, put, ensureIniCss
|
|
47
47
|
} from './c3-ini-ui.js';
|
|
48
48
|
import { TEMPLATES, BOARD_TEMPLATES, isBuildStage, templateBuilds, offered, wfOf, catOf, kindOf, tplName, TOOL_META, toolLabel, toolIcon, loadItems, dropItems, workTlRows, iniTlRow, rescheduleTask, lockedToast } from './c3-ini-work.js';
|
|
49
49
|
import { timeline, tlInit, tlRange } from './c3-ini-timeline.js';
|
|
@@ -102,11 +102,8 @@ export function formatLoc(loc) {
|
|
|
102
102
|
|
|
103
103
|
function ensureCss() {
|
|
104
104
|
ensureC3Css();
|
|
105
|
-
ensureComponentsCss();
|
|
106
|
-
|
|
107
|
-
const l = document.createElement('link');
|
|
108
|
-
l.rel = 'stylesheet'; l.href = new URL('./c3-initiatives.css', import.meta.url).href; l.setAttribute('data-c3-ini', '');
|
|
109
|
-
document.head.appendChild(l);
|
|
105
|
+
ensureComponentsCss();
|
|
106
|
+
ensureIniCss(); // after components.css, so the reset in c3-initiatives.css comes after the primitive's own rules
|
|
110
107
|
}
|
|
111
108
|
const warnChip = (w) => st('warn', 'alert', w, { title: 'An order rule, shown as a warning. It never blocks.', 'data-ini-warning': w });
|
|
112
109
|
const buildTag = (b) => (b.build ? el('span', { class: 'tag' }, icon('jira', 'sm'), jiraLabel(b) ? 'Jira · ' + jiraLabel(b) : 'Jira not set') : el('span', { class: 'tag' }, 'PMOS tasks only'));
|