@deskwork/studio 0.9.8 → 0.10.1
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/dist/lib/editorial-skills-catalogue.js +17 -17
- package/dist/lib/editorial-skills-catalogue.js.map +1 -1
- package/dist/pages/content-detail.d.ts.map +1 -1
- package/dist/pages/content-detail.js +13 -25
- package/dist/pages/content-detail.js.map +1 -1
- package/dist/pages/content-detail.ts +14 -24
- package/dist/pages/dashboard.d.ts.map +1 -1
- package/dist/pages/dashboard.js +58 -24
- package/dist/pages/dashboard.js.map +1 -1
- package/dist/pages/dashboard.ts +61 -24
- package/dist/pages/help.js +25 -25
- package/dist/pages/help.js.map +1 -1
- package/dist/pages/help.ts +25 -25
- package/dist/pages/index.d.ts +1 -1
- package/dist/pages/index.d.ts.map +1 -1
- package/dist/pages/index.js +129 -83
- package/dist/pages/index.js.map +1 -1
- package/dist/pages/index.ts +145 -84
- package/dist/pages/review.js +3 -3
- package/dist/pages/review.ts +3 -3
- package/dist/pages/shortform.js +1 -1
- package/dist/pages/shortform.ts +1 -1
- package/package.json +2 -2
|
@@ -42,7 +42,7 @@ export const SKILLS = [
|
|
|
42
42
|
flags: '--site <slug>',
|
|
43
43
|
},
|
|
44
44
|
{
|
|
45
|
-
slug: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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 /
|
|
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: '
|
|
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 /
|
|
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: '
|
|
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 /
|
|
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 /
|
|
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 /
|
|
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":"AAAA;;;;;;;;;;;;;GAaG;AAaH,qEAAqE;AACrE,MAAM,CAAC,MAAM,UAAU,GAAwC;IAC7D,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAqB;IACtC;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,qEAAqE;QAC3E,IAAI,EAAE,qFAAqF;QAC3F,OAAO,EAAE,qBAAqB;QAC9B,KAAK,EAAE,eAAe;KACvB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,uEAAuE;QAC7E,IAAI,EAAE,qDAAqD;QAC3D,OAAO,EAAE,qBAAqB;QAC9B,KAAK,EAAE,eAAe;KACvB;IACD;QACE,IAAI,EAAE,
|
|
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;
|
|
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
|
-
//
|
|
168
|
-
//
|
|
169
|
-
//
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
-
//
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
//
|
|
230
|
-
//
|
|
231
|
-
//
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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;
|
|
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"}
|
package/dist/pages/dashboard.js
CHANGED
|
@@ -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 /
|
|
284
|
-
Planned: 'Nothing planned. /
|
|
285
|
-
Outlining: 'Nothing in outlining. /
|
|
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="/
|
|
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="/
|
|
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="/
|
|
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="/
|
|
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="/
|
|
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="/
|
|
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="/
|
|
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
|
|
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
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
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>/
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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;">/
|
|
751
|
+
<code style="margin-top: 0.25rem; display: inline-block;">/deskwork:review-report --site <site></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;">
|