@mantis-core/ui 0.5.0 → 0.7.0
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/CHANGELOG.md +155 -0
- package/COMPONENTS.md +71 -73
- package/README.md +19 -6
- package/bin/mantis-llm.mjs +242 -0
- package/catalog.json +3031 -0
- package/dist/components/Buttons/Button.d.ts +39 -9
- package/dist/components/Buttons/Button.d.ts.map +1 -1
- package/dist/components/Buttons/Button.js +21 -13
- package/dist/components/Buttons/Button.js.map +1 -1
- package/dist/components/Forms/AutoCompleteField.d.ts +60 -0
- package/dist/components/Forms/AutoCompleteField.d.ts.map +1 -0
- package/dist/components/Forms/AutoCompleteField.js +125 -0
- package/dist/components/Forms/AutoCompleteField.js.map +1 -0
- package/dist/components/Forms/CKEditorInput.d.ts +5 -2
- package/dist/components/Forms/CKEditorInput.d.ts.map +1 -1
- package/dist/components/Forms/CKEditorInput.js +5 -2
- package/dist/components/Forms/CKEditorInput.js.map +1 -1
- package/dist/components/Forms/CheckboxField.d.ts +14 -0
- package/dist/components/Forms/CheckboxField.d.ts.map +1 -0
- package/dist/components/Forms/CheckboxField.js +26 -0
- package/dist/components/Forms/CheckboxField.js.map +1 -0
- package/dist/components/Forms/ColorPickerInput.d.ts +27 -8
- package/dist/components/Forms/ColorPickerInput.d.ts.map +1 -1
- package/dist/components/Forms/ColorPickerInput.js +57 -11
- package/dist/components/Forms/ColorPickerInput.js.map +1 -1
- package/dist/components/Forms/DateField.d.ts +68 -0
- package/dist/components/Forms/DateField.d.ts.map +1 -0
- package/dist/components/Forms/DateField.js +108 -0
- package/dist/components/Forms/DateField.js.map +1 -0
- package/dist/components/Forms/DatePresets.d.ts.map +1 -1
- package/dist/components/Forms/DatePresets.js +6 -3
- package/dist/components/Forms/DatePresets.js.map +1 -1
- package/dist/components/Forms/FieldShell.d.ts +24 -0
- package/dist/components/Forms/FieldShell.d.ts.map +1 -0
- package/dist/components/Forms/FieldShell.js +39 -0
- package/dist/components/Forms/FieldShell.js.map +1 -0
- package/dist/components/Forms/FileDropzone.d.ts +4 -2
- package/dist/components/Forms/FileDropzone.d.ts.map +1 -1
- package/dist/components/Forms/FileDropzone.js.map +1 -1
- package/dist/components/Forms/FormActionsBar.js +2 -2
- package/dist/components/Forms/FormActionsBar.js.map +1 -1
- package/dist/components/Forms/FormWizard.d.ts +1 -1
- package/dist/components/Forms/FormWizard.d.ts.map +1 -1
- package/dist/components/Forms/FormWizard.js +4 -5
- package/dist/components/Forms/FormWizard.js.map +1 -1
- package/dist/components/Forms/HiddenField.d.ts +12 -6
- package/dist/components/Forms/HiddenField.d.ts.map +1 -1
- package/dist/components/Forms/HiddenField.js +14 -5
- package/dist/components/Forms/HiddenField.js.map +1 -1
- package/dist/components/Forms/MaskField.d.ts +28 -0
- package/dist/components/Forms/MaskField.d.ts.map +1 -0
- package/dist/components/Forms/MaskField.js +74 -0
- package/dist/components/Forms/MaskField.js.map +1 -0
- package/dist/components/Forms/NumberField.d.ts +14 -0
- package/dist/components/Forms/NumberField.d.ts.map +1 -0
- package/dist/components/Forms/NumberField.js +51 -0
- package/dist/components/Forms/NumberField.js.map +1 -0
- package/dist/components/Forms/OtpInput.d.ts +23 -8
- package/dist/components/Forms/OtpInput.d.ts.map +1 -1
- package/dist/components/Forms/OtpInput.js +37 -8
- package/dist/components/Forms/OtpInput.js.map +1 -1
- package/dist/components/Forms/PasswordInput.d.ts +22 -9
- package/dist/components/Forms/PasswordInput.d.ts.map +1 -1
- package/dist/components/Forms/PasswordInput.js +63 -28
- package/dist/components/Forms/PasswordInput.js.map +1 -1
- package/dist/components/Forms/PhoneInput.d.ts +16 -8
- package/dist/components/Forms/PhoneInput.d.ts.map +1 -1
- package/dist/components/Forms/PhoneInput.js +13 -6
- package/dist/components/Forms/PhoneInput.js.map +1 -1
- package/dist/components/Forms/RadioGroup.d.ts +34 -13
- package/dist/components/Forms/RadioGroup.d.ts.map +1 -1
- package/dist/components/Forms/RadioGroup.js +49 -6
- package/dist/components/Forms/RadioGroup.js.map +1 -1
- package/dist/components/Forms/RangeSlider.d.ts +26 -11
- package/dist/components/Forms/RangeSlider.d.ts.map +1 -1
- package/dist/components/Forms/RangeSlider.js +40 -7
- package/dist/components/Forms/RangeSlider.js.map +1 -1
- package/dist/components/Forms/RatingInput.d.ts +24 -8
- package/dist/components/Forms/RatingInput.d.ts.map +1 -1
- package/dist/components/Forms/RatingInput.js +41 -9
- package/dist/components/Forms/RatingInput.js.map +1 -1
- package/dist/components/Forms/SearchInput.d.ts +18 -10
- package/dist/components/Forms/SearchInput.d.ts.map +1 -1
- package/dist/components/Forms/SearchInput.js +44 -23
- package/dist/components/Forms/SearchInput.js.map +1 -1
- package/dist/components/Forms/SelectField.d.ts +41 -0
- package/dist/components/Forms/SelectField.d.ts.map +1 -0
- package/dist/components/Forms/SelectField.js +110 -0
- package/dist/components/Forms/SelectField.js.map +1 -0
- package/dist/components/Forms/SwitchField.d.ts +14 -0
- package/dist/components/Forms/SwitchField.d.ts.map +1 -0
- package/dist/components/Forms/SwitchField.js +26 -0
- package/dist/components/Forms/SwitchField.js.map +1 -0
- package/dist/components/Forms/TagsInput.d.ts +29 -8
- package/dist/components/Forms/TagsInput.d.ts.map +1 -1
- package/dist/components/Forms/TagsInput.js +53 -9
- package/dist/components/Forms/TagsInput.js.map +1 -1
- package/dist/components/Forms/TextArea.d.ts +13 -10
- package/dist/components/Forms/TextArea.d.ts.map +1 -1
- package/dist/components/Forms/TextArea.js +27 -9
- package/dist/components/Forms/TextArea.js.map +1 -1
- package/dist/components/Forms/TextField.d.ts +14 -0
- package/dist/components/Forms/TextField.d.ts.map +1 -0
- package/dist/components/Forms/TextField.js +29 -0
- package/dist/components/Forms/TextField.js.map +1 -0
- package/dist/components/Forms/ToggleInlineButton.d.ts +33 -12
- package/dist/components/Forms/ToggleInlineButton.d.ts.map +1 -1
- package/dist/components/Forms/ToggleInlineButton.js +56 -6
- package/dist/components/Forms/ToggleInlineButton.js.map +1 -1
- package/dist/components/Forms/UploadFilesPreview.js +3 -3
- package/dist/components/Forms/UploadFilesPreview.js.map +1 -1
- package/dist/components/Forms/field-typing.test-d.d.ts +2 -0
- package/dist/components/Forms/field-typing.test-d.d.ts.map +1 -0
- package/dist/components/Forms/field-typing.test-d.js +24 -0
- package/dist/components/Forms/field-typing.test-d.js.map +1 -0
- package/dist/components/Forms/useFieldController.d.ts +85 -0
- package/dist/components/Forms/useFieldController.d.ts.map +1 -0
- package/dist/components/Forms/useFieldController.js +54 -0
- package/dist/components/Forms/useFieldController.js.map +1 -0
- package/dist/components/Loaders/Loading.d.ts.map +1 -1
- package/dist/components/Loaders/Loading.js +3 -2
- package/dist/components/Loaders/Loading.js.map +1 -1
- package/dist/components/Tables/ActionColumn.d.ts +20 -4
- package/dist/components/Tables/ActionColumn.d.ts.map +1 -1
- package/dist/components/Tables/ActionColumn.js +24 -5
- package/dist/components/Tables/ActionColumn.js.map +1 -1
- package/dist/components/Tables/FilterPannel.d.ts +9 -2
- package/dist/components/Tables/FilterPannel.d.ts.map +1 -1
- package/dist/components/Tables/FilterPannel.js +15 -11
- package/dist/components/Tables/FilterPannel.js.map +1 -1
- package/dist/components/Tables/IndexColumn.d.ts +12 -3
- package/dist/components/Tables/IndexColumn.d.ts.map +1 -1
- package/dist/components/Tables/IndexColumn.js +21 -5
- package/dist/components/Tables/IndexColumn.js.map +1 -1
- package/dist/components/Tables/MantisDataTable.d.ts +45 -0
- package/dist/components/Tables/MantisDataTable.d.ts.map +1 -0
- package/dist/components/Tables/MantisDataTable.js +63 -0
- package/dist/components/Tables/MantisDataTable.js.map +1 -0
- package/dist/components/Tables/MenuButton.d.ts +28 -7
- package/dist/components/Tables/MenuButton.d.ts.map +1 -1
- package/dist/components/Tables/MenuButton.js +20 -10
- package/dist/components/Tables/MenuButton.js.map +1 -1
- package/dist/components/Tables/PaginatedTable.d.ts +26 -17
- package/dist/components/Tables/PaginatedTable.d.ts.map +1 -1
- package/dist/components/Tables/PaginatedTable.js +24 -22
- package/dist/components/Tables/PaginatedTable.js.map +1 -1
- package/dist/components/Tables/cell-presets.d.ts +35 -0
- package/dist/components/Tables/cell-presets.d.ts.map +1 -0
- package/dist/components/Tables/cell-presets.js +40 -0
- package/dist/components/Tables/cell-presets.js.map +1 -0
- package/dist/components/Tables/columns.d.ts +40 -0
- package/dist/components/Tables/columns.d.ts.map +1 -0
- package/dist/components/Tables/columns.js +2 -0
- package/dist/components/Tables/columns.js.map +1 -0
- package/dist/components/Tables/filters/MultiSelectFilter.d.ts +24 -6
- package/dist/components/Tables/filters/MultiSelectFilter.d.ts.map +1 -1
- package/dist/components/Tables/filters/MultiSelectFilter.js +19 -6
- package/dist/components/Tables/filters/MultiSelectFilter.js.map +1 -1
- package/dist/components/auth/ChangePasswordForm.d.ts.map +1 -1
- package/dist/components/auth/ChangePasswordForm.js +12 -12
- package/dist/components/auth/ChangePasswordForm.js.map +1 -1
- package/dist/components/auth/ForgotPasswordForm.d.ts.map +1 -1
- package/dist/components/auth/ForgotPasswordForm.js +7 -5
- package/dist/components/auth/ForgotPasswordForm.js.map +1 -1
- package/dist/components/auth/LoginForm.d.ts +2 -2
- package/dist/components/auth/LoginForm.d.ts.map +1 -1
- package/dist/components/auth/LoginForm.js +15 -15
- package/dist/components/auth/LoginForm.js.map +1 -1
- package/dist/components/auth/ResetPasswordForm.d.ts.map +1 -1
- package/dist/components/auth/ResetPasswordForm.js +11 -12
- package/dist/components/auth/ResetPasswordForm.js.map +1 -1
- package/dist/components/auth/UserMenu.d.ts +11 -1
- package/dist/components/auth/UserMenu.d.ts.map +1 -1
- package/dist/components/auth/UserMenu.js +30 -87
- package/dist/components/auth/UserMenu.js.map +1 -1
- package/dist/components/data/Timeline.d.ts +2 -2
- package/dist/components/data/Timeline.d.ts.map +1 -1
- package/dist/components/data/Timeline.js +17 -17
- package/dist/components/data/Timeline.js.map +1 -1
- package/dist/components/feedback/Avatar.d.ts +4 -2
- package/dist/components/feedback/Avatar.d.ts.map +1 -1
- package/dist/components/feedback/Avatar.js +4 -4
- package/dist/components/feedback/Avatar.js.map +1 -1
- package/dist/components/feedback/CardSkeleton.d.ts.map +1 -1
- package/dist/components/feedback/CardSkeleton.js +3 -3
- package/dist/components/feedback/CardSkeleton.js.map +1 -1
- package/dist/components/feedback/TableSkeleton.d.ts.map +1 -1
- package/dist/components/feedback/TableSkeleton.js +3 -3
- package/dist/components/feedback/TableSkeleton.js.map +1 -1
- package/dist/components/feedback/Tag.d.ts +4 -2
- package/dist/components/feedback/Tag.d.ts.map +1 -1
- package/dist/components/feedback/Tag.js +4 -4
- package/dist/components/feedback/Tag.js.map +1 -1
- package/dist/components/navigation/CommandPalette.d.ts.map +1 -1
- package/dist/components/navigation/CommandPalette.js +5 -2
- package/dist/components/navigation/CommandPalette.js.map +1 -1
- package/dist/components/navigation/PageTabs.d.ts +10 -8
- package/dist/components/navigation/PageTabs.d.ts.map +1 -1
- package/dist/components/navigation/PageTabs.js +17 -13
- package/dist/components/navigation/PageTabs.js.map +1 -1
- package/dist/components/overlays/Drawer.d.ts +16 -3
- package/dist/components/overlays/Drawer.d.ts.map +1 -1
- package/dist/components/overlays/Drawer.js +9 -5
- package/dist/components/overlays/Drawer.js.map +1 -1
- package/dist/components/overlays/Modal.d.ts +18 -3
- package/dist/components/overlays/Modal.d.ts.map +1 -1
- package/dist/components/overlays/Modal.js +13 -5
- package/dist/components/overlays/Modal.js.map +1 -1
- package/dist/components/pages/app-shell/AppShell.d.ts.map +1 -1
- package/dist/components/pages/app-shell/AppShell.js +6 -6
- package/dist/components/pages/app-shell/AppShell.js.map +1 -1
- package/dist/components/ui/ConfirmDialog.d.ts +1 -2
- package/dist/components/ui/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/ui/ConfirmDialog.js +10 -4
- package/dist/components/ui/ConfirmDialog.js.map +1 -1
- package/dist/components/ui/DataState.js +2 -2
- package/dist/components/ui/DataState.js.map +1 -1
- package/dist/index.d.ts +71 -42
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +114 -22
- package/dist/index.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/components/action-column.md +33 -7
- package/docs/components/admin-page-configurator.md +24 -5
- package/docs/components/admin-page-header.md +21 -3
- package/docs/components/admin-page-layout-shell.md +18 -4
- package/docs/components/admin-page-layout.md +34 -5
- package/docs/components/app-shell.md +31 -6
- package/docs/components/auto-complete-field.md +60 -0
- package/docs/components/avatar.md +18 -8
- package/docs/components/bar-chart.md +25 -7
- package/docs/components/breadcrumbs.md +15 -2
- package/docs/components/button.md +34 -15
- package/docs/components/card-skeleton.md +9 -3
- package/docs/components/change-password-form.md +23 -4
- package/docs/components/checkbox-field.md +38 -0
- package/docs/components/ckeditor-input.md +40 -8
- package/docs/components/color-picker-input.md +19 -8
- package/docs/components/command-palette.md +23 -2
- package/docs/components/confirm-dialog.md +36 -9
- package/docs/components/data-state.md +31 -6
- package/docs/components/date-field.md +39 -0
- package/docs/components/date-presets.md +19 -5
- package/docs/components/description-list.md +20 -2
- package/docs/components/dirty-form-guard.md +16 -4
- package/docs/components/donut-chart.md +24 -7
- package/docs/components/drawer.md +27 -8
- package/docs/components/empty-state.md +12 -2
- package/docs/components/error-boundary.md +16 -2
- package/docs/components/error-message.md +22 -3
- package/docs/components/field-shell.md +47 -0
- package/docs/components/file-dropzone.md +22 -6
- package/docs/components/filter-pannel.md +34 -7
- package/docs/components/forgot-password-form.md +23 -5
- package/docs/components/form-actions-bar.md +21 -2
- package/docs/components/form-field-render.md +36 -8
- package/docs/components/form-section.md +13 -1
- package/docs/components/form-wizard.md +34 -5
- package/docs/components/hidden-field.md +22 -6
- package/docs/components/index-column.md +25 -5
- package/docs/components/line-chart.md +25 -7
- package/docs/components/loading.md +14 -5
- package/docs/components/login-form.md +31 -6
- package/docs/components/mantis-data-table.md +61 -0
- package/docs/components/map-picker-client.md +29 -8
- package/docs/components/map-picker-osm.md +27 -9
- package/docs/components/map-picker.md +25 -4
- package/docs/components/mask-field.md +31 -0
- package/docs/components/menu-button.md +22 -7
- package/docs/components/modal.md +34 -9
- package/docs/components/multi-select-filter.md +25 -7
- package/docs/components/number-field.md +40 -0
- package/docs/components/otp-input.md +20 -7
- package/docs/components/page-tabs.md +23 -4
- package/docs/components/page-title.md +6 -1
- package/docs/components/paginated-table.md +36 -13
- package/docs/components/pagination.md +20 -7
- package/docs/components/password-input.md +20 -8
- package/docs/components/phone-input.md +17 -7
- package/docs/components/radio-group.md +39 -9
- package/docs/components/range-slider.md +18 -6
- package/docs/components/rating-input.md +19 -8
- package/docs/components/render-field.md +31 -3
- package/docs/components/reset-password-form.md +24 -4
- package/docs/components/rich-text-preview.md +17 -5
- package/docs/components/search-input.md +18 -7
- package/docs/components/select-field.md +55 -0
- package/docs/components/stat-card.md +14 -3
- package/docs/components/status-badge.md +17 -7
- package/docs/components/switch-field.md +32 -0
- package/docs/components/table-filter-field.md +22 -4
- package/docs/components/table-skeleton.md +9 -3
- package/docs/components/table-toolbar.md +18 -5
- package/docs/components/tag.md +16 -7
- package/docs/components/tags-input.md +21 -8
- package/docs/components/text-area.md +18 -8
- package/docs/components/text-field.md +32 -0
- package/docs/components/timeline.md +19 -3
- package/docs/components/toggle-inline-button.md +42 -10
- package/docs/components/upload-files-preview.md +23 -2
- package/docs/components/use-field-controller.md +58 -0
- package/docs/components/user-menu.md +26 -6
- package/docs/contracts/dependency-map.md +50 -52
- package/docs/contracts/field-controller.md +138 -0
- package/docs/contracts/style-imports.md +1 -20
- package/llms.txt +70 -72
- package/package.json +48 -11
- package/dist/components/Forms/AsyncSelect.d.ts +0 -20
- package/dist/components/Forms/AsyncSelect.d.ts.map +0 -1
- package/dist/components/Forms/AsyncSelect.js +0 -77
- package/dist/components/Forms/AsyncSelect.js.map +0 -1
- package/dist/components/Forms/Combobox.d.ts +0 -10
- package/dist/components/Forms/Combobox.d.ts.map +0 -1
- package/dist/components/Forms/Combobox.js +0 -11
- package/dist/components/Forms/Combobox.js.map +0 -1
- package/dist/components/Forms/CurrencyInput.d.ts +0 -12
- package/dist/components/Forms/CurrencyInput.d.ts.map +0 -1
- package/dist/components/Forms/CurrencyInput.js +0 -9
- package/dist/components/Forms/CurrencyInput.js.map +0 -1
- package/dist/components/Forms/DateInput.d.ts +0 -10
- package/dist/components/Forms/DateInput.d.ts.map +0 -1
- package/dist/components/Forms/DateInput.js +0 -11
- package/dist/components/Forms/DateInput.js.map +0 -1
- package/dist/components/Forms/DateRangeInput.d.ts +0 -10
- package/dist/components/Forms/DateRangeInput.d.ts.map +0 -1
- package/dist/components/Forms/DateRangeInput.js +0 -13
- package/dist/components/Forms/DateRangeInput.js.map +0 -1
- package/dist/components/Forms/DropDown.d.ts +0 -10
- package/dist/components/Forms/DropDown.d.ts.map +0 -1
- package/dist/components/Forms/DropDown.js +0 -11
- package/dist/components/Forms/DropDown.js.map +0 -1
- package/dist/components/Forms/MultiSelect.d.ts +0 -10
- package/dist/components/Forms/MultiSelect.d.ts.map +0 -1
- package/dist/components/Forms/MultiSelect.js +0 -13
- package/dist/components/Forms/MultiSelect.js.map +0 -1
- package/dist/components/Forms/NumberInput.d.ts +0 -10
- package/dist/components/Forms/NumberInput.d.ts.map +0 -1
- package/dist/components/Forms/NumberInput.js +0 -16
- package/dist/components/Forms/NumberInput.js.map +0 -1
- package/dist/components/Forms/Select.d.ts +0 -15
- package/dist/components/Forms/Select.d.ts.map +0 -1
- package/dist/components/Forms/Select.js +0 -48
- package/dist/components/Forms/Select.js.map +0 -1
- package/dist/components/Forms/Switch.d.ts +0 -18
- package/dist/components/Forms/Switch.d.ts.map +0 -1
- package/dist/components/Forms/Switch.js +0 -30
- package/dist/components/Forms/Switch.js.map +0 -1
- package/dist/components/Forms/TextInput.d.ts +0 -11
- package/dist/components/Forms/TextInput.d.ts.map +0 -1
- package/dist/components/Forms/TextInput.js +0 -12
- package/dist/components/Forms/TextInput.js.map +0 -1
- package/dist/components/Forms/TimePicker.d.ts +0 -13
- package/dist/components/Forms/TimePicker.d.ts.map +0 -1
- package/dist/components/Forms/TimePicker.js +0 -19
- package/dist/components/Forms/TimePicker.js.map +0 -1
- package/dist/components/Forms/Toggle.d.ts +0 -14
- package/dist/components/Forms/Toggle.d.ts.map +0 -1
- package/dist/components/Forms/Toggle.js +0 -10
- package/dist/components/Forms/Toggle.js.map +0 -1
- package/dist/components/Forms/types.d.ts +0 -9
- package/dist/components/Forms/types.d.ts.map +0 -1
- package/dist/components/Forms/types.js +0 -2
- package/dist/components/Forms/types.js.map +0 -1
- package/docs/components/async-select.md +0 -27
- package/docs/components/combobox.md +0 -19
- package/docs/components/currency-input.md +0 -21
- package/docs/components/date-input.md +0 -21
- package/docs/components/date-range-input.md +0 -20
- package/docs/components/drop-down.md +0 -26
- package/docs/components/multi-select.md +0 -22
- package/docs/components/number-input.md +0 -21
- package/docs/components/select.md +0 -28
- package/docs/components/switch.md +0 -24
- package/docs/components/text-input.md +0 -24
- package/docs/components/time-picker.md +0 -25
- package/docs/components/toggle.md +0 -24
- package/docs/contracts/component-doc-schema.md +0 -78
- package/docs/contracts/controller-props.md +0 -28
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// mantis-llm — escribe/actualiza un bloque de punteros de discovery para LLMs
|
|
3
|
+
// (CLAUDE.md / AGENTS.md) en el proyecto que consume @mantis-core/*.
|
|
4
|
+
//
|
|
5
|
+
// El objetivo: que cualquier LLM trabajando en un proyecto consumidor sepa qué
|
|
6
|
+
// componentes existen y cómo usarlos, sin que el humano tenga que recordárselo.
|
|
7
|
+
// Los docs ya viajan dentro de node_modules/@mantis-core/*/ — esto solo agrega el
|
|
8
|
+
// puntero en la raíz del repo (lo único que un LLM lee por defecto).
|
|
9
|
+
//
|
|
10
|
+
// Uso (post-install, el bin vive dentro de @mantis-core/ui):
|
|
11
|
+
// pnpm exec mantis-llm # escribe/actualiza CLAUDE.md y AGENTS.md
|
|
12
|
+
// pnpm exec mantis-llm --files=CLAUDE.md
|
|
13
|
+
// pnpm exec mantis-llm --check # no escribe; exit≠0 si falta o está viejo (para CI)
|
|
14
|
+
// pnpm exec mantis-llm --self-check
|
|
15
|
+
|
|
16
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
17
|
+
import { dirname, resolve } from "node:path";
|
|
18
|
+
import { fileURLToPath } from "node:url";
|
|
19
|
+
|
|
20
|
+
const BLOCK_VERSION = "v1";
|
|
21
|
+
const START = `<!-- mantis-core:llm-pointers ${BLOCK_VERSION} START (auto-generado por \`pnpm exec mantis-llm\` — no editar a mano) -->`;
|
|
22
|
+
const END = `<!-- mantis-core:llm-pointers END -->`;
|
|
23
|
+
// Regex tolerante a cualquier versión previa del marcador START.
|
|
24
|
+
const BLOCK_RE =
|
|
25
|
+
/<!-- mantis-core:llm-pointers[^>]*START[^>]*-->[\s\S]*?<!-- mantis-core:llm-pointers END -->/;
|
|
26
|
+
|
|
27
|
+
const SELF_DIR = dirname(fileURLToPath(import.meta.url)); // .../@mantis-core/ui/bin
|
|
28
|
+
const SCOPE_DIR = resolve(SELF_DIR, "..", ".."); // .../@mantis-core
|
|
29
|
+
|
|
30
|
+
// Solo paquetes que shipean docs de consumo. commons/utils no shipean llms.txt.
|
|
31
|
+
const PACKAGES = ["ui", "next-core", "nuqs", "styles"];
|
|
32
|
+
|
|
33
|
+
const isInstalled = (pkg) => existsSync(resolve(SCOPE_DIR, pkg, "llms.txt"));
|
|
34
|
+
|
|
35
|
+
/** Líneas de puntero por paquete — SOLO archivos de consumo (nunca docs internos). */
|
|
36
|
+
function pointerLines(pkg) {
|
|
37
|
+
const base = `node_modules/@mantis-core/${pkg}`;
|
|
38
|
+
switch (pkg) {
|
|
39
|
+
case "ui":
|
|
40
|
+
return [
|
|
41
|
+
`- **@mantis-core/ui** — \`${base}/llms.txt\` (índice de componentes: whenToUse + import por componente, léelo primero) · \`${base}/catalog.json\` (props/tipos — ~132KB, solo para grep puntual) · \`${base}/docs/components/*.md\` (1 doc con ejemplo compilable por componente) · \`${base}/docs/contracts/field-controller.md\` (contrato de form fields) · \`${base}/docs/contracts/style-imports.md\` (qué SCSS importar)`,
|
|
42
|
+
];
|
|
43
|
+
case "next-core":
|
|
44
|
+
return [
|
|
45
|
+
`- **@mantis-core/next-core** — \`${base}/llms.txt\` · \`${base}/docs/setup.md\` (install → providers → estilos → primer form + tabla) · \`${base}/docs/theme.md\` (MantisThemeProvider: preset, color ramps, dark mode) · \`${base}/docs/providers.md\` · \`${base}/docs/hooks.md\` · \`${base}/docs/toasts.md\``,
|
|
46
|
+
];
|
|
47
|
+
case "nuqs":
|
|
48
|
+
return [
|
|
49
|
+
`- **@mantis-core/nuqs** — \`${base}/llms.txt\` (parsers de URL-state + \`useDataTableQuery\`)`,
|
|
50
|
+
];
|
|
51
|
+
case "styles":
|
|
52
|
+
return [
|
|
53
|
+
`- **@mantis-core/styles** — \`${base}/llms.txt\` (partials SCSS + design tokens)`,
|
|
54
|
+
];
|
|
55
|
+
default:
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Construye el CONTENIDO del bloque (sin los marcadores), condicionado a lo instalado. */
|
|
61
|
+
function buildBlock(installed) {
|
|
62
|
+
const hasNextCore = installed.includes("next-core");
|
|
63
|
+
|
|
64
|
+
const rules = [
|
|
65
|
+
"- Importá desde `@mantis-core/ui` (o subpaths `@mantis-core/ui/components/*`). Nunca desde `packages/*`.",
|
|
66
|
+
"- Los form fields son `FieldControllerProps` planos: `<TextField name control label />` — sin `controller={{...}}`.",
|
|
67
|
+
];
|
|
68
|
+
if (hasNextCore) {
|
|
69
|
+
rules.push(
|
|
70
|
+
"- Montá `MantisCoreBaseProvider` + `MantisThemeProvider` una sola vez en el root. Ver `node_modules/@mantis-core/next-core/docs/setup.md`.",
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
rules.push(
|
|
74
|
+
"- Leé el `llms.txt` del paquete primero (índice chico). No leas `catalog.json` entero (~132KB): usalo solo para buscar props puntuales.",
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
const pointers = installed.flatMap(pointerLines);
|
|
78
|
+
|
|
79
|
+
return [
|
|
80
|
+
"## Mantis Core — componentes `@mantis-core/*` (LEER antes de escribir UI)",
|
|
81
|
+
"",
|
|
82
|
+
"Este proyecto usa `@mantis-core/*`. **Antes de crear o editar cualquier UI** con estos paquetes,",
|
|
83
|
+
"leé sus docs — ya están instaladas en `node_modules`, no hace falta clonar ni buscar en internet.",
|
|
84
|
+
"",
|
|
85
|
+
"### Reglas (no romper)",
|
|
86
|
+
...rules,
|
|
87
|
+
"",
|
|
88
|
+
"### Dónde mirar (por paquete instalado)",
|
|
89
|
+
...pointers,
|
|
90
|
+
].join("\n");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Envuelve el contenido con los marcadores. */
|
|
94
|
+
const wrap = (block) => `${START}\n${block}\n${END}`;
|
|
95
|
+
|
|
96
|
+
/** Extrae el contenido interno (sin marcadores) de un bloque ya presente. */
|
|
97
|
+
function extractInner(fileContent) {
|
|
98
|
+
const m = fileContent.match(BLOCK_RE);
|
|
99
|
+
if (!m) return null;
|
|
100
|
+
return m[0].replace(/^<!--[^>]*-->\n?/, "").replace(/\n?<!-- mantis-core:llm-pointers END -->$/, "");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Inserta/reemplaza el bloque en el contenido del archivo.
|
|
105
|
+
* @returns {string} nuevo contenido
|
|
106
|
+
*/
|
|
107
|
+
function applyBlock(existing, wrapped) {
|
|
108
|
+
if (existing == null || existing.trim() === "") {
|
|
109
|
+
return wrapped + "\n";
|
|
110
|
+
}
|
|
111
|
+
if (BLOCK_RE.test(existing)) {
|
|
112
|
+
return existing.replace(BLOCK_RE, wrapped);
|
|
113
|
+
}
|
|
114
|
+
// Sin bloque previo → append preservando el contenido del usuario.
|
|
115
|
+
const sep = existing.endsWith("\n") ? "\n" : "\n\n";
|
|
116
|
+
return existing + sep + wrapped + "\n";
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function parseArgs(argv) {
|
|
120
|
+
const args = { files: ["CLAUDE.md", "AGENTS.md"], check: false, selfCheck: false, help: false };
|
|
121
|
+
for (const a of argv) {
|
|
122
|
+
if (a === "--check") args.check = true;
|
|
123
|
+
else if (a === "--self-check") args.selfCheck = true;
|
|
124
|
+
else if (a === "-h" || a === "--help") args.help = true;
|
|
125
|
+
else if (a.startsWith("--files=")) {
|
|
126
|
+
args.files = a
|
|
127
|
+
.slice("--files=".length)
|
|
128
|
+
.split(",")
|
|
129
|
+
.map((s) => s.trim())
|
|
130
|
+
.filter(Boolean);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return args;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const HELP = `mantis-llm — puntero de discovery de @mantis-core/* para LLMs
|
|
137
|
+
|
|
138
|
+
pnpm exec mantis-llm [--files=CLAUDE.md,AGENTS.md] [--check]
|
|
139
|
+
|
|
140
|
+
Escribe/actualiza un bloque gestionado en los archivos de agente del proyecto
|
|
141
|
+
consumidor apuntando a las docs de @mantis-core/* dentro de node_modules.
|
|
142
|
+
|
|
143
|
+
(sin flags) Escribe/actualiza el bloque en CLAUDE.md y AGENTS.md (los crea si faltan).
|
|
144
|
+
--files=... Lista de archivos destino separada por comas.
|
|
145
|
+
--check No escribe. Exit≠0 si el bloque falta o está desactualizado (para CI).
|
|
146
|
+
--self-check Corre el auto-test interno (idempotencia + check) en un dir temporal.
|
|
147
|
+
`;
|
|
148
|
+
|
|
149
|
+
function run(cwd, argv) {
|
|
150
|
+
const args = parseArgs(argv);
|
|
151
|
+
if (args.help) {
|
|
152
|
+
process.stdout.write(HELP);
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const installed = PACKAGES.filter(isInstalled);
|
|
157
|
+
if (installed.length === 0) {
|
|
158
|
+
process.stderr.write(
|
|
159
|
+
"mantis-llm: no encontré ningún @mantis-core/* con llms.txt junto a este bin. " +
|
|
160
|
+
"¿Se corrió desde un proyecto con @mantis-core instalado?\n",
|
|
161
|
+
);
|
|
162
|
+
return 1;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const wrapped = wrap(buildBlock(installed));
|
|
166
|
+
const expectedInner = buildBlock(installed).trim();
|
|
167
|
+
|
|
168
|
+
if (args.check) {
|
|
169
|
+
let drift = false;
|
|
170
|
+
for (const file of args.files) {
|
|
171
|
+
const path = resolve(cwd, file);
|
|
172
|
+
const inner = existsSync(path) ? extractInner(readFileSync(path, "utf8")) : null;
|
|
173
|
+
if (inner == null) {
|
|
174
|
+
process.stderr.write(`mantis-llm --check: falta el bloque en ${file}\n`);
|
|
175
|
+
drift = true;
|
|
176
|
+
} else if (inner.trim() !== expectedInner) {
|
|
177
|
+
process.stderr.write(`mantis-llm --check: bloque desactualizado en ${file} (re-corré \`pnpm exec mantis-llm\`)\n`);
|
|
178
|
+
drift = true;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (!drift) process.stdout.write(`mantis-llm --check: OK (${installed.join(", ")})\n`);
|
|
182
|
+
return drift ? 1 : 0;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
for (const file of args.files) {
|
|
186
|
+
const path = resolve(cwd, file);
|
|
187
|
+
const existed = existsSync(path);
|
|
188
|
+
const existing = existed ? readFileSync(path, "utf8") : null;
|
|
189
|
+
const next = applyBlock(existing, wrapped);
|
|
190
|
+
if (existed && next === existing) {
|
|
191
|
+
process.stdout.write(`mantis-llm: ${file} ya estaba al día\n`);
|
|
192
|
+
} else {
|
|
193
|
+
writeFileSync(path, next);
|
|
194
|
+
process.stdout.write(`mantis-llm: ${existed ? "actualizado" : "creado"} ${file}\n`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
process.stdout.write(`mantis-llm: paquetes detectados → ${installed.join(", ")}\n`);
|
|
198
|
+
return 0;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// --- self-check (ponytail: un check runnable, sin frameworks) --------------
|
|
202
|
+
async function selfCheck() {
|
|
203
|
+
const { mkdtempSync, rmSync } = await import("node:fs");
|
|
204
|
+
const { tmpdir } = await import("node:os");
|
|
205
|
+
const assert = (await import("node:assert/strict")).default;
|
|
206
|
+
|
|
207
|
+
const tmp = mkdtempSync(resolve(tmpdir(), "mantis-llm-"));
|
|
208
|
+
const claude = resolve(tmp, "CLAUDE.md");
|
|
209
|
+
|
|
210
|
+
// Reusa la lógica pura contra un set "instalado" fijo (no toca disco real de paquetes).
|
|
211
|
+
const installed = ["ui", "next-core"];
|
|
212
|
+
const wrapped = wrap(buildBlock(installed));
|
|
213
|
+
|
|
214
|
+
// 1) crea el archivo con el bloque
|
|
215
|
+
writeFileSync(claude, applyBlock(null, wrapped));
|
|
216
|
+
let content = readFileSync(claude, "utf8");
|
|
217
|
+
assert.ok(content.includes(START), "debe escribir el marcador START");
|
|
218
|
+
assert.ok(content.includes("MantisThemeProvider"), "con next-core debe incluir la regla de providers");
|
|
219
|
+
|
|
220
|
+
// 2) idempotente: 2ª aplicación no duplica
|
|
221
|
+
const again = applyBlock(content, wrapped);
|
|
222
|
+
assert.equal((again.match(/mantis-core:llm-pointers .*START/g) || []).length, 1, "no debe duplicar el bloque");
|
|
223
|
+
assert.equal(again, content, "2ª corrida no debe cambiar nada");
|
|
224
|
+
|
|
225
|
+
// 3) regla condicional: sin next-core NO aparece la regla de providers
|
|
226
|
+
const uiOnly = applyBlock(null, wrap(buildBlock(["ui"])));
|
|
227
|
+
assert.ok(!uiOnly.includes("MantisThemeProvider"), "sin next-core no debe mencionar providers");
|
|
228
|
+
|
|
229
|
+
// 4) extractInner round-trips y detecta drift
|
|
230
|
+
assert.equal(extractInner(content).trim(), buildBlock(installed).trim(), "extractInner debe recuperar el bloque");
|
|
231
|
+
|
|
232
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
233
|
+
process.stdout.write("mantis-llm --self-check: OK\n");
|
|
234
|
+
return 0;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const argv = process.argv.slice(2);
|
|
238
|
+
if (argv.includes("--self-check")) {
|
|
239
|
+
process.exit(await selfCheck());
|
|
240
|
+
} else {
|
|
241
|
+
process.exit(run(process.cwd(), argv));
|
|
242
|
+
}
|