@deskwork/cli 0.9.5
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/cli.d.ts +19 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +98 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +13 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +91 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/approve.d.ts +18 -0
- package/dist/commands/approve.d.ts.map +1 -0
- package/dist/commands/approve.js +179 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/customize.d.ts +47 -0
- package/dist/commands/customize.d.ts.map +1 -0
- package/dist/commands/customize.js +176 -0
- package/dist/commands/customize.js.map +1 -0
- package/dist/commands/distribute.d.ts +30 -0
- package/dist/commands/distribute.d.ts.map +1 -0
- package/dist/commands/distribute.js +148 -0
- package/dist/commands/distribute.js.map +1 -0
- package/dist/commands/doctor.d.ts +35 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +354 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/draft.d.ts +17 -0
- package/dist/commands/draft.d.ts.map +1 -0
- package/dist/commands/draft.js +77 -0
- package/dist/commands/draft.js.map +1 -0
- package/dist/commands/ingest.d.ts +43 -0
- package/dist/commands/ingest.d.ts.map +1 -0
- package/dist/commands/ingest.js +321 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/install-preflight.d.ts +83 -0
- package/dist/commands/install-preflight.d.ts.map +1 -0
- package/dist/commands/install-preflight.js +300 -0
- package/dist/commands/install-preflight.js.map +1 -0
- package/dist/commands/install.d.ts +27 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +132 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/iterate.d.ts +33 -0
- package/dist/commands/iterate.d.ts.map +1 -0
- package/dist/commands/iterate.js +202 -0
- package/dist/commands/iterate.js.map +1 -0
- package/dist/commands/outline.d.ts +19 -0
- package/dist/commands/outline.d.ts.map +1 -0
- package/dist/commands/outline.js +102 -0
- package/dist/commands/outline.js.map +1 -0
- package/dist/commands/pause.d.ts +15 -0
- package/dist/commands/pause.d.ts.map +1 -0
- package/dist/commands/pause.js +70 -0
- package/dist/commands/pause.js.map +1 -0
- package/dist/commands/plan.d.ts +12 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +74 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/publish.d.ts +18 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +105 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/resume.d.ts +16 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +70 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/review-cancel.d.ts +15 -0
- package/dist/commands/review-cancel.d.ts.map +1 -0
- package/dist/commands/review-cancel.js +88 -0
- package/dist/commands/review-cancel.js.map +1 -0
- package/dist/commands/review-help.d.ts +12 -0
- package/dist/commands/review-help.d.ts.map +1 -0
- package/dist/commands/review-help.js +52 -0
- package/dist/commands/review-help.js.map +1 -0
- package/dist/commands/review-report.d.ts +13 -0
- package/dist/commands/review-report.d.ts.map +1 -0
- package/dist/commands/review-report.js +53 -0
- package/dist/commands/review-report.js.map +1 -0
- package/dist/commands/review-start.d.ts +17 -0
- package/dist/commands/review-start.d.ts.map +1 -0
- package/dist/commands/review-start.js +121 -0
- package/dist/commands/review-start.js.map +1 -0
- package/dist/commands/shortform-start.d.ts +33 -0
- package/dist/commands/shortform-start.d.ts.map +1 -0
- package/dist/commands/shortform-start.js +127 -0
- package/dist/commands/shortform-start.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* deskwork doctor — validate and (optionally) repair binding metadata
|
|
3
|
+
* across the calendar + content tree + workflow store.
|
|
4
|
+
*
|
|
5
|
+
* Default mode is audit-only: walk the rules, report findings, exit 0
|
|
6
|
+
* on a clean tree or 1 if anything was reported. `--fix=<rule>` (or
|
|
7
|
+
* `--fix=all`) engages repair mode; `--yes` makes repairs non-
|
|
8
|
+
* interactive (skipping ambiguous cases). `--json` produces machine-
|
|
9
|
+
* readable output that composes with `jq`.
|
|
10
|
+
*
|
|
11
|
+
* Argv shape (after the dispatcher injects projectRoot when needed):
|
|
12
|
+
*
|
|
13
|
+
* <project-root> [flags]
|
|
14
|
+
*
|
|
15
|
+
* Flags:
|
|
16
|
+
* --site <slug> Restrict to one site; default = every site.
|
|
17
|
+
* --fix <rule|all> Engage repair mode for the named rule(s).
|
|
18
|
+
* --yes Non-interactive repair (skip ambiguous).
|
|
19
|
+
* --json Emit JSON instead of human-readable text.
|
|
20
|
+
*
|
|
21
|
+
* Exit codes (Issue #44, Phase 22):
|
|
22
|
+
* 0 Audit clean. OR --fix succeeded for every applicable finding.
|
|
23
|
+
* "Applicable" here means: anything that wasn't skipped because
|
|
24
|
+
* a prerequisite outside doctor's scope hasn't happened yet (e.g.
|
|
25
|
+
* the body file hasn't been scaffolded, so missing-frontmatter-id
|
|
26
|
+
* can't bind).
|
|
27
|
+
* 1 Findings present (audit-only mode). OR --fix encountered real
|
|
28
|
+
* follow-ups: ambiguous cases requiring interactive resolution,
|
|
29
|
+
* schema rejections needing the operator to patch the host
|
|
30
|
+
* schema, editorial decisions, operator declines, or hard
|
|
31
|
+
* apply-failures.
|
|
32
|
+
* 2 Usage / config error.
|
|
33
|
+
*/
|
|
34
|
+
import { createInterface } from 'node:readline/promises';
|
|
35
|
+
import { stdin, stdout } from 'node:process';
|
|
36
|
+
import { readConfig } from '@deskwork/core/config';
|
|
37
|
+
import { absolutize, fail, parseArgs } from '@deskwork/core/cli-args';
|
|
38
|
+
import { RULES, parseFixArgument, runAudit, runRepair, yesInteraction, } from '@deskwork/core/doctor';
|
|
39
|
+
const KNOWN_FLAGS = ['site', 'fix'];
|
|
40
|
+
const BOOLEAN_FLAGS = ['yes', 'json'];
|
|
41
|
+
export async function run(argv) {
|
|
42
|
+
const { positional, flags, booleans } = parseInput(argv);
|
|
43
|
+
if (positional.length < 1) {
|
|
44
|
+
fail('Usage: deskwork doctor <project-root> [--site <slug>] [--fix <rule|all>] [--yes] [--json]', 2);
|
|
45
|
+
}
|
|
46
|
+
const [rootArg] = positional;
|
|
47
|
+
const projectRoot = absolutize(rootArg);
|
|
48
|
+
let config;
|
|
49
|
+
try {
|
|
50
|
+
config = readConfig(projectRoot);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
fail(err instanceof Error ? err.message : String(err), 2);
|
|
54
|
+
}
|
|
55
|
+
if (flags.site !== undefined && !(flags.site in config.sites)) {
|
|
56
|
+
fail(`Unknown --site "${flags.site}". Configured sites: ${Object.keys(config.sites).join(', ')}`, 2);
|
|
57
|
+
}
|
|
58
|
+
let ruleIds;
|
|
59
|
+
if (flags.fix !== undefined) {
|
|
60
|
+
const fixArg = flags.fix.trim();
|
|
61
|
+
// Phase 23f: `--fix all` (and the empty form) leaves `ruleIds`
|
|
62
|
+
// undefined so the runner picks up project rules registered at
|
|
63
|
+
// `<projectRoot>/.deskwork/doctor/*.ts` along with the built-ins.
|
|
64
|
+
// Explicit ids still validate against the built-in set (parseFixArgument
|
|
65
|
+
// throws on unknown).
|
|
66
|
+
if (fixArg !== '' && fixArg !== 'all') {
|
|
67
|
+
try {
|
|
68
|
+
ruleIds = parseFixArgument(flags.fix);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
fail(err instanceof Error ? err.message : String(err), 2);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const json = booleans.has('json');
|
|
76
|
+
const yes = booleans.has('yes');
|
|
77
|
+
const repairMode = flags.fix !== undefined;
|
|
78
|
+
const opts = {
|
|
79
|
+
projectRoot,
|
|
80
|
+
config,
|
|
81
|
+
...(flags.site !== undefined ? { site: flags.site } : {}),
|
|
82
|
+
...(ruleIds !== undefined ? { ruleIds } : {}),
|
|
83
|
+
};
|
|
84
|
+
let report;
|
|
85
|
+
if (!repairMode) {
|
|
86
|
+
// Audit-only — interaction is unused but the type insists on a
|
|
87
|
+
// value, so we pass yesInteraction (its methods are never invoked
|
|
88
|
+
// in this mode).
|
|
89
|
+
report = await runAudit(opts, yesInteraction);
|
|
90
|
+
emitReport(report, { json, repairMode: false });
|
|
91
|
+
process.exit(report.findings.length === 0 ? 0 : 1);
|
|
92
|
+
}
|
|
93
|
+
if (yes) {
|
|
94
|
+
report = await runRepair(opts, yesInteraction);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const adapter = interactiveAdapter();
|
|
98
|
+
try {
|
|
99
|
+
report = await runRepair(opts, adapter.interaction);
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
adapter.close();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
emitReport(report, { json, repairMode: true });
|
|
106
|
+
// Exit-code logic (Issue #44):
|
|
107
|
+
// - applied → success.
|
|
108
|
+
// - skipped because the prerequisite isn't met (e.g. no body file
|
|
109
|
+
// yet for missing-frontmatter-id) → success. The operator's
|
|
110
|
+
// next action is `/deskwork:outline`, not "look at doctor."
|
|
111
|
+
// - skipped because the operator chose "leave as-is" on an orphan
|
|
112
|
+
// prompt → success. The operator made a choice; respect it.
|
|
113
|
+
// - everything else (ambiguous, schema-rejected, editorial-
|
|
114
|
+
// decision, operator-declined, apply-failed) → exit 1. These
|
|
115
|
+
// are real follow-ups doctor can't auto-resolve.
|
|
116
|
+
const realFollowUps = report.repairs.filter((r) => !r.applied && !isExpectedSkip(r.skipReason)).length;
|
|
117
|
+
process.exit(realFollowUps === 0 ? 0 : 1);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* True for skip reasons that indicate the operator's next move is
|
|
121
|
+
* outside doctor's scope (run a different command, decline a no-op
|
|
122
|
+
* choice). The exit-code logic treats these as success in `--fix`
|
|
123
|
+
* mode so CI can run `doctor --fix=all --yes` and trust exit 0
|
|
124
|
+
* means "we did everything we could."
|
|
125
|
+
*
|
|
126
|
+
* `undefined` defaults to "this is a real follow-up" — older rule
|
|
127
|
+
* implementations that don't set `skipReason` keep the legacy
|
|
128
|
+
* exit-1-on-skip behavior.
|
|
129
|
+
*/
|
|
130
|
+
function isExpectedSkip(reason) {
|
|
131
|
+
return reason === 'prerequisite-missing' || reason === 'no-action-needed';
|
|
132
|
+
}
|
|
133
|
+
function parseInput(argv) {
|
|
134
|
+
try {
|
|
135
|
+
return parseArgs(argv, KNOWN_FLAGS, BOOLEAN_FLAGS);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
fail(err instanceof Error ? err.message : String(err), 2);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function interactiveAdapter() {
|
|
142
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
143
|
+
const interaction = {
|
|
144
|
+
async pickChoice(plan) {
|
|
145
|
+
stdout.write(`\n${plan.question}\n`);
|
|
146
|
+
plan.choices.forEach((c, i) => {
|
|
147
|
+
stdout.write(` ${i + 1}. ${c.label}\n`);
|
|
148
|
+
});
|
|
149
|
+
stdout.write(` s. skip\n`);
|
|
150
|
+
const answer = (await rl.question('Pick: ')).trim().toLowerCase();
|
|
151
|
+
if (answer === '' || answer === 's' || answer === 'skip')
|
|
152
|
+
return undefined;
|
|
153
|
+
const idx = Number.parseInt(answer, 10);
|
|
154
|
+
if (Number.isNaN(idx) || idx < 1 || idx > plan.choices.length) {
|
|
155
|
+
stdout.write(`Unknown choice "${answer}", skipping.\n`);
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
return plan.choices[idx - 1].id;
|
|
159
|
+
},
|
|
160
|
+
async confirmApply(plan) {
|
|
161
|
+
stdout.write(`\nFix: ${plan.summary}\n`);
|
|
162
|
+
const answer = (await rl.question('Apply? [y/N] ')).trim().toLowerCase();
|
|
163
|
+
return answer === 'y' || answer === 'yes';
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
return {
|
|
167
|
+
interaction,
|
|
168
|
+
close() {
|
|
169
|
+
rl.close();
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function emitReport(report, opts) {
|
|
174
|
+
if (opts.json) {
|
|
175
|
+
emitJson(report, opts);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
emitText(report, opts);
|
|
179
|
+
}
|
|
180
|
+
function emitJson(report, opts) {
|
|
181
|
+
const out = {
|
|
182
|
+
mode: opts.repairMode ? 'fix' : 'audit',
|
|
183
|
+
sites: report.sites,
|
|
184
|
+
rules: RULES.map((r) => r.id),
|
|
185
|
+
findings: report.findings.map(serializeFinding),
|
|
186
|
+
repairs: report.repairs.map(serializeRepair),
|
|
187
|
+
};
|
|
188
|
+
process.stdout.write(`${JSON.stringify(out, null, 2)}\n`);
|
|
189
|
+
}
|
|
190
|
+
function serializeFinding(f) {
|
|
191
|
+
return {
|
|
192
|
+
ruleId: f.ruleId,
|
|
193
|
+
site: f.site,
|
|
194
|
+
severity: f.severity,
|
|
195
|
+
message: f.message,
|
|
196
|
+
details: f.details,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function serializeRepair(r) {
|
|
200
|
+
return {
|
|
201
|
+
ruleId: r.finding.ruleId,
|
|
202
|
+
site: r.finding.site,
|
|
203
|
+
applied: r.applied,
|
|
204
|
+
message: r.message,
|
|
205
|
+
...(r.skipReason !== undefined ? { skipReason: r.skipReason } : {}),
|
|
206
|
+
finding: serializeFinding(r.finding),
|
|
207
|
+
...(r.details !== undefined ? { details: r.details } : {}),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function emitText(report, opts) {
|
|
211
|
+
if (report.findings.length === 0) {
|
|
212
|
+
process.stdout.write(`Doctor: clean (no findings across ${report.sites.length} site(s))\n`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const byRule = groupBy(report.findings, (f) => f.ruleId);
|
|
216
|
+
process.stdout.write(`Doctor: ${report.findings.length} finding(s) across ${report.sites.length} site(s)\n\n`);
|
|
217
|
+
for (const rule of RULES) {
|
|
218
|
+
const findings = byRule.get(rule.id);
|
|
219
|
+
if (!findings || findings.length === 0)
|
|
220
|
+
continue;
|
|
221
|
+
process.stdout.write(`[${rule.id}] ${rule.label} (${findings.length})\n`);
|
|
222
|
+
for (const f of findings) {
|
|
223
|
+
process.stdout.write(` - [${f.site}] ${f.message}\n`);
|
|
224
|
+
}
|
|
225
|
+
process.stdout.write('\n');
|
|
226
|
+
}
|
|
227
|
+
if (opts.repairMode) {
|
|
228
|
+
emitRepairsGrouped(report);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
process.stdout.write(`Run \`deskwork doctor --fix=<rule>\` (or \`--fix=all\`) to repair. ` +
|
|
232
|
+
`Add \`--yes\` for non-interactive mode.\n`);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Issue #44 — repairs grouped by rule with applied/skipped split and
|
|
236
|
+
* a per-finding indented bullet list. Replaces the older flat per-line
|
|
237
|
+
* format that was hard to scan when 28 findings landed in one rule.
|
|
238
|
+
*
|
|
239
|
+
* Within each rule:
|
|
240
|
+
* - one summary line: "<rule>: N applied, M skipped (<reason hint>)"
|
|
241
|
+
* - applied bullets, then skipped bullets grouped by reason
|
|
242
|
+
*
|
|
243
|
+
* The skip-reason groups surface the prerequisite-missing case (the
|
|
244
|
+
* common audiocontrol scenario where 16 entries are waiting on
|
|
245
|
+
* outline) separately from the ambiguous / editorial-decision /
|
|
246
|
+
* apply-failed cases that need real operator follow-up.
|
|
247
|
+
*/
|
|
248
|
+
function emitRepairsGrouped(report) {
|
|
249
|
+
process.stdout.write('Repairs:\n');
|
|
250
|
+
if (report.repairs.length === 0) {
|
|
251
|
+
process.stdout.write(' (none)\n');
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
const byRule = groupBy(report.repairs, (r) => r.finding.ruleId);
|
|
255
|
+
for (const rule of RULES) {
|
|
256
|
+
const repairs = byRule.get(rule.id);
|
|
257
|
+
if (!repairs || repairs.length === 0)
|
|
258
|
+
continue;
|
|
259
|
+
const applied = repairs.filter((r) => r.applied);
|
|
260
|
+
const skipped = repairs.filter((r) => !r.applied);
|
|
261
|
+
const summaryParts = [
|
|
262
|
+
`${applied.length} applied`,
|
|
263
|
+
`${skipped.length} skipped`,
|
|
264
|
+
];
|
|
265
|
+
if (skipped.length > 0) {
|
|
266
|
+
const hint = primarySkipHint(skipped);
|
|
267
|
+
if (hint !== null)
|
|
268
|
+
summaryParts[1] += ` (${hint})`;
|
|
269
|
+
}
|
|
270
|
+
process.stdout.write(`\n ${rule.id}: ${summaryParts.join(', ')}\n`);
|
|
271
|
+
if (applied.length > 0) {
|
|
272
|
+
process.stdout.write(' applied:\n');
|
|
273
|
+
for (const r of applied) {
|
|
274
|
+
process.stdout.write(` - [${r.finding.site}] ${r.message}\n`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (skipped.length > 0) {
|
|
278
|
+
const byReason = groupBy(skipped, (r) => r.skipReason ?? 'unknown');
|
|
279
|
+
for (const [reason, items] of byReason) {
|
|
280
|
+
process.stdout.write(` skipped (${reason}):\n`);
|
|
281
|
+
for (const r of items) {
|
|
282
|
+
process.stdout.write(` - [${r.finding.site}] ${r.message}\n`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Aggregated bottom-of-output summary with the new skip-reason
|
|
288
|
+
// granularity from Issue #44.
|
|
289
|
+
const totals = aggregateRepairTotals(report.repairs);
|
|
290
|
+
process.stdout.write('\nSummary:\n');
|
|
291
|
+
process.stdout.write(` applied: ${totals.applied}\n`);
|
|
292
|
+
for (const [reason, count] of totals.skipped) {
|
|
293
|
+
process.stdout.write(` skipped (${reason}): ${count}\n`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
function aggregateRepairTotals(repairs) {
|
|
297
|
+
let applied = 0;
|
|
298
|
+
const counts = new Map();
|
|
299
|
+
for (const r of repairs) {
|
|
300
|
+
if (r.applied) {
|
|
301
|
+
applied++;
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
const key = r.skipReason ?? 'unknown';
|
|
305
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
306
|
+
}
|
|
307
|
+
return { applied, skipped: Array.from(counts.entries()) };
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* One-line hint for the parenthetical attached to a rule's per-rule
|
|
311
|
+
* summary line. Returns null when the skip-reason mix is heterogeneous
|
|
312
|
+
* enough that a single phrase would be misleading; the per-reason
|
|
313
|
+
* sub-bullets already show the breakdown.
|
|
314
|
+
*/
|
|
315
|
+
function primarySkipHint(skipped) {
|
|
316
|
+
const reasons = new Set();
|
|
317
|
+
for (const r of skipped) {
|
|
318
|
+
reasons.add(r.skipReason ?? 'unknown');
|
|
319
|
+
}
|
|
320
|
+
if (reasons.size !== 1)
|
|
321
|
+
return null;
|
|
322
|
+
const [only] = reasons;
|
|
323
|
+
switch (only) {
|
|
324
|
+
case 'prerequisite-missing':
|
|
325
|
+
return 'no body file yet — run /deskwork:outline';
|
|
326
|
+
case 'ambiguous':
|
|
327
|
+
return 'ambiguous; re-run interactively to choose';
|
|
328
|
+
case 'editorial-decision':
|
|
329
|
+
return 'operator must decide';
|
|
330
|
+
case 'schema-rejected':
|
|
331
|
+
return 'patch host content schema first';
|
|
332
|
+
case 'operator-declined':
|
|
333
|
+
return 'operator declined';
|
|
334
|
+
case 'apply-failed':
|
|
335
|
+
return 'apply failed';
|
|
336
|
+
case 'no-action-needed':
|
|
337
|
+
return 'no action needed';
|
|
338
|
+
default:
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
function groupBy(items, key) {
|
|
343
|
+
const out = new Map();
|
|
344
|
+
for (const item of items) {
|
|
345
|
+
const k = key(item);
|
|
346
|
+
const list = out.get(k);
|
|
347
|
+
if (list)
|
|
348
|
+
list.push(item);
|
|
349
|
+
else
|
|
350
|
+
out.set(k, [item]);
|
|
351
|
+
}
|
|
352
|
+
return out;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* deskwork-draft — move an Outlining entry to Drafting.
|
|
3
|
+
*
|
|
4
|
+
* Blog file scaffolding happens in the outline step (see deskwork-outline).
|
|
5
|
+
* By the time this helper runs, the blog markdown already exists with an
|
|
6
|
+
* approved outline. Draft just flips the stage and optionally records a
|
|
7
|
+
* linked GitHub issue number (Claude invokes `gh issue create` separately
|
|
8
|
+
* and passes the resulting number via --issue).
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* deskwork-draft <project-root> [--site <slug>] [--issue <n>] <slug>
|
|
12
|
+
*
|
|
13
|
+
* Emits a JSON result:
|
|
14
|
+
* { slug, stage, contentType, issueNumber?, site, calendarPath }
|
|
15
|
+
*/
|
|
16
|
+
export declare function run(argv: string[]): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=draft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../src/commands/draft.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmEvD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* deskwork-draft — move an Outlining entry to Drafting.
|
|
3
|
+
*
|
|
4
|
+
* Blog file scaffolding happens in the outline step (see deskwork-outline).
|
|
5
|
+
* By the time this helper runs, the blog markdown already exists with an
|
|
6
|
+
* approved outline. Draft just flips the stage and optionally records a
|
|
7
|
+
* linked GitHub issue number (Claude invokes `gh issue create` separately
|
|
8
|
+
* and passes the resulting number via --issue).
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* deskwork-draft <project-root> [--site <slug>] [--issue <n>] <slug>
|
|
12
|
+
*
|
|
13
|
+
* Emits a JSON result:
|
|
14
|
+
* { slug, stage, contentType, issueNumber?, site, calendarPath }
|
|
15
|
+
*/
|
|
16
|
+
import { readConfig } from '@deskwork/core/config';
|
|
17
|
+
import { readCalendar, writeCalendar } from '@deskwork/core/calendar';
|
|
18
|
+
import { draftEntry, findEntry } from '@deskwork/core/calendar-mutations';
|
|
19
|
+
import { effectiveContentType } from '@deskwork/core/types';
|
|
20
|
+
import { resolveSite, resolveCalendarPath } from '@deskwork/core/paths';
|
|
21
|
+
import { absolutize, emit, fail, parseArgs } from '@deskwork/core/cli-args';
|
|
22
|
+
export async function run(argv) {
|
|
23
|
+
const KNOWN_FLAGS = ['site', 'issue'];
|
|
24
|
+
const { positional, flags } = parse();
|
|
25
|
+
if (positional.length < 2) {
|
|
26
|
+
fail('Usage: deskwork-draft <project-root> [--site <slug>] [--issue <n>] <slug>', 2);
|
|
27
|
+
}
|
|
28
|
+
const [rootArg, slug] = positional;
|
|
29
|
+
const projectRoot = absolutize(rootArg);
|
|
30
|
+
let issueNumber;
|
|
31
|
+
if (flags.issue !== undefined) {
|
|
32
|
+
const n = parseInt(flags.issue, 10);
|
|
33
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
34
|
+
fail(`Invalid --issue "${flags.issue}". Must be a positive integer.`);
|
|
35
|
+
}
|
|
36
|
+
issueNumber = n;
|
|
37
|
+
}
|
|
38
|
+
let config;
|
|
39
|
+
try {
|
|
40
|
+
config = readConfig(projectRoot);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
fail(err instanceof Error ? err.message : String(err));
|
|
44
|
+
}
|
|
45
|
+
const site = resolveSite(config, flags.site);
|
|
46
|
+
const calendarPath = resolveCalendarPath(projectRoot, config, site);
|
|
47
|
+
const calendar = readCalendar(calendarPath);
|
|
48
|
+
const existing = findEntry(calendar, slug);
|
|
49
|
+
if (!existing) {
|
|
50
|
+
const outlining = calendar.entries
|
|
51
|
+
.filter((e) => e.stage === 'Outlining')
|
|
52
|
+
.map((e) => e.slug)
|
|
53
|
+
.join(', ') || '(none)';
|
|
54
|
+
fail(`No calendar entry found with slug "${slug}". Outlining entries: ${outlining}`);
|
|
55
|
+
}
|
|
56
|
+
const contentType = effectiveContentType(existing);
|
|
57
|
+
const updated = draftEntry(calendar, slug, issueNumber);
|
|
58
|
+
writeCalendar(calendarPath, calendar);
|
|
59
|
+
emit({
|
|
60
|
+
slug: updated.slug,
|
|
61
|
+
title: updated.title,
|
|
62
|
+
stage: updated.stage,
|
|
63
|
+
contentType,
|
|
64
|
+
issueNumber: updated.issueNumber,
|
|
65
|
+
site,
|
|
66
|
+
calendarPath,
|
|
67
|
+
});
|
|
68
|
+
function parse() {
|
|
69
|
+
try {
|
|
70
|
+
return parseArgs(argv, KNOWN_FLAGS);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
fail(err instanceof Error ? err.message : String(err), 2);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=draft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.js","sourceRoot":"","sources":["../../src/commands/draft.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACxE,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,OAAO,CAAU,CAAC;IAE/C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;IAEtC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,CACF,2EAA2E,EAC3E,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,WAA+B,CAAC;IACpC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,oBAAoB,KAAK,CAAC,KAAK,gCAAgC,CAAC,CAAC;QACxE,CAAC;QACD,WAAW,GAAG,CAAC,CAAC;IAClB,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,YAAY,GAAG,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO;aAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;QAC1B,IAAI,CACF,sCAAsC,IAAI,yBAAyB,SAAS,EAAE,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACxD,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW;QACX,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,IAAI;QACJ,YAAY;KACb,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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* deskwork ingest — backfill existing markdown content into the editorial
|
|
3
|
+
* calendar.
|
|
4
|
+
*
|
|
5
|
+
* Discovery is the heavy lifting; this module is the CLI surface around
|
|
6
|
+
* `discoverIngestCandidates` from @deskwork/core/ingest.
|
|
7
|
+
*
|
|
8
|
+
* Argv shape (after the dispatcher injects projectRoot when needed):
|
|
9
|
+
*
|
|
10
|
+
* <project-root> [flags] <path>...
|
|
11
|
+
*
|
|
12
|
+
* Flags:
|
|
13
|
+
* --site <slug> Target site (defaults to config.defaultSite)
|
|
14
|
+
* --apply Commit the plan; default is dry-run
|
|
15
|
+
* --json Machine-readable plan output
|
|
16
|
+
* --force Bypass duplicate-slug skip
|
|
17
|
+
* --slug-from <where> 'frontmatter' or 'path' (default 'path')
|
|
18
|
+
* --state-from <where> 'frontmatter' (default) or 'datePublished'
|
|
19
|
+
* --slug <value> Explicit slug (only with single-file ingest)
|
|
20
|
+
* --state <stage> Explicit stage; wins over derivation
|
|
21
|
+
* --date <YYYY-MM-DD> Explicit ISO date; wins over derivation
|
|
22
|
+
* --title-field <name> Frontmatter field for title (default: title)
|
|
23
|
+
* --description-field <n> Frontmatter field for description
|
|
24
|
+
* (default: description)
|
|
25
|
+
* --slug-field <name> Frontmatter field for slug (default: slug)
|
|
26
|
+
* --state-field <name> Frontmatter field for state (default: state)
|
|
27
|
+
* --date-field <name> Frontmatter field for date (default:
|
|
28
|
+
* datePublished)
|
|
29
|
+
*
|
|
30
|
+
* Dry-run output (text mode):
|
|
31
|
+
*
|
|
32
|
+
* Plan: 3 add, 1 skip
|
|
33
|
+
*
|
|
34
|
+
* add whats-in-a-name Published 2020-10-01 state:fm date:fm slug:path
|
|
35
|
+
* add the-deskwork-experiment Published 2026-04-20 state:fm date:fm slug:path
|
|
36
|
+
* skip on-revising-in-the-open already in calendar
|
|
37
|
+
*
|
|
38
|
+
* `--apply` writes calendar rows for non-skipped candidates and appends
|
|
39
|
+
* a journal entry per ingested file (`event: 'ingest'`) so a future
|
|
40
|
+
* review-start has provenance to anchor against.
|
|
41
|
+
*/
|
|
42
|
+
export declare function run(argv: string[]): Promise<void>;
|
|
43
|
+
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAuCH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4HvD"}
|