flashforge-python-api 1.1.0__tar.gz → 1.2.1__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.
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/settings.local.json +2 -1
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.github/workflows/publish.yml +17 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/CHANGELOG.md +60 -8
- flashforge_python_api-1.2.1/PKG-INFO +133 -0
- flashforge_python_api-1.2.1/README.md +86 -0
- flashforge_python_api-1.2.1/docs/README.md +56 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/docs/advanced.md +8 -4
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/docs/api_reference.md +15 -4
- flashforge_python_api-1.2.1/docs/client.md +130 -0
- flashforge_python_api-1.2.1/docs/parity.md +49 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/docs/protocols.md +15 -9
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/__init__.py +9 -1
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/constants/endpoints.py +6 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/controls/control.py +11 -23
- flashforge_python_api-1.2.1/flashforge/api/controls/files.py +170 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/controls/info.py +13 -25
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/controls/job_control.py +36 -74
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/network/utils.py +17 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/client.py +57 -13
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/discovery/discovery.py +9 -5
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/models/machine_info.py +8 -3
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/__init__.py +5 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/a3_client.py +6 -3
- flashforge_python_api-1.2.1/flashforge/tcp/a4_client.py +300 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/pyproject.toml +1 -1
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_a3_client.py +44 -0
- flashforge_python_api-1.2.1/tests/test_a4_client.py +200 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_client.py +81 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_discovery.py +14 -1
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_info.py +24 -0
- flashforge_python_api-1.1.0/PKG-INFO +0 -305
- flashforge_python_api-1.1.0/README.md +0 -258
- flashforge_python_api-1.1.0/docs/README.md +0 -100
- flashforge_python_api-1.1.0/docs/client.md +0 -292
- flashforge_python_api-1.1.0/flashforge/api/controls/files.py +0 -189
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.agent/rules/general-rules.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/agents/mypy-specialist.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/agents/pydantic-specialist.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/agents/ruff-specialist.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/commands/push.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/SKILL.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/additional_features.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/builtin_types.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/changelog.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/cheat_sheet_py3.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/class_basics.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/command_line.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/common_issues.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/config_file.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/duck_type_compatibility.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/dynamic_typing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/error_code_list.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/error_code_list2.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/error_codes.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/existing_code.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/extending_mypy.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/faq.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/final_attrs.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/generics.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/getting_started.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/index.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/inline_config.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/installed_packages.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/kinds_of_types.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/literal_types.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/metaclasses.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/more_types.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/mypy_daemon.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/protocols.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/running_mypy.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/runtime_troubles.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/stubgen.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/stubs.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/stubtest.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/supported_python_features.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/type_inference_and_annotations.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/type_narrowing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/references/typed_dict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/scripts/clean_markdown.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/scripts/discover_pages.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/scripts/scrape_docs.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/mypy/scripts/utils.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/SKILL.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/aliases/AliasChoices.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/aliases/AliasGenerator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/aliases/AliasPath.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/base_model/BaseModel.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/base_model/create_model.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/config/ConfigDict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/config/with_config.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/dataclasses/dataclass.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/dataclasses/is_pydantic_dataclass.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/dataclasses/rebuild_dataclass.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/errors/PydanticErrorMixin.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/errors/PydanticForbiddenQualifier.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/errors/PydanticImportError.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/errors/PydanticInvalidForJsonSchema.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/errors/PydanticSchemaGenerationError.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/errors/PydanticUndefinedAnnotation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/errors/PydanticUserError.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/fields/ComputedFieldInfo.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/fields/Field.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/fields/FieldInfo.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/fields/ModelPrivateAttr.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/fields/PrivateAttr.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/fields/computed_field.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_serializers/PlainSerializer.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_serializers/SerializeAsAny.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_serializers/WrapSerializer.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_serializers/field_serializer.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_serializers/model_serializer.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/AfterValidator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/BeforeValidator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/FreeModelBeforeValidator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/FreeModelBeforeValidatorWithoutInfo.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/InstanceOf.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/ModelBeforeValidator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/ModelBeforeValidatorWithoutInfo.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/ModelWrapValidator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/ModelWrapValidatorHandler.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/ModelWrapValidatorWithoutInfo.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/PlainValidator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/SkipValidation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/ValidateAs.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/WrapValidator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/field_validator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/functional_validators/model_validator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/json_schema/Examples.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/json_schema/GenerateJsonSchema.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/json_schema/PydanticJsonSchemaWarning.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/json_schema/SkipJsonSchema.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/json_schema/WithJsonSchema.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/json_schema/model_json_schema.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/json_schema/models_json_schema.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/AmqpDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/AnyHttpUrl.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/AnyUrl.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/AnyWebsocketUrl.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/ClickHouseDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/CockroachDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/EmailStr.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/FileUrl.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/FtpUrl.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/HttpUrl.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/IPvAnyAddress.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/IPvAnyInterface.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/IPvAnyNetwork.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/KafkaDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/MariaDBDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/MongoDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/MySQLDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/NameEmail.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/NatsDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/PostgresDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/RedisDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/SnowflakeDsn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/UrlConstraints.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/WebsocketUrl.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/import_email_validator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/networks/validate_email.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/type_adapter/TypeAdapter.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/AllowInfNan.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/AwareDatetime.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/Base64Encoder.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/Base64UrlEncoder.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/ByteSize.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/Discriminator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/EncodedBytes.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/EncodedStr.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/EncoderProtocol.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/FailFast.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/FutureDate.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/FutureDatetime.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/GetPydanticSchema.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/ImportString.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/Json.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/NaiveDatetime.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/PastDate.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/PastDatetime.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/PathType.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/PaymentCardBrand.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/PaymentCardNumber.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/Secret.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/SecretBytes.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/SecretStr.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/Strict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/StringConstraints.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/Tag.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/UuidVersion.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/conbytes.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/condate.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/condecimal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/confloat.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/confrozenset.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/conint.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/conlist.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/conset.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/types/constr.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/validate_call/validate_call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/version/check_pydantic_core_version.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/version/parse_mypy_version.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/version/version_info.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/api/version/version_short.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/config.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/conversion_table.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/dataclasses.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/experimental.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/fields.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/forward_annotations.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/json.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/json_schema.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/models.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/performance.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/pydantic_settings.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/serialization.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/strict_mode.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/type_adapter.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/types.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/unions.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/validation_decorator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/concepts/validators.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/contributing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/errors/errors.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/errors/usage_errors.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/errors/validation_errors.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/examples/custom_validators.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/examples/dynamic_models.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/examples/files.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/examples/orms.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/examples/queues.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/examples/requests.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/help_with_pydantic.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/index.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/install.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/integrations/linting.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/migration.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/version-policy.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/pydantic-dev/references/why.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/readme-generator/SKILL.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/readme-generator/references/badge-patterns.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/readme-generator/references/section-templates.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/readme-generator/scripts/package.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/readme-generator/scripts/validate_readme.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/SKILL.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/INDEX.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/configuration.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/contributing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/editors/features.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/editors/migration.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/editors/overview.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/editors/settings.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/editors/setup.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/faq.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/formatter/black.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/formatter/overview.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/installation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/integrations.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/linter.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/preview.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/ruff.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/abstract-base-class-without-abstract-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/access-annotations-from-class-dict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/airflow-dag-no-schedule-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/airflow-variable-name-task-id-mismatch.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/airflow3-moved-to-provider.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/airflow3-removal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/airflow3-suggested-to-move-to-provider.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/airflow3-suggested-update.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ambiguous-class-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ambiguous-function-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ambiguous-unicode-character-comment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ambiguous-unicode-character-docstring.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ambiguous-unicode-character-string.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ambiguous-variable-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/and-or-ternary.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/any-eq-ne-annotation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/any-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/argument-default-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/assert-false.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/assert-on-string-literal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/assert-raises-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/assert-tuple.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/assert-with-print-message.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/assert.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/assignment-default-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/assignment-in-assert.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/assignment-to-os-environ.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/async-busy-wait.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/async-function-with-timeout.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/async-zero-sleep.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/asyncio-dangling-task.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/avoidable-escaped-quote.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/await-outside-async.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-dunder-method-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-exit-annotation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-file-permissions.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-open-mode.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-quotes-docstring.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-quotes-inline-string.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-quotes-multiline-string.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-staticmethod-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-str-strip-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-string-format-character.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-string-format-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-version-info-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bad-version-info-order.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/banned-api.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/banned-import-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/banned-import-from.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/banned-module-level-imports.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bare-except.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/batched-without-explicit-strict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bidirectional-unicode.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/binary-op-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/bit-count.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blank-line-after-decorator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blank-line-after-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blank-line-before-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blank-line-before-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blank-line-between-methods.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blank-line-with-whitespace.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blank-lines-after-function-or-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blank-lines-before-nested-definition.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blank-lines-between-header-and-content.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blank-lines-top-level.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blanket-noqa.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blanket-type-ignore.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blind-except.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blocking-http-call-httpx-in-async-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blocking-http-call-in-async-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blocking-input-in-async-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blocking-open-call-in-async-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blocking-path-method-in-async-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/blocking-sleep-in-async-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/boolean-chained-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/boolean-default-value-positional-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/boolean-positional-value-in-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/boolean-type-hint-positional-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/break-outside-loop.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/builtin-argument-shadowing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/builtin-attribute-shadowing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/builtin-import-shadowing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/builtin-lambda-argument-shadowing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/builtin-open.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/builtin-variable-shadowing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/byte-string-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/cached-instance-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/call-date-fromtimestamp.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/call-date-today.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/call-datetime-fromtimestamp.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/call-datetime-now-without-tzinfo.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/call-datetime-strptime-without-zone.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/call-datetime-today.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/call-datetime-utcfromtimestamp.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/call-datetime-utcnow.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/call-datetime-without-tzinfo.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/call-with-shell-equals-true.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/camelcase-imported-as-acronym.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/camelcase-imported-as-constant.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/camelcase-imported-as-lowercase.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/cancel-scope-no-checkpoint.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/check-and-remove-from-set.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/class-as-data-structure.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/class-with-mixed-type-vars.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/collapsible-else-if.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/collapsible-if.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/collection-literal-concatenation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/collections-named-tuple.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/commented-out-code.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/compare-to-empty-string.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/compare-with-tuple.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/comparison-of-constant.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/comparison-with-itself.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/complex-assignment-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/complex-if-statement-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/complex-structure.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/constant-imported-as-non-constant.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/continue-in-finally.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/continue-outside-loop.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/convert-named-tuple-functional-to-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/convert-typed-dict-functional-to-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/create-subprocess-in-async-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/custom-type-var-for-self.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/dataclass-enum.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/datetime-min-max.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/datetime-timezone-utc.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/debugger.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/decimal-from-float-literal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/default-except-not-last.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/default-factory-kwarg.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/delete-full-slice.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/deprecated-c-element-tree.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/deprecated-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/deprecated-log-warn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/deprecated-mock-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/deprecated-unittest-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/dict-get-with-none-default.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/dict-index-missing-items.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/dict-iter-missing-items.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/direct-logger-instantiation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/django-all-with-model-form.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/django-exclude-with-model-form.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/django-extra.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/django-locals-in-render-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/django-model-without-dunder-str.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/django-non-leading-receiver-decorator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/django-nullable-model-string-field.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/django-raw-sql.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/django-unordered-body-content-in-model.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/doc-line-too-long.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/docstring-extraneous-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/docstring-extraneous-parameter.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/docstring-extraneous-returns.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/docstring-extraneous-yields.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/docstring-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/docstring-missing-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/docstring-missing-returns.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/docstring-missing-yields.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/docstring-starts-with-this.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/docstring-tab-indentation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/dot-format-in-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/double-negation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/dunder-function-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/duplicate-bases.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/duplicate-class-field-definition.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/duplicate-handler-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/duplicate-isinstance-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/duplicate-literal-member.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/duplicate-try-block-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/duplicate-union-member.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/duplicate-value.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ellipsis-in-non-empty-class-body.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/empty-comment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/empty-docstring-section.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/empty-docstring.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/empty-method-without-abstract-decorator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/empty-type-checking-block.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/enumerate-for-loop.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/eq-without-hash.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/error-instead-of-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/error-suffix-on-exception-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/escape-sequence-in-docstring.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/eval.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/exc-info-outside-except-handler.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/except-with-empty-tuple.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/except-with-non-exception-classes.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/exception-without-exc-info.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/exec-builtin.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/explicit-f-string-type-conversion.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/explicit-string-concatenation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/expr-and-false.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/expr-and-not-expr.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/expr-or-not-expr.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/expr-or-true.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/expressions-in-star-assignment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/extraneous-parentheses.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/f-string-docstring.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/f-string-in-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/f-string-in-get-text-func-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/f-string-missing-placeholders.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/f-string-number-format.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/f-string.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/falsy-dict-get-fallback.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/fast-api-non-annotated-dependency.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/fast-api-redundant-response-model.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/fast-api-unused-path-parameter.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/first-word-uncapitalized.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/flask-debug-true.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/for-loop-set-mutations.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/for-loop-writes.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/format-in-get-text-func-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/format-literals.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/forward-annotation-syntax-error.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/fromisoformat-replace-z.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/function-call-in-dataclass-default-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/function-call-in-default-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/function-uses-loop-variable.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/future-annotations-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/future-feature-not-defined.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/future-required-type-annotation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/future-rewritable-type-annotation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/generator-return-from-iter-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/generic-not-last-base-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/get-attr-with-constant.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/glob.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/global-at-module-level.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/global-statement.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/global-variable-not-assigned.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/hardcoded-bind-all-interfaces.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/hardcoded-password-default.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/hardcoded-password-func-arg.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/hardcoded-password-string.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/hardcoded-sql-expression.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/hardcoded-string-charset.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/hardcoded-temp-file.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/hashlib-digest-hex.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/hashlib-insecure-hash-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-else-block-instead-of-dict-get.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-else-block-instead-of-dict-lookup.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-else-block-instead-of-if-exp.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-exp-instead-of-or-operator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-expr-min-max.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-expr-with-false-true.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-expr-with-true-false.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-expr-with-twisted-arms.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-key-in-dict-del.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-stmt-min-max.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-tuple.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/if-with-same-arms.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/implicit-class-var-in-dataclass.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/implicit-cwd.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/implicit-namespace-package.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/implicit-optional.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/implicit-return-value.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/implicit-return.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/implicit-string-concatenation-in-collection-literal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/import-outside-top-level.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/import-private-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/import-self.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/import-shadowed-by-loop-var.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/in-dict-keys.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/in-empty-collection.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/incorrect-blank-line-after-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/incorrect-blank-line-before-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/incorrect-dict-iterator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/incorrectly-parenthesized-tuple-in-subscript.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/indentation-with-invalid-multiple-comment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/indentation-with-invalid-multiple.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/indented-form-feed.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/int-on-sliced-str.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-all-format.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-all-object.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-argument-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-assert-message-literal-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-bool-return-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-bytes-return-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-character-backspace.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-character-esc.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-character-nul.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-character-sub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-character-zero-width-space.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-class-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-envvar-default.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-envvar-value.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-escape-sequence.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-first-argument-name-for-class-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-first-argument-name-for-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-formatter-suppression-comment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-function-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-get-logger-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-hash-return-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-index-return-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-index-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-length-return-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-mock-access.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-module-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-pathlib-with-suffix.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-print-syntax.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-pyproject-toml.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-rule-code.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-str-return-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-todo-capitalization.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/invalid-todo-tag.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/io-error.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/is-literal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/isinstance-type-none.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/iter-method-return-iterable.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/iteration-over-set.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/jinja2-autoescape-false.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/jump-statement-in-finally.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/lambda-assignment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/late-future-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/legacy-form-pytest-raises.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/len-test.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/line-contains-fixme.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/line-contains-hack.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/line-contains-todo.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/line-contains-xxx.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/line-too-long.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/list-reverse-copy.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/literal-membership.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/load-before-global-declaration.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/log-exception-outside-except-handler.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-config-insecure-listen.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-eager-conversion.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-exc-info.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-extra-attr-clash.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-f-string.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-percent-format.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-redundant-exc-info.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-string-concat.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-string-format.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-too-few-args.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-too-many-args.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/logging-warn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/long-sleep-not-forever.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/loop-iterator-mutation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/loop-variable-overrides-iterator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/lowercase-imported-as-non-lowercase.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/lru-cache-with-maxsize-none.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/lru-cache-without-parameters.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/magic-value-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/mako-templates.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/manual-dict-comprehension.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/manual-from-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/manual-list-comprehension.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/manual-list-copy.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/map-int-version-parsing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/map-without-explicit-strict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/math-constant.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/meta-class-abc-meta.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/mismatched-section-underline-length.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/misplaced-bare-raise.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-blank-line-after-last-section.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-blank-line-after-summary.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-copyright-notice.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-dashed-underline-after-section.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-f-string-syntax.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-maxsplit-arg.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-new-line-after-section-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-newline-at-end-of-file.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-required-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-return-type-class-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-return-type-private-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-return-type-special-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-return-type-static-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-return-type-undocumented-public-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-section-name-colon.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-section-underline-after-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-space-after-todo-colon.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-terminal-punctuation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-todo-author.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-todo-colon.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-todo-description.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-todo-link.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-trailing-comma.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-trailing-period.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-type-args.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-type-cls.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-type-function-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-type-kwargs.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-type-self.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-whitespace-after-keyword.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-whitespace-around-arithmetic-operator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-whitespace-around-bitwise-or-shift-operator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-whitespace-around-modulo-operator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-whitespace-around-operator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-whitespace-around-parameter-equals.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/missing-whitespace.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/mixed-case-variable-in-class-scope.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/mixed-case-variable-in-global-scope.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/mixed-spaces-and-tabs.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/modified-iterating-set.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/module-import-not-at-top-of-file.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multi-line-implicit-string-concatenation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multi-line-summary-first-line.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multi-line-summary-second-line.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multi-value-repeated-key-literal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multi-value-repeated-key-variable.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-imports-on-one-line.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-leading-hashes-for-block-comment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-spaces-after-comma.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-spaces-after-keyword.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-spaces-after-operator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-spaces-before-keyword.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-spaces-before-operator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-starred-expressions.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-starts-ends-with.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-statements-on-one-line-colon.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-statements-on-one-line-semicolon.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/multiple-with-statements.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/mutable-argument-default.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/mutable-class-default.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/mutable-contextvar-default.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/mutable-dataclass-default.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/mutable-fromkeys-value.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/named-expr-without-context.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/nan-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/native-literals.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/needless-bool.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/needless-else.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/negate-equal-op.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/negate-not-equal-op.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/nested-min-max.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/never-union.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/new-line-after-last-paragraph.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-blank-line-after-section.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-blank-line-before-section.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-classmethod-decorator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-explicit-stacklevel.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-indented-block-comment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-indented-block.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-return-argument-annotation-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-self-use.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-slots-in-namedtuple-subclass.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-slots-in-str-subclass.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-slots-in-tuple-subclass.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-space-after-block-comment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-space-after-inline-comment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/no-staticmethod-decorator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-ascii-import-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-ascii-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-augmented-assignment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-capitalized-section-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-empty-stub-body.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-imperative-mood.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-lowercase-variable-in-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-octal-permissions.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-pep585-annotation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-pep604-annotation-optional.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-pep604-annotation-union.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-pep604-isinstance.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-pep646-unpack.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-pep695-generic-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-pep695-generic-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-pep695-type-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-self-return-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-slot-assignment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/non-unique-enums.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/none-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/none-not-at-end-of-union.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/nonlocal-and-global.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/nonlocal-without-binding.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/not-in-test.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/not-is-test.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/numeric-literal-too-long.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/numpy-deprecated-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/numpy-deprecated-type-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/numpy-legacy-random.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/numpy2-deprecation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/open-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/open-file-with-context-handler.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-chmod.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-error-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-getcwd.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-listdir.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-makedirs.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-mkdir.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-abspath.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-basename.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-dirname.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-exists.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-expanduser.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-getatime.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-getctime.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-getmtime.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-getsize.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-isabs.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-isdir.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-isfile.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-islink.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-join.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-samefile.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-path-splitext.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-readlink.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-remove.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-rename.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-replace.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-rmdir.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-sep-split.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-stat.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-symlink.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/os-unlink.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/outdated-version-block.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/over-indentation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/over-indented.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/overindented-section-underline.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/overindented-section.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/overload-with-docstring.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/p-print.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-df-variable-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-nunique-constant-series-check.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-dot-at.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-dot-iat.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-dot-is-null.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-dot-ix.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-dot-not-null.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-dot-pivot-or-unstack.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-dot-read-table.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-dot-stack.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-dot-values.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-inplace-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pandas-use-of-pd-merge.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/paramiko-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/parenthesize-chained-operators.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pass-in-class-body.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pass-statement-stub-body.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/patch-version-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/path-constructor-current-directory.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pep484-style-positional-only-parameter.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/percent-format-expected-mapping.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/percent-format-expected-sequence.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/percent-format-extra-named-arguments.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/percent-format-invalid-format.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/percent-format-missing-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/percent-format-mixed-positional-and-named.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/percent-format-positional-count-mismatch.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/percent-format-star-requires-sequence.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/percent-format-unsupported-format-character.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/post-init-default.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/potential-index-error.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/print-empty-string.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/print.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/printf-in-get-text-func-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/printf-string-formatting.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/private-member-access.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/private-type-parameter.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/prohibited-trailing-comma.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/property-with-parameters.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/property-without-return.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/py-path.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-assert-always-false.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-assert-in-except.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-composite-assertion.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-deprecated-yield-fixture.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-duplicate-parametrize-test-cases.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-erroneous-use-fixtures-on-fixture.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-extraneous-scope-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-fail-without-message.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-fixture-finalizer-callback.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-fixture-incorrect-parentheses-style.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-fixture-param-without-value.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-fixture-positional-args.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-incorrect-fixture-name-underscore.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-incorrect-mark-parentheses-style.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-incorrect-pytest-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-missing-fixture-name-underscore.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-parameter-with-default-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-parametrize-names-wrong-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-parametrize-values-wrong-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-patch-with-lambda.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-raises-ambiguous-pattern.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-raises-too-broad.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-raises-with-multiple-statements.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-raises-without-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-unittest-assertion.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-unittest-raises-assertion.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-unnecessary-asyncio-mark-on-fixture.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-use-fixtures-without-parameters.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-useless-yield-fixture.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-warns-too-broad.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-warns-with-multiple-statements.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/pytest-warns-without-warning.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/quadratic-list-summation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/quoted-annotation-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/quoted-annotation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/quoted-type-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/raise-literal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/raise-not-implemented.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/raise-vanilla-args.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/raise-vanilla-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/raise-within-try.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/raise-without-from-inside-except.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/raw-string-in-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/re-sub-positional-args.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/read-whole-file.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/readlines-in-for.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redeclared-assigned-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redefined-argument-from-local.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redefined-loop-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redefined-slots-in-subclass.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redefined-while-unused.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redirected-noqa.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redundant-backslash.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redundant-bool-literal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redundant-final-literal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redundant-literal-union.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redundant-log-base.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redundant-none-literal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redundant-numeric-union.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redundant-open-modes.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/redundant-tuple-in-exception-handler.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/regex-flag-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/reimplemented-builtin.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/reimplemented-container-builtin.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/reimplemented-operator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/reimplemented-starmap.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/relative-imports.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/repeated-append.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/repeated-equality-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/repeated-global.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/repeated-isinstance-calls.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/repeated-keyword-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/replace-stdout-stderr.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/replace-str-enum.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/replace-universal-newlines.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/request-with-no-cert-validation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/request-without-timeout.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/reraise-no-cause.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/return-in-generator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/return-in-init.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/return-in-try-except-finally.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/return-outside-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/reuse-of-groupby-generator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/root-logger-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ruff-static-key-dict-comprehension.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ruff-unsafe-markup-use.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/rules.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/run-process-in-async-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/runtime-cast-value.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/runtime-import-in-type-checking-block.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/runtime-string-union.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/self-assigning-variable.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/self-or-cls-assignment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/set-attr-with-constant.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/shallow-copy-environ.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/shebang-leading-whitespace.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/shebang-missing-executable-file.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/shebang-missing-python.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/shebang-not-executable.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/shebang-not-first-line.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/signature-in-docstring.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/single-item-membership-test.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/single-line-implicit-string-concatenation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/single-string-slots.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/singledispatch-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/singledispatchmethod-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/six-py3.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/slice-copy.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/slice-to-remove-prefix-or-suffix.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/snake-case-type-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/snmp-insecure-version.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/snmp-weak-cryptography.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sorted-min-max.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/split-static-string.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ssh-no-host-key-verification.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ssl-insecure-version.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ssl-with-bad-defaults.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/ssl-with-no-version.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/star-arg-unpacking-after-keyword-arg.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/starmap-zip.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/start-process-with-a-shell.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/start-process-with-no-shell.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/start-process-with-partial-path.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/static-join-to-f-string.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/static-key-dict-comprehension.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/stdlib-module-shadowing.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/stop-iteration-return.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/str-or-repr-defined-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/string-dot-format-extra-named-arguments.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/string-dot-format-extra-positional-arguments.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/string-dot-format-invalid-format.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/string-dot-format-missing-arguments.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/string-dot-format-mixing-automatic.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/string-or-bytes-too-long.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/strip-with-multi-characters.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/stub-body-multiple-statements.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/subclass-builtin.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/subprocess-popen-preexec-fn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/subprocess-popen-with-shell-equals-true.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/subprocess-run-without-check.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/subprocess-without-shell-equals-true.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/super-call-with-parameters.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/super-without-brackets.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/superfluous-else-break.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/superfluous-else-continue.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/superfluous-else-raise.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/superfluous-else-return.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suppressible-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/surrounding-whitespace.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-eval-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-ftp-lib-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-ftplib-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-httpoxy-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-insecure-cipher-mode-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-insecure-cipher-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-insecure-hash-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-lxml-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-mark-safe-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-marshal-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-mktemp-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-non-cryptographic-random-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-pickle-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-pickle-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-pycrypto-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-pyghmi-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-subprocess-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-telnet-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-telnetlib-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-unverified-context-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-url-open-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-element-tree-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-etree-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-expat-builder-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-expat-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-expat-reader-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-mini-dom-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-minidom-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-pull-dom-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-pulldom-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-sax-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xml-sax-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xmlc-element-tree-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xmle-tree-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/suspicious-xmlrpc-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/syntax-error.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sys-exit-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sys-version-cmp-str10.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sys-version-cmp-str3.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sys-version-info-minor-cmp-int.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sys-version-info0-eq3.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sys-version-info1-cmp-int.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sys-version-slice1.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sys-version-slice3.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sys-version0.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/sys-version2.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/t-suffixed-type-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/tab-after-comma.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/tab-after-keyword.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/tab-after-operator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/tab-before-keyword.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/tab-before-operator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/tab-indentation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/tarfile-unsafe-members.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/timeout-error-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-few-spaces-before-inline-comment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-arguments.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-blank-lines.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-boolean-expressions.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-branches.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-locals.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-nested-blocks.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-newlines-at-end-of-file.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-positional-arguments.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-public-methods.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-return-statements.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/too-many-statements.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/trailing-comma-on-bare-tuple.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/trailing-whitespace.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/trio-sync-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/triple-single-quotes.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/true-false-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/try-consider-else.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/try-except-continue.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/try-except-in-loop.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/try-except-pass.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/type-alias-without-annotation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/type-bivariance.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/type-check-without-type-error.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/type-comment-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/type-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/type-name-incorrect-variance.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/type-none-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/type-of-primitive.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/type-param-name-mismatch.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/typed-argument-default-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/typing-only-first-party-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/typing-only-standard-library-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/typing-only-third-party-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/typing-text-str-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unaliased-collections-abc-set-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unannotated-assignment-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unary-prefix-increment-decrement.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unassigned-special-variable-in-stub.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/uncapitalized-environment-variables.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unconventional-import-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undefined-export.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undefined-local-with-import-star-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undefined-local-with-import-star.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undefined-local-with-nested-import-star-usage.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undefined-local.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undefined-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/under-indentation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undocumented-magic-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undocumented-param.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undocumented-public-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undocumented-public-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undocumented-public-init.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undocumented-public-method.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undocumented-public-module.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undocumented-public-nested-class.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undocumented-public-package.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/undocumented-warn.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unexpected-indentation-comment.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unexpected-indentation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unexpected-spaces-around-keyword-parameter-equals.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unexpected-special-method-signature.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unicode-kind-prefix.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unintentional-type-annotation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unix-command-wildcard-injection.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-assign.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-builtin-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-call-around-sorted.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-cast-to-int.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-class-parentheses.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-collection-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-comprehension-in-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-comprehension.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-default-type-args.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-dict-comprehension-for-iterable.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-dict-index-lookup.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-dict-kwargs.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-direct-lambda-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-double-cast-or-process.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-dunder-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-empty-iterable-within-deque-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-encode-utf8.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-enumerate.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-escaped-quote.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-from-float.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-future-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-generator-dict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-generator-list.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-generator-set.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-iterable-allocation-for-first-element.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-key-check.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-lambda.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-list-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-list-cast.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-list-comprehension-dict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-list-comprehension-set.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-list-index-lookup.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-literal-dict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-literal-set.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-literal-union.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-literal-within-dict-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-literal-within-list-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-literal-within-tuple-call.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-map.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-multiline-docstring.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-nested-literal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-paren-on-raise-exception.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-placeholder.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-range-start.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-regular-expression.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-return-none.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-round.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-spread.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-subscript-reversal.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unnecessary-type-union.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unpacked-list-comprehension.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unprefixed-type-param.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unquoted-type-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unraw-re-pattern.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unrecognized-platform-check.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unrecognized-platform-name.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unrecognized-version-info-check.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unreliable-callable-check.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unsafe-markup-use.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unsafe-yaml-load.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unsorted-dunder-all.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unsorted-dunder-slots.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unsorted-imports.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unspecified-encoding.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unsupported-method-call-on-all.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-annotation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-async.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-class-method-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-function-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-import.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-lambda-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-loop-control-variable.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-method-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-noqa.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-private-protocol.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-private-type-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-private-type-var.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-private-typed-dict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-static-method-argument.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-unpacked-variable.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/unused-variable.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/used-dummy-variable.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-class-metaclass-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-contextlib-suppress.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-else-on-loop.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-exception-statement.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-expression.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-if-else.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-import-alias.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-metaclass-type.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-object-inheritance.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-return.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-semicolon.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-try-except.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/useless-with-lock.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/utf8-encoding-declaration.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/verbose-decimal-constructor.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/verbose-log-message.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/verbose-raise.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/wait-for-process-in-async-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/weak-cryptographic-key.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/whitespace-after-decorator.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/whitespace-after-open-bracket.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/whitespace-before-close-bracket.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/whitespace-before-parameters.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/whitespace-before-punctuation.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/write-whole-file.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/wrong-tuple-length-version-comparison.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/yield-from-in-async-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/yield-in-for-loop.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/yield-in-init.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/yield-outside-function.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/yoda-conditions.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/zip-dict-keys-and-values.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/zip-instead-of-pairwise.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/rules/zip-without-explicit-strict.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/settings.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/tutorial.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/references/versioning.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/scripts/bulk_scrape_ruff.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/scripts/discover_ruff_docs.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/ruff-dev/scripts/scrape_ruff_docs.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/sub-agent-creator/SKILL.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/sub-agent-creator/references/agent-creation-prompt.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/sub-agent-creator/references/sub-agents-docs.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.claude/skills/sub-agent-creator/scripts/validate_agent.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.github/workflows/test.yml +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/.gitignore +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/CLAUDE.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/LICENSE +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/ai_specs/TEST_COVERAGE_SPEC.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/docs/models.md +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/examples/advanced_tcp.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/examples/basic_connection.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/examples/discovery.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/examples/file_operations.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/examples/job_control.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/examples/led_control.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/examples/status_monitoring.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/examples/temperature_control.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/constants/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/constants/commands.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/controls/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/controls/temp_control.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/filament/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/filament/filament.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/misc/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/misc/scientific_notation.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/misc/temperature.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/network/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/api/network/fnet_code.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/discovery/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/models/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/models/responses.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/ff_client.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/gcode/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/gcode/a3_gcode_controller.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/gcode/gcode_controller.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/gcode/gcodes.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/parsers/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/parsers/endstop_status.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/parsers/location_info.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/parsers/print_status.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/parsers/printer_info.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/parsers/temp_info.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/parsers/thumbnail_info.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/flashforge/tcp/tcp_client.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/__init__.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/conftest.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/fixtures/printer_responses.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/printer_config.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/run_tests.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_5m_pro_live_integration.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_ad5x_job_control.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_ad5x_live_integration.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_ad5x_models.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_additional_parsers.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_control.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_files.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_job_control.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_machine_info_parity.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_network_utils.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_parsers.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_tcp_client.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_temp_control.py +0 -0
- {flashforge_python_api-1.1.0 → flashforge_python_api-1.2.1}/tests/test_utility_classes.py +0 -0
|
@@ -78,11 +78,28 @@ jobs:
|
|
|
78
78
|
ls -lh dist/
|
|
79
79
|
twine check dist/*
|
|
80
80
|
|
|
81
|
+
- name: Extract changelog for this version
|
|
82
|
+
id: changelog
|
|
83
|
+
run: |
|
|
84
|
+
VERSION="${{ steps.validate.outputs.version }}"
|
|
85
|
+
# Extract the section for this version from CHANGELOG.md
|
|
86
|
+
# Matches from "## [X.Y.Z]" until the next "## [" or end of file
|
|
87
|
+
CHANGELOG=$(awk "/^## \[$VERSION\]/{found=1; next} /^## \[/{if(found) exit} found{print}" CHANGELOG.md)
|
|
88
|
+
|
|
89
|
+
if [ -z "$CHANGELOG" ]; then
|
|
90
|
+
echo "Warning: No changelog entry found for version $VERSION"
|
|
91
|
+
CHANGELOG="No changelog entry found. See [CHANGELOG.md](https://github.com/GhostTypes/ff-5mp-api-py/blob/main/CHANGELOG.md) for details."
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# Write to file to preserve multiline content
|
|
95
|
+
echo "$CHANGELOG" > /tmp/changelog_body.md
|
|
96
|
+
|
|
81
97
|
- name: Create GitHub Release
|
|
82
98
|
uses: softprops/action-gh-release@v2
|
|
83
99
|
with:
|
|
84
100
|
tag_name: v${{ steps.validate.outputs.version }}
|
|
85
101
|
name: Release ${{ steps.validate.outputs.version }}
|
|
102
|
+
body_path: /tmp/changelog_body.md
|
|
86
103
|
files: dist/*
|
|
87
104
|
generate_release_notes: true
|
|
88
105
|
draft: false
|
|
@@ -5,18 +5,58 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [1.2.1] - 2026-03-23
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Increased `currentPrintSpeed` and `printSpeedAdjust` validation limit from 200 to 1000 to support AD5X printers reporting speeds up to 500 (contributed by @spawnegit)
|
|
15
|
+
- Replaced per-request `aiohttp.ClientSession()` creation with shared HTTP session across all control modules (`control.py`, `files.py`, `info.py`, `job_control.py`), fixing connection churn and respecting the configured timeout
|
|
16
|
+
- Increased default HTTP timeout from 5s to 15s to prevent timeouts during print operations
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Extracted duplicate `try/except aiohttp.ContentTypeError` JSON parsing pattern into a shared `json_from_response()` helper in `api/network/utils.py`
|
|
21
|
+
- Release workflow now includes curated changelog entry alongside auto-generated commit notes in GitHub Releases
|
|
22
|
+
|
|
23
|
+
## [1.2.0] - 2026-03-21
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- `CAMERA_STREAM_PORT` - exported constant for the known FlashForge OEM MJPEG stream port
|
|
28
|
+
- `FlashForgeClient.detect_camera_stream()` - probes `http://<printer-ip>:8080/?action=stream` and falls back from `HEAD` to `GET` when firmware does not report `camera_stream_url`
|
|
29
|
+
- Pytest coverage for camera stream probing success, `HEAD` timeout fallback, and no-camera behavior
|
|
30
|
+
- `FlashForgeA4Client` - dedicated Adventurer 4 Lite / Pro TCP client aligned with the documented M601 and M115 protocol behavior
|
|
31
|
+
- `A4BuildVolume`, `A4FileEntry`, and `A4PrinterInfo` for typed Adventurer 4 responses
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- Discovery PID fallback now recognizes Adventurer 4 Lite (`0x0016`) as well as Adventurer 4 Pro (`0x001E`)
|
|
36
|
+
- README guidance now points Adventurer 3 / 4 users at the dedicated TCP clients instead of only the generic legacy layer
|
|
37
|
+
|
|
38
|
+
## [1.1.1] - 2026-03-09
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Fixed AD5X `/detail` response parsing for newer firmware fields including `camera`, `clearFanStatus`, `coordinate`, `extrudeCtrl`, and `moveCtrl`
|
|
43
|
+
- Made raw printer detail parsing tolerant of additional future firmware fields instead of failing validation
|
|
44
|
+
- Added regression coverage for extended AD5X detail payloads
|
|
45
|
+
|
|
8
46
|
## [1.1.0] - 2026-03-08
|
|
9
47
|
|
|
10
48
|
### Added
|
|
11
|
-
|
|
12
|
-
- `
|
|
13
|
-
- `
|
|
49
|
+
|
|
50
|
+
- `FlashForgeA3Client` — full Adventurer 3 TCP client with dedicated G-code protocol support
|
|
51
|
+
- `A3GCodeController` — A3-specific G-code command controller
|
|
52
|
+
- `FlashForgeClient.camera_stream_url` — caches the OEM camera stream URL reported by the printer in machine-info responses
|
|
14
53
|
- `thumbnail_info` parser for handling printer thumbnail responses
|
|
15
54
|
- New G-code commands in `gcodes.py` for broader printer compatibility
|
|
16
55
|
- Test coverage for A3 client, camera stream URL caching, and machine-info model parity
|
|
17
56
|
- mypy exclude configuration for tests and examples
|
|
18
57
|
|
|
19
58
|
### Changed
|
|
59
|
+
|
|
20
60
|
- Major refactor of `discovery.py` for improved reliability and cross-printer compatibility
|
|
21
61
|
- `tcp_client.py` substantially reworked for better connection handling and parser coverage
|
|
22
62
|
- Parsers (`endstop_status`, `location_info`, `print_status`, `printer_info`, `temp_info`) updated for improved type safety and correctness
|
|
@@ -28,18 +68,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
28
68
|
- TCP module exports updated to expose A3 client and controller
|
|
29
69
|
|
|
30
70
|
### Fixed
|
|
71
|
+
|
|
31
72
|
- Discovery reliability improvements from `discovery.py` refactor
|
|
32
73
|
- TCP client parser edge cases addressed across all response types
|
|
33
74
|
|
|
34
75
|
## [1.0.2] - 2025-12-26
|
|
35
76
|
|
|
36
77
|
### Added
|
|
78
|
+
|
|
37
79
|
- Added LAN-only mode requirement notice in README Quick Start section with link to official FlashForge documentation
|
|
38
80
|
- Added dependency badges for aiohttp, pydantic, netifaces, requests, and pillow to README header
|
|
39
81
|
- Added readme-generator skill for maintaining consistent documentation formatting
|
|
40
82
|
- Added comprehensive developer documentation sections to CLAUDE.md
|
|
41
83
|
|
|
42
84
|
### Changed
|
|
85
|
+
|
|
43
86
|
- Completely rewrote main README.md with modern centered table-based formatting
|
|
44
87
|
- Modernized docs/README.md as comprehensive documentation hub entry point
|
|
45
88
|
- Expanded CLAUDE.md from basic PyPI notes to comprehensive developer guide with architecture documentation
|
|
@@ -49,10 +92,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
49
92
|
- Made version input required (X.Y.Z format) for releases
|
|
50
93
|
|
|
51
94
|
### Fixed
|
|
95
|
+
|
|
52
96
|
- Fixed release workflow changelog duplication issue caused by orphaned timestamped commits
|
|
53
97
|
- Fixed `format_time_from_seconds` function to properly handle float values for `estimated_time`
|
|
54
98
|
|
|
55
99
|
### Removed
|
|
100
|
+
|
|
56
101
|
- Removed redundant Architecture and Requirements sections from README
|
|
57
102
|
- Removed complex timestamp versioning logic from release workflow
|
|
58
103
|
- Deleted orphaned timestamped tag `v1.0.0-20251122005123`
|
|
@@ -60,11 +105,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
60
105
|
## [1.0.1] - 2025-12-24
|
|
61
106
|
|
|
62
107
|
### Fixed
|
|
108
|
+
|
|
63
109
|
- Fixed Pydantic validation error for `estimated_time` field in `FFPrinterDetail` and `FFMachineInfo` models. Changed type from `int` to `float` to handle printer API responses that return fractional time values.
|
|
64
110
|
|
|
65
111
|
## [1.0.0] - 2025-01-02
|
|
66
112
|
|
|
67
113
|
### Added
|
|
114
|
+
|
|
68
115
|
- Initial release of FlashForge Python API
|
|
69
116
|
- HTTP API client for modern FlashForge printers
|
|
70
117
|
- TCP/G-code client for legacy communication
|
|
@@ -72,22 +119,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
72
119
|
- Comprehensive async/await support throughout
|
|
73
120
|
- Full type safety with Pydantic models
|
|
74
121
|
- Control modules:
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
122
|
+
- `Control` - Movement, LED, filtration, camera control
|
|
123
|
+
- `JobControl` - Print job management (start/pause/resume/cancel)
|
|
124
|
+
- `Info` - Status and machine information retrieval
|
|
125
|
+
- `Files` - File upload/download/management
|
|
126
|
+
- `TempControl` - Temperature settings
|
|
80
127
|
- Support for FlashForge Adventurer 5M Series and Adventurer 4
|
|
81
128
|
- Model-specific feature detection (LED, filtration, camera)
|
|
82
129
|
- Comprehensive error handling and logging
|
|
83
130
|
- Example scripts and documentation
|
|
84
131
|
|
|
85
132
|
### Documentation
|
|
133
|
+
|
|
86
134
|
- Complete README with usage examples
|
|
87
135
|
- API reference documentation
|
|
88
136
|
- Type hints for all public APIs
|
|
89
137
|
- Inline code documentation
|
|
90
138
|
|
|
139
|
+
[Unreleased]: https://github.com/GhostTypes/ff-5mp-api-py/compare/v1.2.1...HEAD
|
|
140
|
+
[1.2.1]: https://github.com/GhostTypes/ff-5mp-api-py/compare/v1.2.0...v1.2.1
|
|
141
|
+
[1.2.0]: https://github.com/GhostTypes/ff-5mp-api-py/compare/v1.1.1...v1.2.0
|
|
142
|
+
[1.1.1]: https://github.com/GhostTypes/ff-5mp-api-py/releases/tag/v1.1.1
|
|
91
143
|
[1.0.2]: https://github.com/GhostTypes/ff-5mp-api-py/releases/tag/v1.0.2
|
|
92
144
|
[1.0.1]: https://github.com/GhostTypes/ff-5mp-api-py/releases/tag/v1.0.1
|
|
93
145
|
[1.0.0]: https://github.com/GhostTypes/ff-5mp-api-py/releases/tag/v1.0.0
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: flashforge-python-api
|
|
3
|
+
Version: 1.2.1
|
|
4
|
+
Summary: A comprehensive Python library for controlling FlashForge 3D printers
|
|
5
|
+
Project-URL: Homepage, https://github.com/GhostTypes/ff-5mp-api-py
|
|
6
|
+
Project-URL: Documentation, https://github.com/GhostTypes/ff-5mp-api-py#readme
|
|
7
|
+
Project-URL: Repository, https://github.com/GhostTypes/ff-5mp-api-py.git
|
|
8
|
+
Project-URL: Issues, https://github.com/GhostTypes/ff-5mp-api-py/issues
|
|
9
|
+
Author-email: GhostTypes <notghosttypes@gmail.com>
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: 3d-printer,api,async,control,flashforge,python
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering
|
|
20
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
21
|
+
Classifier: Topic :: System :: Hardware :: Hardware Drivers
|
|
22
|
+
Requires-Python: >=3.11
|
|
23
|
+
Requires-Dist: aiohttp>=3.8.0
|
|
24
|
+
Requires-Dist: netifaces>=0.11.0
|
|
25
|
+
Requires-Dist: pydantic>=2.0.0
|
|
26
|
+
Requires-Dist: requests>=2.31.0
|
|
27
|
+
Provides-Extra: all
|
|
28
|
+
Requires-Dist: black>=23.0.0; extra == 'all'
|
|
29
|
+
Requires-Dist: mypy>=1.0.0; extra == 'all'
|
|
30
|
+
Requires-Dist: pillow>=10.0.0; extra == 'all'
|
|
31
|
+
Requires-Dist: pre-commit>=3.0.0; extra == 'all'
|
|
32
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'all'
|
|
33
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'all'
|
|
34
|
+
Requires-Dist: pytest>=7.0.0; extra == 'all'
|
|
35
|
+
Requires-Dist: ruff>=0.1.0; extra == 'all'
|
|
36
|
+
Provides-Extra: dev
|
|
37
|
+
Requires-Dist: black>=23.0.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: mypy>=1.0.0; extra == 'dev'
|
|
39
|
+
Requires-Dist: pre-commit>=3.0.0; extra == 'dev'
|
|
40
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
|
|
41
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
|
|
42
|
+
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
43
|
+
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
44
|
+
Provides-Extra: imaging
|
|
45
|
+
Requires-Dist: pillow>=10.0.0; extra == 'imaging'
|
|
46
|
+
Description-Content-Type: text/markdown
|
|
47
|
+
|
|
48
|
+
# FlashForge Python API
|
|
49
|
+
|
|
50
|
+
Python library for controlling FlashForge 3D printers with async support for the modern HTTP API and the legacy TCP protocol.
|
|
51
|
+
|
|
52
|
+
## Supported Printers
|
|
53
|
+
|
|
54
|
+
| Printer | Support |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| Adventurer 5M | Full |
|
|
57
|
+
| Adventurer 5M Pro | Full |
|
|
58
|
+
| AD5X | Full |
|
|
59
|
+
| Adventurer 3 / 4 | Dedicated TCP clients |
|
|
60
|
+
|
|
61
|
+
## Installation
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pip install flashforge-python-api
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Quick Start
|
|
68
|
+
|
|
69
|
+
Modern LAN-mode HTTP printers require:
|
|
70
|
+
|
|
71
|
+
- printer IP address
|
|
72
|
+
- serial number
|
|
73
|
+
- check code
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
import asyncio
|
|
77
|
+
from flashforge import FlashForgeClient, PrinterDiscovery
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
async def main():
|
|
81
|
+
discovery = PrinterDiscovery()
|
|
82
|
+
printers = await discovery.discover()
|
|
83
|
+
|
|
84
|
+
if not printers:
|
|
85
|
+
print("No printers found")
|
|
86
|
+
return
|
|
87
|
+
|
|
88
|
+
printer = printers[0]
|
|
89
|
+
|
|
90
|
+
async with FlashForgeClient(
|
|
91
|
+
printer.ip_address,
|
|
92
|
+
printer.serial_number or "SERIAL_NUMBER",
|
|
93
|
+
"CHECK_CODE",
|
|
94
|
+
) as client:
|
|
95
|
+
if not await client.initialize():
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
await client.init_control()
|
|
99
|
+
|
|
100
|
+
status = await client.get_printer_status()
|
|
101
|
+
print(f"Printer: {client.printer_name}")
|
|
102
|
+
print(f"State: {status.machine_state if status else 'unknown'}")
|
|
103
|
+
|
|
104
|
+
await client.control.home_axes()
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
asyncio.run(main())
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Main Entry Points
|
|
111
|
+
|
|
112
|
+
- `FlashForgeClient`: primary client for modern printers
|
|
113
|
+
- `PrinterDiscovery`: recommended discovery API
|
|
114
|
+
- `FlashForgeA4Client`: documented TCP client for Adventurer 4 Lite / Pro printers
|
|
115
|
+
- `FlashForgeA3Client`: documented TCP client for Adventurer 3 printers
|
|
116
|
+
- `FlashForgeTcpClient` and `client.tcp_client`: lower-level TCP access for direct commands and generic legacy workflows
|
|
117
|
+
|
|
118
|
+
## Capabilities
|
|
119
|
+
|
|
120
|
+
- printer discovery
|
|
121
|
+
- printer status and machine information
|
|
122
|
+
- job control
|
|
123
|
+
- file listing, uploads, and thumbnails
|
|
124
|
+
- temperature and motion control
|
|
125
|
+
- LED, camera, and filtration control where supported
|
|
126
|
+
- AD5X-specific job and material-station support
|
|
127
|
+
|
|
128
|
+
## Documentation
|
|
129
|
+
|
|
130
|
+
- [docs/README.md](docs/README.md)
|
|
131
|
+
- [docs/client.md](docs/client.md)
|
|
132
|
+
- [docs/protocols.md](docs/protocols.md)
|
|
133
|
+
- [docs/api_reference.md](docs/api_reference.md)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# FlashForge Python API
|
|
2
|
+
|
|
3
|
+
Python library for controlling FlashForge 3D printers with async support for the modern HTTP API and the legacy TCP protocol.
|
|
4
|
+
|
|
5
|
+
## Supported Printers
|
|
6
|
+
|
|
7
|
+
| Printer | Support |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| Adventurer 5M | Full |
|
|
10
|
+
| Adventurer 5M Pro | Full |
|
|
11
|
+
| AD5X | Full |
|
|
12
|
+
| Adventurer 3 / 4 | Dedicated TCP clients |
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pip install flashforge-python-api
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
Modern LAN-mode HTTP printers require:
|
|
23
|
+
|
|
24
|
+
- printer IP address
|
|
25
|
+
- serial number
|
|
26
|
+
- check code
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
import asyncio
|
|
30
|
+
from flashforge import FlashForgeClient, PrinterDiscovery
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
async def main():
|
|
34
|
+
discovery = PrinterDiscovery()
|
|
35
|
+
printers = await discovery.discover()
|
|
36
|
+
|
|
37
|
+
if not printers:
|
|
38
|
+
print("No printers found")
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
printer = printers[0]
|
|
42
|
+
|
|
43
|
+
async with FlashForgeClient(
|
|
44
|
+
printer.ip_address,
|
|
45
|
+
printer.serial_number or "SERIAL_NUMBER",
|
|
46
|
+
"CHECK_CODE",
|
|
47
|
+
) as client:
|
|
48
|
+
if not await client.initialize():
|
|
49
|
+
return
|
|
50
|
+
|
|
51
|
+
await client.init_control()
|
|
52
|
+
|
|
53
|
+
status = await client.get_printer_status()
|
|
54
|
+
print(f"Printer: {client.printer_name}")
|
|
55
|
+
print(f"State: {status.machine_state if status else 'unknown'}")
|
|
56
|
+
|
|
57
|
+
await client.control.home_axes()
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
asyncio.run(main())
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Main Entry Points
|
|
64
|
+
|
|
65
|
+
- `FlashForgeClient`: primary client for modern printers
|
|
66
|
+
- `PrinterDiscovery`: recommended discovery API
|
|
67
|
+
- `FlashForgeA4Client`: documented TCP client for Adventurer 4 Lite / Pro printers
|
|
68
|
+
- `FlashForgeA3Client`: documented TCP client for Adventurer 3 printers
|
|
69
|
+
- `FlashForgeTcpClient` and `client.tcp_client`: lower-level TCP access for direct commands and generic legacy workflows
|
|
70
|
+
|
|
71
|
+
## Capabilities
|
|
72
|
+
|
|
73
|
+
- printer discovery
|
|
74
|
+
- printer status and machine information
|
|
75
|
+
- job control
|
|
76
|
+
- file listing, uploads, and thumbnails
|
|
77
|
+
- temperature and motion control
|
|
78
|
+
- LED, camera, and filtration control where supported
|
|
79
|
+
- AD5X-specific job and material-station support
|
|
80
|
+
|
|
81
|
+
## Documentation
|
|
82
|
+
|
|
83
|
+
- [docs/README.md](docs/README.md)
|
|
84
|
+
- [docs/client.md](docs/client.md)
|
|
85
|
+
- [docs/protocols.md](docs/protocols.md)
|
|
86
|
+
- [docs/api_reference.md](docs/api_reference.md)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# FlashForge Python API Documentation
|
|
2
|
+
|
|
3
|
+
This documentation covers the Python surface for `flashforge-python-api`.
|
|
4
|
+
|
|
5
|
+
## Before You Start
|
|
6
|
+
|
|
7
|
+
This repository and `@ghosttypes/ff-api` share the same protocol/domain baseline, but they do not promise strict 1:1 public API parity.
|
|
8
|
+
|
|
9
|
+
Read [parity.md](parity.md) first if you are comparing both libraries or maintaining downstream integrations across both languages.
|
|
10
|
+
|
|
11
|
+
## Documentation Structure
|
|
12
|
+
|
|
13
|
+
- [Getting Started](client.md)
|
|
14
|
+
- [Parity Notes](parity.md)
|
|
15
|
+
- [API Reference](api_reference.md)
|
|
16
|
+
- [Data Models](models.md)
|
|
17
|
+
- [Protocols](protocols.md)
|
|
18
|
+
- [Advanced Usage](advanced.md)
|
|
19
|
+
|
|
20
|
+
## Recommended Entry Points
|
|
21
|
+
|
|
22
|
+
- `FlashForgeClient` for modern printer access
|
|
23
|
+
- `PrinterDiscovery` for new discovery code
|
|
24
|
+
- `FlashForgePrinterDiscovery` only when you need compatibility with older Python callers
|
|
25
|
+
|
|
26
|
+
## Quick Example
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
import asyncio
|
|
30
|
+
from flashforge import FlashForgeClient, PrinterDiscovery
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
async def main():
|
|
34
|
+
discovery = PrinterDiscovery()
|
|
35
|
+
printers = await discovery.discover()
|
|
36
|
+
|
|
37
|
+
if not printers:
|
|
38
|
+
print("No printers found")
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
printer = printers[0]
|
|
42
|
+
|
|
43
|
+
async with FlashForgeClient(
|
|
44
|
+
printer.ip_address,
|
|
45
|
+
printer.serial_number or "SERIAL_NUMBER",
|
|
46
|
+
"CHECK_CODE",
|
|
47
|
+
) as client:
|
|
48
|
+
if not await client.initialize():
|
|
49
|
+
return
|
|
50
|
+
|
|
51
|
+
status = await client.get_printer_status()
|
|
52
|
+
print(status.machine_state)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
asyncio.run(main())
|
|
56
|
+
```
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Advanced Topics
|
|
2
2
|
|
|
3
|
+
This page documents advanced Python usage patterns. If you are comparing this library with the TypeScript API, read [parity.md](parity.md) first.
|
|
4
|
+
|
|
3
5
|
## Async/Await Patterns
|
|
4
6
|
|
|
5
7
|
The FlashForge API is fully asynchronous, leveraging Python's `asyncio` library. All network operations are non-blocking, ensuring your application remains responsive while communicating with the printer.
|
|
@@ -278,19 +280,21 @@ async with client:
|
|
|
278
280
|
|
|
279
281
|
**Finding your credentials:**
|
|
280
282
|
|
|
281
|
-
The serial number and check code are printer-specific.
|
|
283
|
+
The serial number and check code are printer-specific. For new code, prefer the modern `PrinterDiscovery` API:
|
|
282
284
|
|
|
283
285
|
```python
|
|
284
|
-
from flashforge import
|
|
286
|
+
from flashforge import PrinterDiscovery
|
|
285
287
|
|
|
286
|
-
discovery =
|
|
287
|
-
printers = await discovery.
|
|
288
|
+
discovery = PrinterDiscovery()
|
|
289
|
+
printers = await discovery.discover()
|
|
288
290
|
|
|
289
291
|
for printer in printers:
|
|
290
292
|
print(f"IP: {printer.ip_address}")
|
|
291
293
|
print(f"Serial: {printer.serial_number}")
|
|
292
294
|
```
|
|
293
295
|
|
|
296
|
+
If you need compatibility with older Python callers, `FlashForgePrinterDiscovery` is still exported as a reduced wrapper.
|
|
297
|
+
|
|
294
298
|
## Type Hints & Safety
|
|
295
299
|
|
|
296
300
|
This library uses comprehensive Python type hints and Pydantic models for data validation. All responses are strongly typed, providing excellent IDE autocompletion and static analysis support.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
This document provides a comprehensive reference for the FlashForge Python API, including all classes, methods, and data models.
|
|
4
4
|
|
|
5
|
+
For recommended modern entry points, use `FlashForgeClient` and `PrinterDiscovery`. `FlashForgePrinterDiscovery` remains available as a compatibility wrapper.
|
|
6
|
+
|
|
5
7
|
## Core Client
|
|
6
8
|
|
|
7
9
|
### `flashforge.FlashForgeClient`
|
|
@@ -90,9 +92,18 @@ async with FlashForgeClient(ip, serial, check_code) as client:
|
|
|
90
92
|
|
|
91
93
|
## Discovery
|
|
92
94
|
|
|
95
|
+
### `flashforge.PrinterDiscovery`
|
|
96
|
+
|
|
97
|
+
Typed UDP discovery API for modern and legacy FlashForge models.
|
|
98
|
+
|
|
99
|
+
#### Methods
|
|
100
|
+
|
|
101
|
+
- `async discover(options: DiscoveryOptions | None = None) -> list[DiscoveredPrinter]`
|
|
102
|
+
- `monitor(options: DiscoveryOptions | None = None) -> DiscoveryMonitor`
|
|
103
|
+
|
|
93
104
|
### `flashforge.FlashForgePrinterDiscovery`
|
|
94
105
|
|
|
95
|
-
|
|
106
|
+
Backward-compatible wrapper around `PrinterDiscovery`.
|
|
96
107
|
|
|
97
108
|
#### Methods
|
|
98
109
|
|
|
@@ -545,10 +556,10 @@ async with FlashForgeClient("192.168.1.100", "SERIAL", "CHECK_CODE") as client:
|
|
|
545
556
|
### Discovery
|
|
546
557
|
|
|
547
558
|
```python
|
|
548
|
-
from flashforge import
|
|
559
|
+
from flashforge import PrinterDiscovery
|
|
549
560
|
|
|
550
|
-
discovery =
|
|
551
|
-
printers = await discovery.
|
|
561
|
+
discovery = PrinterDiscovery()
|
|
562
|
+
printers = await discovery.discover()
|
|
552
563
|
|
|
553
564
|
for printer in printers:
|
|
554
565
|
print(f"{printer.name} at {printer.ip_address}")
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Getting Started
|
|
2
|
+
|
|
3
|
+
This guide covers the recommended modern Python API surface.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install flashforge-python-api
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Discovery
|
|
12
|
+
|
|
13
|
+
For new code, prefer `PrinterDiscovery`.
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
import asyncio
|
|
17
|
+
from flashforge import PrinterDiscovery
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def discover():
|
|
21
|
+
discovery = PrinterDiscovery()
|
|
22
|
+
printers = await discovery.discover()
|
|
23
|
+
|
|
24
|
+
for printer in printers:
|
|
25
|
+
print(f"{printer.name} at {printer.ip_address}")
|
|
26
|
+
|
|
27
|
+
return printers
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
printers = asyncio.run(discover())
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
If you need the older Python compatibility surface, `FlashForgePrinterDiscovery` is still exported, but it only returns the reduced legacy wrapper objects.
|
|
34
|
+
|
|
35
|
+
## Connect to a Printer
|
|
36
|
+
|
|
37
|
+
Modern LAN-mode HTTP printers require the printer IP address, serial number, and check code.
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
import asyncio
|
|
41
|
+
from flashforge import FlashForgeClient
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
async def connect():
|
|
45
|
+
async with FlashForgeClient(
|
|
46
|
+
ip_address="192.168.1.100",
|
|
47
|
+
serial_number="SERIAL_NUMBER",
|
|
48
|
+
check_code="CHECK_CODE",
|
|
49
|
+
) as client:
|
|
50
|
+
if not await client.initialize():
|
|
51
|
+
return
|
|
52
|
+
|
|
53
|
+
await client.init_control()
|
|
54
|
+
|
|
55
|
+
print(f"Connected to {client.printer_name}")
|
|
56
|
+
print(f"Firmware: {client.firmware_version}")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
asyncio.run(connect())
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Basic Operations
|
|
63
|
+
|
|
64
|
+
### Get Printer Status
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
async with FlashForgeClient(ip, serial, check_code) as client:
|
|
68
|
+
await client.initialize()
|
|
69
|
+
status = await client.get_printer_status()
|
|
70
|
+
print(status.machine_state)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Control Temperature
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
async with FlashForgeClient(ip, serial, check_code) as client:
|
|
77
|
+
await client.initialize()
|
|
78
|
+
await client.init_control()
|
|
79
|
+
|
|
80
|
+
await client.temp_control.set_extruder_temp(200)
|
|
81
|
+
await client.temp_control.set_bed_temp(60)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Control Motion and Jobs
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
async with FlashForgeClient(ip, serial, check_code) as client:
|
|
88
|
+
await client.initialize()
|
|
89
|
+
await client.init_control()
|
|
90
|
+
|
|
91
|
+
await client.control.home_axes()
|
|
92
|
+
await client.job_control.pause_print_job()
|
|
93
|
+
await client.job_control.resume_print_job()
|
|
94
|
+
await client.job_control.cancel_print_job()
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Python also exposes some convenience wrappers on the top-level client, such as `pause_print()`, `resume_print()`, and `home_all_axes()`. These helpers are Python-specific and are not part of a strict cross-language parity contract.
|
|
98
|
+
|
|
99
|
+
### Detect OEM Camera Stream
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
async with FlashForgeClient(ip, serial, check_code) as client:
|
|
103
|
+
await client.initialize()
|
|
104
|
+
|
|
105
|
+
if client.camera_stream_url:
|
|
106
|
+
print(f"OEM camera stream: {client.camera_stream_url}")
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### List Files
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
async with FlashForgeClient(ip, serial, check_code) as client:
|
|
113
|
+
await client.initialize()
|
|
114
|
+
|
|
115
|
+
files = await client.files.get_file_list()
|
|
116
|
+
recent = await client.files.get_recent_file_list()
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Compatibility Notes
|
|
120
|
+
|
|
121
|
+
- `FlashForgePrinterDiscovery` remains available for older Python callers.
|
|
122
|
+
- `PrinterDiscovery` is the preferred discovery API for new code.
|
|
123
|
+
- `init_control()` is still the correct method name in Python.
|
|
124
|
+
- Python convenience helpers and compatibility shims should not be assumed to exist in TypeScript.
|
|
125
|
+
|
|
126
|
+
## Next Steps
|
|
127
|
+
|
|
128
|
+
- [API Reference](api_reference.md)
|
|
129
|
+
- [Advanced Topics](advanced.md)
|
|
130
|
+
- [Parity Notes](parity.md)
|