@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.
Files changed (132) hide show
  1. package/SKILL.md +1 -1
  2. package/dist/cli-arguments.d.ts.map +1 -1
  3. package/dist/cli-arguments.js +2 -0
  4. package/dist/cli-arguments.js.map +1 -1
  5. package/dist/cli-conversion-derivation.d.ts +2 -1
  6. package/dist/cli-conversion-derivation.d.ts.map +1 -1
  7. package/dist/cli-conversion-derivation.js +9 -1
  8. package/dist/cli-conversion-derivation.js.map +1 -1
  9. package/dist/cli-convert-command.js +1 -1
  10. package/dist/cli-convert-command.js.map +1 -1
  11. package/dist/cli-draft-command.d.ts +11 -0
  12. package/dist/cli-draft-command.d.ts.map +1 -1
  13. package/dist/cli-draft-command.js +10 -1
  14. package/dist/cli-draft-command.js.map +1 -1
  15. package/dist/cli-help/design.d.ts +1 -1
  16. package/dist/cli-help/design.d.ts.map +1 -1
  17. package/dist/cli-help/design.js +8 -0
  18. package/dist/cli-help/design.js.map +1 -1
  19. package/dist/cli-help/index.d.ts +1 -1
  20. package/dist/cli-improve-command.d.ts.map +1 -1
  21. package/dist/cli-improve-command.js +257 -57
  22. package/dist/cli-improve-command.js.map +1 -1
  23. package/dist/cli-next-command.d.ts.map +1 -1
  24. package/dist/cli-next-command.js +44 -4
  25. package/dist/cli-next-command.js.map +1 -1
  26. package/dist/cli-usage.js +1 -1
  27. package/dist/improve-conversion-attempts.d.ts +92 -0
  28. package/dist/improve-conversion-attempts.d.ts.map +1 -0
  29. package/dist/improve-conversion-attempts.js +88 -0
  30. package/dist/improve-conversion-attempts.js.map +1 -0
  31. package/dist/improve-conversion-stage.d.ts +35 -0
  32. package/dist/improve-conversion-stage.d.ts.map +1 -0
  33. package/dist/improve-conversion-stage.js +381 -0
  34. package/dist/improve-conversion-stage.js.map +1 -0
  35. package/dist/improve-convert-resilience.d.ts +148 -0
  36. package/dist/improve-convert-resilience.d.ts.map +1 -0
  37. package/dist/improve-convert-resilience.js +266 -0
  38. package/dist/improve-convert-resilience.js.map +1 -0
  39. package/dist/improve-delivery-stages.d.ts +0 -6
  40. package/dist/improve-delivery-stages.d.ts.map +1 -1
  41. package/dist/improve-delivery-stages.js +5 -103
  42. package/dist/improve-delivery-stages.js.map +1 -1
  43. package/dist/improve-dom-diff.d.ts +2 -0
  44. package/dist/improve-dom-diff.d.ts.map +1 -1
  45. package/dist/improve-dom-diff.js +7 -0
  46. package/dist/improve-dom-diff.js.map +1 -1
  47. package/dist/improve-dom-gate.d.ts +7 -0
  48. package/dist/improve-dom-gate.d.ts.map +1 -1
  49. package/dist/improve-dom-gate.js +13 -0
  50. package/dist/improve-dom-gate.js.map +1 -1
  51. package/dist/improve-generation-stages.d.ts +3 -0
  52. package/dist/improve-generation-stages.d.ts.map +1 -1
  53. package/dist/improve-generation-stages.js +24 -7
  54. package/dist/improve-generation-stages.js.map +1 -1
  55. package/dist/improve-kit-assets.d.ts +129 -0
  56. package/dist/improve-kit-assets.d.ts.map +1 -0
  57. package/dist/improve-kit-assets.js +333 -0
  58. package/dist/improve-kit-assets.js.map +1 -0
  59. package/dist/improve-kit-readme.d.ts +11 -2
  60. package/dist/improve-kit-readme.d.ts.map +1 -1
  61. package/dist/improve-kit-readme.js +192 -21
  62. package/dist/improve-kit-readme.js.map +1 -1
  63. package/dist/improve-kit-stall.d.ts +67 -0
  64. package/dist/improve-kit-stall.d.ts.map +1 -0
  65. package/dist/improve-kit-stall.js +159 -0
  66. package/dist/improve-kit-stall.js.map +1 -0
  67. package/dist/improve-kit-status.d.ts +69 -0
  68. package/dist/improve-kit-status.d.ts.map +1 -0
  69. package/dist/improve-kit-status.js +145 -0
  70. package/dist/improve-kit-status.js.map +1 -0
  71. package/dist/improve-options.d.ts +13 -1
  72. package/dist/improve-options.d.ts.map +1 -1
  73. package/dist/improve-options.js +77 -15
  74. package/dist/improve-options.js.map +1 -1
  75. package/dist/improve-plan-annotated-render.d.ts +33 -0
  76. package/dist/improve-plan-annotated-render.d.ts.map +1 -0
  77. package/dist/improve-plan-annotated-render.js +175 -0
  78. package/dist/improve-plan-annotated-render.js.map +1 -0
  79. package/dist/improve-plan-annotator.d.ts +2 -1
  80. package/dist/improve-plan-annotator.d.ts.map +1 -1
  81. package/dist/improve-plan-annotator.js +21 -45
  82. package/dist/improve-plan-annotator.js.map +1 -1
  83. package/dist/improve-raster-layers-section.d.ts +21 -0
  84. package/dist/improve-raster-layers-section.d.ts.map +1 -0
  85. package/dist/improve-raster-layers-section.js +45 -0
  86. package/dist/improve-raster-layers-section.js.map +1 -0
  87. package/dist/improve-reset.d.ts +122 -0
  88. package/dist/improve-reset.d.ts.map +1 -0
  89. package/dist/improve-reset.js +141 -0
  90. package/dist/improve-reset.js.map +1 -0
  91. package/dist/improve-run-summary.d.ts +35 -0
  92. package/dist/improve-run-summary.d.ts.map +1 -0
  93. package/dist/improve-run-summary.js +134 -0
  94. package/dist/improve-run-summary.js.map +1 -0
  95. package/dist/improve-stage-runners.d.ts +2 -1
  96. package/dist/improve-stage-runners.d.ts.map +1 -1
  97. package/dist/improve-stage-runners.js +2 -1
  98. package/dist/improve-stage-runners.js.map +1 -1
  99. package/dist/improve-stage-shared.d.ts +6 -0
  100. package/dist/improve-stage-shared.d.ts.map +1 -1
  101. package/dist/improve-stage-shared.js.map +1 -1
  102. package/dist/improve-stop-handler.d.ts +73 -0
  103. package/dist/improve-stop-handler.d.ts.map +1 -0
  104. package/dist/improve-stop-handler.js +126 -0
  105. package/dist/improve-stop-handler.js.map +1 -0
  106. package/dist/improve-terminal-event.d.ts +118 -0
  107. package/dist/improve-terminal-event.d.ts.map +1 -0
  108. package/dist/improve-terminal-event.js +81 -0
  109. package/dist/improve-terminal-event.js.map +1 -0
  110. package/dist/improve-workspace.d.ts +25 -0
  111. package/dist/improve-workspace.d.ts.map +1 -1
  112. package/dist/improve-workspace.js +14 -0
  113. package/dist/improve-workspace.js.map +1 -1
  114. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  115. package/dist/legacy-skill-catalog.js +23 -3
  116. package/dist/legacy-skill-catalog.js.map +1 -1
  117. package/dist/redesign-capture.d.ts +16 -0
  118. package/dist/redesign-capture.d.ts.map +1 -1
  119. package/dist/redesign-capture.js +49 -3
  120. package/dist/redesign-capture.js.map +1 -1
  121. package/dist/run-journal-unfinished.d.ts +56 -0
  122. package/dist/run-journal-unfinished.d.ts.map +1 -0
  123. package/dist/run-journal-unfinished.js +126 -0
  124. package/dist/run-journal-unfinished.js.map +1 -0
  125. package/dist/run-journal.d.ts +25 -1
  126. package/dist/run-journal.d.ts.map +1 -1
  127. package/dist/run-journal.js +15 -1
  128. package/dist/run-journal.js.map +1 -1
  129. package/open-design.json +2 -2
  130. package/package.json +1 -1
  131. package/skills/12ui-design/SKILL.md +2 -0
  132. 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
- pick: string;
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;AAOjF,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC3F,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,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,eAAe,CAAC;IACjC,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;CACjB,CAAC;AAyDF,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,cA2FH,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"}
@@ -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 { parseImproveBootstrap } from './redesign-capture.js';
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}`, 'improve_candidates_invalid');
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
- const pick = (stringFlag(args.flags, 'pick')?.trim() ?? 'a').toUpperCase();
82
- if (!/^[A-P]$/u.test(pick) || pick.charCodeAt(0) - 64 > candidates) {
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":"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"}
1
+ {"version":3,"file":"improve-options.js","sourceRoot":"","sources":["../src/improve-options.ts"],"names":[],"mappings":"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"}
@@ -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