@12ui/design 0.2.53 → 0.2.55

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 (136) hide show
  1. package/README.md +18 -0
  2. package/SKILL.md +1 -1
  3. package/dist/cli-arguments.d.ts +3 -1
  4. package/dist/cli-arguments.d.ts.map +1 -1
  5. package/dist/cli-arguments.js +19 -2
  6. package/dist/cli-arguments.js.map +1 -1
  7. package/dist/cli-convert-command.d.ts +3 -1
  8. package/dist/cli-convert-command.d.ts.map +1 -1
  9. package/dist/cli-convert-command.js +9 -7
  10. package/dist/cli-convert-command.js.map +1 -1
  11. package/dist/cli-help/design.d.ts +10 -0
  12. package/dist/cli-help/design.d.ts.map +1 -1
  13. package/dist/cli-help/design.js +25 -0
  14. package/dist/cli-help/design.js.map +1 -1
  15. package/dist/cli-help/index.d.ts +10 -0
  16. package/dist/cli-help/index.d.ts.map +1 -1
  17. package/dist/cli-improve-command.d.ts +5 -0
  18. package/dist/cli-improve-command.d.ts.map +1 -0
  19. package/dist/cli-improve-command.js +213 -0
  20. package/dist/cli-improve-command.js.map +1 -0
  21. package/dist/cli-run.d.ts.map +1 -1
  22. package/dist/cli-run.js +8 -0
  23. package/dist/cli-run.js.map +1 -1
  24. package/dist/cli-usage.d.ts.map +1 -1
  25. package/dist/cli-usage.js +2 -0
  26. package/dist/cli-usage.js.map +1 -1
  27. package/dist/improve-added-specs.d.ts +32 -0
  28. package/dist/improve-added-specs.d.ts.map +1 -0
  29. package/dist/improve-added-specs.js +162 -0
  30. package/dist/improve-added-specs.js.map +1 -0
  31. package/dist/improve-concept.d.ts +10 -0
  32. package/dist/improve-concept.d.ts.map +1 -0
  33. package/dist/improve-concept.js +45 -0
  34. package/dist/improve-concept.js.map +1 -0
  35. package/dist/improve-conversion-stage.d.ts +28 -0
  36. package/dist/improve-conversion-stage.d.ts.map +1 -0
  37. package/dist/improve-conversion-stage.js +214 -0
  38. package/dist/improve-conversion-stage.js.map +1 -0
  39. package/dist/improve-convert-resilience.d.ts +23 -0
  40. package/dist/improve-convert-resilience.d.ts.map +1 -0
  41. package/dist/improve-convert-resilience.js +102 -0
  42. package/dist/improve-convert-resilience.js.map +1 -0
  43. package/dist/improve-delivery-stages.d.ts +10 -0
  44. package/dist/improve-delivery-stages.d.ts.map +1 -0
  45. package/dist/improve-delivery-stages.js +160 -0
  46. package/dist/improve-delivery-stages.js.map +1 -0
  47. package/dist/improve-dom-anchor.d.ts +18 -0
  48. package/dist/improve-dom-anchor.d.ts.map +1 -0
  49. package/dist/improve-dom-anchor.js +120 -0
  50. package/dist/improve-dom-anchor.js.map +1 -0
  51. package/dist/improve-dom-diff.d.ts +33 -0
  52. package/dist/improve-dom-diff.d.ts.map +1 -0
  53. package/dist/improve-dom-diff.js +129 -0
  54. package/dist/improve-dom-diff.js.map +1 -0
  55. package/dist/improve-dom-extract.d.ts +15 -0
  56. package/dist/improve-dom-extract.d.ts.map +1 -0
  57. package/dist/improve-dom-extract.js +343 -0
  58. package/dist/improve-dom-extract.js.map +1 -0
  59. package/dist/improve-dom-gate.d.ts +12 -0
  60. package/dist/improve-dom-gate.d.ts.map +1 -0
  61. package/dist/improve-dom-gate.js +34 -0
  62. package/dist/improve-dom-gate.js.map +1 -0
  63. package/dist/improve-dom-neighbour.d.ts +16 -0
  64. package/dist/improve-dom-neighbour.d.ts.map +1 -0
  65. package/dist/improve-dom-neighbour.js +95 -0
  66. package/dist/improve-dom-neighbour.js.map +1 -0
  67. package/dist/improve-dom-scale.d.ts +8 -0
  68. package/dist/improve-dom-scale.d.ts.map +1 -0
  69. package/dist/improve-dom-scale.js +63 -0
  70. package/dist/improve-dom-scale.js.map +1 -0
  71. package/dist/improve-generation-stages.d.ts +23 -0
  72. package/dist/improve-generation-stages.d.ts.map +1 -0
  73. package/dist/improve-generation-stages.js +166 -0
  74. package/dist/improve-generation-stages.js.map +1 -0
  75. package/dist/improve-kit-readme.d.ts +3 -0
  76. package/dist/improve-kit-readme.d.ts.map +1 -0
  77. package/dist/improve-kit-readme.js +32 -0
  78. package/dist/improve-kit-readme.js.map +1 -0
  79. package/dist/improve-layerdoc-diff.d.ts +27 -0
  80. package/dist/improve-layerdoc-diff.d.ts.map +1 -0
  81. package/dist/improve-layerdoc-diff.js +311 -0
  82. package/dist/improve-layerdoc-diff.js.map +1 -0
  83. package/dist/improve-layerdoc-types.d.ts +109 -0
  84. package/dist/improve-layerdoc-types.d.ts.map +1 -0
  85. package/dist/improve-layerdoc-types.js +2 -0
  86. package/dist/improve-layerdoc-types.js.map +1 -0
  87. package/dist/improve-options.d.ts +44 -0
  88. package/dist/improve-options.d.ts.map +1 -0
  89. package/dist/improve-options.js +163 -0
  90. package/dist/improve-options.js.map +1 -0
  91. package/dist/improve-plan-annotator.d.ts +14 -0
  92. package/dist/improve-plan-annotator.d.ts.map +1 -0
  93. package/dist/improve-plan-annotator.js +80 -0
  94. package/dist/improve-plan-annotator.js.map +1 -0
  95. package/dist/improve-plan-render.d.ts +23 -0
  96. package/dist/improve-plan-render.d.ts.map +1 -0
  97. package/dist/improve-plan-render.js +81 -0
  98. package/dist/improve-plan-render.js.map +1 -0
  99. package/dist/improve-pricing-plan.d.ts +20 -0
  100. package/dist/improve-pricing-plan.d.ts.map +1 -0
  101. package/dist/improve-pricing-plan.js +72 -0
  102. package/dist/improve-pricing-plan.js.map +1 -0
  103. package/dist/improve-source-hints.d.ts +31 -0
  104. package/dist/improve-source-hints.d.ts.map +1 -0
  105. package/dist/improve-source-hints.js +131 -0
  106. package/dist/improve-source-hints.js.map +1 -0
  107. package/dist/improve-stage-runners.d.ts +7 -0
  108. package/dist/improve-stage-runners.d.ts.map +1 -0
  109. package/dist/improve-stage-runners.js +6 -0
  110. package/dist/improve-stage-runners.js.map +1 -0
  111. package/dist/improve-stage-shared.d.ts +27 -0
  112. package/dist/improve-stage-shared.d.ts.map +1 -0
  113. package/dist/improve-stage-shared.js +34 -0
  114. package/dist/improve-stage-shared.js.map +1 -0
  115. package/dist/improve-token-patch.d.ts +19 -0
  116. package/dist/improve-token-patch.d.ts.map +1 -0
  117. package/dist/improve-token-patch.js +118 -0
  118. package/dist/improve-token-patch.js.map +1 -0
  119. package/dist/improve-workspace.d.ts +113 -0
  120. package/dist/improve-workspace.d.ts.map +1 -0
  121. package/dist/improve-workspace.js +122 -0
  122. package/dist/improve-workspace.js.map +1 -0
  123. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  124. package/dist/legacy-skill-catalog.js +8 -0
  125. package/dist/legacy-skill-catalog.js.map +1 -1
  126. package/dist/redesign-capture.d.ts +25 -0
  127. package/dist/redesign-capture.d.ts.map +1 -1
  128. package/dist/redesign-capture.js +50 -1
  129. package/dist/redesign-capture.js.map +1 -1
  130. package/dist/run-journal-commands.d.ts.map +1 -1
  131. package/dist/run-journal-commands.js +9 -0
  132. package/dist/run-journal-commands.js.map +1 -1
  133. package/open-design.json +2 -2
  134. package/package.json +1 -1
  135. package/skills/12ui-design/SKILL.md +11 -1
  136. package/skills/12ui-design/improve.md +74 -0
@@ -0,0 +1,63 @@
1
+ import { canvasOfDoc, isRecord } from './improve-layerdoc-diff.js';
2
+ /**
3
+ * DOM and target canvases are matched in fractional coordinates. Fixed and
4
+ * sticky leaves use the captured viewport as their vertical frame; using the
5
+ * full document height compresses them and shifts neighbour matches. Lengths
6
+ * use the width ratio, an explicit approximation for unlike aspect ratios.
7
+ */
8
+ const round = (value, digits = 4) => {
9
+ const factor = 10 ** digits;
10
+ return Math.round(value * factor) / factor;
11
+ };
12
+ export const rescalePxInString = (value, factor) => (typeof value === 'string'
13
+ ? value.replace(/(-?\d*\.?\d+)px/gu, (_match, number) => (`${round(Number.parseFloat(number) * factor, 2)}px`))
14
+ : value);
15
+ export const normalizeLayerDoc = (document, lengthScale = 1, anchoredHeight = 0) => {
16
+ if (!isRecord(document))
17
+ throw new Error('document must be an object');
18
+ const canvas = canvasOfDoc(document);
19
+ const scaleLeaf = (value) => {
20
+ if (!isRecord(value))
21
+ return value;
22
+ if (value.kind === 'group' && Array.isArray(value.children)) {
23
+ return { ...value, children: value.children.map(scaleLeaf) };
24
+ }
25
+ const leaf = value;
26
+ const output = { ...leaf };
27
+ const verticalFrame = leaf.viewportAnchored && anchoredHeight ? anchoredHeight : canvas.height;
28
+ if (leaf.viewportAnchored && anchoredHeight)
29
+ output.verticalFrame = anchoredHeight;
30
+ for (const field of ['box', 'layoutBox']) {
31
+ const box = leaf[field];
32
+ if (!Array.isArray(box) || box.length !== 4)
33
+ continue;
34
+ output[field] = [
35
+ round(box[0] / canvas.width),
36
+ round(box[1] / verticalFrame),
37
+ round(box[2] / canvas.width),
38
+ round(box[3] / verticalFrame),
39
+ ];
40
+ }
41
+ if (lengthScale !== 1) {
42
+ for (const field of ['fontSizePx', 'fittedFontSizePx']) {
43
+ if (typeof leaf[field] === 'number')
44
+ output[field] = round(leaf[field] * lengthScale, 2);
45
+ }
46
+ if (isRecord(leaf.style)) {
47
+ output.style = Object.fromEntries(Object.entries(leaf.style).map(([key, styleValue]) => [
48
+ key,
49
+ rescalePxInString(styleValue, lengthScale),
50
+ ]));
51
+ }
52
+ }
53
+ return output;
54
+ };
55
+ return { ...document, canvas, layers: Array.isArray(document.layers) ? document.layers.map(scaleLeaf) : [] };
56
+ };
57
+ export const toCanvasFrame = (box, canvas) => box ? [
58
+ round(box[0] * canvas.width, 1),
59
+ round(box[1] * canvas.height, 1),
60
+ round(box[2] * canvas.width, 1),
61
+ round(box[3] * canvas.height, 1),
62
+ ] : undefined;
63
+ //# sourceMappingURL=improve-dom-scale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-dom-scale.js","sourceRoot":"","sources":["../src/improve-dom-scale.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { CliFlags } from './cli-arguments.js';
2
+ import type { ImproveOptions } from './improve-options.js';
3
+ import { type ImproveCommandDependencies } from './improve-stage-shared.js';
4
+ import { type ImproveRecord } from './improve-workspace.js';
5
+ export declare const runImproveCaptureStage: (args: {
6
+ record: ImproveRecord;
7
+ options: ImproveOptions;
8
+ dependencies: ImproveCommandDependencies;
9
+ price: number;
10
+ }) => Promise<ImproveRecord>;
11
+ export declare const runImproveDraftStage: (args: {
12
+ record: ImproveRecord;
13
+ options: ImproveOptions;
14
+ flags: CliFlags;
15
+ dependencies: ImproveCommandDependencies;
16
+ price: number;
17
+ }) => Promise<ImproveRecord>;
18
+ export declare const runImprovePickStage: (args: {
19
+ record: ImproveRecord;
20
+ options: ImproveOptions;
21
+ price: number;
22
+ }) => Promise<ImproveRecord>;
23
+ //# sourceMappingURL=improve-generation-stages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-generation-stages.d.ts","sourceRoot":"","sources":["../src/improve-generation-stages.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAInD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAEhC,eAAO,MAAM,sBAAsB,GAAU,MAAM;IACjD,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,YAAY,EAAE,0BAA0B,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CAAC,aAAa,CA4DxB,CAAC;AAwBF,eAAO,MAAM,oBAAoB,GAAU,MAAM;IAC/C,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,0BAA0B,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CAAC,aAAa,CA6CxB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,MAAM;IAC9C,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CAAC,aAAa,CA2BxB,CAAC"}
@@ -0,0 +1,166 @@
1
+ import { copyFile, mkdir, readFile, rm } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import sharp from 'sharp';
4
+ import { runDraftCommand } from './cli-draft-command.js';
5
+ import { CliRefusal } from './cli-refusal.js';
6
+ import { draftPaths, readDraftRecord } from './draft-workspace.js';
7
+ import { captureImprovePage, parseImproveBootstrap } from './redesign-capture.js';
8
+ import { improveSha256, noteImproveStage, } from './improve-stage-shared.js';
9
+ import { writeImproveRecord, } from './improve-workspace.js';
10
+ export const runImproveCaptureStage = async (args) => {
11
+ if (args.record.capture)
12
+ return noteImproveStage({
13
+ record: args.record, stage: 'capture', priceCeilingUsd: args.price, replayed: true, write: true,
14
+ });
15
+ const { paths } = args.options;
16
+ let sourceImage;
17
+ let dimensions;
18
+ if (args.options.input.kind === 'url') {
19
+ await mkdir(paths.captureDir, { recursive: true });
20
+ sourceImage = path.join(paths.captureDir, 'source.png');
21
+ dimensions = await (args.dependencies.capture ?? captureImprovePage)({
22
+ url: args.options.input.value,
23
+ screenshotFile: sourceImage,
24
+ domDocFile: paths.currentDomDoc,
25
+ viewport: args.record.viewport,
26
+ fullPage: args.record.fullPage,
27
+ bootstrap: args.record.bootstrap.map(parseImproveBootstrap),
28
+ });
29
+ }
30
+ else {
31
+ const bytes = await readFile(args.options.input.value).catch((error) => {
32
+ throw new CliRefusal(`Cannot read improve source image ${args.options.input.value}: ${error instanceof Error ? error.message : String(error)}`, 'improve_image_unreadable');
33
+ });
34
+ const image = sharp(bytes, { animated: false, failOn: 'warning' });
35
+ const metadata = await image.metadata().catch((error) => {
36
+ throw new CliRefusal(`Improve source image is not a usable PNG, JPEG, or WebP: ${error instanceof Error ? error.message : String(error)}`, 'improve_image_invalid');
37
+ });
38
+ if (!metadata.width || !metadata.height || !['png', 'jpeg', 'webp'].includes(metadata.format ?? '')) {
39
+ throw new CliRefusal('Improve source image is not a usable PNG, JPEG, or WebP', 'improve_image_invalid');
40
+ }
41
+ await image.png().toFile(paths.sourceImage);
42
+ sourceImage = paths.sourceImage;
43
+ dimensions = { width: metadata.width, height: metadata.height };
44
+ }
45
+ const bytes = await readFile(sourceImage);
46
+ let record = {
47
+ ...args.record,
48
+ input: {
49
+ ...args.record.input,
50
+ ...(args.options.input.kind === 'image'
51
+ ? { sha256: improveSha256(await readFile(args.options.input.value)) }
52
+ : {}),
53
+ },
54
+ capture: {
55
+ sourceImage,
56
+ sha256: improveSha256(bytes),
57
+ ...dimensions,
58
+ ...(args.options.input.kind === 'url' ? { domDoc: paths.currentDomDoc } : {}),
59
+ },
60
+ };
61
+ record = await noteImproveStage({
62
+ record, stage: 'capture', priceCeilingUsd: args.price, replayed: false, write: false,
63
+ });
64
+ await writeImproveRecord(paths.record, record);
65
+ return record;
66
+ };
67
+ const materializedCandidates = async (result) => {
68
+ const paths = draftPaths(result.prepared.runDir);
69
+ const [record, completion] = await Promise.all([
70
+ readDraftRecord(paths.draftRecord),
71
+ readFile(paths.completion, 'utf8').then((raw) => JSON.parse(raw)).catch(() => undefined),
72
+ ]);
73
+ if (!record || !completion) {
74
+ throw new Error(`Draft ${result.prepared.runDir} did not leave its durable record and completion`);
75
+ }
76
+ return {
77
+ candidates: record.hosted.candidates.map((candidate) => {
78
+ const file = completion.candidates.find((entry) => entry.slot === candidate.slot);
79
+ if (!file)
80
+ throw new Error(`Draft candidate ${candidate.id} was not materialized`);
81
+ return { slot: candidate.id, path: file.path, sha256: file.sha256 };
82
+ }),
83
+ recordPath: paths.draftRecord,
84
+ };
85
+ };
86
+ export const runImproveDraftStage = async (args) => {
87
+ if (args.record.draft)
88
+ return noteImproveStage({
89
+ record: args.record, stage: 'draft', priceCeilingUsd: args.price, replayed: true, write: true,
90
+ });
91
+ if (!args.record.capture)
92
+ throw new Error('Cannot draft before capture');
93
+ const draftFlags = {
94
+ concept: args.record.concept,
95
+ reference: args.record.capture.sourceImage,
96
+ retain: args.record.retainFlag,
97
+ candidates: String(args.record.candidates),
98
+ wait: true,
99
+ quiet: true,
100
+ };
101
+ for (const flag of ['origin', 'api-key']) {
102
+ if (args.flags[flag] !== undefined)
103
+ draftFlags[flag] = args.flags[flag];
104
+ }
105
+ const stateRoot = path.join(args.options.paths.stateDir, 'draft');
106
+ await mkdir(stateRoot, { recursive: true });
107
+ const result = await (args.dependencies.runDraft ?? runDraftCommand)(draftFlags, {
108
+ workspaceRoot: stateRoot,
109
+ write: () => undefined,
110
+ warn: args.dependencies.warn,
111
+ });
112
+ const materialized = await materializedCandidates(result);
113
+ await mkdir(args.options.paths.candidatesDir, { recursive: true });
114
+ const candidates = await Promise.all(materialized.candidates.map(async (candidate) => {
115
+ const destination = path.join(args.options.paths.candidatesDir, `${candidate.slot}.png`);
116
+ await copyFile(candidate.path, destination);
117
+ return { ...candidate, path: destination };
118
+ }));
119
+ await copyFile(materialized.recordPath, args.options.paths.candidateRecord);
120
+ let record = {
121
+ ...args.record,
122
+ draft: { runDir: result.prepared.runDir, runId: result.prepared.runId, candidates },
123
+ };
124
+ record = await noteImproveStage({
125
+ record, stage: 'draft', priceCeilingUsd: args.price, replayed: false, write: false,
126
+ });
127
+ await writeImproveRecord(args.options.paths.record, record);
128
+ args.dependencies.journal?.note({
129
+ runId: result.prepared.runId,
130
+ artifacts: [args.options.paths.candidateRecord, ...candidates.map((candidate) => candidate.path)],
131
+ purchased: [result.prepared.runId],
132
+ });
133
+ return record;
134
+ };
135
+ export const runImprovePickStage = async (args) => {
136
+ if (!args.record.draft)
137
+ throw new Error('Cannot pick before draft');
138
+ const candidate = args.record.draft.candidates.find((entry) => entry.slot === args.options.pick);
139
+ if (!candidate)
140
+ throw new CliRefusal(`Candidate ${args.options.pick} was not materialized`, 'improve_pick_missing');
141
+ if (args.record.pick?.slot === candidate.slot)
142
+ return noteImproveStage({
143
+ record: args.record, stage: 'pick', priceCeilingUsd: args.price, replayed: true, write: true,
144
+ });
145
+ await copyFile(candidate.path, args.options.paths.winnerImage);
146
+ if (args.record.pick) {
147
+ await Promise.all([
148
+ rm(args.options.paths.targetDir, { recursive: true, force: true }),
149
+ rm(args.options.paths.planDir, { recursive: true, force: true }),
150
+ ]);
151
+ }
152
+ let record = {
153
+ ...args.record,
154
+ pick: { slot: candidate.slot, imagePath: args.options.paths.winnerImage, sha256: candidate.sha256 },
155
+ ...(args.record.pick ? { convert: undefined, plan: undefined } : {}),
156
+ stages: args.record.pick
157
+ ? Object.fromEntries(Object.entries(args.record.stages).filter(([stage]) => !['convert', 'plan'].includes(stage)))
158
+ : args.record.stages,
159
+ };
160
+ record = await noteImproveStage({
161
+ record, stage: 'pick', priceCeilingUsd: args.price, replayed: false, write: false,
162
+ });
163
+ await writeImproveRecord(args.options.paths.record, record);
164
+ return record;
165
+ };
166
+ //# sourceMappingURL=improve-generation-stages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-generation-stages.js","sourceRoot":"","sources":["../src/improve-generation-stages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ImproveRecord } from './improve-workspace.js';
2
+ export declare const writeImproveReadme: (record: ImproveRecord) => Promise<string>;
3
+ //# sourceMappingURL=improve-kit-readme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-kit-readme.d.ts","sourceRoot":"","sources":["../src/improve-kit-readme.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,eAAO,MAAM,kBAAkB,GAAU,QAAQ,aAAa,KAAG,OAAO,CAAC,MAAM,CA4B9E,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ export const writeImproveReadme = async (record) => {
4
+ const readme = path.join(record.runDir, 'README.md');
5
+ const lines = [
6
+ '# 12ui improve kit', '',
7
+ `Input: ${record.input.kind} \`${record.input.value}\``,
8
+ `Picked candidate: ${record.pick?.slot ?? (record.target ? 'bring-your-own target' : 'not yet picked')}`, '',
9
+ '## Anatomy', '',
10
+ '- `improve.json` is the durable stage, purchase, price-ceiling, and replay record.',
11
+ `- ${record.input.kind === 'url' ? '`capture/` and `current.domdoc.json` hold the screenshot and selector-verified DOM extraction.' : '`source.png` is the normalized source screenshot.'}`,
12
+ '- `candidates/` keeps every generated option and its draft record; `winner.png` is the explicit image target.',
13
+ '- `target/` holds the target LayerDoc, responsive HTML when generated, and extracted assets.',
14
+ '- `plan/` holds the diff, implementation plan, token patch, added-element assets, or `GATE.md` when anchoring was unsafe.', '',
15
+ ...(record.convert?.layout === 'fixed' ? [
16
+ '## Fixed-layout target', '',
17
+ `- Warning: ${record.convert.responsiveWarning ?? 'Responsive HTML was unavailable.'}`,
18
+ '- The target HTML is a fixed-layout fallback derived free from the successful LayerDoc conversion. It is not a responsive deliverable; the LayerDoc remains valid for planning.', '',
19
+ ] : []),
20
+ '## Next', '',
21
+ '- Treat the target HTML when present and `target/winner.layerdoc.json` as the visual source of truth.',
22
+ '- Apply the plan in the owning repository, then verify behavior and screenshots there. This kit never applies code.',
23
+ '- Re-run from `pick` with another `--pick` slot to reuse capture and candidates; settled paid stages replay.', '',
24
+ '## Guardrails', '',
25
+ '- Preserve all real content, data, and controls; invent nothing.',
26
+ '- Do not describe emptiness or thin content as a defect: that phrasing can invite fabricated UI.',
27
+ '- Verify Tailwind v4 arbitrary custom-property syntax, quote CSS `url(...)` values, and update CSP before introducing data URIs.', '',
28
+ ];
29
+ await writeFile(readme, lines.join('\n'), 'utf8');
30
+ return readme;
31
+ };
32
+ //# sourceMappingURL=improve-kit-readme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-kit-readme.js","sourceRoot":"","sources":["../src/improve-kit-readme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAAqB,EAAmB,EAAE;IACjF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG;QACZ,oBAAoB,EAAE,EAAE;QACxB,UAAU,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI;QACvD,qBAAqB,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE;QAC5G,YAAY,EAAE,EAAE;QAChB,oFAAoF;QACpF,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,gGAAgG,CAAC,CAAC,CAAC,mDAAmD,EAAE;QAC3L,+GAA+G;QAC/G,8FAA8F;QAC9F,2HAA2H,EAAE,EAAE;QAC/H,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC;YACvC,wBAAwB,EAAE,EAAE;YAC5B,cAAc,MAAM,CAAC,OAAO,CAAC,iBAAiB,IAAI,kCAAkC,EAAE;YACtF,iLAAiL,EAAE,EAAE;SACtL,CAAC,CAAC,CAAC,EAAE,CAAC;QACP,SAAS,EAAE,EAAE;QACb,uGAAuG;QACvG,qHAAqH;QACrH,8GAA8G,EAAE,EAAE;QAClH,eAAe,EAAE,EAAE;QACnB,kEAAkE;QAClE,kGAAkG;QAClG,kIAAkI,EAAE,EAAE;KACvI,CAAC;IACF,MAAM,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { LayerBox, LayerDelta, LayerDiffResult, LayerDocLike, LayerLeaf } from './improve-layerdoc-types.js';
2
+ /**
3
+ * LayerDoc matching ported from the measured improve pilot.
4
+ *
5
+ * Caveat: extractionIndex is meaningful only inside one conversion lineage.
6
+ * Independent conversions usually reuse the same numeric range, so raw key
7
+ * overlap is actively misleading. Identity coverage is therefore weighted by
8
+ * pair plausibility and falls back to content then spatial matching below 50%.
9
+ */
10
+ export declare const IDENTITY_COVERAGE_MIN = 0.5;
11
+ export declare const SPATIAL_IOU_MIN = 0.1;
12
+ export declare const TEXT_BEARING_KINDS: Set<string>;
13
+ export declare const isRecord: (value: unknown) => value is Record<string, unknown>;
14
+ export declare const flattenLayerDoc: (doc: unknown) => LayerLeaf[];
15
+ export declare const boxOf: (leaf: LayerLeaf | undefined) => LayerBox | undefined;
16
+ export declare const concise: (value: unknown, maxLength?: number) => string | undefined;
17
+ export declare const normalizeContent: (value: unknown) => string;
18
+ export declare const boxIou: (left: LayerBox, right: LayerBox) => number;
19
+ export declare const isPlausiblePair: (before: LayerLeaf, after: LayerLeaf) => boolean;
20
+ export declare const MEANINGFUL_FIELDS: readonly ["kind", "content", "box", "hidden", "fontSizePx", "fittedFontSizePx", "fontWeight", "googleFontFamily", "color", "align", "opacity", "rotationDeg", "textRotationDeg", "textSlantDeg", "style"];
21
+ export declare const computeLayerDeltas: (before: LayerLeaf, after: LayerLeaf) => LayerDelta[];
22
+ export declare const diffLayerDocs: (beforeDoc: unknown, afterDoc: unknown, options?: {
23
+ strategy?: "auto" | "fallback";
24
+ contentKeyMode?: "kind" | "family";
25
+ }) => LayerDiffResult;
26
+ export declare const canvasOfDoc: (doc: unknown) => LayerDocLike["canvas"];
27
+ //# sourceMappingURL=improve-layerdoc-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-layerdoc-diff.d.ts","sourceRoot":"","sources":["../src/improve-layerdoc-diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,eAAe,EACf,YAAY,EACZ,SAAS,EAEV,MAAM,6BAA6B,CAAC;AAErC;;;;;;;GAOG;AAEH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,eAAe,MAAM,CAAC;AAGnC,eAAO,MAAM,kBAAkB,aAE7B,CAAC;AAQH,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAExE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,OAAO,KAAG,SAAS,EAYvD,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,MAAM,SAAS,GAAG,SAAS,KAAG,QAAQ,GAAG,SAM9D,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,EAAE,kBAAe,KAAG,MAAM,GAAG,SAKlE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,MAEjD,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,MAAM,QAAQ,EAAE,OAAO,QAAQ,KAAG,MAcxD,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,SAAS,EAAE,OAAO,SAAS,KAAG,OASrE,CAAC;AA0IF,eAAO,MAAM,iBAAiB,2MAIpB,CAAC;AAIX,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,EAAE,OAAO,SAAS,KAAG,UAAU,EAmBlF,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,WAAW,OAAO,EAClB,UAAU,OAAO,EACjB,UAAS;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAO,KACnF,eAsDF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,KAAK,OAAO,KAAG,YAAY,CAAC,QAAQ,CAS/D,CAAC"}