osa_tool 0.3.1__tar.gz → 0.3.2__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.
Files changed (261) hide show
  1. {osa_tool-0.3.1 → osa_tool-0.3.2}/PKG-INFO +70 -51
  2. {osa_tool-0.3.1 → osa_tool-0.3.2}/README.md +64 -49
  3. osa_tool-0.3.2/osa_tool/assets/notosans-sc-black.ttf +0 -0
  4. osa_tool-0.3.2/osa_tool/assets/notosans-sc-bold.ttf +0 -0
  5. osa_tool-0.3.2/osa_tool/assets/notosans-sc.ttf +0 -0
  6. osa_tool-0.3.2/osa_tool/config/locales/english.toml +168 -0
  7. osa_tool-0.3.2/osa_tool/config/locales/russian.toml +168 -0
  8. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/about_section.toml +2 -2
  9. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/analysis.toml +4 -1
  10. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/settings/arguments.yaml +119 -4
  11. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/settings/config.toml +10 -4
  12. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/settings.py +45 -3
  13. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/github_gitverse/pep8.yml +2 -1
  14. osa_tool-0.3.2/osa_tool/config/templates/workflow/github_gitverse/ruff.yml +18 -0
  15. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/github_gitverse/unit_test.yml +4 -3
  16. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/gitlab/autopep8.yml +2 -1
  17. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/gitlab/black.yml +2 -1
  18. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/gitlab/fix_pep8.yml +2 -1
  19. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/gitlab/pep8.yml +2 -1
  20. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/gitlab/unit_test.yml +2 -1
  21. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/git/git_agent.py +161 -7
  22. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/git/metadata.py +3 -1
  23. osa_tool-0.3.2/osa_tool/core/llm/host.py +667 -0
  24. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/llm/llm.py +117 -2
  25. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/notebook_report/analyzer.py +6 -0
  26. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/notebook_report/models.py +5 -0
  27. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/notebook_report/report_maker.py +79 -41
  28. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_analysis/models.py +9 -3
  29. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_analysis/pipeline.py +102 -14
  30. osa_tool-0.3.2/osa_tool/operations/analysis/paper_claims/__init__.py +73 -0
  31. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/claim_validation.py +1 -1
  32. osa_tool-0.3.2/osa_tool/operations/analysis/paper_claims/io.py +162 -0
  33. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/marker_converter.py +5 -2
  34. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/models.py +14 -0
  35. osa_tool-0.3.2/osa_tool/operations/analysis/paper_claims/openrouter_converter.py +251 -0
  36. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/pipeline.py +111 -86
  37. osa_tool-0.3.2/osa_tool/operations/analysis/paper_claims/section_extractor.py +68 -0
  38. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/repository_report/report_generator.py +9 -1
  39. osa_tool-0.3.2/osa_tool/operations/analysis/repository_report/report_localization.py +80 -0
  40. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/repository_report/report_maker.py +165 -59
  41. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/adapters/python_adapter.py +7 -1
  42. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/adapters/typescript_adapter.py +8 -3
  43. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/core/osa_parser.py +20 -2
  44. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/docgen.py +2 -2
  45. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/docstring_generation.py +0 -3
  46. osa_tool-0.3.2/osa_tool/operations/codebase/docstring_generation/insert/ts_js_augmentor.py +360 -0
  47. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/workflow_generation/workflow_executor.py +6 -0
  48. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/workflow_generation/workflow_generator.py +207 -16
  49. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/about_generation/about_generator.py +1 -1
  50. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/operations_catalog.py +2 -0
  51. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/run.py +59 -11
  52. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/run_chat.py +5 -3
  53. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/scheduler/plan.py +4 -4
  54. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/scheduler/scheduler.py +3 -1
  55. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/scheduler/workflow_manager.py +8 -1
  56. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/paper_analysis/cli.py +38 -2
  57. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/paper_claims/README.md +19 -6
  58. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/paper_claims/batch.py +24 -3
  59. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_analysis/scorecard.py +55 -26
  60. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/ui/plan_editor.py +178 -34
  61. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/utils/arguments_parser.py +64 -1
  62. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/utils/prompts_builder.py +33 -14
  63. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/utils/utils.py +51 -1
  64. {osa_tool-0.3.1 → osa_tool-0.3.2}/pyproject.toml +8 -3
  65. osa_tool-0.3.1/osa_tool/operations/analysis/paper_claims/__init__.py +0 -28
  66. osa_tool-0.3.1/osa_tool/operations/codebase/docstring_generation/insert/ts_js_augmentor.py +0 -217
  67. osa_tool-0.3.1/osa_tool/operations/codebase/docstring_generation/osa_treesitter.py +0 -808
  68. {osa_tool-0.3.1 → osa_tool-0.3.2}/LICENSE +0 -0
  69. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/__init__.py +0 -0
  70. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/__init__.py +0 -0
  71. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/osa_config.py +0 -0
  72. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/docstring_generation.toml +0 -0
  73. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/osa_agent.toml +0 -0
  74. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/paper_analysis.toml +0 -0
  75. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/paper_claims.toml +0 -0
  76. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/readme/prompts.toml +0 -0
  77. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/readme/system_messages.toml +0 -0
  78. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/readme.toml +0 -0
  79. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/repo_organization.toml +0 -0
  80. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/repository_quality.toml +0 -0
  81. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/requirements.toml +0 -0
  82. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/scheduler.toml +0 -0
  83. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/prompts/system_messages.toml +0 -0
  84. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/template.toml +0 -0
  85. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/github_gitverse/autopep8.yml +0 -0
  86. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/github_gitverse/black.yml +0 -0
  87. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/github_gitverse/fix_pep8.yml +0 -0
  88. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/github_gitverse/pypi_publish.yml +0 -0
  89. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/github_gitverse/slash_command_dispatch.yml +0 -0
  90. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/gitlab/pypi_publish.yml +0 -0
  91. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/config/templates/workflow/gitlab/slash_command_dispatch.yml +0 -0
  92. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/__init__.py +0 -0
  93. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/git/__init__.py +0 -0
  94. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/git/request_utils.py +0 -0
  95. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/llm/__init__.py +0 -0
  96. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/models/__init__.py +0 -0
  97. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/models/agent_status.py +0 -0
  98. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/models/event.py +0 -0
  99. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/models/llm_output_models.py +0 -0
  100. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/core/models/task.py +0 -0
  101. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/docs/images/osa_logo.PNG +0 -0
  102. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/docs/images/osa_logo_transparent.PNG +0 -0
  103. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/docs/templates/ci_config.toml +0 -0
  104. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/docs/templates/community.toml +0 -0
  105. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/docs/templates/contributing.toml +0 -0
  106. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/docs/templates/licenses.toml +0 -0
  107. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/docs/templates/mkdocs.yml +0 -0
  108. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/__init__.py +0 -0
  109. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/__init__.py +0 -0
  110. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/artifacts.py +0 -0
  111. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/notebook_report/__init__.py +0 -0
  112. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_analysis/__init__.py +0 -0
  113. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_analysis/data_context.py +0 -0
  114. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_analysis/verifier.py +0 -0
  115. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/claim_deduplicator.py +0 -0
  116. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/claim_extractor.py +0 -0
  117. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/claim_input_planner.py +0 -0
  118. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/claim_schemas.py +0 -0
  119. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/exceptions.py +0 -0
  120. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/pdf_splitter.py +0 -0
  121. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/paper_claims/section_parser.py +0 -0
  122. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/repository_quality/__init__.py +0 -0
  123. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/repository_quality/checks.py +0 -0
  124. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/repository_quality/repository_quality_scorer.py +0 -0
  125. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/repository_quality/scoring_engine.py +0 -0
  126. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/repository_report/__init__.py +0 -0
  127. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/analysis/repository_report/response_validation.py +0 -0
  128. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/__init__.py +0 -0
  129. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/directory_translation/__init__.py +0 -0
  130. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/directory_translation/dirs_and_files_translator.py +0 -0
  131. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/__init__.py +0 -0
  132. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/adapters/__init__.py +0 -0
  133. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/adapters/base.py +0 -0
  134. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/adapters/javascript_adapter.py +0 -0
  135. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/core/__init__.py +0 -0
  136. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/core/source_view.py +0 -0
  137. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/docstring_transformer.py +0 -0
  138. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/insert/__init__.py +0 -0
  139. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/insert/base_augmentor.py +0 -0
  140. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/insert/factory.py +0 -0
  141. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/insert/python_augmentor.py +0 -0
  142. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/docstring_generation/topology.py +0 -0
  143. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/notebook_conversion/__init__.py +0 -0
  144. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/notebook_conversion/notebook_converter.py +0 -0
  145. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/__init__.py +0 -0
  146. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/__init__.py +0 -0
  147. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/__init__.py +0 -0
  148. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/base.py +0 -0
  149. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/cpp.py +0 -0
  150. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/csharp.py +0 -0
  151. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/factory.py +0 -0
  152. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/generic.py +0 -0
  153. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/go.py +0 -0
  154. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/java.py +0 -0
  155. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/javascript.py +0 -0
  156. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/kotlin.py +0 -0
  157. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/latex.py +0 -0
  158. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/python.py +0 -0
  159. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/ruby.py +0 -0
  160. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/rust.py +0 -0
  161. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/analyzers/swift.py +0 -0
  162. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/executor/action_executor.py +0 -0
  163. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/executor/batch_updater.py +0 -0
  164. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/health_checker.py +0 -0
  165. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/planning_manager.py +0 -0
  166. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/snapshot_manager.py +0 -0
  167. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/core/utils.py +0 -0
  168. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/organization/organize.py +0 -0
  169. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/requirements_generation/__init__.py +0 -0
  170. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/requirements_generation/requirements_generation.py +0 -0
  171. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/workflow_generation/README.md +0 -0
  172. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/codebase/workflow_generation/__init__.py +0 -0
  173. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/__init__.py +0 -0
  174. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/about_generation/__init__.py +0 -0
  175. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/community_docs_generation/__init__.py +0 -0
  176. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/community_docs_generation/codemeta_generator.py +0 -0
  177. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/community_docs_generation/community.py +0 -0
  178. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/community_docs_generation/contributing.py +0 -0
  179. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/community_docs_generation/docs_run.py +0 -0
  180. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/community_docs_generation/license_generation.py +0 -0
  181. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/__init__.py +0 -0
  182. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/inputs/__init__.py +0 -0
  183. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/inputs/article_content.py +0 -0
  184. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/inputs/article_path.py +0 -0
  185. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/inputs/pypi_status_checker.py +0 -0
  186. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/__init__.py +0 -0
  187. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/graph.py +0 -0
  188. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/llm_schemas.py +0 -0
  189. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/models.py +0 -0
  190. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/nodes/__init__.py +0 -0
  191. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/nodes/assembler.py +0 -0
  192. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/nodes/context_collector.py +0 -0
  193. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/nodes/deterministic_builder.py +0 -0
  194. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/nodes/intent_analyzer.py +0 -0
  195. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/nodes/readme_patch.py +0 -0
  196. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/nodes/section_generator.py +0 -0
  197. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/nodes/section_planner.py +0 -0
  198. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/nodes/self_eval.py +0 -0
  199. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/nodes/writer.py +0 -0
  200. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/runtime_context.py +0 -0
  201. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/section_catalog.py +0 -0
  202. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/section_catalog_entries.py +0 -0
  203. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/pipeline/state.py +0 -0
  204. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/readme_agent.py +0 -0
  205. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/readme_utils.py +0 -0
  206. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/sections/__init__.py +0 -0
  207. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/sections/header.py +0 -0
  208. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/sections/icons/shieldsio_icons.json +0 -0
  209. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_generation/sections/installation.py +0 -0
  210. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_translation/__init__.py +0 -0
  211. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/docs/readme_translation/readme_translator.py +0 -0
  212. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/operations/registry.py +0 -0
  213. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/__init__.py +0 -0
  214. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/__init__.py +0 -0
  215. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/executor/__init__.py +0 -0
  216. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/executor/agent.py +0 -0
  217. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/finalizer/__init__.py +0 -0
  218. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/finalizer/agent.py +0 -0
  219. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/finalizer/models.py +0 -0
  220. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/intent_router/__init__.py +0 -0
  221. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/intent_router/agent.py +0 -0
  222. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/intent_router/models.py +0 -0
  223. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/planner/__init__.py +0 -0
  224. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/planner/agent.py +0 -0
  225. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/planner/models.py +0 -0
  226. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/repo_analysis/__init__.py +0 -0
  227. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/repo_analysis/agent.py +0 -0
  228. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/reviewer/__init__.py +0 -0
  229. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/reviewer/agent.py +0 -0
  230. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/agents/reviewer/models.py +0 -0
  231. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/base.py +0 -0
  232. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/context.py +0 -0
  233. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/graph.py +0 -0
  234. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/osa_agent/state.py +0 -0
  235. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/run_multi_process.py +0 -0
  236. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/scheduler/__init__.py +0 -0
  237. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/scheduler/response_validation.py +0 -0
  238. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/__init__.py +0 -0
  239. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/focused_cli.py +0 -0
  240. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/paper_analysis/__init__.py +0 -0
  241. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/paper_analysis/__main__.py +0 -0
  242. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/paper_claims/__init__.py +0 -0
  243. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/paper_claims/aggregate.py +0 -0
  244. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/paper_claims/evaluate.py +0 -0
  245. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/progress.py +0 -0
  246. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_analysis/__init__.py +0 -0
  247. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_analysis/dependencies.py +0 -0
  248. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_analysis/documentation.py +0 -0
  249. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_analysis/models.py +0 -0
  250. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_analysis/repo_analyzer.py +0 -0
  251. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_analysis/repo_graph.py +0 -0
  252. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_analysis/sourcerank.py +0 -0
  253. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_analysis/testing.py +0 -0
  254. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_quality/__init__.py +0 -0
  255. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/tools/repository_quality/__main__.py +0 -0
  256. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/ui/__init__.py +0 -0
  257. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/ui/input_for_chat.py +0 -0
  258. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/utils/__init__.py +0 -0
  259. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/utils/logger.py +0 -0
  260. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/utils/response_cleaner.py +0 -0
  261. {osa_tool-0.3.1 → osa_tool-0.3.2}/osa_tool/utils/token_counter.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osa_tool
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Tool that just makes your open source project better!
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE
@@ -12,7 +12,10 @@ Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Programming Language :: Python :: 3.15
15
16
  Provides-Extra: paper-claims
17
+ Provides-Extra: paper-claims-lite
18
+ Provides-Extra: paper-claims-marker
16
19
  Requires-Dist: GitPython (>=3.1.40)
17
20
  Requires-Dist: Pygments (>=2.18.0)
18
21
  Requires-Dist: aiofiles (>=24.1.0)
@@ -22,7 +25,7 @@ Requires-Dist: docx2txt (>=0.9)
22
25
  Requires-Dist: json-repair[schema] (>=0.60.0,<0.61.0)
23
26
  Requires-Dist: libcst (>=1.8.6)
24
27
  Requires-Dist: markdown-it-py (>=3.0.0) ; extra == "paper-claims"
25
- Requires-Dist: marker-pdf (>=1.10.2,<2.0.0) ; (python_version < "3.15") and (extra == "paper-claims")
28
+ Requires-Dist: marker-pdf (>=1.10.2,<2.0.0) ; (python_version < "3.15") and (extra == "paper-claims-marker")
26
29
  Requires-Dist: mkdocs (>=1.6.0)
27
30
  Requires-Dist: mkdocs-material (>=9.6.0)
28
31
  Requires-Dist: mkdocstrings-python (>=1.16.0)
@@ -40,6 +43,7 @@ Requires-Dist: pydantic (>=2.9.0,<3.0.0)
40
43
  Requires-Dist: pypdf (>=5.0.0) ; extra == "paper-claims"
41
44
  Requires-Dist: qrcode (>=7.4.0)
42
45
  Requires-Dist: rapidfuzz (>=3.14.0) ; extra == "paper-claims"
46
+ Requires-Dist: rapidfuzz (>=3.14.0) ; extra == "paper-claims-lite"
43
47
  Requires-Dist: reportlab (>=4.2.0,<5.0.0)
44
48
  Requires-Dist: scipy (>=1.13.0,<2.0.0) ; extra == "paper-claims"
45
49
  Requires-Dist: sentence-transformers (>=3.0.0,<6.0.0) ; extra == "paper-claims"
@@ -135,18 +139,12 @@ Here is a short video:
135
139
  including unit tests, code formatting, PEP 8 compliance checks, and PyPI publication.
136
140
 
137
141
  6. **Repository-quality score**: Evaluates a repository against formal criteria such as a non-empty README and
138
- license file. Its standalone artifact is a provenance-bearing `report.json`; run it independently with
139
- `python -m osa_tool.tools.repository_quality` or as part of paper analysis.
142
+ license file. The score is available as part of paper analysis with `--include-repository-quality`.
140
143
 
141
- 7. **Standalone paper claims pipeline**: Extracts technical claims from PDF papers through the reusable
142
- `paper_claims` operation and batch utilities. This pipeline is available as a separate module and is not registered
143
- in the scheduler yet.
144
-
145
- 8. **Paper repository analysis**: The canonical `osa-tool --paper-analysis` mode extracts or resumes typed paper
144
+ 7. **Paper repository analysis**: The canonical `osa-tool --paper-analysis` mode extracts or resumes typed paper
146
145
  claims and verifies them against a repository. Formal repository-quality scoring is optional through
147
- `--include-repository-quality`; the focused `python -m osa_tool.tools.paper_analysis` wrapper runs the same pipeline.
148
- With `--delete-dir`, both
149
- entry points remove only a remote clone created by that invocation, never a user-supplied local repository.
146
+ `--include-repository-quality`. With `--delete-dir`, the command removes only a remote clone created by that
147
+ invocation, never a user-supplied local repository.
150
148
 
151
149
  ---
152
150
 
@@ -165,10 +163,13 @@ Install optional features when needed:
165
163
  ```sh
166
164
  # PDF-to-claims extraction and evaluation utilities
167
165
  pip install "osa_tool[paper-claims]"
166
+
167
+ # Add the optional local Marker parser
168
+ pip install "osa_tool[paper-claims,paper-claims-marker]"
168
169
  ```
169
170
 
170
- The core package supports Python 3.11 and later. The `paper-claims` PDF conversion workflow currently requires
171
- Python 3.11--3.14 because its Marker dependency stack is not available for Python 3.15+.
171
+ The core package and remote PDF parsers support Python 3.11 and later. The optional Marker parser requires Python
172
+ 3.11--3.14 because its dependency stack is not available for Python 3.15+.
172
173
 
173
174
  **Build from source:**
174
175
 
@@ -221,31 +222,29 @@ docker build --build-arg GIT_USER_NAME="your-user-name" --build-arg GIT_USER_EMA
221
222
 
222
223
  OSA requires Python 3.11 or higher.
223
224
 
224
- The .env file is required to specify the LLM API key (OPENAI_API_KEY or AUTHORIZATION_KEY) and optionally a Git token.
225
- The Git token (GIT_TOKEN) may be omitted if you plan to work with a public repository without creating a fork (using the
226
- --no-fork option).
227
-
228
- Alternatively, instead of GIT_TOKEN, you can use GITHUB_TOKEN, GITLAB_TOKEN, or GITVERSE_TOKEN for GitHub, GitLab, and
229
- Gitverse respectively.
230
-
231
- When running `osa-tool` from CLI, you need to set the GIT_TOKEN and API key first:
225
+ OSA can be configured in two common ways:
232
226
 
233
227
  ```sh
234
- # Linux / macOS (bash/zsh)
235
- export OPENAI_API_KEY=<your_api_key>
228
+ # Subscription-backed Host LLM provider (api = "host")
229
+ export HOST_LLM_COMMAND=codex
236
230
  export GIT_TOKEN=<your_git_token>
237
231
 
238
- # Windows (PowerShell)
239
- setx OPENAI_API_KEY "<your_api_key>"
240
- setx GIT_TOKEN "<your_git_token>"
232
+ # OpenAI-compatible API provider (--api openai)
233
+ export OPENAI_API_KEY=<your_api_key>
234
+ export GIT_TOKEN=<your_git_token>
241
235
  ```
242
236
 
237
+ The Git token (GIT_TOKEN) may be omitted if you plan to work with a public repository without creating a fork (using the
238
+ --no-fork option). Instead of GIT_TOKEN, you can use GITHUB_TOKEN, GITLAB_TOKEN, or GITVERSE_TOKEN for GitHub, GitLab,
239
+ and Gitverse respectively. `AUTHORIZATION_KEY` is only needed when using Gigachat.
240
+
243
241
  ### Tokens
244
242
 
245
243
  | Token name | Description | Mandatory |
246
244
  |---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|
247
245
  | `GIT_TOKEN` | Personal GitHub/GitLab/Gitverse token used to clone private repositories, access metadata, and interact with its API. | Yes |
248
- | `OPENAI_API_KEY` | API key for accessing [OpenAI](https://platform.openai.com/docs/api-reference/introduction), [vsegpt](https://vsegpt.ru/Docs/API) and [openrouter](https://openrouter.ai/) providers | No |
246
+ | `HOST_LLM_COMMAND` | Logged-in Codex CLI command used by the subscription-backed `api = "host"` provider (`codex`). | No |
247
+ | `OPENAI_API_KEY` | API key for accessing [OpenAI](https://platform.openai.com/docs/api-reference/introduction), [vsegpt](https://vsegpt.ru/Docs/API), and [openrouter](https://openrouter.ai/) providers through `--api openai`. | No |
249
248
  | `AUTHORIZATION_KEY` | API key for [gigachat](https://developers.sber.ru/portal/products/gigachat-api) provider | No |
250
249
  | `X-API-Key` | API key for the [pepy.tech](https://pepy.tech/pepy-api) REST API, used to fetch Python package download statistics | No |
251
250
 
@@ -267,6 +266,8 @@ python -m osa_tool.run -r {repository} [--api {api}] [--base-url {base_url}] [--
267
266
  docker run --env-file .env {image-name} -r {repository} [--api {api}] [--base-url {base_url}] [--model {model_name}] [--attachment {article}] [--convert-notebooks {notebook_paths}]
268
267
  ```
269
268
 
269
+ Docker runs default to the OpenAI-compatible API-key provider because the container cannot inherit a logged-in host command from the user's machine. Pass `--api host` only when the container has access to a host command or bridge.
270
+
270
271
  The --attachment option enables you to choose a README template for a repository based on an article. You can provide
271
272
  either a link to a PDF file of the article or a path to a local PDF file after the --attachment option. If you are using
272
273
  Docker, ensure that you upload the PDF file to the OSA folder before building the image, then, specify the path as
@@ -277,30 +278,34 @@ documentation, see the [Workflow Generator README](./osa_tool/operations/codebas
277
278
 
278
279
  ### Configuration
279
280
 
280
- | Flag | Description | Default |
281
- |----------------------|-------------------------------------------------------------------------------------|--------------------------------|
282
- | `-r`, `--repository` | URL of the GitHub/GitLab/Gitverse repository (**Mandatory**) | |
283
- | `-b`, `--branch` | Branch name of the repository | Default branch |
284
- | `-o`, `--output` | Path to the output directory | Current working directory |
285
- | `--api` | LLM API service provider | `openai` |
286
- | `--base-url` | URL of the provider compatible with API OpenAI | `https://openrouter.ai/api/v1` |
287
- | `--model` | Specific LLM model to use | `gpt-3.5-turbo` |
288
- | `--top_p` | Nucleus sampling probability | `0.95` |
289
- | `--temperature` | Sampling temperature to use for the LLM output (0 = deterministic, 1 = creative). | `0.05` |
290
- | `--max_tokens` | Maximum number of output tokens the model can generate in a single response | `4096` |
291
- | `--context_window` | Total number of model context (Input + Output) | `16385` |
292
- | `--attachment` | Path to a local PDF or .docx file, or a URL to a PDF resource | `None` |
293
- | `-m`, `--mode` | Operation mode for repository processing: `basic`, `auto` (default), or `advanced`. | `auto` |
294
- | `--delete-dir` | Enable deleting the downloaded repository after processing | `disabled` |
295
- | `--no-fork` | Avoid create fork for target repository | `False` |
296
- | `--no-pull-request` | Avoid create pull request for target repository | `False` |
281
+ | Flag | Description | Default |
282
+ |------------------------|-------------------------------------------------------------------------------------|--------------------------------|
283
+ | `-r`, `--repository` | URL of the GitHub/GitLab/Gitverse repository (**Mandatory**) | |
284
+ | `-b`, `--branch` | Branch name of the repository | Default branch |
285
+ | `--based-on-date` | Analyse the repository version closest to the given date (forces no fork / no PR) | `None` |
286
+ | `-o`, `--output` | Path to the output directory | Current working directory |
287
+ | `--api` | LLM API service provider | `openai` |
288
+ | `--base-url` | URL of the provider compatible with API OpenAI | `https://openrouter.ai/api/v1` |
289
+ | `--model` | Specific LLM model to use | `gpt-3.5-turbo` |
290
+ | `--top-p` | Nucleus sampling probability | `0.95` |
291
+ | `--temperature` | Sampling temperature to use for the LLM output (0 = deterministic, 1 = creative). | `0.05` |
292
+ | `--max-tokens` | Maximum number of output tokens the model can generate in a single response | `4096` |
293
+ | `--context-window` | Total number of model context (Input + Output) | `16385` |
294
+ | `--attachment` | Path to a local PDF or .docx file, or a URL to a PDF resource | `None` |
295
+ | `-m`, `--mode` | Operation mode for repository processing: `basic`, `auto` (default), or `advanced`. | `auto` |
296
+ | `--delete-dir` | Enable deleting the downloaded repository after processing | `disabled` |
297
+ | `--no-fork` | Avoid create fork for target repository | `False` |
298
+ | `--no-pull-request` | Avoid create pull request for target repository | `False` |
299
+ | `--artefacts-language` | Language for report generation | `English` |
297
300
 
298
301
  Also OSA supports custom configuration via TOML files. Use the `--config-file` option to specify a path to custom
299
302
  configuration file. If no custom configuration file is provided, OSA will use the default configuration.
300
303
 
301
- By default, OSA uses a single model for all tasks (specified via `--model`). If you want to use different models for
302
- different types of tasks, disable the `--use-single-model` flag and specify models for each task type (
303
- `--model-docstring`, `--model-readme`, `--model-validation`, `--model-general`).
304
+ OSA uses the shared `[llm]` model settings unless a task-specific profile is configured. Task profiles fall back to the
305
+ shared settings when they do not override a value. The `--use-single-model` flag forces all tasks to use the shared
306
+ `[llm]` settings; omit it to allow task-specific profiles and model flags. Supported task model flags include
307
+ `--model-docstring`, `--model-readme`, `--model-general`, `--model-repository-quality`, `--model-paper-claims`, and
308
+ `--model-paper-verification`. There is no `--model-validation` option in the current CLI.
304
309
 
305
310
  To learn how to work with the interactive CLI and view descriptions of all available keys, visit
306
311
  the [CLI usage guide](./docs/scheduler/index.md).
@@ -314,9 +319,23 @@ Examples of generated README files are available in [examples](./examples).
314
319
  URL of the GitHub/GitLab/Gitverse repository, LLM API service provider (*optional*) and Specific LLM model to use
315
320
  (*optional*) are required to use the generator.
316
321
 
317
- Supported LLM providers are available as part of the [ProtoLLM](https://github.com/aimclub/ProtoLLM/)
318
- ecosystem. See the [connectors directory](https://github.com/aimclub/ProtoLLM/tree/main/protollm/connectors) for the
319
- full list.
322
+ OSA supports the subscription-backed Host LLM provider directly. `HOST_LLM_COMMAND` currently expects the Codex CLI protocol; use the bridge or an API-backed provider when custom generation controls are required. Other LLM providers are available as part of the
323
+ [ProtoLLM](https://github.com/aimclub/ProtoLLM/) ecosystem. See the
324
+ [connectors directory](https://github.com/aimclub/ProtoLLM/tree/main/protollm/connectors) for the full list.
325
+
326
+ Subscription-backed Host LLM:
327
+
328
+ ```sh
329
+ export HOST_LLM_COMMAND=codex
330
+ python -m osa_tool.run -r https://github.com/aimclub/OSA --api host
331
+ ```
332
+
333
+ OpenAI-compatible API key:
334
+
335
+ ```sh
336
+ export OPENAI_API_KEY=<your_api_key>
337
+ python -m osa_tool.run -r https://github.com/aimclub/OSA --api openai --base-url https://api.openai.com/v1 --model gpt-4o
338
+ ```
320
339
 
321
340
  Local ITMO model:
322
341
 
@@ -78,18 +78,12 @@ Here is a short video:
78
78
  including unit tests, code formatting, PEP 8 compliance checks, and PyPI publication.
79
79
 
80
80
  6. **Repository-quality score**: Evaluates a repository against formal criteria such as a non-empty README and
81
- license file. Its standalone artifact is a provenance-bearing `report.json`; run it independently with
82
- `python -m osa_tool.tools.repository_quality` or as part of paper analysis.
81
+ license file. The score is available as part of paper analysis with `--include-repository-quality`.
83
82
 
84
- 7. **Standalone paper claims pipeline**: Extracts technical claims from PDF papers through the reusable
85
- `paper_claims` operation and batch utilities. This pipeline is available as a separate module and is not registered
86
- in the scheduler yet.
87
-
88
- 8. **Paper repository analysis**: The canonical `osa-tool --paper-analysis` mode extracts or resumes typed paper
83
+ 7. **Paper repository analysis**: The canonical `osa-tool --paper-analysis` mode extracts or resumes typed paper
89
84
  claims and verifies them against a repository. Formal repository-quality scoring is optional through
90
- `--include-repository-quality`; the focused `python -m osa_tool.tools.paper_analysis` wrapper runs the same pipeline.
91
- With `--delete-dir`, both
92
- entry points remove only a remote clone created by that invocation, never a user-supplied local repository.
85
+ `--include-repository-quality`. With `--delete-dir`, the command removes only a remote clone created by that
86
+ invocation, never a user-supplied local repository.
93
87
 
94
88
  ---
95
89
 
@@ -108,10 +102,13 @@ Install optional features when needed:
108
102
  ```sh
109
103
  # PDF-to-claims extraction and evaluation utilities
110
104
  pip install "osa_tool[paper-claims]"
105
+
106
+ # Add the optional local Marker parser
107
+ pip install "osa_tool[paper-claims,paper-claims-marker]"
111
108
  ```
112
109
 
113
- The core package supports Python 3.11 and later. The `paper-claims` PDF conversion workflow currently requires
114
- Python 3.11--3.14 because its Marker dependency stack is not available for Python 3.15+.
110
+ The core package and remote PDF parsers support Python 3.11 and later. The optional Marker parser requires Python
111
+ 3.11--3.14 because its dependency stack is not available for Python 3.15+.
115
112
 
116
113
  **Build from source:**
117
114
 
@@ -164,31 +161,29 @@ docker build --build-arg GIT_USER_NAME="your-user-name" --build-arg GIT_USER_EMA
164
161
 
165
162
  OSA requires Python 3.11 or higher.
166
163
 
167
- The .env file is required to specify the LLM API key (OPENAI_API_KEY or AUTHORIZATION_KEY) and optionally a Git token.
168
- The Git token (GIT_TOKEN) may be omitted if you plan to work with a public repository without creating a fork (using the
169
- --no-fork option).
170
-
171
- Alternatively, instead of GIT_TOKEN, you can use GITHUB_TOKEN, GITLAB_TOKEN, or GITVERSE_TOKEN for GitHub, GitLab, and
172
- Gitverse respectively.
173
-
174
- When running `osa-tool` from CLI, you need to set the GIT_TOKEN and API key first:
164
+ OSA can be configured in two common ways:
175
165
 
176
166
  ```sh
177
- # Linux / macOS (bash/zsh)
178
- export OPENAI_API_KEY=<your_api_key>
167
+ # Subscription-backed Host LLM provider (api = "host")
168
+ export HOST_LLM_COMMAND=codex
179
169
  export GIT_TOKEN=<your_git_token>
180
170
 
181
- # Windows (PowerShell)
182
- setx OPENAI_API_KEY "<your_api_key>"
183
- setx GIT_TOKEN "<your_git_token>"
171
+ # OpenAI-compatible API provider (--api openai)
172
+ export OPENAI_API_KEY=<your_api_key>
173
+ export GIT_TOKEN=<your_git_token>
184
174
  ```
185
175
 
176
+ The Git token (GIT_TOKEN) may be omitted if you plan to work with a public repository without creating a fork (using the
177
+ --no-fork option). Instead of GIT_TOKEN, you can use GITHUB_TOKEN, GITLAB_TOKEN, or GITVERSE_TOKEN for GitHub, GitLab,
178
+ and Gitverse respectively. `AUTHORIZATION_KEY` is only needed when using Gigachat.
179
+
186
180
  ### Tokens
187
181
 
188
182
  | Token name | Description | Mandatory |
189
183
  |---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|
190
184
  | `GIT_TOKEN` | Personal GitHub/GitLab/Gitverse token used to clone private repositories, access metadata, and interact with its API. | Yes |
191
- | `OPENAI_API_KEY` | API key for accessing [OpenAI](https://platform.openai.com/docs/api-reference/introduction), [vsegpt](https://vsegpt.ru/Docs/API) and [openrouter](https://openrouter.ai/) providers | No |
185
+ | `HOST_LLM_COMMAND` | Logged-in Codex CLI command used by the subscription-backed `api = "host"` provider (`codex`). | No |
186
+ | `OPENAI_API_KEY` | API key for accessing [OpenAI](https://platform.openai.com/docs/api-reference/introduction), [vsegpt](https://vsegpt.ru/Docs/API), and [openrouter](https://openrouter.ai/) providers through `--api openai`. | No |
192
187
  | `AUTHORIZATION_KEY` | API key for [gigachat](https://developers.sber.ru/portal/products/gigachat-api) provider | No |
193
188
  | `X-API-Key` | API key for the [pepy.tech](https://pepy.tech/pepy-api) REST API, used to fetch Python package download statistics | No |
194
189
 
@@ -210,6 +205,8 @@ python -m osa_tool.run -r {repository} [--api {api}] [--base-url {base_url}] [--
210
205
  docker run --env-file .env {image-name} -r {repository} [--api {api}] [--base-url {base_url}] [--model {model_name}] [--attachment {article}] [--convert-notebooks {notebook_paths}]
211
206
  ```
212
207
 
208
+ Docker runs default to the OpenAI-compatible API-key provider because the container cannot inherit a logged-in host command from the user's machine. Pass `--api host` only when the container has access to a host command or bridge.
209
+
213
210
  The --attachment option enables you to choose a README template for a repository based on an article. You can provide
214
211
  either a link to a PDF file of the article or a path to a local PDF file after the --attachment option. If you are using
215
212
  Docker, ensure that you upload the PDF file to the OSA folder before building the image, then, specify the path as
@@ -220,30 +217,34 @@ documentation, see the [Workflow Generator README](./osa_tool/operations/codebas
220
217
 
221
218
  ### Configuration
222
219
 
223
- | Flag | Description | Default |
224
- |----------------------|-------------------------------------------------------------------------------------|--------------------------------|
225
- | `-r`, `--repository` | URL of the GitHub/GitLab/Gitverse repository (**Mandatory**) | |
226
- | `-b`, `--branch` | Branch name of the repository | Default branch |
227
- | `-o`, `--output` | Path to the output directory | Current working directory |
228
- | `--api` | LLM API service provider | `openai` |
229
- | `--base-url` | URL of the provider compatible with API OpenAI | `https://openrouter.ai/api/v1` |
230
- | `--model` | Specific LLM model to use | `gpt-3.5-turbo` |
231
- | `--top_p` | Nucleus sampling probability | `0.95` |
232
- | `--temperature` | Sampling temperature to use for the LLM output (0 = deterministic, 1 = creative). | `0.05` |
233
- | `--max_tokens` | Maximum number of output tokens the model can generate in a single response | `4096` |
234
- | `--context_window` | Total number of model context (Input + Output) | `16385` |
235
- | `--attachment` | Path to a local PDF or .docx file, or a URL to a PDF resource | `None` |
236
- | `-m`, `--mode` | Operation mode for repository processing: `basic`, `auto` (default), or `advanced`. | `auto` |
237
- | `--delete-dir` | Enable deleting the downloaded repository after processing | `disabled` |
238
- | `--no-fork` | Avoid create fork for target repository | `False` |
239
- | `--no-pull-request` | Avoid create pull request for target repository | `False` |
220
+ | Flag | Description | Default |
221
+ |------------------------|-------------------------------------------------------------------------------------|--------------------------------|
222
+ | `-r`, `--repository` | URL of the GitHub/GitLab/Gitverse repository (**Mandatory**) | |
223
+ | `-b`, `--branch` | Branch name of the repository | Default branch |
224
+ | `--based-on-date` | Analyse the repository version closest to the given date (forces no fork / no PR) | `None` |
225
+ | `-o`, `--output` | Path to the output directory | Current working directory |
226
+ | `--api` | LLM API service provider | `openai` |
227
+ | `--base-url` | URL of the provider compatible with API OpenAI | `https://openrouter.ai/api/v1` |
228
+ | `--model` | Specific LLM model to use | `gpt-3.5-turbo` |
229
+ | `--top-p` | Nucleus sampling probability | `0.95` |
230
+ | `--temperature` | Sampling temperature to use for the LLM output (0 = deterministic, 1 = creative). | `0.05` |
231
+ | `--max-tokens` | Maximum number of output tokens the model can generate in a single response | `4096` |
232
+ | `--context-window` | Total number of model context (Input + Output) | `16385` |
233
+ | `--attachment` | Path to a local PDF or .docx file, or a URL to a PDF resource | `None` |
234
+ | `-m`, `--mode` | Operation mode for repository processing: `basic`, `auto` (default), or `advanced`. | `auto` |
235
+ | `--delete-dir` | Enable deleting the downloaded repository after processing | `disabled` |
236
+ | `--no-fork` | Avoid create fork for target repository | `False` |
237
+ | `--no-pull-request` | Avoid create pull request for target repository | `False` |
238
+ | `--artefacts-language` | Language for report generation | `English` |
240
239
 
241
240
  Also OSA supports custom configuration via TOML files. Use the `--config-file` option to specify a path to custom
242
241
  configuration file. If no custom configuration file is provided, OSA will use the default configuration.
243
242
 
244
- By default, OSA uses a single model for all tasks (specified via `--model`). If you want to use different models for
245
- different types of tasks, disable the `--use-single-model` flag and specify models for each task type (
246
- `--model-docstring`, `--model-readme`, `--model-validation`, `--model-general`).
243
+ OSA uses the shared `[llm]` model settings unless a task-specific profile is configured. Task profiles fall back to the
244
+ shared settings when they do not override a value. The `--use-single-model` flag forces all tasks to use the shared
245
+ `[llm]` settings; omit it to allow task-specific profiles and model flags. Supported task model flags include
246
+ `--model-docstring`, `--model-readme`, `--model-general`, `--model-repository-quality`, `--model-paper-claims`, and
247
+ `--model-paper-verification`. There is no `--model-validation` option in the current CLI.
247
248
 
248
249
  To learn how to work with the interactive CLI and view descriptions of all available keys, visit
249
250
  the [CLI usage guide](./docs/scheduler/index.md).
@@ -257,9 +258,23 @@ Examples of generated README files are available in [examples](./examples).
257
258
  URL of the GitHub/GitLab/Gitverse repository, LLM API service provider (*optional*) and Specific LLM model to use
258
259
  (*optional*) are required to use the generator.
259
260
 
260
- Supported LLM providers are available as part of the [ProtoLLM](https://github.com/aimclub/ProtoLLM/)
261
- ecosystem. See the [connectors directory](https://github.com/aimclub/ProtoLLM/tree/main/protollm/connectors) for the
262
- full list.
261
+ OSA supports the subscription-backed Host LLM provider directly. `HOST_LLM_COMMAND` currently expects the Codex CLI protocol; use the bridge or an API-backed provider when custom generation controls are required. Other LLM providers are available as part of the
262
+ [ProtoLLM](https://github.com/aimclub/ProtoLLM/) ecosystem. See the
263
+ [connectors directory](https://github.com/aimclub/ProtoLLM/tree/main/protollm/connectors) for the full list.
264
+
265
+ Subscription-backed Host LLM:
266
+
267
+ ```sh
268
+ export HOST_LLM_COMMAND=codex
269
+ python -m osa_tool.run -r https://github.com/aimclub/OSA --api host
270
+ ```
271
+
272
+ OpenAI-compatible API key:
273
+
274
+ ```sh
275
+ export OPENAI_API_KEY=<your_api_key>
276
+ python -m osa_tool.run -r https://github.com/aimclub/OSA --api openai --base-url https://api.openai.com/v1 --model gpt-4o
277
+ ```
263
278
 
264
279
  Local ITMO model:
265
280
 
@@ -0,0 +1,168 @@
1
+ language = "English"
2
+
3
+ [translations]
4
+ report_header = "Repository Analysis Report"
5
+ statistics = "Statistics"
6
+ values = "Values"
7
+ stars_count = "Stars Count"
8
+ forks_count = "Forks Count"
9
+ issues_count = "Issues Count"
10
+ metric = "Metric"
11
+ readme_presence = "README Presence"
12
+ license_presence = "License Presence"
13
+ documentation_presence = "Documentation Presence"
14
+ examples_presence = "Examples Presence"
15
+ requirements_presence = "Requirements Presence"
16
+ tests_presence = "Tests Presence"
17
+ description_presence = "Description Presence"
18
+ repository_name = "Repository Name"
19
+ owner = "Owner"
20
+ created_at = "Created at"
21
+ repository_structure = "Repository Structure"
22
+ compliance = "Compliance"
23
+ missing_files = "Missing Files"
24
+ organization = "Organization"
25
+ readme_analysis = "README Analysis"
26
+ quality = "Quality"
27
+ documentation = "Documentation"
28
+ test_present = "Test present"
29
+ documentation_quality = "Document quality"
30
+ outdated_content = "Outdated content"
31
+ key_shortcomings = "Key Shortcomings"
32
+ recommendations = "Recommendations"
33
+ readme_quality = "text"
34
+ project_description = "Project description"
35
+ installation = "Installation"
36
+ usage_examples = "Usage examples"
37
+ contribution_guidelines = "Contribution guidelines"
38
+ license_specified = "License specified"
39
+ badges_present = "Badges present"
40
+ summary_header = "OSA Work Summary"
41
+ what_have_been_done = "What have been done"
42
+ report_by_tasks = "Report by tasks"
43
+ yes = "Yes"
44
+ no = "No"
45
+ partial = "Partial"
46
+ report = "Report"
47
+ translate_dirs = "Translate dirs"
48
+ convert_notebooks = "Convert notebooks"
49
+ translate_readme = "Translate readme"
50
+ ensure_license = "Ensure license"
51
+ community_docs = "Community docs"
52
+ docstring = "Docstring"
53
+ ignore_list = "Ignore list"
54
+ incremental = "Incremental"
55
+ target_files = "Target files"
56
+ readme = "Readme"
57
+ refine_readme = "Refine readme"
58
+ requirements = "Requirements"
59
+ organize = "Organize"
60
+ about = "About"
61
+ validate_paper = "Validate paper"
62
+ validate_doc = "Validate doc"
63
+ author = "Author"
64
+ generate_workflows = "Generate workflows"
65
+ include_tests = "Include tests"
66
+ include_black = "Include black"
67
+ include_pep8 = "Include pep8"
68
+ include_autopep8 = "Include autopep8"
69
+ include_fix_pep8 = "Include fix pep8"
70
+ include_pypi = "Include pypi"
71
+ python_versions = "Python versions"
72
+ pep8_tool = "Pep8 tool"
73
+ use_poetry = "Use poetry"
74
+ include_codecov = "Include codecov"
75
+ unknown = "Unknown"
76
+ for = "for"
77
+
78
+ # Notebook Analysis Report
79
+ notebook_report_header = "Notebook Analysis Report"
80
+ notebook_summary = "Notebook Summary"
81
+ value = "Value"
82
+ quality_signals = "Quality Signals"
83
+ total_notebooks_scanned = "Total notebooks scanned"
84
+ total_findings = "Total findings"
85
+ successfully_analyzed = "Successfully analyzed"
86
+ invalid_syntax_notebooks = "Invalid syntax notebooks"
87
+ read_or_parse_failures = "Read or parse failures"
88
+ fully_non_executed_notebooks = "Fully non-executed notebooks"
89
+ notebooks_with_findings = "Notebooks with findings"
90
+ analysis_scope = "Analysis scope"
91
+ repository_wide = "Repository-wide"
92
+ overview = "Overview"
93
+ notebook_overview_text = "This report reviewed <b>{total_notebooks}</b> notebook(s) and recorded <b>{total_issues}</b> finding(s) across structure, execution, and readability."
94
+ notebook_explicit_targets = "Selected targets were provided explicitly: <b>{count}</b> path(s)."
95
+ notebook_full_scan = "Scope: full repository notebook scan."
96
+ most_frequent_findings = "Most Frequent Findings"
97
+ notebook_details = "Notebook Details"
98
+ status_label = "Status"
99
+ analysis_errors_present = "analysis errors present"
100
+ finding_count = "{count} finding(s)"
101
+ no_findings_detected = "no findings detected"
102
+ cells_line = "Cells: total <b>{total}</b>, code {code}, markdown {markdown}, raw {raw}"
103
+ markdown_line = "Markdown lines {lines}, titles {titles}, functions {functions}, classes {classes}"
104
+ analysis_error_line = "Analysis error: {error}"
105
+ no_notebook_issues = "No notebook issues detected."
106
+ recommendation_label = "Recommendation"
107
+
108
+ # Notebook issue catalog (keyed by NotebookReportAnalyzer's slug).
109
+ # NOTE: the "notebook-too-long" text below bakes in the current _MAX_CELLS_IN_NOTEBOOK
110
+ # threshold (50); update both locales together if that constant ever changes.
111
+ "notebook_issue_non-linear-execution_description" = "Notebook cells were executed in a non-linear order."
112
+ "notebook_issue_non-linear-execution_recommendation" = "Re-run your notebook top to bottom to ensure it is reproducible."
113
+ "notebook_issue_notebook-too-long_description" = "Notebook contains more than 50 cells."
114
+ "notebook_issue_notebook-too-long_recommendation" = "Split this notebook into two or more notebooks."
115
+ "notebook_issue_imports-beyond-first-cell_description" = "Import statements were found beyond the first code cell."
116
+ "notebook_issue_imports-beyond-first-cell_recommendation" = "Move import statements to the first code cell to make your notebook dependencies more explicit."
117
+ "notebook_issue_missing-h1-heading_description" = "Initial cells do not contain an H1 markdown heading."
118
+ "notebook_issue_missing-h1-heading_recommendation" = "Clarify the notebook subject by writing an H1 Markdown heading in one of the initial cells of your notebook."
119
+ "notebook_issue_missing-opening-markdown_description" = "Initial notebook cells do not contain descriptive markdown text."
120
+ "notebook_issue_missing-opening-markdown_recommendation" = "Begin your notebook by describing what you intend to do in one or more introductory Markdown cells."
121
+ "notebook_issue_missing-closing-markdown_description" = "Final notebook cells do not contain descriptive markdown text."
122
+ "notebook_issue_missing-closing-markdown_recommendation" = "Conclude your notebook by describing what you have accomplished in one or more concluding Markdown cells."
123
+ "notebook_issue_too-few-markdown-cells_description" = "Notebook contains too few markdown cells relative to code cells."
124
+ "notebook_issue_too-few-markdown-cells_recommendation" = "Describe the steps of your computation by adding a few more Markdown cells."
125
+ "notebook_issue_invalid-python-syntax_description" = "Notebook contains invalid Python syntax in exported code."
126
+ "notebook_issue_invalid-python-syntax_recommendation" = "Fix syntax errors in the notebook code cells."
127
+ "notebook_issue_non-executed-notebook_description" = "All code cells appear to be non-executed."
128
+ "notebook_issue_non-executed-notebook_recommendation" = "Before committing, run your notebook top to bottom to ensure that all cells are executed."
129
+ "notebook_issue_non-executed-cells_description" = "Notebook contains non-executed code cells."
130
+ "notebook_issue_non-executed-cells_recommendation" = "Re-run your notebook top to bottom to ensure that all cells are executed."
131
+ "notebook_issue_empty-cells_description" = "Notebook contains empty code cells."
132
+ "notebook_issue_empty-cells_recommendation" = "Keep your notebook clean by deleting unused cells."
133
+ "notebook_issue_long-multiline-python-comment_description" = "Notebook contains long multiline Python comments inside code cells."
134
+ "notebook_issue_long-multiline-python-comment_recommendation" = "For improved notebook readability, prefer using Markdown formatted text to long multiline Python comments."
135
+ "notebook_issue_cell-too-long_description" = "Notebook contains long code cells."
136
+ "notebook_issue_cell-too-long_recommendation" = "Consider consolidating your code outside the notebook by moving utility functions to a structured and tested codebase.\nUse notebooks to display results, not to compute them."
137
+ "notebook_issue_untitled-notebook_description" = "Notebook still uses a default Untitled name."
138
+ "notebook_issue_untitled-notebook_recommendation" = "Give it a meaningful title to make it easy to recognize."
139
+ "notebook_issue_non-portable-chars-in-name_description" = "Notebook filename contains non-portable characters."
140
+ "notebook_issue_non-portable-chars-in-name_recommendation" = "Rename your notebook by using characters contained in the following portable charset: [A-Za-z0-9_.-]."
141
+ "notebook_issue_duplicate-notebook-not-renamed_description" = "Notebook looks like a duplicate copy that was not renamed."
142
+ "notebook_issue_duplicate-notebook-not-renamed_recommendation" = "Give it a meaningful title to make it easy to recognize."
143
+
144
+ # Notebook issue short labels (used in the "Most Frequent Findings" list).
145
+ "notebook_issue_non-linear-execution_label" = "Non-linear execution"
146
+ "notebook_issue_notebook-too-long_label" = "Notebook too long"
147
+ "notebook_issue_imports-beyond-first-cell_label" = "Imports beyond first cell"
148
+ "notebook_issue_missing-h1-heading_label" = "Missing H1 heading"
149
+ "notebook_issue_missing-opening-markdown_label" = "Missing opening markdown"
150
+ "notebook_issue_missing-closing-markdown_label" = "Missing closing markdown"
151
+ "notebook_issue_too-few-markdown-cells_label" = "Too few markdown cells"
152
+ "notebook_issue_invalid-python-syntax_label" = "Invalid Python syntax"
153
+ "notebook_issue_non-executed-notebook_label" = "Non-executed notebook"
154
+ "notebook_issue_non-executed-cells_label" = "Non-executed cells"
155
+ "notebook_issue_empty-cells_label" = "Empty cells"
156
+ "notebook_issue_long-multiline-python-comment_label" = "Long multiline Python comment"
157
+ "notebook_issue_cell-too-long_label" = "Cell too long"
158
+ "notebook_issue_untitled-notebook_label" = "Untitled notebook"
159
+ "notebook_issue_non-portable-chars-in-name_label" = "Non-portable characters in name"
160
+ "notebook_issue_duplicate-notebook-not-renamed_label" = "Duplicate notebook not renamed"
161
+
162
+ # Notebook issue "details" fragments (only slugs that carry dynamic details_kwargs).
163
+ "notebook_issue_notebook-too-long_details" = "Detected {count} cells."
164
+ "notebook_issue_too-few-markdown-cells_details" = "Markdown/code ratio is {ratio:.2f}."
165
+ "notebook_issue_non-executed-cells_details" = "{count} code cell(s) are non-executed."
166
+ "notebook_issue_empty-cells_details" = "{count} empty code cell(s) detected."
167
+ "notebook_issue_long-multiline-python-comment_details" = "{count} code cell(s) contain long comment blocks."
168
+ "notebook_issue_cell-too-long_details" = "{count} code cell(s) exceed {limit} lines."