@12ui/design 0.2.48 → 0.2.50

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 (97) hide show
  1. package/SKILL.md +1 -1
  2. package/dist/cli-draft-command.d.ts +11 -5
  3. package/dist/cli-draft-command.d.ts.map +1 -1
  4. package/dist/cli-draft-command.js +37 -35
  5. package/dist/cli-draft-command.js.map +1 -1
  6. package/dist/cli-help/design.d.ts +10 -0
  7. package/dist/cli-help/design.d.ts.map +1 -1
  8. package/dist/cli-help/design.js +29 -0
  9. package/dist/cli-help/design.js.map +1 -1
  10. package/dist/cli-help/index.d.ts +11 -0
  11. package/dist/cli-help/index.d.ts.map +1 -1
  12. package/dist/cli-help/index.js +18 -2
  13. package/dist/cli-help/index.js.map +1 -1
  14. package/dist/cli-next-command.d.ts.map +1 -1
  15. package/dist/cli-next-command.js +26 -14
  16. package/dist/cli-next-command.js.map +1 -1
  17. package/dist/cli-progress.d.ts +2 -0
  18. package/dist/cli-progress.d.ts.map +1 -1
  19. package/dist/cli-progress.js +2 -0
  20. package/dist/cli-progress.js.map +1 -1
  21. package/dist/cli-redesign-command.d.ts +42 -0
  22. package/dist/cli-redesign-command.d.ts.map +1 -0
  23. package/dist/cli-redesign-command.js +469 -0
  24. package/dist/cli-redesign-command.js.map +1 -0
  25. package/dist/cli-run.d.ts.map +1 -1
  26. package/dist/cli-run.js +8 -0
  27. package/dist/cli-run.js.map +1 -1
  28. package/dist/cli-usage.d.ts.map +1 -1
  29. package/dist/cli-usage.js +8 -1
  30. package/dist/cli-usage.js.map +1 -1
  31. package/dist/draft-dispatch-attempt.d.ts +0 -7
  32. package/dist/draft-dispatch-attempt.d.ts.map +1 -1
  33. package/dist/draft-dispatch-attempt.js +1 -25
  34. package/dist/draft-dispatch-attempt.js.map +1 -1
  35. package/dist/draft-identity.d.ts +2 -0
  36. package/dist/draft-identity.d.ts.map +1 -1
  37. package/dist/draft-identity.js +1 -0
  38. package/dist/draft-identity.js.map +1 -1
  39. package/dist/draft-run.d.ts +2 -0
  40. package/dist/draft-run.d.ts.map +1 -1
  41. package/dist/draft-run.js +4 -3
  42. package/dist/draft-run.js.map +1 -1
  43. package/dist/redesign-capture.d.ts +49 -0
  44. package/dist/redesign-capture.d.ts.map +1 -0
  45. package/dist/redesign-capture.js +135 -0
  46. package/dist/redesign-capture.js.map +1 -0
  47. package/dist/redesign-plan-client.d.ts +32 -0
  48. package/dist/redesign-plan-client.d.ts.map +1 -0
  49. package/dist/redesign-plan-client.js +80 -0
  50. package/dist/redesign-plan-client.js.map +1 -0
  51. package/dist/redesign-plan-identity.d.ts +8 -0
  52. package/dist/redesign-plan-identity.d.ts.map +1 -0
  53. package/dist/redesign-plan-identity.js +15 -0
  54. package/dist/redesign-plan-identity.js.map +1 -0
  55. package/dist/redesign-plan.d.ts +30 -0
  56. package/dist/redesign-plan.d.ts.map +1 -0
  57. package/dist/redesign-plan.js +99 -0
  58. package/dist/redesign-plan.js.map +1 -0
  59. package/dist/redesign-workspace.d.ts +116 -0
  60. package/dist/redesign-workspace.d.ts.map +1 -0
  61. package/dist/redesign-workspace.js +157 -0
  62. package/dist/redesign-workspace.js.map +1 -0
  63. package/dist/run-journal-commands.d.ts.map +1 -1
  64. package/dist/run-journal-commands.js +10 -0
  65. package/dist/run-journal-commands.js.map +1 -1
  66. package/open-design.json +2 -2
  67. package/package.json +2 -2
  68. package/prototype-kit/build.mjs +9 -3
  69. package/prototype-kit/lib/action-target.mjs +26 -0
  70. package/prototype-kit/lib/local-document.mjs +16 -0
  71. package/prototype-kit/lib/runtime-check.mjs +83 -19
  72. package/prototype-kit/lib/shell-runtime-equivalence.mjs +41 -0
  73. package/prototype-kit/polish/harm.mjs +27 -5
  74. package/prototype-kit/polish/measure.mjs +101 -5
  75. package/prototype-kit/polish/overrides.mjs +32 -3
  76. package/prototype-kit/polish/polish.mjs +23 -11
  77. package/prototype-kit/polish/rules/align.mjs +73 -3
  78. package/prototype-kit/polish/rules/left-rail.mjs +2 -3
  79. package/prototype-kit/polish/rules/section-breathing.mjs +0 -1
  80. package/prototype-kit/polish/tests/fixtures/align/expect.json +1 -1
  81. package/prototype-kit/polish/tests/fixtures/align/fire.html +4 -1
  82. package/prototype-kit/polish/tests/fixtures/align/silent.html +8 -0
  83. package/prototype-kit/polish/tests/fixtures/align/zoom-constrained.html +17 -0
  84. package/prototype-kit/polish/tests/fixtures/harm/left-rail-contained.html +16 -0
  85. package/prototype-kit/polish/tests/fixtures/harm/left-rail-overflow.html +16 -0
  86. package/prototype-kit/polish/tests/fixtures/harm/nested-actions.html +6 -0
  87. package/prototype-kit/polish/tests/fixtures/harm/unidentified-parent.html +3 -0
  88. package/prototype-kit/polish/tests/fixtures/shell-seam/fire.html +1 -1
  89. package/prototype-kit/polish/tests/harm-check.mjs +131 -2
  90. package/prototype-kit/polish/tests/rules-check.mjs +7 -2
  91. package/prototype-kit/runtime/proto.js +4 -1
  92. package/prototype-kit/tests/adversarial-runtime.mjs +3 -0
  93. package/prototype-kit/tests/align-rule-check.mjs +105 -0
  94. package/prototype-kit/tests/fixtures/interaction-runtime/review-bottom-action.html +8 -0
  95. package/prototype-kit/tests/offline-check.mjs +17 -1
  96. package/prototype-kit/tests/rules-check.mjs +67 -1
  97. package/prototype-kit/tests/shell-stitching-runtime.mjs +15 -8
@@ -0,0 +1,99 @@
1
+ import { BRANCH_PAGE_CONCURRENCY_DEFAULT, OPERATION_DURATION_HINTS, branchRunEstimateSeconds, } from './cli-progress.js';
2
+ /**
3
+ * What `--dry-run` reports for every stage: nothing here reaches the network.
4
+ * `pageCount` is the caller's `--pages` request (or the default), never a
5
+ * discovered count — discovery itself is a network call, and a plan must
6
+ * price a run before it makes one. Numeric ceilings intentionally use the
7
+ * same admission/catalog boundaries as the hosted services: corpus and
8
+ * planning reservations, a conservative hosted-image bound, the published
9
+ * Standard conversion price, and the prototype-label reservation. Actual
10
+ * provider spend is read separately from `12ui spend`; this is the
11
+ * pre-dispatch cap guard.
12
+ */
13
+ const CORPUS_SEARCH_CEILING_USD = 0.0055;
14
+ /** One metered hosted direction-planning call before corpus retrieval. */
15
+ const REDESIGN_DIRECTION_PLAN_CEILING_USD = 0.02;
16
+ /** The hosted create claim still derives one visible direction per candidate. */
17
+ const DRAFT_DIRECTIONS_CEILING_USD = 0.02;
18
+ const DRAFT_CANDIDATE_PRICE_USD = 0.06;
19
+ /** Three-reference gpt-image-2 medium admission bound, rounded upward. */
20
+ const BRANCH_IMAGE_CEILING_USD = 0.3;
21
+ const BRANCH_PLAN_CEILING_USD = 0.06;
22
+ const CONVERSION_PRICE_USD = {
23
+ fast: 0.05,
24
+ standard: 0.45,
25
+ pro: 0.9,
26
+ };
27
+ const PROTOTYPE_LABEL_CEILING_USD = 0.02;
28
+ const usd = (value) => Number(value.toFixed(6));
29
+ export const buildRedesignPlan = (args) => {
30
+ const branchEstimate = branchRunEstimateSeconds({
31
+ pages: 1,
32
+ concurrency: BRANCH_PAGE_CONCURRENCY_DEFAULT,
33
+ convert: true,
34
+ });
35
+ const stages = [
36
+ {
37
+ stage: 'capture',
38
+ paid: false,
39
+ wouldBuy: `nothing — up to ${args.pageCount} full-height screenshot(s) from a local browser`,
40
+ typicalSeconds: args.pageCount * 8,
41
+ plannedCostUsd: 0,
42
+ },
43
+ {
44
+ stage: 'plan',
45
+ paid: true,
46
+ wouldBuy: '1 hosted direction plan, including explicit retention and a corpus query',
47
+ typicalSeconds: OPERATION_DURATION_HINTS.redesignDirectionPlan,
48
+ plannedCostUsd: REDESIGN_DIRECTION_PLAN_CEILING_USD,
49
+ },
50
+ {
51
+ stage: 'draft',
52
+ paid: true,
53
+ wouldBuy: `${args.candidateCount} hosted draft candidate(s), generated from 1 captured reference image`,
54
+ typicalSeconds: OPERATION_DURATION_HINTS.hostedDraftCandidate,
55
+ plannedCostUsd: usd(CORPUS_SEARCH_CEILING_USD
56
+ + DRAFT_DIRECTIONS_CEILING_USD
57
+ + args.candidateCount * DRAFT_CANDIDATE_PRICE_USD),
58
+ },
59
+ {
60
+ stage: 'pick',
61
+ paid: false,
62
+ wouldBuy: 'nothing — selects one already-generated candidate by --slot',
63
+ typicalSeconds: 1,
64
+ plannedCostUsd: 0,
65
+ },
66
+ {
67
+ stage: 'branch',
68
+ paid: true,
69
+ wouldBuy: `${args.pageCount} branch execute run(s) (scope page, --convert html --prototype),`
70
+ + ` capped at ${args.maxScreens} generated continuation screen(s) per captured page`,
71
+ typicalSeconds: branchEstimate.ceiling * args.pageCount,
72
+ plannedCostUsd: usd(args.pageCount * (BRANCH_PLAN_CEILING_USD
73
+ + args.maxScreens * BRANCH_IMAGE_CEILING_USD
74
+ + (args.maxScreens + 1) * CONVERSION_PRICE_USD[args.conversionModel]
75
+ + (args.maxScreens + 1) * PROTOTYPE_LABEL_CEILING_USD)),
76
+ },
77
+ {
78
+ stage: 'polish',
79
+ paid: false,
80
+ wouldBuy: `nothing — applies the retained deterministic polish rules to ${args.pageCount}`
81
+ + ' already-built prototype(s)',
82
+ typicalSeconds: args.pageCount * 10,
83
+ plannedCostUsd: 0,
84
+ },
85
+ ];
86
+ return {
87
+ url: args.url,
88
+ direction: args.direction,
89
+ pageCount: args.pageCount,
90
+ candidateCount: args.candidateCount,
91
+ maxScreens: args.maxScreens,
92
+ conversionModel: args.conversionModel,
93
+ stages,
94
+ typicalSecondsTotal: stages.reduce((total, stage) => total + stage.typicalSeconds, 0),
95
+ plannedCostUsdTotal: usd(stages.reduce((total, stage) => total + stage.plannedCostUsd, 0)),
96
+ pricingBasis: 'Pre-dispatch ceilings; live actuals come from 12ui spend.',
97
+ };
98
+ };
99
+ //# sourceMappingURL=redesign-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redesign-plan.js","sourceRoot":"","sources":["../src/redesign-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import type { CreateRetainPolicy } from './branch-client.js';
2
+ import type { ConversionModel } from './conversion-models.js';
3
+ /**
4
+ * The run directory `12ui redesign` creates and every stage reads and writes.
5
+ *
6
+ * Mirrors `draft-workspace.ts`: minted under the system temp root by
7
+ * `mkdtemp`, printed as the command's first line, never nested inside the
8
+ * caller's working directory. `redesign.json` is the one record every stage
9
+ * reads before it decides whether it has work left to do, so `--from` can
10
+ * resume without re-deriving what an earlier stage already settled.
11
+ */
12
+ export declare const REDESIGN_RECORD_FILENAME = "redesign.json";
13
+ export declare const REDESIGN_CAPTURE_DIRECTORY = "capture";
14
+ export declare const REDESIGN_DRAFT_DIRECTORY = "draft";
15
+ export declare const REDESIGN_BRANCH_DIRECTORY = "branch";
16
+ export declare const REDESIGN_STAGES: readonly ["capture", "plan", "draft", "pick", "branch", "polish"];
17
+ export type RedesignStage = typeof REDESIGN_STAGES[number];
18
+ export declare const isRedesignStage: (value: string) => value is RedesignStage;
19
+ /** `https://example.com/pricing` -> `example-com`. */
20
+ export declare const redesignSlug: (url: string) => string;
21
+ export type RedesignPaths = {
22
+ runDir: string;
23
+ captureDir: string;
24
+ draftDir: string;
25
+ branchDir: string;
26
+ record: string;
27
+ };
28
+ export declare const redesignPaths: (runDir: string) => RedesignPaths;
29
+ export declare const createRedesignWorkspace: (args: {
30
+ url: string;
31
+ /** Overridden only by tests; production always uses the system temp root. */
32
+ root?: string;
33
+ }) => Promise<RedesignPaths>;
34
+ export type RedesignCapturedPageRecord = {
35
+ id: string;
36
+ url: string;
37
+ path: string;
38
+ sha256: string;
39
+ bytes: number;
40
+ width: number;
41
+ height: number;
42
+ };
43
+ export type RedesignPickRecord = {
44
+ slot: string;
45
+ imagePath: string;
46
+ sha256: string;
47
+ };
48
+ /**
49
+ * A metered hosted direction plan. This is intentionally distinct from the
50
+ * local `RedesignPlan` dry-run cost estimate in `redesign-plan.ts`.
51
+ */
52
+ export type RedesignDirectionPlanRecord = {
53
+ concept: string;
54
+ retain: CreateRetainPolicy;
55
+ corpusQuery: string;
56
+ /** Provider-issued paid-effect identity; copied without reconstruction. */
57
+ effectIdentity: string;
58
+ replayed: boolean;
59
+ degradation?: {
60
+ reasons: string[];
61
+ };
62
+ };
63
+ export type RedesignBranchPageRecord = {
64
+ pageId: string;
65
+ branchDir: string;
66
+ status: string;
67
+ completionPath: string;
68
+ };
69
+ export type RedesignPolishPageRecord = {
70
+ pageId: string;
71
+ branchDir: string;
72
+ enabled: boolean;
73
+ };
74
+ /**
75
+ * What each stage settled, so `--from` reloads prior work instead of
76
+ * re-deriving or re-buying it. Every field is optional because the record
77
+ * grows one stage at a time; a stage that has not run yet is simply absent.
78
+ */
79
+ export type RedesignRecord = {
80
+ version: 1;
81
+ createdAt: string;
82
+ runDir: string;
83
+ url: string;
84
+ direction: string;
85
+ requestedPages: number;
86
+ /** Maximum generated continuation screens for each captured page. */
87
+ requestedMaxScreens?: number;
88
+ requestedConversionModel?: ConversionModel;
89
+ capture?: {
90
+ pages: RedesignCapturedPageRecord[];
91
+ };
92
+ plan?: RedesignDirectionPlanRecord;
93
+ draft?: {
94
+ runDir: string;
95
+ runId: string;
96
+ };
97
+ pick?: RedesignPickRecord;
98
+ branch?: {
99
+ pages: RedesignBranchPageRecord[];
100
+ };
101
+ polish?: {
102
+ pages: RedesignPolishPageRecord[];
103
+ };
104
+ };
105
+ export declare const readRedesignRecord: (file: string) => Promise<RedesignRecord | undefined>;
106
+ export declare const writeRedesignRecord: (file: string, record: RedesignRecord) => Promise<void>;
107
+ /** Read the record, or start a fresh one when this is the first stage to run. */
108
+ export declare const loadOrStartRedesignRecord: (args: {
109
+ paths: RedesignPaths;
110
+ url: string;
111
+ direction: string;
112
+ requestedPages: number;
113
+ requestedMaxScreens?: number;
114
+ requestedConversionModel?: ConversionModel;
115
+ }) => Promise<RedesignRecord>;
116
+ //# sourceMappingURL=redesign-workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redesign-workspace.d.ts","sourceRoot":"","sources":["../src/redesign-workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import { mkdtemp, readFile, writeFile } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ /**
5
+ * The run directory `12ui redesign` creates and every stage reads and writes.
6
+ *
7
+ * Mirrors `draft-workspace.ts`: minted under the system temp root by
8
+ * `mkdtemp`, printed as the command's first line, never nested inside the
9
+ * caller's working directory. `redesign.json` is the one record every stage
10
+ * reads before it decides whether it has work left to do, so `--from` can
11
+ * resume without re-deriving what an earlier stage already settled.
12
+ */
13
+ export const REDESIGN_RECORD_FILENAME = 'redesign.json';
14
+ export const REDESIGN_CAPTURE_DIRECTORY = 'capture';
15
+ export const REDESIGN_DRAFT_DIRECTORY = 'draft';
16
+ export const REDESIGN_BRANCH_DIRECTORY = 'branch';
17
+ export const REDESIGN_STAGES = ['capture', 'plan', 'draft', 'pick', 'branch', 'polish'];
18
+ export const isRedesignStage = (value) => (REDESIGN_STAGES.includes(value));
19
+ /** `https://example.com/pricing` -> `example-com`. */
20
+ export const redesignSlug = (url) => {
21
+ const host = (() => {
22
+ try {
23
+ return new URL(url).hostname;
24
+ }
25
+ catch {
26
+ return url;
27
+ }
28
+ })();
29
+ const slug = host
30
+ .toLowerCase()
31
+ .replace(/[^a-z0-9]+/gu, '-')
32
+ .replace(/^-+|-+$/gu, '')
33
+ .slice(0, 32);
34
+ return slug || 'redesign';
35
+ };
36
+ export const redesignPaths = (runDir) => {
37
+ const resolved = path.resolve(runDir);
38
+ return {
39
+ runDir: resolved,
40
+ captureDir: path.join(resolved, REDESIGN_CAPTURE_DIRECTORY),
41
+ draftDir: path.join(resolved, REDESIGN_DRAFT_DIRECTORY),
42
+ branchDir: path.join(resolved, REDESIGN_BRANCH_DIRECTORY),
43
+ record: path.join(resolved, REDESIGN_RECORD_FILENAME),
44
+ };
45
+ };
46
+ export const createRedesignWorkspace = async (args) => {
47
+ const root = args.root ?? os.tmpdir();
48
+ const runDir = await mkdtemp(path.join(root, `12ui-redesign-${redesignSlug(args.url)}-`));
49
+ return redesignPaths(runDir);
50
+ };
51
+ /**
52
+ * Persisted redesign records are resumable inputs, so project them onto the
53
+ * current schema instead of carrying unknown fields from an older CLI into
54
+ * every subsequent write.
55
+ */
56
+ const currentRedesignRecord = (record) => ({
57
+ version: record.version,
58
+ createdAt: record.createdAt,
59
+ runDir: record.runDir,
60
+ url: record.url,
61
+ direction: record.direction,
62
+ requestedPages: record.requestedPages,
63
+ ...(record.requestedMaxScreens === undefined
64
+ ? {}
65
+ : { requestedMaxScreens: record.requestedMaxScreens }),
66
+ ...(record.requestedConversionModel === undefined
67
+ ? {}
68
+ : { requestedConversionModel: record.requestedConversionModel }),
69
+ ...(record.capture ? {
70
+ capture: {
71
+ pages: record.capture.pages.map((page) => ({
72
+ id: page.id,
73
+ url: page.url,
74
+ path: page.path,
75
+ sha256: page.sha256,
76
+ bytes: page.bytes,
77
+ width: page.width,
78
+ height: page.height,
79
+ })),
80
+ },
81
+ } : {}),
82
+ ...(record.plan ? {
83
+ plan: {
84
+ concept: record.plan.concept,
85
+ retain: {
86
+ include: record.plan.retain.include,
87
+ exclude: record.plan.retain.exclude,
88
+ ...(record.plan.retain.notes === undefined ? {} : { notes: record.plan.retain.notes }),
89
+ },
90
+ corpusQuery: record.plan.corpusQuery,
91
+ effectIdentity: record.plan.effectIdentity,
92
+ replayed: record.plan.replayed,
93
+ ...(record.plan.degradation === undefined ? {} : {
94
+ degradation: { reasons: record.plan.degradation.reasons },
95
+ }),
96
+ },
97
+ } : {}),
98
+ ...(record.draft ? { draft: { runDir: record.draft.runDir, runId: record.draft.runId } } : {}),
99
+ ...(record.pick ? {
100
+ pick: {
101
+ slot: record.pick.slot,
102
+ imagePath: record.pick.imagePath,
103
+ sha256: record.pick.sha256,
104
+ },
105
+ } : {}),
106
+ ...(record.branch ? {
107
+ branch: {
108
+ pages: record.branch.pages.map((page) => ({
109
+ pageId: page.pageId,
110
+ branchDir: page.branchDir,
111
+ status: page.status,
112
+ completionPath: page.completionPath,
113
+ })),
114
+ },
115
+ } : {}),
116
+ ...(record.polish ? {
117
+ polish: {
118
+ pages: record.polish.pages.map((page) => ({
119
+ pageId: page.pageId,
120
+ branchDir: page.branchDir,
121
+ enabled: page.enabled,
122
+ })),
123
+ },
124
+ } : {}),
125
+ });
126
+ export const readRedesignRecord = async (file) => {
127
+ try {
128
+ return currentRedesignRecord(JSON.parse(await readFile(file, 'utf8')));
129
+ }
130
+ catch {
131
+ return undefined;
132
+ }
133
+ };
134
+ export const writeRedesignRecord = async (file, record) => {
135
+ await writeFile(file, `${JSON.stringify(record, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
136
+ };
137
+ /** Read the record, or start a fresh one when this is the first stage to run. */
138
+ export const loadOrStartRedesignRecord = async (args) => {
139
+ const existing = await readRedesignRecord(args.paths.record);
140
+ if (existing)
141
+ return existing;
142
+ return {
143
+ version: 1,
144
+ createdAt: new Date().toISOString(),
145
+ runDir: args.paths.runDir,
146
+ url: args.url,
147
+ direction: args.direction,
148
+ requestedPages: args.requestedPages,
149
+ ...(args.requestedMaxScreens === undefined
150
+ ? {}
151
+ : { requestedMaxScreens: args.requestedMaxScreens }),
152
+ ...(args.requestedConversionModel === undefined
153
+ ? {}
154
+ : { requestedConversionModel: args.requestedConversionModel }),
155
+ };
156
+ };
157
+ //# sourceMappingURL=redesign-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redesign-workspace.js","sourceRoot":"","sources":["../src/redesign-workspace.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-journal-commands.d.ts","sourceRoot":"","sources":["../src/run-journal-commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AAEH,KAAK,iBAAiB,GAAG,CACvB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,KAAK,EAAE,QAAQ,KACZ,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEtD,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,wEAAwE;IACxE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC;IACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7E,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC;CACnE,GAAG,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,GAAG;IAAE,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AA0D7F;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,uBAAuB,CAAC;AAE5D,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EA6J5D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,SAAS,MAAM,EAAE,EAC1B,OAAO,QAAQ,KACd,iBAAiB,GAAG,SAEtB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAU,MAAM;IACzC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB,KAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAkBhC,CAAC"}
1
+ {"version":3,"file":"run-journal-commands.d.ts","sourceRoot":"","sources":["../src/run-journal-commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AAEH,KAAK,iBAAiB,GAAG,CACvB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,KAAK,EAAE,QAAQ,KACZ,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEtD,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,wEAAwE;IACxE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC;IACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7E,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC;CACnE,GAAG,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,GAAG;IAAE,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AA0D7F;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,uBAAuB,CAAC;AAE5D,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAuK5D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,SAAS,MAAM,EAAE,EAC1B,OAAO,QAAQ,KACd,iBAAiB,GAAG,SAEtB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAU,MAAM;IACzC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB,KAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAkBhC,CAAC"}
@@ -167,6 +167,16 @@ export const RUN_JOURNAL_COMMANDS = [
167
167
  skip: 'Reads the account ledger over the network and writes nothing locally. There is no run'
168
168
  + ' and no workspace to record.',
169
169
  },
170
+ {
171
+ cmd: 'redesign',
172
+ matches: is('redesign'),
173
+ paid: true,
174
+ terminalOnSuccess: true,
175
+ workspace: outDir,
176
+ // Mints its own run directory when --out-dir is omitted, exactly like
177
+ // `draft`; the start line is held until the command binds it.
178
+ lateWorkspace: true,
179
+ },
170
180
  {
171
181
  cmd: 'capabilities',
172
182
  matches: is('capabilities'),
@@ -1 +1 @@
1
- {"version":3,"file":"run-journal-commands.js","sourceRoot":"","sources":["../src/run-journal-commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-journal-commands.js","sourceRoot":"","sources":["../src/run-journal-commands.ts"],"names":[],"mappings":"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"}
package/open-design.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "specVersion": "1.0.0",
4
4
  "name": "12ui-design",
5
5
  "title": "12UI Design",
6
- "version": "0.2.48",
6
+ "version": "0.2.50",
7
7
  "description": "Explore corpus-grounded interface directions, choose one, and convert it into production-ready responsive or native artifacts with 12UI.",
8
8
  "author": {
9
9
  "name": "Just Every",
@@ -49,7 +49,7 @@
49
49
  "command": "npx",
50
50
  "args": [
51
51
  "-y",
52
- "@12ui/design@0.2.48",
52
+ "@12ui/design@0.2.50",
53
53
  "mcp"
54
54
  ]
55
55
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12ui/design",
3
- "version": "0.2.48",
3
+ "version": "0.2.50",
4
4
  "type": "module",
5
5
  "description": "The canonical 12ui CLI, SDK, MCP server, and visual interface design skills",
6
6
  "main": "dist/index.js",
@@ -23,7 +23,7 @@
23
23
  "start": "node dist/cli.js",
24
24
  "test": "vitest",
25
25
  "test:run": "vitest run",
26
- "test:prototype": "node prototype-kit/polish/tests/rules-check.mjs && node prototype-kit/polish/tests/harm-check.mjs && node prototype-kit/polish/tests/breathing-check.mjs && node prototype-kit/polish/tests/report-check.mjs && node prototype-kit/tests/rules-check.mjs && node prototype-kit/tests/offline-check.mjs && node prototype-kit/tests/shell-stitching-runtime.mjs && node prototype-kit/tests/adversarial-runtime.mjs --assert",
26
+ "test:prototype": "node prototype-kit/polish/tests/rules-check.mjs && node prototype-kit/polish/tests/harm-check.mjs && node prototype-kit/polish/tests/breathing-check.mjs && node prototype-kit/polish/tests/report-check.mjs && node prototype-kit/tests/rules-check.mjs && node prototype-kit/tests/offline-check.mjs && node prototype-kit/tests/shell-stitching-runtime.mjs && node prototype-kit/tests/shell-stitching-runtime.mjs --reintroduce-defect && node prototype-kit/tests/adversarial-runtime.mjs --assert",
27
27
  "typecheck": "tsc --noEmit && tsc -p tsconfig.type-tests.json",
28
28
  "prepublishOnly": "npm run build"
29
29
  },
@@ -4,7 +4,7 @@ import fs from 'node:fs';
4
4
  import path from 'node:path';
5
5
  import { parseHTML } from 'linkedom';
6
6
  import { resolveDropdownAction } from './lib/actions.mjs';
7
- import { restoreActionPointerReachability } from './lib/action-target.mjs';
7
+ import { restoreActionPointerReachability, selectUniqueActionOwners } from './lib/action-target.mjs';
8
8
  import {
9
9
  HOLDING_SHELL_ATTRIBUTE,
10
10
  holdingBlockGeometry,
@@ -13,6 +13,7 @@ import {
13
13
  shellPlacementCss,
14
14
  } from './lib/holding-composition.mjs';
15
15
  import { injectReviewFraming } from './lib/review-framing.mjs';
16
+ import { removeRemoteHeadLinks } from './lib/local-document.mjs';
16
17
  import {
17
18
  isolateTransplantedShell,
18
19
  rulesFor,
@@ -156,6 +157,7 @@ const report = {
156
157
  unbound: [],
157
158
  invalidDropdowns: [],
158
159
  actionDemotions: [],
160
+ duplicateActionOwners: [],
159
161
  shellSizeDelta: [],
160
162
  shellAmbiguities: model.shellAmbiguities || [],
161
163
  suppressedShellOverlaps: [],
@@ -234,7 +236,9 @@ function actionsFor(s) {
234
236
  if (a) acts.set(c.id, a);
235
237
  else report.counts.none++;
236
238
  }
237
- return acts;
239
+ const normalized = selectUniqueActionOwners(loadDoc(s.file).document, acts);
240
+ report.duplicateActionOwners.push(...normalized.removed.map((removal) => ({ state: s.stateId, ...removal })));
241
+ return normalized.actions;
238
242
  }
239
243
 
240
244
  function bindAction(el, action) {
@@ -410,6 +414,7 @@ for (const u of units) {
410
414
  const cfg = { unit: u.id, states: u.states.map((s) => s.stateId), tokens: model.tokens, contentFile: `${u.id}.json`, activeNav: activeNav?.text || null };
411
415
  document.body.insertAdjacentHTML('beforeend', `<script id="proto-state" type="application/json">${JSON.stringify(cfg).replace(/</g, '\\u003c')}</script><script src="proto.js"></script>`);
412
416
  if (review) injectReviewFraming(document, review);
417
+ removeRemoteHeadLinks(document);
413
418
  fs.writeFileSync(path.join(outDir, outputFileOfUnit(u)), '<!doctype html>\n' + document.documentElement.outerHTML);
414
419
  fs.writeFileSync(path.join(outDir, 'content', u.id + '.json'), JSON.stringify(content, null, 1));
415
420
  report.units.push({
@@ -612,6 +617,7 @@ for (const u of units) {
612
617
  const cfg = { unit: hslug, holding: true, holdingBands: bandDeclarations, tokens: model.tokens, contentFile: null, activeNav: navMatch?.text || null };
613
618
  document.body.insertAdjacentHTML('beforeend', `<script id="proto-state" type="application/json">${JSON.stringify(cfg)}</script><script src="proto.js"></script>`);
614
619
  if (review) injectReviewFraming(document, review);
620
+ removeRemoteHeadLinks(document);
615
621
  fs.writeFileSync(path.join(outDir, outputFile), '<!doctype html>\n' + document.documentElement.outerHTML);
616
622
  }
617
623
  console.error(`holding pages: ${usedHoldings.size}`);
@@ -623,5 +629,5 @@ fs.writeFileSync(path.join(outDir, 'index.html'), `<!doctype html><meta http-equ
623
629
  const manifestHoldings = review
624
630
  ? [...usedHoldings.entries()].map(([holding, title]) => [holding.replace(/\.html$/, ''), title])
625
631
  : [...usedHoldings.entries()];
626
- fs.writeFileSync(path.join(outDir, 'proto-manifest.json'), JSON.stringify({ units: report.units, nav: navRows.map((n) => ({ text: n.text, target: n.target, holding: n.holding, rowId: n.rowId })), holdings: manifestHoldings, counts: report.counts, unbound: report.unbound, invalidDropdowns: report.invalidDropdowns, ...(report.actionDemotions.length > 0 ? { actionDemotions: report.actionDemotions } : {}), shellSizeDelta: report.shellSizeDelta, shellAmbiguities: report.shellAmbiguities, suppressedShellOverlaps: report.suppressedShellOverlaps, skippedShellTransplants: report.skippedShellTransplants, replacedShellActions: report.replacedShellActions, shellActionRemaps: report.shellActionRemaps, scriptDirections: states.map(({ stateId, scriptDirection, writingMode }) => ({ stateId, scriptDirection, writingMode })), canonicalShell: model.canonicalShell, canonicalShellPage: report.canonicalShellPage, shellConsistency: report.shellConsistency, ...(review ? { review } : {}) }, null, 1));
632
+ fs.writeFileSync(path.join(outDir, 'proto-manifest.json'), JSON.stringify({ units: report.units, nav: navRows.map((n) => ({ text: n.text, target: n.target, holding: n.holding, rowId: n.rowId })), holdings: manifestHoldings, counts: report.counts, unbound: report.unbound, invalidDropdowns: report.invalidDropdowns, ...(report.actionDemotions.length > 0 ? { actionDemotions: report.actionDemotions } : {}), ...(report.duplicateActionOwners.length > 0 ? { duplicateActionOwners: report.duplicateActionOwners } : {}), shellSizeDelta: report.shellSizeDelta, shellAmbiguities: report.shellAmbiguities, suppressedShellOverlaps: report.suppressedShellOverlaps, skippedShellTransplants: report.skippedShellTransplants, replacedShellActions: report.replacedShellActions, shellActionRemaps: report.shellActionRemaps, scriptDirections: states.map(({ stateId, scriptDirection, writingMode }) => ({ stateId, scriptDirection, writingMode })), canonicalShell: model.canonicalShell, canonicalShellPage: report.canonicalShellPage, shellConsistency: report.shellConsistency, ...(review ? { review } : {}) }, null, 1));
627
633
  console.error('counts', JSON.stringify(report.counts), 'unbound', report.unbound.length);
@@ -8,3 +8,29 @@ export function restoreActionPointerReachability(element) {
8
8
  element.setAttribute('data-proto-pointer-restored', 'true');
9
9
  return true;
10
10
  }
11
+
12
+ /**
13
+ * Give one semantic action to one rendered owner. A label response can name
14
+ * both a layout wrapper and one or more controls inside it. When descendants
15
+ * carry the same action kind, only the terminal-most elements are real action
16
+ * targets; retaining the wrapper adds a duplicate listener and an impossible
17
+ * hit-test identity. Different nested action kinds remain independent.
18
+ */
19
+ export function selectUniqueActionOwners(document, actions) {
20
+ const selected = new Map(actions);
21
+ const removed = [];
22
+ for (const [wrapperId, wrapperAction] of actions) {
23
+ const wrapper = document.getElementById(wrapperId);
24
+ if (!wrapper) continue;
25
+ const descendants = [...wrapper.querySelectorAll('[id]')].filter((candidate) => (
26
+ actions.get(candidate.id)?.action === wrapperAction.action
27
+ ));
28
+ if (descendants.length === 0) continue;
29
+ const ownerIds = descendants.filter((candidate) => ![...candidate.querySelectorAll('[id]')].some((nested) => (
30
+ actions.get(nested.id)?.action === wrapperAction.action
31
+ ))).map((candidate) => candidate.id);
32
+ selected.delete(wrapperId);
33
+ removed.push({ wrapperId, ownerIds, action: wrapperAction.action });
34
+ }
35
+ return { actions: selected, removed };
36
+ }
@@ -0,0 +1,16 @@
1
+ const REMOTE_HREF = /^(?:https?:)?\/\//iu;
2
+
3
+ /**
4
+ * Prototype files are owner-review artifacts that must open directly from
5
+ * disk. Remote head links turn an otherwise self-contained page into a noisy
6
+ * runtime failure when the review browser correctly blocks the network.
7
+ */
8
+ export function removeRemoteHeadLinks(document) {
9
+ let removed = 0;
10
+ for (const link of document.querySelectorAll('head link[href]')) {
11
+ if (!REMOTE_HREF.test(link.getAttribute('href')?.trim() ?? '')) continue;
12
+ link.remove();
13
+ removed += 1;
14
+ }
15
+ return removed;
16
+ }