@deskwork/cli 0.12.0 → 0.13.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/dist/commands/approve.d.ts +8 -7
- package/dist/commands/approve.d.ts.map +1 -1
- package/dist/commands/approve.js +152 -121
- package/dist/commands/approve.js.map +1 -1
- package/dist/commands/publish.d.ts +16 -7
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +79 -25
- package/dist/commands/publish.js.map +1 -1
- package/package.json +5 -4
- package/dist/commands/draft.d.ts +0 -17
- package/dist/commands/draft.d.ts.map +0 -1
- package/dist/commands/draft.js +0 -77
- package/dist/commands/draft.js.map +0 -1
- package/dist/commands/outline.d.ts +0 -19
- package/dist/commands/outline.d.ts.map +0 -1
- package/dist/commands/outline.js +0 -102
- package/dist/commands/outline.js.map +0 -1
- package/dist/commands/pause.d.ts +0 -15
- package/dist/commands/pause.d.ts.map +0 -1
- package/dist/commands/pause.js +0 -70
- package/dist/commands/pause.js.map +0 -1
- package/dist/commands/plan.d.ts +0 -12
- package/dist/commands/plan.d.ts.map +0 -1
- package/dist/commands/plan.js +0 -74
- package/dist/commands/plan.js.map +0 -1
- package/dist/commands/resume.d.ts +0 -16
- package/dist/commands/resume.d.ts.map +0 -1
- package/dist/commands/resume.js +0 -70
- package/dist/commands/resume.js.map +0 -1
- package/dist/commands/review-cancel.d.ts +0 -15
- package/dist/commands/review-cancel.d.ts.map +0 -1
- package/dist/commands/review-cancel.js +0 -88
- package/dist/commands/review-cancel.js.map +0 -1
- package/dist/commands/review-help.d.ts +0 -12
- package/dist/commands/review-help.d.ts.map +0 -1
- package/dist/commands/review-help.js +0 -52
- package/dist/commands/review-help.js.map +0 -1
- package/dist/commands/review-report.d.ts +0 -13
- package/dist/commands/review-report.d.ts.map +0 -1
- package/dist/commands/review-report.js +0 -53
- package/dist/commands/review-report.js.map +0 -1
- package/dist/commands/review-start.d.ts +0 -17
- package/dist/commands/review-start.d.ts.map +0 -1
- package/dist/commands/review-start.js +0 -121
- package/dist/commands/review-start.js.map +0 -1
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deskwork-review-cancel — mark a review workflow as cancelled.
|
|
3
|
-
*
|
|
4
|
-
* Cancellation is a terminal state: the journal retains the workflow for
|
|
5
|
-
* audit but it no longer appears in listOpen. Use when a draft is
|
|
6
|
-
* abandoned, a workflow was enqueued by mistake, or a review has
|
|
7
|
-
* been superseded.
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* deskwork-review-cancel <project-root> [--site <slug>] <slug>
|
|
11
|
-
* deskwork-review-cancel <project-root> [--site <slug>] <slug> --platform <p> [--channel <c>]
|
|
12
|
-
* deskwork-review-cancel <project-root> [--kind outline] <slug>
|
|
13
|
-
*/
|
|
14
|
-
import { readConfig } from '@deskwork/core/config';
|
|
15
|
-
import { resolveSite } from '@deskwork/core/paths';
|
|
16
|
-
import { handleGetWorkflow } from '@deskwork/core/review/handlers';
|
|
17
|
-
import { transitionState } from '@deskwork/core/review/pipeline';
|
|
18
|
-
import { isPlatform } from '@deskwork/core/types';
|
|
19
|
-
import { absolutize, emit, fail, parseArgs } from '@deskwork/core/cli-args';
|
|
20
|
-
export async function run(argv) {
|
|
21
|
-
const KNOWN_FLAGS = ['site', 'platform', 'channel', 'kind'];
|
|
22
|
-
const { positional, flags } = parse();
|
|
23
|
-
if (positional.length < 2) {
|
|
24
|
-
fail('Usage: deskwork-review-cancel <project-root> [--site <slug>] ' +
|
|
25
|
-
'[--platform <p>] [--channel <c>] [--kind longform|outline|shortform] <slug>', 2);
|
|
26
|
-
}
|
|
27
|
-
const [rootArg, slug] = positional;
|
|
28
|
-
const projectRoot = absolutize(rootArg);
|
|
29
|
-
if (flags.platform !== undefined && !isPlatform(flags.platform)) {
|
|
30
|
-
fail(`Invalid --platform "${flags.platform}".`);
|
|
31
|
-
}
|
|
32
|
-
let config;
|
|
33
|
-
try {
|
|
34
|
-
config = readConfig(projectRoot);
|
|
35
|
-
}
|
|
36
|
-
catch (err) {
|
|
37
|
-
fail(err instanceof Error ? err.message : String(err));
|
|
38
|
-
}
|
|
39
|
-
const site = resolveSite(config, flags.site);
|
|
40
|
-
const contentKind = flags.kind ?? (flags.platform ? 'shortform' : 'longform');
|
|
41
|
-
if (!['longform', 'shortform', 'outline'].includes(contentKind)) {
|
|
42
|
-
fail(`Invalid --kind "${contentKind}".`);
|
|
43
|
-
}
|
|
44
|
-
const fetched = handleGetWorkflow(projectRoot, config, {
|
|
45
|
-
id: null,
|
|
46
|
-
site,
|
|
47
|
-
slug,
|
|
48
|
-
contentKind,
|
|
49
|
-
platform: flags.platform ?? null,
|
|
50
|
-
channel: flags.channel ?? null,
|
|
51
|
-
});
|
|
52
|
-
if (fetched.status !== 200 || !isWorkflowBody(fetched.body)) {
|
|
53
|
-
fail(`no ${contentKind} workflow for ${site}/${slug}: ${errorMessage(fetched.body)}`);
|
|
54
|
-
}
|
|
55
|
-
const workflow = fetched.body.workflow;
|
|
56
|
-
if (workflow.state === 'applied' || workflow.state === 'cancelled') {
|
|
57
|
-
fail(`Workflow ${workflow.id} is in terminal state '${workflow.state}' — already resolved, nothing to cancel.`);
|
|
58
|
-
}
|
|
59
|
-
const updated = transitionState(projectRoot, config, workflow.id, 'cancelled');
|
|
60
|
-
emit({
|
|
61
|
-
workflowId: updated.id,
|
|
62
|
-
site: updated.site,
|
|
63
|
-
slug: updated.slug,
|
|
64
|
-
contentKind: updated.contentKind,
|
|
65
|
-
state: updated.state,
|
|
66
|
-
previousState: workflow.state,
|
|
67
|
-
});
|
|
68
|
-
function isWorkflowBody(body) {
|
|
69
|
-
return typeof body === 'object' && body !== null && 'workflow' in body;
|
|
70
|
-
}
|
|
71
|
-
function errorMessage(body) {
|
|
72
|
-
if (typeof body === 'object' && body !== null) {
|
|
73
|
-
const value = Reflect.get(body, 'error');
|
|
74
|
-
if (typeof value === 'string')
|
|
75
|
-
return value;
|
|
76
|
-
}
|
|
77
|
-
return 'unknown error';
|
|
78
|
-
}
|
|
79
|
-
function parse() {
|
|
80
|
-
try {
|
|
81
|
-
return parseArgs(argv, KNOWN_FLAGS);
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
fail(err instanceof Error ? err.message : String(err), 2);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=review-cancel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-cancel.js","sourceRoot":"","sources":["../../src/commands/review-cancel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAU,CAAC;IAErE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;IAEtC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,CACF,+DAA+D;YAC7D,6EAA6E,EAC/E,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC;IACnC,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,uBAAuB,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9E,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,mBAAmB,WAAW,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE;QACrD,EAAE,EAAE,IAAI;QACR,IAAI;QACJ,IAAI;QACJ,WAAW;QACX,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;QAChC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;KAC/B,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,CACF,MAAM,WAAW,iBAAiB,IAAI,IAAI,IAAI,KAAK,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;IAEvC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACnE,IAAI,CACF,YAAY,QAAQ,CAAC,EAAE,0BAA0B,QAAQ,CAAC,KAAK,0CAA0C,CAC1G,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAE/E,IAAI,CAAC;QACH,UAAU,EAAE,OAAO,CAAC,EAAE;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE,QAAQ,CAAC,KAAK;KAC9B,CAAC,CAAC;IAEH,SAAS,cAAc,CAAC,IAAa;QACnC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,UAAU,IAAI,IAAI,CAAC;IACzE,CAAC;IAED,SAAS,YAAY,CAAC,IAAa;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzC,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;QAC9C,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,SAAS,KAAK;QACZ,IAAI,CAAC;YACH,OAAO,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deskwork-review-help — list open review workflows.
|
|
3
|
-
*
|
|
4
|
-
* Reports every non-terminal workflow with its site, slug, state,
|
|
5
|
-
* current version, and content kind. Useful at session start to see
|
|
6
|
-
* what's in flight across the editorial pipeline.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* deskwork-review-help <project-root> [--site <slug>]
|
|
10
|
-
*/
|
|
11
|
-
export declare function run(argv: string[]): Promise<void>;
|
|
12
|
-
//# sourceMappingURL=review-help.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-help.d.ts","sourceRoot":"","sources":["../../src/commands/review-help.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CvD"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deskwork-review-help — list open review workflows.
|
|
3
|
-
*
|
|
4
|
-
* Reports every non-terminal workflow with its site, slug, state,
|
|
5
|
-
* current version, and content kind. Useful at session start to see
|
|
6
|
-
* what's in flight across the editorial pipeline.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* deskwork-review-help <project-root> [--site <slug>]
|
|
10
|
-
*/
|
|
11
|
-
import { readConfig } from '@deskwork/core/config';
|
|
12
|
-
import { listOpen } from '@deskwork/core/review/pipeline';
|
|
13
|
-
import { absolutize, emit, fail, parseArgs } from '@deskwork/core/cli-args';
|
|
14
|
-
export async function run(argv) {
|
|
15
|
-
const KNOWN_FLAGS = ['site'];
|
|
16
|
-
const { positional, flags } = parse();
|
|
17
|
-
if (positional.length < 1) {
|
|
18
|
-
fail('Usage: deskwork-review-help <project-root> [--site <slug>]', 2);
|
|
19
|
-
}
|
|
20
|
-
const projectRoot = absolutize(positional[0]);
|
|
21
|
-
let config;
|
|
22
|
-
try {
|
|
23
|
-
config = readConfig(projectRoot);
|
|
24
|
-
}
|
|
25
|
-
catch (err) {
|
|
26
|
-
fail(err instanceof Error ? err.message : String(err));
|
|
27
|
-
}
|
|
28
|
-
const open = listOpen(projectRoot, config, flags.site);
|
|
29
|
-
emit({
|
|
30
|
-
count: open.length,
|
|
31
|
-
workflows: open.map((w) => ({
|
|
32
|
-
id: w.id,
|
|
33
|
-
site: w.site,
|
|
34
|
-
slug: w.slug,
|
|
35
|
-
contentKind: w.contentKind,
|
|
36
|
-
state: w.state,
|
|
37
|
-
version: w.currentVersion,
|
|
38
|
-
updatedAt: w.updatedAt,
|
|
39
|
-
platform: w.platform,
|
|
40
|
-
channel: w.channel,
|
|
41
|
-
})),
|
|
42
|
-
});
|
|
43
|
-
function parse() {
|
|
44
|
-
try {
|
|
45
|
-
return parseArgs(argv, KNOWN_FLAGS);
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
fail(err instanceof Error ? err.message : String(err), 2);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=review-help.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-help.js","sourceRoot":"","sources":["../../src/commands/review-help.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,WAAW,GAAG,CAAC,MAAM,CAAU,CAAC;IAEtC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;IAEtC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,4DAA4D,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9C,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,cAAc;YACzB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,SAAS,KAAK;QACZ,IAAI,CAAC;YACH,OAAO,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deskwork-review-report — voice-drift signal across completed reviews.
|
|
3
|
-
*
|
|
4
|
-
* Builds the report from the review journal. By default includes only
|
|
5
|
-
* terminal workflows (applied or cancelled) — in-flight workflows don't
|
|
6
|
-
* represent settled signal yet.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* deskwork-review-report <project-root> [--site <slug>] [--include-active]
|
|
10
|
-
* deskwork-review-report <project-root> --format text
|
|
11
|
-
*/
|
|
12
|
-
export declare function run(argv: string[]): Promise<void>;
|
|
13
|
-
//# sourceMappingURL=review-report.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-report.d.ts","sourceRoot":"","sources":["../../src/commands/review-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CvD"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deskwork-review-report — voice-drift signal across completed reviews.
|
|
3
|
-
*
|
|
4
|
-
* Builds the report from the review journal. By default includes only
|
|
5
|
-
* terminal workflows (applied or cancelled) — in-flight workflows don't
|
|
6
|
-
* represent settled signal yet.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* deskwork-review-report <project-root> [--site <slug>] [--include-active]
|
|
10
|
-
* deskwork-review-report <project-root> --format text
|
|
11
|
-
*/
|
|
12
|
-
import { readConfig } from '@deskwork/core/config';
|
|
13
|
-
import { buildReport, renderReport } from '@deskwork/core/review/report';
|
|
14
|
-
import { absolutize, emit, fail, parseArgs } from '@deskwork/core/cli-args';
|
|
15
|
-
export async function run(argv) {
|
|
16
|
-
const KNOWN_FLAGS = ['site', 'format'];
|
|
17
|
-
const BOOLEAN_FLAGS = ['include-active'];
|
|
18
|
-
const { positional, flags, booleans } = parse();
|
|
19
|
-
if (positional.length < 1) {
|
|
20
|
-
fail('Usage: deskwork-review-report <project-root> [--site <slug>] [--include-active] [--format text|json]', 2);
|
|
21
|
-
}
|
|
22
|
-
const projectRoot = absolutize(positional[0]);
|
|
23
|
-
const format = flags.format ?? 'json';
|
|
24
|
-
if (format !== 'json' && format !== 'text') {
|
|
25
|
-
fail(`Invalid --format "${flags.format}". Must be "json" or "text".`);
|
|
26
|
-
}
|
|
27
|
-
let config;
|
|
28
|
-
try {
|
|
29
|
-
config = readConfig(projectRoot);
|
|
30
|
-
}
|
|
31
|
-
catch (err) {
|
|
32
|
-
fail(err instanceof Error ? err.message : String(err));
|
|
33
|
-
}
|
|
34
|
-
const report = buildReport(projectRoot, config, {
|
|
35
|
-
terminalOnly: !booleans.has('include-active'),
|
|
36
|
-
...(flags.site !== undefined ? { site: flags.site } : {}),
|
|
37
|
-
});
|
|
38
|
-
if (format === 'text') {
|
|
39
|
-
process.stdout.write(renderReport(report) + '\n');
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
emit(report);
|
|
43
|
-
}
|
|
44
|
-
function parse() {
|
|
45
|
-
try {
|
|
46
|
-
return parseArgs(argv, KNOWN_FLAGS, BOOLEAN_FLAGS);
|
|
47
|
-
}
|
|
48
|
-
catch (err) {
|
|
49
|
-
fail(err instanceof Error ? err.message : String(err), 2);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=review-report.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-report.js","sourceRoot":"","sources":["../../src/commands/review-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAU,CAAC;IAChD,MAAM,aAAa,GAAG,CAAC,gBAAgB,CAAU,CAAC;IAElD,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IAEhD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,CACF,sGAAsG,EACtG,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC;IACtC,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3C,IAAI,CAAC,qBAAqB,KAAK,CAAC,MAAM,8BAA8B,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE;QAC9C,YAAY,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC,CAAC;IAEH,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,CAAC,CAAC;IACf,CAAC;IAED,SAAS,KAAK;QACZ,IAAI,CAAC;YACH,OAAO,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deskwork-review-start — enqueue a longform draft for review.
|
|
3
|
-
*
|
|
4
|
-
* Reads the blog markdown from disk (honoring the site's
|
|
5
|
-
* blogFilenameTemplate) and creates a longform review workflow in state
|
|
6
|
-
* `open`. Idempotent on (site, slug, contentKind='longform'): if a
|
|
7
|
-
* non-terminal workflow already matches, the existing one is returned.
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* deskwork-review-start <project-root> [--site <slug>] <slug>
|
|
11
|
-
*
|
|
12
|
-
* Emits a JSON result with the workflow id, the `existing` flag, and a
|
|
13
|
-
* report of any divergence between disk and the workflow's current
|
|
14
|
-
* version (agent iterate work mid-flight).
|
|
15
|
-
*/
|
|
16
|
-
export declare function run(argv: string[]): Promise<void>;
|
|
17
|
-
//# sourceMappingURL=review-start.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-start.d.ts","sourceRoot":"","sources":["../../src/commands/review-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAeH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GvD"}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deskwork-review-start — enqueue a longform draft for review.
|
|
3
|
-
*
|
|
4
|
-
* Reads the blog markdown from disk (honoring the site's
|
|
5
|
-
* blogFilenameTemplate) and creates a longform review workflow in state
|
|
6
|
-
* `open`. Idempotent on (site, slug, contentKind='longform'): if a
|
|
7
|
-
* non-terminal workflow already matches, the existing one is returned.
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* deskwork-review-start <project-root> [--site <slug>] <slug>
|
|
11
|
-
*
|
|
12
|
-
* Emits a JSON result with the workflow id, the `existing` flag, and a
|
|
13
|
-
* report of any divergence between disk and the workflow's current
|
|
14
|
-
* version (agent iterate work mid-flight).
|
|
15
|
-
*/
|
|
16
|
-
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
17
|
-
import { dirname } from 'node:path';
|
|
18
|
-
import { readConfig } from '@deskwork/core/config';
|
|
19
|
-
import { resolveSite, resolveCalendarPath, resolveEntryFilePath, } from '@deskwork/core/paths';
|
|
20
|
-
import { readCalendar } from '@deskwork/core/calendar';
|
|
21
|
-
import { createWorkflow, readVersions } from '@deskwork/core/review/pipeline';
|
|
22
|
-
import { bodyState } from '@deskwork/core/body-state';
|
|
23
|
-
import { absolutize, emit, fail, parseArgs } from '@deskwork/core/cli-args';
|
|
24
|
-
export async function run(argv) {
|
|
25
|
-
const KNOWN_FLAGS = ['site'];
|
|
26
|
-
const SLUG_RE = /^[a-z0-9][a-z0-9-]*(\/[a-z0-9][a-z0-9-]*)*$/;
|
|
27
|
-
const { positional, flags } = parse();
|
|
28
|
-
if (positional.length < 2) {
|
|
29
|
-
fail('Usage: deskwork-review-start <project-root> [--site <slug>] <slug>', 2);
|
|
30
|
-
}
|
|
31
|
-
const [rootArg, slug] = positional;
|
|
32
|
-
const projectRoot = absolutize(rootArg);
|
|
33
|
-
if (!SLUG_RE.test(slug)) {
|
|
34
|
-
fail(`invalid slug: ${slug} (must match ${SLUG_RE})`);
|
|
35
|
-
}
|
|
36
|
-
let config;
|
|
37
|
-
try {
|
|
38
|
-
config = readConfig(projectRoot);
|
|
39
|
-
}
|
|
40
|
-
catch (err) {
|
|
41
|
-
fail(err instanceof Error ? err.message : String(err));
|
|
42
|
-
}
|
|
43
|
-
const site = resolveSite(config, flags.site);
|
|
44
|
-
// Resolve entryId from the calendar BEFORE picking a file path. The
|
|
45
|
-
// entry id is what survives slug renames; the workflow records it,
|
|
46
|
-
// and the path resolver prefers the UUID-bound file to the slug
|
|
47
|
-
// template (Issue #67).
|
|
48
|
-
let entryId;
|
|
49
|
-
try {
|
|
50
|
-
const calendarPath = resolveCalendarPath(projectRoot, config, site);
|
|
51
|
-
if (existsSync(calendarPath)) {
|
|
52
|
-
const cal = readCalendar(calendarPath);
|
|
53
|
-
entryId = cal.entries.find((e) => e.slug === slug)?.id;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
entryId = undefined;
|
|
58
|
-
}
|
|
59
|
-
const file = resolveEntryFilePath(projectRoot, config, site, slug, entryId);
|
|
60
|
-
if (!existsSync(file)) {
|
|
61
|
-
const siblings = listSiblingSlugs(file);
|
|
62
|
-
const list = siblings.length > 0 ? siblings.join(', ') : '(none)';
|
|
63
|
-
fail(`No blog markdown at ${file}.\n` +
|
|
64
|
-
`Existing slugs on ${site}: ${list}.\n` +
|
|
65
|
-
`Run /deskwork:outline <slug> (or /deskwork:draft) to scaffold it first.`);
|
|
66
|
-
}
|
|
67
|
-
const initialMarkdown = readFileSync(file, 'utf8');
|
|
68
|
-
const body = bodyState(file);
|
|
69
|
-
// createWorkflow is idempotent. Capture `before` to detect whether a
|
|
70
|
-
// fresh workflow was created vs an existing one matched.
|
|
71
|
-
const before = Date.now();
|
|
72
|
-
const workflow = createWorkflow(projectRoot, config, {
|
|
73
|
-
site,
|
|
74
|
-
slug,
|
|
75
|
-
...(entryId !== undefined && entryId !== '' ? { entryId } : {}),
|
|
76
|
-
contentKind: 'longform',
|
|
77
|
-
initialMarkdown,
|
|
78
|
-
initialOriginatedBy: 'agent',
|
|
79
|
-
});
|
|
80
|
-
const fresh = Date.parse(workflow.createdAt) >= before;
|
|
81
|
-
// SSOT check: if disk differs from the workflow's current version, report
|
|
82
|
-
// — do NOT auto-commit (the iterate flow handles its own snapshot).
|
|
83
|
-
let divergence = null;
|
|
84
|
-
if (!fresh) {
|
|
85
|
-
const versions = readVersions(projectRoot, config, workflow.id);
|
|
86
|
-
const current = versions.find((v) => v.version === workflow.currentVersion);
|
|
87
|
-
if (current && current.markdown !== initialMarkdown) {
|
|
88
|
-
divergence = {
|
|
89
|
-
diskLen: initialMarkdown.length,
|
|
90
|
-
versionLen: current.markdown.length,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
emit({
|
|
95
|
-
workflowId: workflow.id,
|
|
96
|
-
site: workflow.site,
|
|
97
|
-
slug: workflow.slug,
|
|
98
|
-
state: workflow.state,
|
|
99
|
-
version: workflow.currentVersion,
|
|
100
|
-
fresh,
|
|
101
|
-
bodyState: body,
|
|
102
|
-
divergence,
|
|
103
|
-
});
|
|
104
|
-
function parse() {
|
|
105
|
-
try {
|
|
106
|
-
return parseArgs(argv, KNOWN_FLAGS);
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
fail(err instanceof Error ? err.message : String(err), 2);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
function listSiblingSlugs(blogFile) {
|
|
113
|
-
const dir = dirname(blogFile);
|
|
114
|
-
if (!existsSync(dir))
|
|
115
|
-
return [];
|
|
116
|
-
return readdirSync(dir)
|
|
117
|
-
.filter((name) => name.endsWith('.md'))
|
|
118
|
-
.map((name) => name.replace(/\.md$/, ''));
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=review-start.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-start.js","sourceRoot":"","sources":["../../src/commands/review-start.ts"],"names":[],"mappings":"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"}
|