create-pmos 0.105.0 → 0.106.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/package-lock.json +2 -2
- package/workspace/package.json +1 -1
- package/workspace/public/pm/view-notes-menu.js +168 -43
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-pmos",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.106.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-08T01:
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-08T01:32:06Z"}
|
|
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-08T01:
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-08T01:32:06Z"}
|
|
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-08T01:
|
|
5
|
+
generated: {by: process:create-pmos, at: "2026-10-08T01:32:06Z"}
|
|
6
6
|
status: stable
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pmos-workspace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.106.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.106.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@xterm/addon-fit": "^0.11.0",
|
package/workspace/package.json
CHANGED
|
@@ -130,56 +130,181 @@ export function renderBoard(inner, ctx) {
|
|
|
130
130
|
|
|
131
131
|
const rightPanel = note
|
|
132
132
|
? await (async () => {
|
|
133
|
-
// Load and render the full note detail using the note view's render logic
|
|
134
133
|
try {
|
|
135
|
-
// Import the note view's rendering for inline display
|
|
136
134
|
const noteModule = await import('./view-notes.js');
|
|
137
|
-
// Parse
|
|
135
|
+
// Parse sections from the note's data
|
|
138
136
|
let actions = [];
|
|
139
|
-
|
|
140
|
-
|
|
137
|
+
let decisions = [];
|
|
138
|
+
let questions = [];
|
|
139
|
+
let highlights = [];
|
|
140
|
+
let conflicts = [];
|
|
141
|
+
if (note.final_state) {
|
|
142
|
+
if (note.final_state.actions) actions = note.final_state.actions;
|
|
143
|
+
if (note.final_state.decisions) decisions = note.final_state.decisions;
|
|
144
|
+
if (note.final_state.questions) questions = note.final_state.questions;
|
|
141
145
|
}
|
|
142
|
-
|
|
143
|
-
|
|
146
|
+
if (note.highlights) highlights = note.highlights;
|
|
147
|
+
if (note.conflicts) conflicts = note.conflicts;
|
|
148
|
+
|
|
149
|
+
const parts = [];
|
|
150
|
+
|
|
151
|
+
// Header with title, date, initiative, and action buttons
|
|
152
|
+
parts.push(
|
|
144
153
|
el('div', { class: 'nt-detail-header' },
|
|
145
|
-
el('div', { class: 'nt-detail-title' },
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
...actions.map((action, idx) =>
|
|
154
|
-
el('div', { class: 'nt-detail-action-row' },
|
|
155
|
-
el('div', { class: 'nt-detail-action-text' }, action.text || ''),
|
|
156
|
-
action.owner && el('div', { class: 'nt-detail-action-owner' }, `Owner: ${action.owner}`),
|
|
157
|
-
action.due && el('div', { class: 'nt-detail-action-due' }, `Due: ${action.due}`),
|
|
158
|
-
iconButton({ icon: 'plus', class: 'nt-detail-make-task', title: 'Create task from this step' },
|
|
159
|
-
async () => {
|
|
160
|
-
try {
|
|
161
|
-
const result = await pmPost('/api/notes/create-task', {
|
|
162
|
-
id: note.id,
|
|
163
|
-
text: action.text,
|
|
164
|
-
owner: action.owner,
|
|
165
|
-
due: action.due,
|
|
166
|
-
});
|
|
167
|
-
if (result && result.ok) {
|
|
168
|
-
toast({ text: 'Task created' });
|
|
169
|
-
} else {
|
|
170
|
-
toast({ text: 'Could not create task' });
|
|
171
|
-
}
|
|
172
|
-
} catch (e) {
|
|
173
|
-
console.error('Task creation error:', e);
|
|
174
|
-
toast({ text: 'Error creating task' });
|
|
175
|
-
}
|
|
176
|
-
},
|
|
177
|
-
),
|
|
178
|
-
),
|
|
154
|
+
el('div', { class: 'nt-detail-title-bar' },
|
|
155
|
+
el('div', { class: 'nt-detail-title' }, note.title || 'Untitled note'),
|
|
156
|
+
el('div', { class: 'nt-detail-actions-bar' },
|
|
157
|
+
iconButton({ icon: 'play', ariaLabel: 'Resume recording', attrs: { class: 'nt-detail-resume' } }),
|
|
158
|
+
el('div', { class: 'nt-menu-dots' },
|
|
159
|
+
iconButton({ icon: 'more-vertical', ariaLabel: 'More options', attrs: { class: 'nt-detail-more' } })
|
|
160
|
+
)
|
|
161
|
+
)
|
|
179
162
|
),
|
|
180
|
-
|
|
163
|
+
el('div', { class: 'nt-detail-meta' },
|
|
164
|
+
el('span', { class: 'nt-detail-date' }, new Date(note.updated_at).toLocaleDateString()),
|
|
165
|
+
note.initiative && el('span', { class: 'nt-detail-initiative' }, typeof note.initiative === 'string' ? note.initiative : (note.initiative.title || note.initiative.id)),
|
|
166
|
+
),
|
|
167
|
+
)
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
// Summary/Overview
|
|
171
|
+
parts.push(
|
|
172
|
+
el('div', { class: 'nt-detail-summary' },
|
|
173
|
+
el('h3', { class: 'nt-detail-section-title' }, 'Overview'),
|
|
174
|
+
note.summary
|
|
175
|
+
? el('div', { class: 'nt-detail-summary-text' }, note.summary)
|
|
176
|
+
: el('p', { class: 'nt-hint' }, 'No summary yet'),
|
|
177
|
+
)
|
|
181
178
|
);
|
|
182
|
-
|
|
179
|
+
|
|
180
|
+
// Conflicts section
|
|
181
|
+
if (conflicts && conflicts.length > 0) {
|
|
182
|
+
parts.push(
|
|
183
|
+
el('div', { class: 'nt-detail-conflicts' },
|
|
184
|
+
el('h3', { class: 'nt-detail-section-title' }, `Conflicts (${conflicts.length})`),
|
|
185
|
+
el('div', { class: 'nt-detail-conflicts-list' },
|
|
186
|
+
...conflicts.map((conflict) =>
|
|
187
|
+
el('div', { class: 'nt-detail-conflict-item' },
|
|
188
|
+
el('div', { class: 'nt-conflict-text' }, conflict.text || ''),
|
|
189
|
+
el('div', { class: 'nt-conflict-details' },
|
|
190
|
+
conflict.file && el('span', { class: 'nt-conflict-file' }, conflict.file),
|
|
191
|
+
iconButton({ icon: 'eye', ariaLabel: 'Review conflict', attrs: { class: 'nt-conflict-review' } })
|
|
192
|
+
)
|
|
193
|
+
)
|
|
194
|
+
)
|
|
195
|
+
)
|
|
196
|
+
)
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Highlights section
|
|
201
|
+
if (highlights && highlights.length > 0) {
|
|
202
|
+
parts.push(
|
|
203
|
+
el('div', { class: 'nt-detail-highlights' },
|
|
204
|
+
el('h3', { class: 'nt-detail-section-title' }, `Highlights (${highlights.length})`),
|
|
205
|
+
el('div', { class: 'nt-detail-highlights-list' },
|
|
206
|
+
...highlights.map((h) =>
|
|
207
|
+
el('div', { class: 'nt-detail-highlight-item' },
|
|
208
|
+
el('div', { class: 'nt-highlight-text' }, h.text || ''),
|
|
209
|
+
el('div', { class: 'nt-highlight-meta' },
|
|
210
|
+
el('span', { class: 'nt-highlight-label' }, h.label || ''),
|
|
211
|
+
h.timestamp && el('span', { class: 'nt-highlight-time' }, h.timestamp),
|
|
212
|
+
iconButton({ icon: 'play', ariaLabel: 'Play audio', attrs: { class: 'nt-highlight-play' } })
|
|
213
|
+
)
|
|
214
|
+
)
|
|
215
|
+
)
|
|
216
|
+
)
|
|
217
|
+
)
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Decisions section
|
|
222
|
+
if (decisions && decisions.length > 0) {
|
|
223
|
+
parts.push(
|
|
224
|
+
el('div', { class: 'nt-detail-decisions' },
|
|
225
|
+
el('h3', { class: 'nt-detail-section-title' }, `Decisions (${decisions.length})`),
|
|
226
|
+
el('div', { class: 'nt-detail-decisions-list' },
|
|
227
|
+
...decisions.map((decision, idx) =>
|
|
228
|
+
el('div', { class: 'nt-detail-decision-item' },
|
|
229
|
+
el('div', { class: 'nt-decision-text' }, decision.text || decision),
|
|
230
|
+
el('div', { class: 'nt-decision-actions' },
|
|
231
|
+
iconButton({ icon: 'edit', ariaLabel: 'Edit decision', attrs: { class: 'nt-decision-edit' } })
|
|
232
|
+
)
|
|
233
|
+
)
|
|
234
|
+
)
|
|
235
|
+
)
|
|
236
|
+
)
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Open questions section
|
|
241
|
+
if (questions && questions.length > 0) {
|
|
242
|
+
parts.push(
|
|
243
|
+
el('div', { class: 'nt-detail-questions' },
|
|
244
|
+
el('h3', { class: 'nt-detail-section-title' }, `Open questions (${questions.length})`),
|
|
245
|
+
el('div', { class: 'nt-detail-questions-list' },
|
|
246
|
+
...questions.map((question) =>
|
|
247
|
+
el('div', { class: 'nt-detail-question-item' },
|
|
248
|
+
el('div', { class: 'nt-question-text' }, question.text || question),
|
|
249
|
+
el('div', { class: 'nt-question-actions' },
|
|
250
|
+
button({ label: 'Draft answer', variant: 'ghost', size: 'sm' })
|
|
251
|
+
)
|
|
252
|
+
)
|
|
253
|
+
)
|
|
254
|
+
)
|
|
255
|
+
)
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Actions/Next steps section
|
|
260
|
+
if (actions && actions.length > 0) {
|
|
261
|
+
parts.push(
|
|
262
|
+
el('div', { class: 'nt-detail-actions' },
|
|
263
|
+
el('h3', { class: 'nt-detail-section-title' }, `Next steps (${actions.length})`),
|
|
264
|
+
el('div', { class: 'nt-detail-actions-list' },
|
|
265
|
+
...actions.map((action) =>
|
|
266
|
+
el('div', { class: 'nt-detail-action-row' },
|
|
267
|
+
el('div', { class: 'nt-detail-action-text' }, action.text || ''),
|
|
268
|
+
el('div', { class: 'nt-action-meta' },
|
|
269
|
+
action.owner && el('span', { class: 'nt-action-owner' }, `Owner: ${action.owner}`),
|
|
270
|
+
action.due && el('span', { class: 'nt-action-due' }, `Due: ${action.due}`),
|
|
271
|
+
),
|
|
272
|
+
iconButton({
|
|
273
|
+
icon: 'plus',
|
|
274
|
+
ariaLabel: 'Create task',
|
|
275
|
+
attrs: { class: 'nt-detail-make-task' },
|
|
276
|
+
onClick: async () => {
|
|
277
|
+
try {
|
|
278
|
+
const result = await pmPost('/api/notes/create-task', {
|
|
279
|
+
id: note.id,
|
|
280
|
+
text: action.text,
|
|
281
|
+
owner: action.owner,
|
|
282
|
+
due: action.due,
|
|
283
|
+
});
|
|
284
|
+
if (result && result.ok) {
|
|
285
|
+
toast({ text: 'Task created' });
|
|
286
|
+
} else {
|
|
287
|
+
toast({ text: 'Could not create task' });
|
|
288
|
+
}
|
|
289
|
+
} catch (e) {
|
|
290
|
+
console.error('Task creation error:', e);
|
|
291
|
+
toast({ text: 'Error creating task' });
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
}),
|
|
295
|
+
)
|
|
296
|
+
)
|
|
297
|
+
)
|
|
298
|
+
)
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Files section (placeholder for future)
|
|
303
|
+
// Discussion/Transcript section (collapsible placeholder)
|
|
304
|
+
|
|
305
|
+
return el('div', { class: 'nt-menu-right' }, ...parts);
|
|
306
|
+
} catch (e) {
|
|
307
|
+
console.error('Note detail error:', e);
|
|
183
308
|
return el('div', { class: 'nt-menu-right' }, empty({ text: 'Could not load note detail' }));
|
|
184
309
|
}
|
|
185
310
|
})()
|