@12ui/design 0.2.52 → 0.2.54

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 (135) 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 +18 -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-draft-command.d.ts.map +1 -1
  12. package/dist/cli-draft-command.js +17 -1
  13. package/dist/cli-draft-command.js.map +1 -1
  14. package/dist/cli-help/design.d.ts +10 -0
  15. package/dist/cli-help/design.d.ts.map +1 -1
  16. package/dist/cli-help/design.js +23 -0
  17. package/dist/cli-help/design.js.map +1 -1
  18. package/dist/cli-help/index.d.ts +10 -0
  19. package/dist/cli-help/index.d.ts.map +1 -1
  20. package/dist/cli-improve-command.d.ts +5 -0
  21. package/dist/cli-improve-command.d.ts.map +1 -0
  22. package/dist/cli-improve-command.js +197 -0
  23. package/dist/cli-improve-command.js.map +1 -0
  24. package/dist/cli-run.d.ts.map +1 -1
  25. package/dist/cli-run.js +8 -0
  26. package/dist/cli-run.js.map +1 -1
  27. package/dist/cli-usage.d.ts.map +1 -1
  28. package/dist/cli-usage.js +2 -0
  29. package/dist/cli-usage.js.map +1 -1
  30. package/dist/hosted-draft-run.d.ts +25 -1
  31. package/dist/hosted-draft-run.d.ts.map +1 -1
  32. package/dist/hosted-draft-run.js +82 -2
  33. package/dist/hosted-draft-run.js.map +1 -1
  34. package/dist/improve-added-specs.d.ts +32 -0
  35. package/dist/improve-added-specs.d.ts.map +1 -0
  36. package/dist/improve-added-specs.js +162 -0
  37. package/dist/improve-added-specs.js.map +1 -0
  38. package/dist/improve-concept.d.ts +10 -0
  39. package/dist/improve-concept.d.ts.map +1 -0
  40. package/dist/improve-concept.js +45 -0
  41. package/dist/improve-concept.js.map +1 -0
  42. package/dist/improve-delivery-stages.d.ts +16 -0
  43. package/dist/improve-delivery-stages.d.ts.map +1 -0
  44. package/dist/improve-delivery-stages.js +259 -0
  45. package/dist/improve-delivery-stages.js.map +1 -0
  46. package/dist/improve-dom-anchor.d.ts +18 -0
  47. package/dist/improve-dom-anchor.d.ts.map +1 -0
  48. package/dist/improve-dom-anchor.js +120 -0
  49. package/dist/improve-dom-anchor.js.map +1 -0
  50. package/dist/improve-dom-diff.d.ts +33 -0
  51. package/dist/improve-dom-diff.d.ts.map +1 -0
  52. package/dist/improve-dom-diff.js +129 -0
  53. package/dist/improve-dom-diff.js.map +1 -0
  54. package/dist/improve-dom-extract.d.ts +15 -0
  55. package/dist/improve-dom-extract.d.ts.map +1 -0
  56. package/dist/improve-dom-extract.js +343 -0
  57. package/dist/improve-dom-extract.js.map +1 -0
  58. package/dist/improve-dom-gate.d.ts +12 -0
  59. package/dist/improve-dom-gate.d.ts.map +1 -0
  60. package/dist/improve-dom-gate.js +34 -0
  61. package/dist/improve-dom-gate.js.map +1 -0
  62. package/dist/improve-dom-neighbour.d.ts +16 -0
  63. package/dist/improve-dom-neighbour.d.ts.map +1 -0
  64. package/dist/improve-dom-neighbour.js +95 -0
  65. package/dist/improve-dom-neighbour.js.map +1 -0
  66. package/dist/improve-dom-scale.d.ts +8 -0
  67. package/dist/improve-dom-scale.d.ts.map +1 -0
  68. package/dist/improve-dom-scale.js +63 -0
  69. package/dist/improve-dom-scale.js.map +1 -0
  70. package/dist/improve-generation-stages.d.ts +23 -0
  71. package/dist/improve-generation-stages.d.ts.map +1 -0
  72. package/dist/improve-generation-stages.js +166 -0
  73. package/dist/improve-generation-stages.js.map +1 -0
  74. package/dist/improve-kit-readme.d.ts +3 -0
  75. package/dist/improve-kit-readme.d.ts.map +1 -0
  76. package/dist/improve-kit-readme.js +27 -0
  77. package/dist/improve-kit-readme.js.map +1 -0
  78. package/dist/improve-layerdoc-diff.d.ts +27 -0
  79. package/dist/improve-layerdoc-diff.d.ts.map +1 -0
  80. package/dist/improve-layerdoc-diff.js +311 -0
  81. package/dist/improve-layerdoc-diff.js.map +1 -0
  82. package/dist/improve-layerdoc-types.d.ts +109 -0
  83. package/dist/improve-layerdoc-types.d.ts.map +1 -0
  84. package/dist/improve-layerdoc-types.js +2 -0
  85. package/dist/improve-layerdoc-types.js.map +1 -0
  86. package/dist/improve-options.d.ts +41 -0
  87. package/dist/improve-options.d.ts.map +1 -0
  88. package/dist/improve-options.js +148 -0
  89. package/dist/improve-options.js.map +1 -0
  90. package/dist/improve-plan-annotator.d.ts +14 -0
  91. package/dist/improve-plan-annotator.d.ts.map +1 -0
  92. package/dist/improve-plan-annotator.js +80 -0
  93. package/dist/improve-plan-annotator.js.map +1 -0
  94. package/dist/improve-plan-render.d.ts +23 -0
  95. package/dist/improve-plan-render.d.ts.map +1 -0
  96. package/dist/improve-plan-render.js +81 -0
  97. package/dist/improve-plan-render.js.map +1 -0
  98. package/dist/improve-pricing-plan.d.ts +20 -0
  99. package/dist/improve-pricing-plan.d.ts.map +1 -0
  100. package/dist/improve-pricing-plan.js +72 -0
  101. package/dist/improve-pricing-plan.js.map +1 -0
  102. package/dist/improve-source-hints.d.ts +31 -0
  103. package/dist/improve-source-hints.d.ts.map +1 -0
  104. package/dist/improve-source-hints.js +131 -0
  105. package/dist/improve-source-hints.js.map +1 -0
  106. package/dist/improve-stage-runners.d.ts +6 -0
  107. package/dist/improve-stage-runners.d.ts.map +1 -0
  108. package/dist/improve-stage-runners.js +5 -0
  109. package/dist/improve-stage-runners.js.map +1 -0
  110. package/dist/improve-stage-shared.d.ts +26 -0
  111. package/dist/improve-stage-shared.d.ts.map +1 -0
  112. package/dist/improve-stage-shared.js +34 -0
  113. package/dist/improve-stage-shared.js.map +1 -0
  114. package/dist/improve-token-patch.d.ts +19 -0
  115. package/dist/improve-token-patch.d.ts.map +1 -0
  116. package/dist/improve-token-patch.js +118 -0
  117. package/dist/improve-token-patch.js.map +1 -0
  118. package/dist/improve-workspace.d.ts +103 -0
  119. package/dist/improve-workspace.d.ts.map +1 -0
  120. package/dist/improve-workspace.js +111 -0
  121. package/dist/improve-workspace.js.map +1 -0
  122. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  123. package/dist/legacy-skill-catalog.js +8 -0
  124. package/dist/legacy-skill-catalog.js.map +1 -1
  125. package/dist/redesign-capture.d.ts +25 -0
  126. package/dist/redesign-capture.d.ts.map +1 -1
  127. package/dist/redesign-capture.js +50 -1
  128. package/dist/redesign-capture.js.map +1 -1
  129. package/dist/run-journal-commands.d.ts.map +1 -1
  130. package/dist/run-journal-commands.js +9 -0
  131. package/dist/run-journal-commands.js.map +1 -1
  132. package/open-design.json +2 -2
  133. package/package.json +1 -1
  134. package/skills/12ui-design/SKILL.md +11 -1
  135. package/skills/12ui-design/improve.md +73 -0
@@ -0,0 +1,162 @@
1
+ import { mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { insertionAnchor, selectorLabel, domPx } from './improve-dom-anchor.js';
4
+ /** Flatten target leaves while retaining group ancestry for sibling placement. */
5
+ export const flattenImproveHierarchy = (document) => {
6
+ const layers = document && typeof document === 'object' && 'layers' in document
7
+ && Array.isArray(document.layers) ? document.layers : [];
8
+ const output = [];
9
+ const visit = (nodes, parents) => {
10
+ nodes.forEach((node, index) => {
11
+ if (!node || typeof node !== 'object')
12
+ return;
13
+ const leaf = node;
14
+ if (leaf.kind === 'group' && Array.isArray(leaf.children)) {
15
+ visit(leaf.children, [...parents, `${leaf.name ?? 'group'}[${index}]`]);
16
+ }
17
+ else
18
+ output.push({ leaf, parentPath: parents });
19
+ });
20
+ };
21
+ visit(layers, []);
22
+ return output;
23
+ };
24
+ const commonDepth = (left, right) => {
25
+ let index = 0;
26
+ while (index < left.length && left[index] === right[index])
27
+ index += 1;
28
+ return index;
29
+ };
30
+ const insertionFor = (args) => {
31
+ const target = args.normalizedTarget[args.designIndex];
32
+ const siblings = args.diff.matched.filter((entry) => args.before[entry.beforeIndex]?.dom)
33
+ .map((entry) => ({
34
+ entry,
35
+ depth: commonDepth(args.hierarchy[args.designIndex]?.parentPath ?? [], args.hierarchy[entry.afterIndex]?.parentPath ?? []),
36
+ distance: target?.box && args.normalizedTarget[entry.afterIndex]?.box
37
+ ? Math.hypot(target.box[0] - args.normalizedTarget[entry.afterIndex].box[0], target.box[1] - args.normalizedTarget[entry.afterIndex].box[1])
38
+ : Number.POSITIVE_INFINITY,
39
+ }))
40
+ .sort((left, right) => right.depth - left.depth || left.distance - right.distance);
41
+ const sibling = siblings[0];
42
+ if (sibling) {
43
+ const siblingBox = args.normalizedTarget[sibling.entry.afterIndex]?.box;
44
+ const relation = target?.box && siblingBox
45
+ && (target.box[1] < siblingBox[1] || (target.box[1] === siblingBox[1] && target.box[0] < siblingBox[0]))
46
+ ? 'before'
47
+ : 'after';
48
+ return `${relation} ${selectorLabel(args.before[sibling.entry.beforeIndex])}`;
49
+ }
50
+ if (target?.box) {
51
+ const fallback = insertionAnchor(target.box, args.before);
52
+ if (fallback.container >= 0)
53
+ return `inside ${selectorLabel(args.before[fallback.container])}`;
54
+ }
55
+ return 'unresolved — no matched parent or sibling selector';
56
+ };
57
+ const shown = (value, suffix = '') => value === undefined || value === null || value === ''
58
+ ? 'not specified'
59
+ : `${typeof value === 'object' ? JSON.stringify(value) : String(value)}${suffix}`;
60
+ const exists = async (file) => Boolean(await stat(file).then(() => true).catch(() => false));
61
+ const artifactIds = (leaf) => {
62
+ const artifacts = leaf.artifacts;
63
+ if (!artifacts || typeof artifacts !== 'object' || Array.isArray(artifacts))
64
+ return [];
65
+ const preference = ['cutout', 'region2x', 'crop'];
66
+ return Object.entries(artifacts).flatMap(([name, value]) => (value && typeof value === 'object' && !Array.isArray(value)
67
+ && typeof value.artifactId === 'string'
68
+ ? [{ name, id: value.artifactId }]
69
+ : [])).sort((left, right) => {
70
+ const leftIndex = preference.indexOf(left.name);
71
+ const rightIndex = preference.indexOf(right.name);
72
+ return (leftIndex < 0 ? preference.length : leftIndex)
73
+ - (rightIndex < 0 ? preference.length : rightIndex);
74
+ }).map((entry) => entry.id);
75
+ };
76
+ const rasterAsset = async (leaf, designPath) => {
77
+ const ids = artifactIds(leaf);
78
+ if (ids.length === 0)
79
+ return undefined;
80
+ const directory = `${designPath}.assets`;
81
+ const manifest = await readFile(path.join(directory, 'manifest.json'), 'utf8')
82
+ .then((raw) => JSON.parse(raw))
83
+ .catch(() => ({ artifacts: [] }));
84
+ for (const id of ids) {
85
+ const declared = manifest.artifacts?.find((entry) => entry.id === id)?.localPath;
86
+ const declaredPath = declared
87
+ ? (path.isAbsolute(declared) ? declared : path.resolve(directory, declared))
88
+ : undefined;
89
+ if (declaredPath && await exists(declaredPath)) {
90
+ return {
91
+ kind: `extracted artifact ${id}`,
92
+ path: declaredPath,
93
+ destination: `src/assets/design/${path.basename(declaredPath)}`,
94
+ resolvable: true,
95
+ };
96
+ }
97
+ const fallback = await readdir(directory)
98
+ .then((names) => names.find((name) => name.startsWith(`${id}-`)))
99
+ .catch(() => undefined);
100
+ if (fallback) {
101
+ const assetPath = path.resolve(directory, fallback);
102
+ return {
103
+ kind: `extracted artifact ${id}`,
104
+ path: assetPath,
105
+ destination: `src/assets/design/${fallback}`,
106
+ resolvable: true,
107
+ };
108
+ }
109
+ }
110
+ return { kind: `unresolved extracted artifact (${ids.join(', ')})`, resolvable: false };
111
+ };
112
+ export const buildImproveAddedElementSpecs = async (args) => {
113
+ const hierarchy = flattenImproveHierarchy(args.targetDoc);
114
+ const matched = new Set(args.diff.matched.map((entry) => entry.afterIndex));
115
+ const specs = [];
116
+ for (const [designIndex, entry] of hierarchy.entries()) {
117
+ if (matched.has(designIndex))
118
+ continue;
119
+ const leaf = entry.leaf;
120
+ let asset = await rasterAsset(leaf, args.designPath);
121
+ if (typeof leaf.iconSvg === 'string' && leaf.iconSvg.trim()) {
122
+ const assetDir = path.join(args.outDir, 'assets');
123
+ const name = `added-${String(designIndex).padStart(3, '0')}-${(leaf.content ?? 'icon')
124
+ .toLowerCase().replace(/[^a-z0-9]+/gu, '-').replace(/^-+|-+$/gu, '') || 'icon'}.svg`;
125
+ await mkdir(assetDir, { recursive: true });
126
+ const assetPath = path.join(assetDir, name);
127
+ await writeFile(assetPath, `${leaf.iconSvg.trim()}\n`, 'utf8');
128
+ asset = {
129
+ kind: 'inline iconSvg materialized as SVG',
130
+ path: assetPath,
131
+ destination: `src/assets/design/${name}`,
132
+ resolvable: true,
133
+ };
134
+ }
135
+ const insertion = insertionFor({
136
+ designIndex,
137
+ hierarchy,
138
+ normalizedTarget: args.normalizedTarget,
139
+ before: args.before,
140
+ diff: args.diff,
141
+ });
142
+ const markdown = [
143
+ `### Added ${designIndex}: ${leaf.kind ?? 'layer'} — ${shown(leaf.content)}`,
144
+ '',
145
+ `- Kind: \`${leaf.kind ?? 'layer'}\``,
146
+ `- Content: ${shown(leaf.content)}`,
147
+ `- Box: target-design px ${shown(leaf.box)}; DOM-frame px ${shown(domPx(args.normalizedTarget[designIndex]?.box, args.canvas))}`,
148
+ `- Insert: ${insertion}`,
149
+ `- Typography: font-family ${shown(leaf.googleFontFamily)}; font-size ${shown(leaf.fontSizePx, leaf.fontSizePx === undefined ? '' : 'px')}; fitted-font-size ${shown(leaf.fittedFontSizePx, leaf.fittedFontSizePx === undefined ? '' : 'px')}; font-weight ${shown(leaf.fontWeight)}; color ${shown(leaf.color)}; align ${shown(leaf.align)}`,
150
+ `- Style map: \`${JSON.stringify(leaf.style ?? {})}\``,
151
+ `- Visual fields: surface ${shown(leaf.surface)}; opacity ${shown(leaf.opacity)}; rotation ${shown(leaf.rotationDeg, leaf.rotationDeg === undefined ? '' : 'deg')}`,
152
+ asset?.path
153
+ ? `- Asset: ${asset.kind}; absolute path \`${asset.path}\`; suggested destination \`${asset.destination}\`; resolvable: yes`
154
+ : asset
155
+ ? `- Asset: ${asset.kind}; absolute path unresolved; suggested destination unresolved; resolvable: no`
156
+ : '- Asset: none referenced by the target node',
157
+ ].join('\n');
158
+ specs.push({ designIndex, insertion, markdown, ...(asset ? { asset } : {}) });
159
+ }
160
+ return specs;
161
+ };
162
+ //# sourceMappingURL=improve-added-specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-added-specs.js","sourceRoot":"","sources":["../src/improve-added-specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * F9 found that detailed, style-anchored direction reliably beats a vague
3
+ * "make it better" instruction. Naming an empty or thin region as the defect
4
+ * did the opposite: the image model filled it with invented product content.
5
+ */
6
+ export declare const IMPROVE_NO_INVENTION_CLAUSE = "Keep all real content, data, and controls; invent nothing.";
7
+ /** The real steering limit after reserving room for the mandatory harness. */
8
+ export declare const IMPROVE_DIRECTION_MAX_CHARACTERS: number;
9
+ export declare const buildImproveConcept: (direction?: string) => string;
10
+ //# sourceMappingURL=improve-concept.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-concept.d.ts","sourceRoot":"","sources":["../src/improve-concept.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,+DAA+D,CAAC;AAexG,8EAA8E;AAC9E,eAAO,MAAM,gCAAgC,QAAuD,CAAC;AAIrG,eAAO,MAAM,mBAAmB,GAAI,YAAY,MAAM,KAAG,MA2BxD,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { CliRefusal } from './cli-refusal.js';
2
+ import { MAX_CONCEPT_CHARACTERS, readConceptValue } from './concept-input.js';
3
+ /**
4
+ * F9 found that detailed, style-anchored direction reliably beats a vague
5
+ * "make it better" instruction. Naming an empty or thin region as the defect
6
+ * did the opposite: the image model filled it with invented product content.
7
+ */
8
+ export const IMPROVE_NO_INVENTION_CLAUSE = 'Keep all real content, data, and controls; invent nothing.';
9
+ const IMPROVE_BASE_DIRECTION = [
10
+ 'Improve this existing product interface into a polished, production-ready version while preserving its product identity and working structure.',
11
+ 'Strengthen visual hierarchy, section rhythm, spacing, alignment, typography, control affordances, surface treatment, and restrained color.',
12
+ 'Use a coherent, style-anchored system with precise rhythm, legible type, purposeful states, subtle borders, and depth only where it clarifies hierarchy.',
13
+ ].join(' ');
14
+ const DIRECTION_PREFIX = 'Direction: ';
15
+ const RESERVED_CONCEPT_CHARACTERS = [
16
+ IMPROVE_BASE_DIRECTION,
17
+ DIRECTION_PREFIX,
18
+ IMPROVE_NO_INVENTION_CLAUSE,
19
+ ].join('\n\n').length;
20
+ /** The real steering limit after reserving room for the mandatory harness. */
21
+ export const IMPROVE_DIRECTION_MAX_CHARACTERS = MAX_CONCEPT_CHARACTERS - RESERVED_CONCEPT_CHARACTERS;
22
+ const FABRICATION_TRIGGER = /\b(?:empty|emptiness|underfilled|under-filled|thin[ -]content|lack of content|missing content|dead space|blank (?:area|region|half|section))\b/iu;
23
+ export const buildImproveConcept = (direction) => {
24
+ const steering = direction?.replace(/\s+/gu, ' ').trim() ?? '';
25
+ if ([...steering].length > IMPROVE_DIRECTION_MAX_CHARACTERS) {
26
+ throw new CliRefusal(`--direction accepts at most ${IMPROVE_DIRECTION_MAX_CHARACTERS} characters because improve`
27
+ + ` reserves the rest of the ${MAX_CONCEPT_CHARACTERS}-character concept for its style and`
28
+ + ' no-invention guardrails.', 'improve_direction_too_long');
29
+ }
30
+ if (FABRICATION_TRIGGER.test(steering)) {
31
+ throw new CliRefusal('--direction must describe the intended style and hierarchy, not emptiness or thin content;'
32
+ + ' naming a content void invites fabricated UI.', 'improve_direction_emptiness');
33
+ }
34
+ const concept = [
35
+ IMPROVE_BASE_DIRECTION,
36
+ ...(steering ? [`${DIRECTION_PREFIX}${steering}`] : []),
37
+ IMPROVE_NO_INVENTION_CLAUSE,
38
+ ].join('\n\n');
39
+ return readConceptValue({
40
+ value: concept,
41
+ flag: '--direction',
42
+ trimHint: 'Keep the intended hierarchy, rhythm, typography, surfaces, color, controls, and mood.',
43
+ });
44
+ };
45
+ //# sourceMappingURL=improve-concept.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-concept.js","sourceRoot":"","sources":["../src/improve-concept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,4DAA4D,CAAC;AAExG,MAAM,sBAAsB,GAAG;IAC7B,gJAAgJ;IAChJ,4IAA4I;IAC5I,0JAA0J;CAC3J,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,gBAAgB,GAAG,aAAa,CAAC;AACvC,MAAM,2BAA2B,GAAG;IAClC,sBAAsB;IACtB,gBAAgB;IAChB,2BAA2B;CAC5B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;AAEtB,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gCAAgC,GAAG,sBAAsB,GAAG,2BAA2B,CAAC;AAErG,MAAM,mBAAmB,GAAG,kJAAkJ,CAAC;AAE/K,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAkB,EAAU,EAAE;IAChE,MAAM,QAAQ,GAAG,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/D,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,GAAG,gCAAgC,EAAE,CAAC;QAC5D,MAAM,IAAI,UAAU,CAClB,+BAA+B,gCAAgC,6BAA6B;cAC1F,6BAA6B,sBAAsB,sCAAsC;cACzF,2BAA2B,EAC7B,4BAA4B,CAC7B,CAAC;IACJ,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,UAAU,CAClB,4FAA4F;cAC1F,+CAA+C,EACjD,6BAA6B,CAC9B,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG;QACd,sBAAsB;QACtB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,2BAA2B;KAC5B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACf,OAAO,gBAAgB,CAAC;QACtB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,uFAAuF;KAClG,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ImproveOptions } from './improve-options.js';
2
+ import { type ImproveCommandDependencies } from './improve-stage-shared.js';
3
+ import { type ImproveRecord } from './improve-workspace.js';
4
+ export declare const runImproveConvertStage: (args: {
5
+ record: ImproveRecord;
6
+ options: ImproveOptions;
7
+ dependencies: ImproveCommandDependencies;
8
+ price: number;
9
+ }) => Promise<ImproveRecord>;
10
+ export declare const runImprovePlanStage: (args: {
11
+ record: ImproveRecord;
12
+ options: ImproveOptions;
13
+ dependencies: ImproveCommandDependencies;
14
+ price: number;
15
+ }) => Promise<ImproveRecord>;
16
+ //# sourceMappingURL=improve-delivery-stages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-delivery-stages.d.ts","sourceRoot":"","sources":["../src/improve-delivery-stages.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA+BhF,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,CA0ExB,CAAC;AA6FF,eAAO,MAAM,mBAAmB,GAAU,MAAM;IAC9C,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,YAAY,EAAE,0BAA0B,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CAAC,aAAa,CA6DxB,CAAC"}
@@ -0,0 +1,259 @@
1
+ import { copyFile, cp, mkdir, readFile, stat, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import sharp from 'sharp';
4
+ import { runConversionCommand } from './cli-convert-command.js';
5
+ import { CliRefusal } from './cli-refusal.js';
6
+ import { prepareOutputDirectory } from './cli-output-paths.js';
7
+ import { writeImproveDomDiff } from './improve-dom-diff.js';
8
+ import { evaluateImproveGate } from './improve-dom-gate.js';
9
+ import { normalizeLayerDoc } from './improve-dom-scale.js';
10
+ import { canvasOfDoc, diffLayerDocs, flattenLayerDoc } from './improve-layerdoc-diff.js';
11
+ import { writeImproveAnnotatedPlan } from './improve-plan-annotator.js';
12
+ import { renderLayerChanges } from './improve-plan-render.js';
13
+ import { improveSha256, noteImproveStage, } from './improve-stage-shared.js';
14
+ import { writeImproveRecord } from './improve-workspace.js';
15
+ const runConvert = async (args) => {
16
+ const artifacts = [];
17
+ const purchaseIds = [];
18
+ const collector = {
19
+ note: (facts) => {
20
+ artifacts.push(...(facts.artifacts ?? []));
21
+ purchaseIds.push(...(facts.purchased ?? []));
22
+ args.journal?.note(facts);
23
+ },
24
+ heartbeat: (progress) => { args.journal?.heartbeat(progress); },
25
+ };
26
+ await args.runner(['convert', args.input], {
27
+ output: args.output,
28
+ model: args.model,
29
+ 'out-dir': args.outDir,
30
+ 'idempotency-key': args.key,
31
+ quiet: true,
32
+ }, collector, { writeResult: () => undefined });
33
+ return { artifacts: [...new Set(artifacts)], purchaseIds: [...new Set(purchaseIds)] };
34
+ };
35
+ export const runImproveConvertStage = async (args) => {
36
+ if (args.record.convert)
37
+ return noteImproveStage({
38
+ record: args.record, stage: 'convert', priceCeilingUsd: args.price, replayed: true, write: true,
39
+ });
40
+ if (!args.record.pick && !args.record.target)
41
+ throw new Error('Cannot convert before pick');
42
+ await prepareOutputDirectory(args.options.paths.targetDir);
43
+ if (args.record.target?.kind === 'layerdoc') {
44
+ const bytes = await readFile(args.record.target.value);
45
+ canvasOfDoc(JSON.parse(bytes.toString('utf8')));
46
+ await copyFile(args.record.target.value, args.options.paths.targetLayerDoc);
47
+ const assetSource = `${args.record.target.value}.assets`;
48
+ if ((await stat(assetSource).catch(() => undefined))?.isDirectory()) {
49
+ await cp(assetSource, `${args.options.paths.targetLayerDoc}.assets`, { recursive: true });
50
+ }
51
+ let record = {
52
+ ...args.record,
53
+ target: { ...args.record.target, sha256: improveSha256(bytes) },
54
+ convert: {
55
+ layerDoc: args.options.paths.targetLayerDoc,
56
+ html: '',
57
+ artifacts: [args.options.paths.targetLayerDoc],
58
+ purchaseIds: [],
59
+ },
60
+ };
61
+ record = await noteImproveStage({
62
+ record, stage: 'convert', priceCeilingUsd: args.price, replayed: false, write: false,
63
+ });
64
+ await writeImproveRecord(args.options.paths.record, record);
65
+ return record;
66
+ }
67
+ let input = args.record.pick?.imagePath;
68
+ let inputSha = args.record.pick?.sha256;
69
+ let recordBeforeConvert = args.record;
70
+ if (args.record.target?.kind === 'image') {
71
+ const bytes = await readFile(args.record.target.value);
72
+ const image = sharp(bytes, { animated: false, failOn: 'warning' });
73
+ const metadata = await image.metadata();
74
+ if (!metadata.width || !metadata.height || !['png', 'jpeg', 'webp'].includes(metadata.format ?? '')) {
75
+ throw new CliRefusal('--target image is not a usable PNG, JPEG, or WebP', 'improve_target_invalid');
76
+ }
77
+ await image.png().toFile(args.options.paths.winnerImage);
78
+ input = args.options.paths.winnerImage;
79
+ inputSha = improveSha256(bytes);
80
+ recordBeforeConvert = { ...args.record, target: { ...args.record.target, sha256: inputSha } };
81
+ }
82
+ if (!input || !inputSha)
83
+ throw new Error('Improve has no design image to convert');
84
+ const converted = await runConvert({
85
+ input,
86
+ outDir: args.options.paths.targetDir,
87
+ output: 'html',
88
+ model: args.record.conversionModel,
89
+ key: `improve-target:v1:${inputSha}:${args.record.conversionModel}`,
90
+ runner: args.dependencies.runConvert ?? runConversionCommand,
91
+ journal: args.dependencies.journal,
92
+ });
93
+ for (const expected of [args.options.paths.targetLayerDoc, args.options.paths.targetHtml]) {
94
+ if (!(await stat(expected).catch(() => undefined))?.isFile()) {
95
+ throw new Error(`Improve conversion completed without ${expected}`);
96
+ }
97
+ }
98
+ let record = {
99
+ ...recordBeforeConvert,
100
+ convert: {
101
+ layerDoc: args.options.paths.targetLayerDoc,
102
+ html: args.options.paths.targetHtml,
103
+ artifacts: converted.artifacts,
104
+ purchaseIds: converted.purchaseIds,
105
+ },
106
+ };
107
+ record = await noteImproveStage({
108
+ record, stage: 'convert', priceCeilingUsd: args.price, replayed: false, write: false,
109
+ });
110
+ await writeImproveRecord(args.options.paths.record, record);
111
+ return record;
112
+ };
113
+ const syntheticLayerDiff = (beforeDoc, targetDoc) => {
114
+ const beforeCanvas = canvasOfDoc(beforeDoc);
115
+ const targetCanvas = canvasOfDoc(targetDoc);
116
+ const normalizedBefore = normalizeLayerDoc(beforeDoc);
117
+ const normalizedTarget = normalizeLayerDoc(targetDoc, beforeCanvas.width / targetCanvas.width);
118
+ const beforeLeaves = flattenLayerDoc(normalizedBefore);
119
+ const targetLeaves = flattenLayerDoc(normalizedTarget);
120
+ const result = diffLayerDocs(normalizedBefore, normalizedTarget);
121
+ const coverage = result.meta.plausibleMatchedCount / Math.max(beforeLeaves.length, 1);
122
+ return {
123
+ result,
124
+ beforeLeaves,
125
+ targetLeaves,
126
+ beforeCanvas,
127
+ targetCanvas,
128
+ lengthScale: beforeCanvas.width / targetCanvas.width,
129
+ domCoverage: coverage,
130
+ designCoverage: result.meta.plausibleMatchedCount / Math.max(targetLeaves.length, 1),
131
+ gate: evaluateImproveGate(1, 0),
132
+ markdown: '',
133
+ };
134
+ };
135
+ const writeImagePlan = async (args) => {
136
+ const targetDoc = JSON.parse(await readFile(args.options.paths.targetLayerDoc, 'utf8'));
137
+ let record = args.record;
138
+ let computed;
139
+ let mode;
140
+ const artifacts = [];
141
+ if (args.record.planSourceConvert) {
142
+ if (!record.sourceConvert) {
143
+ await prepareOutputDirectory(args.options.paths.sourceConversionDir);
144
+ const source = await runConvert({
145
+ input: args.options.paths.sourceImage,
146
+ outDir: args.options.paths.sourceConversionDir,
147
+ output: 'layerdoc',
148
+ model: record.conversionModel,
149
+ key: `improve-source:v1:${record.capture?.sha256}:${record.conversionModel}`,
150
+ runner: args.dependencies.runConvert ?? runConversionCommand,
151
+ journal: args.dependencies.journal,
152
+ });
153
+ const sourceLayerDoc = path.join(args.options.paths.sourceConversionDir, 'source.layerdoc.json');
154
+ record = { ...record, sourceConvert: { layerDoc: sourceLayerDoc, ...source } };
155
+ await writeImproveRecord(args.options.paths.record, record);
156
+ }
157
+ const beforeDoc = JSON.parse(await readFile(record.sourceConvert.layerDoc, 'utf8'));
158
+ computed = syntheticLayerDiff(beforeDoc, targetDoc);
159
+ mode = 'layerdoc-anchored';
160
+ const diffPath = path.join(args.options.paths.planDir, 'diff.json');
161
+ const changesPath = path.join(args.options.paths.planDir, 'changes.md');
162
+ await Promise.all([
163
+ writeFile(diffPath, `${JSON.stringify({
164
+ generatedAt: new Date().toISOString(), before: record.sourceConvert.layerDoc,
165
+ after: args.options.paths.targetLayerDoc, mode, ...computed.result,
166
+ }, null, 2)}\n`, 'utf8'),
167
+ writeFile(changesPath, renderLayerChanges({
168
+ result: computed.result,
169
+ beforePath: record.sourceConvert.layerDoc,
170
+ targetPath: args.options.paths.targetLayerDoc,
171
+ beforeDoc,
172
+ targetDoc,
173
+ }), 'utf8'),
174
+ ]);
175
+ artifacts.push(diffPath, changesPath);
176
+ }
177
+ else {
178
+ const empty = { version: 2, canvas: canvasOfDoc(targetDoc), layers: [] };
179
+ computed = syntheticLayerDiff(empty, targetDoc);
180
+ mode = 'unanchored';
181
+ const diffPath = path.join(args.options.paths.planDir, 'diff.json');
182
+ const changesPath = path.join(args.options.paths.planDir, 'changes.md');
183
+ await Promise.all([
184
+ writeFile(diffPath, `${JSON.stringify({
185
+ generatedAt: new Date().toISOString(), mode, after: args.options.paths.targetLayerDoc,
186
+ note: 'Target-only plan; no source conversion was purchased.', ...computed.result,
187
+ }, null, 2)}\n`, 'utf8'),
188
+ writeFile(changesPath, '# Target-only improve plan\n\nNo source conversion was purchased. Every target element is an unanchored implementation specification.\n', 'utf8'),
189
+ ]);
190
+ artifacts.push(diffPath, changesPath);
191
+ }
192
+ return { computed, mode, artifacts, record };
193
+ };
194
+ export const runImprovePlanStage = async (args) => {
195
+ if (args.record.plan)
196
+ return noteImproveStage({
197
+ record: args.record, stage: 'plan', priceCeilingUsd: args.price, replayed: true, write: true,
198
+ });
199
+ if (!args.record.convert)
200
+ throw new Error('Cannot plan before convert');
201
+ await mkdir(args.options.paths.planDir, { recursive: true });
202
+ const targetDoc = JSON.parse(await readFile(args.options.paths.targetLayerDoc, 'utf8'));
203
+ let record = args.record;
204
+ let mode;
205
+ let gate;
206
+ let artifacts;
207
+ if (args.options.input.kind === 'url') {
208
+ const diff = await writeImproveDomDiff({
209
+ beforePath: args.options.paths.currentDomDoc,
210
+ targetPath: args.options.paths.targetLayerDoc,
211
+ outDir: args.options.paths.planDir,
212
+ });
213
+ mode = 'dom-anchored';
214
+ gate = diff.gate.passed ? 'passed' : 'blocked';
215
+ artifacts = [...diff.artifacts];
216
+ if (diff.gate.passed) {
217
+ const annotated = await writeImproveAnnotatedPlan({
218
+ computed: diff,
219
+ targetDoc,
220
+ targetPath: args.options.paths.targetLayerDoc,
221
+ outDir: args.options.paths.planDir,
222
+ ...(args.record.repo ? { repo: args.record.repo } : {}),
223
+ mode,
224
+ });
225
+ artifacts.push(...annotated.artifacts);
226
+ }
227
+ }
228
+ else {
229
+ const imagePlan = await writeImagePlan({ record, options: args.options, dependencies: args.dependencies });
230
+ record = imagePlan.record;
231
+ mode = imagePlan.mode;
232
+ gate = 'not-applicable';
233
+ artifacts = [...imagePlan.artifacts];
234
+ const annotated = await writeImproveAnnotatedPlan({
235
+ computed: imagePlan.computed,
236
+ targetDoc,
237
+ targetPath: args.options.paths.targetLayerDoc,
238
+ outDir: args.options.paths.planDir,
239
+ mode,
240
+ });
241
+ artifacts.push(...annotated.artifacts);
242
+ }
243
+ record = {
244
+ ...record,
245
+ plan: {
246
+ mode,
247
+ gate,
248
+ artifacts: [...new Set(artifacts)],
249
+ ...(record.sourceConvert ? { sourceLayerDoc: record.sourceConvert.layerDoc } : {}),
250
+ purchaseIds: record.sourceConvert?.purchaseIds ?? [],
251
+ },
252
+ };
253
+ record = await noteImproveStage({
254
+ record, stage: 'plan', priceCeilingUsd: args.price, replayed: false, write: false,
255
+ });
256
+ await writeImproveRecord(args.options.paths.record, record);
257
+ return record;
258
+ };
259
+ //# sourceMappingURL=improve-delivery-stages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-delivery-stages.js","sourceRoot":"","sources":["../src/improve-delivery-stages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ImpliedPaddingDelta, LayerBox, LayerDiffMatch, LayerLeaf } from './improve-layerdoc-types.js';
2
+ export declare const selectorLabel: (leaf: LayerLeaf | undefined) => string;
3
+ export declare const containment: (inner: LayerBox | undefined, outer: LayerBox | undefined) => number;
4
+ export declare const confidentMatches: (matched: readonly LayerDiffMatch[], before: readonly LayerLeaf[], after: readonly LayerLeaf[], minimumIou?: number) => Set<number>;
5
+ export declare const insertionAnchor: (box: LayerBox, before: readonly LayerLeaf[]) => {
6
+ container: number;
7
+ after?: number;
8
+ before?: number;
9
+ };
10
+ export declare const impliedPaddingDeltas: (matched: readonly LayerDiffMatch[], before: readonly LayerLeaf[], after: readonly LayerLeaf[], canvas: {
11
+ width: number;
12
+ height: number;
13
+ }, confident: ReadonlySet<number>) => Map<number, ImpliedPaddingDelta[]>;
14
+ export declare const domPx: (box: LayerBox | undefined, canvas: {
15
+ width: number;
16
+ height: number;
17
+ }) => LayerBox | undefined;
18
+ //# sourceMappingURL=improve-dom-anchor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-dom-anchor.d.ts","sourceRoot":"","sources":["../src/improve-dom-anchor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,QAAQ,EACR,cAAc,EACd,SAAS,EACV,MAAM,6BAA6B,CAAC;AAErC,eAAO,MAAM,aAAa,GAAI,MAAM,SAAS,GAAG,SAAS,KAAG,MAQ3D,CAAC;AAIF,eAAO,MAAM,WAAW,GAAI,OAAO,QAAQ,GAAG,SAAS,EAAE,OAAO,QAAQ,GAAG,SAAS,KAAG,MAKtF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,SAAS,SAAS,cAAc,EAAE,EAClC,QAAQ,SAAS,SAAS,EAAE,EAC5B,OAAO,SAAS,SAAS,EAAE,EAC3B,mBAAgB,KACf,GAAG,CAAC,MAAM,CAcZ,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,KAAK,QAAQ,EACb,QAAQ,SAAS,SAAS,EAAE,KAC3B;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CA6BtD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,SAAS,cAAc,EAAE,EAClC,QAAQ,SAAS,SAAS,EAAE,EAC5B,OAAO,SAAS,SAAS,EAAE,EAC3B,QAAQ;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACzC,WAAW,WAAW,CAAC,MAAM,CAAC,KAC7B,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CA0CnC,CAAC;AAEF,eAAO,MAAM,KAAK;;;0BAAgB,CAAC"}