framework-m-studio 0.17.2__tar.gz → 0.18.0__tar.gz
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.
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/CHANGELOG.md +7 -1
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/PKG-INFO +3 -3
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/pyproject.toml +3 -3
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/release/__init__.py +2 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/release/cli.py +13 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/release/orchestrator.py +96 -0
- framework_m_studio-0.17.2/src/framework_m_studio/static/assets/index-CVv-McVR.js → framework_m_studio-0.18.0/src/framework_m_studio/static/assets/index-viorSw2T.js +45 -45
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/static/index.html +1 -1
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/package.json.template +4 -4
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/CHANGELOG.md +7 -1
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/package.json +3 -3
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_release_cli.py +137 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/.gitignore +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/LICENSE +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/README.md +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/docs/api/index.md +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/docs/user-guide.md +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/__init__.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/aggregate_builder.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/app.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/__init__.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/codegen.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/constants.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/contrib.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/deps.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/dev.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/dev_link.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/docs.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/new.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/proxy.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/quality.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/release/gitops.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/release/graph.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/release/lockfile_sync.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/release/models.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/release/versioning.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/screenshots.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/studio.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/translations.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/utility.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/verify.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/__init__.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/annotation_parser.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/generator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/meta_extractor.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/parser.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/templates/__init__.py.jinja2 +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/templates/controller.py.jinja2 +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/templates/doctype.py.jinja2 +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/templates/test_doctype.py.jinja2 +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/test_generator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/codegen/transformer.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/core/adapters/cst/mutator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/core/codegen/augmentation_gen.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/core/discovery/pydantic.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/core/discovery/roles.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/core/frontend.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/core/gitops.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/core/repositories/fs_mx_repo.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/core/repositories/git_mx_repo.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/core/shell.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/data_elements.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/dev_config.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/discovery.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/docs/ast_parsers.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/docs/audit.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/docs/exporters.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/docs/formatters.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/docs/generator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/docs/openapi.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/docs/screenshots.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/doctypes/virtual_doc_type/__init__.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/doctypes/virtual_doc_type/controller.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/doctypes/virtual_doc_type/doctype.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/doctypes/virtual_field/__init__.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/doctypes/virtual_field/controller.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/doctypes/virtual_field/doctype.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/ephemeral.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/git/__init__.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/git/adapter.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/git/github_provider.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/git/protocol.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/guardrail.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/live_preview.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/metadata_editor.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/print_adapter.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/protocol_scanner.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/py.typed +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/resources/blueprints/standard.json +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/resources/roles/crm.json +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/resources/roles/financial.json +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/resources/roles/hr.json +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/resources/roles/inventory.json +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/resources/roles/project.json +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/resources/roles/standard.json +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/routers/__init__.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/routers/aggregate.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/routers/doctypes.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/routers/print.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/routers/publish.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/routers/roles.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/routers/shell.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/routes.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/schema_diff.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/schemas.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/sdk_generator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/services/__init__.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/services/aggregate.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/services/doctype.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/services/print_service.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/services/publish.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/services/shell.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/services/workspace.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/shell_plugin_config.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/sidebar_config.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/static/.gitkeep +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/static/assets/index-D8voZ-lm.css +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/static/assets/rolldown-runtime-CMxvf4Kt.js +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/static/assets/vendor-icons-D2zb75Z-.js +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/static/assets/vendor-react-BOMmkTcq.js +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/static/assets/vendor-tamagui-jE-K7TKU.js +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/static/favicon.png +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/storage/__init__.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/storage/file_adapter.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/storage/git_api_adapter.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/storage/protocol.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/app/README.md.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/app/__init__.py.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/app/doctypes_init.py.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/app/pyproject.toml.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/doctype/__init__.py.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/doctype/controller.py.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/doctype/doctype.py.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/doctype/test.py.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/.gitignore.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/Dashboard.tsx.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/README.md.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/favicon.png +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/index.html.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/index.tsx.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/plugin.config.ts.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/theme.css.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/tsconfig.json.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/vite.config.mfe.ts.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/templates/plugin/vite.config.ts.template +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/visual_designer.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/workspace.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/.gitignore +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/.npmrc +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/Dockerfile +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/README.md +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/eslint.config.js +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/index.html +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/public/favicon.png +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/App.css +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/App.test.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/App.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/AggregateTab.test.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/AggregateTab.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/AutoForm.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/AutoTable.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/CodePreview.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/ControllerEditor.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/ERDView.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/FieldEditor.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/LayoutDesigner.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/MetaEditor.test.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/MetaEditor.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/MigrationTab.test.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/MigrationTab.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/ModuleExplorer.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/NestedEditorDrawer.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/PrintTab.test.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/PrintTab.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/PropertiesPanel.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/SandboxPreview.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/TableFieldEditor.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/breadcrumb/index.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/fields/DefaultFieldComponents.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/fields/index.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/fields/resolveFieldComponent.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/layout/index.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/components/menu/index.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/designer/DesignerCanvas.test.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/designer/DesignerCanvas.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/designer/components/PaletteItem.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/designer/components/SectionDropZone.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/designer/hooks/useDesignerState.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/index.css +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/index.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/pages/doctypes/edit.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/pages/doctypes/index.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/pages/doctypes/list.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/pages/index.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/pages/prints/PrintBuilderPage.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/pages/prints/index.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/pages/shell-config/ShellConfiguratorPage.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/pages/shell-config/index.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/providers/ThemeContext.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/providers/constants.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/providers/data.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/providers/theme.tsx +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/providers/useTheme.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/registry/defaultComponents.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/registry/fieldComponents.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/registry/index.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/services/mock_data.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/setupTests.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/utils/mockDataGenerator.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/src/vite-env.d.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/tsconfig.json +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/tsconfig.node.json +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/vite.config.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/studio_ui/vitest.config.ts +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/cli/test_new.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/cli/test_verify.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/codegen/test_annotation_parser.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/codegen/test_meta_extractor.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/conftest.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/core/adapters/test_cst_mutator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/core/codegen/test_augmentation_gen.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/core/discovery/test_pydantic_discovery.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/core/discovery/test_role_discovery.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/core/repositories/test_fs_mx_repo.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/core/test_frontend.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/core/test_gitops.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/core/test_shell.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/doctypes/virtual_doc_type/test_virtual_doc_type.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/doctypes/virtual_field/test_virtual_field.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_aggregate_builder.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_aggregate_builder_branches.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_aggregate_generator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_api_routes.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_builder_shell_routes.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_cli.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_cli_openapi.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_cli_utility.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_codegen_cli.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_contrib_cli.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_core_frontend.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_data_elements.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_data_elements_extended.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_deps_cli.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_dev.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_dev_cli_coverage.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_dev_config.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_dev_link.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_discovery.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_docs_ast_parsers.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_docs_audit.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_docs_exporters.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_docs_generator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_docs_generator_enhanced.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_docs_generator_extended.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_doctype_service_coverage.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_ephemeral.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_frontend_integration.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_generator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_git_adapter.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_git_protocol.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_github_provider.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_guardrail.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_live_preview.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_lockfile_sync.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_metadata_editor.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_multi_repo_workspace.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_new_cli.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_parser.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_print_adapter.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_print_router_isolated.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_protocol_scanner.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_protocol_scanner_extended.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_proxy.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_quality_cli.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_release_cli_more.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_release_gitops.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_release_graph.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_release_orchestrator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_release_versioning.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_routes_extended.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_schema_diff.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_screenshot_pipeline.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_sdk_generator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_shell_plugin_config.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_sidebar_routes.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_storage_adapters.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_studio.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_studio_codegen_generator.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_studio_init.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_transformer.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_translations_cli.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_uimeta_routes.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_utility_cli.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_utility_cli_enhanced.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_visual_designer.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_workspace.py +0 -0
- {framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/tests/test_workspace_coverage.py +0 -0
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
## framework-m-studio v0.
|
|
1
|
+
## framework-m-studio v0.18.0
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
- add commit scope linting and CI validator (96cb12a)
|
|
6
|
+
|
|
7
|
+
**framework-m-studio** v0.17.3: internal dependency bump due to **framework-m** update## framework-m-studio v0.17.2
|
|
2
8
|
|
|
3
9
|
### Bug Fixes
|
|
4
10
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: framework-m-studio
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.18.0
|
|
4
4
|
Summary: Framework M Studio - Visual DocType Builder & Developer Tools
|
|
5
5
|
Project-URL: Homepage, https://gitlab.com/castlecraft/framework-m
|
|
6
6
|
Project-URL: Documentation, https://gitlab.com/castlecraft/framework-m#readme
|
|
@@ -20,8 +20,8 @@ Classifier: Typing :: Typed
|
|
|
20
20
|
Requires-Python: >=3.12
|
|
21
21
|
Requires-Dist: bandit>=1.9.4
|
|
22
22
|
Requires-Dist: build>=1.5.0
|
|
23
|
-
Requires-Dist: framework-m-core>=0.
|
|
24
|
-
Requires-Dist: framework-m>=0.
|
|
23
|
+
Requires-Dist: framework-m-core>=0.26.0
|
|
24
|
+
Requires-Dist: framework-m>=0.14.0
|
|
25
25
|
Requires-Dist: honcho>=2.0.0
|
|
26
26
|
Requires-Dist: httpx>=0.28.1
|
|
27
27
|
Requires-Dist: ipython>=9.14.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "framework-m-studio"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.18.0"
|
|
4
4
|
description = "Framework M Studio - Visual DocType Builder & Developer Tools"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "Apache-2.0" }
|
|
@@ -21,8 +21,8 @@ classifiers = [
|
|
|
21
21
|
]
|
|
22
22
|
|
|
23
23
|
dependencies = [
|
|
24
|
-
"framework-m-core>=0.
|
|
25
|
-
"framework-m>=0.
|
|
24
|
+
"framework-m-core>=0.26.0",
|
|
25
|
+
"framework-m>=0.14.0",
|
|
26
26
|
# Code generation
|
|
27
27
|
"libcst>=1.8.6",
|
|
28
28
|
"jinja2>=3.1.6",
|
|
@@ -11,6 +11,7 @@ from framework_m_studio.core.shell import run_cmd
|
|
|
11
11
|
from .cli import (
|
|
12
12
|
release_app,
|
|
13
13
|
release_auto_command,
|
|
14
|
+
release_lint_scopes_command,
|
|
14
15
|
release_mr_command,
|
|
15
16
|
release_plan_command,
|
|
16
17
|
release_prepare_command,
|
|
@@ -64,6 +65,7 @@ __all__ = [
|
|
|
64
65
|
"push_release_branch",
|
|
65
66
|
"release_app",
|
|
66
67
|
"release_auto_command",
|
|
68
|
+
"release_lint_scopes_command",
|
|
67
69
|
"release_mr_command",
|
|
68
70
|
"release_plan_command",
|
|
69
71
|
"release_prepare_command",
|
{framework_m_studio-0.17.2 → framework_m_studio-0.18.0}/src/framework_m_studio/cli/release/cli.py
RENAMED
|
@@ -15,6 +15,7 @@ from .orchestrator import (
|
|
|
15
15
|
_load_release_config,
|
|
16
16
|
compute_release_plan,
|
|
17
17
|
create_or_update_mr,
|
|
18
|
+
lint_release_scopes,
|
|
18
19
|
prepare_release,
|
|
19
20
|
push_release_branch,
|
|
20
21
|
run_release_orchestration,
|
|
@@ -199,6 +200,18 @@ async def release_tag_command(
|
|
|
199
200
|
await tag_and_release(release_config, root_path, git_provider, dry_run)
|
|
200
201
|
|
|
201
202
|
|
|
203
|
+
@release_app.command(name="lint-scopes")
|
|
204
|
+
def release_lint_scopes_command(
|
|
205
|
+
base: str,
|
|
206
|
+
head: str = "HEAD",
|
|
207
|
+
config: str = "release-config.json",
|
|
208
|
+
root: str | None = None,
|
|
209
|
+
) -> None:
|
|
210
|
+
"""Lint that modified packages have corresponding release scopes/tags."""
|
|
211
|
+
root_path = Path(root) if root else Path.cwd()
|
|
212
|
+
lint_release_scopes(config, root_path, base, head)
|
|
213
|
+
|
|
214
|
+
|
|
202
215
|
def release_schema_command(output: str | None = None) -> None:
|
|
203
216
|
"""Generate JSON schema for the release configuration."""
|
|
204
217
|
from .models import ReleaseConfig
|
|
@@ -397,3 +397,99 @@ async def run_release_orchestration(
|
|
|
397
397
|
|
|
398
398
|
desc = "\n\n".join(sections)
|
|
399
399
|
await create_or_update_mr(branch, config.target_branch, title, desc, provider_cls)
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
def lint_release_scopes(config_path: str, root: Path, base: str, head: str) -> None:
|
|
403
|
+
"""Verify that all modified packages have corresponding release scopes/tags in commits."""
|
|
404
|
+
import sys
|
|
405
|
+
|
|
406
|
+
from .gitops import _parse_commit_message
|
|
407
|
+
|
|
408
|
+
config = _load_release_config(config_path, root=root)
|
|
409
|
+
|
|
410
|
+
# 1. Get changed files in the diff range
|
|
411
|
+
cmd_diff = ["git", "diff", "--name-only", f"{base}...{head}"]
|
|
412
|
+
res_diff = subprocess.run(
|
|
413
|
+
cmd_diff, cwd=root, capture_output=True, text=True, check=True
|
|
414
|
+
)
|
|
415
|
+
changed_files = [
|
|
416
|
+
line.strip() for line in res_diff.stdout.splitlines() if line.strip()
|
|
417
|
+
]
|
|
418
|
+
|
|
419
|
+
# 2. Map changed files to packages
|
|
420
|
+
modified_packages = []
|
|
421
|
+
for pkg in config.packages:
|
|
422
|
+
pkg_modified = False
|
|
423
|
+
for path in pkg.paths:
|
|
424
|
+
norm_path = path.strip("/") + "/"
|
|
425
|
+
if any(
|
|
426
|
+
f.startswith(norm_path) or f == path.strip("/") for f in changed_files
|
|
427
|
+
):
|
|
428
|
+
pkg_modified = True
|
|
429
|
+
break
|
|
430
|
+
if pkg_modified:
|
|
431
|
+
modified_packages.append(pkg)
|
|
432
|
+
|
|
433
|
+
if not modified_packages:
|
|
434
|
+
CLIConsole().success("✅ No packages modified in this range.")
|
|
435
|
+
return
|
|
436
|
+
|
|
437
|
+
# 3. Get all commits in the diff range
|
|
438
|
+
sep = "||COMMIT_SEP||"
|
|
439
|
+
log_format = f"%H%n%s%n%b%n{sep}"
|
|
440
|
+
cmd_log = ["git", "log", f"{base}..{head}", f"--pretty=format:{log_format}"]
|
|
441
|
+
res_log = subprocess.run(
|
|
442
|
+
cmd_log, cwd=root, capture_output=True, text=True, check=True
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
commits = []
|
|
446
|
+
if res_log.stdout:
|
|
447
|
+
raw_commits = res_log.stdout.split(sep)
|
|
448
|
+
for raw in raw_commits:
|
|
449
|
+
if not raw.strip():
|
|
450
|
+
continue
|
|
451
|
+
lines = raw.strip().split("\n")
|
|
452
|
+
if len(lines) < 2:
|
|
453
|
+
continue
|
|
454
|
+
parsed = _parse_commit_message("\n".join(lines[1:]), lines[0])
|
|
455
|
+
if parsed:
|
|
456
|
+
commits.append(parsed)
|
|
457
|
+
|
|
458
|
+
# 4. Validate that each modified package matches at least one commit
|
|
459
|
+
missing_scopes = []
|
|
460
|
+
for pkg in modified_packages:
|
|
461
|
+
matched = False
|
|
462
|
+
for commit in commits:
|
|
463
|
+
if commit.body_tags:
|
|
464
|
+
if "*" in commit.body_tags:
|
|
465
|
+
matched = True
|
|
466
|
+
break
|
|
467
|
+
if (
|
|
468
|
+
(pkg.name in commit.body_tags)
|
|
469
|
+
or (pkg.publish_name and pkg.publish_name in commit.body_tags)
|
|
470
|
+
or (commit.scope in pkg.scopes)
|
|
471
|
+
or any(tag in pkg.scopes for tag in commit.body_tags)
|
|
472
|
+
):
|
|
473
|
+
matched = True
|
|
474
|
+
break
|
|
475
|
+
else:
|
|
476
|
+
if (pkg.include_global and not commit.scope) or (
|
|
477
|
+
commit.scope in pkg.scopes
|
|
478
|
+
):
|
|
479
|
+
matched = True
|
|
480
|
+
break
|
|
481
|
+
if not matched:
|
|
482
|
+
missing_scopes.append(pkg)
|
|
483
|
+
|
|
484
|
+
if missing_scopes:
|
|
485
|
+
CLIConsole().error("❌ Commit message scope linting failed!")
|
|
486
|
+
for pkg in missing_scopes:
|
|
487
|
+
CLIConsole().error(
|
|
488
|
+
f"Package '{pkg.name}' was modified but no commits in range contain the "
|
|
489
|
+
f"scope '{pkg.scopes[0]}' or body tag 'Releases: {pkg.name}' / 'Releases: *'."
|
|
490
|
+
)
|
|
491
|
+
sys.exit(1)
|
|
492
|
+
|
|
493
|
+
CLIConsole().success(
|
|
494
|
+
"✅ All modified packages have corresponding release scopes/tags."
|
|
495
|
+
)
|