@deskwork/studio 0.9.8 → 0.10.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.
@@ -42,7 +42,7 @@ export const SKILLS = [
42
42
  flags: '--site <slug>',
43
43
  },
44
44
  {
45
- slug: 'editorial-add',
45
+ slug: 'deskwork:add',
46
46
  kind: 'mechanical',
47
47
  desc: 'Capture a new idea in the Ideas stage — title, optional description, content type.',
48
48
  when: 'The instant an idea is worth persisting. Pre-commit, not post-draft.',
@@ -50,7 +50,7 @@ export const SKILLS = [
50
50
  flags: '--site <slug>',
51
51
  },
52
52
  {
53
- slug: 'editorial-plan',
53
+ slug: 'deskwork:plan',
54
54
  kind: 'cognitive',
55
55
  desc: 'Promote Ideas → Planned; set target keywords and topic tags.',
56
56
  when: 'The idea has matured enough to point at a shape.',
@@ -58,7 +58,7 @@ export const SKILLS = [
58
58
  flags: '--site <slug> <slug>',
59
59
  },
60
60
  {
61
- slug: 'editorial-draft',
61
+ slug: 'deskwork:draft',
62
62
  kind: 'mechanical',
63
63
  desc: 'Scaffold the blog post directory + frontmatter from a Planned entry and advance to Drafting.',
64
64
  when: 'Ready to begin writing. Can also be triggered from the studio button.',
@@ -66,7 +66,7 @@ export const SKILLS = [
66
66
  flags: '--site <slug> <slug>',
67
67
  },
68
68
  {
69
- slug: 'editorial-draft-review',
69
+ slug: 'deskwork:review-start',
70
70
  kind: 'mechanical',
71
71
  desc: 'Enqueue an existing blog draft into the editorial-review pipeline and print the /dev/editorial-review URL.',
72
72
  when: 'The draft is written and ready for annotation + iteration.',
@@ -74,7 +74,7 @@ export const SKILLS = [
74
74
  flags: '--site <slug> <slug>',
75
75
  },
76
76
  {
77
- slug: 'editorial-iterate',
77
+ slug: 'deskwork:iterate',
78
78
  kind: 'cognitive',
79
79
  desc: 'Revise a draft based on margin-note comments using the site voice skill; appends a new DraftVersion.',
80
80
  when: 'After the operator clicks Iterate in the review page.',
@@ -82,7 +82,7 @@ export const SKILLS = [
82
82
  flags: '<workflow-id> or --site <slug> <slug>',
83
83
  },
84
84
  {
85
- slug: 'editorial-approve',
85
+ slug: 'deskwork:approve',
86
86
  kind: 'mechanical',
87
87
  desc: 'Write the approved draft version to its destination (blog file for longform; shortform copy into the calendar) and transition to applied.',
88
88
  when: 'After the operator clicks Approve in the review page.',
@@ -90,7 +90,7 @@ export const SKILLS = [
90
90
  flags: '<workflow-id>',
91
91
  },
92
92
  {
93
- slug: 'editorial-review-cancel',
93
+ slug: 'deskwork:review-cancel',
94
94
  kind: 'mechanical',
95
95
  desc: 'Cancel an active review workflow; leaves the source file untouched.',
96
96
  when: 'A draft has been abandoned or replaced; clean up the pipeline.',
@@ -98,14 +98,14 @@ export const SKILLS = [
98
98
  flags: '<workflow-id>',
99
99
  },
100
100
  {
101
- slug: 'editorial-review-help',
101
+ slug: 'deskwork:review-help',
102
102
  kind: 'readonly',
103
103
  desc: 'Editorial-review pipeline state across all active workflows + next action per workflow.',
104
104
  when: 'Resuming review work across multiple drafts or sites.',
105
105
  changes: 'Nothing. Read-only.',
106
106
  },
107
107
  {
108
- slug: 'editorial-review-report',
108
+ slug: 'deskwork:review-report',
109
109
  kind: 'readonly',
110
110
  desc: 'Aggregate comment-annotation categories across completed workflows — which voice-skill principles are drifting most.',
111
111
  when: 'Monthly-ish. Inputs for voice-skill revisions.',
@@ -113,23 +113,23 @@ export const SKILLS = [
113
113
  flags: '--site <slug>',
114
114
  },
115
115
  {
116
- slug: 'editorial-publish',
116
+ slug: 'deskwork:publish',
117
117
  kind: 'mechanical',
118
118
  desc: 'Flip a Drafting or Review entry to Published and stamp today’s date.',
119
- when: 'The blog file is live. Usually after /editorial-approve and a human commit.',
119
+ when: 'The blog file is live. Usually after /deskwork:approve and a human commit.',
120
120
  changes: 'Sets datePublished on the entry; stage becomes Published. Does not commit.',
121
121
  flags: '--site <slug> <slug>',
122
122
  },
123
123
  {
124
- slug: 'editorial-shortform-draft',
124
+ slug: 'deskwork:shortform-start',
125
125
  kind: 'cognitive',
126
126
  desc: 'Draft a social post (Reddit title+body, YouTube description, LinkedIn, newsletter) for a published entry, using the site voice. Enqueues a shortform review workflow.',
127
- when: 'After /editorial-publish, once the post is live and worth amplifying.',
127
+ when: 'After /deskwork:publish, once the post is live and worth amplifying.',
128
128
  changes: 'Creates a new review workflow with contentKind=shortform and the drafted copy as v1.',
129
129
  flags: '--site <slug> <slug> <platform> [channel]',
130
130
  },
131
131
  {
132
- slug: 'editorial-distribute',
132
+ slug: 'deskwork:distribute',
133
133
  kind: 'mechanical',
134
134
  desc: 'Record that a published post was shared to a social platform — URL, date, sub-channel.',
135
135
  when: 'After you actually hit post. Closes the loop with analytics.',
@@ -181,21 +181,21 @@ export const SKILLS = [
181
181
  kind: 'cognitive',
182
182
  desc: 'Pull analytics and suggest new ideas for the Ideas stage based on observed queries and gaps.',
183
183
  when: 'When the Ideas column is thin.',
184
- changes: 'Prints suggestions. Does not write them — pair with /editorial-add.',
184
+ changes: 'Prints suggestions. Does not write them — pair with /deskwork:add.',
185
185
  flags: '--site <slug>',
186
186
  },
187
187
  {
188
188
  slug: 'audiocontrol-voice',
189
189
  kind: 'voice',
190
190
  desc: 'Voice skill for audiocontrol.org — service-manual register, hardware-specific vocabulary, dated specs.',
191
- when: 'Called by /editorial-iterate and /editorial-shortform-draft when site=audiocontrol. Not invoked directly by the operator.',
191
+ when: 'Called by /deskwork:iterate and /deskwork:shortform-start when site=audiocontrol. Not invoked directly by the operator.',
192
192
  changes: 'Nothing. Provides the register for the caller.',
193
193
  },
194
194
  {
195
195
  slug: 'editorialcontrol-voice',
196
196
  kind: 'voice',
197
197
  desc: 'Voice skill for editorialcontrol.org — publication register, argument-driven, magazine typography.',
198
- when: 'Called by /editorial-iterate and /editorial-shortform-draft when site=editorialcontrol. Not invoked directly.',
198
+ when: 'Called by /deskwork:iterate and /deskwork:shortform-start when site=editorialcontrol. Not invoked directly.',
199
199
  changes: 'Nothing. Provides the register for the caller.',
200
200
  },
201
201
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"editorial-skills-catalogue.js","sourceRoot":"","sources":["../../src/lib/editorial-skills-catalogue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editorial-skills-catalogue.js","sourceRoot":"","sources":["../../src/lib/editorial-skills-catalogue.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-detail.d.ts","sourceRoot":"","sources":["../../src/pages/content-detail.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAUvD,wBAAgB,iBAAiB,IAAI,OAAO,CAS3C;AAsOD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,KAAK,CAAC,EAAE,YAAY,GACnB,OAAO,CAAC,OAAO,CAAC,CAwElB"}
1
+ {"version":3,"file":"content-detail.d.ts","sourceRoot":"","sources":["../../src/pages/content-detail.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAUvD,wBAAgB,iBAAiB,IAAI,OAAO,CAS3C;AA4ND,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,KAAK,CAAC,EAAE,YAAY,GACnB,OAAO,CAAC,OAAO,CAAC,CAwElB"}
@@ -164,37 +164,25 @@ function loadDetailRender(ctx, site, node, index) {
164
164
  let frontmatter = {};
165
165
  let bodyPreview = '';
166
166
  let scrapbook = null;
167
- // Phase 19c: detail-panel file lookup uses the node's fs `path` —
168
- // the structural key. Whether the node is a tracked entry or
169
- // organizational, the file lookup walks `<contentDir>/<path>/`
170
- // for an index/README. (Phase 19d will additionally consult the
171
- // per-request content index for tracked entries to handle the case
172
- // where the host's template differs from the file's actual path.)
173
- const idxFile = findOrganizationalIndex(contentDir, node.path);
174
- if (idxFile !== null) {
175
- const raw = safeReadFile(idxFile);
167
+ // Issue #103 fix: prefer the id-bound on-disk file when one is
168
+ // attached to the node (set by content-tree.ts via `idBoundFile`).
169
+ // This is the canonical resolution for tracked entries — it handles
170
+ // single-file entries (e.g. `prd.md` next to peer files) where
171
+ // `node.path` is a slug rather than a directory, and host templates
172
+ // that put the file outside the `<path>/index.md` shape. Falls back
173
+ // to the directory-index lookup for purely organizational nodes
174
+ // (#24, v0.6.0) whose canonical content is a README/index.md.
175
+ const targetFile = node.filePath !== undefined
176
+ ? node.filePath
177
+ : findOrganizationalIndex(contentDir, node.path);
178
+ if (targetFile !== null) {
179
+ const raw = safeReadFile(targetFile);
176
180
  if (raw !== null) {
177
181
  const parsed = parseFrontmatter(raw);
178
182
  frontmatter = parsed.data;
179
183
  bodyPreview = parsed.body;
180
184
  }
181
185
  }
182
- else if (node.hasFsDir && node.hasOwnIndex) {
183
- // Organizational node (#24, v0.6.0): no calendar entry, but the
184
- // fs walk found a directory with an index/README. Read that file
185
- // for the detail panel so the operator sees the structural prose
186
- // (e.g. "These are the characters in The Outbound") even though
187
- // nothing about this node ships through the lifecycle pipeline.
188
- const abs = findOrganizationalIndex(contentDir, node.path);
189
- if (abs !== null) {
190
- const raw = safeReadFile(abs);
191
- if (raw !== null) {
192
- const parsed = parseFrontmatter(raw);
193
- frontmatter = parsed.data;
194
- bodyPreview = parsed.body;
195
- }
196
- }
197
- }
198
186
  try {
199
187
  // Phase 19c+: the scrapbook listing prefers the index-driven dir
200
188
  // for tracked entries (id binding) and falls back to the path-
@@ -1 +1 @@
1
- {"version":3,"file":"content-detail.js","sourceRoot":"","sources":["../../src/pages/content-detail.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-detail.js","sourceRoot":"","sources":["../../src/pages/content-detail.ts"],"names":[],"mappings":"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"}
@@ -226,35 +226,25 @@ function loadDetailRender(
226
226
  let bodyPreview = '';
227
227
  let scrapbook: ScrapbookSummary | null = null;
228
228
 
229
- // Phase 19c: detail-panel file lookup uses the node's fs `path` —
230
- // the structural key. Whether the node is a tracked entry or
231
- // organizational, the file lookup walks `<contentDir>/<path>/`
232
- // for an index/README. (Phase 19d will additionally consult the
233
- // per-request content index for tracked entries to handle the case
234
- // where the host's template differs from the file's actual path.)
235
- const idxFile = findOrganizationalIndex(contentDir, node.path);
236
- if (idxFile !== null) {
237
- const raw = safeReadFile(idxFile);
229
+ // Issue #103 fix: prefer the id-bound on-disk file when one is
230
+ // attached to the node (set by content-tree.ts via `idBoundFile`).
231
+ // This is the canonical resolution for tracked entries — it handles
232
+ // single-file entries (e.g. `prd.md` next to peer files) where
233
+ // `node.path` is a slug rather than a directory, and host templates
234
+ // that put the file outside the `<path>/index.md` shape. Falls back
235
+ // to the directory-index lookup for purely organizational nodes
236
+ // (#24, v0.6.0) whose canonical content is a README/index.md.
237
+ const targetFile =
238
+ node.filePath !== undefined
239
+ ? node.filePath
240
+ : findOrganizationalIndex(contentDir, node.path);
241
+ if (targetFile !== null) {
242
+ const raw = safeReadFile(targetFile);
238
243
  if (raw !== null) {
239
244
  const parsed = parseFrontmatter(raw);
240
245
  frontmatter = parsed.data as Record<string, unknown>;
241
246
  bodyPreview = parsed.body;
242
247
  }
243
- } else if (node.hasFsDir && node.hasOwnIndex) {
244
- // Organizational node (#24, v0.6.0): no calendar entry, but the
245
- // fs walk found a directory with an index/README. Read that file
246
- // for the detail panel so the operator sees the structural prose
247
- // (e.g. "These are the characters in The Outbound") even though
248
- // nothing about this node ships through the lifecycle pipeline.
249
- const abs = findOrganizationalIndex(contentDir, node.path);
250
- if (abs !== null) {
251
- const raw = safeReadFile(abs);
252
- if (raw !== null) {
253
- const parsed = parseFrontmatter(raw);
254
- frontmatter = parsed.data as Record<string, unknown>;
255
- bodyPreview = parsed.body;
256
- }
257
- }
258
248
  }
259
249
 
260
250
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/pages/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA0BH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKtD;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;AAy2BlE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,aAAa,EAClB,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,MAAM,CAwDR"}
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/pages/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA0BH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKtD;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;AA84BlE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,aAAa,EAClB,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,MAAM,CAwDR"}
@@ -113,6 +113,24 @@ function blogPreviewLink(site, slug, host, entry) {
113
113
  const key = entry.id ?? slug;
114
114
  return `/dev/editorial-review/${key}?site=${site}`;
115
115
  }
116
+ /**
117
+ * Issue #110: when a calendar entry has no open workflow, the row
118
+ * still needs a navigation target so it doesn't read as decoration.
119
+ * The content-detail page (`/dev/content/<site>/<root>?node=<slug>`)
120
+ * is the right surface — it shows frontmatter + body + scrapbook for
121
+ * the entry without requiring a review workflow. Workflow-linked
122
+ * entries keep their `/dev/editorial-review/<id>` target via
123
+ * `workflowLink` above.
124
+ *
125
+ * The `<root>` segment is the entry slug's first path segment (the
126
+ * project root). For flat slugs (`the-outbound`), the project root
127
+ * IS the slug itself; for hierarchical slugs (`projects/x/y`), it's
128
+ * the first segment.
129
+ */
130
+ function contentDetailLink(site, slug) {
131
+ const root = slug.split('/')[0];
132
+ return `/dev/content/${encodeURIComponent(site)}/${encodeURIComponent(root)}?node=${encodeURIComponent(slug)}`;
133
+ }
116
134
  function loadDashboardData(ctx, getIndex) {
117
135
  // `getIndex` is currently consumed downstream by renderRow →
118
136
  // entryBodyStateOf, not here. Threading it through keeps the call
@@ -280,9 +298,9 @@ function renderFilterStrip(sites) {
280
298
  </section>`);
281
299
  }
282
300
  const STAGE_EMPTY_MESSAGES = {
283
- Ideas: 'No open ideas. Run /editorial-add to capture one.',
284
- Planned: 'Nothing planned. /editorial-plan <slug> to promote an idea.',
285
- Outlining: 'Nothing in outlining. /editorial-outline <slug> to start one.',
301
+ Ideas: 'No open ideas. Run /deskwork:add to capture one.',
302
+ Planned: 'Nothing planned. /deskwork:plan <slug> to promote an idea.',
303
+ Outlining: 'Nothing in outlining. /deskwork:outline <slug> to start one.',
286
304
  Drafting: 'No posts in drafting.',
287
305
  Review: 'Nothing in review stage.',
288
306
  Paused: 'Nothing paused. /deskwork:pause <slug> sets an entry aside without losing where it was.',
@@ -331,7 +349,7 @@ function renderRowActions(site, entry, stage, hasFile, bodyWritten, wf) {
331
349
  const buttons = [];
332
350
  if (stage === 'Ideas') {
333
351
  buttons.push(html `<button class="er-btn er-btn-small er-copy-btn" type="button"
334
- data-copy="/editorial-plan --site ${site} ${entry.slug}" title="copy command">plan →</button>`);
352
+ data-copy="/deskwork:plan --site ${site} ${entry.slug}" title="copy command">plan →</button>`);
335
353
  }
336
354
  if (stage === 'Planned' && !hasFile) {
337
355
  buttons.push(html `<button class="er-btn er-btn-small er-btn-primary" type="button"
@@ -339,17 +357,17 @@ function renderRowActions(site, entry, stage, hasFile, bodyWritten, wf) {
339
357
  }
340
358
  if (stage === 'Planned' && hasFile) {
341
359
  buttons.push(html `<button class="er-btn er-btn-small er-btn-primary er-copy-btn" type="button"
342
- data-copy="/editorial-outline --site ${site} ${entry.slug}"
360
+ data-copy="/deskwork:outline --site ${site} ${entry.slug}"
343
361
  title="scaffold file exists — copy to sketch the outline in Claude Code">outline →</button>`);
344
362
  }
345
363
  if (stage === 'Outlining' && wf && wf.state === 'iterating') {
346
364
  buttons.push(html `<button class="er-btn er-btn-small er-btn-primary er-copy-btn" type="button"
347
- data-copy="/editorial-iterate --kind outline --site ${site} ${entry.slug}"
365
+ data-copy="/deskwork:iterate --kind outline --site ${site} ${entry.slug}"
348
366
  title="operator clicked Iterate">iterate outline →</button>`);
349
367
  }
350
368
  if (stage === 'Outlining' && wf && wf.state === 'approved') {
351
369
  buttons.push(html `<button class="er-btn er-btn-small er-btn-approve er-copy-btn" type="button"
352
- data-copy="/editorial-outline-approve --site ${site} ${entry.slug}"
370
+ data-copy="/deskwork:approve --site ${site} ${entry.slug}"
353
371
  title="outline approved — advance to Drafting">approve outline →</button>`);
354
372
  }
355
373
  if (stage === 'Outlining' &&
@@ -360,12 +378,12 @@ function renderRowActions(site, entry, stage, hasFile, bodyWritten, wf) {
360
378
  }
361
379
  if (stage === 'Outlining' && !wf) {
362
380
  buttons.push(html `<button class="er-btn er-btn-small er-btn-primary er-copy-btn" type="button"
363
- data-copy="/editorial-outline --site ${site} ${entry.slug}"
381
+ data-copy="/deskwork:outline --site ${site} ${entry.slug}"
364
382
  title="no outline workflow found — copy to (re)start one">outline →</button>`);
365
383
  }
366
384
  if ((stage === 'Drafting' || stage === 'Review') && !bodyWritten) {
367
385
  buttons.push(html `<button class="er-btn er-btn-small er-btn-primary er-copy-btn" type="button"
368
- data-copy="/editorial-draft --site ${site} ${entry.slug}"
386
+ data-copy="/deskwork:draft --site ${site} ${entry.slug}"
369
387
  title="body is still the placeholder">draft body →</button>`);
370
388
  }
371
389
  if ((stage === 'Drafting' || stage === 'Review') && bodyWritten && !wf) {
@@ -380,7 +398,7 @@ function renderRowActions(site, entry, stage, hasFile, bodyWritten, wf) {
380
398
  }
381
399
  if (stage === 'Published' && !wf) {
382
400
  buttons.push(html `<button class="er-btn er-btn-small er-copy-btn" type="button"
383
- data-copy="/editorial-draft-review --site ${site} ${entry.slug}"
401
+ data-copy="/deskwork:review-start --site ${site} ${entry.slug}"
384
402
  title="re-review a published post">re-review</button>`);
385
403
  }
386
404
  // #27 — Paused gets a "resume" copy; pausable stages get a "pause" copy.
@@ -400,7 +418,7 @@ function renderRowActions(site, entry, stage, hasFile, bodyWritten, wf) {
400
418
  }
401
419
  if (kind === 'blog') {
402
420
  buttons.push(html `<button class="er-btn er-btn-small" type="button" data-action="rename-open"
403
- title="rename the slug — copies /editorial-rename-slug to clipboard">rename →</button>`);
421
+ title="rename the slug">rename →</button>`);
404
422
  }
405
423
  return unsafe(`<span class="er-calendar-action">${buttons.join('')}</span>`);
406
424
  }
@@ -419,12 +437,22 @@ function renderRow(ctx, data, sited, stage, index, getIndex) {
419
437
  site,
420
438
  ].join(' ').toLowerCase();
421
439
  const host = ctx.config.sites[site]?.host ?? site;
422
- const slugCell = wf
423
- ? unsafe(html `<a href="${workflowLink(wf)}" title="open the review surface">${entry.slug}</a>`)
424
- : hasFile
425
- ? unsafe(html `<a href="${blogPreviewLink(site, entry.slug, host, entry)}"
426
- title="${entry.stage === 'Published' ? 'read the published article' : 'open the review surface for this draft'}">${entry.slug}</a>`)
427
- : entry.slug;
440
+ // Issue #110: every row gets a link target. Workflow-linked rows
441
+ // open the review surface; Published rows link to the public host
442
+ // URL; everything else links to the content-detail page so the
443
+ // operator can read the entry's frontmatter, body, and scrapbook
444
+ // without inventing a workflow.
445
+ const slugLink = wf
446
+ ? workflowLink(wf)
447
+ : entry.stage === 'Published'
448
+ ? blogPreviewLink(site, entry.slug, host, entry)
449
+ : contentDetailLink(site, entry.slug);
450
+ const slugTitle = wf
451
+ ? 'open the review surface'
452
+ : entry.stage === 'Published'
453
+ ? 'read the published article'
454
+ : 'view content details';
455
+ const slugCell = unsafe(html `<a href="${slugLink}" title="${slugTitle}">${entry.slug}</a>`);
428
456
  const fileDot = hasRepoContent(kind)
429
457
  ? unsafe(html `<span class="er-file-dot er-file-${body}"
430
458
  title="${body === 'missing'
@@ -460,9 +488,10 @@ function renderRow(ctx, data, sited, stage, index, getIndex) {
460
488
  : '';
461
489
  // For nested entries, show only the leaf segment as the prominent
462
490
  // identifier — the ancestor segments are implied by the visual indent
463
- // and the position in the sorted list.
491
+ // and the position in the sorted list. Issue #110: the hierarchical
492
+ // shape still wraps in an <a> so the row has a link target.
464
493
  const slugDisplay = depth > 0
465
- ? unsafe(html `<span class="er-row-slug-ancestors" aria-hidden="true">${entry.slug.slice(0, entry.slug.lastIndexOf('/') + 1)}</span><span class="er-row-slug-leaf">${entry.slug.slice(entry.slug.lastIndexOf('/') + 1)}</span>`)
494
+ ? unsafe(html `<a href="${slugLink}" title="${slugTitle}"><span class="er-row-slug-ancestors" aria-hidden="true">${entry.slug.slice(0, entry.slug.lastIndexOf('/') + 1)}</span><span class="er-row-slug-leaf">${entry.slug.slice(entry.slug.lastIndexOf('/') + 1)}</span></a>`)
466
495
  : '';
467
496
  const slugCellWithHierarchy = depth > 0 ? slugDisplay : slugCell;
468
497
  return unsafe(html `
@@ -537,7 +566,7 @@ function renderStageSection(ctx, data, stage, entries, sites, getIndex) {
537
566
  .map((e, i) => renderRow(ctx, data, e, stage, i, getIndex).__raw)
538
567
  .join(''));
539
568
  return unsafe(html `
540
- <section class="er-section" data-stage-section="${stage}">
569
+ <section class="er-section" id="stage-${stage.toLowerCase()}" data-stage-section="${stage}">
541
570
  <h2 class="er-section-head">
542
571
  <span>${stage}</span>
543
572
  <span class="ornament">${STAGE_ORNAMENTS[stage]}</span>
@@ -654,7 +683,7 @@ function renderApprovedSection(data, ctx) {
654
683
  <span class="er-stamp er-stamp-approved">approved</span>
655
684
  <span class="er-row-ts">v${w.currentVersion}</span>
656
685
  <span class="er-row-hint">
657
- Run · <code>/editorial-approve --site ${w.site} ${w.slug}${flagBit}</code>
686
+ Run · <code>/deskwork:approve --site ${w.site} ${w.slug}${flagBit}</code>
658
687
  </span>
659
688
  </a>`;
660
689
  })
@@ -671,6 +700,10 @@ function renderApprovedSection(data, ctx) {
671
700
  function renderTerminalSection(data, ctx, now) {
672
701
  if (data.terminal.length === 0)
673
702
  return unsafe('');
703
+ // Issue #110: Recent proofs rows are now `<a>` so adopters can
704
+ // click into the historical review record (the review surface
705
+ // renders terminal workflows for inspection just as well as
706
+ // active ones).
674
707
  const rows = data.terminal
675
708
  .map((w) => {
676
709
  const host = ctx.config.sites[w.site]?.host ?? w.site;
@@ -678,14 +711,15 @@ function renderTerminalSection(data, ctx, now) {
678
711
  ? html `<span class="er-row-channel"> · ${w.platform}</span>`
679
712
  : '';
680
713
  return html `
681
- <div class="er-row" data-state="${w.state}" data-site="${w.site}">
714
+ <a class="er-row" href="${workflowLink(w)}" data-state="${w.state}" data-site="${w.site}"
715
+ title="open the ${w.state} review record">
682
716
  <span class="er-row-num">—</span>
683
717
  <span class="er-row-site er-row-site--${w.site}" title="${host}">${siteLabel(w.site)}</span>
684
718
  <span class="er-row-slug" style="color: var(--er-ink-soft);">${w.slug}</span>
685
719
  <span class="er-row-kind">${w.contentKind}${unsafe(platformBit)}</span>
686
720
  <span class="er-stamp er-stamp-${w.state}">${w.state}</span>
687
721
  <span class="er-row-ts">${fmtRelTime(w.updatedAt, now)}</span>
688
- </div>`;
722
+ </a>`;
689
723
  })
690
724
  .join('');
691
725
  return unsafe(html `
@@ -714,7 +748,7 @@ function renderSidebar(data) {
714
748
  : ''}
715
749
  <div style="margin-top: var(--er-space-2); font-family: var(--er-font-mono); font-size: 0.68rem; color: var(--er-faded);">
716
750
  from ${data.report.all.approvedCount} approved · ${data.report.all.cancelledCount} cancelled<br />
717
- <code style="margin-top: 0.25rem; display: inline-block;">/editorial-review-report --site &lt;site&gt;</code>
751
+ <code style="margin-top: 0.25rem; display: inline-block;">/deskwork:review-report --site &lt;site&gt;</code>
718
752
  </div>`)
719
753
  : unsafe(html `
720
754
  <p style="font-family: var(--er-font-display); font-style: italic; color: var(--er-ink-soft); margin: 0;">