@deskwork/studio 0.13.0 → 0.14.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.
Files changed (95) hide show
  1. package/dist/pages/content-detail.d.ts.map +1 -1
  2. package/dist/pages/content-detail.js +5 -4
  3. package/dist/pages/content-detail.js.map +1 -1
  4. package/dist/pages/content-detail.ts +5 -4
  5. package/dist/pages/content.d.ts.map +1 -1
  6. package/dist/pages/content.js +4 -6
  7. package/dist/pages/content.js.map +1 -1
  8. package/dist/pages/content.ts +4 -6
  9. package/dist/pages/dashboard/affordances.d.ts +6 -1
  10. package/dist/pages/dashboard/affordances.d.ts.map +1 -1
  11. package/dist/pages/dashboard/affordances.js +17 -2
  12. package/dist/pages/dashboard/affordances.js.map +1 -1
  13. package/dist/pages/dashboard/affordances.ts +18 -2
  14. package/dist/pages/dashboard/header.js +2 -2
  15. package/dist/pages/dashboard/header.ts +2 -2
  16. package/dist/pages/dashboard/section.d.ts +2 -2
  17. package/dist/pages/dashboard/section.d.ts.map +1 -1
  18. package/dist/pages/dashboard/section.js +5 -5
  19. package/dist/pages/dashboard/section.js.map +1 -1
  20. package/dist/pages/dashboard/section.ts +9 -5
  21. package/dist/pages/dashboard.d.ts.map +1 -1
  22. package/dist/pages/dashboard.js +3 -2
  23. package/dist/pages/dashboard.js.map +1 -1
  24. package/dist/pages/dashboard.ts +3 -2
  25. package/dist/pages/entry-review/data.d.ts +54 -0
  26. package/dist/pages/entry-review/data.d.ts.map +1 -0
  27. package/dist/pages/entry-review/data.js +116 -0
  28. package/dist/pages/entry-review/data.js.map +1 -0
  29. package/dist/pages/entry-review/decision-strip.d.ts +37 -0
  30. package/dist/pages/entry-review/decision-strip.d.ts.map +1 -0
  31. package/dist/pages/entry-review/decision-strip.js +137 -0
  32. package/dist/pages/entry-review/decision-strip.js.map +1 -0
  33. package/dist/pages/entry-review/edit-panes.d.ts +12 -0
  34. package/dist/pages/entry-review/edit-panes.d.ts.map +1 -0
  35. package/dist/pages/entry-review/edit-panes.js +28 -0
  36. package/dist/pages/entry-review/edit-panes.js.map +1 -0
  37. package/dist/pages/entry-review/edit-toolbar.d.ts +20 -0
  38. package/dist/pages/entry-review/edit-toolbar.d.ts.map +1 -0
  39. package/dist/pages/entry-review/edit-toolbar.js +46 -0
  40. package/dist/pages/entry-review/edit-toolbar.js.map +1 -0
  41. package/dist/pages/entry-review/index.d.ts +50 -0
  42. package/dist/pages/entry-review/index.d.ts.map +1 -0
  43. package/dist/pages/entry-review/index.js +219 -0
  44. package/dist/pages/entry-review/index.js.map +1 -0
  45. package/dist/pages/entry-review/marginalia.d.ts +28 -0
  46. package/dist/pages/entry-review/marginalia.d.ts.map +1 -0
  47. package/dist/pages/entry-review/marginalia.js +67 -0
  48. package/dist/pages/entry-review/marginalia.js.map +1 -0
  49. package/dist/pages/entry-review/not-found.d.ts +9 -0
  50. package/dist/pages/entry-review/not-found.d.ts.map +1 -0
  51. package/dist/pages/entry-review/not-found.js +34 -0
  52. package/dist/pages/entry-review/not-found.js.map +1 -0
  53. package/dist/pages/entry-review/outline-drawer.d.ts +12 -0
  54. package/dist/pages/entry-review/outline-drawer.d.ts.map +1 -0
  55. package/dist/pages/entry-review/outline-drawer.js +28 -0
  56. package/dist/pages/entry-review/outline-drawer.js.map +1 -0
  57. package/dist/pages/entry-review/shortcuts.d.ts +14 -0
  58. package/dist/pages/entry-review/shortcuts.d.ts.map +1 -0
  59. package/dist/pages/entry-review/shortcuts.js +36 -0
  60. package/dist/pages/entry-review/shortcuts.js.map +1 -0
  61. package/dist/pages/entry-review/version-strip.d.ts +33 -0
  62. package/dist/pages/entry-review/version-strip.d.ts.map +1 -0
  63. package/dist/pages/entry-review/version-strip.js +81 -0
  64. package/dist/pages/entry-review/version-strip.js.map +1 -0
  65. package/dist/pages/entry-review.d.ts +6 -21
  66. package/dist/pages/entry-review.d.ts.map +1 -1
  67. package/dist/pages/entry-review.js +6 -144
  68. package/dist/pages/entry-review.js.map +1 -1
  69. package/dist/pages/entry-review.ts +11 -181
  70. package/dist/pages/index.d.ts.map +1 -1
  71. package/dist/pages/index.js +6 -10
  72. package/dist/pages/index.js.map +1 -1
  73. package/dist/pages/index.ts +6 -10
  74. package/dist/pages/scrapbook.d.ts.map +1 -1
  75. package/dist/pages/scrapbook.js +208 -11
  76. package/dist/pages/scrapbook.js.map +1 -1
  77. package/dist/pages/scrapbook.ts +209 -10
  78. package/dist/pages/shortform-review.d.ts +32 -0
  79. package/dist/pages/shortform-review.d.ts.map +1 -0
  80. package/dist/pages/shortform-review.js +270 -0
  81. package/dist/pages/shortform-review.js.map +1 -0
  82. package/dist/pages/shortform-review.ts +342 -0
  83. package/dist/routes/api.d.ts +8 -0
  84. package/dist/routes/api.d.ts.map +1 -1
  85. package/dist/routes/api.js +115 -0
  86. package/dist/routes/api.js.map +1 -1
  87. package/dist/routes/entry-annotation-body.d.ts +26 -0
  88. package/dist/routes/entry-annotation-body.d.ts.map +1 -0
  89. package/dist/routes/entry-annotation-body.js +152 -0
  90. package/dist/routes/entry-annotation-body.js.map +1 -0
  91. package/dist/server.d.ts +1 -1
  92. package/dist/server.d.ts.map +1 -1
  93. package/dist/server.js +56 -193
  94. package/dist/server.js.map +1 -1
  95. package/package.json +2 -2
@@ -1,25 +1,10 @@
1
1
  /**
2
- * Entry-uuid keyed review surface — `/dev/editorial-review/entry/:entryId`.
2
+ * Entry-keyed press-check surface — `/dev/editorial-review/entry/:entryId`.
3
3
  *
4
- * Pipeline-redesign Task 35. The legacy `/dev/editorial-review/:slug`
5
- * (and its `:id` UUID variant) routes are workflow-uuid + calendar-entry
6
- * keyed. This sibling route is keyed by the *entry uuid* (the sidecar
7
- * id), uses the eight-stage entry model (Task 33/34), and renders the
8
- * minimal affordance set returned by `getAffordances(entry)`.
9
- *
10
- * The two surfaces coexist during the migration window. Once the
11
- * workflow-keyed routes are retired, this becomes the canonical review
12
- * surface; until then, the dashboard's per-row "review" links continue
13
- * to point at the legacy route.
14
- *
15
- * Rendering is intentionally minimal — the goal of Task 35 is the route
16
- * shape + affordance plumbing, not a fully-styled UI. Styling will land
17
- * once the affordance set stabilizes against real entries.
4
+ * The implementation lives in the `entry-review/` directory (one
5
+ * module per chrome component, each under the 500-line cap). This
6
+ * file re-exports the public render function so the existing
7
+ * `server.ts` import keeps working.
18
8
  */
19
- interface EntryReviewResult {
20
- status: 200 | 404;
21
- html: string;
22
- }
23
- export declare function renderEntryReviewPage(projectRoot: string, entryId: string): Promise<EntryReviewResult>;
24
- export {};
9
+ export { renderEntryReviewPage, type EntryReviewQuery, type EntryReviewResult, type EntryReviewIndexGetter, } from './entry-review/index.ts';
25
10
  //# sourceMappingURL=entry-review.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-review.d.ts","sourceRoot":"","sources":["../../src/pages/entry-review.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA+IH,UAAU,iBAAiB;IACzB,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAgB5B"}
1
+ {"version":3,"file":"entry-review.d.ts","sourceRoot":"","sources":["../../src/pages/entry-review.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,GAC5B,MAAM,yBAAyB,CAAC"}
@@ -1,148 +1,10 @@
1
1
  /**
2
- * Entry-uuid keyed review surface — `/dev/editorial-review/entry/:entryId`.
2
+ * Entry-keyed press-check surface — `/dev/editorial-review/entry/:entryId`.
3
3
  *
4
- * Pipeline-redesign Task 35. The legacy `/dev/editorial-review/:slug`
5
- * (and its `:id` UUID variant) routes are workflow-uuid + calendar-entry
6
- * keyed. This sibling route is keyed by the *entry uuid* (the sidecar
7
- * id), uses the eight-stage entry model (Task 33/34), and renders the
8
- * minimal affordance set returned by `getAffordances(entry)`.
9
- *
10
- * The two surfaces coexist during the migration window. Once the
11
- * workflow-keyed routes are retired, this becomes the canonical review
12
- * surface; until then, the dashboard's per-row "review" links continue
13
- * to point at the legacy route.
14
- *
15
- * Rendering is intentionally minimal — the goal of Task 35 is the route
16
- * shape + affordance plumbing, not a fully-styled UI. Styling will land
17
- * once the affordance set stabilizes against real entries.
4
+ * The implementation lives in the `entry-review/` directory (one
5
+ * module per chrome component, each under the 500-line cap). This
6
+ * file re-exports the public render function so the existing
7
+ * `server.ts` import keeps working.
18
8
  */
19
- import { resolveEntry } from "../lib/entry-resolver.js";
20
- import { getAffordances } from "../lib/stage-affordances.js";
21
- import { html, unsafe } from "./html.js";
22
- import { layout } from "./layout.js";
23
- const STAGE_PICKER_OPTIONS = [
24
- 'Ideas',
25
- 'Planned',
26
- 'Outlining',
27
- 'Drafting',
28
- 'Final',
29
- ];
30
- const CONTROL_LABELS = {
31
- save: 'Save',
32
- iterate: 'Iterate',
33
- approve: 'Approve',
34
- reject: 'Reject',
35
- 'historical-stage-dropdown': 'Historical stage',
36
- 'view-only': 'Read-only',
37
- 'fork-placeholder': 'Fork (coming)',
38
- 'induct-to': 'Induct to',
39
- };
40
- function renderControl(control, entry) {
41
- const label = CONTROL_LABELS[control] ?? control;
42
- if (control === 'induct-to') {
43
- const options = STAGE_PICKER_OPTIONS.map((s) => unsafe(html `<option value="${s}">${s}</option>`));
44
- return unsafe(html `
45
- <label class="er-entry-control er-entry-control--induct">
46
- <span class="er-entry-control-label">${label}</span>
47
- <select name="induct-to" data-entry-uuid="${entry.uuid}">
48
- ${options}
49
- </select>
50
- </label>`);
51
- }
52
- if (control === 'historical-stage-dropdown') {
53
- const stages = Object.keys(entry.iterationByStage);
54
- if (stages.length === 0) {
55
- return unsafe('');
56
- }
57
- const options = stages.map((s) => unsafe(html `<option value="${s}">${s}</option>`));
58
- return unsafe(html `
59
- <label class="er-entry-control er-entry-control--history">
60
- <span class="er-entry-control-label">${label}</span>
61
- <select name="history-stage" data-entry-uuid="${entry.uuid}">
62
- ${options}
63
- </select>
64
- </label>`);
65
- }
66
- if (control === 'view-only') {
67
- return unsafe(html `<span class="er-entry-control er-entry-control--readonly">${label}</span>`);
68
- }
69
- if (control === 'fork-placeholder') {
70
- return unsafe(html `<button class="er-entry-control er-entry-control--button" type="button" disabled data-control="fork">${label}</button>`);
71
- }
72
- return unsafe(html `<button class="er-entry-control er-entry-control--button" type="button" data-control="${control}" data-entry-uuid="${entry.uuid}">${label}</button>`);
73
- }
74
- function renderControls(entry, affordances) {
75
- const buttons = affordances.controls.map((c) => renderControl(c, entry));
76
- const className = affordances.mutable
77
- ? 'er-entry-controls er-entry-controls--mutable'
78
- : 'er-entry-controls er-entry-controls--readonly';
79
- return unsafe(html `<nav class="${className}" aria-label="Entry controls">${buttons}</nav>`);
80
- }
81
- function renderArtifact(body, mutable) {
82
- if (mutable) {
83
- return unsafe(html `
84
- <textarea class="er-entry-body" name="body" rows="24" data-mutable="true">${body}</textarea>`);
85
- }
86
- return unsafe(html `
87
- <pre class="er-entry-body er-entry-body--readonly" data-mutable="false">${body}</pre>`);
88
- }
89
- function renderEntryReview(entry, artifactBody, artifactPath, affordances) {
90
- const stageBadge = unsafe(html `<span class="er-entry-stage" data-stage="${entry.currentStage}">${entry.currentStage}</span>`);
91
- const priorBadge = entry.priorStage
92
- ? unsafe(html `<span class="er-entry-prior-stage">paused from ${entry.priorStage}</span>`)
93
- : '';
94
- const body = html `
95
- <main class="er-entry-shell" data-entry-uuid="${entry.uuid}">
96
- <header class="er-entry-head">
97
- <p class="er-entry-kicker">Editorial Review · entry</p>
98
- <h1 class="er-entry-title">${entry.title}</h1>
99
- <p class="er-entry-meta">
100
- ${stageBadge}
101
- ${priorBadge}
102
- <code class="er-entry-uuid">${entry.uuid}</code>
103
- </p>
104
- <p class="er-entry-artifact-path"><code>${artifactPath}</code></p>
105
- </header>
106
- ${renderControls(entry, affordances)}
107
- <section class="er-entry-artifact">
108
- ${renderArtifact(artifactBody, affordances.mutable)}
109
- </section>
110
- </main>`;
111
- return layout({
112
- title: `${entry.title} — entry review — dev`,
113
- cssHrefs: ['/static/css/editorial-review.css', '/static/css/entry-review.css'],
114
- bodyAttrs: 'data-review-ui="entry-review"',
115
- bodyHtml: body,
116
- scriptModules: ['entry-review-client'],
117
- });
118
- }
119
- function renderNotFound(entryId, reason) {
120
- const body = html `
121
- <main class="er-entry-shell er-entry-shell--missing">
122
- <h1>Entry not found</h1>
123
- <p>No sidecar matched <code>${entryId}</code>.</p>
124
- <p class="er-entry-detail">${reason}</p>
125
- <p><a href="/dev/editorial-studio">Back to the studio</a></p>
126
- </main>`;
127
- return layout({
128
- title: 'Entry not found — dev',
129
- cssHrefs: ['/static/css/editorial-review.css', '/static/css/entry-review.css'],
130
- bodyAttrs: 'data-review-ui="entry-review-missing"',
131
- bodyHtml: body,
132
- scriptModules: [],
133
- });
134
- }
135
- export async function renderEntryReviewPage(projectRoot, entryId) {
136
- let resolved;
137
- try {
138
- resolved = await resolveEntry(projectRoot, entryId);
139
- }
140
- catch (err) {
141
- const reason = err instanceof Error ? err.message : String(err);
142
- return { status: 404, html: renderNotFound(entryId, reason) };
143
- }
144
- const affordances = getAffordances(resolved.entry);
145
- const html = renderEntryReview(resolved.entry, resolved.artifactBody, resolved.artifactPath, affordances);
146
- return { status: 200, html };
147
- }
9
+ export { renderEntryReviewPage, } from "./entry-review/index.js";
148
10
  //# sourceMappingURL=entry-review.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-review.js","sourceRoot":"","sources":["../../src/pages/entry-review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entry-review.js","sourceRoot":"","sources":["../../src/pages/entry-review.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,qBAAqB,GAItB,MAAM,yBAAyB,CAAC"}
@@ -1,185 +1,15 @@
1
1
  /**
2
- * Entry-uuid keyed review surface — `/dev/editorial-review/entry/:entryId`.
2
+ * Entry-keyed press-check surface — `/dev/editorial-review/entry/:entryId`.
3
3
  *
4
- * Pipeline-redesign Task 35. The legacy `/dev/editorial-review/:slug`
5
- * (and its `:id` UUID variant) routes are workflow-uuid + calendar-entry
6
- * keyed. This sibling route is keyed by the *entry uuid* (the sidecar
7
- * id), uses the eight-stage entry model (Task 33/34), and renders the
8
- * minimal affordance set returned by `getAffordances(entry)`.
9
- *
10
- * The two surfaces coexist during the migration window. Once the
11
- * workflow-keyed routes are retired, this becomes the canonical review
12
- * surface; until then, the dashboard's per-row "review" links continue
13
- * to point at the legacy route.
14
- *
15
- * Rendering is intentionally minimal — the goal of Task 35 is the route
16
- * shape + affordance plumbing, not a fully-styled UI. Styling will land
17
- * once the affordance set stabilizes against real entries.
4
+ * The implementation lives in the `entry-review/` directory (one
5
+ * module per chrome component, each under the 500-line cap). This
6
+ * file re-exports the public render function so the existing
7
+ * `server.ts` import keeps working.
18
8
  */
19
9
 
20
- import { resolveEntry } from '../lib/entry-resolver.ts';
21
- import { getAffordances } from '../lib/stage-affordances.ts';
22
- import type { Affordances } from '../lib/stage-affordances.ts';
23
- import type { Entry } from '@deskwork/core/schema/entry';
24
- import { html, unsafe, type RawHtml } from './html.ts';
25
- import { layout } from './layout.ts';
26
-
27
- const STAGE_PICKER_OPTIONS = [
28
- 'Ideas',
29
- 'Planned',
30
- 'Outlining',
31
- 'Drafting',
32
- 'Final',
33
- ] as const;
34
-
35
- const CONTROL_LABELS: Readonly<Record<string, string>> = {
36
- save: 'Save',
37
- iterate: 'Iterate',
38
- approve: 'Approve',
39
- reject: 'Reject',
40
- 'historical-stage-dropdown': 'Historical stage',
41
- 'view-only': 'Read-only',
42
- 'fork-placeholder': 'Fork (coming)',
43
- 'induct-to': 'Induct to',
44
- };
45
-
46
- function renderControl(control: string, entry: Entry): RawHtml {
47
- const label = CONTROL_LABELS[control] ?? control;
48
- if (control === 'induct-to') {
49
- const options = STAGE_PICKER_OPTIONS.map(
50
- (s) => unsafe(html`<option value="${s}">${s}</option>`),
51
- );
52
- return unsafe(html`
53
- <label class="er-entry-control er-entry-control--induct">
54
- <span class="er-entry-control-label">${label}</span>
55
- <select name="induct-to" data-entry-uuid="${entry.uuid}">
56
- ${options}
57
- </select>
58
- </label>`);
59
- }
60
- if (control === 'historical-stage-dropdown') {
61
- const stages = Object.keys(entry.iterationByStage);
62
- if (stages.length === 0) {
63
- return unsafe('');
64
- }
65
- const options = stages.map(
66
- (s) => unsafe(html`<option value="${s}">${s}</option>`),
67
- );
68
- return unsafe(html`
69
- <label class="er-entry-control er-entry-control--history">
70
- <span class="er-entry-control-label">${label}</span>
71
- <select name="history-stage" data-entry-uuid="${entry.uuid}">
72
- ${options}
73
- </select>
74
- </label>`);
75
- }
76
- if (control === 'view-only') {
77
- return unsafe(html`<span class="er-entry-control er-entry-control--readonly">${label}</span>`);
78
- }
79
- if (control === 'fork-placeholder') {
80
- return unsafe(
81
- html`<button class="er-entry-control er-entry-control--button" type="button" disabled data-control="fork">${label}</button>`,
82
- );
83
- }
84
- return unsafe(
85
- html`<button class="er-entry-control er-entry-control--button" type="button" data-control="${control}" data-entry-uuid="${entry.uuid}">${label}</button>`,
86
- );
87
- }
88
-
89
- function renderControls(entry: Entry, affordances: Affordances): RawHtml {
90
- const buttons = affordances.controls.map((c) => renderControl(c, entry));
91
- const className = affordances.mutable
92
- ? 'er-entry-controls er-entry-controls--mutable'
93
- : 'er-entry-controls er-entry-controls--readonly';
94
- return unsafe(html`<nav class="${className}" aria-label="Entry controls">${buttons}</nav>`);
95
- }
96
-
97
- function renderArtifact(body: string, mutable: boolean): RawHtml {
98
- if (mutable) {
99
- return unsafe(html`
100
- <textarea class="er-entry-body" name="body" rows="24" data-mutable="true">${body}</textarea>`);
101
- }
102
- return unsafe(html`
103
- <pre class="er-entry-body er-entry-body--readonly" data-mutable="false">${body}</pre>`);
104
- }
105
-
106
- function renderEntryReview(
107
- entry: Entry,
108
- artifactBody: string,
109
- artifactPath: string,
110
- affordances: Affordances,
111
- ): string {
112
- const stageBadge = unsafe(
113
- html`<span class="er-entry-stage" data-stage="${entry.currentStage}">${entry.currentStage}</span>`,
114
- );
115
- const priorBadge = entry.priorStage
116
- ? unsafe(html`<span class="er-entry-prior-stage">paused from ${entry.priorStage}</span>`)
117
- : '';
118
- const body = html`
119
- <main class="er-entry-shell" data-entry-uuid="${entry.uuid}">
120
- <header class="er-entry-head">
121
- <p class="er-entry-kicker">Editorial Review · entry</p>
122
- <h1 class="er-entry-title">${entry.title}</h1>
123
- <p class="er-entry-meta">
124
- ${stageBadge}
125
- ${priorBadge}
126
- <code class="er-entry-uuid">${entry.uuid}</code>
127
- </p>
128
- <p class="er-entry-artifact-path"><code>${artifactPath}</code></p>
129
- </header>
130
- ${renderControls(entry, affordances)}
131
- <section class="er-entry-artifact">
132
- ${renderArtifact(artifactBody, affordances.mutable)}
133
- </section>
134
- </main>`;
135
- return layout({
136
- title: `${entry.title} — entry review — dev`,
137
- cssHrefs: ['/static/css/editorial-review.css', '/static/css/entry-review.css'],
138
- bodyAttrs: 'data-review-ui="entry-review"',
139
- bodyHtml: body,
140
- scriptModules: ['entry-review-client'],
141
- });
142
- }
143
-
144
- function renderNotFound(entryId: string, reason: string): string {
145
- const body = html`
146
- <main class="er-entry-shell er-entry-shell--missing">
147
- <h1>Entry not found</h1>
148
- <p>No sidecar matched <code>${entryId}</code>.</p>
149
- <p class="er-entry-detail">${reason}</p>
150
- <p><a href="/dev/editorial-studio">Back to the studio</a></p>
151
- </main>`;
152
- return layout({
153
- title: 'Entry not found — dev',
154
- cssHrefs: ['/static/css/editorial-review.css', '/static/css/entry-review.css'],
155
- bodyAttrs: 'data-review-ui="entry-review-missing"',
156
- bodyHtml: body,
157
- scriptModules: [],
158
- });
159
- }
160
-
161
- interface EntryReviewResult {
162
- status: 200 | 404;
163
- html: string;
164
- }
165
-
166
- export async function renderEntryReviewPage(
167
- projectRoot: string,
168
- entryId: string,
169
- ): Promise<EntryReviewResult> {
170
- let resolved;
171
- try {
172
- resolved = await resolveEntry(projectRoot, entryId);
173
- } catch (err) {
174
- const reason = err instanceof Error ? err.message : String(err);
175
- return { status: 404, html: renderNotFound(entryId, reason) };
176
- }
177
- const affordances = getAffordances(resolved.entry);
178
- const html = renderEntryReview(
179
- resolved.entry,
180
- resolved.artifactBody,
181
- resolved.artifactPath,
182
- affordances,
183
- );
184
- return { status: 200, html };
185
- }
10
+ export {
11
+ renderEntryReviewPage,
12
+ type EntryReviewQuery,
13
+ type EntryReviewResult,
14
+ type EntryReviewIndexGetter,
15
+ } from './entry-review/index.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAqDtD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,SAAS,KAAK,EAAE,GACxB,KAAK,GAAG,IAAI,CAOd;AAsKD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B3E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAqDtD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,SAAS,KAAK,EAAE,GACxB,KAAK,GAAG,IAAI,CAOd;AAkKD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B3E"}
@@ -56,14 +56,10 @@ async function buildSections(ctx) {
56
56
  }
57
57
  })();
58
58
  const longformDefaultEntry = pickDefaultLongformEntry(entries);
59
- // Issue #107 / pipeline-redesign Task 36: III links to the
60
- // most-recent in-review (or iterating) longform entry when one
61
- // exists, else falls back to the dashboard's Review section anchor
62
- // (`#stage-review`, mounted in sub-phase D). The visual template
63
- // hint stays alongside the link so adopters still see the URL
64
- // shape — `<slug>` placeholder shown in red-pencil italic. The
65
- // link target is the entry-uuid keyed review route added in
66
- // Task 35 (`/dev/editorial-review/entry/<uuid>`).
59
+ // Issue #107: III links to the most-recent in-review (or iterating)
60
+ // longform entry when one exists, else falls back to the dashboard's
61
+ // Review section anchor (`#stage-review`). The link target is the
62
+ // entry-keyed review route `/dev/editorial-review/entry/<uuid>`.
67
63
  const longformLinkHref = longformDefaultEntry !== null
68
64
  ? `/dev/editorial-review/entry/${longformDefaultEntry.uuid}`
69
65
  : '/dev/editorial-studio#stage-review';
@@ -98,9 +94,9 @@ async function buildSections(ctx) {
98
94
  numeral: 'III',
99
95
  titleHtml: 'Longform reviews',
100
96
  titleText: 'Longform reviews',
101
- route: '/dev/editorial-review/<slug>',
97
+ route: '/dev/editorial-review/entry/<uuid>',
102
98
  linkHref: longformLinkHref,
103
- template: { prefix: '/dev/editorial-review/', placeholder: '<slug>' },
99
+ template: { prefix: '/dev/editorial-review/entry/', placeholder: '<uuid>' },
104
100
  desc: 'Per-entry margin notes, decisions, iterate flow.',
105
101
  hint: 'entry-by-entry',
106
102
  postHint: longformDefaultEntry !== null
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"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"}
@@ -102,14 +102,10 @@ async function buildSections(ctx: StudioContext): Promise<readonly IndexSection[
102
102
  }
103
103
  })();
104
104
  const longformDefaultEntry = pickDefaultLongformEntry(entries);
105
- // Issue #107 / pipeline-redesign Task 36: III links to the
106
- // most-recent in-review (or iterating) longform entry when one
107
- // exists, else falls back to the dashboard's Review section anchor
108
- // (`#stage-review`, mounted in sub-phase D). The visual template
109
- // hint stays alongside the link so adopters still see the URL
110
- // shape — `<slug>` placeholder shown in red-pencil italic. The
111
- // link target is the entry-uuid keyed review route added in
112
- // Task 35 (`/dev/editorial-review/entry/<uuid>`).
105
+ // Issue #107: III links to the most-recent in-review (or iterating)
106
+ // longform entry when one exists, else falls back to the dashboard's
107
+ // Review section anchor (`#stage-review`). The link target is the
108
+ // entry-keyed review route `/dev/editorial-review/entry/<uuid>`.
113
109
  const longformLinkHref =
114
110
  longformDefaultEntry !== null
115
111
  ? `/dev/editorial-review/entry/${longformDefaultEntry.uuid}`
@@ -146,9 +142,9 @@ async function buildSections(ctx: StudioContext): Promise<readonly IndexSection[
146
142
  numeral: 'III',
147
143
  titleHtml: 'Longform reviews',
148
144
  titleText: 'Longform reviews',
149
- route: '/dev/editorial-review/<slug>',
145
+ route: '/dev/editorial-review/entry/<uuid>',
150
146
  linkHref: longformLinkHref,
151
- template: { prefix: '/dev/editorial-review/', placeholder: '<slug>' },
147
+ template: { prefix: '/dev/editorial-review/entry/', placeholder: '<uuid>' },
152
148
  desc: 'Per-entry margin notes, decisions, iterate flow.',
153
149
  hint: 'entry-by-entry',
154
150
  postHint:
@@ -1 +1 @@
1
- {"version":3,"file":"scrapbook.d.ts","sourceRoot":"","sources":["../../src/pages/scrapbook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAoYtD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAqDR"}
1
+ {"version":3,"file":"scrapbook.d.ts","sourceRoot":"","sources":["../../src/pages/scrapbook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAskBtD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAuDR"}