hap-cli 0.8.10__tar.gz → 0.8.11__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.
- {hap_cli-0.8.10 → hap_cli-0.8.11}/PKG-INFO +6 -6
- {hap_cli-0.8.10/hap_cli → hap_cli-0.8.11}/README.md +4 -4
- {hap_cli-0.8.10 → hap_cli-0.8.11/hap_cli}/README.md +4 -4
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/README_CN.md +1 -1
- hap_cli-0.8.11/hap_cli/__init__.py +3 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/auth_cmd.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/chart_cmd.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/selftest.py +56 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/validate.py +48 -2
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/auth.py +2 -2
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/calendar_mod.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/chart.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/chat.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/chatbot.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/contact.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/department.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/flow_node.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/group.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/instance.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/optionset.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/page.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/post.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/record.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/role.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/session.py +6 -6
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/workflow.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/worksheet.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/hap_cli.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_core.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_full_e2e.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_global_meta.py +1 -1
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli.egg-info/PKG-INFO +6 -6
- {hap_cli-0.8.10 → hap_cli-0.8.11}/setup.py +1 -1
- hap_cli-0.8.10/hap_cli/__init__.py +0 -3
- {hap_cli-0.8.10 → hap_cli-0.8.11}/MANIFEST.in +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/app_live_tests/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/app_live_tests/__main__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/app_live_tests/config.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/app_live_tests/harness.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/app_live_tests/smoke.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/app_live_tests/state.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/__main__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/app_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/app_creator_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/app_editor_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/calendar_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/chat_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/chatbot_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/config_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/contact_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/department_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/group_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/icon_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/instance_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/node_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/optionset_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/page_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/post_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/record_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/region_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/role_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/update_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/upload_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/v3_registry.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/workflow_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/commands/worksheet_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/context.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/action_spec_adapter.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/_hapmeta/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/_hapmeta/control_type_codes.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/_hapmeta/worksheet_templates.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/charts.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/cleanup.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/compiler.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/config.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/design/design.schema.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/errors.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/examples/minimal.design.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/executor.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/fields.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/hap.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/merge.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/recording/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/recording/console.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/recording/jsonl.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/recording/mirror.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/recording/report.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/schema.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/seed/INSTRUCTIONS.md +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/seed/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/seed/cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/seed/executor.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/seed/resources/attachments.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/seed/resources/sample.docx +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/seed/resources/sample.pdf +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/seed/resources/sample_images.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/seed/template.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/smoke.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/steps.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/store.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/app_creator/workflow_dsl.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/cli_access.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/control_type_codes.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/_hapmeta/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/_hapmeta/control_type_codes.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/apply.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/componentlower.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/editspec.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/errors.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/fieldlower.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/jsonschema_mini.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/models.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/ops.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/planner.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/editor/reader.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/field_normalizer.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/field_spec_adapter.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/filter_translator.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/global_meta.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/icon_index.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/logger.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/response_crypto.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/role_perm_builder.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/token_crypto.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/update.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/upload.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/v3/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/v3/dispatcher.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/v3/render.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/v3/schema.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/view_spec_adapter.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/workflow_node_dsl.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/core/worksheet_templates.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/i18n.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/locale/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/locale/messages.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/locale/messages.schema.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/conftest.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_app_creator.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_app_editor.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_app_export_usage.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_auth_prerelease.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_bug_036430.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_chart.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_cli_access.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_config_cmd.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_destructive_confirm_cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_i18n.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_instance_history_cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration_approval.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration_approval_actions.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration_calendar.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration_destructive.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration_misc.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration_post.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration_social.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration_v3.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration_workflow.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_integration_worksheet_extra.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_multi_profile.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_org_approval_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_org_id_cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_org_id_docs.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_parameter_conventions.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_parameter_mapping_registry.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_record_batch_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_record_field_alias.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_record_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_semantic_types_registry.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_update.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_v3_api_schema_loader.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_v3_dispatcher.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_v3_registry_coverage.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_v3_session.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_v3_yaml_translation.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_workflow_list_cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_workflow_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_worksheet_crud_cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/tests/test_worksheet_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/utils/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/utils/formatting.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/utils/options.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli/utils/parameter_mapping.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli.egg-info/SOURCES.txt +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli.egg-info/dependency_links.txt +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli.egg-info/entry_points.txt +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli.egg-info/requires.txt +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/hap_cli.egg-info/top_level.txt +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/__main__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/_wftest.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/charts.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/cleanup.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/compiler.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/config.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/errors.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/executor.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/fields.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/hap.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/recording/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/recording/console.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/recording/jsonl.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/recording/mirror.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/recording/report.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/schema.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/seed/__init__.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/seed/cli.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/seed/executor.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/seed/template.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/selftest.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/smoke.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/step.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/steps.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/store.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/live_tests/workflow_dsl.py +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/setup.cfg +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/skills/cli/hap-cli-app-editor/scripts/editspec/component.schema.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/skills/cli/hap-cli-app-editor/scripts/editspec/custom-action.schema.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/skills/cli/hap-cli-app-editor/scripts/editspec/envelope.schema.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/skills/cli/hap-cli-app-editor/scripts/editspec/field.schema.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/INDEX.json +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/add_member_to_role.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/batch_delete_records.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/create_optionset.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/create_role.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/delete_optionset.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/delete_record.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/delete_role.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/delete_worksheet.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_app_info.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_app_knowledge_list.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_app_worksheets_list.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_optionset_list.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_record_details.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_record_discussions.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_record_list.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_record_logs.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_record_pivot_data.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_record_relations.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_record_share_link.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_regions.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_role_details.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/get_role_list.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/knowledge_search.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/leave_all_roles.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/remove_member_from_role.yaml +0 -0
- {hap_cli-0.8.10 → hap_cli-0.8.11}/sources/v3-api-schema/update_optionset.yaml +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hap-cli
|
|
3
|
-
Version: 0.8.
|
|
4
|
-
Summary: CLI harness for
|
|
3
|
+
Version: 0.8.11
|
|
4
|
+
Summary: CLI harness for Mingdao HAP - Enterprise no-code platform
|
|
5
5
|
Author: hap-cli
|
|
6
6
|
License: Apache-2.0
|
|
7
7
|
Classifier: Development Status :: 3 - Alpha
|
|
@@ -29,7 +29,7 @@ Dynamic: summary
|
|
|
29
29
|
|
|
30
30
|
# hap-cli
|
|
31
31
|
|
|
32
|
-
CLI harness for **
|
|
32
|
+
CLI harness for **Mingdao HAP** (明道云) — an enterprise no-code platform.
|
|
33
33
|
|
|
34
34
|
## Installation
|
|
35
35
|
|
|
@@ -54,7 +54,7 @@ each organization's status (`CLI:on/off`).
|
|
|
54
54
|
### 1. Login
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
|
-
#
|
|
57
|
+
# Mingdao SaaS (default)
|
|
58
58
|
hap auth login
|
|
59
59
|
|
|
60
60
|
# Specific environment
|
|
@@ -66,7 +66,7 @@ hap auth login https://hap.example.com # self-hosted
|
|
|
66
66
|
hap auth login https://your-server.com --token YOUR_TOKEN
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
-
The browser flow opens the
|
|
69
|
+
The browser flow opens the Mingdao login page and captures the token. If the
|
|
70
70
|
callback can't reach the CLI (no GUI, restricted network), interrupt the
|
|
71
71
|
command — it falls back to a paste prompt for the token shown on the success
|
|
72
72
|
page.
|
|
@@ -78,7 +78,7 @@ hap auth logout # log out the current account
|
|
|
78
78
|
|
|
79
79
|
#### Multiple environments / accounts
|
|
80
80
|
|
|
81
|
-
You can stay logged in to several environments (
|
|
81
|
+
You can stay logged in to several environments (Mingdao SaaS, Nocoly, self-hosted) and
|
|
82
82
|
several accounts at once. Each is saved under a name and you switch between them:
|
|
83
83
|
|
|
84
84
|
```bash
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# hap-cli
|
|
2
2
|
|
|
3
|
-
CLI harness for **
|
|
3
|
+
CLI harness for **Mingdao HAP** (明道云) — an enterprise no-code platform.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -25,7 +25,7 @@ each organization's status (`CLI:on/off`).
|
|
|
25
25
|
### 1. Login
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
#
|
|
28
|
+
# Mingdao SaaS (default)
|
|
29
29
|
hap auth login
|
|
30
30
|
|
|
31
31
|
# Specific environment
|
|
@@ -37,7 +37,7 @@ hap auth login https://hap.example.com # self-hosted
|
|
|
37
37
|
hap auth login https://your-server.com --token YOUR_TOKEN
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
The browser flow opens the
|
|
40
|
+
The browser flow opens the Mingdao login page and captures the token. If the
|
|
41
41
|
callback can't reach the CLI (no GUI, restricted network), interrupt the
|
|
42
42
|
command — it falls back to a paste prompt for the token shown on the success
|
|
43
43
|
page.
|
|
@@ -49,7 +49,7 @@ hap auth logout # log out the current account
|
|
|
49
49
|
|
|
50
50
|
#### Multiple environments / accounts
|
|
51
51
|
|
|
52
|
-
You can stay logged in to several environments (
|
|
52
|
+
You can stay logged in to several environments (Mingdao SaaS, Nocoly, self-hosted) and
|
|
53
53
|
several accounts at once. Each is saved under a name and you switch between them:
|
|
54
54
|
|
|
55
55
|
```bash
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# hap-cli
|
|
2
2
|
|
|
3
|
-
CLI harness for **
|
|
3
|
+
CLI harness for **Mingdao HAP** (明道云) — an enterprise no-code platform.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -25,7 +25,7 @@ each organization's status (`CLI:on/off`).
|
|
|
25
25
|
### 1. Login
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
#
|
|
28
|
+
# Mingdao SaaS (default)
|
|
29
29
|
hap auth login
|
|
30
30
|
|
|
31
31
|
# Specific environment
|
|
@@ -37,7 +37,7 @@ hap auth login https://hap.example.com # self-hosted
|
|
|
37
37
|
hap auth login https://your-server.com --token YOUR_TOKEN
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
The browser flow opens the
|
|
40
|
+
The browser flow opens the Mingdao login page and captures the token. If the
|
|
41
41
|
callback can't reach the CLI (no GUI, restricted network), interrupt the
|
|
42
42
|
command — it falls back to a paste prompt for the token shown on the success
|
|
43
43
|
page.
|
|
@@ -49,7 +49,7 @@ hap auth logout # log out the current account
|
|
|
49
49
|
|
|
50
50
|
#### Multiple environments / accounts
|
|
51
51
|
|
|
52
|
-
You can stay logged in to several environments (
|
|
52
|
+
You can stay logged in to several environments (Mingdao SaaS, Nocoly, self-hosted) and
|
|
53
53
|
several accounts at once. Each is saved under a name and you switch between them:
|
|
54
54
|
|
|
55
55
|
```bash
|
|
@@ -378,7 +378,7 @@ def auth_whoami(ctx):
|
|
|
378
378
|
# Read login_url from the active (or --profile) credential profile —
|
|
379
379
|
# the in-memory Session may have been mutated, and we want whoami to
|
|
380
380
|
# probe the server recorded for the profile in use. When the profile
|
|
381
|
-
# has no URL, fall back to the
|
|
381
|
+
# has no URL, fall back to the Mingdao SaaS host. Token failures
|
|
382
382
|
# (missing / expired) surface uniformly via AuthenticationError
|
|
383
383
|
# → "Not logged in" hint from handle_error.
|
|
384
384
|
profile_name = resolve_profile_name(ctx.profile)
|
|
@@ -21,7 +21,7 @@ def chart():
|
|
|
21
21
|
pass
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
# Report-type enum values used by the
|
|
24
|
+
# Report-type enum values used by the Mingdao statistics module. The CLI
|
|
25
25
|
# accepts the integer directly so users can pass uncommon types without us
|
|
26
26
|
# having to enumerate every one. Note: there is NO type 4 — passing 4 is
|
|
27
27
|
# coerced to 10 (number) by the server, so it is omitted here (bug #036584).
|
|
@@ -1607,6 +1607,62 @@ def test_icon_validation() -> None:
|
|
|
1607
1607
|
assert any("worksheets[0].icon" in e and "1_2_order" in e for e in errs), errs
|
|
1608
1608
|
|
|
1609
1609
|
|
|
1610
|
+
def test_icon_uniqueness() -> None:
|
|
1611
|
+
"""Nav-level entities (worksheets + custom_pages) must each carry a DISTINCT
|
|
1612
|
+
icon — the 零冗余 golden rule. Reusing one icon across two worksheets/pages
|
|
1613
|
+
is a hard validation error, caught offline before build. Buttons and
|
|
1614
|
+
page-component icons are exempt (icon reuse there is legitimate and common).
|
|
1615
|
+
Pure check — no catalogue lookup needed."""
|
|
1616
|
+
from hap_cli.core.app_creator import validate
|
|
1617
|
+
|
|
1618
|
+
# Two worksheets sharing one icon -> a single error that names both owners.
|
|
1619
|
+
dup = {
|
|
1620
|
+
"app": {"name": "D", "icon": "sys_1_2_order"},
|
|
1621
|
+
"worksheets": [
|
|
1622
|
+
{"name": "入库单", "icon": "sys_form_symbol"},
|
|
1623
|
+
{"name": "出库单", "icon": "sys_form_symbol"},
|
|
1624
|
+
{"name": "物料", "icon": "sys_18_5_warehouse"},
|
|
1625
|
+
],
|
|
1626
|
+
}
|
|
1627
|
+
errs = validate._check_icon_uniqueness(dup)
|
|
1628
|
+
assert len(errs) == 1, errs
|
|
1629
|
+
assert "sys_form_symbol" in errs[0], errs
|
|
1630
|
+
assert "入库单" in errs[0] and "出库单" in errs[0], errs
|
|
1631
|
+
|
|
1632
|
+
# A worksheet and a custom_page sharing an icon also collide — they sit in
|
|
1633
|
+
# the same left-nav strip.
|
|
1634
|
+
cross = {
|
|
1635
|
+
"worksheets": [{"name": "订单", "icon": "sys_form_symbol"}],
|
|
1636
|
+
"custom_pages": [{"name": "看板", "icon": "sys_form_symbol"}],
|
|
1637
|
+
}
|
|
1638
|
+
errs = validate._check_icon_uniqueness(cross)
|
|
1639
|
+
assert len(errs) == 1, errs
|
|
1640
|
+
assert "订单" in errs[0] and "看板" in errs[0], errs
|
|
1641
|
+
|
|
1642
|
+
# All-distinct nav icons pass clean (app icon does not participate).
|
|
1643
|
+
ok = {
|
|
1644
|
+
"app": {"name": "D", "icon": "sys_1_2_order"},
|
|
1645
|
+
"worksheets": [
|
|
1646
|
+
{"name": "A", "icon": "sys_1_2_order"}, # may coincide with app
|
|
1647
|
+
{"name": "B", "icon": "sys_18_5_warehouse"},
|
|
1648
|
+
],
|
|
1649
|
+
"custom_pages": [{"name": "P", "icon": "sys_form_symbol"}],
|
|
1650
|
+
}
|
|
1651
|
+
assert validate._check_icon_uniqueness(ok) == []
|
|
1652
|
+
|
|
1653
|
+
# Button / page-component icon reuse is EXEMPT: a worksheet icon repeated on
|
|
1654
|
+
# a page-component button is not a collision.
|
|
1655
|
+
exempt = {
|
|
1656
|
+
"worksheets": [{"name": "订单", "icon": "sys_form_symbol"}],
|
|
1657
|
+
"custom_pages": [{
|
|
1658
|
+
"name": "工作台", "icon": "sys_1_2_order",
|
|
1659
|
+
"components": [{"name": "C",
|
|
1660
|
+
"button": {"buttons": [{"icon": "sys_form_symbol"}]}}],
|
|
1661
|
+
}],
|
|
1662
|
+
}
|
|
1663
|
+
assert validate._check_icon_uniqueness(exempt) == []
|
|
1664
|
+
|
|
1665
|
+
|
|
1610
1666
|
def test_append_strips_client_control_ids() -> None:
|
|
1611
1667
|
"""Cross-sheet controls (forward relations, lookups, rollups, …) are
|
|
1612
1668
|
appended with AddWorksheetControls, which only mints a real 24-hex
|
|
@@ -6,9 +6,9 @@ One file validates that file. Multiple files are MERGED (the split-generation
|
|
|
6
6
|
workflow: foundation + independently-authored parts) and the combined document
|
|
7
7
|
is validated as a whole — so cross-part logical-name references are checked.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Three layers run here:
|
|
10
10
|
1. structural + reference validation — pure, offline (``schema.load_designs``).
|
|
11
|
-
2. icon
|
|
11
|
+
2. icon existence — every ``icon`` field (app / worksheet / page / page
|
|
12
12
|
component / button) must be an EXACT, real catalogue icon. We confirm
|
|
13
13
|
each via ``hap icon search <icon> --limit 1`` and require the top hit's
|
|
14
14
|
``fileName`` to equal the icon byte-for-byte. ``hap icon search`` is a
|
|
@@ -17,6 +17,11 @@ Two layers run here:
|
|
|
17
17
|
A fabricated icon (``sys_15_3_user``) or a non-canonical short form
|
|
18
18
|
(``1_2_order`` instead of ``sys_1_2_order``) is rejected — the backend
|
|
19
19
|
only accepts exact catalogue fileNames.
|
|
20
|
+
3. icon uniqueness — nav-level entities (top-level worksheets + custom_pages)
|
|
21
|
+
must each carry a DISTINCT icon (the 零冗余 / "不同实体用不同图标" rule).
|
|
22
|
+
They sit side by side in the app's left navigation, so a repeated icon is
|
|
23
|
+
visually confusing. Pure/offline. Button and page-component icons are
|
|
24
|
+
EXEMPT — reuse there (many "新建"/"+" tiles) is legitimate.
|
|
20
25
|
|
|
21
26
|
Exit code 0 = valid, 2 = validation errors (printed with their JSON paths).
|
|
22
27
|
Run this after authoring a design and before ``build`` so structural and icon
|
|
@@ -92,6 +97,44 @@ def _check_icons(doc: Any, runner: Callable[..., Any] = hap.run) -> list[str]:
|
|
|
92
97
|
return errors
|
|
93
98
|
|
|
94
99
|
|
|
100
|
+
def _collect_entity_icons(doc: Any) -> list[tuple[str, str, str]]:
|
|
101
|
+
"""Return ``(kind, name, icon)`` for each NAV-LEVEL entity that carries an
|
|
102
|
+
icon — top-level worksheets and custom_pages only. These appear together in
|
|
103
|
+
the app's left navigation, so each needs a visually distinct icon (the
|
|
104
|
+
零冗余 rule). Deliberately does NOT descend into page components or button
|
|
105
|
+
``buttons[]``: reusing an icon on action buttons is legitimate and common,
|
|
106
|
+
so those are exempt from the uniqueness check."""
|
|
107
|
+
out: list[tuple[str, str, str]] = []
|
|
108
|
+
if not isinstance(doc, dict):
|
|
109
|
+
return out
|
|
110
|
+
for kind, key in (("工作表", "worksheets"), ("自定义页面", "custom_pages")):
|
|
111
|
+
items = doc.get(key)
|
|
112
|
+
if not isinstance(items, list):
|
|
113
|
+
continue
|
|
114
|
+
for it in items:
|
|
115
|
+
if isinstance(it, dict) and isinstance(it.get("icon"), str):
|
|
116
|
+
out.append((kind, str(it.get("name", "?")), it["icon"]))
|
|
117
|
+
return out
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _check_icon_uniqueness(doc: Any) -> list[str]:
|
|
121
|
+
"""Return errors for icons reused across nav-level entities (worksheets +
|
|
122
|
+
custom_pages). Each must be unique among them — 不同实体用不同图标 (零冗余).
|
|
123
|
+
One error per colliding icon, naming every owner. Pure/offline; no catalogue
|
|
124
|
+
lookup. Iteration order is document order, so messages are deterministic."""
|
|
125
|
+
by_icon: dict[str, list[str]] = {}
|
|
126
|
+
for kind, name, icon in _collect_entity_icons(doc):
|
|
127
|
+
by_icon.setdefault(icon, []).append(f"{kind} {name!r}")
|
|
128
|
+
errors: list[str] = []
|
|
129
|
+
for icon, owners in by_icon.items():
|
|
130
|
+
if len(owners) > 1:
|
|
131
|
+
errors.append(
|
|
132
|
+
f"icon {icon!r} is reused by {', '.join(owners)} — give each "
|
|
133
|
+
f"worksheet/page a DISTINCT icon (零冗余: 不同实体用不同图标). "
|
|
134
|
+
f"Find alternatives with `hap icon search <keywords>`.")
|
|
135
|
+
return errors
|
|
136
|
+
|
|
137
|
+
|
|
95
138
|
def main(argv: list[str] | None = None) -> int:
|
|
96
139
|
argv = list(sys.argv[1:] if argv is None else argv)
|
|
97
140
|
if not argv:
|
|
@@ -112,6 +155,9 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
112
155
|
except HapCommandError as e:
|
|
113
156
|
print(f"✗ cannot verify icons: {e}", file=sys.stderr)
|
|
114
157
|
return 2
|
|
158
|
+
# Uniqueness is a pure check (no catalogue lookup) — fold it into the same
|
|
159
|
+
# error bucket so existence + dedup problems print together.
|
|
160
|
+
icon_errors += _check_icon_uniqueness(doc)
|
|
115
161
|
if icon_errors:
|
|
116
162
|
joined = "\n - ".join(icon_errors)
|
|
117
163
|
print(f"✗ design failed icon validation:\n - {joined}", file=sys.stderr)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Browser-based authentication flow for
|
|
1
|
+
"""Browser-based authentication flow for Mingdao HAP.
|
|
2
2
|
|
|
3
3
|
Implements a local callback server pattern:
|
|
4
4
|
1. Start local HTTP server on a free port
|
|
@@ -139,7 +139,7 @@ def fetch_global_meta(host: str, token: str) -> dict:
|
|
|
139
139
|
host: Login URL the user entered at ``hap auth login`` (e.g.
|
|
140
140
|
'https://www.mingdao.com' or a self-hosted host). The API
|
|
141
141
|
base is derived from this value. When empty, defaults to
|
|
142
|
-
the
|
|
142
|
+
the Mingdao SaaS host (``https://www.mingdao.com``).
|
|
143
143
|
token: Auth token.
|
|
144
144
|
|
|
145
145
|
Raises:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Worksheet chart (统计图) backend wrappers.
|
|
2
2
|
|
|
3
|
-
The
|
|
3
|
+
The Mingdao statistics module exposes chart CRUD under two URL families
|
|
4
4
|
on the report subdomain:
|
|
5
5
|
|
|
6
6
|
* ``/report/list`` GET — list charts of a worksheet
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Workflow instance and approval management for
|
|
1
|
+
"""Workflow instance and approval management for Mingdao HAP.
|
|
2
2
|
|
|
3
3
|
Covers: todo lists, instance details, approval operations (pass/reject/forward/sign),
|
|
4
4
|
execution history, batch operations, and instance lifecycle.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Session management and API client for
|
|
1
|
+
"""Session management and API client for Mingdao HAP.
|
|
2
2
|
|
|
3
3
|
URL routing by host type:
|
|
4
4
|
- mingdao SaaS — three sub-environments sharing the same main API but
|
|
@@ -62,14 +62,14 @@ CONFIG_DIR = (
|
|
|
62
62
|
) / ".hap-cli"
|
|
63
63
|
CONFIG_FILE = CONFIG_DIR / "config.json"
|
|
64
64
|
|
|
65
|
-
#
|
|
65
|
+
# Mingdao SaaS: login hostname -> API subdomain prefix for workflow/report
|
|
66
66
|
# production uses "api", pre-release uses "api2", sandbox uses "api3"
|
|
67
67
|
MINGDAO_API_SUBDOMAIN: dict[str, str] = {
|
|
68
68
|
"www.mingdao.com": "api",
|
|
69
69
|
"meihua.mingdao.com": "api2",
|
|
70
70
|
"sandbox.mingdao.com": "api3",
|
|
71
71
|
}
|
|
72
|
-
# All known
|
|
72
|
+
# All known Mingdao SaaS hostnames
|
|
73
73
|
MINGDAO_HOSTS = set(MINGDAO_API_SUBDOMAIN.keys())
|
|
74
74
|
# Known Nocoly SaaS hostnames
|
|
75
75
|
NOCOLY_HOSTS = {"www.nocoly.com"}
|
|
@@ -173,7 +173,7 @@ def _normalize_login_url(url: str) -> str:
|
|
|
173
173
|
|
|
174
174
|
|
|
175
175
|
class Session:
|
|
176
|
-
"""Manages authentication and API communication with
|
|
176
|
+
"""Manages authentication and API communication with Mingdao server."""
|
|
177
177
|
|
|
178
178
|
def __init__(self, server_url: str = "", auth_token: str = ""):
|
|
179
179
|
# Store as login_url internally; server_url is the backward-compat name
|
|
@@ -254,7 +254,7 @@ class Session:
|
|
|
254
254
|
return f"{self._login_url.rstrip('/')}{suffix}"
|
|
255
255
|
|
|
256
256
|
def _mingdao_api_subdomain(self) -> str:
|
|
257
|
-
"""Return the API subdomain prefix for the current
|
|
257
|
+
"""Return the API subdomain prefix for the current Mingdao environment.
|
|
258
258
|
|
|
259
259
|
www.mingdao.com -> 'api'
|
|
260
260
|
meihua.mingdao.com -> 'api2'
|
|
@@ -297,7 +297,7 @@ class Session:
|
|
|
297
297
|
2. Derived from the workflow API host: identical host, drop the
|
|
298
298
|
trailing ``/workflow`` segment.
|
|
299
299
|
|
|
300
|
-
The derivation matches
|
|
300
|
+
The derivation matches Mingdao's environment scheme:
|
|
301
301
|
prod / pre-release / sandbox →
|
|
302
302
|
https://api{n}.mingdao.com (no path suffix)
|
|
303
303
|
nocoly → https://www.nocoly.com/api
|
|
@@ -71,7 +71,7 @@ def clone_group(source, *, name=None, hidden=False):
|
|
|
71
71
|
)
|
|
72
72
|
@click.pass_context
|
|
73
73
|
def cli(ctx, json_mode, profile):
|
|
74
|
-
"""CLI harness for
|
|
74
|
+
"""CLI harness for Mingdao HAP (hap) - Enterprise no-code platform."""
|
|
75
75
|
setup_logging()
|
|
76
76
|
ctx.ensure_object(Context)
|
|
77
77
|
ctx.obj.json_mode = json_mode
|
|
@@ -2309,7 +2309,7 @@ class TestCLI:
|
|
|
2309
2309
|
runner = CliRunner()
|
|
2310
2310
|
result = runner.invoke(cli, ["--help"])
|
|
2311
2311
|
assert result.exit_code == 0
|
|
2312
|
-
assert "
|
|
2312
|
+
assert "Mingdao HAP" in result.output
|
|
2313
2313
|
assert "auth" in result.output
|
|
2314
2314
|
assert "config" in result.output
|
|
2315
2315
|
assert "app" in result.output
|
|
@@ -57,7 +57,7 @@ class TestCLISubprocess:
|
|
|
57
57
|
def test_help_returns_zero(self):
|
|
58
58
|
result = self._run(["--help"])
|
|
59
59
|
assert result.returncode == 0
|
|
60
|
-
assert "
|
|
60
|
+
assert "Mingdao HAP" in result.stdout
|
|
61
61
|
|
|
62
62
|
def test_version_flags(self):
|
|
63
63
|
from hap_cli import __version__
|
|
@@ -146,7 +146,7 @@ class TestSessionEndpointCache:
|
|
|
146
146
|
def test_fallback_when_cache_empty(self):
|
|
147
147
|
"""Old configs without service_endpoints still route correctly.
|
|
148
148
|
|
|
149
|
-
Each
|
|
149
|
+
Each Mingdao SaaS sub-environment has its own main_api host
|
|
150
150
|
(matches the login host), while workflow/report use a shared
|
|
151
151
|
api{n}.mingdao.com subdomain.
|
|
152
152
|
"""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hap-cli
|
|
3
|
-
Version: 0.8.
|
|
4
|
-
Summary: CLI harness for
|
|
3
|
+
Version: 0.8.11
|
|
4
|
+
Summary: CLI harness for Mingdao HAP - Enterprise no-code platform
|
|
5
5
|
Author: hap-cli
|
|
6
6
|
License: Apache-2.0
|
|
7
7
|
Classifier: Development Status :: 3 - Alpha
|
|
@@ -29,7 +29,7 @@ Dynamic: summary
|
|
|
29
29
|
|
|
30
30
|
# hap-cli
|
|
31
31
|
|
|
32
|
-
CLI harness for **
|
|
32
|
+
CLI harness for **Mingdao HAP** (明道云) — an enterprise no-code platform.
|
|
33
33
|
|
|
34
34
|
## Installation
|
|
35
35
|
|
|
@@ -54,7 +54,7 @@ each organization's status (`CLI:on/off`).
|
|
|
54
54
|
### 1. Login
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
|
-
#
|
|
57
|
+
# Mingdao SaaS (default)
|
|
58
58
|
hap auth login
|
|
59
59
|
|
|
60
60
|
# Specific environment
|
|
@@ -66,7 +66,7 @@ hap auth login https://hap.example.com # self-hosted
|
|
|
66
66
|
hap auth login https://your-server.com --token YOUR_TOKEN
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
-
The browser flow opens the
|
|
69
|
+
The browser flow opens the Mingdao login page and captures the token. If the
|
|
70
70
|
callback can't reach the CLI (no GUI, restricted network), interrupt the
|
|
71
71
|
command — it falls back to a paste prompt for the token shown on the success
|
|
72
72
|
page.
|
|
@@ -78,7 +78,7 @@ hap auth logout # log out the current account
|
|
|
78
78
|
|
|
79
79
|
#### Multiple environments / accounts
|
|
80
80
|
|
|
81
|
-
You can stay logged in to several environments (
|
|
81
|
+
You can stay logged in to several environments (Mingdao SaaS, Nocoly, self-hosted) and
|
|
82
82
|
several accounts at once. Each is saved under a name and you switch between them:
|
|
83
83
|
|
|
84
84
|
```bash
|
|
@@ -51,7 +51,7 @@ class _CopyV3Schemas(build_py):
|
|
|
51
51
|
setup(
|
|
52
52
|
name="hap-cli",
|
|
53
53
|
version=_read_version(),
|
|
54
|
-
description="CLI harness for
|
|
54
|
+
description="CLI harness for Mingdao HAP - Enterprise no-code platform",
|
|
55
55
|
long_description=open("hap_cli/README.md").read(),
|
|
56
56
|
long_description_content_type="text/markdown",
|
|
57
57
|
author="hap-cli",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|