@12ui/design 0.2.36 → 0.2.38

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 (101) hide show
  1. package/SKILL.md +1 -1
  2. package/dist/branch-client.d.ts +12 -0
  3. package/dist/branch-client.d.ts.map +1 -1
  4. package/dist/branch-client.js.map +1 -1
  5. package/dist/branch-completion.d.ts.map +1 -1
  6. package/dist/branch-completion.js +1 -0
  7. package/dist/branch-completion.js.map +1 -1
  8. package/dist/branch-execution-types.d.ts +3 -0
  9. package/dist/branch-execution-types.d.ts.map +1 -1
  10. package/dist/branch-execution.d.ts.map +1 -1
  11. package/dist/branch-execution.js +13 -0
  12. package/dist/branch-execution.js.map +1 -1
  13. package/dist/branch-identity.d.ts +1 -1
  14. package/dist/branch-identity.js +1 -1
  15. package/dist/branch-plan.d.ts +3 -1
  16. package/dist/branch-plan.d.ts.map +1 -1
  17. package/dist/branch-plan.js +2 -0
  18. package/dist/branch-plan.js.map +1 -1
  19. package/dist/branch-run-record.d.ts +18 -0
  20. package/dist/branch-run-record.d.ts.map +1 -1
  21. package/dist/branch-run-record.js.map +1 -1
  22. package/dist/branch-winner.d.ts.map +1 -1
  23. package/dist/branch-winner.js +7 -0
  24. package/dist/branch-winner.js.map +1 -1
  25. package/dist/cli-branch-command.d.ts.map +1 -1
  26. package/dist/cli-branch-command.js +61 -7
  27. package/dist/cli-branch-command.js.map +1 -1
  28. package/dist/cli-help/design.d.ts +1 -1
  29. package/dist/cli-help/design.d.ts.map +1 -1
  30. package/dist/cli-help/design.js +1 -0
  31. package/dist/cli-help/design.js.map +1 -1
  32. package/dist/cli-help/index.d.ts +1 -1
  33. package/dist/cli-prototype-command.d.ts +3 -2
  34. package/dist/cli-prototype-command.d.ts.map +1 -1
  35. package/dist/cli-prototype-command.js +9 -3
  36. package/dist/cli-prototype-command.js.map +1 -1
  37. package/dist/cli-review-command.js +2 -2
  38. package/dist/cli-review-command.js.map +1 -1
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +2 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/prototype-branch-contract.d.ts +67 -0
  44. package/dist/prototype-branch-contract.d.ts.map +1 -0
  45. package/dist/prototype-branch-contract.js +403 -0
  46. package/dist/prototype-branch-contract.js.map +1 -0
  47. package/dist/prototype-poststep.d.ts +27 -0
  48. package/dist/prototype-poststep.d.ts.map +1 -0
  49. package/dist/prototype-poststep.js +97 -0
  50. package/dist/prototype-poststep.js.map +1 -0
  51. package/dist/prototype-run-record.d.ts +92 -0
  52. package/dist/prototype-run-record.d.ts.map +1 -0
  53. package/dist/prototype-run-record.js +236 -0
  54. package/dist/prototype-run-record.js.map +1 -0
  55. package/dist/prototype-runner.d.ts +13 -1
  56. package/dist/prototype-runner.d.ts.map +1 -1
  57. package/dist/prototype-runner.js +79 -20
  58. package/dist/prototype-runner.js.map +1 -1
  59. package/open-design.json +2 -2
  60. package/package.json +1 -1
  61. package/prototype-kit/analyze.mjs +48 -6
  62. package/prototype-kit/build.mjs +249 -65
  63. package/prototype-kit/inventory.mjs +290 -2
  64. package/prototype-kit/lib/holding-composition.mjs +67 -0
  65. package/prototype-kit/lib/nav-active-state.mjs +67 -0
  66. package/prototype-kit/lib/review-framing.mjs +72 -0
  67. package/prototype-kit/lib/runtime-check.mjs +361 -28
  68. package/prototype-kit/lib/shell-consistency.mjs +68 -0
  69. package/prototype-kit/lib/shell-stitching.mjs +221 -0
  70. package/prototype-kit/runtime/proto.css +8 -3
  71. package/prototype-kit/tests/README.md +4 -1
  72. package/prototype-kit/tests/adversarial-runtime.mjs +85 -2
  73. package/prototype-kit/tests/fixtures/holding-runtime/PROVENANCE.md +22 -0
  74. package/prototype-kit/tests/fixtures/holding-runtime/band-ownership-fire.html +10 -0
  75. package/prototype-kit/tests/fixtures/holding-runtime/band-ownership-silent.html +10 -0
  76. package/prototype-kit/tests/fixtures/holding-runtime/declared-width-fire.html +11 -0
  77. package/prototype-kit/tests/fixtures/holding-runtime/declared-width-silent.html +11 -0
  78. package/prototype-kit/tests/fixtures/holding-runtime/ground-registration-mismatch-fire.html +5 -0
  79. package/prototype-kit/tests/fixtures/holding-runtime/ground-registration-mismatch-silent.html +5 -0
  80. package/prototype-kit/tests/fixtures/holding-runtime/holding-contrast-fire.html +5 -0
  81. package/prototype-kit/tests/fixtures/holding-runtime/holding-contrast-silent.html +5 -0
  82. package/prototype-kit/tests/fixtures/holding-runtime/positioned-ground-fire.html +5 -0
  83. package/prototype-kit/tests/fixtures/holding-runtime/positioned-ground-silent.html +5 -0
  84. package/prototype-kit/tests/fixtures/holding-runtime/shell-geometry-fire.html +5 -0
  85. package/prototype-kit/tests/fixtures/holding-runtime/shell-geometry-silent.html +5 -0
  86. package/prototype-kit/tests/fixtures/holding-runtime/shell-intersection-fire.html +5 -0
  87. package/prototype-kit/tests/fixtures/holding-runtime/shell-intersection-silent.html +5 -0
  88. package/prototype-kit/tests/fixtures/runtime/history.html +1 -1
  89. package/prototype-kit/tests/fixtures/shell-nav-runtime/PROVENANCE.md +6 -0
  90. package/prototype-kit/tests/fixtures/shell-nav-runtime/active-fire.html +3 -0
  91. package/prototype-kit/tests/fixtures/shell-nav-runtime/proto-manifest.json +20 -0
  92. package/prototype-kit/tests/fixtures/shell-nav-runtime/shell-fire.html +3 -0
  93. package/prototype-kit/tests/fixtures/shell-nav-runtime/shell-silent.html +3 -0
  94. package/prototype-kit/tests/fixtures/shell-nav-runtime/unlinked-silent.html +3 -0
  95. package/prototype-kit/tests/fixtures/three-shell/pages/p0-home.html +3 -3
  96. package/prototype-kit/tests/fixtures/three-shell/pages/p1-reports.html +3 -3
  97. package/prototype-kit/tests/lib/run-process.mjs +8 -2
  98. package/prototype-kit/tests/offline-check.mjs +143 -0
  99. package/prototype-kit/tests/population-sweep.mjs +26 -7
  100. package/prototype-kit/tests/rules-check.mjs +80 -0
  101. package/prototype-kit/verify-runtime.mjs +5 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prototype-run-record.d.ts","sourceRoot":"","sources":["../src/prototype-run-record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, open, readFile, rename, rm, stat } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ /**
5
+ * The prototype post-step is deliberately recorded separately from the branch
6
+ * run. A branch can be settled while this optional derived artifact is still
7
+ * running, failed, or ready to retry.
8
+ */
9
+ export const PROTOTYPE_STATUS_FILENAME = 'prototype.status.json';
10
+ export const prototypeStatusPath = (branchDir) => (path.join(branchDir, PROTOTYPE_STATUS_FILENAME));
11
+ const invalidRecord = (file) => new Error(`Invalid prototype status record: ${file}`);
12
+ const nonEmptyString = (value) => (typeof value === 'string' && value.trim().length > 0);
13
+ const parsePrototypeRunRecord = (source, file) => {
14
+ let parsed;
15
+ try {
16
+ parsed = JSON.parse(source);
17
+ }
18
+ catch (error) {
19
+ throw new Error(`Invalid prototype status record: ${file}`, { cause: error });
20
+ }
21
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
22
+ throw invalidRecord(file);
23
+ }
24
+ const value = parsed;
25
+ if (value.version !== 1
26
+ || !nonEmptyString(value.runId)
27
+ || !nonEmptyString(value.inputDigest)
28
+ || !Number.isSafeInteger(value.attempt)
29
+ || value.attempt < 1
30
+ || !nonEmptyString(value.startedAt)
31
+ || !Number.isFinite(Date.parse(value.startedAt))
32
+ || !nonEmptyString(value.updatedAt)
33
+ || !Number.isFinite(Date.parse(value.updatedAt))) {
34
+ throw invalidRecord(file);
35
+ }
36
+ const base = {
37
+ version: 1,
38
+ runId: value.runId,
39
+ inputDigest: value.inputDigest,
40
+ attempt: value.attempt,
41
+ startedAt: value.startedAt,
42
+ updatedAt: value.updatedAt,
43
+ };
44
+ switch (value.status) {
45
+ case 'running':
46
+ return { ...base, status: 'running' };
47
+ case 'succeeded':
48
+ if (!nonEmptyString(value.manifestPath))
49
+ throw invalidRecord(file);
50
+ return { ...base, status: 'succeeded', manifestPath: value.manifestPath };
51
+ case 'failed': {
52
+ if (value.error === null || typeof value.error !== 'object' || Array.isArray(value.error)) {
53
+ throw invalidRecord(file);
54
+ }
55
+ const error = value.error;
56
+ if (!nonEmptyString(error.name)
57
+ || !nonEmptyString(error.message)
58
+ || (error.stack !== undefined && typeof error.stack !== 'string')) {
59
+ throw invalidRecord(file);
60
+ }
61
+ return {
62
+ ...base,
63
+ status: 'failed',
64
+ error: {
65
+ name: error.name,
66
+ message: error.message,
67
+ ...(typeof error.stack === 'string' ? { stack: error.stack } : {}),
68
+ },
69
+ };
70
+ }
71
+ case 'skipped':
72
+ if (!nonEmptyString(value.reason)
73
+ || (value.detail !== undefined && typeof value.detail !== 'string')) {
74
+ throw invalidRecord(file);
75
+ }
76
+ return {
77
+ ...base,
78
+ status: 'skipped',
79
+ reason: value.reason,
80
+ ...(typeof value.detail === 'string' ? { detail: value.detail } : {}),
81
+ };
82
+ default:
83
+ throw invalidRecord(file);
84
+ }
85
+ };
86
+ export const readPrototypeRunRecord = async (branchDir) => {
87
+ const file = prototypeStatusPath(branchDir);
88
+ let source;
89
+ try {
90
+ source = await readFile(file, 'utf8');
91
+ }
92
+ catch (error) {
93
+ if (error.code === 'ENOENT')
94
+ return undefined;
95
+ throw error;
96
+ }
97
+ return parsePrototypeRunRecord(source, file);
98
+ };
99
+ /**
100
+ * A synced temporary inode is renamed over the destination, then the parent
101
+ * directory is synced. Readers therefore see the previous whole record or the
102
+ * next whole record, and the rename survives a process or machine interruption.
103
+ */
104
+ export const writePrototypeRunRecord = async (branchDir, record) => {
105
+ const file = prototypeStatusPath(branchDir);
106
+ const parent = path.dirname(file);
107
+ await mkdir(parent, { recursive: true });
108
+ const temporary = path.join(parent, `.${PROTOTYPE_STATUS_FILENAME}.${randomUUID()}.tmp`);
109
+ let temporaryHandle;
110
+ try {
111
+ temporaryHandle = await open(temporary, 'wx', 0o600);
112
+ await temporaryHandle.writeFile(`${JSON.stringify(record, null, 2)}\n`, 'utf8');
113
+ await temporaryHandle.sync();
114
+ await temporaryHandle.close();
115
+ temporaryHandle = undefined;
116
+ await rename(temporary, file);
117
+ const directoryHandle = await open(parent, 'r');
118
+ try {
119
+ await directoryHandle.sync();
120
+ }
121
+ finally {
122
+ await directoryHandle.close();
123
+ }
124
+ }
125
+ finally {
126
+ await temporaryHandle?.close();
127
+ await rm(temporary, { force: true });
128
+ }
129
+ };
130
+ const timestamp = (now) => (now ?? (() => new Date()))().toISOString();
131
+ export const startPrototypeRunRecord = async (args) => {
132
+ const previous = await readPrototypeRunRecord(args.branchDir);
133
+ const startedAt = timestamp(args.now);
134
+ const record = {
135
+ version: 1,
136
+ status: 'running',
137
+ runId: args.runId,
138
+ inputDigest: args.inputDigest,
139
+ attempt: previous?.runId === args.runId && previous.inputDigest === args.inputDigest
140
+ ? previous.attempt + 1
141
+ : 1,
142
+ startedAt,
143
+ updatedAt: startedAt,
144
+ };
145
+ await writePrototypeRunRecord(args.branchDir, record);
146
+ return record;
147
+ };
148
+ const updatedRecordBase = (running, now) => ({
149
+ version: 1,
150
+ runId: running.runId,
151
+ inputDigest: running.inputDigest,
152
+ attempt: running.attempt,
153
+ startedAt: running.startedAt,
154
+ updatedAt: timestamp(now),
155
+ });
156
+ export const succeedPrototypeRunRecord = async (args) => {
157
+ const record = {
158
+ ...updatedRecordBase(args.running, args.now),
159
+ status: 'succeeded',
160
+ manifestPath: args.manifestPath,
161
+ };
162
+ await writePrototypeRunRecord(args.branchDir, record);
163
+ return record;
164
+ };
165
+ const durableError = (error) => {
166
+ if (error instanceof Error) {
167
+ return {
168
+ name: error.name,
169
+ message: error.message,
170
+ ...(error.stack ? { stack: error.stack } : {}),
171
+ };
172
+ }
173
+ return { name: 'Error', message: String(error) };
174
+ };
175
+ export const failPrototypeRunRecord = async (args) => {
176
+ const record = {
177
+ ...updatedRecordBase(args.running, args.now),
178
+ status: 'failed',
179
+ error: durableError(args.error),
180
+ };
181
+ await writePrototypeRunRecord(args.branchDir, record);
182
+ return record;
183
+ };
184
+ export const skipPrototypeRunRecord = async (args) => {
185
+ const record = {
186
+ ...updatedRecordBase(args.running, args.now),
187
+ status: 'skipped',
188
+ reason: args.reason,
189
+ ...(args.detail === undefined ? {} : { detail: args.detail }),
190
+ };
191
+ await writePrototypeRunRecord(args.branchDir, record);
192
+ return record;
193
+ };
194
+ const fileExists = async (file) => {
195
+ try {
196
+ return (await stat(file)).isFile();
197
+ }
198
+ catch (error) {
199
+ if (error.code === 'ENOENT')
200
+ return false;
201
+ throw error;
202
+ }
203
+ };
204
+ const fromBranchRoot = (branchDir, file) => (path.isAbsolute(file) ? file : path.join(branchDir, file));
205
+ /**
206
+ * Decide whether a caller can adopt a settled prototype or must run it again.
207
+ * A legacy manifest remains adoptable only while no sidecar exists; once a
208
+ * sidecar exists, its digest and status are authoritative.
209
+ */
210
+ export const resolvePrototypeRunRecord = async (args) => {
211
+ const record = await readPrototypeRunRecord(args.branchDir);
212
+ if (!record) {
213
+ const manifestPath = fromBranchRoot(args.branchDir, args.legacyManifestPath);
214
+ return await fileExists(manifestPath)
215
+ ? { action: 'settled', reason: 'legacy-manifest', adoptable: true, manifestPath }
216
+ : { action: 'retry', reason: 'missing' };
217
+ }
218
+ if (record.inputDigest !== args.inputDigest) {
219
+ return { action: 'retry', reason: 'input-changed', record };
220
+ }
221
+ switch (record.status) {
222
+ case 'succeeded': {
223
+ const manifestPath = fromBranchRoot(args.branchDir, record.manifestPath);
224
+ return await fileExists(manifestPath)
225
+ ? { action: 'settled', reason: 'succeeded', adoptable: true, manifestPath, record }
226
+ : { action: 'retry', reason: 'manifest-missing', record };
227
+ }
228
+ case 'skipped':
229
+ return { action: 'settled', reason: 'skipped', adoptable: false, record };
230
+ case 'running':
231
+ return { action: 'retry', reason: 'running', record };
232
+ case 'failed':
233
+ return { action: 'retry', reason: 'failed', record };
234
+ }
235
+ };
236
+ //# sourceMappingURL=prototype-run-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prototype-run-record.js","sourceRoot":"","sources":["../src/prototype-run-record.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import type { TwelveUiPrototypeLabelClient } from './prototype-label-client.js';
2
+ import { type PrototypeBranchContract } from './prototype-branch-contract.js';
2
3
  import { type PrototypeStageResult } from './prototype-process.js';
3
4
  export declare const PROTOTYPE_MANIFEST_FILENAME = "proto-manifest.json";
4
5
  export declare const PROTOTYPE_DIRECTORY = "prototype";
5
6
  export declare const PROTOTYPE_WORK_DIRECTORY = ".prototype-work";
6
- export declare const PROTOTYPE_PIPELINE_REVISION = "prototype-v2";
7
+ export declare const PROTOTYPE_PIPELINE_REVISION = "prototype-v3";
7
8
  export type PrototypeRunResult = {
8
9
  branchDir: string;
9
10
  outputDir: string;
@@ -14,8 +15,19 @@ export type PrototypeRunResult = {
14
15
  labelCostMicros: number;
15
16
  warnings: string[];
16
17
  };
18
+ export declare class PrototypeNavigationSkippedError extends Error {
19
+ readonly reason: 'prototype_navigation_unreconciled' | 'prototype_navigation_no_survivors';
20
+ readonly detail: string;
21
+ constructor(args: {
22
+ reason: PrototypeNavigationSkippedError['reason'];
23
+ detail: string;
24
+ });
25
+ }
17
26
  export declare const runPrototypePipeline: (args: {
18
27
  branchDir: string;
28
+ contract?: Exclude<PrototypeBranchContract, {
29
+ mode: "skip";
30
+ }>;
19
31
  environment?: NodeJS.ProcessEnv;
20
32
  homeDirectory?: string;
21
33
  labelClient?: TwelveUiPrototypeLabelClient;
@@ -1 +1 @@
1
- {"version":3,"file":"prototype-runner.d.ts","sourceRoot":"","sources":["../src/prototype-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAIhF,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAItF,eAAO,MAAM,2BAA2B,wBAAwB,CAAC;AACjE,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,wBAAwB,oBAAoB,CAAC;AAC1D,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAOF,eAAO,MAAM,oBAAoB,GAAU,MAAM;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,4BAA4B,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAG,OAAO,CAAC,kBAAkB,CAqK7B,CAAC"}
1
+ {"version":3,"file":"prototype-runner.d.ts","sourceRoot":"","sources":["../src/prototype-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,gCAAgC,CAAC;AAIxC,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAUtF,eAAO,MAAM,2BAA2B,wBAAwB,CAAC;AACjE,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,wBAAwB,oBAAoB,CAAC;AAC1D,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,qBAAa,+BAAgC,SAAQ,KAAK;IACxD,QAAQ,CAAC,MAAM,EAAE,mCAAmC,GAAG,mCAAmC,CAAC;IAC3F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE;QAChB,MAAM,EAAE,+BAA+B,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,EAAE,MAAM,CAAC;KAChB;CAMF;AAOD,eAAO,MAAM,oBAAoB,GAAU,MAAM;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC,uBAAuB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,4BAA4B,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAG,OAAO,CAAC,kBAAkB,CA2N7B,CAAC"}
@@ -2,20 +2,47 @@ import { randomUUID } from 'node:crypto';
2
2
  import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
+ import { resolvePrototypeBranchContract, } from './prototype-branch-contract.js';
5
6
  import { resolvePrototypeBrowserProvisioning } from './prototype-browsers.js';
6
7
  import { evaluatePrototypeGates } from './prototype-gates.js';
7
8
  import { prototypeLabelRequests } from './prototype-requests.js';
8
9
  import { runPrototypeStage } from './prototype-process.js';
10
+ import { failPrototypeRunRecord, skipPrototypeRunRecord, startPrototypeRunRecord, succeedPrototypeRunRecord, } from './prototype-run-record.js';
9
11
  import { prototypeSourceDirectory } from './prototype-source.js';
10
12
  import { BRANCH_COMPLETION_FILENAME, BRANCH_PLAN_FILENAME } from './branch-run-record.js';
11
13
  export const PROTOTYPE_MANIFEST_FILENAME = 'proto-manifest.json';
12
14
  export const PROTOTYPE_DIRECTORY = 'prototype';
13
15
  export const PROTOTYPE_WORK_DIRECTORY = '.prototype-work';
14
- export const PROTOTYPE_PIPELINE_REVISION = 'prototype-v2';
16
+ export const PROTOTYPE_PIPELINE_REVISION = 'prototype-v3';
17
+ export class PrototypeNavigationSkippedError extends Error {
18
+ reason;
19
+ detail;
20
+ constructor(args) {
21
+ super(`Prototype skipped (${args.reason}): ${args.detail}`);
22
+ this.name = 'PrototypeNavigationSkippedError';
23
+ this.reason = args.reason;
24
+ this.detail = args.detail;
25
+ }
26
+ }
15
27
  const kitDirectory = () => path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../prototype-kit');
16
28
  export const runPrototypePipeline = async (args) => {
17
29
  const branchDir = path.resolve(args.branchDir);
18
30
  const sourceDir = await prototypeSourceDirectory(branchDir);
31
+ const contract = args.contract ?? await resolvePrototypeBranchContract({ branchDir, sourceDir });
32
+ const running = await startPrototypeRunRecord({
33
+ branchDir,
34
+ runId: contract.runId || 'unresolved',
35
+ inputDigest: contract.inputDigest,
36
+ });
37
+ if (contract.mode === 'skip') {
38
+ await skipPrototypeRunRecord({
39
+ branchDir,
40
+ running,
41
+ reason: contract.reason,
42
+ detail: contract.detail,
43
+ });
44
+ throw new PrototypeNavigationSkippedError(contract);
45
+ }
19
46
  const planPath = path.join(sourceDir, BRANCH_PLAN_FILENAME);
20
47
  const completionPath = path.join(branchDir, BRANCH_COMPLETION_FILENAME);
21
48
  const completion = JSON.parse(await readFile(completionPath, 'utf8'));
@@ -29,18 +56,22 @@ export const runPrototypePipeline = async (args) => {
29
56
  const modelFile = path.join(workDir, 'model.json');
30
57
  const runtimeAuditFile = path.join(workDir, 'runtime-audit.json');
31
58
  const gateAuditFile = path.join(workDir, 'gate-audit.json');
59
+ const reviewFile = path.join(workDir, 'review.json');
32
60
  const stagingDir = path.join(branchDir, `.prototype-${randomUUID()}.tmp`);
33
61
  const outputDir = path.join(branchDir, PROTOTYPE_DIRECTORY);
34
- const browserProvisioning = await resolvePrototypeBrowserProvisioning({
35
- ...(args.environment ? { environment: args.environment } : {}),
36
- ...(args.homeDirectory ? { homeDirectory: args.homeDirectory } : {}),
37
- ...(args.platform ? { platform: args.platform } : {}),
38
- });
39
62
  await rm(workDir, { recursive: true, force: true });
40
63
  await mkdir(labelsDir, { recursive: true });
41
64
  await mkdir(stagingDir, { recursive: true });
42
65
  const stages = [];
43
66
  try {
67
+ const browserProvisioning = await resolvePrototypeBrowserProvisioning({
68
+ ...(args.environment ? { environment: args.environment } : {}),
69
+ ...(args.homeDirectory ? { homeDirectory: args.homeDirectory } : {}),
70
+ ...(args.platform ? { platform: args.platform } : {}),
71
+ });
72
+ if (contract.mode === 'review') {
73
+ await writeFile(reviewFile, `${JSON.stringify(contract.review, null, 2)}\n`);
74
+ }
44
75
  stages.push(await runPrototypeStage({
45
76
  stage: 'inventory',
46
77
  script: path.join(kit, 'inventory.mjs'),
@@ -52,7 +83,7 @@ export const runPrototypePipeline = async (args) => {
52
83
  stages.push(await runPrototypeStage({
53
84
  stage: 'analyze',
54
85
  script: path.join(kit, 'analyze.mjs'),
55
- argv: [inventoryFile, modelFile],
86
+ argv: [inventoryFile, modelFile, ...(contract.mode === 'review' ? [reviewFile] : [])],
56
87
  workDir,
57
88
  browserProvisioning,
58
89
  ...(args.signal ? { signal: args.signal } : {}),
@@ -89,19 +120,30 @@ export const runPrototypePipeline = async (args) => {
89
120
  const kitManifest = JSON.parse(await readFile(manifestPath, 'utf8'));
90
121
  const inventory = JSON.parse(await readFile(inventoryFile, 'utf8'));
91
122
  const runtimeAudit = JSON.parse(await readFile(runtimeAuditFile, 'utf8'));
123
+ const viewportWidths = [...new Set(runtimeAudit.pages.flatMap((page) => (page.viewports?.map((viewport) => viewport.width).filter((width) => Number.isFinite(width)) || [])))].sort((left, right) => left - right);
92
124
  const evaluation = evaluatePrototypeGates(kitManifest);
93
- const planStatus = Array.isArray(inventory.plan?.pages) && Array.isArray(inventory.plan?.screens)
94
- ? 'passed'
95
- : 'accepted-partial';
125
+ const planStatus = contract.mode === 'review'
126
+ ? 'accepted-partial'
127
+ : Array.isArray(inventory.plan?.pages) && Array.isArray(inventory.plan?.screens)
128
+ ? 'passed'
129
+ : 'accepted-partial';
130
+ const reviewStatus = (failed) => (failed && contract.mode === 'review' ? 'accepted-partial' : failed ? 'failed' : 'passed');
96
131
  const gates = {
97
132
  exportedHtml: 'passed',
98
133
  branchPlan: planStatus,
99
134
  semanticViewportSections: 'passed',
100
135
  runtime: 'passed',
101
- zeroActionRealPages: evaluation.facts.zeroActionRealPages.length > 0 ? 'failed' : 'passed',
102
- dropdownValidity: evaluation.facts.invalidDropdowns > 0 ? 'failed' : 'passed',
103
- holdingRatio: evaluation.facts.holdingRatio > 0.5 ? 'failed' : 'passed',
136
+ shellConsistency: runtimeAudit.shellConsistencyFailures.length > 0 ? 'failed' : 'passed',
137
+ activeNavigation: runtimeAudit.activeNavigationFailures.length > 0 ? 'failed' : 'passed',
138
+ zeroActionRealPages: reviewStatus(evaluation.facts.zeroActionRealPages.length > 0),
139
+ dropdownValidity: reviewStatus(evaluation.facts.invalidDropdowns > 0),
140
+ holdingRatio: reviewStatus(evaluation.facts.holdingRatio > 0.5),
104
141
  };
142
+ const reviewFindings = contract.mode === 'review' ? evaluation.blockers : [];
143
+ const blockers = contract.mode === 'review' ? [] : evaluation.blockers;
144
+ const warnings = contract.mode === 'review'
145
+ ? [...evaluation.warnings, ...reviewFindings]
146
+ : evaluation.warnings;
105
147
  await writeFile(gateAuditFile, `${JSON.stringify({
106
148
  version: 1,
107
149
  revision: PROTOTYPE_PIPELINE_REVISION,
@@ -112,11 +154,16 @@ export const runPrototypePipeline = async (args) => {
112
154
  },
113
155
  gates,
114
156
  facts: evaluation.facts,
115
- warnings: evaluation.warnings,
116
- blockers: evaluation.blockers,
157
+ warnings,
158
+ blockers,
159
+ ...(reviewFindings.length > 0 ? { reviewFindings } : {}),
117
160
  }, null, 2)}\n`);
118
- if (evaluation.blockers.length > 0) {
119
- throw new Error(`Prototype product gate failed: ${evaluation.blockers.join(' ')}`);
161
+ if (blockers.length > 0) {
162
+ throw new Error(`Prototype product gate failed: ${blockers.join(' ')}`);
163
+ }
164
+ if (contract.mode === 'review'
165
+ && JSON.stringify(kitManifest.review) !== JSON.stringify(contract.review)) {
166
+ throw new Error('Prototype review contract changed between input reconciliation and build.');
120
167
  }
121
168
  await writeFile(manifestPath, `${JSON.stringify({
122
169
  ...kitManifest,
@@ -143,14 +190,19 @@ export const runPrototypePipeline = async (args) => {
143
190
  duplicateIds: runtimeAudit.duplicateIds,
144
191
  brokenTargets: runtimeAudit.brokenTargets.length,
145
192
  interactionFailures: runtimeAudit.interactionFailures,
193
+ compositionFailures: runtimeAudit.compositionFailures,
194
+ shellConsistencyFailures: runtimeAudit.shellConsistencyFailures,
195
+ activeNavigationFailures: runtimeAudit.activeNavigationFailures,
196
+ viewportWidths,
146
197
  deepLinkBack: runtimeAudit.deepLinkBack,
147
198
  },
148
199
  facts: evaluation.facts,
149
- warnings: evaluation.warnings,
200
+ warnings,
201
+ ...(reviewFindings.length > 0 ? { reviewFindings } : {}),
150
202
  }, null, 2)}\n`);
151
203
  await rm(outputDir, { recursive: true, force: true });
152
204
  await rename(stagingDir, outputDir);
153
- return {
205
+ const result = {
154
206
  branchDir,
155
207
  outputDir,
156
208
  manifestPath: path.join(outputDir, PROTOTYPE_MANIFEST_FILENAME),
@@ -158,11 +210,18 @@ export const runPrototypePipeline = async (args) => {
158
210
  screenCount: model.states.length,
159
211
  labeledScreenCount,
160
212
  labelCostMicros,
161
- warnings: evaluation.warnings,
213
+ warnings,
162
214
  };
215
+ await succeedPrototypeRunRecord({
216
+ branchDir,
217
+ running,
218
+ manifestPath: result.manifestPath,
219
+ });
220
+ return result;
163
221
  }
164
222
  catch (error) {
165
223
  await rm(stagingDir, { recursive: true, force: true });
224
+ await failPrototypeRunRecord({ branchDir, running, error });
166
225
  throw error;
167
226
  }
168
227
  };
@@ -1 +1 @@
1
- {"version":3,"file":"prototype-runner.js","sourceRoot":"","sources":["../src/prototype-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prototype-runner.js","sourceRoot":"","sources":["../src/prototype-runner.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.36",
6
+ "version": "0.2.38",
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.36",
52
+ "@12ui/design@0.2.38",
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.36",
3
+ "version": "0.2.38",
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",
@@ -1,12 +1,14 @@
1
1
  // Deterministic analysis of an inventory: states, shared shell, nav items, dropdowns, rows, buttons, link-like texts.
2
- // Usage: node analyze.mjs <inventory.json> <model.json>
2
+ // Usage: node analyze.mjs <inventory.json> <model.json> [review.json]
3
3
  import fs from 'node:fs';
4
4
  import { matchPlannedPage } from './lib/navigation.mjs';
5
+ import { canonicalShellRule, selectCanonicalShellPage } from './lib/shell-consistency.mjs';
5
6
  import { compareCanonicalShells, isWithinShell, qualifiesShellCandidate, selectOneShellPerRegion } from './lib/shells.mjs';
6
7
  import { normalizeText as norm, slugText as slug } from './lib/text.mjs';
7
8
 
8
- const [invFile, outFile] = process.argv.slice(2);
9
+ const [invFile, outFile, reviewFile] = process.argv.slice(2);
9
10
  const inv = JSON.parse(fs.readFileSync(invFile, 'utf8'));
11
+ const review = reviewFile ? JSON.parse(fs.readFileSync(reviewFile, 'utf8')) : null;
10
12
  const W = 1536, H = 1024;
11
13
  const planScreens = Array.isArray(inv.plan?.screens) ? inv.plan.screens : [];
12
14
  const chevronDown = (l) => /\b(down|caret down|chevron down|expand)\b/.test(norm(l)) && /chevron|caret|arrow|down/.test(norm(l));
@@ -137,6 +139,23 @@ for (const r of regions) {
137
139
  canonical[r] = { stateId: cands[0].stateId, containerId: cands[0].containerId, box: cands[0].box, presentIn: cands.map((c) => c.stateId), ranking: cands.map((c) => `${c.stateId}:${c.matches}m/${c.items}i/${c.share}`) };
138
140
  }
139
141
  regions = Object.keys(canonical);
142
+ const canonicalShellPage = selectCanonicalShellPage({ pages: inv.pages, states, canonicalShell: canonical });
143
+ if (canonicalShellPage) {
144
+ for (const region of regions) {
145
+ const donorCandidates = states.filter((state) => state.pageId === canonicalShellPage.pageId)
146
+ .flatMap((state) => state.shell.filter((candidate) => candidate.region === region)
147
+ .map((candidate) => ({ ...candidate, stateId: state.stateId })));
148
+ if (donorCandidates.length === 0) continue;
149
+ const donor = donorCandidates[0];
150
+ canonical[region] = {
151
+ ...canonical[region],
152
+ stateId: donor.stateId,
153
+ containerId: donor.containerId,
154
+ box: donor.box,
155
+ };
156
+ }
157
+ canonicalShellPage.rule = canonicalShellRule();
158
+ }
140
159
 
141
160
  // ---- nav items: texts inside a canonical shell container that repeat, font >= 12, excluding long copy
142
161
  const nav = [];
@@ -157,10 +176,31 @@ for (const r of regions) {
157
176
  function matchPage(text) {
158
177
  return matchPlannedPage(text, states.filter((state) => state.ordinal === 1))?.stateId || null;
159
178
  }
160
- for (const n of nav) { n.target = matchPage(n.text); }
161
- { const first = nav.find((n) => n.region !== 'footer'); const home = states.find((s) => s.isSource) || states[0];
162
- if (first && !first.target && /^(home|overview|dashboard|start)$/.test(norm(first.text))) { first.target = home.stateId; first.fallback = 'home'; } }
163
- for (const n of nav) n.holding = n.target ? null : 'holding-' + slug(n.text);
179
+ if (review) {
180
+ const missingRoutes = Array.isArray(review.missingRoutes) ? review.missingRoutes : [];
181
+ const exactMissingRoute = (text) => missingRoutes.find((route) => (
182
+ norm(route.title) === norm(text)
183
+ || norm(String(route.id).replace(/-/g, ' ')) === norm(text)
184
+ ));
185
+ for (const n of nav) {
186
+ const missing = exactMissingRoute(n.text);
187
+ n.target = missing ? null : matchPage(n.text);
188
+ n.holding = missing?.holding || (n.target ? null : 'holding-' + slug(n.text));
189
+ if (missing) n.reviewRoute = missing.id;
190
+ }
191
+ const first = nav.find((n) => n.region !== 'footer');
192
+ const home = states.find((s) => s.isSource);
193
+ if (first && !first.target && !first.reviewRoute && home && /^(home|overview|dashboard|start)$/.test(norm(first.text))) {
194
+ first.target = home.stateId;
195
+ first.holding = null;
196
+ first.fallback = 'home';
197
+ }
198
+ } else {
199
+ for (const n of nav) { n.target = matchPage(n.text); }
200
+ { const first = nav.find((n) => n.region !== 'footer'); const home = states.find((s) => s.isSource) || states[0];
201
+ if (first && !first.target && /^(home|overview|dashboard|start)$/.test(norm(first.text))) { first.target = home.stateId; first.fallback = 'home'; } }
202
+ for (const n of nav) n.holding = n.target ? null : 'holding-' + slug(n.text);
203
+ }
164
204
 
165
205
  // ---- per-state interactive candidates
166
206
  function smallestCommon(s, ids) {
@@ -257,8 +297,10 @@ const tokens = {
257
297
  const model = {
258
298
  run: inv.runDir,
259
299
  plan: { concept: typeof inv.plan?.concept === 'string' ? inv.plan.concept : '', sitePurpose: typeof inv.plan?.sitePurpose === 'string' ? inv.plan.sitePurpose : '', scope: inv.plan?.scope || null },
300
+ ...(review ? { review } : {}),
260
301
  tokens,
261
302
  canonicalShell: canonical,
303
+ canonicalShellPage,
262
304
  shellAmbiguities,
263
305
  nav,
264
306
  states: states.map((s) => ({