@12ui/design 0.2.54 → 0.2.56
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/SKILL.md +1 -1
- package/dist/cli-arguments.d.ts.map +1 -1
- package/dist/cli-arguments.js +2 -0
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli-conversion-derivation.d.ts +2 -1
- package/dist/cli-conversion-derivation.d.ts.map +1 -1
- package/dist/cli-conversion-derivation.js +9 -1
- package/dist/cli-conversion-derivation.js.map +1 -1
- package/dist/cli-convert-command.js +1 -1
- package/dist/cli-convert-command.js.map +1 -1
- package/dist/cli-draft-command.d.ts +11 -0
- package/dist/cli-draft-command.d.ts.map +1 -1
- package/dist/cli-draft-command.js +10 -1
- package/dist/cli-draft-command.js.map +1 -1
- package/dist/cli-help/design.d.ts +1 -1
- package/dist/cli-help/design.d.ts.map +1 -1
- package/dist/cli-help/design.js +8 -0
- package/dist/cli-help/design.js.map +1 -1
- package/dist/cli-help/index.d.ts +1 -1
- package/dist/cli-improve-command.d.ts.map +1 -1
- package/dist/cli-improve-command.js +257 -57
- package/dist/cli-improve-command.js.map +1 -1
- package/dist/cli-next-command.d.ts.map +1 -1
- package/dist/cli-next-command.js +44 -4
- package/dist/cli-next-command.js.map +1 -1
- package/dist/cli-usage.js +1 -1
- package/dist/improve-conversion-attempts.d.ts +92 -0
- package/dist/improve-conversion-attempts.d.ts.map +1 -0
- package/dist/improve-conversion-attempts.js +88 -0
- package/dist/improve-conversion-attempts.js.map +1 -0
- package/dist/improve-conversion-stage.d.ts +35 -0
- package/dist/improve-conversion-stage.d.ts.map +1 -0
- package/dist/improve-conversion-stage.js +381 -0
- package/dist/improve-conversion-stage.js.map +1 -0
- package/dist/improve-convert-resilience.d.ts +148 -0
- package/dist/improve-convert-resilience.d.ts.map +1 -0
- package/dist/improve-convert-resilience.js +266 -0
- package/dist/improve-convert-resilience.js.map +1 -0
- package/dist/improve-delivery-stages.d.ts +0 -6
- package/dist/improve-delivery-stages.d.ts.map +1 -1
- package/dist/improve-delivery-stages.js +5 -103
- package/dist/improve-delivery-stages.js.map +1 -1
- package/dist/improve-dom-diff.d.ts +2 -0
- package/dist/improve-dom-diff.d.ts.map +1 -1
- package/dist/improve-dom-diff.js +7 -0
- package/dist/improve-dom-diff.js.map +1 -1
- package/dist/improve-dom-gate.d.ts +7 -0
- package/dist/improve-dom-gate.d.ts.map +1 -1
- package/dist/improve-dom-gate.js +13 -0
- package/dist/improve-dom-gate.js.map +1 -1
- package/dist/improve-generation-stages.d.ts +3 -0
- package/dist/improve-generation-stages.d.ts.map +1 -1
- package/dist/improve-generation-stages.js +24 -7
- package/dist/improve-generation-stages.js.map +1 -1
- package/dist/improve-kit-assets.d.ts +129 -0
- package/dist/improve-kit-assets.d.ts.map +1 -0
- package/dist/improve-kit-assets.js +333 -0
- package/dist/improve-kit-assets.js.map +1 -0
- package/dist/improve-kit-readme.d.ts +11 -2
- package/dist/improve-kit-readme.d.ts.map +1 -1
- package/dist/improve-kit-readme.js +192 -21
- package/dist/improve-kit-readme.js.map +1 -1
- package/dist/improve-kit-stall.d.ts +67 -0
- package/dist/improve-kit-stall.d.ts.map +1 -0
- package/dist/improve-kit-stall.js +159 -0
- package/dist/improve-kit-stall.js.map +1 -0
- package/dist/improve-kit-status.d.ts +69 -0
- package/dist/improve-kit-status.d.ts.map +1 -0
- package/dist/improve-kit-status.js +145 -0
- package/dist/improve-kit-status.js.map +1 -0
- package/dist/improve-options.d.ts +13 -1
- package/dist/improve-options.d.ts.map +1 -1
- package/dist/improve-options.js +77 -15
- package/dist/improve-options.js.map +1 -1
- package/dist/improve-plan-annotated-render.d.ts +33 -0
- package/dist/improve-plan-annotated-render.d.ts.map +1 -0
- package/dist/improve-plan-annotated-render.js +175 -0
- package/dist/improve-plan-annotated-render.js.map +1 -0
- package/dist/improve-plan-annotator.d.ts +2 -1
- package/dist/improve-plan-annotator.d.ts.map +1 -1
- package/dist/improve-plan-annotator.js +21 -45
- package/dist/improve-plan-annotator.js.map +1 -1
- package/dist/improve-raster-layers-section.d.ts +21 -0
- package/dist/improve-raster-layers-section.d.ts.map +1 -0
- package/dist/improve-raster-layers-section.js +45 -0
- package/dist/improve-raster-layers-section.js.map +1 -0
- package/dist/improve-reset.d.ts +122 -0
- package/dist/improve-reset.d.ts.map +1 -0
- package/dist/improve-reset.js +141 -0
- package/dist/improve-reset.js.map +1 -0
- package/dist/improve-run-summary.d.ts +35 -0
- package/dist/improve-run-summary.d.ts.map +1 -0
- package/dist/improve-run-summary.js +134 -0
- package/dist/improve-run-summary.js.map +1 -0
- package/dist/improve-stage-runners.d.ts +2 -1
- package/dist/improve-stage-runners.d.ts.map +1 -1
- package/dist/improve-stage-runners.js +2 -1
- package/dist/improve-stage-runners.js.map +1 -1
- package/dist/improve-stage-shared.d.ts +6 -0
- package/dist/improve-stage-shared.d.ts.map +1 -1
- package/dist/improve-stage-shared.js.map +1 -1
- package/dist/improve-stop-handler.d.ts +73 -0
- package/dist/improve-stop-handler.d.ts.map +1 -0
- package/dist/improve-stop-handler.js +126 -0
- package/dist/improve-stop-handler.js.map +1 -0
- package/dist/improve-terminal-event.d.ts +118 -0
- package/dist/improve-terminal-event.d.ts.map +1 -0
- package/dist/improve-terminal-event.js +81 -0
- package/dist/improve-terminal-event.js.map +1 -0
- package/dist/improve-workspace.d.ts +25 -0
- package/dist/improve-workspace.d.ts.map +1 -1
- package/dist/improve-workspace.js +14 -0
- package/dist/improve-workspace.js.map +1 -1
- package/dist/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +23 -3
- package/dist/legacy-skill-catalog.js.map +1 -1
- package/dist/redesign-capture.d.ts +16 -0
- package/dist/redesign-capture.d.ts.map +1 -1
- package/dist/redesign-capture.js +49 -3
- package/dist/redesign-capture.js.map +1 -1
- package/dist/run-journal-unfinished.d.ts +56 -0
- package/dist/run-journal-unfinished.d.ts.map +1 -0
- package/dist/run-journal-unfinished.js +126 -0
- package/dist/run-journal-unfinished.js.map +1 -0
- package/dist/run-journal.d.ts +25 -1
- package/dist/run-journal.d.ts.map +1 -1
- package/dist/run-journal.js +15 -1
- package/dist/run-journal.js.map +1 -1
- package/open-design.json +2 -2
- package/package.json +1 -1
- package/skills/12ui-design/SKILL.md +2 -0
- package/skills/12ui-design/improve.md +68 -5
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { IMPROVE_STAGES, improvePaths } from './improve-workspace.js';
|
|
4
|
+
const isFile = async (file) => Boolean(await stat(file).then((entry) => entry.isFile()).catch(() => false));
|
|
5
|
+
const isDirectory = async (file) => Boolean(await stat(file).then((entry) => entry.isDirectory()).catch(() => false));
|
|
6
|
+
const stageState = (args) => {
|
|
7
|
+
const settled = args.record.stages[args.stage];
|
|
8
|
+
if (!settled) {
|
|
9
|
+
return IMPROVE_STAGES.indexOf(args.stage) > IMPROVE_STAGES.indexOf(args.requestedTo)
|
|
10
|
+
? { stage: args.stage, state: 'not-requested', detail: 'outside the requested stage range' }
|
|
11
|
+
: { stage: args.stage, state: 'incomplete' };
|
|
12
|
+
}
|
|
13
|
+
if (settled.outcome === 'skipped') {
|
|
14
|
+
return { stage: args.stage, state: 'skipped', detail: 'a target was supplied' };
|
|
15
|
+
}
|
|
16
|
+
if (args.blocked) {
|
|
17
|
+
return {
|
|
18
|
+
stage: args.stage,
|
|
19
|
+
state: 'blocked',
|
|
20
|
+
detail: 'the coverage gate blocked the anchored plan; read `plan/GATE.md`',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (!args.delivered)
|
|
24
|
+
return { stage: args.stage, state: 'incomplete', detail: 'recorded, but its files are not in the kit' };
|
|
25
|
+
if (args.stage === 'convert' && args.record.convert?.layout === 'fixed') {
|
|
26
|
+
return {
|
|
27
|
+
stage: 'convert',
|
|
28
|
+
state: 'fallback',
|
|
29
|
+
detail: args.record.convert.responsiveWarning ?? 'Responsive HTML was unavailable.',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
stage: args.stage,
|
|
34
|
+
state: settled.replayCount > 0 ? 'replayed' : 'settled',
|
|
35
|
+
...(settled.replayCount > 0 ? { detail: `replayed ${settled.replayCount}×, bought once` } : {}),
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export const IMPROVE_NO_APPROXIMATION_RULE = 'Do not approximate the design in CSS from the PNG'
|
|
39
|
+
+ ' while a stage is incomplete; resume or convert first.';
|
|
40
|
+
/**
|
|
41
|
+
* A recovery command is presented as copy-and-run, so it has to survive being
|
|
42
|
+
* pasted. Capture URLs carry query strings and `--out-dir` paths carry spaces;
|
|
43
|
+
* either one unquoted breaks the line or backgrounds it at the `&`.
|
|
44
|
+
*/
|
|
45
|
+
export const shellArg = (value) => (/^[A-Za-z0-9_./:=-]+$/u.test(value) ? value : `'${value.replace(/'/gu, "'\\''")}'`);
|
|
46
|
+
export const improveRecoveryCommands = (args) => {
|
|
47
|
+
const runDir = shellArg(args.record.runDir);
|
|
48
|
+
const input = shellArg(args.record.input.value);
|
|
49
|
+
const design = shellArg(args.designImage);
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
command: `12ui improve ${input} --out-dir ${runDir} --from convert`,
|
|
53
|
+
spends: 'resumes; settled stages replay',
|
|
54
|
+
},
|
|
55
|
+
{ command: `12ui convert ${design} --output html`, spends: 'buys one conversion' },
|
|
56
|
+
// `--target` is documented against a URL input. Offering it for an image
|
|
57
|
+
// input would name a mode the CLI does not document.
|
|
58
|
+
...(args.record.input.kind === 'url'
|
|
59
|
+
? [{
|
|
60
|
+
command: `12ui improve ${input} --target ${design}`,
|
|
61
|
+
spends: 'buys one fused target conversion',
|
|
62
|
+
}]
|
|
63
|
+
: []),
|
|
64
|
+
];
|
|
65
|
+
};
|
|
66
|
+
/** One indented, copy-pasteable line; the cost rides along as a shell comment. */
|
|
67
|
+
export const improveRecoveryLine = (entry) => (` ${entry.command} # ${entry.spends}`);
|
|
68
|
+
export const readImproveKitStatus = async (args) => {
|
|
69
|
+
const paths = improvePaths(args.record.runDir);
|
|
70
|
+
const requestedTo = args.requestedTo ?? IMPROVE_STAGES[IMPROVE_STAGES.length - 1];
|
|
71
|
+
const [winner, sourceImage, layerDoc, assets, plan, gate, stall] = await Promise.all([
|
|
72
|
+
isFile(paths.winnerImage),
|
|
73
|
+
isFile(paths.sourceImage),
|
|
74
|
+
isFile(paths.targetLayerDoc),
|
|
75
|
+
isDirectory(`${paths.targetLayerDoc}.assets`),
|
|
76
|
+
isFile(path.join(paths.planDir, 'plan-annotated.md')),
|
|
77
|
+
isFile(path.join(paths.planDir, 'GATE.md')),
|
|
78
|
+
isFile(path.join(paths.planDir, 'STALL.md')),
|
|
79
|
+
]);
|
|
80
|
+
const recordedHtml = args.record.convert?.html;
|
|
81
|
+
const targetHtml = recordedHtml ? await isFile(recordedHtml) : await isFile(paths.targetHtml);
|
|
82
|
+
// Name a file that is actually here. A `--target <layerdoc>` kit never gets a
|
|
83
|
+
// winner.png, and a run that stalled before pick has only its capture.
|
|
84
|
+
const captured = args.record.capture?.sourceImage;
|
|
85
|
+
const designImage = winner
|
|
86
|
+
? paths.winnerImage
|
|
87
|
+
: sourceImage
|
|
88
|
+
? paths.sourceImage
|
|
89
|
+
: captured && await isFile(captured)
|
|
90
|
+
? captured
|
|
91
|
+
: layerDoc && args.record.target?.kind === 'layerdoc'
|
|
92
|
+
? paths.targetLayerDoc
|
|
93
|
+
: paths.winnerImage;
|
|
94
|
+
const designKind = designImage === paths.targetLayerDoc ? 'layerdoc' : 'image';
|
|
95
|
+
const delivered = {
|
|
96
|
+
capture: Boolean(args.record.capture),
|
|
97
|
+
draft: Boolean(args.record.draft),
|
|
98
|
+
pick: Boolean(args.record.pick),
|
|
99
|
+
convert: layerDoc,
|
|
100
|
+
plan: plan || gate,
|
|
101
|
+
};
|
|
102
|
+
const gateBlocked = gate && !plan;
|
|
103
|
+
const stages = IMPROVE_STAGES.map((stage) => stageState({
|
|
104
|
+
record: args.record,
|
|
105
|
+
stage,
|
|
106
|
+
requestedTo,
|
|
107
|
+
delivered: delivered[stage],
|
|
108
|
+
blocked: stage === 'plan' && gateBlocked,
|
|
109
|
+
}));
|
|
110
|
+
const targetMode = !layerDoc
|
|
111
|
+
? 'none'
|
|
112
|
+
: args.record.convert?.layout === 'fixed'
|
|
113
|
+
? 'fixed-layout fallback'
|
|
114
|
+
: targetHtml ? 'responsive HTML' : 'LayerDoc only';
|
|
115
|
+
// Only stages the caller actually asked for can be missing. `--to pick` is a
|
|
116
|
+
// finished run, not an incomplete one.
|
|
117
|
+
const owed = (stage) => (IMPROVE_STAGES.indexOf(stage) <= IMPROVE_STAGES.indexOf(requestedTo));
|
|
118
|
+
// A supplied `*.layerdoc.json` target buys no conversion, so it owes neither
|
|
119
|
+
// extracted assets nor target HTML: naming them missing would be a false alarm.
|
|
120
|
+
const suppliedDocument = args.record.target?.kind === 'layerdoc';
|
|
121
|
+
const convertOwed = owed('convert') && !suppliedDocument;
|
|
122
|
+
const missing = [
|
|
123
|
+
...(!owed('convert') || layerDoc ? [] : ['no LayerDoc']),
|
|
124
|
+
...(!convertOwed || assets ? [] : ['no assets']),
|
|
125
|
+
...(!convertOwed || targetHtml ? [] : ['no target HTML']),
|
|
126
|
+
...(!owed('plan') || plan || gate ? [] : ['no plan']),
|
|
127
|
+
];
|
|
128
|
+
const complete = stages.every((entry) => entry.state !== 'incomplete') && missing.length === 0;
|
|
129
|
+
return {
|
|
130
|
+
stages,
|
|
131
|
+
complete,
|
|
132
|
+
gateBlocked,
|
|
133
|
+
missing,
|
|
134
|
+
targetMode,
|
|
135
|
+
present: { design: winner || sourceImage, layerDoc, assets, targetHtml, plan, gate, stall },
|
|
136
|
+
designImage,
|
|
137
|
+
designKind,
|
|
138
|
+
recovery: improveRecoveryCommands({ record: args.record, designImage }),
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
export const improveStageStatusLine = (status) => {
|
|
142
|
+
const label = status.state === 'incomplete' ? 'INCOMPLETE' : status.state;
|
|
143
|
+
return `${status.stage}: ${label}${status.detail ? ` — ${status.detail}` : ''}`;
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=improve-kit-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"improve-kit-status.js","sourceRoot":"","sources":["../src/improve-kit-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { CreateRetainPolicy } from './branch-client.js';
|
|
2
2
|
import { type CliFlags } from './cli-arguments.js';
|
|
3
3
|
import { type ConversionModel } from './conversion-models.js';
|
|
4
|
+
import { type ResponsiveConversionQuality } from './responsive-quality.js';
|
|
4
5
|
import { type ImproveBootstrapAction } from './redesign-capture.js';
|
|
5
6
|
import { type ImprovePaths, type ImproveStage } from './improve-workspace.js';
|
|
6
7
|
export type ImproveOptions = {
|
|
@@ -17,8 +18,13 @@ export type ImproveOptions = {
|
|
|
17
18
|
candidates: number;
|
|
18
19
|
retain: CreateRetainPolicy;
|
|
19
20
|
retainFlag: string;
|
|
20
|
-
|
|
21
|
+
/**
|
|
22
|
+
* The chosen candidate. Absent means nobody has chosen yet, which is a state
|
|
23
|
+
* the run stops in rather than a state it guesses its way out of.
|
|
24
|
+
*/
|
|
25
|
+
pick?: string;
|
|
21
26
|
conversionModel: ConversionModel;
|
|
27
|
+
responsiveQuality: ResponsiveConversionQuality;
|
|
22
28
|
viewport: {
|
|
23
29
|
width: number;
|
|
24
30
|
height: number;
|
|
@@ -32,6 +38,12 @@ export type ImproveOptions = {
|
|
|
32
38
|
repo?: string;
|
|
33
39
|
planSourceConvert: boolean;
|
|
34
40
|
dryRun: boolean;
|
|
41
|
+
/** The wait improve gives one half of a fused conversion before it stalls. */
|
|
42
|
+
convertStallSeconds: number;
|
|
43
|
+
/** Re-buy ONE conversion of the settled winner under a new key. */
|
|
44
|
+
fresh: boolean;
|
|
45
|
+
/** Re-buy the whole draw: new candidates, then a new pick. */
|
|
46
|
+
redraw: boolean;
|
|
35
47
|
};
|
|
36
48
|
export declare const parseImproveOptions: (args: {
|
|
37
49
|
command: readonly string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"improve-options.d.ts","sourceRoot":"","sources":["../src/improve-options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"improve-options.d.ts","sourceRoot":"","sources":["../src/improve-options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,yBAAyB,CAAC;AAWjC,OAAO,EAAkC,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE;QAAE,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,2BAA2B,CAAC;IAC/C,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,KAAK,EAAE,OAAO,CAAC;IACf,8DAA8D;IAC9D,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAqGF,eAAO,MAAM,mBAAmB,GAAI,MAAM;IACxC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,KAAG,cA4HH,CAAC"}
|
package/dist/improve-options.js
CHANGED
|
@@ -3,10 +3,17 @@ import { booleanFlag, stringFlag, stringFlags, } from './cli-arguments.js';
|
|
|
3
3
|
import { CliRefusal } from './cli-refusal.js';
|
|
4
4
|
import { buildImproveConcept } from './improve-concept.js';
|
|
5
5
|
import { isConversionModel } from './conversion-models.js';
|
|
6
|
+
import { isResponsiveConversionQuality, } from './responsive-quality.js';
|
|
6
7
|
import { DRAFT_CANDIDATE_COUNT, DRAFT_CANDIDATE_COUNT_MAXIMUM, DRAFT_CANDIDATE_COUNT_MINIMUM, } from './draft-run.js';
|
|
7
8
|
import { parseDraftRetainFlag } from './draft-retain.js';
|
|
8
|
-
import {
|
|
9
|
+
import { improveConvertStallDefaultSeconds, improveConvertStallFloorSeconds, } from './improve-convert-resilience.js';
|
|
10
|
+
import { httpUrl, parseImproveBootstrap } from './redesign-capture.js';
|
|
9
11
|
import { IMPROVE_STAGES, improvePaths, improveSlug, isImproveStage, } from './improve-workspace.js';
|
|
12
|
+
/**
|
|
13
|
+
* The floor is 2 and stays 2, and the refusal now says why: a draft draws
|
|
14
|
+
* ALTERNATIVES, and a draw of one is not a choice. The one-design mode already
|
|
15
|
+
* exists and is spelled `--target`, which skips draft and pick outright.
|
|
16
|
+
*/
|
|
10
17
|
const candidateCount = (flags) => {
|
|
11
18
|
const value = stringFlag(flags, 'candidates');
|
|
12
19
|
if (value === undefined)
|
|
@@ -16,7 +23,10 @@ const candidateCount = (flags) => {
|
|
|
16
23
|
|| count < DRAFT_CANDIDATE_COUNT_MINIMUM
|
|
17
24
|
|| count > DRAFT_CANDIDATE_COUNT_MAXIMUM) {
|
|
18
25
|
throw new CliRefusal(`--candidates must be an integer between ${DRAFT_CANDIDATE_COUNT_MINIMUM}`
|
|
19
|
-
+ ` and ${DRAFT_CANDIDATE_COUNT_MAXIMUM}
|
|
26
|
+
+ ` and ${DRAFT_CANDIDATE_COUNT_MAXIMUM}.`
|
|
27
|
+
+ ' A draft draws alternatives to choose between, so the floor is'
|
|
28
|
+
+ ` ${DRAFT_CANDIDATE_COUNT_MINIMUM}; to work from a single design you already have,`
|
|
29
|
+
+ ' pass --target <image.png|layerdoc.json>, which skips draft and pick.', 'improve_candidates_invalid');
|
|
20
30
|
}
|
|
21
31
|
return count;
|
|
22
32
|
};
|
|
@@ -27,6 +37,13 @@ const conversionModel = (flags) => {
|
|
|
27
37
|
}
|
|
28
38
|
return value;
|
|
29
39
|
};
|
|
40
|
+
const responsiveQuality = (flags) => {
|
|
41
|
+
const value = stringFlag(flags, 'responsive-quality')?.trim() ?? 'standard';
|
|
42
|
+
if (!isResponsiveConversionQuality(value)) {
|
|
43
|
+
throw new CliRefusal('--responsive-quality must be standard or pro', 'improve_responsive_quality_invalid');
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
};
|
|
30
47
|
const viewport = (flags) => {
|
|
31
48
|
const value = stringFlag(flags, 'viewport')?.trim() ?? '1440x900';
|
|
32
49
|
const match = value.match(/^(\d{2,5})x(\d{2,5})$/u);
|
|
@@ -37,6 +54,28 @@ const viewport = (flags) => {
|
|
|
37
54
|
}
|
|
38
55
|
return { width, height };
|
|
39
56
|
};
|
|
57
|
+
/**
|
|
58
|
+
* `--convert-stall-seconds` bounds how long improve waits on one half of a
|
|
59
|
+
* fused conversion. It refuses below the conversion's own typical wall for the
|
|
60
|
+
* model in play: a bound inside the typical window would fire the stall retry
|
|
61
|
+
* on a healthy run and buy the same design twice.
|
|
62
|
+
*
|
|
63
|
+
* The default obeys the same rule rather than sitting just above the floor —
|
|
64
|
+
* see `improveConvertStallDefaultSeconds`, which is model-aware.
|
|
65
|
+
*/
|
|
66
|
+
const convertStallSeconds = (flags, model) => {
|
|
67
|
+
const value = stringFlag(flags, 'convert-stall-seconds')?.trim();
|
|
68
|
+
if (value === undefined)
|
|
69
|
+
return improveConvertStallDefaultSeconds(model);
|
|
70
|
+
const seconds = Number(value);
|
|
71
|
+
const floor = improveConvertStallFloorSeconds(model);
|
|
72
|
+
if (!Number.isSafeInteger(seconds) || seconds < floor || seconds > 3_600) {
|
|
73
|
+
throw new CliRefusal(`--convert-stall-seconds must be an integer between ${floor} and 3600.`
|
|
74
|
+
+ ` A ${model} conversion typically takes ${floor}s, and a bound inside that window`
|
|
75
|
+
+ ' would abandon healthy work and buy it again.', 'improve_convert_stall_seconds_invalid');
|
|
76
|
+
}
|
|
77
|
+
return seconds;
|
|
78
|
+
};
|
|
40
79
|
const stageRange = (flags) => {
|
|
41
80
|
const read = (flag, fallback) => {
|
|
42
81
|
const value = stringFlag(flags, flag)?.trim();
|
|
@@ -59,15 +98,7 @@ export const parseImproveOptions = (args) => {
|
|
|
59
98
|
if (!inputValue || args.command.length !== 2) {
|
|
60
99
|
throw new CliRefusal('12ui improve accepts one URL or PNG, JPEG, or WebP path', 'improve_usage');
|
|
61
100
|
}
|
|
62
|
-
const parsedUrl = (
|
|
63
|
-
try {
|
|
64
|
-
const url = new URL(inputValue);
|
|
65
|
-
return /^https?:$/u.test(url.protocol) ? url.toString() : undefined;
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
})();
|
|
101
|
+
const parsedUrl = httpUrl(inputValue);
|
|
71
102
|
const kind = parsedUrl ? 'url' : 'image';
|
|
72
103
|
const value = parsedUrl ?? path.resolve(inputValue);
|
|
73
104
|
if (kind === 'image' && !/\.(?:png|jpe?g|webp)$/iu.test(value)) {
|
|
@@ -78,11 +109,18 @@ export const parseImproveOptions = (args) => {
|
|
|
78
109
|
const candidates = candidateCount(args.flags);
|
|
79
110
|
const retainFlag = stringFlag(args.flags, 'retain')?.trim() ?? 'layout,content';
|
|
80
111
|
const retain = parseDraftRetainFlag(retainFlag);
|
|
81
|
-
|
|
82
|
-
|
|
112
|
+
// No default. `--pick` used to default to A, and the convert stage ran
|
|
113
|
+
// unconditionally under the default `--to plan`, so a run bought a conversion
|
|
114
|
+
// of candidate A before any human had seen the draw. Notion's improve.json
|
|
115
|
+
// times the two four milliseconds apart. An absent pick now stops the run
|
|
116
|
+
// after draft and prints the command that resumes it.
|
|
117
|
+
const pickValue = stringFlag(args.flags, 'pick')?.trim();
|
|
118
|
+
const pick = pickValue?.toUpperCase();
|
|
119
|
+
if (pick !== undefined && (!/^[A-P]$/u.test(pick) || pick.charCodeAt(0) - 64 > candidates)) {
|
|
83
120
|
throw new CliRefusal(`--pick must name one of A-${String.fromCharCode(64 + candidates)}`, 'improve_pick_invalid');
|
|
84
121
|
}
|
|
85
122
|
const conversion = conversionModel(args.flags);
|
|
123
|
+
const responsive = responsiveQuality(args.flags);
|
|
86
124
|
const size = viewport(args.flags);
|
|
87
125
|
const bootstrapValues = stringFlags(args.flags, 'bootstrap');
|
|
88
126
|
const fullPage = booleanFlag(args.flags, 'full-page');
|
|
@@ -93,6 +131,10 @@ export const parseImproveOptions = (args) => {
|
|
|
93
131
|
kind: /\.layerdoc\.json$/iu.test(targetValue) ? 'layerdoc' : 'image',
|
|
94
132
|
value: path.resolve(targetValue),
|
|
95
133
|
} : undefined;
|
|
134
|
+
const stallSeconds = convertStallSeconds(args.flags, conversion);
|
|
135
|
+
const fresh = booleanFlag(args.flags, 'fresh');
|
|
136
|
+
const redraw = booleanFlag(args.flags, 'redraw');
|
|
137
|
+
const range = stageRange(args.flags);
|
|
96
138
|
if (target && target.kind === 'image' && !/\.(?:png|jpe?g|webp)$/iu.test(target.value)) {
|
|
97
139
|
throw new CliRefusal('--target must be a PNG, JPEG, WebP, or *.layerdoc.json', 'improve_target_invalid');
|
|
98
140
|
}
|
|
@@ -106,6 +148,23 @@ export const parseImproveOptions = (args) => {
|
|
|
106
148
|
if (target.kind === 'layerdoc' && args.flags['convert-model'] !== undefined) {
|
|
107
149
|
throw new CliRefusal('--convert-model does not apply to a LayerDoc --target', 'improve_target_flag_invalid');
|
|
108
150
|
}
|
|
151
|
+
if (target.kind === 'layerdoc' && fresh) {
|
|
152
|
+
throw new CliRefusal('--fresh does not apply to a LayerDoc --target', 'improve_target_flag_invalid');
|
|
153
|
+
}
|
|
154
|
+
if (redraw) {
|
|
155
|
+
throw new CliRefusal('--redraw draws new candidates, and --target skips draft and pick entirely.'
|
|
156
|
+
+ ' Drop one of them.', 'improve_target_flag_invalid');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// A redraw that never reaches the draft stage would print a reassuring
|
|
160
|
+
// summary over a record it had just emptied.
|
|
161
|
+
if (redraw && IMPROVE_STAGES.indexOf(range.from) > IMPROVE_STAGES.indexOf('draft')) {
|
|
162
|
+
throw new CliRefusal(`--redraw buys a new draw of candidates, so it has to run the draft stage;`
|
|
163
|
+
+ ` --from ${range.from} starts after it. Use --from capture or --from draft.`, 'improve_redraw_range_invalid');
|
|
164
|
+
}
|
|
165
|
+
if (redraw && IMPROVE_STAGES.indexOf(range.to) < IMPROVE_STAGES.indexOf('pick')) {
|
|
166
|
+
throw new CliRefusal(`--redraw discards the settled pick, so it has to run at least as far as pick;`
|
|
167
|
+
+ ` --to ${range.to} stops before it.`, 'improve_redraw_range_invalid');
|
|
109
168
|
}
|
|
110
169
|
if (kind === 'image') {
|
|
111
170
|
const urlOnly = [
|
|
@@ -123,7 +182,6 @@ export const parseImproveOptions = (args) => {
|
|
|
123
182
|
}
|
|
124
183
|
const outDir = stringFlag(args.flags, 'out-dir')?.trim()
|
|
125
184
|
?? path.join(args.workspaceRoot ?? process.cwd(), `12ui-improve-${improveSlug(value)}`);
|
|
126
|
-
const range = stageRange(args.flags);
|
|
127
185
|
return {
|
|
128
186
|
input: { kind, value },
|
|
129
187
|
...(target ? { target } : {}),
|
|
@@ -132,8 +190,9 @@ export const parseImproveOptions = (args) => {
|
|
|
132
190
|
candidates,
|
|
133
191
|
retain,
|
|
134
192
|
retainFlag,
|
|
135
|
-
pick,
|
|
193
|
+
...(pick ? { pick } : {}),
|
|
136
194
|
conversionModel: conversion,
|
|
195
|
+
responsiveQuality: responsive,
|
|
137
196
|
viewport: size,
|
|
138
197
|
fullPage,
|
|
139
198
|
bootstrapValues,
|
|
@@ -143,6 +202,9 @@ export const parseImproveOptions = (args) => {
|
|
|
143
202
|
...(repoFlag ? { repo: path.resolve(repoFlag) } : {}),
|
|
144
203
|
planSourceConvert,
|
|
145
204
|
dryRun: booleanFlag(args.flags, 'dry-run'),
|
|
205
|
+
convertStallSeconds: stallSeconds,
|
|
206
|
+
fresh,
|
|
207
|
+
redraw,
|
|
146
208
|
};
|
|
147
209
|
};
|
|
148
210
|
//# sourceMappingURL=improve-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"improve-options.js","sourceRoot":"","sources":["../src/improve-options.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EACL,WAAW,EACX,UAAU,EACV,WAAW,GAEZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAwB,MAAM,wBAAwB,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAA+B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"improve-options.js","sourceRoot":"","sources":["../src/improve-options.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EACL,WAAW,EACX,UAAU,EACV,WAAW,GAEZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAwB,MAAM,wBAAwB,CAAC;AACjF,OAAO,EACL,6BAA6B,GAE9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAA+B,MAAM,uBAAuB,CAAC;AACpG,OAAO,EACL,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,GAGf,MAAM,wBAAwB,CAAC;AAmChC;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC,KAAe,EAAU,EAAE;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC9C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,qBAAqB,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;WAC3B,KAAK,GAAG,6BAA6B;WACrC,KAAK,GAAG,6BAA6B,EAAE,CAAC;QAC3C,MAAM,IAAI,UAAU,CAClB,2CAA2C,6BAA6B,EAAE;cACxE,QAAQ,6BAA6B,GAAG;cACxC,gEAAgE;cAChE,IAAI,6BAA6B,kDAAkD;cACnF,uEAAuE,EACzE,4BAA4B,CAC7B,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAe,EAAmB,EAAE;IAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC;IACvE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,UAAU,CAAC,gDAAgD,EAAE,uBAAuB,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAe,EAA+B,EAAE;IACzE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC;IAC5E,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,UAAU,CAClB,8CAA8C,EAC9C,oCAAoC,CACrC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,KAAe,EAAqC,EAAE;IACtE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC;IAClE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,GAAG,IAAI,EAAE,CAAC;QAC3E,MAAM,IAAI,UAAU,CAAC,sDAAsD,EAAE,0BAA0B,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAG,CAAC,KAAe,EAAE,KAAsB,EAAU,EAAE;IAC9E,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,uBAAuB,CAAC,EAAE,IAAI,EAAE,CAAC;IACjE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,iCAAiC,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,GAAG,KAAK,EAAE,CAAC;QACzE,MAAM,IAAI,UAAU,CAClB,sDAAsD,KAAK,YAAY;cACrE,MAAM,KAAK,+BAA+B,KAAK,mCAAmC;cAClF,+CAA+C,EACjD,uCAAuC,CACxC,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAe,EAA4C,EAAE;IAC/E,MAAM,IAAI,GAAG,CAAC,IAAmB,EAAE,QAAsB,EAAgB,EAAE;QACzE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK;YAAE,OAAO,QAAQ,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,UAAU,CAAC,KAAK,IAAI,mBAAmB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACzG,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAC9C,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,UAAU,CAClB,UAAU,IAAI,oBAAoB,EAAE,gBAAgB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EACjF,6BAA6B,CAC9B,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAInC,EAAkB,EAAE;IACnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,UAAU,CAAC,yDAAyD,EAAE,eAAe,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IACzC,MAAM,KAAK,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,UAAU,CAAC,gDAAgD,EAAE,uBAAuB,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,gBAAgB,CAAC;IAChF,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAChD,uEAAuE;IACvE,8EAA8E;IAC9E,2EAA2E;IAC3E,0EAA0E;IAC1E,sDAAsD;IACtD,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;IACzD,MAAM,IAAI,GAAG,SAAS,EAAE,WAAW,EAAE,CAAC;IACtC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,UAAU,CAAC,6BAA6B,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,UAAU,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAC;IACpH,CAAC;IACD,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,iBAAiB,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;QAC3B,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAmB,CAAC,CAAC,CAAC,OAAgB;QACtF,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;KACjC,CAAC,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,UAAU,CAAC,wDAAwD,EAAE,wBAAwB,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC;aAClE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;QACpD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,UAAU,CAClB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,oCAAoC;kBAC1F,4CAA4C,EAC9C,6BAA6B,CAC9B,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5E,MAAM,IAAI,UAAU,CAAC,uDAAuD,EAAE,6BAA6B,CAAC,CAAC;QAC/G,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,EAAE,CAAC;YACxC,MAAM,IAAI,UAAU,CAAC,+CAA+C,EAAE,6BAA6B,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,UAAU,CAClB,4EAA4E;kBAC1E,oBAAoB,EACtB,6BAA6B,CAC9B,CAAC;QACJ,CAAC;IACH,CAAC;IACD,uEAAuE;IACvE,6CAA6C;IAC7C,IAAI,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,UAAU,CAClB,2EAA2E;cACzE,WAAW,KAAK,CAAC,IAAI,uDAAuD,EAC9E,8BAA8B,CAC/B,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,UAAU,CAClB,+EAA+E;cAC7E,SAAS,KAAK,CAAC,EAAE,mBAAmB,EACtC,8BAA8B,CAC/B,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG;YACd,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,eAAe,EAAE,2BAA2B,CAAC,CAAC;QACxI,CAAC;IACH,CAAC;SAAM,IAAI,iBAAiB,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAAC,8CAA8C,EAAE,2BAA2B,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE;WACnD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1F,OAAO;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACtB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC;QACvC,UAAU;QACV,MAAM;QACN,UAAU;QACV,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,eAAe,EAAE,UAAU;QAC3B,iBAAiB,EAAE,UAAU;QAC7B,QAAQ,EAAE,IAAI;QACd,QAAQ;QACR,eAAe;QACf,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACrD,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC;QAC3B,GAAG,KAAK;QACR,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,iBAAiB;QACjB,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1C,mBAAmB,EAAE,YAAY;QACjC,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type ImproveKitAssetIndex } from './improve-kit-assets.js';
|
|
2
|
+
import { type SourceHint } from './improve-source-hints.js';
|
|
3
|
+
import type { AddedElementSpec } from './improve-added-specs.js';
|
|
4
|
+
import type { ImproveDomDiff } from './improve-dom-diff.js';
|
|
5
|
+
import type { ImproveTokenPatch } from './improve-token-patch.js';
|
|
6
|
+
import type { LayerDiffMatch } from './improve-layerdoc-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* `plan/plan-annotated.md`, readable in its first screen.
|
|
9
|
+
*
|
|
10
|
+
* The old shape opened with every token, one line each carrying up to 54
|
|
11
|
+
* selectors, and buried the hero raster layer under them. A lane that reads
|
|
12
|
+
* top-down met a wall of CSS variables before it ever learned there was a
|
|
13
|
+
* plate to copy. Order now follows what must happen: raster layers, tokens,
|
|
14
|
+
* matched changes, added elements, then a checklist for the commit.
|
|
15
|
+
*/
|
|
16
|
+
export type AnnotatedEntry = LayerDiffMatch & {
|
|
17
|
+
sourceHint: SourceHint;
|
|
18
|
+
};
|
|
19
|
+
export type ImprovePlanMode = 'dom-anchored' | 'layerdoc-anchored' | 'unanchored';
|
|
20
|
+
/** Tokens shown inline; the rest stay in `token-patch.css`, which keeps them all. */
|
|
21
|
+
export declare const IMPROVE_PLAN_TOKEN_LIMIT = 12;
|
|
22
|
+
/** Selectors per token line. Fifty-four on one line is not a readable plan. */
|
|
23
|
+
export declare const IMPROVE_PLAN_SELECTOR_LIMIT = 3;
|
|
24
|
+
export declare const renderImproveAnnotatedPlan: (args: {
|
|
25
|
+
computed: ImproveDomDiff;
|
|
26
|
+
entries: readonly AnnotatedEntry[];
|
|
27
|
+
tokenPatch: ImproveTokenPatch;
|
|
28
|
+
addedSpecs: readonly AddedElementSpec[];
|
|
29
|
+
index: ImproveKitAssetIndex;
|
|
30
|
+
repo?: string;
|
|
31
|
+
mode: ImprovePlanMode;
|
|
32
|
+
}) => string;
|
|
33
|
+
//# sourceMappingURL=improve-plan-annotated-render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"improve-plan-annotated-render.d.ts","sourceRoot":"","sources":["../src/improve-plan-annotated-render.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,oBAAoB,EAE1B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE5E;;;;;;;;GAQG;AAEH,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzE,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,mBAAmB,GAAG,YAAY,CAAC;AAElF,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAyK7C,eAAO,MAAM,0BAA0B,GAAI,MAAM;IAC/C,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IACnC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACxC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,eAAe,CAAC;CACvB,KAAG,MA2BH,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { selectorLabel } from './improve-dom-anchor.js';
|
|
2
|
+
import { formatImproveBounds, improveCarriedRasterLayers, improveFrameMappingLine, } from './improve-kit-assets.js';
|
|
3
|
+
import { renderImproveRasterLayers } from './improve-raster-layers-section.js';
|
|
4
|
+
import { formatImproveSourceHint } from './improve-source-hints.js';
|
|
5
|
+
/** Tokens shown inline; the rest stay in `token-patch.css`, which keeps them all. */
|
|
6
|
+
export const IMPROVE_PLAN_TOKEN_LIMIT = 12;
|
|
7
|
+
/** Selectors per token line. Fifty-four on one line is not a readable plan. */
|
|
8
|
+
export const IMPROVE_PLAN_SELECTOR_LIMIT = 3;
|
|
9
|
+
const MODE_MEANING = {
|
|
10
|
+
'dom-anchored': 'every change below is anchored to a selector the live page really has.',
|
|
11
|
+
'layerdoc-anchored': 'changes come from comparing the source conversion\'s LayerDoc with the'
|
|
12
|
+
+ ' target\'s; there are no page selectors, so placement is by bounds.',
|
|
13
|
+
unanchored: 'no source conversion was bought, so every target element is an independent'
|
|
14
|
+
+ ' specification rather than a diff.',
|
|
15
|
+
};
|
|
16
|
+
const percent = (value) => `${(value * 100).toFixed(1)}%`;
|
|
17
|
+
const header = (args) => [
|
|
18
|
+
'# Annotated implementation plan',
|
|
19
|
+
'',
|
|
20
|
+
'## How to read this plan',
|
|
21
|
+
'',
|
|
22
|
+
`- Mode: **${args.mode}** — ${MODE_MEANING[args.mode]}`,
|
|
23
|
+
`- Coverage ${percent(args.computed.domCoverage)} before-side:`
|
|
24
|
+
+ ' the share of the existing interface\'s elements the target could be matched to.',
|
|
25
|
+
`- Coverage ${percent(args.computed.designCoverage)} target-side:`
|
|
26
|
+
+ ' the share of the target\'s elements that matched something already there.',
|
|
27
|
+
`- Frame: ${improveFrameMappingLine({
|
|
28
|
+
frame: args.computed.beforeCanvas,
|
|
29
|
+
design: args.computed.targetCanvas,
|
|
30
|
+
})}`,
|
|
31
|
+
'- Precedence: assets → tokens → matched changes → added elements. Work them in that order.',
|
|
32
|
+
'- Skip an item only with a stated reason in your report; never skip a raster layer.',
|
|
33
|
+
`- Source repository: ${args.repo ? `\`${args.repo}\`` : 'not supplied; file hints are unresolved'}`,
|
|
34
|
+
'',
|
|
35
|
+
];
|
|
36
|
+
const tokens = (patch) => {
|
|
37
|
+
const lines = ['## Tokens — apply once', '', '- Apply `token-patch.css` through the existing global token or theme entry point.'];
|
|
38
|
+
if (patch.tokens.length === 0) {
|
|
39
|
+
lines.push('- No recurring CSS-capable delta reached the two-node threshold.', '');
|
|
40
|
+
return lines;
|
|
41
|
+
}
|
|
42
|
+
const shown = patch.tokens.slice(0, IMPROVE_PLAN_TOKEN_LIMIT);
|
|
43
|
+
lines.push(...shown.map((token) => {
|
|
44
|
+
const selectors = token.selectors.slice(0, IMPROVE_PLAN_SELECTOR_LIMIT).join(', ');
|
|
45
|
+
const rest = token.selectors.length - IMPROVE_PLAN_SELECTOR_LIMIT;
|
|
46
|
+
return `- \`${token.name}: ${token.value}\` — ${token.count} matched changes;`
|
|
47
|
+
+ ` selectors: ${selectors}${rest > 0 ? ` and ${rest} more` : ''}.`;
|
|
48
|
+
}));
|
|
49
|
+
const remaining = patch.tokens.length - shown.length;
|
|
50
|
+
if (remaining > 0)
|
|
51
|
+
lines.push(`- … and ${remaining} more in \`token-patch.css\`, which keeps every token and every selector.`);
|
|
52
|
+
lines.push('');
|
|
53
|
+
return lines;
|
|
54
|
+
};
|
|
55
|
+
const changeText = (entry) => [
|
|
56
|
+
...entry.deltas.map((delta) => `${delta.field} ${JSON.stringify(delta.before)}→${JSON.stringify(delta.after)}`),
|
|
57
|
+
...(entry.impliedPadding ?? []).map((delta) => `${delta.field} ${delta.before}px→${delta.after}px (${delta.basis})`),
|
|
58
|
+
].join(', ');
|
|
59
|
+
const matchedChanges = (args) => {
|
|
60
|
+
const lines = ['## Matched changes', ''];
|
|
61
|
+
const changed = args.entries.filter((entry) => entry.changed || (entry.impliedPadding?.length ?? 0) > 0);
|
|
62
|
+
if (changed.length === 0) {
|
|
63
|
+
lines.push('_No actionable matched changes._', '');
|
|
64
|
+
return lines;
|
|
65
|
+
}
|
|
66
|
+
const label = (entry) => selectorLabel(args.computed.beforeLeaves[entry.beforeIndex]);
|
|
67
|
+
if (!args.repo) {
|
|
68
|
+
lines.push(...changed.map((entry) => (`- ${label(entry)} — ${formatImproveSourceHint(entry.sourceHint)}: ${changeText(entry)}`)), '');
|
|
69
|
+
return lines;
|
|
70
|
+
}
|
|
71
|
+
const byFile = new Map();
|
|
72
|
+
for (const entry of changed) {
|
|
73
|
+
const file = entry.sourceHint.relativePath ?? 'unresolved file';
|
|
74
|
+
byFile.set(file, [...byFile.get(file) ?? [], entry]);
|
|
75
|
+
}
|
|
76
|
+
const files = [...byFile.entries()].sort(([left], [right]) => ((left === 'unresolved file' ? 1 : 0) - (right === 'unresolved file' ? 1 : 0)
|
|
77
|
+
|| right[1].length - left[1].length
|
|
78
|
+
|| left.localeCompare(right)));
|
|
79
|
+
for (const [file, group] of files) {
|
|
80
|
+
lines.push(`### \`${file}\``, '');
|
|
81
|
+
lines.push(...group.map((entry) => (`- ${label(entry)} — ${formatImproveSourceHint(entry.sourceHint)}: ${changeText(entry)}`)), '');
|
|
82
|
+
}
|
|
83
|
+
return lines;
|
|
84
|
+
};
|
|
85
|
+
const addedBounds = (box) => (box
|
|
86
|
+
? formatImproveBounds({ x: box[0] * 100, y: box[1] * 100, width: box[2] * 100, height: box[3] * 100 })
|
|
87
|
+
: 'bounds not declared');
|
|
88
|
+
const addedElements = (args) => {
|
|
89
|
+
const lines = ['## Added elements — full target specs', ''];
|
|
90
|
+
if (args.addedSpecs.length === 0) {
|
|
91
|
+
lines.push('_None._', '');
|
|
92
|
+
return lines;
|
|
93
|
+
}
|
|
94
|
+
// A raster layer appears here as well as under "Raster layers to carry".
|
|
95
|
+
// Unlabelled, that reads as two work items over one asset, which is the
|
|
96
|
+
// duplicate defect pole: the same cutout placed twice.
|
|
97
|
+
const repeated = args.addedSpecs.some((spec) => args.rasterByIndex.has(spec.designIndex));
|
|
98
|
+
if (repeated) {
|
|
99
|
+
lines.push('Entries that name an asset above are the same item, specified in full. Place each asset once.', '');
|
|
100
|
+
}
|
|
101
|
+
lines.push(...args.addedSpecs.map((spec) => {
|
|
102
|
+
const raster = args.rasterByIndex.get(spec.designIndex);
|
|
103
|
+
const kind = raster?.kind ?? args.computed.targetLeaves[spec.designIndex]?.kind ?? 'layer';
|
|
104
|
+
const file = raster?.asset?.file ?? spec.asset?.destination;
|
|
105
|
+
const bounds = raster
|
|
106
|
+
? formatImproveBounds(raster.bounds)
|
|
107
|
+
: addedBounds(args.computed.targetLeaves[spec.designIndex]?.box);
|
|
108
|
+
const prefix = raster
|
|
109
|
+
? 'already listed under \'Raster layers to carry\' — full specification, place it once; '
|
|
110
|
+
: '';
|
|
111
|
+
return `- Added ${spec.designIndex} (${kind}): ${prefix}asset ${file ? `\`${file}\`` : 'none'};`
|
|
112
|
+
+ ` ${bounds}.`;
|
|
113
|
+
}), '');
|
|
114
|
+
args.addedSpecs.forEach((spec) => lines.push(spec.markdown, ''));
|
|
115
|
+
return lines;
|
|
116
|
+
};
|
|
117
|
+
const checklist = (rasterLayers) => {
|
|
118
|
+
// The same list the section above printed, so the checklist cannot ask for a
|
|
119
|
+
// plate that section deliberately left out.
|
|
120
|
+
const carried = improveCarriedRasterLayers(rasterLayers);
|
|
121
|
+
return [
|
|
122
|
+
'## Before you commit',
|
|
123
|
+
'',
|
|
124
|
+
carried.length > 0
|
|
125
|
+
? `- Every raster layer above is present in the page: ${carried
|
|
126
|
+
.map((layer) => `${layer.kind}${layer.asset ? ` (\`${layer.asset.id}\`)` : ''}`).join(', ')}.`
|
|
127
|
+
: '- Every raster layer above is present in the page.',
|
|
128
|
+
'- Tokens applied at the token layer, not per element.',
|
|
129
|
+
'- Screenshot the page and put it beside `winner.png`.',
|
|
130
|
+
'- No console errors.',
|
|
131
|
+
'- Real content, data, and controls intact.',
|
|
132
|
+
'',
|
|
133
|
+
];
|
|
134
|
+
};
|
|
135
|
+
const guardrails = () => [
|
|
136
|
+
'## Implementation guardrails',
|
|
137
|
+
'',
|
|
138
|
+
'- Preserve all real content, data, and controls. Do not fabricate product features or copy.',
|
|
139
|
+
'- Never approximate an existing asset with CSS: if the LayerDoc declares a raster layer, ship its file.',
|
|
140
|
+
'- In Tailwind v4, verify arbitrary custom-property forms against the installed compiler before using them.',
|
|
141
|
+
'- Quote CSS `url(...)` values when paths contain punctuation or whitespace.',
|
|
142
|
+
'- Update the page content-security policy before introducing any data URI.',
|
|
143
|
+
'- Implement silently. Log only adapted or skipped items and the reason.',
|
|
144
|
+
'',
|
|
145
|
+
];
|
|
146
|
+
export const renderImproveAnnotatedPlan = (args) => {
|
|
147
|
+
const selectorByTargetIndex = new Map();
|
|
148
|
+
for (const entry of args.computed.result.matched) {
|
|
149
|
+
const leaf = args.computed.beforeLeaves[entry.beforeIndex];
|
|
150
|
+
if (leaf?.dom)
|
|
151
|
+
selectorByTargetIndex.set(entry.afterIndex, selectorLabel(leaf));
|
|
152
|
+
}
|
|
153
|
+
const rasterByIndex = new Map(args.index.rasterLayers.map((layer) => [layer.index, layer]));
|
|
154
|
+
return [
|
|
155
|
+
...header({
|
|
156
|
+
computed: args.computed,
|
|
157
|
+
mode: args.mode,
|
|
158
|
+
...(args.repo ? { repo: args.repo } : {}),
|
|
159
|
+
}),
|
|
160
|
+
...renderImproveRasterLayers({
|
|
161
|
+
layers: args.index.rasterLayers,
|
|
162
|
+
placement: (layer) => selectorByTargetIndex.get(layer.index),
|
|
163
|
+
}),
|
|
164
|
+
...tokens(args.tokenPatch),
|
|
165
|
+
...matchedChanges({
|
|
166
|
+
computed: args.computed,
|
|
167
|
+
entries: args.entries,
|
|
168
|
+
...(args.repo ? { repo: args.repo } : {}),
|
|
169
|
+
}),
|
|
170
|
+
...addedElements({ addedSpecs: args.addedSpecs, computed: args.computed, rasterByIndex }),
|
|
171
|
+
...checklist(args.index.rasterLayers),
|
|
172
|
+
...guardrails(),
|
|
173
|
+
].join('\n');
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=improve-plan-annotated-render.js.map
|