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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-pmos",
3
- "version": "0.105.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": {
@@ -1,3 +1,3 @@
1
- kernel-source: pmos@d4092b3
1
+ kernel-source: pmos@ed9ef84
2
2
  assembled: 2026-10-08
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-08T01:07:38Z"}
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:07:38Z"}
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:07:38Z"}
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.105.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.105.0",
9
+ "version": "0.106.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@xterm/addon-fit": "^0.11.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmos-workspace",
3
- "version": "0.105.0",
3
+ "version": "0.106.0",
4
4
  "private": true,
5
5
  "description": "PMOS Terminal Workspace — local companion hosting real PTYs beside the library and gates (D62)",
6
6
  "license": "MIT",
@@ -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 next steps/actions from the note's final state
135
+ // Parse sections from the note's data
138
136
  let actions = [];
139
- if (note.final_state && note.final_state.actions) {
140
- actions = note.final_state.actions;
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
- // Use the note's renderInline if available, otherwise render basic detail
143
- return el('div', { class: 'nt-menu-right' },
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' }, note.title || 'Untitled note'),
146
- el('div', { class: 'nt-detail-date' }, new Date(note.updated_at).toLocaleDateString()),
147
- ),
148
- el('div', { class: 'nt-detail-summary' },
149
- summaryOf(note) ? el('pre', {}, summaryOf(note)) : el('p', { class: 'nt-hint' }, 'No summary yet'),
150
- ),
151
- actions.length > 0 && el('div', { class: 'nt-detail-actions' },
152
- el('div', { class: 'nt-detail-actions-title' }, 'Next steps'),
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
- } catch {
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
  })()