@ryuenn3123/agentic-senior-core 3.0.32 → 3.0.33
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.
- package/.agent-context/prompts/bootstrap-design.md +2 -0
- package/.agent-context/review-checklists/pr-checklist.md +1 -0
- package/.agent-context/rules/frontend-architecture.md +9 -0
- package/.agent-context/state/memory-continuity-benchmark.json +1 -1
- package/.cursorrules +1 -1
- package/.gemini/instructions.md +2 -1
- package/.github/copilot-instructions.md +2 -1
- package/.instructions.md +13 -4
- package/.windsurfrules +1 -1
- package/AGENTS.md +2 -1
- package/lib/cli/project-scaffolder/design-contract.mjs +10 -1
- package/package.json +1 -1
- package/scripts/sync-thin-adapters.mjs +3 -0
- package/scripts/validate/config.mjs +9 -0
- package/scripts/validate/coverage-checks.mjs +20 -0
|
@@ -18,6 +18,7 @@ The agent must:
|
|
|
18
18
|
5. Treat prior-chat visuals, unrelated project memory, benchmark screenshots, and famous-product aesthetics as tainted context unless the user explicitly asks for continuity.
|
|
19
19
|
6. When choosing a new UI, animation, styling, or component library, research current official docs and choose the latest stable compatible option for this project. Do not rely on offline defaults.
|
|
20
20
|
7. Keep external references non-copying: extract constraints and reasoning only, never clone the surface.
|
|
21
|
+
8. Record a Motion/Palette Decision before UI implementation; product categories are heuristics, not style presets, so override them with task, content density, brand intent, device/performance, and accessibility evidence.
|
|
21
22
|
|
|
22
23
|
## Creative Commitment Gate
|
|
23
24
|
|
|
@@ -144,6 +145,7 @@ For every UI task, define how major surfaces change across mobile, tablet, and d
|
|
|
144
145
|
The JSON must stay machine-readable and project-specific. It should record:
|
|
145
146
|
- the confirmed project context and assumptions to validate
|
|
146
147
|
- agent-chosen visual direction, not scaffold-chosen direction
|
|
148
|
+
- `motionPaletteDecision` with motion density source, required interaction states, palette autopilot risk, and whether 3D/canvas is useful or unnecessary
|
|
147
149
|
- `conceptualAnchor` and how typography, spacing, morphology, motion, and responsive composition derive from it when no external research was provided
|
|
148
150
|
- `derivedTokenLogic` with exact `anchorReference` traceability for color, spacing, typography, and motion tokens
|
|
149
151
|
- `libraryResearchStatus` plus `libraryDecisions[]` with verified source metadata or explicit native/project-local fallbacks
|
|
@@ -72,6 +72,7 @@ Run this before declaring a task done. Apply only the sections relevant to the c
|
|
|
72
72
|
|
|
73
73
|
- [ ] UI work follows `docs/DESIGN.md` and `docs/design-intent.json`.
|
|
74
74
|
- [ ] Visual direction is project-specific and not a template/default component-kit habit.
|
|
75
|
+
- [ ] UI work includes a Motion/Palette Decision, and product categories were treated as heuristics rather than style presets.
|
|
75
76
|
- [ ] Responsive behavior recomposes content and priority, not only shrinking desktop layout.
|
|
76
77
|
- [ ] Accessibility hard requirements are preserved: keyboard access, focus visibility, contrast, target size, status feedback, and no color-only meaning.
|
|
77
78
|
- [ ] Motion is treated as part of the design language for modern UI work, with reduced-motion and performance safeguards instead of defaulting to static screens.
|
|
@@ -69,6 +69,15 @@ Do not use this file to teach generic frontend basics the model already knows.
|
|
|
69
69
|
- If live research is unavailable, mark `libraryResearchStatus` as `pending-verification`, record the library as `LIBRARY_TO_VERIFY`, and use native CSS, browser APIs, or already-present project dependencies until verification is possible.
|
|
70
70
|
- Each `libraryDecisions[]` entry must have either verification metadata or a concrete `fallbackIfUnavailable`.
|
|
71
71
|
|
|
72
|
+
## Contextual Motion and Palette Intelligence
|
|
73
|
+
|
|
74
|
+
- Product categories are heuristics, not style presets. Use them only as a starting signal, then choose motion density from user task, content density, brand intent, device/performance budget, and accessibility needs.
|
|
75
|
+
- If the category is unclear, infer from the dominant task: reading, scanning, form completion, data comparison, product inspection, storytelling, learning, play, or spatial exploration.
|
|
76
|
+
- For interactive UI, map the required states before coding: default, hover, focus-visible, active/pressed, disabled, loading, empty, error, success, and transition.
|
|
77
|
+
- Do not default to dark slate, cream/beige/tan, purple-blue gradients, monochrome palettes, or uniform card surfaces unless current project evidence supports them. If one of those palettes is used, document why it fits and add enough role contrast that the UI does not read as a template.
|
|
78
|
+
- Use the existing motion stack first. Add animation, 3D, canvas, or scroll dependencies only when they materially improve delivery speed, interaction quality, maintainability, or product understanding.
|
|
79
|
+
- Motion should be absent only for a named reason: repeated high-frequency workflow, long-form reading focus, data-density scanning, reduced-motion need, or performance constraint.
|
|
80
|
+
|
|
72
81
|
## Spatial and 3D Experience Boundary
|
|
73
82
|
|
|
74
83
|
- 3D, WebGL, canvas, and immersive spatial interfaces are allowed as the primary experience when they clarify the product, strengthen the chosen anchor, or make exploration meaningfully better than a flat UI.
|
package/.cursorrules
CHANGED
package/.gemini/instructions.md
CHANGED
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Adapter Mode: thin
|
|
4
4
|
Adapter Source: .instructions.md
|
|
5
|
-
Canonical Snapshot SHA256:
|
|
5
|
+
Canonical Snapshot SHA256: a49781782fac817a8a979e7937563b67826fd088af160a12cf84bdab4d038624
|
|
6
6
|
|
|
7
7
|
Canonical policy source: [.instructions.md](../.instructions.md).
|
|
8
8
|
|
|
9
9
|
If your host stops at this file, follow this minimum floor:
|
|
10
10
|
- Read `.agent-instructions.md` next when it exists.
|
|
11
11
|
- For UI or redesign requests, load [.agent-context/prompts/bootstrap-design.md](../.agent-context/prompts/bootstrap-design.md) and [.agent-context/rules/frontend-architecture.md](../.agent-context/rules/frontend-architecture.md) before coding.
|
|
12
|
+
- For UI scope, include a one-line Motion/Palette Decision in the Bootstrap Receipt; product categories are heuristics, not style presets.
|
|
12
13
|
- If UI scope and `docs/DESIGN.md` or `docs/design-intent.json` is missing, materialize them before UI implementation.
|
|
13
14
|
- For backend/API/data/auth/event requests, load relevant global rules from [.agent-context/rules/](../.agent-context/rules) and do not create stack-specific governance adapters.
|
|
14
15
|
- Memory continuity is host-dependent project memory and does not replace bootstrap loading.
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Adapter Mode: thin
|
|
4
4
|
Adapter Source: .instructions.md
|
|
5
|
-
Canonical Snapshot SHA256:
|
|
5
|
+
Canonical Snapshot SHA256: a49781782fac817a8a979e7937563b67826fd088af160a12cf84bdab4d038624
|
|
6
6
|
|
|
7
7
|
The canonical policy source for this repository is [.instructions.md](../.instructions.md).
|
|
8
8
|
|
|
9
9
|
If your host stops at this file, follow this minimum floor:
|
|
10
10
|
- Read `.agent-instructions.md` next when it exists.
|
|
11
11
|
- For UI or redesign requests, load [.agent-context/prompts/bootstrap-design.md](../.agent-context/prompts/bootstrap-design.md) and [.agent-context/rules/frontend-architecture.md](../.agent-context/rules/frontend-architecture.md) before coding.
|
|
12
|
+
- For UI scope, include a one-line Motion/Palette Decision in the Bootstrap Receipt; product categories are heuristics, not style presets.
|
|
12
13
|
- If UI scope and `docs/DESIGN.md` or `docs/design-intent.json` is missing, materialize them before UI implementation.
|
|
13
14
|
- For backend/API/data/auth/event requests, load relevant global rules from [.agent-context/rules/](../.agent-context/rules) and do not create stack-specific governance adapters.
|
|
14
15
|
- Memory continuity is host-dependent project memory and does not replace bootstrap loading.
|
package/.instructions.md
CHANGED
|
@@ -29,6 +29,14 @@ Required fields:
|
|
|
29
29
|
|
|
30
30
|
Keep the receipt short. Do not load every rule just to fill it out; scoped loading remains mandatory.
|
|
31
31
|
|
|
32
|
+
### Output and Command Economy
|
|
33
|
+
|
|
34
|
+
Avoid repeated command output. Do not rerun the same broad inspection command unless new edits changed its result. Prefer targeted reads, targeted searches, concise diffs, and final validation gates; summarize long logs instead of copying full command output into the response.
|
|
35
|
+
|
|
36
|
+
### UI Motion and Palette Readability Floor
|
|
37
|
+
|
|
38
|
+
For any UI-facing request, `bootstrap-design.md` and `frontend-architecture.md` must appear in `selected_rules` before UI code edits. The plan or receipt must include a one-line Motion/Palette Decision: motion density source, required interaction states, palette autopilot risk, and whether 3D/canvas is useful or unnecessary. Product categories are heuristics, not style presets; override them with user task, content density, brand intent, device/performance, and accessibility evidence.
|
|
39
|
+
|
|
32
40
|
### Layer 1: Rules (15 Files) [SCOPE-RESOLVED]
|
|
33
41
|
|
|
34
42
|
**Location**: `.agent-context/rules/`
|
|
@@ -197,10 +205,11 @@ Use available MCP tools when you need validation, linting, or test execution.
|
|
|
197
205
|
1. Read `.agent-context/prompts/bootstrap-design.md`.
|
|
198
206
|
2. Read `.agent-context/rules/frontend-architecture.md`.
|
|
199
207
|
3. Read UI-relevant repository evidence from `.agent-context/state/onboarding-report.json`, current UI code, and `docs/*`.
|
|
200
|
-
4.
|
|
201
|
-
5.
|
|
202
|
-
6.
|
|
203
|
-
7.
|
|
208
|
+
4. Add a short Motion/Palette Decision before UI implementation; product categories are heuristics, not style presets.
|
|
209
|
+
5. Before UI implementation, record a concrete creative commitment in the design contract: one specific real-world anchor reference, one signature motion behavior, and one typographic decision with meaningful role contrast.
|
|
210
|
+
6. Ensure `docs/design-intent.json` includes `conceptualAnchor.anchorReference`, top-level `derivedTokenLogic`, `libraryResearchStatus`, `libraryDecisions[]`, and motion/palette decisions before UI code.
|
|
211
|
+
7. Generate or refine `docs/DESIGN.md` plus `docs/design-intent.json` before UI implementation.
|
|
212
|
+
8. Keep context isolated and do not eagerly load unrelated backend-only rules unless the task explicitly touches those boundaries.
|
|
204
213
|
|
|
205
214
|
---
|
|
206
215
|
|
package/.windsurfrules
CHANGED
package/AGENTS.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Adapter Mode: thin
|
|
4
4
|
Adapter Source: .instructions.md
|
|
5
|
-
Canonical Snapshot SHA256:
|
|
5
|
+
Canonical Snapshot SHA256: a49781782fac817a8a979e7937563b67826fd088af160a12cf84bdab4d038624
|
|
6
6
|
|
|
7
7
|
This file is an adapter entrypoint for agent discovery.
|
|
8
8
|
The canonical policy source is [.instructions.md](.instructions.md).
|
|
@@ -14,6 +14,7 @@ If your host stops at this file instead of following the full chain, obey the Cr
|
|
|
14
14
|
- If `.agent-instructions.md` exists, prefer it immediately after this file because it is the compiled project-specific snapshot.
|
|
15
15
|
- Memory continuity does not replace bootstrap loading. It is host-dependent project memory, not a guarantee that instructions were reloaded for this session.
|
|
16
16
|
- For UI, UX, layout, screen, tailwind, frontend, or redesign requests: load [.agent-context/prompts/bootstrap-design.md](.agent-context/prompts/bootstrap-design.md) and [.agent-context/rules/frontend-architecture.md](.agent-context/rules/frontend-architecture.md) before editing code.
|
|
17
|
+
- For UI scope, include a one-line Motion/Palette Decision in the Bootstrap Receipt; product categories are heuristics, not style presets.
|
|
17
18
|
- For UI scope: if `docs/DESIGN.md` or `docs/design-intent.json` is missing, materialize or refine them before implementing UI changes.
|
|
18
19
|
- For backend, API, data, auth, error, event, queue, worker, or distributed-system requests: load the relevant global rules from [.agent-context/rules/](.agent-context/rules); do not create stack-specific governance adapters.
|
|
19
20
|
- For refactor, improve, clean up, or fix requests: inspect the active rules and propose a plan before editing.
|
|
@@ -224,6 +224,13 @@ function buildDesignIntentContractObject({
|
|
|
224
224
|
motionDerivationSource: 'Agent must explain how duration, easing, choreography, and reduced-motion alternatives derive from the chosen anchorReference.',
|
|
225
225
|
validationRule: 'Every primitive, semantic, component, typography, spacing, and motion token must trace back to anchorReference; if a token cannot be explained from the anchor, revise the token.',
|
|
226
226
|
},
|
|
227
|
+
motionPaletteDecision: {
|
|
228
|
+
productCategorySignal: 'agent-inferred-starting-heuristic',
|
|
229
|
+
densityDecisionSource: 'Agent must choose motion density from task, content density, brand intent, device/performance, and accessibility evidence; product categories are heuristics, not style presets.',
|
|
230
|
+
requiredInteractionStates: ['default', 'hover', 'focus-visible', 'active', 'disabled', 'loading', 'empty', 'error', 'success', 'transition'],
|
|
231
|
+
paletteAutopilotRisks: ['dark-slate-default', 'cream-beige-default', 'purple-blue-gradient-default', 'monochrome-template-default', 'uniform-card-surface-default'],
|
|
232
|
+
spatialDecision: 'Agent must state whether 3D/canvas/WebGL is useful or unnecessary for product understanding, exploration, or storytelling.',
|
|
233
|
+
},
|
|
227
234
|
libraryResearchStatus: 'pending-verification',
|
|
228
235
|
libraryDecisions: [
|
|
229
236
|
{
|
|
@@ -270,6 +277,7 @@ function buildDesignIntentContractObject({
|
|
|
270
277
|
rolePolicy: 'minimum-semantic-scaffold',
|
|
271
278
|
rolesAreMinimumScaffold: true,
|
|
272
279
|
rolesMustBeAgentDefined: true,
|
|
280
|
+
forbidAutopilotPalettesWithoutEvidence: true,
|
|
273
281
|
intent: inferredKeywords.colorIntent,
|
|
274
282
|
},
|
|
275
283
|
crossViewportAdaptation: {
|
|
@@ -281,13 +289,14 @@ function buildDesignIntentContractObject({
|
|
|
281
289
|
allowMeaningfulMotion: true,
|
|
282
290
|
purpose: inferredKeywords.motionPurpose,
|
|
283
291
|
seedToneLocked: false,
|
|
292
|
+
densitySource: 'task-content-brand-device-accessibility',
|
|
284
293
|
respectReducedMotion: true,
|
|
285
294
|
},
|
|
286
295
|
componentMorphology: {
|
|
287
296
|
requireStateBehaviorMatrix: true,
|
|
288
297
|
preserveIdentityAcrossViewports: true,
|
|
289
298
|
seedBehaviorsRequireRefinement: true,
|
|
290
|
-
stateKeys: ['default', 'focus', 'loading', 'error'],
|
|
299
|
+
stateKeys: ['default', 'hover', 'focus-visible', 'active', 'disabled', 'loading', 'empty', 'error', 'success', 'transition'],
|
|
291
300
|
viewportBehavior: inferredKeywords.componentMorphology,
|
|
292
301
|
},
|
|
293
302
|
accessibilityPolicy: {
|
package/package.json
CHANGED
|
@@ -43,6 +43,7 @@ If your host stops at this file instead of following the full chain, obey the Cr
|
|
|
43
43
|
- If \`.agent-instructions.md\` exists, prefer it immediately after this file because it is the compiled project-specific snapshot.
|
|
44
44
|
- Memory continuity does not replace bootstrap loading. It is host-dependent project memory, not a guarantee that instructions were reloaded for this session.
|
|
45
45
|
- For UI, UX, layout, screen, tailwind, frontend, or redesign requests: load [.agent-context/prompts/bootstrap-design.md](.agent-context/prompts/bootstrap-design.md) and [.agent-context/rules/frontend-architecture.md](.agent-context/rules/frontend-architecture.md) before editing code.
|
|
46
|
+
- For UI scope, include a one-line Motion/Palette Decision in the Bootstrap Receipt; product categories are heuristics, not style presets.
|
|
46
47
|
- For UI scope: if \`docs/DESIGN.md\` or \`docs/design-intent.json\` is missing, materialize or refine them before implementing UI changes.
|
|
47
48
|
- For backend, API, data, auth, error, event, queue, worker, or distributed-system requests: load the relevant global rules from [.agent-context/rules/](.agent-context/rules); do not create stack-specific governance adapters.
|
|
48
49
|
- For refactor, improve, clean up, or fix requests: inspect the active rules and propose a plan before editing.
|
|
@@ -86,6 +87,7 @@ The canonical policy source for this repository is [.instructions.md](../.instru
|
|
|
86
87
|
If your host stops at this file, follow this minimum floor:
|
|
87
88
|
- Read \`.agent-instructions.md\` next when it exists.
|
|
88
89
|
- For UI or redesign requests, load [.agent-context/prompts/bootstrap-design.md](../.agent-context/prompts/bootstrap-design.md) and [.agent-context/rules/frontend-architecture.md](../.agent-context/rules/frontend-architecture.md) before coding.
|
|
90
|
+
- For UI scope, include a one-line Motion/Palette Decision in the Bootstrap Receipt; product categories are heuristics, not style presets.
|
|
89
91
|
- If UI scope and \`docs/DESIGN.md\` or \`docs/design-intent.json\` is missing, materialize them before UI implementation.
|
|
90
92
|
- For backend/API/data/auth/event requests, load relevant global rules from [.agent-context/rules/](../.agent-context/rules) and do not create stack-specific governance adapters.
|
|
91
93
|
- Memory continuity is host-dependent project memory and does not replace bootstrap loading.
|
|
@@ -122,6 +124,7 @@ Canonical policy source: [.instructions.md](../.instructions.md).
|
|
|
122
124
|
If your host stops at this file, follow this minimum floor:
|
|
123
125
|
- Read \`.agent-instructions.md\` next when it exists.
|
|
124
126
|
- For UI or redesign requests, load [.agent-context/prompts/bootstrap-design.md](../.agent-context/prompts/bootstrap-design.md) and [.agent-context/rules/frontend-architecture.md](../.agent-context/rules/frontend-architecture.md) before coding.
|
|
127
|
+
- For UI scope, include a one-line Motion/Palette Decision in the Bootstrap Receipt; product categories are heuristics, not style presets.
|
|
125
128
|
- If UI scope and \`docs/DESIGN.md\` or \`docs/design-intent.json\` is missing, materialize them before UI implementation.
|
|
126
129
|
- For backend/API/data/auth/event requests, load relevant global rules from [.agent-context/rules/](../.agent-context/rules) and do not create stack-specific governance adapters.
|
|
127
130
|
- Memory continuity is host-dependent project memory and does not replace bootstrap loading.
|
|
@@ -265,6 +265,8 @@ export const REQUIRED_UI_DESIGN_AUTOMATION_SNIPPETS = [
|
|
|
265
265
|
'docs/DESIGN.md',
|
|
266
266
|
'docs/design-intent.json',
|
|
267
267
|
'does not replace bootstrap loading',
|
|
268
|
+
'Motion/Palette Decision',
|
|
269
|
+
'product categories are heuristics',
|
|
268
270
|
'perform live web research',
|
|
269
271
|
],
|
|
270
272
|
},
|
|
@@ -275,6 +277,8 @@ export const REQUIRED_UI_DESIGN_AUTOMATION_SNIPPETS = [
|
|
|
275
277
|
'UI Design Mode',
|
|
276
278
|
'bootstrap-design.md',
|
|
277
279
|
'frontend-architecture.md',
|
|
280
|
+
'Motion/Palette Decision',
|
|
281
|
+
'product categories are heuristics',
|
|
278
282
|
'do not eagerly load unrelated backend-only rules',
|
|
279
283
|
'valid style context',
|
|
280
284
|
'External references, prior-chat memory, unrelated-project visuals, and remembered screenshots are tainted',
|
|
@@ -292,6 +296,8 @@ export const REQUIRED_UI_DESIGN_AUTOMATION_SNIPPETS = [
|
|
|
292
296
|
'Responsive Recomposition Plan',
|
|
293
297
|
'source of truth',
|
|
294
298
|
'research current official docs',
|
|
299
|
+
'motionPaletteDecision',
|
|
300
|
+
'product categories are heuristics',
|
|
295
301
|
'Responsive design means recomposition, not resizing.',
|
|
296
302
|
'agent-chosen visual direction',
|
|
297
303
|
'viewport mutation rules',
|
|
@@ -349,9 +355,12 @@ export const REQUIRED_UI_DESIGN_AUTOMATION_SNIPPETS = [
|
|
|
349
355
|
'seedPolicy',
|
|
350
356
|
'structure-first-scaffold',
|
|
351
357
|
'colorTruth',
|
|
358
|
+
'motionPaletteDecision',
|
|
359
|
+
'forbidAutopilotPalettesWithoutEvidence',
|
|
352
360
|
'rolesAreMinimumScaffold',
|
|
353
361
|
'crossViewportAdaptation',
|
|
354
362
|
'motionSystem',
|
|
363
|
+
'densitySource',
|
|
355
364
|
'seedToneLocked',
|
|
356
365
|
'componentMorphology',
|
|
357
366
|
'seedBehaviorsRequireRefinement',
|
|
@@ -392,6 +392,10 @@ export async function validateInstructionAdapters(context) {
|
|
|
392
392
|
'unreachable_files',
|
|
393
393
|
'validation_plan',
|
|
394
394
|
];
|
|
395
|
+
const requiredUiReadabilitySnippets = [
|
|
396
|
+
'Motion/Palette Decision',
|
|
397
|
+
'product categories are heuristics',
|
|
398
|
+
];
|
|
395
399
|
|
|
396
400
|
for (const requiredBootstrapReceiptSnippet of requiredBootstrapReceiptSnippets) {
|
|
397
401
|
if (canonicalInstructionContent.includes(requiredBootstrapReceiptSnippet)) {
|
|
@@ -401,6 +405,14 @@ export async function validateInstructionAdapters(context) {
|
|
|
401
405
|
}
|
|
402
406
|
}
|
|
403
407
|
|
|
408
|
+
for (const requiredUiReadabilitySnippet of requiredUiReadabilitySnippets) {
|
|
409
|
+
if (canonicalInstructionContent.includes(requiredUiReadabilitySnippet)) {
|
|
410
|
+
pass(`.instructions.md includes UI readability snippet: ${requiredUiReadabilitySnippet}`);
|
|
411
|
+
} else {
|
|
412
|
+
fail(`.instructions.md is missing UI readability snippet: ${requiredUiReadabilitySnippet}`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
404
416
|
for (const thinAdapterPath of THIN_ADAPTER_PATHS) {
|
|
405
417
|
const absoluteAdapterPath = join(ROOT_DIR, thinAdapterPath);
|
|
406
418
|
|
|
@@ -428,6 +440,14 @@ export async function validateInstructionAdapters(context) {
|
|
|
428
440
|
}
|
|
429
441
|
}
|
|
430
442
|
|
|
443
|
+
for (const requiredUiReadabilitySnippet of requiredUiReadabilitySnippets) {
|
|
444
|
+
if (thinAdapterContent.includes(requiredUiReadabilitySnippet)) {
|
|
445
|
+
pass(`${thinAdapterPath} includes UI readability snippet: ${requiredUiReadabilitySnippet}`);
|
|
446
|
+
} else {
|
|
447
|
+
fail(`${thinAdapterPath} is missing UI readability snippet: ${requiredUiReadabilitySnippet}`);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
431
451
|
const hashMatch = thinAdapterContent.match(/Canonical Snapshot SHA256:\s*([a-f0-9]{64})/);
|
|
432
452
|
if (!hashMatch) {
|
|
433
453
|
fail(`${thinAdapterPath} must declare Canonical Snapshot SHA256`);
|