@qijenchen/design-system 0.1.0-beta.13 → 0.1.0-beta.130
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/AGENTS.md +8 -0
- package/CLAUDE.md +3 -199
- package/README.md +6 -4
- package/cli-init.mjs +30 -2
- package/dist/components/Accordion/accordion.d.ts +3 -3
- package/dist/components/Accordion/accordion.d.ts.map +1 -1
- package/dist/components/Accordion/accordion.js +6 -3
- package/dist/components/Accordion/accordion.js.map +1 -1
- package/dist/components/Accordion/index.d.ts +2 -0
- package/dist/components/Accordion/index.d.ts.map +1 -0
- package/dist/components/Accordion/index.js +9 -0
- package/dist/components/Accordion/index.js.map +1 -0
- package/dist/components/AccountMenu/account-menu.d.ts +93 -0
- package/dist/components/AccountMenu/account-menu.d.ts.map +1 -0
- package/dist/components/AccountMenu/account-menu.js +73 -0
- package/dist/components/AccountMenu/account-menu.js.map +1 -0
- package/dist/components/AccountMenu/index.d.ts +2 -0
- package/dist/components/AccountMenu/index.d.ts.map +1 -0
- package/dist/components/AccountMenu/index.js +6 -0
- package/dist/components/AccountMenu/index.js.map +1 -0
- package/dist/components/AgentPanel/agent-fab.d.ts +24 -0
- package/dist/components/AgentPanel/agent-fab.d.ts.map +1 -0
- package/dist/components/AgentPanel/agent-logo.d.ts +40 -0
- package/dist/components/AgentPanel/agent-logo.d.ts.map +1 -0
- package/dist/components/AgentPanel/agent-logo.js +344 -0
- package/dist/components/AgentPanel/agent-logo.js.map +1 -0
- package/dist/components/AgentPanel/agent-panel.d.ts +148 -0
- package/dist/components/AgentPanel/agent-panel.d.ts.map +1 -0
- package/dist/components/AgentPanel/agent-panel.js +670 -0
- package/dist/components/AgentPanel/agent-panel.js.map +1 -0
- package/dist/components/AgentPanel/index.d.ts +2 -0
- package/dist/components/AgentPanel/index.d.ts.map +1 -0
- package/dist/components/AgentPanel/index.js +13 -0
- package/dist/components/AgentPanel/index.js.map +1 -0
- package/dist/components/Alert/alert.d.ts +7 -2
- package/dist/components/Alert/alert.d.ts.map +1 -1
- package/dist/components/Alert/alert.js +12 -8
- package/dist/components/Alert/alert.js.map +1 -1
- package/dist/components/Alert/index.d.ts +2 -0
- package/dist/components/Alert/index.d.ts.map +1 -0
- package/dist/components/Alert/index.js +7 -0
- package/dist/components/Alert/index.js.map +1 -0
- package/dist/components/AppShell/_demo-helpers.d.ts +3 -1
- package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
- package/dist/components/AppShell/app-shell.d.ts +19 -4
- package/dist/components/AppShell/app-shell.d.ts.map +1 -1
- package/dist/components/AppShell/app-shell.js +48 -11
- package/dist/components/AppShell/app-shell.js.map +1 -1
- package/dist/components/AppShell/index.d.ts +2 -0
- package/dist/components/AppShell/index.d.ts.map +1 -0
- package/dist/components/AppShell/index.js +8 -0
- package/dist/components/AppShell/index.js.map +1 -0
- package/dist/components/AspectRatio/aspect-ratio.d.ts +3 -2
- package/dist/components/AspectRatio/aspect-ratio.d.ts.map +1 -1
- package/dist/components/AspectRatio/aspect-ratio.js +4 -2
- package/dist/components/AspectRatio/aspect-ratio.js.map +1 -1
- package/dist/components/AspectRatio/index.d.ts +2 -0
- package/dist/components/AspectRatio/index.d.ts.map +1 -0
- package/dist/components/AspectRatio/index.js +6 -0
- package/dist/components/AspectRatio/index.js.map +1 -0
- package/dist/components/Avatar/avatar.d.ts +14 -7
- package/dist/components/Avatar/avatar.d.ts.map +1 -1
- package/dist/components/Avatar/avatar.js +24 -30
- package/dist/components/Avatar/avatar.js.map +1 -1
- package/dist/components/Avatar/index.d.ts +2 -0
- package/dist/components/Avatar/index.d.ts.map +1 -0
- package/dist/components/Avatar/index.js +6 -0
- package/dist/components/Avatar/index.js.map +1 -0
- package/dist/components/Badge/badge.d.ts +21 -9
- package/dist/components/Badge/badge.d.ts.map +1 -1
- package/dist/components/Badge/badge.js +9 -6
- package/dist/components/Badge/badge.js.map +1 -1
- package/dist/components/Badge/index.d.ts +2 -0
- package/dist/components/Badge/index.d.ts.map +1 -0
- package/dist/components/Badge/index.js +7 -0
- package/dist/components/Badge/index.js.map +1 -0
- package/dist/components/Breadcrumb/breadcrumb.d.ts +16 -3
- package/dist/components/Breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/Breadcrumb/breadcrumb.js +21 -53
- package/dist/components/Breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/Breadcrumb/index.d.ts +2 -0
- package/dist/components/Breadcrumb/index.d.ts.map +1 -0
- package/dist/components/Breadcrumb/index.js +12 -0
- package/dist/components/Breadcrumb/index.js.map +1 -0
- package/dist/components/BulkActionBar/bulk-action-bar.d.ts +7 -4
- package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -1
- package/dist/components/BulkActionBar/bulk-action-bar.js +8 -8
- package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -1
- package/dist/components/BulkActionBar/index.d.ts +2 -0
- package/dist/components/BulkActionBar/index.d.ts.map +1 -0
- package/dist/components/BulkActionBar/index.js +7 -0
- package/dist/components/BulkActionBar/index.js.map +1 -0
- package/dist/components/Button/button-group.d.ts +31 -5
- package/dist/components/Button/button-group.d.ts.map +1 -1
- package/dist/components/Button/button-group.js +31 -14
- package/dist/components/Button/button-group.js.map +1 -1
- package/dist/components/Button/button.d.ts +15 -14
- package/dist/components/Button/button.d.ts.map +1 -1
- package/dist/components/Button/button.js +94 -52
- package/dist/components/Button/button.js.map +1 -1
- package/dist/components/Button/index.d.ts +3 -0
- package/dist/components/Button/index.d.ts.map +1 -0
- package/dist/components/Button/index.js +11 -0
- package/dist/components/Button/index.js.map +1 -0
- package/dist/components/Calendar/calendar.d.ts +22 -19
- package/dist/components/Calendar/calendar.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.js +180 -135
- package/dist/components/Calendar/calendar.js.map +1 -1
- package/dist/components/Calendar/index.d.ts +2 -0
- package/dist/components/Calendar/index.d.ts.map +1 -0
- package/dist/components/Calendar/index.js +6 -0
- package/dist/components/Calendar/index.js.map +1 -0
- package/dist/components/Carousel/carousel.d.ts +15 -9
- package/dist/components/Carousel/carousel.d.ts.map +1 -1
- package/dist/components/Carousel/carousel.js +91 -50
- package/dist/components/Carousel/carousel.js.map +1 -1
- package/dist/components/Carousel/index.d.ts +2 -0
- package/dist/components/Carousel/index.d.ts.map +1 -0
- package/dist/components/Carousel/index.js +11 -0
- package/dist/components/Carousel/index.js.map +1 -0
- package/dist/components/Chart/chart.d.ts +2 -2
- package/dist/components/Chart/chart.d.ts.map +1 -1
- package/dist/components/Chart/chart.js +5 -2
- package/dist/components/Chart/chart.js.map +1 -1
- package/dist/components/Chart/index.d.ts +2 -0
- package/dist/components/Chart/index.d.ts.map +1 -0
- package/dist/components/Chart/index.js +11 -0
- package/dist/components/Chart/index.js.map +1 -0
- package/dist/components/Checkbox/checkbox-group.d.ts +2 -1
- package/dist/components/Checkbox/checkbox-group.d.ts.map +1 -1
- package/dist/components/Checkbox/checkbox-group.js +21 -14
- package/dist/components/Checkbox/checkbox-group.js.map +1 -1
- package/dist/components/Checkbox/checkbox.d.ts +20 -11
- package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/checkbox.js +117 -18
- package/dist/components/Checkbox/checkbox.js.map +1 -1
- package/dist/components/Checkbox/index.d.ts +3 -0
- package/dist/components/Checkbox/index.d.ts.map +1 -0
- package/dist/components/Checkbox/index.js +10 -0
- package/dist/components/Checkbox/index.js.map +1 -0
- package/dist/components/Chip/chip.d.ts +30 -11
- package/dist/components/Chip/chip.d.ts.map +1 -1
- package/dist/components/Chip/chip.js +83 -33
- package/dist/components/Chip/chip.js.map +1 -1
- package/dist/components/Chip/index.d.ts +2 -0
- package/dist/components/Chip/index.d.ts.map +1 -0
- package/dist/components/Chip/index.js +8 -0
- package/dist/components/Chip/index.js.map +1 -0
- package/dist/components/CircularProgress/circular-progress.d.ts +2 -3
- package/dist/components/CircularProgress/circular-progress.d.ts.map +1 -1
- package/dist/components/CircularProgress/circular-progress.js +5 -4
- package/dist/components/CircularProgress/circular-progress.js.map +1 -1
- package/dist/components/CircularProgress/index.d.ts +2 -0
- package/dist/components/CircularProgress/index.d.ts.map +1 -0
- package/dist/components/CircularProgress/index.js +6 -0
- package/dist/components/CircularProgress/index.js.map +1 -0
- package/dist/components/Coachmark/coachmark-story-helpers.d.ts +22 -0
- package/dist/components/Coachmark/coachmark-story-helpers.d.ts.map +1 -0
- package/dist/components/Coachmark/coachmark.d.ts +15 -6
- package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
- package/dist/components/Coachmark/coachmark.js +12 -4
- package/dist/components/Coachmark/coachmark.js.map +1 -1
- package/dist/components/Coachmark/index.d.ts +2 -0
- package/dist/components/Coachmark/index.d.ts.map +1 -0
- package/dist/components/Coachmark/index.js +6 -0
- package/dist/components/Coachmark/index.js.map +1 -0
- package/dist/components/Combobox/combobox.d.ts +39 -15
- package/dist/components/Combobox/combobox.d.ts.map +1 -1
- package/dist/components/Combobox/combobox.js +169 -65
- package/dist/components/Combobox/combobox.js.map +1 -1
- package/dist/components/Combobox/index.d.ts +2 -0
- package/dist/components/Combobox/index.d.ts.map +1 -0
- package/dist/components/Combobox/index.js +6 -0
- package/dist/components/Combobox/index.js.map +1 -0
- package/dist/components/Command/command.d.ts +7 -3
- package/dist/components/Command/command.d.ts.map +1 -1
- package/dist/components/Command/command.js +23 -10
- package/dist/components/Command/command.js.map +1 -1
- package/dist/components/Command/index.d.ts +2 -0
- package/dist/components/Command/index.d.ts.map +1 -0
- package/dist/components/Command/index.js +14 -0
- package/dist/components/Command/index.js.map +1 -0
- package/dist/components/DataTable/active-editor-controller.d.ts +4 -3
- package/dist/components/DataTable/active-editor-controller.d.ts.map +1 -1
- package/dist/components/DataTable/cell-registry.d.ts +5 -5
- package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
- package/dist/components/DataTable/cell-registry.js +89 -95
- package/dist/components/DataTable/cell-registry.js.map +1 -1
- package/dist/components/DataTable/column-types.d.ts +11 -21
- package/dist/components/DataTable/column-types.d.ts.map +1 -1
- package/dist/components/DataTable/column-types.js.map +1 -1
- package/dist/components/DataTable/data-table-column-visibility-panel.d.ts +4 -3
- package/dist/components/DataTable/data-table-column-visibility-panel.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-column-visibility-panel.js +193 -0
- package/dist/components/DataTable/data-table-column-visibility-panel.js.map +1 -0
- package/dist/components/DataTable/data-table-filter-group.d.ts +51 -0
- package/dist/components/DataTable/data-table-filter-group.d.ts.map +1 -0
- package/dist/components/DataTable/data-table-filter-group.js +159 -0
- package/dist/components/DataTable/data-table-filter-group.js.map +1 -0
- package/dist/components/DataTable/data-table-filter-labels.d.ts +44 -0
- package/dist/components/DataTable/data-table-filter-labels.d.ts.map +1 -0
- package/dist/components/DataTable/data-table-filter-labels.js +55 -0
- package/dist/components/DataTable/data-table-filter-labels.js.map +1 -0
- package/dist/components/DataTable/data-table-filter-panel.d.ts +12 -3
- package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-filter-panel.js +316 -0
- package/dist/components/DataTable/data-table-filter-panel.js.map +1 -0
- package/dist/components/DataTable/data-table-filter-value-picker.d.ts +32 -0
- package/dist/components/DataTable/data-table-filter-value-picker.d.ts.map +1 -0
- package/dist/components/DataTable/data-table-filter-value-picker.js +205 -0
- package/dist/components/DataTable/data-table-filter-value-picker.js.map +1 -0
- package/dist/components/DataTable/data-table-interaction-layer.d.ts +17 -20
- package/dist/components/DataTable/data-table-interaction-layer.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-interaction-layer.js +1 -3
- package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -1
- package/dist/components/DataTable/data-table-sort-manager.d.ts +5 -5
- package/dist/components/DataTable/data-table-sort-manager.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-sort-manager.js +150 -0
- package/dist/components/DataTable/data-table-sort-manager.js.map +1 -0
- package/dist/components/DataTable/data-table.d.ts +66 -15
- package/dist/components/DataTable/data-table.d.ts.map +1 -1
- package/dist/components/DataTable/data-table.js +367 -185
- package/dist/components/DataTable/data-table.js.map +1 -1
- package/dist/components/DataTable/filter-operators.d.ts +1 -1
- package/dist/components/DataTable/filter-operators.js +140 -0
- package/dist/components/DataTable/filter-operators.js.map +1 -0
- package/dist/components/DataTable/filter-tree.d.ts +6 -1
- package/dist/components/DataTable/filter-tree.d.ts.map +1 -1
- package/dist/components/DataTable/filter-tree.js +318 -0
- package/dist/components/DataTable/filter-tree.js.map +1 -0
- package/dist/components/DataTable/index.d.ts +5 -0
- package/dist/components/DataTable/index.d.ts.map +1 -0
- package/dist/components/DataTable/index.js +21 -0
- package/dist/components/DataTable/index.js.map +1 -0
- package/dist/components/DataTable/lib/column-meta.js +25 -0
- package/dist/components/DataTable/lib/column-meta.js.map +1 -0
- package/dist/components/DateGrid/date-grid.d.ts +23 -19
- package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
- package/dist/components/DateGrid/date-grid.js +60 -12
- package/dist/components/DateGrid/date-grid.js.map +1 -1
- package/dist/components/DateGrid/index.d.ts +2 -0
- package/dist/components/DateGrid/index.d.ts.map +1 -0
- package/dist/components/DateGrid/index.js +6 -0
- package/dist/components/DateGrid/index.js.map +1 -0
- package/dist/components/DatePicker/date-picker.d.ts +12 -12
- package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
- package/dist/components/DatePicker/date-picker.js +418 -309
- package/dist/components/DatePicker/date-picker.js.map +1 -1
- package/dist/components/DatePicker/index.d.ts +2 -0
- package/dist/components/DatePicker/index.d.ts.map +1 -0
- package/dist/components/DatePicker/index.js +8 -0
- package/dist/components/DatePicker/index.js.map +1 -0
- package/dist/components/DescriptionList/description-list.d.ts +6 -6
- package/dist/components/DescriptionList/description-list.d.ts.map +1 -1
- package/dist/components/DescriptionList/description-list.js +11 -10
- package/dist/components/DescriptionList/description-list.js.map +1 -1
- package/dist/components/DescriptionList/index.d.ts +2 -0
- package/dist/components/DescriptionList/index.d.ts.map +1 -0
- package/dist/components/DescriptionList/index.js +7 -0
- package/dist/components/DescriptionList/index.js.map +1 -0
- package/dist/components/Dialog/dialog.d.ts +22 -5
- package/dist/components/Dialog/dialog.d.ts.map +1 -1
- package/dist/components/Dialog/dialog.js +44 -23
- package/dist/components/Dialog/dialog.js.map +1 -1
- package/dist/components/Dialog/index.d.ts +2 -0
- package/dist/components/Dialog/index.d.ts.map +1 -0
- package/dist/components/Dialog/index.js +16 -0
- package/dist/components/Dialog/index.js.map +1 -0
- package/dist/components/DropdownMenu/dropdown-menu.d.ts +19 -10
- package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/DropdownMenu/dropdown-menu.js +79 -28
- package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
- package/dist/components/DropdownMenu/index.d.ts +2 -0
- package/dist/components/DropdownMenu/index.d.ts.map +1 -0
- package/dist/components/DropdownMenu/index.js +21 -0
- package/dist/components/DropdownMenu/index.js.map +1 -0
- package/dist/components/Empty/empty.d.ts +14 -6
- package/dist/components/Empty/empty.d.ts.map +1 -1
- package/dist/components/Empty/empty.js +7 -7
- package/dist/components/Empty/empty.js.map +1 -1
- package/dist/components/Empty/index.d.ts +2 -0
- package/dist/components/Empty/index.d.ts.map +1 -0
- package/dist/components/Empty/index.js +6 -0
- package/dist/components/Empty/index.js.map +1 -0
- package/dist/components/Field/field-context.d.ts +111 -4
- package/dist/components/Field/field-context.d.ts.map +1 -1
- package/dist/components/Field/field-context.js +70 -0
- package/dist/components/Field/field-context.js.map +1 -1
- package/dist/components/Field/field-edit-keys.d.ts +21 -0
- package/dist/components/Field/field-edit-keys.d.ts.map +1 -0
- package/dist/components/Field/field-edit-keys.js +19 -0
- package/dist/components/Field/field-edit-keys.js.map +1 -0
- package/dist/components/Field/field-types.d.ts +22 -3
- package/dist/components/Field/field-types.d.ts.map +1 -1
- package/dist/components/Field/field-types.js.map +1 -1
- package/dist/components/Field/field-wrapper.d.ts +24 -6
- package/dist/components/Field/field-wrapper.d.ts.map +1 -1
- package/dist/components/Field/field-wrapper.js +98 -74
- package/dist/components/Field/field-wrapper.js.map +1 -1
- package/dist/components/Field/field.d.ts +7 -4
- package/dist/components/Field/field.d.ts.map +1 -1
- package/dist/components/Field/field.js +39 -6
- package/dist/components/Field/field.js.map +1 -1
- package/dist/components/Field/index.d.ts +3 -0
- package/dist/components/Field/index.d.ts.map +1 -0
- package/dist/components/Field/index.js +14 -0
- package/dist/components/Field/index.js.map +1 -0
- package/dist/components/Field/use-form-validation.d.ts +92 -0
- package/dist/components/Field/use-form-validation.d.ts.map +1 -0
- package/dist/components/Field/use-form-validation.js +137 -0
- package/dist/components/Field/use-form-validation.js.map +1 -0
- package/dist/components/FieldControlGroup/field-control-group.d.ts +8 -11
- package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -1
- package/dist/components/FieldControlGroup/field-control-group.js +2 -2
- package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
- package/dist/components/FieldControlGroup/index.d.ts +2 -0
- package/dist/components/FieldControlGroup/index.d.ts.map +1 -0
- package/dist/components/FieldControlGroup/index.js +6 -0
- package/dist/components/FieldControlGroup/index.js.map +1 -0
- package/dist/components/FileItem/file-item.d.ts +14 -2
- package/dist/components/FileItem/file-item.d.ts.map +1 -1
- package/dist/components/FileItem/file-item.js +45 -16
- package/dist/components/FileItem/file-item.js.map +1 -1
- package/dist/components/FileItem/index.d.ts +2 -0
- package/dist/components/FileItem/index.d.ts.map +1 -0
- package/dist/components/FileItem/index.js +6 -0
- package/dist/components/FileItem/index.js.map +1 -0
- package/dist/components/FileUpload/file-upload.d.ts +39 -19
- package/dist/components/FileUpload/file-upload.d.ts.map +1 -1
- package/dist/components/FileUpload/file-upload.js +102 -32
- package/dist/components/FileUpload/file-upload.js.map +1 -1
- package/dist/components/FileUpload/index.d.ts +2 -0
- package/dist/components/FileUpload/index.d.ts.map +1 -0
- package/dist/components/FileUpload/index.js +6 -0
- package/dist/components/FileUpload/index.js.map +1 -0
- package/dist/components/FileViewer/can-render-image.d.ts +6 -0
- package/dist/components/FileViewer/can-render-image.d.ts.map +1 -0
- package/dist/components/FileViewer/can-render-image.js +11 -0
- package/dist/components/FileViewer/can-render-image.js.map +1 -0
- package/dist/components/FileViewer/file-viewer.d.ts +4 -4
- package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
- package/dist/components/FileViewer/file-viewer.js +88 -50
- package/dist/components/FileViewer/file-viewer.js.map +1 -1
- package/dist/components/FileViewer/image-renderer.d.ts +0 -5
- package/dist/components/FileViewer/image-renderer.d.ts.map +1 -1
- package/dist/components/FileViewer/image-renderer.js +23 -10
- package/dist/components/FileViewer/image-renderer.js.map +1 -1
- package/dist/components/FileViewer/index.d.ts +2 -0
- package/dist/components/FileViewer/index.d.ts.map +1 -0
- package/dist/components/FileViewer/index.js +7 -0
- package/dist/components/FileViewer/index.js.map +1 -0
- package/dist/components/HoverCard/hover-card.d.ts +9 -5
- package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
- package/dist/components/HoverCard/hover-card.js +12 -5
- package/dist/components/HoverCard/hover-card.js.map +1 -1
- package/dist/components/HoverCard/index.d.ts +2 -0
- package/dist/components/HoverCard/index.d.ts.map +1 -0
- package/dist/components/HoverCard/index.js +8 -0
- package/dist/components/HoverCard/index.js.map +1 -0
- package/dist/components/InlineEdit/index.d.ts +2 -0
- package/dist/components/InlineEdit/index.d.ts.map +1 -0
- package/dist/components/InlineEdit/index.js +6 -0
- package/dist/components/InlineEdit/index.js.map +1 -0
- package/dist/components/InlineEdit/inline-edit.d.ts +86 -0
- package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -0
- package/dist/components/InlineEdit/inline-edit.js +254 -0
- package/dist/components/InlineEdit/inline-edit.js.map +1 -0
- package/dist/components/Input/index.d.ts +2 -0
- package/dist/components/Input/index.d.ts.map +1 -0
- package/dist/components/Input/index.js +6 -0
- package/dist/components/Input/index.js.map +1 -0
- package/dist/components/Input/input.d.ts +31 -10
- package/dist/components/Input/input.d.ts.map +1 -1
- package/dist/components/Input/input.js +67 -30
- package/dist/components/Input/input.js.map +1 -1
- package/dist/components/LinkInput/index.d.ts +2 -0
- package/dist/components/LinkInput/index.d.ts.map +1 -0
- package/dist/components/LinkInput/index.js +6 -0
- package/dist/components/LinkInput/index.js.map +1 -0
- package/dist/components/LinkInput/link-input.d.ts +9 -9
- package/dist/components/LinkInput/link-input.d.ts.map +1 -1
- package/dist/components/LinkInput/link-input.js +40 -37
- package/dist/components/LinkInput/link-input.js.map +1 -1
- package/dist/components/Menu/index.d.ts +2 -0
- package/dist/components/Menu/index.d.ts.map +1 -0
- package/dist/components/Menu/index.js +9 -0
- package/dist/components/Menu/index.js.map +1 -0
- package/dist/components/Menu/menu-item.d.ts +20 -4
- package/dist/components/Menu/menu-item.d.ts.map +1 -1
- package/dist/components/Menu/menu-item.js +37 -9
- package/dist/components/Menu/menu-item.js.map +1 -1
- package/dist/components/Notice/index.d.ts +2 -0
- package/dist/components/Notice/index.d.ts.map +1 -0
- package/dist/components/Notice/index.js +8 -0
- package/dist/components/Notice/index.js.map +1 -0
- package/dist/components/Notice/notice.d.ts +35 -7
- package/dist/components/Notice/notice.d.ts.map +1 -1
- package/dist/components/Notice/notice.js +34 -10
- package/dist/components/Notice/notice.js.map +1 -1
- package/dist/components/NumberInput/index.d.ts +2 -0
- package/dist/components/NumberInput/index.d.ts.map +1 -0
- package/dist/components/NumberInput/index.js +7 -0
- package/dist/components/NumberInput/index.js.map +1 -0
- package/dist/components/NumberInput/number-input.d.ts +5 -5
- package/dist/components/NumberInput/number-input.d.ts.map +1 -1
- package/dist/components/NumberInput/number-input.js +40 -18
- package/dist/components/NumberInput/number-input.js.map +1 -1
- package/dist/components/OverflowIndicator/index.d.ts +2 -0
- package/dist/components/OverflowIndicator/index.d.ts.map +1 -0
- package/dist/components/OverflowIndicator/index.js +6 -0
- package/dist/components/OverflowIndicator/index.js.map +1 -0
- package/dist/components/OverflowIndicator/overflow-indicator.d.ts +6 -2
- package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -1
- package/dist/components/OverflowIndicator/overflow-indicator.js +11 -7
- package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
- package/dist/components/Pagination/index.d.ts +2 -0
- package/dist/components/Pagination/index.d.ts.map +1 -0
- package/dist/components/Pagination/index.js +6 -0
- package/dist/components/Pagination/index.js.map +1 -0
- package/dist/components/Pagination/pagination.d.ts +49 -0
- package/dist/components/Pagination/pagination.d.ts.map +1 -0
- package/dist/components/Pagination/pagination.js +182 -0
- package/dist/components/Pagination/pagination.js.map +1 -0
- package/dist/components/PeoplePicker/avatar-stack-overflow.d.ts +1 -1
- package/dist/components/PeoplePicker/avatar-stack-overflow.js.map +1 -1
- package/dist/components/PeoplePicker/index.d.ts +2 -0
- package/dist/components/PeoplePicker/index.d.ts.map +1 -0
- package/dist/components/PeoplePicker/index.js +15 -0
- package/dist/components/PeoplePicker/index.js.map +1 -0
- package/dist/components/PeoplePicker/people-picker-helpers.d.ts.map +1 -1
- package/dist/components/PeoplePicker/people-picker-helpers.js +2 -2
- package/dist/components/PeoplePicker/people-picker-helpers.js.map +1 -1
- package/dist/components/PeoplePicker/people-picker.d.ts +26 -10
- package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
- package/dist/components/PeoplePicker/people-picker.js +97 -65
- package/dist/components/PeoplePicker/people-picker.js.map +1 -1
- package/dist/components/PeoplePicker/person-display.d.ts +19 -11
- package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
- package/dist/components/PeoplePicker/person-display.js +39 -23
- package/dist/components/PeoplePicker/person-display.js.map +1 -1
- package/dist/components/Popover/index.d.ts +2 -0
- package/dist/components/Popover/index.d.ts.map +1 -0
- package/dist/components/Popover/index.js +14 -0
- package/dist/components/Popover/index.js.map +1 -0
- package/dist/components/Popover/popover.d.ts +2 -2
- package/dist/components/Popover/popover.d.ts.map +1 -1
- package/dist/components/Popover/popover.js +72 -42
- package/dist/components/Popover/popover.js.map +1 -1
- package/dist/components/ProfileCard/index.d.ts +2 -0
- package/dist/components/ProfileCard/index.d.ts.map +1 -0
- package/dist/components/ProfileCard/index.js +8 -0
- package/dist/components/ProfileCard/index.js.map +1 -0
- package/dist/components/{NameCard/name-card.d.ts → ProfileCard/profile-card.d.ts} +34 -20
- package/dist/components/ProfileCard/profile-card.d.ts.map +1 -0
- package/dist/components/{NameCard/name-card.js → ProfileCard/profile-card.js} +27 -16
- package/dist/components/ProfileCard/profile-card.js.map +1 -0
- package/dist/components/ProgressBar/index.d.ts +2 -0
- package/dist/components/ProgressBar/index.d.ts.map +1 -0
- package/dist/components/ProgressBar/index.js +6 -0
- package/dist/components/ProgressBar/index.js.map +1 -0
- package/dist/components/ProgressBar/progress-bar.d.ts +2 -14
- package/dist/components/ProgressBar/progress-bar.d.ts.map +1 -1
- package/dist/components/ProgressBar/progress-bar.js +5 -9
- package/dist/components/ProgressBar/progress-bar.js.map +1 -1
- package/dist/components/RadioGroup/index.d.ts +2 -0
- package/dist/components/RadioGroup/index.d.ts.map +1 -0
- package/dist/components/RadioGroup/index.js +8 -0
- package/dist/components/RadioGroup/index.js.map +1 -0
- package/dist/components/RadioGroup/radio-group.d.ts +18 -12
- package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
- package/dist/components/RadioGroup/radio-group.js +131 -40
- package/dist/components/RadioGroup/radio-group.js.map +1 -1
- package/dist/components/Rating/index.d.ts +2 -0
- package/dist/components/Rating/index.d.ts.map +1 -0
- package/dist/components/Rating/index.js +6 -0
- package/dist/components/Rating/index.js.map +1 -0
- package/dist/components/Rating/rating.d.ts +6 -2
- package/dist/components/Rating/rating.d.ts.map +1 -1
- package/dist/components/Rating/rating.js +17 -10
- package/dist/components/Rating/rating.js.map +1 -1
- package/dist/components/ScrollArea/index.d.ts +2 -0
- package/dist/components/ScrollArea/index.d.ts.map +1 -0
- package/dist/components/ScrollArea/index.js +7 -0
- package/dist/components/ScrollArea/index.js.map +1 -0
- package/dist/components/ScrollArea/scroll-area.d.ts +16 -4
- package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -1
- package/dist/components/ScrollArea/scroll-area.js +9 -6
- package/dist/components/ScrollArea/scroll-area.js.map +1 -1
- package/dist/components/SegmentedControl/index.d.ts +2 -0
- package/dist/components/SegmentedControl/index.d.ts.map +1 -0
- package/dist/components/SegmentedControl/index.js +9 -0
- package/dist/components/SegmentedControl/index.js.map +1 -0
- package/dist/components/SegmentedControl/segmented-control.d.ts +8 -7
- package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -1
- package/dist/components/SegmentedControl/segmented-control.js +31 -20
- package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
- package/dist/components/Select/index.d.ts +2 -0
- package/dist/components/Select/index.d.ts.map +1 -0
- package/dist/components/Select/index.js +6 -0
- package/dist/components/Select/index.js.map +1 -0
- package/dist/components/Select/select.d.ts +70 -13
- package/dist/components/Select/select.d.ts.map +1 -1
- package/dist/components/Select/select.js +271 -83
- package/dist/components/Select/select.js.map +1 -1
- package/dist/components/SelectMenu/index.d.ts +2 -0
- package/dist/components/SelectMenu/index.d.ts.map +1 -0
- package/dist/components/SelectMenu/index.js +8 -0
- package/dist/components/SelectMenu/index.js.map +1 -0
- package/dist/components/SelectMenu/select-menu.d.ts +61 -10
- package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
- package/dist/components/SelectMenu/select-menu.js +216 -93
- package/dist/components/SelectMenu/select-menu.js.map +1 -1
- package/dist/components/SelectionControl/boolean-value.d.ts +11 -0
- package/dist/components/SelectionControl/boolean-value.d.ts.map +1 -0
- package/dist/components/SelectionControl/boolean-value.js +23 -0
- package/dist/components/SelectionControl/boolean-value.js.map +1 -0
- package/dist/components/SelectionControl/index.d.ts +3 -0
- package/dist/components/SelectionControl/index.d.ts.map +1 -0
- package/dist/components/SelectionControl/index.js +9 -0
- package/dist/components/SelectionControl/index.js.map +1 -0
- package/dist/components/SelectionControl/selection-item.d.ts +5 -1
- package/dist/components/SelectionControl/selection-item.d.ts.map +1 -1
- package/dist/components/SelectionControl/selection-item.js +3 -1
- package/dist/components/SelectionControl/selection-item.js.map +1 -1
- package/dist/components/Separator/index.d.ts +2 -0
- package/dist/components/Separator/index.d.ts.map +1 -0
- package/dist/components/Separator/index.js +6 -0
- package/dist/components/Separator/index.js.map +1 -0
- package/dist/components/Separator/separator.d.ts +2 -2
- package/dist/components/Separator/separator.js +4 -3
- package/dist/components/Separator/separator.js.map +1 -1
- package/dist/components/Sheet/index.d.ts +2 -0
- package/dist/components/Sheet/index.d.ts.map +1 -0
- package/dist/components/Sheet/index.js +18 -0
- package/dist/components/Sheet/index.js.map +1 -0
- package/dist/components/Sheet/sheet.d.ts +15 -8
- package/dist/components/Sheet/sheet.d.ts.map +1 -1
- package/dist/components/Sheet/sheet.js +9 -5
- package/dist/components/Sheet/sheet.js.map +1 -1
- package/dist/components/Sidebar/index.d.ts +2 -0
- package/dist/components/Sidebar/index.d.ts.map +1 -0
- package/dist/components/Sidebar/index.js +24 -0
- package/dist/components/Sidebar/index.js.map +1 -0
- package/dist/components/Sidebar/sidebar.d.ts +17 -11
- package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/Sidebar/sidebar.js +78 -35
- package/dist/components/Sidebar/sidebar.js.map +1 -1
- package/dist/components/Skeleton/index.d.ts +2 -0
- package/dist/components/Skeleton/index.d.ts.map +1 -0
- package/dist/components/Skeleton/index.js +6 -0
- package/dist/components/Skeleton/index.js.map +1 -0
- package/dist/components/Skeleton/skeleton.d.ts +2 -2
- package/dist/components/Skeleton/skeleton.js +4 -3
- package/dist/components/Skeleton/skeleton.js.map +1 -1
- package/dist/components/Slider/index.d.ts +2 -0
- package/dist/components/Slider/index.d.ts.map +1 -0
- package/dist/components/Slider/index.js +7 -0
- package/dist/components/Slider/index.js.map +1 -0
- package/dist/components/Slider/slider.d.ts +7 -7
- package/dist/components/Slider/slider.d.ts.map +1 -1
- package/dist/components/Slider/slider.js +39 -17
- package/dist/components/Slider/slider.js.map +1 -1
- package/dist/components/Steps/index.d.ts +2 -0
- package/dist/components/Steps/index.d.ts.map +1 -0
- package/dist/components/Steps/index.js +12 -0
- package/dist/components/Steps/index.js.map +1 -0
- package/dist/components/Steps/steps.d.ts +8 -6
- package/dist/components/Steps/steps.d.ts.map +1 -1
- package/dist/components/Steps/steps.js +74 -32
- package/dist/components/Steps/steps.js.map +1 -1
- package/dist/components/Switch/index.d.ts +2 -0
- package/dist/components/Switch/index.d.ts.map +1 -0
- package/dist/components/Switch/index.js +7 -0
- package/dist/components/Switch/index.js.map +1 -0
- package/dist/components/Switch/switch.d.ts +20 -18
- package/dist/components/Switch/switch.d.ts.map +1 -1
- package/dist/components/Switch/switch.js +133 -26
- package/dist/components/Switch/switch.js.map +1 -1
- package/dist/components/Tabs/index.d.ts +2 -0
- package/dist/components/Tabs/index.d.ts.map +1 -0
- package/dist/components/Tabs/index.js +10 -0
- package/dist/components/Tabs/index.js.map +1 -0
- package/dist/components/Tabs/tabs-inline-action-geometry.d.ts +31 -0
- package/dist/components/Tabs/tabs-inline-action-geometry.d.ts.map +1 -0
- package/dist/components/Tabs/tabs-inline-action-geometry.js +43 -0
- package/dist/components/Tabs/tabs-inline-action-geometry.js.map +1 -0
- package/dist/components/Tabs/tabs.d.ts +14 -11
- package/dist/components/Tabs/tabs.d.ts.map +1 -1
- package/dist/components/Tabs/tabs.js +184 -69
- package/dist/components/Tabs/tabs.js.map +1 -1
- package/dist/components/Tag/index.d.ts +2 -0
- package/dist/components/Tag/index.d.ts.map +1 -0
- package/dist/components/Tag/index.js +7 -0
- package/dist/components/Tag/index.js.map +1 -0
- package/dist/components/Tag/tag.d.ts +39 -23
- package/dist/components/Tag/tag.d.ts.map +1 -1
- package/dist/components/Tag/tag.js +71 -63
- package/dist/components/Tag/tag.js.map +1 -1
- package/dist/components/Textarea/index.d.ts +2 -0
- package/dist/components/Textarea/index.d.ts.map +1 -0
- package/dist/components/Textarea/index.js +7 -0
- package/dist/components/Textarea/index.js.map +1 -0
- package/dist/components/Textarea/textarea.d.ts +24 -17
- package/dist/components/Textarea/textarea.d.ts.map +1 -1
- package/dist/components/Textarea/textarea.js +110 -72
- package/dist/components/Textarea/textarea.js.map +1 -1
- package/dist/components/TimePicker/index.d.ts +2 -0
- package/dist/components/TimePicker/index.d.ts.map +1 -0
- package/dist/components/TimePicker/index.js +6 -0
- package/dist/components/TimePicker/index.js.map +1 -0
- package/dist/components/TimePicker/time-columns.d.ts.map +1 -1
- package/dist/components/TimePicker/time-columns.js +44 -36
- package/dist/components/TimePicker/time-columns.js.map +1 -1
- package/dist/components/TimePicker/time-picker.d.ts +8 -7
- package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
- package/dist/components/TimePicker/time-picker.js +71 -53
- package/dist/components/TimePicker/time-picker.js.map +1 -1
- package/dist/components/Toast/index.d.ts +2 -0
- package/dist/components/Toast/index.d.ts.map +1 -0
- package/dist/components/Toast/index.js +7 -0
- package/dist/components/Toast/index.js.map +1 -0
- package/dist/components/Toast/toast.d.ts +2 -2
- package/dist/components/Toast/toast.d.ts.map +1 -1
- package/dist/components/Toast/toast.js +82 -20
- package/dist/components/Toast/toast.js.map +1 -1
- package/dist/components/Tooltip/index.d.ts +2 -0
- package/dist/components/Tooltip/index.d.ts.map +1 -0
- package/dist/components/Tooltip/index.js +9 -0
- package/dist/components/Tooltip/index.js.map +1 -0
- package/dist/components/Tooltip/tooltip.d.ts +2 -2
- package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/tooltip.js +57 -25
- package/dist/components/Tooltip/tooltip.js.map +1 -1
- package/dist/components/TreeView/index.d.ts +2 -0
- package/dist/components/TreeView/index.d.ts.map +1 -0
- package/dist/components/TreeView/index.js +8 -0
- package/dist/components/TreeView/index.js.map +1 -0
- package/dist/components/TreeView/tree-view.d.ts +71 -14
- package/dist/components/TreeView/tree-view.d.ts.map +1 -1
- package/dist/components/TreeView/tree-view.js +313 -34
- package/dist/components/TreeView/tree-view.js.map +1 -1
- package/dist/hooks/use-controllable.d.ts.map +1 -1
- package/dist/hooks/use-controllable.js +4 -2
- package/dist/hooks/use-controllable.js.map +1 -1
- package/dist/hooks/use-is-touch-device.d.ts.map +1 -1
- package/dist/hooks/use-is-touch-device.js +3 -1
- package/dist/hooks/use-is-touch-device.js.map +1 -1
- package/dist/hooks/use-overflow-items.d.ts +10 -6
- package/dist/hooks/use-overflow-items.d.ts.map +1 -1
- package/dist/hooks/use-overflow-items.js.map +1 -1
- package/dist/hooks/use-truncated.d.ts +27 -0
- package/dist/hooks/use-truncated.d.ts.map +1 -0
- package/dist/hooks/use-truncated.js +57 -0
- package/dist/hooks/use-truncated.js.map +1 -0
- package/dist/{react-day-picker.css → index.css} +43 -0
- package/dist/index.d.ts +121 -67
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +140 -160
- package/dist/index.js.map +1 -1
- package/dist/lib/drag-visual.d.ts +2 -2
- package/dist/lib/drag-visual.js.map +1 -1
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +24 -2
- package/dist/lib/utils.js.map +1 -1
- package/dist/patterns/element-anatomy/index.d.ts +3 -0
- package/dist/patterns/element-anatomy/index.d.ts.map +1 -0
- package/dist/patterns/element-anatomy/index.js +22 -0
- package/dist/patterns/element-anatomy/index.js.map +1 -0
- package/dist/patterns/element-anatomy/item-anatomy.d.ts +32 -16
- package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.js +83 -35
- package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
- package/dist/patterns/element-anatomy/truncated-text.d.ts +27 -0
- package/dist/patterns/element-anatomy/truncated-text.d.ts.map +1 -0
- package/dist/patterns/element-anatomy/truncated-text.js +16 -0
- package/dist/patterns/element-anatomy/truncated-text.js.map +1 -0
- package/dist/patterns/header-canonical/chrome-header.d.ts +20 -4
- package/dist/patterns/header-canonical/chrome-header.d.ts.map +1 -1
- package/dist/patterns/header-canonical/chrome-header.js +4 -2
- package/dist/patterns/header-canonical/chrome-header.js.map +1 -1
- package/dist/patterns/header-canonical/index.d.ts +2 -0
- package/dist/patterns/header-canonical/index.d.ts.map +1 -0
- package/dist/patterns/header-canonical/index.js +6 -0
- package/dist/patterns/header-canonical/index.js.map +1 -0
- package/dist/patterns/horizontal-overflow/horizontal-overflow.d.ts +1 -1
- package/dist/patterns/horizontal-overflow/horizontal-overflow.js.map +1 -1
- package/dist/patterns/horizontal-overflow/index.d.ts +2 -0
- package/dist/patterns/horizontal-overflow/index.d.ts.map +1 -0
- package/dist/patterns/horizontal-overflow/index.js +14 -0
- package/dist/patterns/horizontal-overflow/index.js.map +1 -0
- package/dist/patterns/overlay-surface/index.d.ts +2 -0
- package/dist/patterns/overlay-surface/index.d.ts.map +1 -0
- package/dist/patterns/overlay-surface/index.js +8 -0
- package/dist/patterns/overlay-surface/index.js.map +1 -0
- package/dist/patterns/overlay-surface/overlay-surface.d.ts +12 -2
- package/dist/patterns/overlay-surface/overlay-surface.d.ts.map +1 -1
- package/dist/patterns/overlay-surface/overlay-surface.js +6 -2
- package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -1
- package/dist/patterns/resize-handle/index.d.ts +2 -0
- package/dist/patterns/resize-handle/index.d.ts.map +1 -0
- package/dist/patterns/resize-handle/index.js +5 -0
- package/dist/patterns/resize-handle/index.js.map +1 -0
- package/dist/patterns/resize-handle/resize-handle.d.ts +9 -11
- package/dist/patterns/resize-handle/resize-handle.d.ts.map +1 -1
- package/dist/patterns/resize-handle/resize-handle.js +3 -6
- package/dist/patterns/resize-handle/resize-handle.js.map +1 -1
- package/dist/story-governance/category-matrix.d.ts +35 -0
- package/dist/story-governance/category-matrix.d.ts.map +1 -0
- package/dist/tokens/categorical-color.d.ts +60 -0
- package/dist/tokens/categorical-color.d.ts.map +1 -0
- package/dist/tokens/categorical-color.js +125 -0
- package/dist/tokens/categorical-color.js.map +1 -0
- package/dist/tokens/motion/motion.d.ts +8 -7
- package/dist/tokens/motion/motion.d.ts.map +1 -1
- package/dist/tokens/motion/motion.js +6 -6
- package/dist/tokens/motion/motion.js.map +1 -1
- package/dist/tokens/motion/overlay-motion.d.ts +19 -0
- package/dist/tokens/motion/overlay-motion.d.ts.map +1 -0
- package/dist/tokens/motion/overlay-motion.js +9 -0
- package/dist/tokens/motion/overlay-motion.js.map +1 -0
- package/dist/tokens/uiSize/icon-size.d.ts +3 -4
- package/dist/tokens/uiSize/icon-size.d.ts.map +1 -1
- package/dist/tokens/uiSize/icon-size.js +5 -0
- package/dist/tokens/uiSize/icon-size.js.map +1 -0
- package/ds-canonical/adapters/claude/agents/README.md +58 -0
- package/ds-canonical/adapters/claude/agents/canonical-reviewer.md +14 -0
- package/ds-canonical/adapters/claude-root-instructions.md +24 -0
- package/ds-canonical/adapters/claude-settings-base.json +169 -0
- package/ds-canonical/commands/README.md +9 -14
- package/ds-canonical/fork/AGENTS.md +110 -0
- package/ds-canonical/fork/CLAUDE.md +54 -0
- package/ds-canonical/fork/codex/agents/skills/bug-fix-rhythm/SKILL.md +207 -0
- package/ds-canonical/fork/codex/agents/skills/code-quality-audit/SKILL.md +71 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/SKILL.md +244 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/fork/codex/agents/skills/independent-review/SKILL.md +43 -0
- package/ds-canonical/fork/codex/agents/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/codex/agents/skills/independent-review/references/evidence-contract.md +23 -0
- package/ds-canonical/fork/codex/agents/skills/performance-audit/SKILL.md +114 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/SKILL.md +252 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/audit-checks.md +250 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/report-template.md +163 -0
- package/ds-canonical/fork/codex/agents/skills/propose-options/SKILL.md +190 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/SKILL.md +246 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/audit-checks.md +39 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/checkpoints.md +200 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/evaluation-matrix.md +142 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/proposal-template.md +230 -0
- package/ds-canonical/fork/codex/agents/skills/scan-similar-bugs/SKILL.md +203 -0
- package/ds-canonical/fork/codex/agents/skills/ux-audit/SKILL.md +135 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/SKILL.md +258 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/references/audit-architecture.md +101 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/ds-canonical/fork/codex/hooks.json +57 -0
- package/ds-canonical/fork/common/closed-tool-execution.mjs +1005 -0
- package/ds-canonical/fork/common/instruction.md +110 -0
- package/ds-canonical/fork/consumer/governance-check.mjs +3163 -0
- package/ds-canonical/fork/consumer/lib/closed-tool-execution.mjs +1005 -0
- package/ds-canonical/fork/consumer/lock.json +189 -0
- package/ds-canonical/fork/consumer/lock.schema.json +338 -0
- package/ds-canonical/fork/consumer/managed-files/0235cf6b3fd402a3717881dc205b5bf77aed7632e7d7d6f1811a40e3033bd816.blob +145 -0
- package/ds-canonical/fork/consumer/managed-files/145aab4b4fc470fc9ba7679b4a1d87d4f6a6d604940bd40f8d675c8af696498f.blob +53 -0
- package/ds-canonical/fork/consumer/managed-files/189e551431181e4a88783c02130d2787b801ef731c86e35bcde89a7313aa020e.blob +149 -0
- package/ds-canonical/fork/consumer/managed-files/24ad71c8613ddcf6fd23818cb3bb477a1fb6d83af4550b0bad43099813088686.blob +28 -0
- package/ds-canonical/fork/consumer/managed-files/2d1ef5617a5ce3c39ad9aae1c42af7d199f9270c0a0ccb490b63d62dbc6913db.blob +1005 -0
- package/ds-canonical/fork/consumer/managed-files/3625e02235cf166a50649a4d704cfb68fead69d0e168c481df013ebae9f6be25.blob +1412 -0
- package/ds-canonical/fork/consumer/managed-files/3ddedc67b464bdfe3dde9803a2d917920c96d633678b802eee638a44cd47366a.blob +8 -0
- package/ds-canonical/fork/consumer/managed-files/423729840acdd43c812f17c245b871716c6b60f76e4d3e94864d0e34a815bf8d.blob +348 -0
- package/ds-canonical/fork/consumer/managed-files/46f10bc55cdfdf834d0749eebff42ea0bb8576f361b36d2b6ba1851354c50150.blob +549 -0
- package/ds-canonical/fork/consumer/managed-files/475fba657eaeb8abd88f60635f3eadab27a9d0d3114ba4fffc65f43a2a0fe6e2.blob +124 -0
- package/ds-canonical/fork/consumer/managed-files/5aeda1df235815f40dd755951f2b868d4e02035653d4536a8dde209cdc75b493.blob +268 -0
- package/ds-canonical/fork/consumer/managed-files/61c6aca6d7f04bedbf556eaa9d3043681fe48cbe0e93a8ccb1d69a7c5e23fdcf.blob +113 -0
- package/ds-canonical/fork/consumer/managed-files/63061e05969667005020166ea2ae7df3c96663f7a928e7dd3eebc1471022df56.blob +2454 -0
- package/ds-canonical/fork/consumer/managed-files/65410b66e8799a560e07b71779c186fed2a0ef50575ac44745df7a0938a9c2b4.blob +321 -0
- package/ds-canonical/fork/consumer/managed-files/6b746628ac11fcccbe277ef6fea94cc2a7b90ea2822e83536eae80d5ee4b3fa5.blob +167 -0
- package/ds-canonical/fork/consumer/managed-files/76d485470d30ff014afacf7ce643763de9f4f956d9fc8128dbc1814774cf2e63.blob +671 -0
- package/ds-canonical/fork/consumer/managed-files/7937321877e5c34c27dae36c0d507d21cd42fa3f46a8f11a284b8b4a52b6faa4.blob +84 -0
- package/ds-canonical/fork/consumer/managed-files/794bb911ba8ebef58ab0d44a55b9968a19d2c62bcfb310b1ee3a84166f087f21.blob +924 -0
- package/ds-canonical/fork/consumer/managed-files/7ab15a8aeca39485d7b9b57234bbc4a69e0b9e70b4a851dfe10f6447127cee78.blob +51 -0
- package/ds-canonical/fork/consumer/managed-files/7b17835d0ceb17cdcdcaf930540a3e5d0943a34a747ac43c12ca8cd485c11581.blob +44 -0
- package/ds-canonical/fork/consumer/managed-files/7eb6cc60abfdabaf6617c336058fad1454ccde08889295767bfd9b7fd153cc6e.blob +900 -0
- package/ds-canonical/fork/consumer/managed-files/81037efa5b3b9f4a875704005fb268acdc9233bb901f44902e4e37e1da92b8e3.blob +46 -0
- package/ds-canonical/fork/consumer/managed-files/884721550b56308812b20917adac7a12f36fdb4ecda6b02460a7f5a219c0c966.blob +82 -0
- package/ds-canonical/fork/consumer/managed-files/91f414b9462ddc1e4be1d4c6ca4ac7a7340a6eec9e98ee109cbc049d3b354b6a.blob +36 -0
- package/ds-canonical/fork/consumer/managed-files/92e4828cdcb96ff0d01daa16f6885f24045a8e72820665650f2a1890dc3a446c.blob +121 -0
- package/ds-canonical/fork/consumer/managed-files/93a89f16f6717d1e4e4e27ec20ef916e3355c7aa890ca74cd9b12db30d8a899f.blob +36 -0
- package/ds-canonical/fork/consumer/managed-files/974521d6b8fe796ea4c58b3c78b0c2b8a1be262b97100d77aaf4cc9c7724bcab.blob +45 -0
- package/ds-canonical/fork/consumer/managed-files/9791c85388d2e2e2bd564e2550fadc3351c4c960a47ce838098afcba7544eb90.blob +973 -0
- package/ds-canonical/fork/consumer/managed-files/a448d2222133335c30e6fda5116e26a40db3283a19d62ccc0663c30d272262a7.blob +174 -0
- package/ds-canonical/fork/consumer/managed-files/ab072e7f2eca51f0e18a5e18c4b333260ee5d219a12cc6df5bb2d683f0b2734d.blob +2639 -0
- package/ds-canonical/fork/consumer/managed-files/bc44cabad181f766611dab6a8f52d81100afadd50ac59799015e8ba7bf46d9eb.blob +620 -0
- package/ds-canonical/fork/consumer/managed-files/c4aa767f11714467de0038a2149cf78074baddc17fc6a9e074b6aed7544c6f3c.blob +80 -0
- package/ds-canonical/fork/consumer/managed-files/c893e9b734b162f4c631fef871128c16a9ab565f796a0e76d7f320f821f220f5.blob +41 -0
- package/ds-canonical/fork/consumer/managed-files/cd9c61f8ff24fb9bcc3663e346e2cfa419cfb84e02aae18d3dc66dd192681696.blob +9 -0
- package/ds-canonical/fork/consumer/managed-files/da2ad2737315d25a5300905ddefd62f1695056a8a1af155c5b34170ad9923bce.blob +38 -0
- package/ds-canonical/fork/consumer/managed-files/e26057408661597aac4a57cdf7e30e2f9d0afb1b9a2dbbb692c3805cd9028ca5.blob +250 -0
- package/ds-canonical/fork/consumer/managed-files/e68ae1915965d8e17d4b2441c00c2b97fe062ea308ae8535c9eebb2fc16fa245.blob +20 -0
- package/ds-canonical/fork/consumer/managed-files/e71c65f45c6af7ce12b6b3c0d8028f185da5b719e2050c9b2a6b243d41ae4878.blob +182 -0
- package/ds-canonical/fork/consumer/managed-files/e813096d69c49812e40e00be9ac8fa14d77f0ec1f97ab4c45cb096b3bedd35de.blob +3 -0
- package/ds-canonical/fork/consumer/managed-files/e930ebca6fd8eeb30802aac0930efae7bcc44cc0996f24de07c11ca6a081fedf.blob +277 -0
- package/ds-canonical/fork/consumer/managed-files/ea94e914d5c8acb84ad7660e5bda0f01b6ccc8cf96b0f6b1ce048f8938d0f5b5.blob +47 -0
- package/ds-canonical/fork/consumer/managed-files/f4db6e616d5229aa7e700c6a3ace022cb9d90baae74e38ca65fce617f18e0d9b.blob +110 -0
- package/ds-canonical/fork/consumer/managed-files/faa128c26102415dc5345e68698efbbd28a395c35ee278dceae044cf430692b2.blob +11 -0
- package/ds-canonical/fork/governance.lock +1696 -0
- package/ds-canonical/fork/hooks/_log-fire.sh +143 -0
- package/ds-canonical/fork/hooks/block_prototype_imports.py +241 -0
- package/ds-canonical/fork/hooks/check_chrome_header_avatar_canonical.sh +106 -0
- package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +731 -0
- package/ds-canonical/fork/hooks/check_consumer_code_quality.sh +173 -0
- package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +219 -0
- package/ds-canonical/fork/hooks/check_dynamic_tailwind_class.sh +57 -0
- package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +213 -0
- package/ds-canonical/fork/hooks/check_field_family_invariants.sh +376 -0
- package/ds-canonical/fork/hooks/check_fork_product_quality.sh +38 -0
- package/ds-canonical/fork/hooks/check_item_list_gap.sh +56 -0
- package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +160 -0
- package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +319 -0
- package/ds-canonical/fork/hooks/check_pattern_invariants.sh +339 -0
- package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +99 -0
- package/ds-canonical/fork/hooks/check_story_determinism.sh +39 -0
- package/ds-canonical/fork/hooks/check_story_invariants.sh +400 -0
- package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +241 -0
- package/ds-canonical/fork/hooks/check_tailwind_wildcard_in_docs.sh +86 -0
- package/ds-canonical/fork/hooks/inject_deploy_url_after_push.sh +333 -0
- package/ds-canonical/fork/hooks/lib/_hook_integrity.sh +158 -0
- package/ds-canonical/fork/hooks/lib/_micro_geometry.sh +291 -0
- package/ds-canonical/fork/hooks/lib/_provider_paths.sh +162 -0
- package/ds-canonical/fork/launchers/approval-evidence.mjs +1286 -0
- package/ds-canonical/fork/launchers/authority-decision-evidence.mjs +413 -0
- package/ds-canonical/fork/launchers/canonical-order.mjs +8 -0
- package/ds-canonical/fork/launchers/fork-governance-dispatcher.sh +154 -0
- package/ds-canonical/fork/launchers/format-provider-hook-output.mjs +25 -0
- package/ds-canonical/fork/launchers/independent-review.mjs +490 -0
- package/ds-canonical/fork/launchers/inject_fork_governance_preamble.sh +99 -0
- package/ds-canonical/fork/launchers/normalize-provider-event.mjs +355 -0
- package/ds-canonical/fork/launchers/product-hook-dispatch-runtime.mjs +1067 -0
- package/ds-canonical/fork/launchers/provider-hook-normalization.mjs +1640 -0
- package/ds-canonical/fork/launchers/provider-hook-output-transport.mjs +540 -0
- package/ds-canonical/fork/launchers/settings-hooks.json +35 -0
- package/ds-canonical/fork/manifest.json +1984 -0
- package/ds-canonical/fork/providers/claude/hook-config.json +327 -0
- package/ds-canonical/fork/providers/claude/instruction.md +54 -0
- package/ds-canonical/fork/providers/claude/skills/bug-fix-rhythm/SKILL.md +207 -0
- package/ds-canonical/fork/providers/claude/skills/code-quality-audit/SKILL.md +71 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/SKILL.md +244 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/fork/providers/claude/skills/independent-review/SKILL.md +43 -0
- package/ds-canonical/fork/providers/claude/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/providers/claude/skills/independent-review/references/evidence-contract.md +23 -0
- package/ds-canonical/fork/providers/claude/skills/performance-audit/SKILL.md +114 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/SKILL.md +252 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/audit-checks.md +250 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/report-template.md +163 -0
- package/ds-canonical/fork/providers/claude/skills/propose-options/SKILL.md +190 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/SKILL.md +246 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/audit-checks.md +39 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/checkpoints.md +200 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/evaluation-matrix.md +142 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/proposal-template.md +230 -0
- package/ds-canonical/fork/providers/claude/skills/scan-similar-bugs/SKILL.md +203 -0
- package/ds-canonical/fork/providers/claude/skills/ux-audit/SKILL.md +135 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/SKILL.md +258 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/references/audit-architecture.md +101 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/ds-canonical/fork/providers/codex/hook-config.json +57 -0
- package/ds-canonical/fork/providers/codex/skills/bug-fix-rhythm/SKILL.md +207 -0
- package/ds-canonical/fork/providers/codex/skills/code-quality-audit/SKILL.md +71 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/SKILL.md +244 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/fork/providers/codex/skills/independent-review/SKILL.md +43 -0
- package/ds-canonical/fork/providers/codex/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/providers/codex/skills/independent-review/references/evidence-contract.md +23 -0
- package/ds-canonical/fork/providers/codex/skills/performance-audit/SKILL.md +114 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/SKILL.md +252 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/audit-checks.md +250 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/report-template.md +163 -0
- package/ds-canonical/fork/providers/codex/skills/propose-options/SKILL.md +190 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/SKILL.md +246 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/audit-checks.md +39 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/checkpoints.md +200 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/evaluation-matrix.md +142 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/proposal-template.md +230 -0
- package/ds-canonical/fork/providers/codex/skills/scan-similar-bugs/SKILL.md +203 -0
- package/ds-canonical/fork/providers/codex/skills/ux-audit/SKILL.md +135 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/SKILL.md +258 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/references/audit-architecture.md +101 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/ds-canonical/fork/references/story-baseline-registry.json +123 -0
- package/ds-canonical/fork/references/story-baseline-registry.schema.json +145 -0
- package/ds-canonical/fork/references/utility-registry.json +426 -0
- package/ds-canonical/fork/references/utility-registry.schema.json +409 -0
- package/ds-canonical/fork/review/canonical-order.mjs +8 -0
- package/ds-canonical/fork/review/provider-review-binding.mjs +2377 -0
- package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +196 -0
- package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +69 -0
- package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +242 -0
- package/ds-canonical/fork/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/fork/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/fork/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/fork/skills/independent-review/SKILL.md +37 -0
- package/ds-canonical/fork/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/skills/independent-review/references/evidence-contract.md +23 -0
- package/ds-canonical/fork/skills/performance-audit/SKILL.md +112 -0
- package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +250 -0
- package/ds-canonical/fork/skills/product-ui-audit/references/audit-checks.md +250 -0
- package/ds-canonical/fork/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/fork/skills/product-ui-audit/references/report-template.md +163 -0
- package/ds-canonical/fork/skills/propose-options/SKILL.md +179 -0
- package/ds-canonical/fork/skills/prototype/SKILL.md +244 -0
- package/ds-canonical/fork/skills/prototype/references/audit-checks.md +39 -0
- package/ds-canonical/fork/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/fork/skills/prototype/references/checkpoints.md +200 -0
- package/ds-canonical/fork/skills/prototype/references/evaluation-matrix.md +142 -0
- package/ds-canonical/fork/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/fork/skills/prototype/references/proposal-template.md +230 -0
- package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +201 -0
- package/ds-canonical/fork/skills/ux-audit/SKILL.md +133 -0
- package/ds-canonical/fork/skills/visual-audit/SKILL.md +248 -0
- package/ds-canonical/fork/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/fork/skills/visual-audit/references/audit-architecture.md +101 -0
- package/ds-canonical/fork/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/fork/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/ds-canonical/hooks/README.md +39 -25
- package/ds-canonical/hooks/_log-fire.sh +111 -12
- package/ds-canonical/hooks/auto_regen_ds_barrel.sh +90 -0
- package/ds-canonical/hooks/block_prototype_imports.py +156 -26
- package/ds-canonical/hooks/check_audit_post_report_validator.sh +328 -32
- package/ds-canonical/hooks/check_audit_sample_escape.sh +10 -7
- package/ds-canonical/hooks/check_benchmark_citation.sh +41 -8
- package/ds-canonical/hooks/check_canonical_propagation.sh +85 -24
- package/ds-canonical/hooks/check_chrome_header_avatar_canonical.sh +106 -0
- package/ds-canonical/hooks/check_codex_brief_invariants.sh +138 -29
- package/ds-canonical/hooks/check_codex_collab_5step.sh +31 -25
- package/ds-canonical/hooks/check_consumer_app_invariants.sh +731 -0
- package/ds-canonical/hooks/check_consumer_code_quality.sh +173 -0
- package/ds-canonical/hooks/check_datatable_invariants.sh +173 -29
- package/ds-canonical/hooks/check_dim_count_drift.sh +8 -7
- package/ds-canonical/hooks/check_ds_anchor_preflight.sh +219 -0
- package/ds-canonical/hooks/check_dynamic_tailwind_class.sh +57 -0
- package/ds-canonical/hooks/check_escape_marker_abuse.sh +213 -0
- package/ds-canonical/hooks/check_field_controls_contracts.sh +37 -8
- package/ds-canonical/hooks/check_field_family_invariants.sh +195 -24
- package/ds-canonical/hooks/check_file_size_budget.sh +32 -14
- package/ds-canonical/hooks/check_full_story_visual_interaction_sweep.sh +111 -0
- package/ds-canonical/hooks/check_item_list_gap.sh +56 -0
- package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +160 -0
- package/ds-canonical/hooks/check_main_branch_workbench.sh +27 -68
- package/ds-canonical/hooks/check_naming_and_abstraction.sh +21 -10
- package/ds-canonical/hooks/check_opacity_token_usage.sh +238 -68
- package/ds-canonical/hooks/check_orphan_ds_css.sh +96 -0
- package/ds-canonical/hooks/check_overlay_open_focus_escape_probe.sh +110 -0
- package/ds-canonical/hooks/check_pattern_invariants.sh +160 -15
- package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +4 -4
- package/ds-canonical/hooks/check_pixel_quantified_audit.sh +6 -4
- package/ds-canonical/hooks/check_plugin_fork_health.sh +282 -0
- package/ds-canonical/hooks/check_propose_discipline.sh +255 -0
- package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +6 -4
- package/ds-canonical/hooks/check_propose_without_benchmark.sh +71 -0
- package/ds-canonical/hooks/check_select_all_canonical.sh +1 -1
- package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +99 -0
- package/ds-canonical/hooks/check_solo_workflow.sh +62 -168
- package/ds-canonical/hooks/check_spec_class_drift.sh +33 -19
- package/ds-canonical/hooks/check_ssot_header_declaration.sh +56 -0
- package/ds-canonical/hooks/check_story_determinism.sh +39 -0
- package/ds-canonical/hooks/check_story_invariants.sh +722 -222
- package/ds-canonical/hooks/check_storybook_addon_packaging.sh +201 -0
- package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +143 -64
- package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +241 -0
- package/ds-canonical/hooks/check_tailwind_wildcard_in_docs.sh +86 -0
- package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +15 -12
- package/ds-canonical/hooks/chrome_header_dispatcher.sh +105 -0
- package/ds-canonical/hooks/enforce_home_charter.sh +31 -10
- package/ds-canonical/hooks/governance_control_plane.sh +15 -0
- package/ds-canonical/hooks/inject_deploy_url_after_push.sh +333 -0
- package/ds-canonical/hooks/inject_pending_self_audit.sh +68 -21
- package/ds-canonical/hooks/lib/_app_shell_primary_header_consistency.sh +148 -0
- package/ds-canonical/hooks/lib/_chrome_header_handcraft.sh +121 -0
- package/ds-canonical/hooks/lib/_code_quality.sh +9 -9
- package/ds-canonical/hooks/lib/_cva_default_sync.sh +11 -13
- package/ds-canonical/hooks/lib/_governance_coverage_check.sh +48 -21
- package/ds-canonical/hooks/lib/_hardcoded_strings.sh +18 -10
- package/ds-canonical/hooks/lib/_header_with_tabs_border.sh +107 -0
- package/ds-canonical/hooks/lib/_hook_integrity.sh +158 -0
- package/ds-canonical/hooks/lib/_layout_space_canonical.sh +5 -5
- package/ds-canonical/hooks/lib/_micro_geometry.sh +291 -0
- package/ds-canonical/hooks/lib/_overlay_handcraft.sh +42 -23
- package/ds-canonical/hooks/lib/_person_data_richness.sh +5 -5
- package/ds-canonical/hooks/lib/_provider_paths.sh +162 -0
- package/ds-canonical/hooks/lib/_story_compile_drift.sh +5 -5
- package/ds-canonical/hooks/lib/_tab_lg_chrome_header_equal.sh +290 -0
- package/ds-canonical/hooks/lib/_token_hygiene.sh +55 -20
- package/ds-canonical/hooks/lib/approval-evidence.mjs +1286 -0
- package/ds-canonical/hooks/lib/audit-report-validator.mjs +122 -0
- package/ds-canonical/hooks/lib/provider-marker-regex.mjs +23 -0
- package/ds-canonical/hooks/lib/tsx-governance-analysis.mjs +410 -0
- package/ds-canonical/hooks/log_governance_fires.sh +45 -13
- package/ds-canonical/hooks/log_skill_invokes.sh +8 -7
- package/ds-canonical/hooks/post_edit_dispatcher.sh +106 -28
- package/ds-canonical/hooks/registrations.json +488 -0
- package/ds-canonical/hooks/registrations.schema.json +58 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_addon_subdir_ship.sh +76 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_app_story_title.sh +81 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_ds_primitive_misuse.sh +120 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_no_ds_catalog.sh +101 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_story_baseline.sh +76 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_data_table_size_num_to_meta_width.sh +68 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_fork_user_plugin_install.sh +79 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_plugin_freshness.sh +68 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_cite_required.sh +88 -0
- package/ds-canonical/hooks/{check_propose_plain_chinese.sh → retired/2026-06-11-prune-merge/check_propose_plain_chinese.sh} +2 -2
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_storybook_addon_preset_cjs.sh +87 -0
- package/ds-canonical/hooks/{lib/_approval_re.sh → retired/_approval_re.sh.retired-2026-08-18} +6 -7
- package/ds-canonical/hooks/retired/check_container_breathing.sh +1 -1
- package/ds-canonical/hooks/retired/check_governance_compliance.sh +1 -1
- package/ds-canonical/hooks/session_start_governance_check.sh +157 -69
- package/ds-canonical/hooks/stop_audit_content_quality.sh +20 -0
- package/ds-canonical/hooks/stop_extract_canonical_rules.sh +20 -0
- package/ds-canonical/hooks/stop_passive_logging.sh +133 -59
- package/ds-canonical/hooks/stop_self_audit.sh +472 -178
- package/ds-canonical/hooks/tests/fixtures/transcripts/claude-transcript-jsonl-v1.jsonl +3 -0
- package/ds-canonical/hooks/tests/fixtures/transcripts/claude-transcript-jsonl-v2.jsonl +3 -0
- package/ds-canonical/hooks/tests/registration-output-contracts.mjs +151 -0
- package/ds-canonical/hooks/tests/run-all.sh +35 -5
- package/ds-canonical/hooks/tests/test_auto_regen_ds_barrel.sh +224 -0
- package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +181 -9
- package/ds-canonical/hooks/tests/test_check_addon_subdir_ship.sh +171 -0
- package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +275 -81
- package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +292 -14
- package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +0 -0
- package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +41 -9
- package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +56 -5
- package/ds-canonical/hooks/tests/test_check_chrome_header_avatar_canonical.sh +198 -0
- package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +197 -81
- package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +375 -0
- package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +49 -5
- package/ds-canonical/hooks/tests/test_check_consumer_app_invariants.sh +140 -0
- package/ds-canonical/hooks/tests/test_check_consumer_app_story_title.sh +164 -0
- package/ds-canonical/hooks/tests/test_check_consumer_code_quality.sh +86 -0
- package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +417 -0
- package/ds-canonical/hooks/tests/test_check_consumer_no_ds_catalog.sh +214 -0
- package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +209 -0
- package/ds-canonical/hooks/tests/test_check_data_table_size_num_to_meta_width.sh +71 -0
- package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +126 -12
- package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +13 -8
- package/ds-canonical/hooks/tests/test_check_ds_anchor_preflight.sh +150 -0
- package/ds-canonical/hooks/tests/test_check_dynamic_tailwind_class.sh +76 -0
- package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +278 -0
- package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +108 -18
- package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +67 -5
- package/ds-canonical/hooks/tests/test_check_fork_user_plugin_install.sh +151 -0
- package/ds-canonical/hooks/tests/test_check_full_story_visual_interaction_sweep.sh +200 -0
- package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +178 -68
- package/ds-canonical/hooks/tests/test_check_item_list_gap.sh +44 -0
- package/ds-canonical/hooks/tests/test_check_layout_space_magic_numbers.sh +264 -0
- package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +45 -110
- package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +19 -2
- package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +151 -6
- package/ds-canonical/hooks/tests/test_check_orphan_ds_css.sh +228 -0
- package/ds-canonical/hooks/tests/test_check_overlay_open_focus_escape_probe.sh +191 -0
- package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +103 -7
- package/ds-canonical/hooks/tests/test_check_plugin_fork_health.sh +132 -0
- package/ds-canonical/hooks/tests/test_check_propose_cite_required.sh +181 -0
- package/ds-canonical/hooks/tests/test_check_propose_discipline.sh +69 -0
- package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +10 -7
- package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +5 -5
- package/ds-canonical/hooks/tests/test_check_propose_without_benchmark.sh +100 -0
- package/ds-canonical/hooks/tests/test_check_sidebar_menu_button_implicit_wrap.sh +224 -0
- package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +86 -105
- package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +35 -7
- package/ds-canonical/hooks/tests/test_check_ssot_header_declaration.sh +72 -0
- package/ds-canonical/hooks/tests/{test_check_story_anatomy.sh.broken → test_check_story_anatomy.sh} +73 -4
- package/ds-canonical/hooks/tests/test_check_story_category.sh +411 -0
- package/ds-canonical/hooks/tests/test_check_story_determinism.sh +39 -0
- package/ds-canonical/hooks/tests/test_check_story_invariants.sh +734 -43
- package/ds-canonical/hooks/tests/{test_check_story_name_jargon.sh.broken → test_check_story_name_jargon.sh} +22 -1
- package/ds-canonical/hooks/tests/test_check_storybook_addon_packaging.sh +89 -0
- package/ds-canonical/hooks/tests/test_check_storybook_addon_preset_cjs.sh +200 -0
- package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +626 -28
- package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +182 -97
- package/ds-canonical/hooks/tests/test_check_tabs_content_chrome_body_double_gap.sh +76 -0
- package/ds-canonical/hooks/tests/test_check_tailwind_wildcard_in_docs.sh +182 -0
- package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +63 -15
- package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +12 -6
- package/ds-canonical/hooks/tests/test_chrome_header_dispatcher.sh +125 -0
- package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +58 -4
- package/ds-canonical/hooks/tests/test_governance_control_plane.sh +66 -0
- package/ds-canonical/hooks/tests/test_governance_coverage_check.sh +88 -0
- package/ds-canonical/hooks/tests/test_hook_integrity_classification.sh +217 -0
- package/ds-canonical/hooks/tests/test_inject_deploy_url_after_push.sh +276 -0
- package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +116 -11
- package/ds-canonical/hooks/tests/test_log_governance_fires.sh +117 -1
- package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +74 -5
- package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +234 -77
- package/ds-canonical/hooks/tests/test_provider_peer_symmetry.sh +76 -0
- package/ds-canonical/hooks/tests/test_registration_output_contracts.sh +20 -0
- package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +145 -22
- package/ds-canonical/hooks/tests/test_stop_audit_content_quality.sh +75 -0
- package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +101 -23
- package/ds-canonical/hooks/tests/test_stop_extract_canonical_rules.sh +75 -0
- package/ds-canonical/hooks/tests/{test_stop_governance_drift_check.sh.broken → test_stop_governance_drift_check.sh} +22 -12
- package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +102 -1
- package/ds-canonical/hooks/tests/test_stop_repository_command_context.sh +38 -0
- package/ds-canonical/hooks/tests/test_stop_self_audit.sh +427 -13
- package/ds-canonical/references/README.md +19 -11
- package/ds-canonical/references/build-ui-canonicals.md +23 -6
- package/ds-canonical/references/certified-surfaces.md +46 -0
- package/ds-canonical/references/composition-fidelity.md +47 -0
- package/ds-canonical/references/cva-patterns.md +2 -2
- package/ds-canonical/references/drag-canonical.md +67 -311
- package/ds-canonical/references/failure-class-registry.json +160 -0
- package/ds-canonical/references/governance-audit-coverage.md +34 -0
- package/ds-canonical/references/item-anatomy-recipe.md +3 -3
- package/ds-canonical/references/naming-conventions.md +2 -1
- package/ds-canonical/references/principle-dim-map.json +136 -9
- package/ds-canonical/references/props-naming.md +18 -3
- package/ds-canonical/references/repository-hygiene-policy.json +143 -0
- package/ds-canonical/references/repository-hygiene.md +106 -0
- package/ds-canonical/references/runtime-evidence-retention.md +88 -0
- package/ds-canonical/references/scenario-definition.md +146 -0
- package/ds-canonical/references/spec-rules.md +1 -1
- package/ds-canonical/references/ssot-consultation.md +5 -5
- package/ds-canonical/references/ssot-index.md +11 -10
- package/ds-canonical/references/story-baseline-registry.json +55 -11
- package/ds-canonical/references/story-baseline-registry.schema.json +145 -0
- package/ds-canonical/references/structural-token-retention.md +7 -10
- package/ds-canonical/references/tailwind-gotchas.md +4 -4
- package/ds-canonical/references/ui-dev-rules.md +22 -1
- package/ds-canonical/rules/README.md +15 -10
- package/ds-canonical/rules/meta-patterns.md +30 -30
- package/ds-canonical/rules/self-verify.md +22 -12
- package/ds-canonical/rules/spec-rules.md +2 -2
- package/ds-canonical/rules/story-rules.md +36 -9
- package/ds-canonical/rules/ui-development.md +23 -15
- package/ds-canonical/skills/README.md +29 -17
- package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +26 -13
- package/ds-canonical/skills/canonical-reviewer/SKILL.md +29 -0
- package/ds-canonical/skills/code-quality-audit/SKILL.md +15 -11
- package/ds-canonical/skills/codex-collab/SKILL.md +22 -235
- package/ds-canonical/skills/codex-collab/references/brief-template.md +37 -43
- package/ds-canonical/skills/codex-collab/references/transport.md +38 -57
- package/ds-canonical/skills/codify-corrections/SKILL.md +37 -36
- package/ds-canonical/skills/codify-principle/SKILL.md +35 -34
- package/ds-canonical/skills/component-quality-gate/SKILL.md +17 -17
- package/ds-canonical/skills/component-quality-gate/references/checklist.md +8 -8
- package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +47 -224
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +36 -102
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +33 -147
- package/ds-canonical/skills/deep-audit-cross-codex/references/skill-relationships-antipatterns-benchmarks.md +28 -0
- package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +15 -80
- package/ds-canonical/skills/deep-audit-cross-codex/references/upstream-directives-r-mapping.md +34 -0
- package/ds-canonical/skills/delivery-handoff/SKILL.md +19 -8
- package/ds-canonical/skills/design-system-audit/SKILL.md +130 -76
- package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +207 -105
- package/ds-canonical/skills/design-system-audit/references/checkpoints.md +59 -50
- package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +33 -9
- package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +51 -32
- package/ds-canonical/skills/design-system-audit/references/rule-placement.md +57 -53
- package/ds-canonical/skills/ensure-canonical/SKILL.md +37 -35
- package/ds-canonical/skills/governance-health/SKILL.md +31 -25
- package/ds-canonical/skills/governance-status/SKILL.md +30 -0
- package/ds-canonical/skills/independent-review/SKILL.md +37 -0
- package/ds-canonical/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/skills/independent-review/references/evidence-contract.md +23 -0
- package/ds-canonical/skills/knowledge-prune/SKILL.md +57 -114
- package/ds-canonical/skills/knowledge-prune/references/phase-z-cross-repo-ssot-propagation.md +15 -0
- package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +57 -0
- package/ds-canonical/skills/knowledge-prune/references/world-class-prune-alignment.md +7 -0
- package/ds-canonical/skills/new-component/SKILL.md +33 -25
- package/ds-canonical/skills/new-component/references/new-component-checklist.md +12 -11
- package/ds-canonical/skills/performance-audit/SKILL.md +15 -12
- package/ds-canonical/skills/product-ui-audit/SKILL.md +52 -34
- package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +10 -7
- package/ds-canonical/skills/product-ui-audit/references/report-template.md +30 -26
- package/ds-canonical/skills/propose-options/SKILL.md +23 -23
- package/ds-canonical/skills/prototype/SKILL.md +19 -21
- package/ds-canonical/skills/prototype/references/audit-checks.md +6 -5
- package/ds-canonical/skills/prototype/references/checkpoints.md +26 -17
- package/ds-canonical/skills/prototype/references/evaluation-matrix.md +2 -2
- package/ds-canonical/skills/prototype/references/ooux-template.md +1 -1
- package/ds-canonical/skills/prototype/references/proposal-template.md +5 -5
- package/ds-canonical/skills/scan-similar-bugs/SKILL.md +29 -28
- package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +26 -25
- package/ds-canonical/skills/story-writing/SKILL.md +25 -14
- package/ds-canonical/skills/story-writing/references/anatomy-standard.md +2 -2
- package/ds-canonical/skills/story-writing/references/category-templates.md +15 -15
- package/ds-canonical/skills/ux-audit/SKILL.md +13 -10
- package/ds-canonical/skills/visual-audit/SKILL.md +47 -46
- package/ds-canonical/skills/visual-audit/references/audit-architecture.md +7 -7
- package/ds-canonical/skills/visual-audit/references/visual-checklist.md +14 -14
- package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +3 -3
- package/ds-canonical/templates/_README.md +22 -0
- package/ds-canonical/templates/consumer-governance.md +82 -0
- package/ds-canonical/templates/dashboard-app.tsx +186 -0
- package/ds-canonical/templates/product-launchers/fork-governance-dispatcher.sh +154 -0
- package/ds-canonical/templates/product-launchers/format-provider-hook-output.mjs +25 -0
- package/ds-canonical/templates/product-launchers/independent-review.mjs +490 -0
- package/ds-canonical/templates/product-launchers/inject_fork_governance_preamble.sh +99 -0
- package/ds-canonical/templates/product-launchers/normalize-provider-event.mjs +355 -0
- package/ds-canonical/templates/product-launchers/product-hook-dispatch-runtime.mjs +1067 -0
- package/ds-canonical/templates/product-provider-wiring.json +82 -0
- package/ds-canonical/templates/product-provider-wiring.schema.json +153 -0
- package/ds-story-manifest.json +1786 -0
- package/llms-full.txt +450 -0
- package/llms.txt +74 -0
- package/package.json +43 -10
- package/src/README.md +1 -1
- package/src/components/Accordion/accordion.anatomy.stories.tsx +496 -0
- package/src/components/Accordion/accordion.principles.stories.tsx +365 -0
- package/src/components/Accordion/accordion.spec.md +31 -5
- package/src/components/Accordion/accordion.stories.tsx +192 -0
- package/src/components/Accordion/accordion.tsx +13 -5
- package/src/components/Accordion/index.ts +5 -0
- package/src/components/AccountMenu/account-menu.anatomy.stories.tsx +117 -0
- package/src/components/AccountMenu/account-menu.principles.stories.tsx +99 -0
- package/src/components/AccountMenu/account-menu.spec.md +127 -0
- package/src/components/AccountMenu/account-menu.stories.tsx +65 -0
- package/src/components/AccountMenu/account-menu.tsx +194 -0
- package/src/components/AccountMenu/index.ts +5 -0
- package/src/components/AgentPanel/agent-fab.tsx +111 -0
- package/src/components/AgentPanel/agent-logo.tsx +417 -0
- package/src/components/AgentPanel/agent-panel.anatomy.stories.tsx +124 -0
- package/src/components/AgentPanel/agent-panel.css +43 -0
- package/src/components/AgentPanel/agent-panel.principles.stories.tsx +40 -0
- package/src/components/AgentPanel/agent-panel.spec.md +226 -0
- package/src/components/AgentPanel/agent-panel.stories.tsx +215 -0
- package/src/components/AgentPanel/agent-panel.tsx +0 -0
- package/src/components/AgentPanel/index.ts +5 -0
- package/src/components/Alert/alert.anatomy.stories.tsx +241 -0
- package/src/components/Alert/alert.principles.stories.tsx +214 -0
- package/src/components/Alert/alert.spec.md +28 -26
- package/src/components/Alert/alert.stories.tsx +136 -0
- package/src/components/Alert/alert.tsx +19 -8
- package/src/components/Alert/index.ts +5 -0
- package/src/components/AppShell/_demo-helpers.tsx +107 -28
- package/src/components/AppShell/app-shell.anatomy.stories.tsx +185 -0
- package/src/components/AppShell/app-shell.principles.stories.tsx +140 -0
- package/src/components/AppShell/app-shell.spec.md +84 -48
- package/src/components/AppShell/app-shell.stories.tsx +445 -0
- package/src/components/AppShell/app-shell.tsx +77 -24
- package/src/components/AppShell/index.ts +5 -0
- package/src/components/AspectRatio/aspect-ratio.anatomy.stories.tsx +208 -0
- package/src/components/AspectRatio/aspect-ratio.principles.stories.tsx +303 -0
- package/src/components/AspectRatio/aspect-ratio.spec.md +24 -12
- package/src/components/AspectRatio/aspect-ratio.stories.tsx +91 -0
- package/src/components/AspectRatio/aspect-ratio.tsx +6 -3
- package/src/components/AspectRatio/index.ts +5 -0
- package/src/components/Avatar/avatar.anatomy.stories.tsx +705 -0
- package/src/components/Avatar/avatar.principles.stories.tsx +249 -0
- package/src/components/Avatar/avatar.spec.md +66 -103
- package/src/components/Avatar/avatar.stories.tsx +156 -0
- package/src/components/Avatar/avatar.tsx +85 -64
- package/src/components/Avatar/index.ts +5 -0
- package/src/components/Badge/badge.anatomy.stories.tsx +591 -0
- package/src/components/Badge/badge.principles.stories.tsx +391 -0
- package/src/components/Badge/badge.spec.md +43 -23
- package/src/components/Badge/badge.stories.tsx +82 -0
- package/src/components/Badge/badge.tsx +38 -14
- package/src/components/Badge/index.ts +5 -0
- package/src/components/Breadcrumb/breadcrumb.anatomy.stories.tsx +462 -0
- package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +353 -0
- package/src/components/Breadcrumb/breadcrumb.spec.md +55 -43
- package/src/components/Breadcrumb/breadcrumb.stories.tsx +381 -0
- package/src/components/Breadcrumb/breadcrumb.tsx +43 -86
- package/src/components/Breadcrumb/index.ts +5 -0
- package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +225 -0
- package/src/components/BulkActionBar/bulk-action-bar.principles.stories.tsx +255 -0
- package/src/components/BulkActionBar/bulk-action-bar.spec.md +64 -36
- package/src/components/BulkActionBar/bulk-action-bar.stories.tsx +124 -0
- package/src/components/BulkActionBar/bulk-action-bar.tsx +26 -18
- package/src/components/BulkActionBar/index.ts +5 -0
- package/src/components/Button/button-group.tsx +64 -21
- package/src/components/Button/button.anatomy.stories.tsx +729 -0
- package/src/components/Button/button.principles.stories.tsx +369 -0
- package/src/components/Button/button.spec.md +42 -39
- package/src/components/Button/button.stories.tsx +368 -0
- package/src/components/Button/button.tsx +109 -55
- package/src/components/Button/index.ts +6 -0
- package/src/components/Calendar/calendar.anatomy.stories.tsx +237 -0
- package/src/components/Calendar/calendar.principles.stories.tsx +152 -0
- package/src/components/Calendar/calendar.spec.md +80 -55
- package/src/components/Calendar/calendar.stories.tsx +108 -0
- package/src/components/Calendar/calendar.tsx +200 -134
- package/src/components/Calendar/index.ts +5 -0
- package/src/components/Carousel/carousel.anatomy.stories.tsx +517 -0
- package/src/components/Carousel/carousel.principles.stories.tsx +334 -0
- package/src/components/Carousel/carousel.spec.md +51 -15
- package/src/components/Carousel/carousel.stories.tsx +125 -0
- package/src/components/Carousel/carousel.tsx +139 -56
- package/src/components/Carousel/index.ts +5 -0
- package/src/components/Chart/chart.anatomy.stories.tsx +310 -0
- package/src/components/Chart/chart.principles.stories.tsx +437 -0
- package/src/components/Chart/chart.spec.md +24 -5
- package/src/components/Chart/chart.stories.tsx +263 -0
- package/src/components/Chart/chart.tsx +10 -3
- package/src/components/Chart/index.ts +5 -0
- package/src/components/Checkbox/checkbox-group.tsx +28 -16
- package/src/components/Checkbox/checkbox.anatomy.stories.tsx +614 -0
- package/src/components/Checkbox/checkbox.principles.stories.tsx +216 -0
- package/src/components/Checkbox/checkbox.spec.md +65 -42
- package/src/components/Checkbox/checkbox.stories.tsx +119 -0
- package/src/components/Checkbox/checkbox.tsx +189 -32
- package/src/components/Checkbox/index.ts +6 -0
- package/src/components/Chip/chip.anatomy.stories.tsx +442 -0
- package/src/components/Chip/chip.principles.stories.tsx +228 -0
- package/src/components/Chip/chip.spec.md +52 -40
- package/src/components/Chip/chip.stories.tsx +111 -0
- package/src/components/Chip/chip.tsx +130 -45
- package/src/components/Chip/index.ts +5 -0
- package/src/components/CircularProgress/circular-progress.anatomy.stories.tsx +177 -0
- package/src/components/CircularProgress/circular-progress.principles.stories.tsx +265 -0
- package/src/components/CircularProgress/circular-progress.spec.md +32 -32
- package/src/components/CircularProgress/circular-progress.stories.tsx +149 -0
- package/src/components/CircularProgress/circular-progress.tsx +5 -6
- package/src/components/CircularProgress/index.ts +5 -0
- package/src/components/Coachmark/coachmark-story-helpers.tsx +39 -0
- package/src/components/Coachmark/coachmark.anatomy.stories.tsx +356 -0
- package/src/components/Coachmark/coachmark.principles.stories.tsx +356 -0
- package/src/components/Coachmark/coachmark.spec.md +36 -29
- package/src/components/Coachmark/coachmark.stories.tsx +220 -0
- package/src/components/Coachmark/coachmark.tsx +36 -10
- package/src/components/Coachmark/index.ts +5 -0
- package/src/components/Combobox/combobox.anatomy.stories.tsx +926 -0
- package/src/components/Combobox/combobox.principles.stories.tsx +238 -0
- package/src/components/Combobox/combobox.spec.md +45 -16
- package/src/components/Combobox/combobox.stories.tsx +194 -0
- package/src/components/Combobox/combobox.tsx +278 -97
- package/src/components/Combobox/index.ts +5 -0
- package/src/components/Command/command.anatomy.stories.tsx +107 -0
- package/src/components/Command/command.principles.stories.tsx +86 -0
- package/src/components/Command/command.spec.md +33 -23
- package/src/components/Command/command.stories.tsx +312 -0
- package/src/components/Command/command.tsx +28 -12
- package/src/components/Command/index.ts +5 -0
- package/src/components/DataTable/active-editor-controller.ts +4 -3
- package/src/components/DataTable/cell-registry.tsx +161 -120
- package/src/components/DataTable/column-types.ts +14 -18
- package/src/components/DataTable/data-table-column-visibility-panel.tsx +28 -12
- package/src/components/DataTable/data-table-filter-group.tsx +248 -0
- package/src/components/DataTable/data-table-filter-labels.ts +100 -0
- package/src/components/DataTable/data-table-filter-panel.tsx +85 -448
- package/src/components/DataTable/data-table-filter-value-picker.tsx +254 -0
- package/src/components/DataTable/data-table-interaction-layer.tsx +26 -29
- package/src/components/DataTable/data-table-sort-manager.tsx +19 -11
- package/src/components/DataTable/data-table.anatomy.stories.tsx +522 -0
- package/src/components/DataTable/data-table.css +34 -8
- package/src/components/DataTable/data-table.principles.stories.tsx +270 -0
- package/src/components/DataTable/data-table.spec.md +186 -172
- package/src/components/DataTable/data-table.stories.tsx +2311 -0
- package/src/components/DataTable/data-table.tsx +678 -278
- package/src/components/DataTable/filter-operators.spec.md +269 -0
- package/src/components/DataTable/filter-operators.ts +1 -1
- package/src/components/DataTable/filter-tree.ts +194 -44
- package/src/components/DataTable/index.ts +8 -0
- package/src/components/DateGrid/date-grid.anatomy.stories.tsx +587 -0
- package/src/components/DateGrid/date-grid.principles.stories.tsx +344 -0
- package/src/components/DateGrid/date-grid.spec.md +46 -41
- package/src/components/DateGrid/date-grid.stories.tsx +204 -0
- package/src/components/DateGrid/date-grid.tsx +89 -28
- package/src/components/DateGrid/index.ts +5 -0
- package/src/components/DatePicker/date-picker.anatomy.stories.tsx +946 -0
- package/src/components/DatePicker/date-picker.principles.stories.tsx +205 -0
- package/src/components/DatePicker/date-picker.spec.md +61 -57
- package/src/components/DatePicker/date-picker.stories.tsx +364 -0
- package/src/components/DatePicker/date-picker.tsx +382 -198
- package/src/components/DatePicker/index.ts +5 -0
- package/src/components/DescriptionList/description-list.anatomy.stories.tsx +254 -0
- package/src/components/DescriptionList/description-list.principles.stories.tsx +309 -0
- package/src/components/DescriptionList/description-list.spec.md +35 -30
- package/src/components/DescriptionList/description-list.stories.tsx +113 -0
- package/src/components/DescriptionList/description-list.tsx +16 -14
- package/src/components/DescriptionList/index.ts +5 -0
- package/src/components/Dialog/dialog.anatomy.stories.tsx +485 -0
- package/src/components/Dialog/dialog.principles.stories.tsx +261 -0
- package/src/components/Dialog/dialog.spec.md +58 -32
- package/src/components/Dialog/dialog.stories.tsx +548 -0
- package/src/components/Dialog/dialog.tsx +81 -36
- package/src/components/Dialog/index.ts +5 -0
- package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +971 -0
- package/src/components/DropdownMenu/dropdown-menu.principles.stories.tsx +341 -0
- package/src/components/DropdownMenu/dropdown-menu.spec.md +40 -22
- package/src/components/DropdownMenu/dropdown-menu.stories.tsx +276 -0
- package/src/components/DropdownMenu/dropdown-menu.tsx +153 -40
- package/src/components/DropdownMenu/index.ts +5 -0
- package/src/components/Empty/empty.anatomy.stories.tsx +275 -0
- package/src/components/Empty/empty.principles.stories.tsx +314 -0
- package/src/components/Empty/empty.spec.md +42 -42
- package/src/components/Empty/empty.stories.tsx +69 -0
- package/src/components/Empty/empty.tsx +23 -11
- package/src/components/Empty/index.ts +5 -0
- package/src/components/Field/field-context.ts +196 -4
- package/src/components/Field/field-controls.spec.md +161 -54
- package/src/components/Field/field-edit-keys.ts +66 -0
- package/src/components/Field/field-types.ts +71 -20
- package/src/components/Field/field-wrapper.tsx +139 -89
- package/src/components/Field/field.anatomy.stories.tsx +547 -0
- package/src/components/Field/field.principles.stories.tsx +255 -0
- package/src/components/Field/field.spec.md +76 -34
- package/src/components/Field/field.stories.tsx +751 -0
- package/src/components/Field/field.tsx +65 -12
- package/src/components/Field/form-validation.spec.md +60 -34
- package/src/components/Field/index.ts +6 -0
- package/src/components/Field/use-form-validation.ts +270 -0
- package/src/components/FieldControlGroup/field-control-group.anatomy.stories.tsx +119 -0
- package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +121 -0
- package/src/components/FieldControlGroup/field-control-group.spec.md +41 -19
- package/src/components/FieldControlGroup/field-control-group.stories.tsx +162 -0
- package/src/components/FieldControlGroup/field-control-group.tsx +13 -15
- package/src/components/FieldControlGroup/index.ts +5 -0
- package/src/components/FileItem/file-item.anatomy.stories.tsx +346 -0
- package/src/components/FileItem/file-item.principles.stories.tsx +245 -0
- package/src/components/FileItem/file-item.spec.md +133 -104
- package/src/components/FileItem/file-item.stories.tsx +289 -0
- package/src/components/FileItem/file-item.tsx +85 -39
- package/src/components/FileItem/index.ts +5 -0
- package/src/components/FileUpload/file-upload.anatomy.stories.tsx +446 -0
- package/src/components/FileUpload/file-upload.principles.stories.tsx +312 -0
- package/src/components/FileUpload/file-upload.spec.md +66 -24
- package/src/components/FileUpload/file-upload.stories.tsx +219 -0
- package/src/components/FileUpload/file-upload.tsx +138 -43
- package/src/components/FileUpload/index.ts +5 -0
- package/src/components/FileViewer/can-render-image.ts +15 -0
- package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +1130 -0
- package/src/components/FileViewer/file-viewer.principles.stories.tsx +636 -0
- package/src/components/FileViewer/file-viewer.spec.md +70 -58
- package/src/components/FileViewer/file-viewer.stories.tsx +417 -0
- package/src/components/FileViewer/file-viewer.tsx +157 -72
- package/src/components/FileViewer/image-renderer.tsx +38 -15
- package/src/components/FileViewer/index.ts +5 -0
- package/src/components/HoverCard/hover-card.anatomy.stories.tsx +151 -0
- package/src/components/HoverCard/hover-card.principles.stories.tsx +211 -0
- package/src/components/HoverCard/hover-card.spec.md +38 -28
- package/src/components/HoverCard/hover-card.stories.tsx +304 -0
- package/src/components/HoverCard/hover-card.tsx +23 -6
- package/src/components/HoverCard/index.ts +5 -0
- package/src/components/InlineEdit/index.ts +5 -0
- package/src/components/InlineEdit/inline-edit.anatomy.stories.tsx +250 -0
- package/src/components/InlineEdit/inline-edit.principles.stories.tsx +142 -0
- package/src/components/InlineEdit/inline-edit.spec.md +186 -0
- package/src/components/InlineEdit/inline-edit.stories.tsx +261 -0
- package/src/components/InlineEdit/inline-edit.tsx +455 -0
- package/src/components/Input/index.ts +5 -0
- package/src/components/Input/input.anatomy.stories.tsx +780 -0
- package/src/components/Input/input.principles.stories.tsx +260 -0
- package/src/components/Input/input.spec.md +34 -26
- package/src/components/Input/input.stories.tsx +150 -0
- package/src/components/Input/input.tsx +102 -45
- package/src/components/LinkInput/index.ts +5 -0
- package/src/components/LinkInput/link-input.anatomy.stories.tsx +748 -0
- package/src/components/LinkInput/link-input.principles.stories.tsx +182 -0
- package/src/components/LinkInput/link-input.spec.md +25 -7
- package/src/components/LinkInput/link-input.stories.tsx +133 -0
- package/src/components/LinkInput/link-input.tsx +89 -66
- package/src/components/Menu/index.ts +5 -0
- package/src/components/Menu/menu-item.anatomy.stories.tsx +780 -0
- package/src/components/Menu/menu-item.principles.stories.tsx +81 -0
- package/src/components/Menu/menu-item.spec.md +55 -32
- package/src/components/Menu/menu-item.stories.tsx +242 -0
- package/src/components/Menu/menu-item.tsx +71 -12
- package/src/components/Notice/index.ts +5 -0
- package/src/components/Notice/notice.anatomy.stories.tsx +614 -0
- package/src/components/Notice/notice.principles.stories.tsx +102 -0
- package/src/components/Notice/notice.spec.md +39 -18
- package/src/components/Notice/notice.stories.tsx +257 -0
- package/src/components/Notice/notice.tsx +62 -16
- package/src/components/NumberInput/index.ts +5 -0
- package/src/components/NumberInput/number-input.anatomy.stories.tsx +822 -0
- package/src/components/NumberInput/number-input.principles.stories.tsx +206 -0
- package/src/components/NumberInput/number-input.spec.md +35 -16
- package/src/components/NumberInput/number-input.stories.tsx +167 -0
- package/src/components/NumberInput/number-input.tsx +65 -31
- package/src/components/OverflowIndicator/index.ts +5 -0
- package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +550 -0
- package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +76 -0
- package/src/components/OverflowIndicator/overflow-indicator.spec.md +36 -26
- package/src/components/OverflowIndicator/overflow-indicator.stories.tsx +222 -0
- package/src/components/OverflowIndicator/overflow-indicator.tsx +22 -7
- package/src/components/Pagination/index.ts +5 -0
- package/src/components/Pagination/pagination.anatomy.stories.tsx +144 -0
- package/src/components/Pagination/pagination.principles.stories.tsx +81 -0
- package/src/components/Pagination/pagination.spec.md +150 -0
- package/src/components/Pagination/pagination.stories.tsx +97 -0
- package/src/components/Pagination/pagination.tsx +263 -0
- package/src/components/PeoplePicker/avatar-stack-overflow.ts +1 -1
- package/src/components/PeoplePicker/index.ts +5 -0
- package/src/components/PeoplePicker/people-picker-helpers.ts +5 -5
- package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +437 -0
- package/src/components/PeoplePicker/people-picker.principles.stories.tsx +196 -0
- package/src/components/PeoplePicker/people-picker.spec.md +97 -40
- package/src/components/PeoplePicker/people-picker.stories.tsx +245 -0
- package/src/components/PeoplePicker/people-picker.tsx +225 -108
- package/src/components/PeoplePicker/person-display.tsx +83 -47
- package/src/components/Popover/index.ts +5 -0
- package/src/components/Popover/popover.anatomy.stories.tsx +282 -0
- package/src/components/Popover/popover.principles.stories.tsx +316 -0
- package/src/components/Popover/popover.spec.md +41 -31
- package/src/components/Popover/popover.stories.tsx +120 -0
- package/src/components/Popover/popover.tsx +106 -47
- package/src/components/ProfileCard/index.ts +5 -0
- package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +493 -0
- package/src/components/ProfileCard/profile-card.principles.stories.tsx +225 -0
- package/src/components/ProfileCard/profile-card.spec.md +189 -0
- package/src/components/ProfileCard/profile-card.stories.tsx +57 -0
- package/src/components/{NameCard/name-card.tsx → ProfileCard/profile-card.tsx} +66 -39
- package/src/components/ProgressBar/index.ts +5 -0
- package/src/components/ProgressBar/progress-bar.anatomy.stories.tsx +441 -0
- package/src/components/ProgressBar/progress-bar.principles.stories.tsx +326 -0
- package/src/components/ProgressBar/progress-bar.spec.md +25 -21
- package/src/components/ProgressBar/progress-bar.stories.tsx +133 -0
- package/src/components/ProgressBar/progress-bar.tsx +6 -23
- package/src/components/README.md +5 -4
- package/src/components/RadioGroup/index.ts +5 -0
- package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +672 -0
- package/src/components/RadioGroup/radio-group.principles.stories.tsx +163 -0
- package/src/components/RadioGroup/radio-group.spec.md +15 -9
- package/src/components/RadioGroup/radio-group.stories.tsx +204 -0
- package/src/components/RadioGroup/radio-group.tsx +219 -67
- package/src/components/Rating/index.ts +5 -0
- package/src/components/Rating/rating.anatomy.stories.tsx +498 -0
- package/src/components/Rating/rating.principles.stories.tsx +296 -0
- package/src/components/Rating/rating.spec.md +41 -29
- package/src/components/Rating/rating.stories.tsx +119 -0
- package/src/components/Rating/rating.tsx +37 -18
- package/src/components/ScrollArea/index.ts +5 -0
- package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +451 -0
- package/src/components/ScrollArea/scroll-area.principles.stories.tsx +331 -0
- package/src/components/ScrollArea/scroll-area.spec.md +24 -22
- package/src/components/ScrollArea/scroll-area.stories.tsx +247 -0
- package/src/components/ScrollArea/scroll-area.tsx +24 -7
- package/src/components/SegmentedControl/index.ts +5 -0
- package/src/components/SegmentedControl/segmented-control.anatomy.stories.tsx +295 -0
- package/src/components/SegmentedControl/segmented-control.principles.stories.tsx +284 -0
- package/src/components/SegmentedControl/segmented-control.spec.md +38 -39
- package/src/components/SegmentedControl/segmented-control.stories.tsx +37 -0
- package/src/components/SegmentedControl/segmented-control.tsx +44 -24
- package/src/components/Select/index.ts +5 -0
- package/src/components/Select/select.anatomy.stories.tsx +834 -0
- package/src/components/Select/select.principles.stories.tsx +312 -0
- package/src/components/Select/select.spec.md +99 -39
- package/src/components/Select/select.stories.tsx +273 -0
- package/src/components/Select/select.tsx +389 -97
- package/src/components/SelectMenu/index.ts +5 -0
- package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +830 -0
- package/src/components/SelectMenu/select-menu.principles.stories.tsx +106 -0
- package/src/components/SelectMenu/select-menu.spec.md +51 -32
- package/src/components/SelectMenu/select-menu.stories.tsx +143 -0
- package/src/components/SelectMenu/select-menu.tsx +276 -33
- package/src/components/SelectionControl/boolean-value.tsx +39 -0
- package/src/components/SelectionControl/index.ts +6 -0
- package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +580 -0
- package/src/components/SelectionControl/selection-item.principles.stories.tsx +77 -0
- package/src/components/SelectionControl/selection-item.spec.md +30 -16
- package/src/components/SelectionControl/selection-item.stories.tsx +137 -0
- package/src/components/SelectionControl/selection-item.tsx +8 -2
- package/src/components/Separator/index.ts +5 -0
- package/src/components/Separator/separator.anatomy.stories.tsx +125 -0
- package/src/components/Separator/separator.principles.stories.tsx +141 -0
- package/src/components/Separator/separator.spec.md +15 -9
- package/src/components/Separator/separator.stories.tsx +106 -0
- package/src/components/Separator/separator.tsx +2 -2
- package/src/components/Sheet/index.ts +5 -0
- package/src/components/Sheet/sheet.anatomy.stories.tsx +269 -0
- package/src/components/Sheet/sheet.principles.stories.tsx +353 -0
- package/src/components/Sheet/sheet.spec.md +16 -17
- package/src/components/Sheet/sheet.stories.tsx +172 -0
- package/src/components/Sheet/sheet.tsx +24 -14
- package/src/components/Sidebar/index.ts +5 -0
- package/src/components/Sidebar/sidebar.anatomy.stories.tsx +776 -0
- package/src/components/Sidebar/sidebar.principles.stories.tsx +507 -0
- package/src/components/Sidebar/sidebar.spec.md +65 -62
- package/src/components/Sidebar/sidebar.stories.tsx +535 -0
- package/src/components/Sidebar/sidebar.tsx +134 -57
- package/src/components/Skeleton/index.ts +5 -0
- package/src/components/Skeleton/skeleton.anatomy.stories.tsx +145 -0
- package/src/components/Skeleton/skeleton.principles.stories.tsx +234 -0
- package/src/components/Skeleton/skeleton.spec.md +15 -14
- package/src/components/Skeleton/skeleton.stories.tsx +134 -0
- package/src/components/Skeleton/skeleton.tsx +2 -2
- package/src/components/Slider/index.ts +5 -0
- package/src/components/Slider/slider.anatomy.stories.tsx +237 -0
- package/src/components/Slider/slider.principles.stories.tsx +250 -0
- package/src/components/Slider/slider.spec.md +66 -118
- package/src/components/Slider/slider.stories.tsx +115 -0
- package/src/components/Slider/slider.tsx +83 -26
- package/src/components/Steps/index.ts +5 -0
- package/src/components/Steps/steps.anatomy.stories.tsx +448 -0
- package/src/components/Steps/steps.principles.stories.tsx +300 -0
- package/src/components/Steps/steps.spec.md +91 -74
- package/src/components/Steps/steps.stories.tsx +306 -0
- package/src/components/Steps/steps.tsx +99 -37
- package/src/components/Switch/index.ts +5 -0
- package/src/components/Switch/switch.anatomy.stories.tsx +227 -0
- package/src/components/Switch/switch.principles.stories.tsx +177 -0
- package/src/components/Switch/switch.spec.md +53 -24
- package/src/components/Switch/switch.stories.tsx +95 -0
- package/src/components/Switch/switch.tsx +176 -43
- package/src/components/Tabs/index.ts +5 -0
- package/src/components/Tabs/tabs-inline-action-geometry.ts +94 -0
- package/src/components/Tabs/tabs.anatomy.stories.tsx +424 -0
- package/src/components/Tabs/tabs.principles.stories.tsx +291 -0
- package/src/components/Tabs/tabs.spec.md +58 -69
- package/src/components/Tabs/tabs.stories.tsx +257 -0
- package/src/components/Tabs/tabs.tsx +262 -82
- package/src/components/Tag/index.ts +5 -0
- package/src/components/Tag/tag.anatomy.stories.tsx +667 -0
- package/src/components/Tag/tag.principles.stories.tsx +270 -0
- package/src/components/Tag/tag.spec.md +112 -100
- package/src/components/Tag/tag.stories.tsx +88 -0
- package/src/components/Tag/tag.tsx +120 -80
- package/src/components/Textarea/index.ts +5 -0
- package/src/components/Textarea/textarea.anatomy.stories.tsx +310 -0
- package/src/components/Textarea/textarea.principles.stories.tsx +192 -0
- package/src/components/Textarea/textarea.spec.md +35 -16
- package/src/components/Textarea/textarea.stories.tsx +57 -0
- package/src/components/Textarea/textarea.tsx +154 -83
- package/src/components/TimePicker/index.ts +5 -0
- package/src/components/TimePicker/time-columns.tsx +15 -3
- package/src/components/TimePicker/time-picker.anatomy.stories.tsx +283 -0
- package/src/components/TimePicker/time-picker.principles.stories.tsx +133 -0
- package/src/components/TimePicker/time-picker.spec.md +58 -52
- package/src/components/TimePicker/time-picker.stories.tsx +193 -0
- package/src/components/TimePicker/time-picker.tsx +119 -60
- package/src/components/Toast/index.ts +5 -0
- package/src/components/Toast/toast.anatomy.stories.tsx +328 -0
- package/src/components/Toast/toast.principles.stories.tsx +216 -0
- package/src/components/Toast/toast.spec.md +26 -16
- package/src/components/Toast/toast.stories.tsx +241 -0
- package/src/components/Toast/toast.tsx +101 -23
- package/src/components/Tooltip/index.ts +5 -0
- package/src/components/Tooltip/tooltip.anatomy.stories.tsx +422 -0
- package/src/components/Tooltip/tooltip.principles.stories.tsx +204 -0
- package/src/components/Tooltip/tooltip.spec.md +37 -23
- package/src/components/Tooltip/tooltip.stories.tsx +82 -0
- package/src/components/Tooltip/tooltip.tsx +58 -12
- package/src/components/TreeView/index.ts +5 -0
- package/src/components/TreeView/tree-view.anatomy.stories.tsx +436 -0
- package/src/components/TreeView/tree-view.principles.stories.tsx +223 -0
- package/src/components/TreeView/tree-view.spec.md +103 -54
- package/src/components/TreeView/tree-view.stories.tsx +365 -0
- package/src/components/TreeView/tree-view.tsx +501 -58
- package/src/hooks/use-controllable.ts +7 -2
- package/src/hooks/use-is-touch-device.ts +8 -1
- package/src/hooks/use-overflow-items.ts +10 -6
- package/src/hooks/use-truncated.ts +111 -0
- package/src/index.ts +648 -71
- package/src/lib/drag-visual.ts +2 -2
- package/src/lib/utils.ts +21 -1
- package/src/patterns/README.md +20 -16
- package/src/patterns/action-bar/action-bar.spec.md +63 -45
- package/src/patterns/action-bar/action-bar.stories.tsx +619 -0
- package/src/patterns/element-anatomy/element-anatomy.spec.md +17 -13
- package/src/patterns/element-anatomy/index.ts +6 -0
- package/src/patterns/element-anatomy/inline-action.spec.md +33 -22
- package/src/patterns/element-anatomy/item-anatomy.spec.md +108 -79
- package/src/patterns/element-anatomy/item-anatomy.stories.tsx +1648 -0
- package/src/patterns/element-anatomy/item-anatomy.tsx +147 -56
- package/src/patterns/element-anatomy/truncated-text.spec.md +68 -0
- package/src/patterns/element-anatomy/truncated-text.tsx +61 -0
- package/src/patterns/header-canonical/chrome-header.tsx +26 -6
- package/src/patterns/header-canonical/header-canonical.css +3 -4
- package/src/patterns/header-canonical/header-canonical.spec.md +96 -42
- package/src/patterns/header-canonical/header-canonical.stories.tsx +257 -0
- package/src/patterns/header-canonical/index.ts +5 -0
- package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +36 -15
- package/src/patterns/horizontal-overflow/horizontal-overflow.stories.tsx +139 -0
- package/src/patterns/horizontal-overflow/horizontal-overflow.tsx +1 -1
- package/src/patterns/horizontal-overflow/index.ts +5 -0
- package/src/patterns/overlay-surface/index.ts +5 -0
- package/src/patterns/overlay-surface/overlay-surface.spec.md +94 -58
- package/src/patterns/overlay-surface/overlay-surface.stories.tsx +132 -0
- package/src/patterns/overlay-surface/overlay-surface.tsx +37 -18
- package/src/patterns/resize-handle/index.ts +5 -0
- package/src/patterns/resize-handle/resize-handle.spec.md +22 -13
- package/src/patterns/resize-handle/resize-handle.stories.tsx +73 -0
- package/src/patterns/resize-handle/resize-handle.tsx +13 -18
- package/src/story-governance/category-matrix.json +132 -0
- package/src/story-governance/category-matrix.ts +55 -0
- package/src/styles/base.css +99 -0
- package/src/styles/tokens.css +14 -0
- package/src/tokens/README.md +10 -5
- package/src/tokens/categorical-color.ts +164 -0
- package/src/tokens/color/color.spec.md +95 -72
- package/src/tokens/color/color.stories.tsx +403 -0
- package/src/tokens/color/primitives.css +23 -7
- package/src/tokens/color/semantic.css +75 -21
- package/src/tokens/density/density.spec.md +33 -30
- package/src/tokens/density/density.stories.tsx +254 -0
- package/src/tokens/elevation/elevation.spec.md +11 -14
- package/src/tokens/elevation/elevation.stories.tsx +99 -0
- package/src/tokens/layoutSpace/layoutSpace.css +1 -1
- package/src/tokens/layoutSpace/layoutSpace.spec.md +44 -31
- package/src/tokens/layoutSpace/layoutSpace.stories.tsx +76 -0
- package/src/tokens/motion/motion.css +49 -20
- package/src/tokens/motion/motion.spec.md +45 -21
- package/src/tokens/motion/motion.stories.tsx +196 -0
- package/src/tokens/motion/motion.ts +8 -7
- package/src/tokens/motion/overlay-motion.ts +26 -0
- package/src/tokens/opacity/opacity.spec.md +15 -20
- package/src/tokens/opacity/opacity.stories.tsx +66 -0
- package/src/tokens/orphan-tokens.spec.md +22 -11
- package/src/tokens/radius/radius.spec.md +14 -11
- package/src/tokens/radius/radius.stories.tsx +87 -0
- package/src/tokens/token-system.spec.md +241 -0
- package/src/tokens/typography/typography.css +1 -1
- package/src/tokens/typography/typography.spec.md +12 -8
- package/src/tokens/typography/typography.stories.tsx +134 -0
- package/src/tokens/uiSize/icon-size.ts +3 -4
- package/src/tokens/uiSize/uiSize.css +58 -1
- package/src/tokens/uiSize/uiSize.spec.md +61 -32
- package/src/tokens/uiSize/uiSize.stories.tsx +106 -0
- package/src/tokens/utility-registry.json +426 -0
- package/src/tokens/utility-registry.schema.json +409 -0
- package/tools/README.md +9 -0
- package/tools/codemods/cli.mjs +93 -0
- package/tools/codemods/index.mjs +582 -0
- package/tools/shared/safe-filesystem.mjs +371 -0
- package/tools/visual-baseline/cli.mjs +97 -0
- package/tools/visual-baseline/index.mjs +522 -0
- package/dist/components/NameCard/name-card.d.ts.map +0 -1
- package/dist/components/NameCard/name-card.js.map +0 -1
- package/ds-canonical/commands/gov-status.md +0 -79
- package/ds-canonical/hooks/check_app_shell_primary_header_consistency.sh +0 -68
- package/ds-canonical/hooks/check_chrome_header_handcraft.sh +0 -70
- package/ds-canonical/hooks/check_header_with_tabs_border.sh +0 -87
- package/ds-canonical/hooks/check_tab_lg_chrome_header_equal.sh +0 -66
- package/ds-canonical/hooks/tests/KNOWN-BROKEN.md +0 -15
- package/ds-canonical/hooks/tests/test_check_story_category.sh.broken +0 -187
- package/ds-canonical/references/audit-coverage-vs-24-checklist.md +0 -74
- package/ds-canonical/skills/design-system-audit/references/spec-template.md +0 -66
- package/src/components/NameCard/name-card.spec.md +0 -171
|
@@ -0,0 +1,1412 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { createHash, randomBytes } from 'node:crypto'
|
|
4
|
+
import { spawnSync } from 'node:child_process'
|
|
5
|
+
import {
|
|
6
|
+
chmodSync,
|
|
7
|
+
closeSync,
|
|
8
|
+
constants as fsConstants,
|
|
9
|
+
fstatSync,
|
|
10
|
+
fsyncSync,
|
|
11
|
+
lstatSync,
|
|
12
|
+
mkdirSync,
|
|
13
|
+
mkdtempSync,
|
|
14
|
+
openSync,
|
|
15
|
+
readFileSync,
|
|
16
|
+
readdirSync,
|
|
17
|
+
realpathSync,
|
|
18
|
+
renameSync,
|
|
19
|
+
rmSync,
|
|
20
|
+
unlinkSync,
|
|
21
|
+
writeFileSync,
|
|
22
|
+
} from 'node:fs'
|
|
23
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'
|
|
24
|
+
import { fileURLToPath } from 'node:url'
|
|
25
|
+
import { gunzipSync } from 'node:zlib'
|
|
26
|
+
import {
|
|
27
|
+
createIsolatedGovernanceNpmEnvironment,
|
|
28
|
+
GOVERNANCE_DEPENDENCY_EXACT_NPM_VERSION,
|
|
29
|
+
GOVERNANCE_DEPENDENCY_REGISTRY,
|
|
30
|
+
runClosedBootstrapStep,
|
|
31
|
+
} from './lib/governance-dependency-bootstrap.mjs'
|
|
32
|
+
import {
|
|
33
|
+
assertVerifiedExactNpmRuntimeCapability,
|
|
34
|
+
prepareVerifiedExactNpmRuntime,
|
|
35
|
+
resolveExactNpmRuntimeContract,
|
|
36
|
+
} from './lib/verified-exact-npm-runtime.mjs'
|
|
37
|
+
import {
|
|
38
|
+
assertGitVisibleWorktreeUnchanged,
|
|
39
|
+
captureGitVisibleWorktree,
|
|
40
|
+
} from './lib/worktree-fingerprint.mjs'
|
|
41
|
+
|
|
42
|
+
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..')
|
|
43
|
+
const ERROR_PREFIX = 'GOV-PROVIDER-CLI-TOOLCHAIN-001'
|
|
44
|
+
const AUTHORITY_MANIFEST_PATH = 'infra/governance/providers/provider-cli-toolchain.json'
|
|
45
|
+
const CONSUMER_MANIFEST_PATH = 'governance/provider-cli-toolchain.json'
|
|
46
|
+
const INSTALL_TIMEOUT_MS = 20 * 60 * 1_000
|
|
47
|
+
const AUDIT_TIMEOUT_MS = 10 * 60 * 1_000
|
|
48
|
+
const VERSION_TIMEOUT_MS = 30 * 1_000
|
|
49
|
+
const PACKAGE_CONTENT_PROTOCOL = 'npm-ustar-package-tree-v1'
|
|
50
|
+
const PACKAGE_CONTENT_MODE_POLICY = 'excluded-portable-content-only'
|
|
51
|
+
const PACKAGE_CONTENT_DIGEST_DOMAIN = 'qijenchen-provider-cli-package-content-v1'
|
|
52
|
+
const ACTIVE_PACKAGE_CONTENT_BINDING_DOMAIN = 'qijenchen-provider-cli-active-package-content-v1'
|
|
53
|
+
const RUNTIME_CONTENT_TARGET_PROTOCOL = 'content-v2'
|
|
54
|
+
const MAX_PROVIDER_PACKAGE_COMPRESSED_BYTES = 512 * 1024 * 1024
|
|
55
|
+
const MAX_PROVIDER_PACKAGE_EXPANDED_BYTES = 1024 * 1024 * 1024
|
|
56
|
+
const MAX_PROVIDER_PACKAGE_FILE_BYTES = 512 * 1024 * 1024
|
|
57
|
+
const MAX_PROVIDER_PACKAGE_FILE_COUNT = 100_000
|
|
58
|
+
const MAX_PROVIDER_PACKAGE_ENTRY_COUNT = 100_000
|
|
59
|
+
const MAX_PROVIDER_PACKAGE_PATH_BYTES = 4096
|
|
60
|
+
const MAX_PROVIDER_PACKAGE_PATH_DEPTH = 64
|
|
61
|
+
const MAX_PROVIDER_PACKAGE_SEGMENT_BYTES = 255
|
|
62
|
+
const SHA256 = /^[a-f0-9]{64}$/
|
|
63
|
+
const SHA512_INTEGRITY = /^sha512-([A-Za-z0-9+/]+={0,2})$/
|
|
64
|
+
const EXACT_VERSION = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z][0-9A-Za-z.-]*)?$/
|
|
65
|
+
const EXACT_ALIAS = /^npm:(@[a-z0-9-]+\/[a-z0-9-]+)@(\d+\.\d+\.\d+(?:-[0-9A-Za-z][0-9A-Za-z.-]*)?)$/
|
|
66
|
+
const SUPPORTED_PROVIDER_CLI_PLATFORMS = Object.freeze(['darwin-arm64', 'darwin-x64', 'linux-arm64', 'linux-x64'])
|
|
67
|
+
|
|
68
|
+
export const PROVIDER_CLI_PACKAGE_CONTENT_CONTRACT = Object.freeze({
|
|
69
|
+
digestDomain: PACKAGE_CONTENT_DIGEST_DOMAIN,
|
|
70
|
+
maxCompressedBytes: MAX_PROVIDER_PACKAGE_COMPRESSED_BYTES,
|
|
71
|
+
maxExpandedBytes: MAX_PROVIDER_PACKAGE_EXPANDED_BYTES,
|
|
72
|
+
maxEntryCount: MAX_PROVIDER_PACKAGE_ENTRY_COUNT,
|
|
73
|
+
maxFileBytes: MAX_PROVIDER_PACKAGE_FILE_BYTES,
|
|
74
|
+
maxFileCount: MAX_PROVIDER_PACKAGE_FILE_COUNT,
|
|
75
|
+
maxPathBytes: MAX_PROVIDER_PACKAGE_PATH_BYTES,
|
|
76
|
+
maxPathDepth: MAX_PROVIDER_PACKAGE_PATH_DEPTH,
|
|
77
|
+
maxSegmentBytes: MAX_PROVIDER_PACKAGE_SEGMENT_BYTES,
|
|
78
|
+
modePolicy: PACKAGE_CONTENT_MODE_POLICY,
|
|
79
|
+
protocol: PACKAGE_CONTENT_PROTOCOL,
|
|
80
|
+
supportedPlatforms: SUPPORTED_PROVIDER_CLI_PLATFORMS,
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
export class ProviderCliControlPlaneUpdateRequiredError extends Error {
|
|
84
|
+
constructor(message) {
|
|
85
|
+
super(`${ERROR_PREFIX}:${message}`)
|
|
86
|
+
this.name = 'ProviderCliControlPlaneUpdateRequiredError'
|
|
87
|
+
this.code = 'GOV-PROVIDER-CLI-CONTROL-PLANE-UPDATE-REQUIRED'
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function invariant(condition, message) {
|
|
92
|
+
if (!condition) throw new Error(`${ERROR_PREFIX}:${message}`)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function controlPlaneInvariant(condition, message) {
|
|
96
|
+
if (!condition) throw new ProviderCliControlPlaneUpdateRequiredError(message)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function sha256(bytes) {
|
|
100
|
+
return createHash('sha256').update(bytes).digest('hex')
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function sha512Integrity(bytes) {
|
|
104
|
+
return `sha512-${createHash('sha512').update(bytes).digest('base64')}`
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function exactKeys(value, expected, label) {
|
|
108
|
+
invariant(value && typeof value === 'object' && !Array.isArray(value), `${label} must be an object`)
|
|
109
|
+
invariant(
|
|
110
|
+
JSON.stringify(Object.keys(value).sort()) === JSON.stringify([...expected].sort()),
|
|
111
|
+
`${label} has an invalid or open shape`,
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function portableRepoPath(value, label) {
|
|
116
|
+
invariant(
|
|
117
|
+
typeof value === 'string'
|
|
118
|
+
&& value.length > 0
|
|
119
|
+
&& !isAbsolute(value)
|
|
120
|
+
&& !value.includes('\\')
|
|
121
|
+
&& !/[\0\n\r]/.test(value)
|
|
122
|
+
&& value.split('/').every(part => part && part !== '.' && part !== '..'),
|
|
123
|
+
`${label} must be a portable repository-relative path`,
|
|
124
|
+
)
|
|
125
|
+
return value
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function resolveContained(root, repoPath, label) {
|
|
129
|
+
portableRepoPath(repoPath, label)
|
|
130
|
+
const absolute = resolve(root, repoPath)
|
|
131
|
+
const rel = relative(root, absolute)
|
|
132
|
+
invariant(rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel), `${label} escapes the repository`)
|
|
133
|
+
return absolute
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function validateProviderCliFilesystemAuthority(metadata, {
|
|
137
|
+
currentUid = typeof process.getuid === 'function' ? process.getuid() : null,
|
|
138
|
+
label = 'provider CLI filesystem entry',
|
|
139
|
+
} = {}) {
|
|
140
|
+
invariant(Number.isInteger(currentUid) && currentUid >= 0, `${label} requires one POSIX process uid`)
|
|
141
|
+
const bigint = typeof metadata?.uid === 'bigint' || typeof metadata?.mode === 'bigint'
|
|
142
|
+
const uid = bigint ? BigInt(metadata?.uid) : metadata?.uid
|
|
143
|
+
const mode = bigint ? BigInt(metadata?.mode) : metadata?.mode
|
|
144
|
+
const processUid = bigint ? BigInt(currentUid) : currentUid
|
|
145
|
+
const rootUid = bigint ? 0n : 0
|
|
146
|
+
const zero = bigint ? 0n : 0
|
|
147
|
+
const writeMask = bigint ? 0o022n : 0o022
|
|
148
|
+
const fileTypeMask = bigint ? 0o170000n : 0o170000
|
|
149
|
+
const directoryType = bigint ? 0o040000n : 0o040000
|
|
150
|
+
const stickyBit = bigint ? 0o1000n : 0o1000
|
|
151
|
+
invariant(uid === processUid || uid === rootUid, `${label} must be owned by the current uid or root`)
|
|
152
|
+
const writableByGroupOrOther = (mode & writeMask) !== zero
|
|
153
|
+
const rootOwnedStickyDirectory = uid === rootUid
|
|
154
|
+
&& (mode & fileTypeMask) === directoryType
|
|
155
|
+
&& (mode & stickyBit) === stickyBit
|
|
156
|
+
invariant(
|
|
157
|
+
!writableByGroupOrOther || rootOwnedStickyDirectory,
|
|
158
|
+
`${label} must not be writable by group or other users`,
|
|
159
|
+
)
|
|
160
|
+
// macOS CloudStorage providers commonly attach deny-only ACL entries (for example,
|
|
161
|
+
// "everyone deny delete"). ACL presence is not itself replacement authority, so this
|
|
162
|
+
// local POSIX gate intentionally evaluates owner/mode instead of rejecting an ACL marker.
|
|
163
|
+
return true
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function assertTrustedPathAuthority(path, label, { includeEntry = true } = {}) {
|
|
167
|
+
let current = includeEntry ? resolve(path) : dirname(resolve(path))
|
|
168
|
+
for (;;) {
|
|
169
|
+
const info = lstatSync(current, { bigint: true })
|
|
170
|
+
invariant(!info.isSymbolicLink(), `${label} authority chain must not contain a symbolic link:${current}`)
|
|
171
|
+
invariant(realpathSync(current) === current, `${label} authority chain must not traverse a symbolic-link alias:${current}`)
|
|
172
|
+
validateProviderCliFilesystemAuthority(info, { label: `${label} authority ${current}` })
|
|
173
|
+
const parent = dirname(current)
|
|
174
|
+
if (parent === current) break
|
|
175
|
+
current = parent
|
|
176
|
+
}
|
|
177
|
+
return path
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function readRegularBytes(path, label, { optional = false } = {}) {
|
|
181
|
+
let info
|
|
182
|
+
try {
|
|
183
|
+
info = lstatSync(path)
|
|
184
|
+
} catch (error) {
|
|
185
|
+
if (optional && error?.code === 'ENOENT') return null
|
|
186
|
+
throw error
|
|
187
|
+
}
|
|
188
|
+
invariant(info.isFile() && !info.isSymbolicLink() && info.nlink === 1, `${label} must be one regular no-link file`)
|
|
189
|
+
invariant(realpathSync(path) === path, `${label} must not traverse a symbolic-link alias`)
|
|
190
|
+
assertTrustedPathAuthority(path, label)
|
|
191
|
+
return readFileSync(path)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function parseJson(bytes, label) {
|
|
195
|
+
try {
|
|
196
|
+
return JSON.parse(bytes.toString('utf8'))
|
|
197
|
+
} catch (error) {
|
|
198
|
+
throw new Error(`${ERROR_PREFIX}:${label} is invalid JSON:${error.message}`, { cause: error })
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function packageNameFromLockPath(lockPath) {
|
|
203
|
+
const prefix = 'node_modules/'
|
|
204
|
+
invariant(lockPath.startsWith(prefix), `package-lock entry is not below node_modules:${lockPath}`)
|
|
205
|
+
const parts = lockPath.slice(prefix.length).split('/')
|
|
206
|
+
if (parts[0].startsWith('@')) {
|
|
207
|
+
invariant(parts.length === 2 && /^@[a-z0-9-]+$/.test(parts[0]) && /^[a-z0-9-]+$/.test(parts[1]), `package-lock path is not one flat scoped package:${lockPath}`)
|
|
208
|
+
return `${parts[0]}/${parts[1]}`
|
|
209
|
+
}
|
|
210
|
+
invariant(parts.length === 1 && /^[a-z0-9-]+$/.test(parts[0]), `package-lock path is not one flat package:${lockPath}`)
|
|
211
|
+
return parts[0]
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function canonicalRegistryTarball(packageName, version) {
|
|
215
|
+
const unscoped = packageName.split('/').at(-1)
|
|
216
|
+
return `${GOVERNANCE_DEPENDENCY_REGISTRY}${packageName}/-/${unscoped}-${version}.tgz`
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function validateIntegrity(value, label) {
|
|
220
|
+
const match = String(value || '').match(SHA512_INTEGRITY)
|
|
221
|
+
invariant(match, `${label} lacks canonical SHA-512 integrity`)
|
|
222
|
+
const bytes = Buffer.from(match[1], 'base64')
|
|
223
|
+
invariant(bytes.length === 64 && bytes.toString('base64') === match[1], `${label} SHA-512 integrity is not canonical base64`)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function validateDependencySpec(spec, label) {
|
|
227
|
+
invariant(typeof spec === 'string' && spec.length > 0, `${label} dependency spec is invalid`)
|
|
228
|
+
invariant(!/^(?:file:|link:|git(?:\+[^:]+)?:|github:|https?:)/i.test(spec), `${label} may not use file, link, git, GitHub, or URL dependencies`)
|
|
229
|
+
invariant(EXACT_VERSION.test(spec) || EXACT_ALIAS.test(spec), `${label} must be one exact version or exact npm alias`)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function dependencySpecMatchesLockEntry(dependencyName, spec, entry) {
|
|
233
|
+
const alias = spec.match(EXACT_ALIAS)
|
|
234
|
+
const expectedName = alias ? alias[1] : dependencyName
|
|
235
|
+
const expectedVersion = alias ? alias[2] : spec
|
|
236
|
+
return (entry.name ?? dependencyName) === expectedName && entry.version === expectedVersion
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function platformPackageName(tool, platform) {
|
|
240
|
+
invariant(tool.platformPackage && typeof tool.platformPackage === 'object', `provider CLI tool ${tool.providerId} has no platform package contract`)
|
|
241
|
+
const template = tool.platformPackage.nameTemplate
|
|
242
|
+
invariant(typeof template === 'string' && (template.match(/\{platform\}/g) ?? []).length === 1, `provider CLI tool ${tool.providerId} platform package template is invalid`)
|
|
243
|
+
const packageName = template.replace('{platform}', platform)
|
|
244
|
+
invariant(/^@[a-z0-9-]+\/[a-z0-9-]+$/.test(packageName), `provider CLI tool ${tool.providerId} platform package name is invalid:${packageName}`)
|
|
245
|
+
return packageName
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function validateToolchainManifest(manifest, { requirePackageContent = true } = {}) {
|
|
249
|
+
invariant(manifest && typeof manifest === 'object' && !Array.isArray(manifest), 'provider CLI toolchain manifest must be an object')
|
|
250
|
+
controlPlaneInvariant(manifest.$schema === '../schemas/provider-cli-toolchain.schema.json', 'provider CLI toolchain schema binding requires a reviewed control-plane update')
|
|
251
|
+
controlPlaneInvariant(manifest.schemaVersion === 2 && manifest.kind === 'provider-cli-toolchain', 'provider CLI toolchain schema version or kind requires a reviewed control-plane update')
|
|
252
|
+
const hasPackageContent = Object.hasOwn(manifest ?? {}, 'packageContent')
|
|
253
|
+
invariant(hasPackageContent || !requirePackageContent, 'provider CLI package-content authority is required')
|
|
254
|
+
exactKeys(
|
|
255
|
+
manifest,
|
|
256
|
+
['$schema', 'schemaVersion', 'kind', 'registry', 'packageLock', ...(hasPackageContent ? ['packageContent'] : []), 'installPolicy', 'providerBindings', 'tools'],
|
|
257
|
+
'provider CLI toolchain manifest',
|
|
258
|
+
)
|
|
259
|
+
invariant(manifest.registry === GOVERNANCE_DEPENDENCY_REGISTRY, 'provider CLI registry is not canonical')
|
|
260
|
+
|
|
261
|
+
exactKeys(manifest.packageLock, ['path', 'consumerPath', 'sha256', 'lockfileVersion', 'rootName', 'rootVersion', 'packageCount'], 'provider CLI package-lock binding')
|
|
262
|
+
invariant(manifest.packageLock.path === 'infra/governance/providers/provider-cli-toolchain.package-lock.json', 'authority provider CLI lock path is invalid')
|
|
263
|
+
invariant(manifest.packageLock.consumerPath === 'governance/provider-cli-toolchain.package-lock.json', 'consumer provider CLI lock path is invalid')
|
|
264
|
+
invariant(SHA256.test(manifest.packageLock.sha256), 'provider CLI package-lock digest is invalid')
|
|
265
|
+
invariant(manifest.packageLock.lockfileVersion === 3, 'provider CLI package-lock version must be 3')
|
|
266
|
+
invariant(manifest.packageLock.rootName === '@qijenchen/provider-cli-toolchain' && manifest.packageLock.rootVersion === '0.0.0', 'provider CLI package-lock root identity is invalid')
|
|
267
|
+
invariant(Number.isInteger(manifest.packageLock.packageCount) && manifest.packageLock.packageCount >= 0, 'provider CLI package count is invalid')
|
|
268
|
+
|
|
269
|
+
exactKeys(manifest.installPolicy, ['ignoreScripts', 'signatureAudit', 'auditLevel', 'runtimeDirectory', 'shimDirectory', 'supportedPlatforms'], 'provider CLI install policy')
|
|
270
|
+
invariant(manifest.installPolicy.ignoreScripts === true && manifest.installPolicy.signatureAudit === true && manifest.installPolicy.auditLevel === 'high', 'provider CLI install policy diluted its hard gates')
|
|
271
|
+
invariant(manifest.installPolicy.runtimeDirectory === 'node_modules/.provider-cli-toolchain', 'provider CLI runtime directory is invalid')
|
|
272
|
+
invariant(manifest.installPolicy.shimDirectory === 'node_modules/.bin', 'provider CLI shim directory is invalid')
|
|
273
|
+
invariant(
|
|
274
|
+
JSON.stringify(manifest.installPolicy.supportedPlatforms) === JSON.stringify(SUPPORTED_PROVIDER_CLI_PLATFORMS),
|
|
275
|
+
'provider CLI supported platform matrix is invalid',
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
if (hasPackageContent) {
|
|
279
|
+
invariant(manifest.packageContent && typeof manifest.packageContent === 'object' && !Array.isArray(manifest.packageContent), 'provider CLI package-content authority must be an object')
|
|
280
|
+
controlPlaneInvariant(manifest.packageContent.protocol === PACKAGE_CONTENT_PROTOCOL, 'provider CLI package-content protocol requires a reviewed control-plane update')
|
|
281
|
+
controlPlaneInvariant(manifest.packageContent.modePolicy === PACKAGE_CONTENT_MODE_POLICY, 'provider CLI package-content mode policy requires a reviewed control-plane update')
|
|
282
|
+
exactKeys(manifest.packageContent, ['protocol', 'modePolicy', 'packages'], 'provider CLI package-content authority')
|
|
283
|
+
invariant(Array.isArray(manifest.packageContent.packages) && manifest.packageContent.packages.length > 0, 'provider CLI package-content authority is empty')
|
|
284
|
+
const contentLockPaths = new Set()
|
|
285
|
+
for (const [index, record] of manifest.packageContent.packages.entries()) {
|
|
286
|
+
exactKeys(record, ['lockPath', 'platforms', 'treeSha256', 'fileCount', 'totalBytes'], `provider CLI package-content record ${index}`)
|
|
287
|
+
portableRepoPath(record.lockPath, `provider CLI package-content record ${index} lockPath`)
|
|
288
|
+
invariant(record.lockPath.startsWith('node_modules/'), `provider CLI package-content record ${index} must target node_modules`)
|
|
289
|
+
packageNameFromLockPath(record.lockPath)
|
|
290
|
+
invariant(!contentLockPaths.has(record.lockPath), `provider CLI package-content lockPath is duplicated:${record.lockPath}`)
|
|
291
|
+
invariant(
|
|
292
|
+
Array.isArray(record.platforms)
|
|
293
|
+
&& record.platforms.length > 0
|
|
294
|
+
&& record.platforms.every(platform => manifest.installPolicy.supportedPlatforms.includes(platform))
|
|
295
|
+
&& JSON.stringify([...new Set(record.platforms)].sort()) === JSON.stringify(record.platforms),
|
|
296
|
+
`provider CLI package-content platforms are invalid:${record.lockPath}`,
|
|
297
|
+
)
|
|
298
|
+
invariant(SHA256.test(record.treeSha256), `provider CLI package-content digest is invalid:${record.lockPath}`)
|
|
299
|
+
invariant(Number.isSafeInteger(record.fileCount) && record.fileCount >= 1 && record.fileCount <= MAX_PROVIDER_PACKAGE_FILE_COUNT, `provider CLI package-content file count is invalid:${record.lockPath}`)
|
|
300
|
+
invariant(Number.isSafeInteger(record.totalBytes) && record.totalBytes >= 1 && record.totalBytes <= MAX_PROVIDER_PACKAGE_EXPANDED_BYTES, `provider CLI package-content total bytes are invalid:${record.lockPath}`)
|
|
301
|
+
contentLockPaths.add(record.lockPath)
|
|
302
|
+
}
|
|
303
|
+
invariant(
|
|
304
|
+
JSON.stringify([...contentLockPaths]) === JSON.stringify([...contentLockPaths].sort()),
|
|
305
|
+
'provider CLI package-content records must be sorted by lockPath',
|
|
306
|
+
)
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
invariant(Array.isArray(manifest.providerBindings) && manifest.providerBindings.length > 0, 'provider CLI provider bindings are missing')
|
|
310
|
+
const bindingIds = new Set()
|
|
311
|
+
const provisionedToolIds = new Set()
|
|
312
|
+
for (const [index, binding] of manifest.providerBindings.entries()) {
|
|
313
|
+
exactKeys(binding, ['providerId', 'provisioning', 'toolProviderId'], `provider CLI provider binding ${index}`)
|
|
314
|
+
invariant(typeof binding.providerId === 'string' && /^[a-z][a-z0-9-]+$/.test(binding.providerId) && !bindingIds.has(binding.providerId), `provider CLI provider binding id is invalid or duplicated:${String(binding.providerId)}`)
|
|
315
|
+
invariant(['repo-provisioned-cli', 'external-runtime'].includes(binding.provisioning), `provider CLI provider binding ${binding.providerId} provisioning is invalid`)
|
|
316
|
+
if (binding.provisioning === 'repo-provisioned-cli') {
|
|
317
|
+
invariant(typeof binding.toolProviderId === 'string' && /^[a-z][a-z0-9-]+$/.test(binding.toolProviderId), `provider CLI provider binding ${binding.providerId} lacks a tool id`)
|
|
318
|
+
invariant(!provisionedToolIds.has(binding.toolProviderId), `provider CLI tool binding is duplicated:${binding.toolProviderId}`)
|
|
319
|
+
provisionedToolIds.add(binding.toolProviderId)
|
|
320
|
+
} else invariant(binding.toolProviderId === null, `external provider ${binding.providerId} may not claim a repo-provisioned CLI`)
|
|
321
|
+
bindingIds.add(binding.providerId)
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
invariant(Array.isArray(manifest.tools), 'provider CLI tools must be an array')
|
|
325
|
+
const toolIds = new Set()
|
|
326
|
+
const packageNames = new Set()
|
|
327
|
+
const executables = new Set()
|
|
328
|
+
for (let index = 0; index < manifest.tools.length; index += 1) {
|
|
329
|
+
const tool = manifest.tools[index]
|
|
330
|
+
exactKeys(tool, ['providerId', 'packageName', 'version', 'executable', 'binKind', 'packageBin', 'platformPackage', 'versionProbe'], `provider CLI tool ${index}`)
|
|
331
|
+
invariant(typeof tool.providerId === 'string' && /^[a-z][a-z0-9-]+$/.test(tool.providerId) && !toolIds.has(tool.providerId), `provider CLI tool providerId is invalid or duplicated:${String(tool.providerId)}`)
|
|
332
|
+
invariant(typeof tool.packageName === 'string' && /^@[a-z0-9-]+\/[a-z0-9-]+$/.test(tool.packageName) && !packageNames.has(tool.packageName), `provider CLI tool ${tool.providerId} packageName is invalid or duplicated`)
|
|
333
|
+
invariant(typeof tool.executable === 'string' && /^[a-z][a-z0-9-]+$/.test(tool.executable) && !executables.has(tool.executable), `provider CLI tool ${tool.providerId} executable is invalid or duplicated`)
|
|
334
|
+
invariant(['platform-native', 'node-entrypoint'].includes(tool.binKind), `provider CLI tool ${tool.providerId} bin kind is invalid`)
|
|
335
|
+
portableRepoPath(tool.packageBin, `provider CLI tool ${tool.providerId} package bin`)
|
|
336
|
+
invariant(EXACT_VERSION.test(tool.version), `provider CLI tool ${tool.providerId} version must be exact stable semver`)
|
|
337
|
+
invariant(tool.versionProbe === 'exact-semver-token', `provider CLI tool ${tool.providerId} version probe is invalid`)
|
|
338
|
+
invariant(tool.platformPackage === null || (tool.platformPackage && typeof tool.platformPackage === 'object' && !Array.isArray(tool.platformPackage)), `provider CLI tool ${tool.providerId} platform package contract is invalid`)
|
|
339
|
+
if (tool.platformPackage !== null) {
|
|
340
|
+
exactKeys(tool.platformPackage, ['nameTemplate', 'executablePath'], `provider CLI tool ${tool.providerId} platform package`)
|
|
341
|
+
for (const supported of manifest.installPolicy.supportedPlatforms) platformPackageName(tool, supported)
|
|
342
|
+
if (tool.platformPackage.executablePath !== null) portableRepoPath(tool.platformPackage.executablePath, `provider CLI tool ${tool.providerId} platform executable`)
|
|
343
|
+
}
|
|
344
|
+
invariant(tool.binKind !== 'platform-native' || typeof tool.platformPackage?.executablePath === 'string', `provider CLI tool ${tool.providerId} platform-native launcher lacks an executable path`)
|
|
345
|
+
toolIds.add(tool.providerId)
|
|
346
|
+
packageNames.add(tool.packageName)
|
|
347
|
+
executables.add(tool.executable)
|
|
348
|
+
}
|
|
349
|
+
invariant(JSON.stringify([...toolIds].sort()) === JSON.stringify([...provisionedToolIds].sort()), 'provider CLI tools differ from the closed repo-provisioned provider bindings')
|
|
350
|
+
return manifest
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
export function deriveActivePackageContentPlan(manifest, lock) {
|
|
354
|
+
const requested = new Map()
|
|
355
|
+
for (const tool of manifest.tools) {
|
|
356
|
+
requested.set(`node_modules/${tool.packageName}`, [...manifest.installPolicy.supportedPlatforms])
|
|
357
|
+
if (tool.platformPackage !== null) {
|
|
358
|
+
for (const platform of manifest.installPolicy.supportedPlatforms) {
|
|
359
|
+
requested.set(`node_modules/${platformPackageName(tool, platform)}`, [platform])
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return Object.freeze([...requested.entries()]
|
|
364
|
+
.sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)
|
|
365
|
+
.map(([lockPath, platforms]) => {
|
|
366
|
+
const entry = lock.packages[lockPath]
|
|
367
|
+
invariant(entry, `provider CLI active package plan is absent from the lock:${lockPath}`)
|
|
368
|
+
return Object.freeze({
|
|
369
|
+
integrity: entry.integrity,
|
|
370
|
+
lockPath,
|
|
371
|
+
platforms: Object.freeze([...platforms]),
|
|
372
|
+
resolved: entry.resolved,
|
|
373
|
+
})
|
|
374
|
+
}))
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function validateToolchainLock(lock, manifest, { requirePackageContent = true } = {}) {
|
|
378
|
+
exactKeys(lock, ['name', 'version', 'lockfileVersion', 'requires', 'packages'], 'provider CLI package-lock')
|
|
379
|
+
invariant(lock.name === manifest.packageLock.rootName && lock.version === manifest.packageLock.rootVersion, 'provider CLI package-lock top-level identity drifted')
|
|
380
|
+
invariant(lock.lockfileVersion === manifest.packageLock.lockfileVersion && lock.requires === true, 'provider CLI package-lock format is invalid')
|
|
381
|
+
invariant(lock.packages && typeof lock.packages === 'object' && !Array.isArray(lock.packages), 'provider CLI package-lock package inventory is missing')
|
|
382
|
+
const rows = Object.entries(lock.packages)
|
|
383
|
+
invariant(rows.length - 1 === manifest.packageLock.packageCount, 'provider CLI package count differs from the manifest')
|
|
384
|
+
const root = lock.packages['']
|
|
385
|
+
exactKeys(root, ['name', 'version', 'dependencies'], 'provider CLI package-lock root')
|
|
386
|
+
invariant(root.name === manifest.packageLock.rootName && root.version === manifest.packageLock.rootVersion, 'provider CLI package-lock root record drifted')
|
|
387
|
+
const expectedDependencies = Object.fromEntries(manifest.tools.map(tool => [tool.packageName, tool.version]))
|
|
388
|
+
invariant(JSON.stringify(root.dependencies) === JSON.stringify(expectedDependencies), 'provider CLI package-lock root dependencies differ from the manifest')
|
|
389
|
+
|
|
390
|
+
for (const [lockPath, entry] of rows) {
|
|
391
|
+
if (lockPath === '') continue
|
|
392
|
+
invariant(entry && typeof entry === 'object' && !Array.isArray(entry), `provider CLI package-lock entry is invalid:${lockPath}`)
|
|
393
|
+
invariant(!Object.hasOwn(entry, 'link'), `provider CLI package-lock may not contain link entries:${lockPath}`)
|
|
394
|
+
const pathName = packageNameFromLockPath(lockPath)
|
|
395
|
+
const packageName = entry.name ?? pathName
|
|
396
|
+
invariant(/^@[a-z0-9-]+\/[a-z0-9-]+$/.test(packageName), `provider CLI package name is invalid:${lockPath}`)
|
|
397
|
+
invariant(EXACT_VERSION.test(entry.version), `provider CLI package version is not exact:${lockPath}`)
|
|
398
|
+
invariant(entry.resolved === canonicalRegistryTarball(packageName, entry.version), `provider CLI package artifact is not the canonical registry tarball:${lockPath}`)
|
|
399
|
+
validateIntegrity(entry.integrity, `provider CLI package ${lockPath}`)
|
|
400
|
+
for (const field of ['dependencies', 'optionalDependencies']) {
|
|
401
|
+
if (entry[field] === undefined) continue
|
|
402
|
+
invariant(entry[field] && typeof entry[field] === 'object' && !Array.isArray(entry[field]), `provider CLI ${lockPath} ${field} is invalid`)
|
|
403
|
+
for (const [dependency, spec] of Object.entries(entry[field])) validateDependencySpec(spec, `${lockPath} ${field}.${dependency}`)
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
for (const tool of manifest.tools) {
|
|
408
|
+
const entry = lock.packages[`node_modules/${tool.packageName}`]
|
|
409
|
+
invariant(entry?.version === tool.version, `provider CLI lock lost ${tool.packageName}@${tool.version}`)
|
|
410
|
+
invariant(entry.bin?.[tool.executable] === tool.packageBin, `provider CLI lock bin mapping drifted:${tool.providerId}`)
|
|
411
|
+
if (tool.platformPackage !== null) {
|
|
412
|
+
for (const platform of manifest.installPolicy.supportedPlatforms) {
|
|
413
|
+
const packageName = platformPackageName(tool, platform)
|
|
414
|
+
const platformEntry = lock.packages[`node_modules/${packageName}`]
|
|
415
|
+
invariant(platformEntry && platformEntry.optional === true, `provider CLI lock lost optional platform package ${packageName}`)
|
|
416
|
+
const [os, cpu] = platform.split('-')
|
|
417
|
+
invariant(JSON.stringify(platformEntry.os) === JSON.stringify([os]) && JSON.stringify(platformEntry.cpu) === JSON.stringify([cpu]), `provider CLI platform package axes drifted:${packageName}`)
|
|
418
|
+
invariant(Object.hasOwn(entry.optionalDependencies ?? {}, packageName), `provider CLI main package lost platform dependency ${packageName}`)
|
|
419
|
+
const platformSpec = entry.optionalDependencies[packageName]
|
|
420
|
+
validateDependencySpec(platformSpec, `${tool.packageName} optionalDependencies.${packageName}`)
|
|
421
|
+
invariant(
|
|
422
|
+
dependencySpecMatchesLockEntry(packageName, platformSpec, platformEntry),
|
|
423
|
+
`provider CLI platform dependency does not bind its exact locked package:${packageName}`,
|
|
424
|
+
)
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
const activePlan = deriveActivePackageContentPlan(manifest, lock)
|
|
430
|
+
const activeLockPaths = new Set(activePlan.map(record => record.lockPath))
|
|
431
|
+
for (const record of activePlan) {
|
|
432
|
+
const entry = lock.packages[record.lockPath]
|
|
433
|
+
for (const [dependencyName, spec] of Object.entries(entry.dependencies ?? {})) {
|
|
434
|
+
invariant(/^@[a-z0-9-]+\/[a-z0-9-]+$/.test(dependencyName), `provider CLI required dependency name is invalid:${record.lockPath}:${dependencyName}`)
|
|
435
|
+
const dependencyLockPath = `node_modules/${dependencyName}`
|
|
436
|
+
invariant(
|
|
437
|
+
activeLockPaths.has(dependencyLockPath),
|
|
438
|
+
`provider CLI required dependency escapes the content-authorized active closure:${record.lockPath}:${dependencyName}`,
|
|
439
|
+
)
|
|
440
|
+
const dependencyEntry = lock.packages[dependencyLockPath]
|
|
441
|
+
invariant(
|
|
442
|
+
dependencyEntry && dependencySpecMatchesLockEntry(dependencyName, spec, dependencyEntry),
|
|
443
|
+
`provider CLI required dependency does not bind its exact locked package:${record.lockPath}:${dependencyName}`,
|
|
444
|
+
)
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
if (Object.hasOwn(manifest, 'packageContent')) {
|
|
448
|
+
const expectedContent = new Map(activePlan.map(record => [record.lockPath, record.platforms]))
|
|
449
|
+
invariant(
|
|
450
|
+
manifest.packageContent.packages.length === expectedContent.size,
|
|
451
|
+
'provider CLI package-content authority differs from the active main/platform package closure',
|
|
452
|
+
)
|
|
453
|
+
for (const record of manifest.packageContent.packages) {
|
|
454
|
+
const expectedPlatforms = expectedContent.get(record.lockPath)
|
|
455
|
+
invariant(expectedPlatforms, `provider CLI package-content authority contains an inactive package:${record.lockPath}`)
|
|
456
|
+
invariant(
|
|
457
|
+
JSON.stringify(record.platforms) === JSON.stringify(expectedPlatforms),
|
|
458
|
+
`provider CLI package-content platform binding differs from the tool closure:${record.lockPath}`,
|
|
459
|
+
)
|
|
460
|
+
invariant(lock.packages[record.lockPath], `provider CLI package-content authority is absent from the lock:${record.lockPath}`)
|
|
461
|
+
}
|
|
462
|
+
} else {
|
|
463
|
+
invariant(!requirePackageContent, 'provider CLI package-content authority is required')
|
|
464
|
+
}
|
|
465
|
+
return lock
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
function existingManifestCandidates(root) {
|
|
469
|
+
return [AUTHORITY_MANIFEST_PATH, CONSUMER_MANIFEST_PATH]
|
|
470
|
+
.map(path => ({ path, absolute: resolveContained(root, path, 'provider CLI manifest path') }))
|
|
471
|
+
.map(candidate => ({ ...candidate, bytes: readRegularBytes(candidate.absolute, `provider CLI manifest ${candidate.path}`, { optional: true }) }))
|
|
472
|
+
.filter(candidate => candidate.bytes !== null)
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
function resolveProviderCliToolchainAuthorityInternal(rootPath, { requirePackageContent }) {
|
|
476
|
+
const root = realpathSync(resolve(rootPath))
|
|
477
|
+
const manifests = existingManifestCandidates(root)
|
|
478
|
+
invariant(manifests.length > 0, `provider CLI manifest is missing; expected ${AUTHORITY_MANIFEST_PATH} or ${CONSUMER_MANIFEST_PATH}`)
|
|
479
|
+
if (manifests.length === 2) invariant(manifests[0].bytes.equals(manifests[1].bytes), 'authority and consumer provider CLI manifests differ')
|
|
480
|
+
const selectedManifest = manifests.find(candidate => candidate.path === AUTHORITY_MANIFEST_PATH) ?? manifests[0]
|
|
481
|
+
const manifest = validateToolchainManifest(
|
|
482
|
+
parseJson(selectedManifest.bytes, 'provider CLI toolchain manifest'),
|
|
483
|
+
{ requirePackageContent },
|
|
484
|
+
)
|
|
485
|
+
|
|
486
|
+
const lockCandidates = [manifest.packageLock.path, manifest.packageLock.consumerPath]
|
|
487
|
+
.map(path => ({ path, absolute: resolveContained(root, path, 'provider CLI package-lock path') }))
|
|
488
|
+
.map(candidate => ({ ...candidate, bytes: readRegularBytes(candidate.absolute, `provider CLI package-lock ${candidate.path}`, { optional: true }) }))
|
|
489
|
+
.filter(candidate => candidate.bytes !== null)
|
|
490
|
+
invariant(lockCandidates.length > 0, 'provider CLI authority/consumer package-lock pair is missing')
|
|
491
|
+
const requiredLockPath = selectedManifest.path === AUTHORITY_MANIFEST_PATH ? manifest.packageLock.path : manifest.packageLock.consumerPath
|
|
492
|
+
invariant(lockCandidates.some(candidate => candidate.path === requiredLockPath), `provider CLI ${selectedManifest.path === AUTHORITY_MANIFEST_PATH ? 'authority' : 'consumer'} lock is missing:${requiredLockPath}`)
|
|
493
|
+
if (lockCandidates.length === 2) invariant(lockCandidates[0].bytes.equals(lockCandidates[1].bytes), 'authority and consumer provider CLI package-lock bytes differ')
|
|
494
|
+
const lockBytes = lockCandidates.find(candidate => candidate.path === requiredLockPath).bytes
|
|
495
|
+
invariant(sha256(lockBytes) === manifest.packageLock.sha256, 'provider CLI package-lock digest differs from the manifest')
|
|
496
|
+
const lock = validateToolchainLock(
|
|
497
|
+
parseJson(lockBytes, 'provider CLI package-lock'),
|
|
498
|
+
manifest,
|
|
499
|
+
{ requirePackageContent },
|
|
500
|
+
)
|
|
501
|
+
return Object.freeze({
|
|
502
|
+
authorityDigest: sha256(selectedManifest.bytes),
|
|
503
|
+
lockDigest: sha256(lockBytes),
|
|
504
|
+
manifest,
|
|
505
|
+
manifestBytes: Buffer.from(selectedManifest.bytes),
|
|
506
|
+
manifestPath: selectedManifest.path,
|
|
507
|
+
lock,
|
|
508
|
+
lockBytes: Buffer.from(lockBytes),
|
|
509
|
+
lockPath: requiredLockPath,
|
|
510
|
+
role: selectedManifest.path === AUTHORITY_MANIFEST_PATH ? 'authority' : 'consumer',
|
|
511
|
+
root,
|
|
512
|
+
})
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
export function resolveProviderCliToolchainAuthority(rootPath = ROOT) {
|
|
516
|
+
return resolveProviderCliToolchainAuthorityInternal(rootPath, { requirePackageContent: true })
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
export function resolveProviderCliToolchainCandidateAuthority(
|
|
520
|
+
rootPath = ROOT,
|
|
521
|
+
{ requirePackageContent = false } = {},
|
|
522
|
+
) {
|
|
523
|
+
invariant(typeof requirePackageContent === 'boolean', 'candidate package-content requirement must be boolean')
|
|
524
|
+
return resolveProviderCliToolchainAuthorityInternal(rootPath, { requirePackageContent })
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
function ensureRealDirectory(path, label, { create = false } = {}) {
|
|
528
|
+
if (create) mkdirSync(path, { recursive: true, mode: 0o755 })
|
|
529
|
+
const info = lstatSync(path)
|
|
530
|
+
invariant(info.isDirectory() && !info.isSymbolicLink(), `${label} must be a real directory`)
|
|
531
|
+
invariant(realpathSync(path) === path, `${label} must not traverse a symbolic-link alias`)
|
|
532
|
+
assertTrustedPathAuthority(path, label)
|
|
533
|
+
return path
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
function installedPackage(root, lock, lockPath, label) {
|
|
537
|
+
const expected = lock.packages[lockPath]
|
|
538
|
+
invariant(expected, `${label} is absent from the canonical lock`)
|
|
539
|
+
const directory = resolve(root, lockPath)
|
|
540
|
+
ensureRealDirectory(directory, `${label} directory`)
|
|
541
|
+
const manifestPath = join(directory, 'package.json')
|
|
542
|
+
const manifest = parseJson(readRegularBytes(manifestPath, `${label} package.json`), `${label} package.json`)
|
|
543
|
+
const expectedName = expected.name ?? packageNameFromLockPath(lockPath)
|
|
544
|
+
invariant(manifest.name === expectedName && manifest.version === expected.version, `${label} installed identity differs from the canonical lock`)
|
|
545
|
+
return { directory, expected, manifest }
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
function installedExecutable(path, label, { executable = false } = {}) {
|
|
549
|
+
const info = lstatSync(path)
|
|
550
|
+
invariant(info.isFile() && !info.isSymbolicLink() && info.nlink === 1, `${label} must be one regular no-link file`)
|
|
551
|
+
invariant(realpathSync(path) === path, `${label} must not traverse a symbolic-link alias`)
|
|
552
|
+
assertTrustedPathAuthority(path, label)
|
|
553
|
+
if (executable) invariant((info.mode & 0o111) !== 0, `${label} is not executable`)
|
|
554
|
+
return path
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
function readStableRegularBytes(path, label, { executable = false } = {}) {
|
|
558
|
+
const before = lstatSync(path, { bigint: true })
|
|
559
|
+
invariant(before.isFile() && !before.isSymbolicLink() && before.nlink === 1n, `${label} must be one regular no-link file`)
|
|
560
|
+
invariant(realpathSync(path) === path, `${label} must not traverse a symbolic-link alias`)
|
|
561
|
+
assertTrustedPathAuthority(path, label)
|
|
562
|
+
if (executable) invariant((before.mode & 0o111n) !== 0n, `${label} is not executable`)
|
|
563
|
+
let descriptor = null
|
|
564
|
+
let opened
|
|
565
|
+
let openedAfter
|
|
566
|
+
let bytes
|
|
567
|
+
try {
|
|
568
|
+
const noFollow = typeof fsConstants.O_NOFOLLOW === 'number' ? fsConstants.O_NOFOLLOW : 0
|
|
569
|
+
descriptor = openSync(path, fsConstants.O_RDONLY | noFollow)
|
|
570
|
+
opened = fstatSync(descriptor, { bigint: true })
|
|
571
|
+
invariant(
|
|
572
|
+
opened.isFile()
|
|
573
|
+
&& opened.nlink === 1n
|
|
574
|
+
&& opened.dev === before.dev
|
|
575
|
+
&& opened.ino === before.ino
|
|
576
|
+
&& opened.mode === before.mode
|
|
577
|
+
&& opened.size === before.size,
|
|
578
|
+
`${label} changed before read`,
|
|
579
|
+
)
|
|
580
|
+
bytes = readFileSync(descriptor)
|
|
581
|
+
openedAfter = fstatSync(descriptor, { bigint: true })
|
|
582
|
+
} finally {
|
|
583
|
+
if (descriptor !== null) closeSync(descriptor)
|
|
584
|
+
}
|
|
585
|
+
const after = lstatSync(path, { bigint: true })
|
|
586
|
+
invariant(
|
|
587
|
+
BigInt(bytes.length) === before.size
|
|
588
|
+
&& openedAfter.isFile()
|
|
589
|
+
&& openedAfter.nlink === 1n
|
|
590
|
+
&& openedAfter.dev === opened.dev
|
|
591
|
+
&& openedAfter.ino === opened.ino
|
|
592
|
+
&& openedAfter.mode === opened.mode
|
|
593
|
+
&& openedAfter.size === opened.size
|
|
594
|
+
&& openedAfter.mtimeNs === opened.mtimeNs
|
|
595
|
+
&& openedAfter.ctimeNs === opened.ctimeNs
|
|
596
|
+
&& after.isFile()
|
|
597
|
+
&& !after.isSymbolicLink()
|
|
598
|
+
&& after.nlink === 1n
|
|
599
|
+
&& after.dev === before.dev
|
|
600
|
+
&& after.ino === before.ino
|
|
601
|
+
&& after.mode === before.mode
|
|
602
|
+
&& after.size === before.size
|
|
603
|
+
&& after.mtimeNs === before.mtimeNs
|
|
604
|
+
&& after.ctimeNs === before.ctimeNs,
|
|
605
|
+
`${label} changed while reading`,
|
|
606
|
+
)
|
|
607
|
+
return bytes
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
function portablePackagePath(path, label) {
|
|
611
|
+
portableRepoPath(path, label)
|
|
612
|
+
invariant(Buffer.byteLength(path, 'utf8') === path.length && /^[\x20-\x7e]+$/.test(path), `${label} must contain ASCII only`)
|
|
613
|
+
invariant(path === path.normalize('NFC'), `${label} must be NFC`)
|
|
614
|
+
const parts = path.split('/')
|
|
615
|
+
invariant(path.length <= MAX_PROVIDER_PACKAGE_PATH_BYTES, `${label} exceeds ${MAX_PROVIDER_PACKAGE_PATH_BYTES} bytes`)
|
|
616
|
+
invariant(parts.length <= MAX_PROVIDER_PACKAGE_PATH_DEPTH, `${label} exceeds depth ${MAX_PROVIDER_PACKAGE_PATH_DEPTH}`)
|
|
617
|
+
invariant(parts.every(part => part.length <= MAX_PROVIDER_PACKAGE_SEGMENT_BYTES), `${label} has a segment exceeding ${MAX_PROVIDER_PACKAGE_SEGMENT_BYTES} bytes`)
|
|
618
|
+
return path
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
function recordPortablePackagePath(path, aliases, label) {
|
|
622
|
+
portablePackagePath(path, label)
|
|
623
|
+
const key = path.toLowerCase()
|
|
624
|
+
invariant(!aliases.has(key), `${label} collides with portable alias:${aliases.get(key) ?? path}:${path}`)
|
|
625
|
+
aliases.set(key, path)
|
|
626
|
+
invariant(aliases.size <= MAX_PROVIDER_PACKAGE_ENTRY_COUNT, `${label} exceeds ${MAX_PROVIDER_PACKAGE_ENTRY_COUNT} entries`)
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
function canonicalPackageContent(lockPath, entries) {
|
|
630
|
+
portableRepoPath(lockPath, 'provider CLI package-content lockPath')
|
|
631
|
+
invariant(entries.length <= MAX_PROVIDER_PACKAGE_ENTRY_COUNT, `provider CLI package entries exceed ${MAX_PROVIDER_PACKAGE_ENTRY_COUNT}:${lockPath}`)
|
|
632
|
+
entries.sort((left, right) => left.path < right.path ? -1 : left.path > right.path ? 1 : 0)
|
|
633
|
+
let fileCount = 0
|
|
634
|
+
let totalBytes = 0
|
|
635
|
+
for (const entry of entries) {
|
|
636
|
+
if (entry.type !== 'file') continue
|
|
637
|
+
fileCount += 1
|
|
638
|
+
totalBytes += entry.size
|
|
639
|
+
invariant(fileCount <= MAX_PROVIDER_PACKAGE_FILE_COUNT, `provider CLI package file count exceeds ${MAX_PROVIDER_PACKAGE_FILE_COUNT}:${lockPath}`)
|
|
640
|
+
invariant(Number.isSafeInteger(totalBytes) && totalBytes <= MAX_PROVIDER_PACKAGE_EXPANDED_BYTES, `provider CLI package bytes exceed ${MAX_PROVIDER_PACKAGE_EXPANDED_BYTES}:${lockPath}`)
|
|
641
|
+
}
|
|
642
|
+
invariant(fileCount > 0 && totalBytes > 0, `provider CLI package content is empty:${lockPath}`)
|
|
643
|
+
const binding = {
|
|
644
|
+
entries,
|
|
645
|
+
lockPath,
|
|
646
|
+
modePolicy: PACKAGE_CONTENT_MODE_POLICY,
|
|
647
|
+
protocol: PACKAGE_CONTENT_PROTOCOL,
|
|
648
|
+
}
|
|
649
|
+
return Object.freeze({
|
|
650
|
+
fileCount,
|
|
651
|
+
lockPath,
|
|
652
|
+
totalBytes,
|
|
653
|
+
treeSha256: sha256(Buffer.from(`${PACKAGE_CONTENT_DIGEST_DOMAIN}\0${JSON.stringify(binding)}`, 'utf8')),
|
|
654
|
+
})
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
function tarAsciiField(header, offset, length, label) {
|
|
658
|
+
const field = header.subarray(offset, offset + length)
|
|
659
|
+
const zero = field.indexOf(0)
|
|
660
|
+
const used = zero < 0 ? field : field.subarray(0, zero)
|
|
661
|
+
if (zero >= 0) invariant(field.subarray(zero).every(byte => byte === 0), `${label} has nonzero bytes after NUL`)
|
|
662
|
+
invariant(used.every(byte => byte >= 0x20 && byte <= 0x7e), `${label} must contain ASCII only`)
|
|
663
|
+
return used.toString('ascii')
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
function tarOctalField(header, offset, length, label) {
|
|
667
|
+
const field = header.subarray(offset, offset + length)
|
|
668
|
+
invariant((field[0] & 0x80) === 0, `${label} may not use base-256 encoding`)
|
|
669
|
+
const text = field.toString('ascii').replace(/[\0 ]+$/g, '').replace(/^ +/g, '')
|
|
670
|
+
invariant(/^[0-7]+$/.test(text), `${label} is not canonical octal`)
|
|
671
|
+
const value = Number.parseInt(text, 8)
|
|
672
|
+
invariant(Number.isSafeInteger(value) && value >= 0, `${label} exceeds the safe integer range`)
|
|
673
|
+
return value
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
function assertTarChecksum(header, index) {
|
|
677
|
+
const expected = tarOctalField(header, 148, 8, `provider CLI tar header ${index} checksum`)
|
|
678
|
+
let actual = 0
|
|
679
|
+
for (let offset = 0; offset < header.length; offset += 1) {
|
|
680
|
+
actual += offset >= 148 && offset < 156 ? 0x20 : header[offset]
|
|
681
|
+
}
|
|
682
|
+
invariant(actual === expected, `provider CLI tar header ${index} checksum differs`)
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
function tarPackagePath(header, index) {
|
|
686
|
+
const name = tarAsciiField(header, 0, 100, `provider CLI tar header ${index} name`)
|
|
687
|
+
const prefix = tarAsciiField(header, 345, 155, `provider CLI tar header ${index} prefix`)
|
|
688
|
+
const archivePath = prefix ? `${prefix}/${name}` : name
|
|
689
|
+
invariant(archivePath === 'package' || archivePath.startsWith('package/'), `provider CLI tar entry is outside package/:${archivePath}`)
|
|
690
|
+
const path = archivePath === 'package' ? '' : archivePath.slice('package/'.length).replace(/\/+$/g, '')
|
|
691
|
+
if (path) portablePackagePath(path, `provider CLI tar entry ${index}`)
|
|
692
|
+
return path
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
export function deriveLockedPackageContentFromTarball(tarballBytes, lockRecord) {
|
|
696
|
+
invariant(Buffer.isBuffer(tarballBytes) || tarballBytes instanceof Uint8Array, 'provider CLI package tarball must be bytes')
|
|
697
|
+
invariant(lockRecord && typeof lockRecord === 'object' && !Array.isArray(lockRecord), 'provider CLI package tarball lock record is invalid')
|
|
698
|
+
const bytes = Buffer.from(tarballBytes)
|
|
699
|
+
const lockPath = portableRepoPath(lockRecord.lockPath, 'provider CLI package tarball lockPath')
|
|
700
|
+
invariant(lockPath.startsWith('node_modules/'), 'provider CLI package tarball lockPath must target node_modules')
|
|
701
|
+
validateIntegrity(lockRecord.integrity, `provider CLI package tarball ${lockPath}`)
|
|
702
|
+
invariant(bytes.length > 0 && bytes.length <= MAX_PROVIDER_PACKAGE_COMPRESSED_BYTES, `provider CLI package tarball compressed bytes exceed ${MAX_PROVIDER_PACKAGE_COMPRESSED_BYTES}:${lockPath}`)
|
|
703
|
+
invariant(sha512Integrity(bytes) === lockRecord.integrity, `provider CLI package tarball SHA-512 differs from the exact lock:${lockPath}`)
|
|
704
|
+
|
|
705
|
+
let archive
|
|
706
|
+
try {
|
|
707
|
+
archive = gunzipSync(bytes, { maxOutputLength: MAX_PROVIDER_PACKAGE_EXPANDED_BYTES })
|
|
708
|
+
} catch (error) {
|
|
709
|
+
throw new Error(`${ERROR_PREFIX}:provider CLI package tarball gzip is invalid or exceeds ${MAX_PROVIDER_PACKAGE_EXPANDED_BYTES}:${lockPath}:${error.message}`, { cause: error })
|
|
710
|
+
}
|
|
711
|
+
invariant(archive.length > 0 && archive.length % 512 === 0, `provider CLI package tar archive has an invalid block length:${lockPath}`)
|
|
712
|
+
|
|
713
|
+
const aliases = new Map()
|
|
714
|
+
const entriesByPath = new Map()
|
|
715
|
+
const explicitPaths = new Set()
|
|
716
|
+
const addDirectory = (path) => {
|
|
717
|
+
if (!path) return
|
|
718
|
+
const existing = entriesByPath.get(path)
|
|
719
|
+
invariant(!existing || existing.type === 'directory', `provider CLI tar file/directory collision:${lockPath}:${path}`)
|
|
720
|
+
if (!existing) {
|
|
721
|
+
recordPortablePackagePath(path, aliases, `provider CLI tar path ${lockPath}`)
|
|
722
|
+
entriesByPath.set(path, { path, type: 'directory' })
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
const addParents = (path) => {
|
|
726
|
+
const parts = path.split('/')
|
|
727
|
+
for (let index = 1; index < parts.length; index += 1) addDirectory(parts.slice(0, index).join('/'))
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
let offset = 0
|
|
731
|
+
let headerIndex = 0
|
|
732
|
+
let endMarkers = 0
|
|
733
|
+
while (offset < archive.length) {
|
|
734
|
+
const header = archive.subarray(offset, offset + 512)
|
|
735
|
+
if (header.every(byte => byte === 0)) {
|
|
736
|
+
endMarkers += 1
|
|
737
|
+
offset += 512
|
|
738
|
+
if (endMarkers >= 2) {
|
|
739
|
+
invariant(archive.subarray(offset).every(byte => byte === 0), `provider CLI tar has a concatenated or nonzero tail:${lockPath}`)
|
|
740
|
+
offset = archive.length
|
|
741
|
+
}
|
|
742
|
+
continue
|
|
743
|
+
}
|
|
744
|
+
invariant(endMarkers === 0, `provider CLI tar has data after an end marker:${lockPath}`)
|
|
745
|
+
headerIndex += 1
|
|
746
|
+
invariant(headerIndex <= MAX_PROVIDER_PACKAGE_ENTRY_COUNT, `provider CLI tar entries exceed ${MAX_PROVIDER_PACKAGE_ENTRY_COUNT}:${lockPath}`)
|
|
747
|
+
assertTarChecksum(header, headerIndex)
|
|
748
|
+
invariant(header.subarray(257, 263).equals(Buffer.from('ustar\0')) && header.subarray(263, 265).equals(Buffer.from('00')), `provider CLI tar header is not strict ustar:${lockPath}:${headerIndex}`)
|
|
749
|
+
const typeByte = header[156]
|
|
750
|
+
const type = typeByte === 0 || typeByte === 0x30 ? 'file' : typeByte === 0x35 ? 'directory' : 'unsupported'
|
|
751
|
+
invariant(type !== 'unsupported', `provider CLI tar contains a link, special, PAX, or extension entry:${lockPath}:${headerIndex}:${String.fromCharCode(typeByte || 0)}`)
|
|
752
|
+
const path = tarPackagePath(header, headerIndex)
|
|
753
|
+
const size = tarOctalField(header, 124, 12, `provider CLI tar header ${headerIndex} size`)
|
|
754
|
+
invariant(size <= MAX_PROVIDER_PACKAGE_FILE_BYTES, `provider CLI tar entry exceeds ${MAX_PROVIDER_PACKAGE_FILE_BYTES}:${lockPath}:${path}`)
|
|
755
|
+
invariant(type !== 'directory' || size === 0, `provider CLI tar directory has content bytes:${lockPath}:${path}`)
|
|
756
|
+
invariant(!explicitPaths.has(path), `provider CLI tar contains a duplicate path:${lockPath}:${path || '.'}`)
|
|
757
|
+
explicitPaths.add(path)
|
|
758
|
+
if (!path) invariant(type === 'directory' && size === 0, `provider CLI tar package root entry must be an empty directory:${lockPath}`)
|
|
759
|
+
if (path) {
|
|
760
|
+
addParents(path)
|
|
761
|
+
if (type === 'directory') addDirectory(path)
|
|
762
|
+
else {
|
|
763
|
+
invariant(!entriesByPath.has(path), `provider CLI tar file/directory collision:${lockPath}:${path}`)
|
|
764
|
+
recordPortablePackagePath(path, aliases, `provider CLI tar path ${lockPath}`)
|
|
765
|
+
const bodyStart = offset + 512
|
|
766
|
+
const bodyEnd = bodyStart + size
|
|
767
|
+
invariant(bodyEnd <= archive.length, `provider CLI tar entry exceeds archive bounds:${lockPath}:${path}`)
|
|
768
|
+
const body = archive.subarray(bodyStart, bodyEnd)
|
|
769
|
+
entriesByPath.set(path, { path, sha256: sha256(body), size, type: 'file' })
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
const paddedSize = Math.ceil(size / 512) * 512
|
|
773
|
+
const padding = archive.subarray(offset + 512 + size, offset + 512 + paddedSize)
|
|
774
|
+
invariant(padding.every(byte => byte === 0), `provider CLI tar entry padding is nonzero:${lockPath}:${path}`)
|
|
775
|
+
offset += 512 + paddedSize
|
|
776
|
+
}
|
|
777
|
+
invariant(endMarkers >= 2, `provider CLI tar lacks two end markers:${lockPath}`)
|
|
778
|
+
return canonicalPackageContent(lockPath, [...entriesByPath.values()])
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
function deriveInstalledPackageContent(directory, lockPath) {
|
|
782
|
+
const root = realpathSync(resolve(directory))
|
|
783
|
+
invariant(root === resolve(directory), `provider CLI installed package root traverses a symbolic-link alias:${lockPath}`)
|
|
784
|
+
const rootInfo = lstatSync(root, { bigint: true })
|
|
785
|
+
invariant(rootInfo.isDirectory() && !rootInfo.isSymbolicLink(), `provider CLI installed package root is not one real directory:${lockPath}`)
|
|
786
|
+
assertTrustedPathAuthority(root, `provider CLI installed package root ${lockPath}`)
|
|
787
|
+
const aliases = new Map()
|
|
788
|
+
const entries = []
|
|
789
|
+
|
|
790
|
+
const visit = (current) => {
|
|
791
|
+
const before = lstatSync(current, { bigint: true })
|
|
792
|
+
invariant(before.isDirectory() && !before.isSymbolicLink() && realpathSync(current) === current, `provider CLI package directory is unsafe:${lockPath}:${relative(root, current) || '.'}`)
|
|
793
|
+
validateProviderCliFilesystemAuthority(before, {
|
|
794
|
+
label: `provider CLI package directory authority:${lockPath}:${relative(root, current) || '.'}`,
|
|
795
|
+
})
|
|
796
|
+
const names = readdirSync(current).sort()
|
|
797
|
+
for (const name of names) {
|
|
798
|
+
const absolute = join(current, name)
|
|
799
|
+
const path = relative(root, absolute).split(sep).join('/')
|
|
800
|
+
recordPortablePackagePath(path, aliases, `provider CLI installed package path ${lockPath}`)
|
|
801
|
+
const entryBefore = lstatSync(absolute, { bigint: true })
|
|
802
|
+
if (entryBefore.isDirectory() && !entryBefore.isSymbolicLink()) {
|
|
803
|
+
validateProviderCliFilesystemAuthority(entryBefore, {
|
|
804
|
+
label: `provider CLI package directory authority:${lockPath}:${path}`,
|
|
805
|
+
})
|
|
806
|
+
invariant(realpathSync(absolute) === absolute, `provider CLI package directory traverses a symbolic-link alias:${lockPath}:${path}`)
|
|
807
|
+
entries.push({ path, type: 'directory' })
|
|
808
|
+
visit(absolute)
|
|
809
|
+
continue
|
|
810
|
+
}
|
|
811
|
+
invariant(entryBefore.isFile() && !entryBefore.isSymbolicLink(), `provider CLI package contains a link or unsupported filesystem entry:${lockPath}:${path}`)
|
|
812
|
+
validateProviderCliFilesystemAuthority(entryBefore, {
|
|
813
|
+
label: `provider CLI package file authority:${lockPath}:${path}`,
|
|
814
|
+
})
|
|
815
|
+
invariant(entryBefore.nlink === 1n, `provider CLI package file must have exactly one link:${lockPath}:${path}`)
|
|
816
|
+
invariant(entryBefore.size <= BigInt(MAX_PROVIDER_PACKAGE_FILE_BYTES), `provider CLI package file exceeds ${MAX_PROVIDER_PACKAGE_FILE_BYTES}:${lockPath}:${path}`)
|
|
817
|
+
invariant(realpathSync(absolute) === absolute, `provider CLI package file traverses a symbolic-link alias:${lockPath}:${path}`)
|
|
818
|
+
let descriptor = null
|
|
819
|
+
let opened
|
|
820
|
+
let openedAfter
|
|
821
|
+
let bytes
|
|
822
|
+
try {
|
|
823
|
+
const noFollow = typeof fsConstants.O_NOFOLLOW === 'number' ? fsConstants.O_NOFOLLOW : 0
|
|
824
|
+
descriptor = openSync(absolute, fsConstants.O_RDONLY | noFollow)
|
|
825
|
+
opened = fstatSync(descriptor, { bigint: true })
|
|
826
|
+
invariant(opened.isFile() && opened.nlink === 1n && opened.dev === entryBefore.dev && opened.ino === entryBefore.ino && opened.size === entryBefore.size, `provider CLI package file changed before read:${lockPath}:${path}`)
|
|
827
|
+
bytes = readFileSync(descriptor)
|
|
828
|
+
openedAfter = fstatSync(descriptor, { bigint: true })
|
|
829
|
+
} finally {
|
|
830
|
+
if (descriptor !== null) closeSync(descriptor)
|
|
831
|
+
}
|
|
832
|
+
const entryAfter = lstatSync(absolute, { bigint: true })
|
|
833
|
+
invariant(
|
|
834
|
+
bytes.length === Number(entryBefore.size)
|
|
835
|
+
&& openedAfter.isFile()
|
|
836
|
+
&& openedAfter.nlink === 1n
|
|
837
|
+
&& openedAfter.dev === opened.dev
|
|
838
|
+
&& openedAfter.ino === opened.ino
|
|
839
|
+
&& openedAfter.mode === opened.mode
|
|
840
|
+
&& openedAfter.size === opened.size
|
|
841
|
+
&& openedAfter.mtimeNs === opened.mtimeNs
|
|
842
|
+
&& openedAfter.ctimeNs === opened.ctimeNs
|
|
843
|
+
&& entryAfter.isFile()
|
|
844
|
+
&& !entryAfter.isSymbolicLink()
|
|
845
|
+
&& entryAfter.nlink === 1n
|
|
846
|
+
&& entryAfter.dev === entryBefore.dev
|
|
847
|
+
&& entryAfter.ino === entryBefore.ino
|
|
848
|
+
&& entryAfter.mode === entryBefore.mode
|
|
849
|
+
&& entryAfter.size === entryBefore.size
|
|
850
|
+
&& entryAfter.mtimeNs === entryBefore.mtimeNs
|
|
851
|
+
&& entryAfter.ctimeNs === entryBefore.ctimeNs,
|
|
852
|
+
`provider CLI package file changed while hashing:${lockPath}:${path}`,
|
|
853
|
+
)
|
|
854
|
+
entries.push({ path, sha256: sha256(bytes), size: bytes.length, type: 'file' })
|
|
855
|
+
}
|
|
856
|
+
const namesAfter = readdirSync(current).sort()
|
|
857
|
+
const after = lstatSync(current, { bigint: true })
|
|
858
|
+
invariant(
|
|
859
|
+
after.isDirectory()
|
|
860
|
+
&& !after.isSymbolicLink()
|
|
861
|
+
&& after.dev === before.dev
|
|
862
|
+
&& after.ino === before.ino
|
|
863
|
+
&& after.mode === before.mode
|
|
864
|
+
&& after.mtimeNs === before.mtimeNs
|
|
865
|
+
&& after.ctimeNs === before.ctimeNs
|
|
866
|
+
&& JSON.stringify(namesAfter) === JSON.stringify(names),
|
|
867
|
+
`provider CLI package directory changed while hashing:${lockPath}:${relative(root, current).split(sep).join('/') || '.'}`,
|
|
868
|
+
)
|
|
869
|
+
}
|
|
870
|
+
visit(root)
|
|
871
|
+
return canonicalPackageContent(lockPath, entries)
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
function platformKey(platform, arch) {
|
|
875
|
+
invariant(['darwin', 'linux'].includes(platform), `unsupported provider CLI platform:${String(platform)}`)
|
|
876
|
+
invariant(['arm64', 'x64'].includes(arch), `unsupported provider CLI architecture:${String(arch)}`)
|
|
877
|
+
return `${platform}-${arch}`
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
function detectLinuxLibc() {
|
|
881
|
+
const value = process.report?.getReport?.()?.header?.glibcVersionRuntime
|
|
882
|
+
return typeof value === 'string' && value.length > 0 ? 'glibc' : 'musl-or-unknown'
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
function activePackageContentRecords(authority, platformId) {
|
|
886
|
+
const records = authority.manifest.packageContent.packages
|
|
887
|
+
.filter(record => record.platforms.includes(platformId))
|
|
888
|
+
const expectedCount = authority.manifest.tools.reduce(
|
|
889
|
+
(count, tool) => count + (tool.platformPackage === null ? 1 : 2),
|
|
890
|
+
0,
|
|
891
|
+
)
|
|
892
|
+
invariant(records.length === expectedCount, `provider CLI active package-content closure is incomplete:${platformId}`)
|
|
893
|
+
return records
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
function activePackageContentDigest(authority, platformId) {
|
|
897
|
+
const binding = {
|
|
898
|
+
packages: activePackageContentRecords(authority, platformId).map(record => ({
|
|
899
|
+
fileCount: record.fileCount,
|
|
900
|
+
lockPath: record.lockPath,
|
|
901
|
+
totalBytes: record.totalBytes,
|
|
902
|
+
treeSha256: record.treeSha256,
|
|
903
|
+
})),
|
|
904
|
+
platform: platformId,
|
|
905
|
+
protocol: authority.manifest.packageContent.protocol,
|
|
906
|
+
}
|
|
907
|
+
return sha256(Buffer.from(`${ACTIVE_PACKAGE_CONTENT_BINDING_DOMAIN}\0${JSON.stringify(binding)}`, 'utf8'))
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
function stagingProjectManifest(authority) {
|
|
911
|
+
const root = authority.lock.packages['']
|
|
912
|
+
return {
|
|
913
|
+
name: root.name,
|
|
914
|
+
version: root.version,
|
|
915
|
+
private: true,
|
|
916
|
+
dependencies: root.dependencies,
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
function assertRuntimeScaffold(target, authority) {
|
|
921
|
+
const expectedNames = ['.npmrc', 'node_modules', 'package-lock.json', 'package.json']
|
|
922
|
+
const names = readdirSync(target).sort()
|
|
923
|
+
invariant(JSON.stringify(names) === JSON.stringify(expectedNames), 'provider CLI runtime root inventory is not closed')
|
|
924
|
+
const packageBytes = Buffer.from(`${JSON.stringify(stagingProjectManifest(authority), null, 2)}\n`, 'utf8')
|
|
925
|
+
invariant(readRegularBytes(join(target, 'package.json'), 'installed provider CLI root package.json').equals(packageBytes), 'installed provider CLI root package.json differs from authority')
|
|
926
|
+
invariant(readRegularBytes(join(target, '.npmrc'), 'installed provider CLI root .npmrc').equals(Buffer.from('ignore-scripts=true\nstrict-ssl=true\nalways-auth=false\n')), 'installed provider CLI root .npmrc differs from authority')
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
function assertClosedInstalledPackageInventory(target, records) {
|
|
930
|
+
const modules = join(target, 'node_modules')
|
|
931
|
+
ensureRealDirectory(modules, 'provider CLI installed node_modules')
|
|
932
|
+
const expected = records.map(record => record.lockPath).sort()
|
|
933
|
+
const actual = []
|
|
934
|
+
const aliases = new Map()
|
|
935
|
+
for (const scope of readdirSync(modules).sort()) {
|
|
936
|
+
recordPortablePackagePath(scope, aliases, 'provider CLI installed package scope')
|
|
937
|
+
invariant(scope.startsWith('@'), `provider CLI installed node_modules contains unsupported metadata or package:${scope}`)
|
|
938
|
+
const scopeRoot = join(modules, scope)
|
|
939
|
+
ensureRealDirectory(scopeRoot, `provider CLI installed package scope ${scope}`)
|
|
940
|
+
for (const name of readdirSync(scopeRoot).sort()) {
|
|
941
|
+
const lockPath = `node_modules/${scope}/${name}`
|
|
942
|
+
recordPortablePackagePath(`${scope}/${name}`, aliases, 'provider CLI installed package inventory')
|
|
943
|
+
ensureRealDirectory(join(scopeRoot, name), `provider CLI installed package ${lockPath}`)
|
|
944
|
+
actual.push(lockPath)
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
actual.sort()
|
|
948
|
+
invariant(
|
|
949
|
+
JSON.stringify(actual) === JSON.stringify(expected),
|
|
950
|
+
`provider CLI installed package inventory differs from authority:${actual.join(',')}`,
|
|
951
|
+
)
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
function assertInstalledPackageContent(target, records) {
|
|
955
|
+
for (const expected of records) {
|
|
956
|
+
const actual = deriveInstalledPackageContent(join(target, expected.lockPath), expected.lockPath)
|
|
957
|
+
invariant(
|
|
958
|
+
actual.treeSha256 === expected.treeSha256
|
|
959
|
+
&& actual.fileCount === expected.fileCount
|
|
960
|
+
&& actual.totalBytes === expected.totalBytes,
|
|
961
|
+
`provider CLI installed package content differs from authority:${expected.lockPath}`,
|
|
962
|
+
)
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
function inspectInstalledRuntime(target, authority, { platform, arch, libc }) {
|
|
967
|
+
ensureRealDirectory(target, 'provider CLI runtime')
|
|
968
|
+
assertRuntimeScaffold(target, authority)
|
|
969
|
+
const installedLock = readRegularBytes(join(target, 'package-lock.json'), 'installed provider CLI package-lock')
|
|
970
|
+
invariant(installedLock.equals(authority.lockBytes), 'installed provider CLI package-lock differs from canonical authority')
|
|
971
|
+
const key = platformKey(platform, arch)
|
|
972
|
+
invariant(authority.manifest.installPolicy.supportedPlatforms.includes(key), `provider CLI platform is not registered:${key}`)
|
|
973
|
+
if (platform === 'linux') invariant(libc === 'glibc', `provider CLI Linux runtime requires glibc; received ${String(libc)}`)
|
|
974
|
+
const activeRecords = activePackageContentRecords(authority, key)
|
|
975
|
+
assertClosedInstalledPackageInventory(target, activeRecords)
|
|
976
|
+
assertInstalledPackageContent(target, activeRecords)
|
|
977
|
+
|
|
978
|
+
const runtime = {}
|
|
979
|
+
for (const tool of authority.manifest.tools) {
|
|
980
|
+
const main = installedPackage(target, authority.lock, `node_modules/${tool.packageName}`, `${tool.providerId} main package`)
|
|
981
|
+
let platformPackage = null
|
|
982
|
+
if (tool.platformPackage !== null) {
|
|
983
|
+
const packageName = platformPackageName(tool, key)
|
|
984
|
+
platformPackage = installedPackage(target, authority.lock, `node_modules/${packageName}`, `${tool.providerId} platform package`)
|
|
985
|
+
}
|
|
986
|
+
const targetPath = tool.binKind === 'platform-native'
|
|
987
|
+
? join(platformPackage.directory, ...tool.platformPackage.executablePath.split('/'))
|
|
988
|
+
: join(main.directory, ...tool.packageBin.split('/'))
|
|
989
|
+
const executable = installedExecutable(targetPath, `${tool.providerId} locked executable`, { executable: true })
|
|
990
|
+
runtime[tool.executable] = Object.freeze({
|
|
991
|
+
command: tool.binKind === 'node-entrypoint' ? process.execPath : executable,
|
|
992
|
+
argsPrefix: tool.binKind === 'node-entrypoint' ? [executable] : [],
|
|
993
|
+
target: executable,
|
|
994
|
+
tool,
|
|
995
|
+
})
|
|
996
|
+
}
|
|
997
|
+
return Object.freeze(runtime)
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
function runVersionProbe(command, args, { root, environment, runner, label, expectedVersion }) {
|
|
1001
|
+
const result = runner(command, args, {
|
|
1002
|
+
cwd: root,
|
|
1003
|
+
env: environment,
|
|
1004
|
+
shell: false,
|
|
1005
|
+
encoding: 'utf8',
|
|
1006
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
1007
|
+
timeout: VERSION_TIMEOUT_MS,
|
|
1008
|
+
windowsHide: true,
|
|
1009
|
+
})
|
|
1010
|
+
if (result?.error) throw result.error
|
|
1011
|
+
invariant(result?.status === 0, `${label} --version failed with exit ${String(result?.status)}`)
|
|
1012
|
+
const output = `${String(result.stdout || '')}\n${String(result.stderr || '')}`
|
|
1013
|
+
const escaped = expectedVersion.replaceAll('.', '\\.')
|
|
1014
|
+
invariant(new RegExp(`(^|[^0-9A-Za-z])${escaped}(?=$|[^0-9A-Za-z.-])`).test(output), `${label} --version did not report exact token ${expectedVersion}`)
|
|
1015
|
+
return output.trim()
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
function probeDirectRuntime(runtime, { root, environment, runner }) {
|
|
1019
|
+
const versions = {}
|
|
1020
|
+
for (const [name, capability] of Object.entries(runtime)) {
|
|
1021
|
+
versions[name] = runVersionProbe(
|
|
1022
|
+
capability.command,
|
|
1023
|
+
[...capability.argsPrefix, '--version'],
|
|
1024
|
+
{ root, environment, runner, label: capability.tool.providerId, expectedVersion: capability.tool.version },
|
|
1025
|
+
)
|
|
1026
|
+
}
|
|
1027
|
+
return versions
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
function shimSource(executable, relativeTarget) {
|
|
1031
|
+
// Dynamic imports keep the generated program valid in both CommonJS and ESM package scopes,
|
|
1032
|
+
// without trusting the consumer's package.json `type`. The verifier rehashes the
|
|
1033
|
+
// authority-selected package trees on every invocation before any provider byte executes.
|
|
1034
|
+
return `#!/usr/bin/env node
|
|
1035
|
+
Promise.all([import('node:child_process'), import('node:path'), import('node:url')]).then(async ([child, path, url]) => {
|
|
1036
|
+
const modules = path.resolve(path.dirname(process.argv[1]), '..')
|
|
1037
|
+
const root = path.resolve(modules, '..')
|
|
1038
|
+
const expectedExecutable = path.resolve(modules, ${JSON.stringify(relativeTarget)})
|
|
1039
|
+
const verifierUrl = url.pathToFileURL(path.join(root, 'scripts/setup-provider-cli-toolchain.mjs')).href
|
|
1040
|
+
const verifier = await import(verifierUrl)
|
|
1041
|
+
const capability = verifier.verifyProviderCliRuntimeForShim({
|
|
1042
|
+
executable: ${JSON.stringify(executable)},
|
|
1043
|
+
expectedExecutable,
|
|
1044
|
+
rootPath: root,
|
|
1045
|
+
})
|
|
1046
|
+
const result = child.spawnSync(capability.command, [...capability.argsPrefix, ...process.argv.slice(2)], { cwd: process.cwd(), env: process.env, shell: false, stdio: 'inherit', windowsHide: true })
|
|
1047
|
+
if (result.error) throw result.error
|
|
1048
|
+
if (result.signal) process.kill(process.pid, result.signal)
|
|
1049
|
+
process.exit(Number.isInteger(result.status) ? result.status : 1)
|
|
1050
|
+
}).catch(error => { console.error(error.message); process.exit(1) })
|
|
1051
|
+
`
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
function expectedShimBytes(authority, runtime) {
|
|
1055
|
+
const modulesRoot = resolve(authority.root, 'node_modules')
|
|
1056
|
+
const values = {}
|
|
1057
|
+
for (const [name, capability] of Object.entries(runtime)) {
|
|
1058
|
+
const relativeTarget = relative(modulesRoot, capability.target).split(sep).join('/')
|
|
1059
|
+
invariant(relativeTarget && !relativeTarget.startsWith('../') && !isAbsolute(relativeTarget), `provider CLI ${name} shim target escapes node_modules`)
|
|
1060
|
+
values[name] = Buffer.from(shimSource(name, relativeTarget), 'utf8')
|
|
1061
|
+
}
|
|
1062
|
+
return values
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
function atomicRegularExecutable(path, bytes) {
|
|
1066
|
+
assertTrustedPathAuthority(path, 'provider CLI shim replacement ancestor', { includeEntry: false })
|
|
1067
|
+
let currentInfo = null
|
|
1068
|
+
try {
|
|
1069
|
+
currentInfo = lstatSync(path)
|
|
1070
|
+
} catch (error) {
|
|
1071
|
+
if (error?.code !== 'ENOENT') throw error
|
|
1072
|
+
}
|
|
1073
|
+
if (currentInfo?.isFile() && !currentInfo.isSymbolicLink() && currentInfo.nlink === 1) {
|
|
1074
|
+
invariant(realpathSync(path) === path, `provider CLI shim must not traverse a symbolic-link alias:${path}`)
|
|
1075
|
+
validateProviderCliFilesystemAuthority(currentInfo, { label: `provider CLI shim authority ${path}` })
|
|
1076
|
+
const current = readFileSync(path)
|
|
1077
|
+
if (current.equals(bytes)) {
|
|
1078
|
+
invariant((currentInfo.mode & 0o111) !== 0, `provider CLI shim is not executable:${path}`)
|
|
1079
|
+
return false
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
invariant(
|
|
1083
|
+
currentInfo === null || currentInfo.isFile() || currentInfo.isSymbolicLink(),
|
|
1084
|
+
`provider CLI shim target must be absent, a regular file, or a symbolic link:${path}`,
|
|
1085
|
+
)
|
|
1086
|
+
const temporary = `${path}.tmp-${process.pid}-${randomBytes(8).toString('hex')}`
|
|
1087
|
+
let descriptor = null
|
|
1088
|
+
try {
|
|
1089
|
+
descriptor = openSync(temporary, 'wx', 0o755)
|
|
1090
|
+
writeFileSync(descriptor, bytes)
|
|
1091
|
+
fsyncSync(descriptor)
|
|
1092
|
+
closeSync(descriptor)
|
|
1093
|
+
descriptor = null
|
|
1094
|
+
chmodSync(temporary, 0o755)
|
|
1095
|
+
renameSync(temporary, path)
|
|
1096
|
+
const installed = readRegularBytes(path, `provider CLI shim ${path}`)
|
|
1097
|
+
invariant(installed.equals(bytes), `provider CLI shim atomic readback failed:${path}`)
|
|
1098
|
+
invariant((lstatSync(path).mode & 0o111) !== 0, `provider CLI shim readback is not executable:${path}`)
|
|
1099
|
+
return true
|
|
1100
|
+
} finally {
|
|
1101
|
+
if (descriptor !== null) closeSync(descriptor)
|
|
1102
|
+
try { unlinkSync(temporary) } catch (error) { if (error?.code !== 'ENOENT') throw error }
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
function installOrCheckShims(authority, target, runtime, { check }) {
|
|
1107
|
+
const shimDirectory = resolveContained(authority.root, authority.manifest.installPolicy.shimDirectory, 'provider CLI shim directory')
|
|
1108
|
+
ensureRealDirectory(shimDirectory, 'provider CLI shim directory', { create: !check })
|
|
1109
|
+
const expected = expectedShimBytes(authority, runtime)
|
|
1110
|
+
const paths = {}
|
|
1111
|
+
for (const tool of authority.manifest.tools) {
|
|
1112
|
+
const path = join(shimDirectory, tool.executable)
|
|
1113
|
+
const bytes = expected[tool.executable]
|
|
1114
|
+
if (check) {
|
|
1115
|
+
const actual = readStableRegularBytes(path, `provider CLI ${tool.executable} shim`, { executable: true })
|
|
1116
|
+
invariant(actual.equals(bytes), `provider CLI ${tool.executable} shim differs from authority`)
|
|
1117
|
+
} else atomicRegularExecutable(path, bytes)
|
|
1118
|
+
paths[tool.executable] = path
|
|
1119
|
+
}
|
|
1120
|
+
return paths
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
function probeShims(authority, shimPaths, { environment, runner }) {
|
|
1124
|
+
const versions = {}
|
|
1125
|
+
for (const tool of authority.manifest.tools) {
|
|
1126
|
+
versions[tool.executable] = runVersionProbe(
|
|
1127
|
+
process.execPath,
|
|
1128
|
+
[shimPaths[tool.executable], '--version'],
|
|
1129
|
+
{ root: authority.root, environment, runner, label: `${tool.providerId} controlled shim`, expectedVersion: tool.version },
|
|
1130
|
+
)
|
|
1131
|
+
}
|
|
1132
|
+
return versions
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
function writeStagingProject(staging, authority) {
|
|
1136
|
+
const manifest = stagingProjectManifest(authority)
|
|
1137
|
+
writeFileSync(join(staging, 'package.json'), `${JSON.stringify(manifest, null, 2)}\n`, { flag: 'wx', mode: 0o600 })
|
|
1138
|
+
writeFileSync(join(staging, 'package-lock.json'), authority.lockBytes, { flag: 'wx', mode: 0o600 })
|
|
1139
|
+
writeFileSync(join(staging, '.npmrc'), 'ignore-scripts=true\nstrict-ssl=true\nalways-auth=false\n', { flag: 'wx', mode: 0o600 })
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
function removeNpmGeneratedRuntimeMetadata(staging) {
|
|
1143
|
+
rmSync(join(staging, 'node_modules/.bin'), { recursive: true, force: true })
|
|
1144
|
+
try {
|
|
1145
|
+
unlinkSync(join(staging, 'node_modules/.package-lock.json'))
|
|
1146
|
+
} catch (error) {
|
|
1147
|
+
if (error?.code !== 'ENOENT') throw error
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
function targetPath(authority, platformId) {
|
|
1152
|
+
invariant(/^(?:darwin|linux)-(?:arm64|x64)$/.test(platformId), `provider CLI runtime address platform is invalid:${platformId}`)
|
|
1153
|
+
invariant(SHA256.test(authority.authorityDigest), 'provider CLI runtime address authority digest is invalid')
|
|
1154
|
+
const base = resolveContained(authority.root, authority.manifest.installPolicy.runtimeDirectory, 'provider CLI runtime directory')
|
|
1155
|
+
const protocolBase = join(base, RUNTIME_CONTENT_TARGET_PROTOCOL)
|
|
1156
|
+
const platformBase = join(protocolBase, platformId)
|
|
1157
|
+
return {
|
|
1158
|
+
base,
|
|
1159
|
+
platformBase,
|
|
1160
|
+
protocolBase,
|
|
1161
|
+
target: join(platformBase, authority.authorityDigest),
|
|
1162
|
+
}
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
export function verifyProviderCliRuntimeForShim({
|
|
1166
|
+
rootPath = ROOT,
|
|
1167
|
+
executable,
|
|
1168
|
+
expectedExecutable,
|
|
1169
|
+
platform = process.platform,
|
|
1170
|
+
arch = process.arch,
|
|
1171
|
+
libc = platform === 'linux' ? detectLinuxLibc() : null,
|
|
1172
|
+
} = {}) {
|
|
1173
|
+
invariant(typeof executable === 'string' && /^[a-z][a-z0-9-]+$/.test(executable), 'provider CLI shim executable identity is invalid')
|
|
1174
|
+
invariant(typeof expectedExecutable === 'string' && isAbsolute(expectedExecutable), 'provider CLI shim expected executable path is invalid')
|
|
1175
|
+
const authority = resolveProviderCliToolchainAuthority(rootPath)
|
|
1176
|
+
const platformId = platformKey(platform, arch)
|
|
1177
|
+
invariant(authority.manifest.installPolicy.supportedPlatforms.includes(platformId), `provider CLI shim platform is not supported:${platformId}`)
|
|
1178
|
+
if (platform === 'linux') invariant(libc === 'glibc', `provider CLI Linux runtime requires glibc; received ${String(libc)}`)
|
|
1179
|
+
const { target } = targetPath(authority, platformId)
|
|
1180
|
+
invariant(existingRuntime(target), `provider CLI toolchain is not installed:${target}`)
|
|
1181
|
+
const runtime = inspectInstalledRuntime(target, authority, { platform, arch, libc })
|
|
1182
|
+
const capability = runtime[executable]
|
|
1183
|
+
invariant(capability, `provider CLI shim executable is not registered:${executable}`)
|
|
1184
|
+
invariant(capability.target === resolve(expectedExecutable), `provider CLI shim target differs from authority:${executable}`)
|
|
1185
|
+
// A non-cooperative process with the same uid can race any pathname-based check. That hostile-host
|
|
1186
|
+
// condition is outside repository authority; protected hooks-off CI never treats provider CLI or
|
|
1187
|
+
// model output as its hard gate. This verifier closes persisted accidental/stale mutation.
|
|
1188
|
+
return Object.freeze({
|
|
1189
|
+
argsPrefix: Object.freeze([...capability.argsPrefix]),
|
|
1190
|
+
command: capability.command,
|
|
1191
|
+
target: capability.target,
|
|
1192
|
+
})
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
export function verifyProviderCliRuntimeForCertification({
|
|
1196
|
+
rootPath = ROOT,
|
|
1197
|
+
executable,
|
|
1198
|
+
platform = process.platform,
|
|
1199
|
+
arch = process.arch,
|
|
1200
|
+
libc = platform === 'linux' ? detectLinuxLibc() : null,
|
|
1201
|
+
...unsupported
|
|
1202
|
+
} = {}) {
|
|
1203
|
+
invariant(Object.keys(unsupported).length === 0, `provider CLI certification options are unsupported:${Object.keys(unsupported).sort().join(',')}`)
|
|
1204
|
+
invariant(typeof executable === 'string' && /^[a-z][a-z0-9-]+$/.test(executable), 'provider CLI certification executable identity is invalid')
|
|
1205
|
+
const authority = resolveProviderCliToolchainAuthority(rootPath)
|
|
1206
|
+
const { platformId, target, runtime } = verifyStaticResolvedAuthority(authority, { platform, arch, libc })
|
|
1207
|
+
const capability = runtime[executable]
|
|
1208
|
+
invariant(capability, `provider CLI certification executable is not registered:${executable}`)
|
|
1209
|
+
|
|
1210
|
+
const expectedShim = expectedShimBytes(authority, runtime)[executable]
|
|
1211
|
+
const shimDirectory = resolveContained(authority.root, authority.manifest.installPolicy.shimDirectory, 'provider CLI certification shim directory')
|
|
1212
|
+
ensureRealDirectory(shimDirectory, 'provider CLI certification shim directory')
|
|
1213
|
+
const shimPath = join(shimDirectory, executable)
|
|
1214
|
+
const actualShim = readStableRegularBytes(shimPath, `provider CLI certification shim ${executable}`, { executable: true })
|
|
1215
|
+
invariant(actualShim.equals(expectedShim), `provider CLI certification shim differs from authority:${executable}`)
|
|
1216
|
+
const targetBytes = readStableRegularBytes(capability.target, `provider CLI certification target ${executable}`, { executable: true })
|
|
1217
|
+
const shimRelative = relative(authority.root, shimPath).split(sep).join('/')
|
|
1218
|
+
const targetRelative = relative(authority.root, capability.target).split(sep).join('/')
|
|
1219
|
+
portableRepoPath(shimRelative, `provider CLI certification shim path ${executable}`)
|
|
1220
|
+
portableRepoPath(targetRelative, `provider CLI certification target path ${executable}`)
|
|
1221
|
+
|
|
1222
|
+
const binding = Object.freeze({
|
|
1223
|
+
activePackageContentDigest: activePackageContentDigest(authority, platformId),
|
|
1224
|
+
authorityDigest: authority.authorityDigest,
|
|
1225
|
+
executable,
|
|
1226
|
+
lockDigest: authority.lockDigest,
|
|
1227
|
+
packageContentProtocol: authority.manifest.packageContent.protocol,
|
|
1228
|
+
platform: platformId,
|
|
1229
|
+
shimPath: shimRelative,
|
|
1230
|
+
shimSha256: sha256(actualShim),
|
|
1231
|
+
targetPath: targetRelative,
|
|
1232
|
+
targetSha256: sha256(targetBytes),
|
|
1233
|
+
})
|
|
1234
|
+
return Object.freeze({
|
|
1235
|
+
argsPrefix: Object.freeze([shimPath]),
|
|
1236
|
+
binding,
|
|
1237
|
+
command: process.execPath,
|
|
1238
|
+
target: capability.target,
|
|
1239
|
+
})
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
function existingRuntime(target) {
|
|
1243
|
+
try {
|
|
1244
|
+
const info = lstatSync(target)
|
|
1245
|
+
invariant(info.isDirectory() && !info.isSymbolicLink() && realpathSync(target) === target, 'provider CLI digest target is not one real directory')
|
|
1246
|
+
return true
|
|
1247
|
+
} catch (error) {
|
|
1248
|
+
if (error?.code === 'ENOENT') return false
|
|
1249
|
+
throw error
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
function staticVerificationResult(authority, target, runtime, platformId) {
|
|
1254
|
+
installOrCheckShims(authority, target, runtime, { check: true })
|
|
1255
|
+
return Object.freeze({
|
|
1256
|
+
authorityDigest: authority.authorityDigest,
|
|
1257
|
+
executablesProbed: false,
|
|
1258
|
+
lockDigest: authority.lockDigest,
|
|
1259
|
+
platform: platformId,
|
|
1260
|
+
role: authority.role,
|
|
1261
|
+
staticVerified: true,
|
|
1262
|
+
status: 'static-verified',
|
|
1263
|
+
target,
|
|
1264
|
+
versions: null,
|
|
1265
|
+
})
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
function verifyStaticResolvedAuthority(authority, { platform, arch, libc }) {
|
|
1269
|
+
const platformId = platformKey(platform, arch)
|
|
1270
|
+
invariant(authority.manifest.installPolicy.supportedPlatforms.includes(platformId), `provider CLI static verification platform is not supported:${platformId}`)
|
|
1271
|
+
if (platform === 'linux') invariant(libc === 'glibc', `provider CLI Linux runtime requires glibc; received ${String(libc)}`)
|
|
1272
|
+
const { target } = targetPath(authority, platformId)
|
|
1273
|
+
invariant(existingRuntime(target), `provider CLI toolchain is not installed:${target}`)
|
|
1274
|
+
const runtime = inspectInstalledRuntime(target, authority, { platform, arch, libc })
|
|
1275
|
+
const result = staticVerificationResult(authority, target, runtime, platformId)
|
|
1276
|
+
return { platformId, result, runtime, target }
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
export function verifyProviderCliToolchainStatic({
|
|
1280
|
+
root: rootPath = ROOT,
|
|
1281
|
+
platform = process.platform,
|
|
1282
|
+
arch = process.arch,
|
|
1283
|
+
libc = platform === 'linux' ? detectLinuxLibc() : null,
|
|
1284
|
+
...unsupported
|
|
1285
|
+
} = {}) {
|
|
1286
|
+
invariant(Object.keys(unsupported).length === 0, `provider CLI static verification options are unsupported:${Object.keys(unsupported).sort().join(',')}`)
|
|
1287
|
+
const authority = resolveProviderCliToolchainAuthority(rootPath)
|
|
1288
|
+
return verifyStaticResolvedAuthority(authority, { platform, arch, libc }).result
|
|
1289
|
+
}
|
|
1290
|
+
|
|
1291
|
+
export async function setupProviderCliToolchain({
|
|
1292
|
+
root: rootPath = ROOT,
|
|
1293
|
+
check = false,
|
|
1294
|
+
probeExecutables = true,
|
|
1295
|
+
platform = process.platform,
|
|
1296
|
+
arch = process.arch,
|
|
1297
|
+
libc = platform === 'linux' ? detectLinuxLibc() : null,
|
|
1298
|
+
baseEnvironment = process.env,
|
|
1299
|
+
runner = spawnSync,
|
|
1300
|
+
runtimeFactory = prepareVerifiedExactNpmRuntime,
|
|
1301
|
+
} = {}) {
|
|
1302
|
+
invariant(typeof check === 'boolean', 'provider CLI check option must be boolean')
|
|
1303
|
+
invariant(typeof probeExecutables === 'boolean', 'provider CLI executable-probe option must be boolean')
|
|
1304
|
+
const authority = resolveProviderCliToolchainAuthority(rootPath)
|
|
1305
|
+
const platformId = platformKey(platform, arch)
|
|
1306
|
+
invariant(authority.manifest.installPolicy.supportedPlatforms.includes(platformId), `provider CLI platform is not supported:${platformId}`)
|
|
1307
|
+
if (platform === 'linux') invariant(libc === 'glibc', `provider CLI Linux runtime requires glibc; received ${String(libc)}`)
|
|
1308
|
+
const callerWorktree = captureGitVisibleWorktree(authority.root)
|
|
1309
|
+
const expectedNpm = resolveExactNpmRuntimeContract(authority.root)
|
|
1310
|
+
invariant(expectedNpm.version === GOVERNANCE_DEPENDENCY_EXACT_NPM_VERSION, `caller lock must bind npm ${GOVERNANCE_DEPENDENCY_EXACT_NPM_VERSION}`)
|
|
1311
|
+
const isolated = createIsolatedGovernanceNpmEnvironment(baseEnvironment, { errorPrefix: ERROR_PREFIX })
|
|
1312
|
+
const { base, platformBase, protocolBase, target } = targetPath(authority, platformId)
|
|
1313
|
+
let staging = null
|
|
1314
|
+
let npmRuntime = null
|
|
1315
|
+
try {
|
|
1316
|
+
const environment = isolated.env
|
|
1317
|
+
if (existingRuntime(target)) {
|
|
1318
|
+
const runtime = inspectInstalledRuntime(target, authority, { platform, arch, libc })
|
|
1319
|
+
const shimPaths = installOrCheckShims(authority, target, runtime, { check })
|
|
1320
|
+
const versions = probeExecutables ? probeShims(authority, shimPaths, { environment, runner }) : null
|
|
1321
|
+
const staticResult = staticVerificationResult(authority, target, runtime, platformId)
|
|
1322
|
+
assertGitVisibleWorktreeUnchanged(authority.root, callerWorktree, { label: 'provider CLI idempotent readback' })
|
|
1323
|
+
return Object.freeze({
|
|
1324
|
+
...staticResult,
|
|
1325
|
+
executablesProbed: probeExecutables,
|
|
1326
|
+
status: 'ready',
|
|
1327
|
+
versions,
|
|
1328
|
+
})
|
|
1329
|
+
}
|
|
1330
|
+
invariant(!check, `provider CLI toolchain is not installed:${target}`)
|
|
1331
|
+
|
|
1332
|
+
const modules = resolve(authority.root, 'node_modules')
|
|
1333
|
+
ensureRealDirectory(modules, 'caller node_modules', { create: true })
|
|
1334
|
+
ensureRealDirectory(base, 'provider CLI runtime base', { create: true })
|
|
1335
|
+
ensureRealDirectory(protocolBase, 'provider CLI runtime protocol base', { create: true })
|
|
1336
|
+
ensureRealDirectory(platformBase, 'provider CLI runtime platform base', { create: true })
|
|
1337
|
+
staging = mkdtempSync(join(platformBase, '.stage-'))
|
|
1338
|
+
ensureRealDirectory(staging, 'provider CLI staging directory')
|
|
1339
|
+
writeStagingProject(staging, authority)
|
|
1340
|
+
|
|
1341
|
+
npmRuntime = await runtimeFactory({ repositoryRoot: authority.root, env: environment, runner })
|
|
1342
|
+
assertVerifiedExactNpmRuntimeCapability(npmRuntime, expectedNpm)
|
|
1343
|
+
assertGitVisibleWorktreeUnchanged(authority.root, callerWorktree, { label: 'provider CLI exact npm materialization' })
|
|
1344
|
+
const npmSteps = [
|
|
1345
|
+
{ args: ['ci', '--ignore-scripts', '--no-bin-links', '--legacy-peer-deps', `--registry=${GOVERNANCE_DEPENDENCY_REGISTRY}`], timeoutMs: INSTALL_TIMEOUT_MS },
|
|
1346
|
+
{ args: ['audit', 'signatures', `--registry=${GOVERNANCE_DEPENDENCY_REGISTRY}`], timeoutMs: AUDIT_TIMEOUT_MS },
|
|
1347
|
+
{ args: ['audit', '--audit-level=high', `--registry=${GOVERNANCE_DEPENDENCY_REGISTRY}`], timeoutMs: AUDIT_TIMEOUT_MS },
|
|
1348
|
+
]
|
|
1349
|
+
for (const [index, step] of npmSteps.entries()) {
|
|
1350
|
+
runClosedBootstrapStep(process.execPath, [npmRuntime.cli, ...step.args], {
|
|
1351
|
+
root: staging,
|
|
1352
|
+
environment,
|
|
1353
|
+
runner,
|
|
1354
|
+
errorPrefix: ERROR_PREFIX,
|
|
1355
|
+
timeoutMs: step.timeoutMs,
|
|
1356
|
+
})
|
|
1357
|
+
invariant(readRegularBytes(join(staging, 'package-lock.json'), 'staged provider CLI package-lock').equals(authority.lockBytes), 'provider CLI npm stage mutated the canonical lock copy')
|
|
1358
|
+
assertGitVisibleWorktreeUnchanged(authority.root, callerWorktree, { label: `provider CLI npm stage ${index + 1}` })
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
removeNpmGeneratedRuntimeMetadata(staging)
|
|
1362
|
+
const stagedRuntime = inspectInstalledRuntime(staging, authority, { platform, arch, libc })
|
|
1363
|
+
if (probeExecutables) probeDirectRuntime(stagedRuntime, { root: staging, environment, runner })
|
|
1364
|
+
assertGitVisibleWorktreeUnchanged(authority.root, callerWorktree, {
|
|
1365
|
+
label: probeExecutables ? 'provider CLI staged version readback' : 'provider CLI staged static verification',
|
|
1366
|
+
})
|
|
1367
|
+
try {
|
|
1368
|
+
renameSync(staging, target)
|
|
1369
|
+
staging = null
|
|
1370
|
+
} catch (error) {
|
|
1371
|
+
if (!['EEXIST', 'ENOTEMPTY'].includes(error?.code) || !existingRuntime(target)) throw error
|
|
1372
|
+
}
|
|
1373
|
+
const runtime = inspectInstalledRuntime(target, authority, { platform, arch, libc })
|
|
1374
|
+
const shimPaths = installOrCheckShims(authority, target, runtime, { check: false })
|
|
1375
|
+
const versions = probeExecutables ? probeShims(authority, shimPaths, { environment, runner }) : null
|
|
1376
|
+
const staticResult = staticVerificationResult(authority, target, runtime, platformId)
|
|
1377
|
+
assertGitVisibleWorktreeUnchanged(authority.root, callerWorktree, { label: 'provider CLI atomic installation' })
|
|
1378
|
+
return Object.freeze({
|
|
1379
|
+
...staticResult,
|
|
1380
|
+
executablesProbed: probeExecutables,
|
|
1381
|
+
status: 'installed',
|
|
1382
|
+
versions,
|
|
1383
|
+
})
|
|
1384
|
+
} finally {
|
|
1385
|
+
try { npmRuntime?.cleanup?.() } finally {
|
|
1386
|
+
try { isolated.cleanup() } finally {
|
|
1387
|
+
if (staging !== null) rmSync(staging, { recursive: true, force: true })
|
|
1388
|
+
}
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
function isMain() {
|
|
1394
|
+
try { return Boolean(process.argv[1]) && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url)) }
|
|
1395
|
+
catch { return false }
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
if (isMain()) {
|
|
1399
|
+
const args = process.argv.slice(2)
|
|
1400
|
+
if (!(args.length === 0 || (args.length === 1 && args[0] === '--check'))) {
|
|
1401
|
+
console.error('Usage: node scripts/setup-provider-cli-toolchain.mjs [--check]')
|
|
1402
|
+
process.exitCode = 2
|
|
1403
|
+
} else {
|
|
1404
|
+
try {
|
|
1405
|
+
const result = await setupProviderCliToolchain({ check: args[0] === '--check' })
|
|
1406
|
+
console.log(`✅ provider CLI toolchain ${result.status}:${result.platform}:sha256:${result.authorityDigest}`)
|
|
1407
|
+
} catch (error) {
|
|
1408
|
+
console.error(`❌ provider CLI toolchain failed:${error.message}`)
|
|
1409
|
+
process.exitCode = 1
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
}
|