@lucasvu/scope-ui 0.1.1 → 0.1.2

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/AI_SETUP.md CHANGED
@@ -298,7 +298,7 @@ File generate ra se la source of truth cho palette, surface, radius va shadow cu
298
298
 
299
299
  Neu can them mot bundled package theme layer de co shell tone dung san, import no o app entry. Neu theme layer do la attribute-scoped, set them `data-client-theme` bang `applyDocumentClientTheme`.
300
300
 
301
- `AGENTS.md` se co them shell brief + screen brief dang YAML de agent dien cac gia tri nhu `workspaceLabel`, `pageTabs`, `searchPlaceholder`, `routeUrl`, `sidebarItems`, `pageTitle`, `filters`, `fields`, `tableColumns` truoc khi bat dau viet JSX.
301
+ `AGENTS.md` se duoc generate theo format agent-definition YAML, co `activation-instructions`, `agent`, `persona`, `commands`, `dependencies`, va `brief_templates`. Agent se dien cac gia tri nhu `workspaceLabel`, `pageTabs`, `searchPlaceholder`, `routeUrl`, `sidebarItems`, `pageTitle`, `filters`, `fields`, `tableColumns` truoc khi bat dau viet JSX. Neu tool cua ban discover agent theo file rieng, co the truyen `--agents-file agents/dev.md` hoac mot path tuong tu.
302
302
 
303
303
  `src/layout-presets/workspace-admin-v1.ts` khong can import vao runtime. Day la layout contract cho agent/codegen doc de giu dark sidebar, gradient topbar, intro card, tab row, va toolbar card nhat quan giua cac man.
304
304
 
package/README.md CHANGED
@@ -61,7 +61,7 @@ npx scope-ui-init --list-themes
61
61
 
62
62
  Lưu ý: các lệnh này chỉ chạy được sau khi project đã cài `@lucasvu/scope-ui`. Nếu chưa cài package, `npx` sẽ đi tìm một package riêng tên `scope-ui-init` trên npm và báo `E404`.
63
63
 
64
- Lệnh này sẽ tạo `AGENTS.md`, `src/styles/ui-theme.css`, và `src/layout-presets/workspace-admin-v1.ts` trong repo hiện tại theo preset đã chọn. `AGENTS.md` giờ thêm playbook step-by-step để agent hỏi đủ input, đọc layout preset, rồi dựng màn hình đúng layout/component/theme chung. Nếu không truyền `--theme`, preset mặc định là `ocean`. Dùng `--force` nếu muốn overwrite file đã tồn tại.
64
+ Lệnh này sẽ tạo `AGENTS.md`, `src/styles/ui-theme.css`, và `src/layout-presets/workspace-admin-v1.ts` trong repo hiện tại theo preset đã chọn. `AGENTS.md` giờ được generate theo format agent-definition YAML có `activation-instructions`, `agent`, `persona`, `commands`, `dependencies`, `brief_templates`, và rule lock theme/layout. Nếu muốn output thẳng vào path agent-discovery của tooling, dùng `--agents-file`, dụ `npx scope-ui-init --theme sunset --agents-file agents/dev.md`. Nếu không truyền `--theme`, preset mặc định là `ocean`. Dùng `--force` nếu muốn overwrite file đã tồn tại.
65
65
 
66
66
  5. Dùng component:
67
67
 
@@ -180,10 +180,11 @@ Nếu muốn AI render UI đúng và ổn định theo thư viện này, đừng
180
180
  - Cài package trước khi bootstrap: `npm install @lucasvu/scope-ui`
181
181
  - Chạy `npx scope-ui-init --list-themes` để xem preset được duyệt
182
182
  - Chạy `npx scope-ui-init --theme <preset>` ở project consumer sau khi đã cài `@lucasvu/scope-ui` để tạo `AGENTS.md`, `src/styles/ui-theme.css`, và `src/layout-presets/workspace-admin-v1.ts`
183
+ - Nếu tooling của bạn đọc agent theo file riêng, dùng `--agents-file agents/dev.md` hoặc path tương đương để generate luôn agent markdown đúng chỗ
183
184
  - Khoá project vào một preset thay vì tự bịa palette mới cho từng page
184
- - Để agent đọc luôn playbook trong `AGENTS.md` `src/layout-presets/workspace-admin-v1.ts` để đi đúng thứ tự: hỏi input, khóa shell, chọn component, dựng layout, rồi mới tinh chỉnh token
185
+ - Để agent đọc luôn agent-definition trong `AGENTS.md` hoặc file bạn truyền qua `--agents-file`, cùng với `src/layout-presets/workspace-admin-v1.ts`, để đi đúng thứ tự: hỏi input, khóa shell, chọn component, dựng layout, rồi mới tinh chỉnh token
185
186
  - Buộc agent điền shell + screen brief trước khi code: `workspaceLabel`, `pageTabs`, `searchPlaceholder`, `routeUrl`, `sidebarItems`, `activeSidebarItemId`, `pageTitle`, `actions`, `filters`, `fields`, `tableColumns`
186
- - `AGENTS.md` mới sẽ có sẵn block brief dạng YAML để agent hoặc dev điền trực tiếp trước khi code
187
+ - `AGENTS.md` mới sẽ có sẵn block `commands`, `dependencies`, và `brief_templates` dạng YAML để agent hoặc dev điền trực tiếp trước khi code
187
188
  - Chỉ dùng các component canonical ở root package; tránh `MainFe` nếu không phải legacy screen
188
189
  - Cho agent đọc `uiAiManifest` để biết component nào dùng cho intent nào, props quan trọng là gì, và khi nào không nên dùng
189
190
  - Cho agent đọc `uiScreenBlueprint`, `uiThemeContract` và `uiThemePresets` để biết screen recipe, preset và token nào được phép override
@@ -333,6 +333,9 @@ Usage:
333
333
  npx scope-ui-init --theme sunset
334
334
  Fast path when you already know the preset you want.
335
335
 
336
+ npx scope-ui-init --theme sunset --agents-file agents/dev.md
337
+ Optional: write the generated agent definition straight into a tool-specific agent path.
338
+
336
339
  npx scope-ui-init --list-themes
337
340
  Optional: inspect approved presets before choosing one.
338
341
 
@@ -341,7 +344,7 @@ Usage:
341
344
 
342
345
  Options:
343
346
  --force overwrite existing files
344
- --agents-file target path for the generated AGENTS.md file
347
+ --agents-file target path for the generated agent markdown file
345
348
  --theme-file target path for the generated theme override file
346
349
  --layout-file target path for the generated layout preset file
347
350
  --theme theme preset id (${Object.keys(THEME_PRESETS).join(', ')})
@@ -383,223 +386,283 @@ function renderTokenBlock(tokens) {
383
386
  .join('\n')
384
387
  }
385
388
 
386
- function renderMarkdownList(items) {
387
- return items.map((item) => `- ${item}`).join('\n')
389
+ function quoteYaml(value) {
390
+ return JSON.stringify(value)
388
391
  }
389
392
 
390
- function createAgentsTemplate({ themeFile, layoutFile, themePreset, layoutPreset }) {
391
- return `# Agent Rules
392
-
393
- This repo uses \`${PACKAGE_NAME}\` as the default UI library.
394
- Use \`${PACKAGE_NAME}\` for React components and \`${PACKAGE_NAME}/core\` for framework-agnostic theme/runtime contracts.
395
- This repo is locked to the \`${themePreset.label}\` theme preset (\`${themePreset.id}\`).
396
- This repo uses the \`${layoutPreset.label}\` shell preset (\`${layoutPreset.id}\`) as the shared layout baseline.
397
-
398
- Primary references:
399
- - \`node_modules/${PACKAGE_NAME}/README.md\`
400
- - \`node_modules/${PACKAGE_NAME}/AI_SETUP.md\`
401
- - \`uiScreenBlueprint\`, \`uiAiManifest\`, and \`uiThemeLayerAssets\` from \`${PACKAGE_NAME}/core\`
402
- - \`${themeFile}\`
403
- - \`${layoutFile}\`
404
-
405
- Theme preset summary:
406
- - ${themePreset.description}
407
- - Recommended for: ${themePreset.recommendedFor.join(', ')}
408
-
409
- Layout preset summary:
410
- ${renderMarkdownList(layoutPreset.shellRecipe)}
411
-
412
- ## Workspace Base
413
-
414
- For Vite + micro frontend repos, keep this structure stable:
415
-
416
- - \`${PACKAGE_NAME}\` owns the React component surface
417
- - \`${PACKAGE_NAME}/core\` owns theme contracts, bundled theme layers, color-mode runtime, and framework-agnostic contracts
418
- - \`apps/shell\` owns the shared app shell, top-level routing, remote mounts, and theme imports
419
- - \`apps/*-mfe\` owns page-level business screens and feature routes
420
-
421
- If the repo still has a \`packages/shared\` folder, keep it for business utils or internal loaders, not for the primary theme runtime.
422
-
423
- Recommended folders:
424
-
425
- - shell: \`src/app\`, \`src/layouts\`, \`src/routes\`, \`src/remotes\`, \`src/styles/ui-theme.css\`
426
- - remote: \`src/features\`, \`src/pages\`, \`src/routes\`, \`src/services\`, \`src/styles/index.css\`
427
-
428
- Theme layers:
429
-
430
- 1. Import \`${PACKAGE_NAME}/styles.css\` first.
431
- 2. If the repo wants a bundled shell/theme layer, import one from \`${PACKAGE_NAME}/themes/*\` next.
432
- 3. Import \`${themeFile}\` after the bundled theme layer.
433
- 4. Keep app-specific overrides thin and token-based.
434
-
435
- If the bundled theme layer is client-theme-scoped, set \`data-client-theme\` with \`applyDocumentClientTheme(...)\`.
436
-
437
- ## Required Flow
438
-
439
- When asked to build or edit a screen, follow these steps in order:
440
-
441
- 1. Read \`${themeFile}\`, \`${layoutFile}\`, \`node_modules/${PACKAGE_NAME}/README.md\`, \`node_modules/${PACKAGE_NAME}/AI_SETUP.md\`, and the exported \`uiScreenBlueprint\` contract before generating UI.
442
- 2. If the task touches app bootstrap, shell setup, or micro frontend structure, scaffold the repo around the workspace base above before writing page JSX.
443
- 3. Fill the shell brief and screen brief first. If a required field is missing, stop and ask for that exact value before writing JSX. Only leave TODO placeholders when the user explicitly asks for an incomplete scaffold.
444
- 4. Verify the app entry imports \`${PACKAGE_NAME}/styles.css\` first, then any bundled theme layer from \`${PACKAGE_NAME}/themes/*\`, then \`${themeFile}\`.
445
- 5. Treat \`${layoutFile}\` as the source of truth for the app shell. Keep the dark sidebar, gradient topbar, intro card, and card-based body structure aligned with that preset unless the user explicitly asks for a different shell.
446
- 6. Keep the shell in the host app. Do not let a remote rebuild its own global shell unless the task explicitly asks for a standalone shell.
447
- 7. Identify the page kind (\`list | form | detail | dashboard\`), then map each block to canonical components from \`uiAiManifest\` before writing JSX.
448
- 8. Build the shell in this exact order: \`Sidebar\` -> workspace topbar -> intro card (\`Breadcrumb\` + \`PageTitle\`) -> optional segmented tabs -> toolbar card -> page body cards/grids.
449
- 9. For list pages, build the toolbar card first and then the \`DataTable\`. For form pages, keep the same shell and swap the body into section cards and a bottom action row. For detail pages, keep the shell and render summary/detail cards plus related tables. For dashboard pages, keep the shell and render stat cards plus supporting cards/tables.
450
- 10. If \`${layoutFile}\` says a slot is optional, omit it cleanly when the brief does not request it. Do not invent tabs, workspace labels, filters, or toolbar actions.
451
- 11. Keep all colors, radius, surface, and shadow decisions inside \`${themeFile}\`. If the preset is insufficient, update tokens there instead of styling one page ad hoc.
452
- 12. Before finishing, run the output checklist in this file.
453
-
454
- ## Ask For Missing Input
455
-
456
- If any of these are missing, ask the user directly before writing JSX:
457
-
458
- ${renderMarkdownList(layoutPreset.askBeforeCoding)}
459
-
460
- ## Shell Brief
461
-
462
- Complete this shell brief before writing JSX:
463
-
464
- \`\`\`yaml
465
- layoutPreset: ${layoutPreset.id}
466
- workspaceLabel:
467
- timezoneLabel:
468
- userBadgeLabel:
469
- pageTabs:
470
- - value:
471
- label:
472
- activePageTab:
473
- searchPlaceholder:
474
- toolbarNote:
475
- \`\`\`
476
-
477
- ## Screen Brief
393
+ function renderYamlList(items, indent = 2) {
394
+ const prefix = ' '.repeat(indent)
395
+ return items.map((item) => `${prefix}- ${quoteYaml(item)}`).join('\n')
396
+ }
478
397
 
479
- Complete this screen brief before writing JSX:
398
+ function createAgentsTemplate({ themeFile, layoutFile, themePreset, layoutPreset }) {
399
+ const importOrder = [
400
+ `${PACKAGE_NAME}/styles.css`,
401
+ `${PACKAGE_NAME}/themes/*`,
402
+ themeFile,
403
+ ]
404
+ const activationInstructions = [
405
+ 'ONLY load dependency files when user selects them for execution via command or request of a task',
406
+ 'The agent.customization field ALWAYS takes precedence over any conflicting instructions',
407
+ 'When listing commands or presenting options during conversations, always show as numbered options list, allowing the user to type a number to select or execute',
408
+ 'STAY IN CHARACTER!',
409
+ `Read \`${themeFile}\`, \`${layoutFile}\`, \`node_modules/${PACKAGE_NAME}/README.md\`, and \`node_modules/${PACKAGE_NAME}/AI_SETUP.md\` before generating UI`,
410
+ `Lock all UI work to the \`${themePreset.label}\` theme preset (\`${themePreset.id}\`) and the \`${layoutPreset.label}\` shell preset (\`${layoutPreset.id}\`) unless the user explicitly asks to change them`,
411
+ `Keep stylesheet import order as \`${PACKAGE_NAME}/styles.css\` -> optional \`${PACKAGE_NAME}/themes/*\` -> \`${themeFile}\``,
412
+ 'If a bundled theme layer is client-theme-scoped, use `applyDocumentClientTheme(...)` after importing it',
413
+ ]
414
+ const corePrinciples = [
415
+ `CRITICAL: \`${themeFile}\` is the only source of truth for palette, radius, surface, and shadow decisions for this project`,
416
+ `CRITICAL: \`${layoutFile}\` is the source of truth for the shared shell and page frame`,
417
+ 'CRITICAL: Follow the build-screen command when the user asks to implement or update a screen',
418
+ `CRITICAL: Use root exports from \`${PACKAGE_NAME}\` and avoid \`MainFe\` unless the task explicitly targets legacy screens`,
419
+ 'CRITICAL: Keep the host app responsible for sidebar, topbar, remote mount, theme mode, and bundled theme layer activation',
420
+ 'CRITICAL: Ask for missing required brief values before writing JSX unless the user explicitly asks for a scaffold with TODOs',
421
+ 'Numbered Options - Always use numbered lists when presenting choices to the user',
422
+ ]
423
+ const runtimeContracts = [
424
+ `${PACKAGE_NAME}/core -> uiAiManifest`,
425
+ `${PACKAGE_NAME}/core -> uiScreenBlueprint`,
426
+ `${PACKAGE_NAME}/core -> uiThemeContract`,
427
+ `${PACKAGE_NAME}/core -> uiThemeLayerAssets`,
428
+ `${PACKAGE_NAME}/core -> uiThemePresets`,
429
+ ]
430
+ const pageKinds = ['list', 'form', 'detail', 'dashboard']
431
+ const pageFrameRecipes = {
432
+ list: [
433
+ 'dark Sidebar',
434
+ 'workspace topbar',
435
+ 'intro card',
436
+ 'optional segmented tabs',
437
+ 'toolbar Card',
438
+ 'DataTable Card',
439
+ ],
440
+ form: [
441
+ 'dark Sidebar',
442
+ 'workspace topbar',
443
+ 'intro card',
444
+ 'optional segmented tabs',
445
+ 'top actions',
446
+ 'sectioned form Card blocks',
447
+ 'bottom action row',
448
+ ],
449
+ detail: [
450
+ 'dark Sidebar',
451
+ 'workspace topbar',
452
+ 'intro card',
453
+ 'optional segmented tabs',
454
+ 'status/actions',
455
+ 'summary metadata Card',
456
+ 'detail Card blocks',
457
+ 'related DataTable',
458
+ ],
459
+ dashboard: [
460
+ 'dark Sidebar',
461
+ 'workspace topbar',
462
+ 'intro card',
463
+ 'optional segmented tabs',
464
+ 'toolbar Card',
465
+ 'Stat row',
466
+ 'insight Card blocks and DataTable',
467
+ ],
468
+ }
469
+ const hardRules = [
470
+ `import \`${PACKAGE_NAME}/styles.css\` once at the app entry`,
471
+ `import a bundled theme layer from \`${PACKAGE_NAME}/themes/*\` after the package stylesheet when the repo chooses one`,
472
+ 'import the project theme override file after the bundled theme layer',
473
+ 'use `applyDocumentClientTheme` when the chosen bundled theme layer is client-theme-scoped',
474
+ `use root exports from \`${PACKAGE_NAME}\` for React components`,
475
+ `use \`${PACKAGE_NAME}/core\` for theme/runtime utilities in non-React or mixed-framework setup`,
476
+ `use \`${themeFile}\` as the only source of truth for colors, radius, surfaces, and shadows`,
477
+ `use \`${layoutFile}\` as the source of truth for the shell layout and shared page frame`,
478
+ 'keep the host shell responsible for sidebar, topbar, remote mount, and theme mode',
479
+ 'keep remotes focused on feature routes and page business content',
480
+ 'read `uiAiManifest` before choosing components',
481
+ 'read `uiThemeLayerAssets` before choosing a bundled theme layer',
482
+ 'read `uiThemeContract` before changing colors, surfaces, borders, radius, or shadows',
483
+ 'keep UI token-driven and theme-driven',
484
+ ]
485
+ const doNotRules = [
486
+ 'import from `MainFe` unless the task explicitly targets a legacy screen',
487
+ `invent a second palette or one-off brand colors outside \`${themeFile}\``,
488
+ 'replace the shared dark-sidebar + gradient-topbar shell with a flat blank layout unless the user explicitly requests it',
489
+ 'restyle individual pages if the preset tokens can solve it globally',
490
+ 'create duplicate Button/Input/Select wrappers unless a project-specific behavior is required',
491
+ 'let each remote define a different shell or a different palette',
492
+ ]
493
+ const componentChoices = [
494
+ 'Input for short text',
495
+ 'Textarea for multiline text',
496
+ 'Select for small fixed options',
497
+ 'SearchableSelect for larger local option sets',
498
+ 'Combobox for type-and-pick',
499
+ 'AsyncCombobox for remote search',
500
+ 'MultiSelect for multi-pick',
501
+ 'Field only for custom controls or grouped content',
502
+ 'DataTable for tabular records',
503
+ ]
504
+ const outputCheck = [
505
+ 'The shell brief and screen brief are complete',
506
+ 'Any missing required input was explicitly asked for before coding',
507
+ `The shell matches \`${layoutPreset.id}\` with a dark sidebar, gradient topbar, intro card, and card-based body structure`,
508
+ 'The chosen components match the page kind and the brief',
509
+ 'No `MainFe` imports were used',
510
+ 'No hardcoded brand colors were added in page components',
511
+ `Theme decisions live in \`${themeFile}\`, not in ad hoc JSX styling`,
512
+ 'The app entry import order is package stylesheet -> bundled theme layer if present -> project theme override',
513
+ 'The shell still lives in the host app and remotes only own business screens',
514
+ 'Spacing, card structure, and actions are consistent with the shared preset',
515
+ 'The layout shell stayed stable even if the page body changed',
516
+ ]
517
+
518
+ return `# dev
519
+
520
+ CRITICAL: Read the full YAML, start activation to alter your state of being, follow startup section instructions, stay in this being until told to exit this mode:
480
521
 
481
522
  \`\`\`yaml
482
- pageKind: list | form | detail | dashboard
483
- routeUrl:
484
- sidebarItems:
485
- - id:
486
- title:
487
- href:
488
- icon:
489
- activeSidebarItemId:
490
- breadcrumbs:
491
- - label:
492
- href:
493
- current:
494
- pageTitle:
495
- pageSubtitle:
496
- primaryAction:
497
- label:
498
- href:
499
- secondaryActions:
500
- - label:
501
- href:
502
- summaryStats:
503
- - label:
504
- value:
505
- delta:
506
- trend:
507
- filters:
508
- - type:
509
- label:
510
- key:
511
- tableColumns:
512
- - key:
513
- title:
514
- type:
515
- rowActions:
516
- - label:
517
- key:
518
- formSections:
519
- - title:
520
- fields: []
521
- fields:
522
- - name:
523
- type:
524
- label:
525
- required:
526
- helperText:
527
- detailSections:
528
- - title:
529
- type:
530
- emptyState:
531
- title:
532
- description:
533
- actionLabel:
534
- permissions: []
523
+ activation-instructions:
524
+ ${renderYamlList(activationInstructions, 2)}
525
+ agent:
526
+ name: James
527
+ id: dev
528
+ title: Theme-Locked Full Stack Developer
529
+ icon: 💻
530
+ whenToUse: ${quoteYaml(`Use for UI implementation, shell alignment, theme-safe refactors, and development best practices with ${PACKAGE_NAME}`)}
531
+ customization:
532
+ package_name: ${quoteYaml(PACKAGE_NAME)}
533
+ package_core: ${quoteYaml(`${PACKAGE_NAME}/core`)}
534
+ theme_preset_id: ${quoteYaml(themePreset.id)}
535
+ theme_preset_label: ${quoteYaml(themePreset.label)}
536
+ theme_preset_description: ${quoteYaml(themePreset.description)}
537
+ theme_file: ${quoteYaml(themeFile)}
538
+ layout_preset_id: ${quoteYaml(layoutPreset.id)}
539
+ layout_preset_label: ${quoteYaml(layoutPreset.label)}
540
+ layout_preset_description: ${quoteYaml(layoutPreset.description)}
541
+ layout_file: ${quoteYaml(layoutFile)}
542
+ import_order:
543
+ ${renderYamlList(importOrder, 6)}
544
+ recommended_for:
545
+ ${renderYamlList(themePreset.recommendedFor, 6)}
546
+ shell_recipe:
547
+ ${renderYamlList(layoutPreset.shellRecipe, 6)}
548
+ persona:
549
+ role: ${quoteYaml('Expert Senior UI Engineer & Implementation Specialist')}
550
+ style: ${quoteYaml('Extremely concise, pragmatic, detail-oriented, solution-focused')}
551
+ identity: ${quoteYaml(`Expert who implements screens by locking to the selected theme preset, the shared shell contract, and canonical ${PACKAGE_NAME} components`)}
552
+ focus: ${quoteYaml('Executing UI tasks with precision, keeping shell and theme stable, and avoiding ad hoc palette drift')}
553
+ core_principles:
554
+ ${renderYamlList(corePrinciples, 2)}
555
+ commands:
556
+ - help: ${quoteYaml('Show numbered list of available commands, selected theme preset, and shared layout preset')}
557
+ - build-screen:
558
+ - order-of-execution: ${quoteYaml('Read theme and layout source -> fill shell brief + screen brief -> verify stylesheet import order -> map blocks to canonical components -> implement shell/body -> run tests/validations -> summarize changes')}
559
+ - required-inputs:
560
+ ${renderYamlList(layoutPreset.requiredFields, 10)}
561
+ - ask-before-coding:
562
+ ${renderYamlList(layoutPreset.askBeforeCoding, 10)}
563
+ - page-kinds:
564
+ ${renderYamlList(pageKinds, 10)}
565
+ - shell-lock:
566
+ ${renderYamlList(layoutPreset.shellRecipe, 10)}
567
+ - blocking: ${quoteYaml('HALT for: Missing required brief values | conflicting theme instructions | unknown bundled theme activation | failing regression | requests to mix multiple palettes')}
568
+ - ready-for-review: ${quoteYaml('Shell matches the shared preset + Theme stays token-driven + Canonical components are used + Validations pass')}
569
+ - completion: ${quoteYaml('Shell brief complete -> Screen brief complete -> Import order correct -> No MainFe drift -> Tests/validations pass -> Summarize changes')}
570
+ - review-theme: ${quoteYaml('Audit or update theme usage without inventing a second palette')}
571
+ - run-tests: ${quoteYaml('Execute the package build and any relevant validations for the touched files')}
572
+ - explain: ${quoteYaml('Teach me what and why you did whatever you just did in detail so I can learn')}
573
+ - exit: ${quoteYaml('Say goodbye as the Developer, and then abandon inhabiting this persona')}
574
+ dependencies:
575
+ docs:
576
+ ${renderYamlList(['README.md', 'AI_SETUP.md'], 4)}
577
+ project-files:
578
+ ${renderYamlList([themeFile, layoutFile], 4)}
579
+ runtime-contracts:
580
+ ${renderYamlList(runtimeContracts, 4)}
581
+ brief_templates:
582
+ shell:
583
+ layoutPreset: ${quoteYaml(layoutPreset.id)}
584
+ workspaceLabel:
585
+ timezoneLabel:
586
+ userBadgeLabel:
587
+ pageTabs:
588
+ - value:
589
+ label:
590
+ activePageTab:
591
+ searchPlaceholder:
592
+ toolbarNote:
593
+ screen:
594
+ pageKind: ${quoteYaml('list | form | detail | dashboard')}
595
+ routeUrl:
596
+ sidebarItems:
597
+ - id:
598
+ title:
599
+ href:
600
+ icon:
601
+ activeSidebarItemId:
602
+ breadcrumbs:
603
+ - label:
604
+ href:
605
+ current:
606
+ pageTitle:
607
+ pageSubtitle:
608
+ primaryAction:
609
+ label:
610
+ href:
611
+ secondaryActions:
612
+ - label:
613
+ href:
614
+ summaryStats:
615
+ - label:
616
+ value:
617
+ delta:
618
+ trend:
619
+ filters:
620
+ - type:
621
+ label:
622
+ key:
623
+ tableColumns:
624
+ - key:
625
+ title:
626
+ type:
627
+ rowActions:
628
+ - label:
629
+ key:
630
+ formSections:
631
+ - title:
632
+ fields: []
633
+ fields:
634
+ - name:
635
+ type:
636
+ label:
637
+ required:
638
+ helperText:
639
+ detailSections:
640
+ - title:
641
+ type:
642
+ emptyState:
643
+ title:
644
+ description:
645
+ actionLabel:
646
+ permissions: []
647
+ page_frame_recipes:
648
+ list:
649
+ ${renderYamlList(pageFrameRecipes.list, 4)}
650
+ form:
651
+ ${renderYamlList(pageFrameRecipes.form, 4)}
652
+ detail:
653
+ ${renderYamlList(pageFrameRecipes.detail, 4)}
654
+ dashboard:
655
+ ${renderYamlList(pageFrameRecipes.dashboard, 4)}
656
+ implementation_rules:
657
+ hard-rules:
658
+ ${renderYamlList(hardRules, 4)}
659
+ do-not:
660
+ ${renderYamlList(doNotRules, 4)}
661
+ component-choice:
662
+ ${renderYamlList(componentChoices, 4)}
663
+ output_check:
664
+ ${renderYamlList(outputCheck, 2)}
535
665
  \`\`\`
536
-
537
- ## Shell Lock
538
-
539
- Keep the layout aligned with \`${layoutPreset.id}\`:
540
-
541
- ${renderMarkdownList(layoutPreset.shellRecipe)}
542
-
543
- ## Page Frame Recipes
544
-
545
- - \`list\`: dark \`Sidebar\` -> workspace topbar -> intro card -> optional segmented tabs -> toolbar \`Card\` -> \`DataTable\` \`Card\`
546
- - \`form\`: dark \`Sidebar\` -> workspace topbar -> intro card -> optional segmented tabs -> top actions -> sectioned form \`Card\` blocks -> bottom action row
547
- - \`detail\`: dark \`Sidebar\` -> workspace topbar -> intro card -> optional segmented tabs -> status/actions -> summary metadata \`Card\` -> detail \`Card\` blocks -> related \`DataTable\`
548
- - \`dashboard\`: dark \`Sidebar\` -> workspace topbar -> intro card -> optional segmented tabs -> toolbar \`Card\` -> \`Stat\` row -> insight \`Card\` blocks and \`DataTable\`
549
-
550
- ## Hard Rules
551
-
552
- - import \`${PACKAGE_NAME}/styles.css\` once at the app entry
553
- - import a bundled theme layer from \`${PACKAGE_NAME}/themes/*\` after the package stylesheet when the repo chooses one
554
- - import the project theme override file after the bundled theme layer
555
- - use \`applyDocumentClientTheme\` when the chosen bundled theme layer is client-theme-scoped
556
- - use root exports from \`${PACKAGE_NAME}\` for React components
557
- - use \`${PACKAGE_NAME}/core\` for theme/runtime utilities in non-React or mixed-framework setup
558
- - use \`${themeFile}\` as the only source of truth for colors, radius, surfaces, and shadows
559
- - use \`${layoutFile}\` as the source of truth for the shell layout and shared page frame
560
- - keep layouts and component choices aligned with the shared preset-driven UI used across projects
561
- - keep the host shell responsible for sidebar, topbar, remote mount, and theme mode
562
- - keep remotes focused on feature routes and page business content
563
- - read \`uiAiManifest\` before choosing components
564
- - read \`uiThemeLayerAssets\` before choosing a bundled theme layer
565
- - read \`uiThemeContract\` before changing colors, surfaces, borders, radius, or shadows
566
- - keep UI token-driven and theme-driven
567
-
568
- Do not:
569
- - import from \`MainFe\` unless the task explicitly targets a legacy screen
570
- - invent a second palette or one-off brand colors outside \`${themeFile}\`
571
- - replace the shared dark-sidebar + gradient-topbar shell with a flat blank layout unless the user explicitly requests it
572
- - restyle individual pages if the preset tokens can solve it globally
573
- - create duplicate Button/Input/Select wrappers unless a project-specific behavior is required
574
- - let each remote define a different shell or a different palette
575
-
576
- ## Component Choice
577
-
578
- - \`Input\` for short text
579
- - \`Textarea\` for multiline text
580
- - \`Select\` for small fixed options
581
- - \`SearchableSelect\` for larger local option sets
582
- - \`Combobox\` for type-and-pick
583
- - \`AsyncCombobox\` for remote search
584
- - \`MultiSelect\` for multi-pick
585
- - \`Field\` only for custom controls or grouped content
586
- - \`DataTable\` for tabular records
587
-
588
- ## Output Check
589
-
590
- Before finishing, confirm all of these are true:
591
-
592
- - The shell brief and screen brief are complete.
593
- - Any missing required input was explicitly asked for before coding.
594
- - The shell matches \`${layoutPreset.id}\` with a dark sidebar, gradient topbar, intro card, and card-based body structure.
595
- - The chosen components match the page kind and the brief.
596
- - No \`MainFe\` imports were used.
597
- - No hardcoded brand colors were added in page components.
598
- - Theme decisions live in \`${themeFile}\`, not in ad hoc JSX styling.
599
- - The app entry import order is package stylesheet -> bundled theme layer if present -> project theme override.
600
- - The shell still lives in the host app and remotes only own business screens.
601
- - Spacing, card structure, and actions are consistent with the shared preset.
602
- - The layout shell stayed stable even if the page body changed.
603
666
  `
604
667
  }
605
668
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lucasvu/scope-ui",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",