zrb 1.8.1__tar.gz → 1.8.3__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 (394) hide show
  1. {zrb-1.8.1 → zrb-1.8.3}/PKG-INFO +32 -2
  2. {zrb-1.8.1 → zrb-1.8.3}/README.md +31 -1
  3. {zrb-1.8.1 → zrb-1.8.3}/pyproject.toml +1 -1
  4. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/__main__.py +2 -1
  5. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/asdf/asdf.py +1 -0
  6. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/tmux/tmux.py +1 -0
  7. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/ubuntu.py +11 -2
  8. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/zsh/zsh.py +1 -0
  9. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/config.py +1 -5
  10. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/llm_config.py +7 -18
  11. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/session/session.py +14 -7
  12. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/base/execution.py +1 -2
  13. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/base/lifecycle.py +22 -18
  14. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/cmd_task.py +3 -0
  15. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/prompt.py +1 -13
  16. zrb-1.8.3/src/zrb/util/cmd/command.py +192 -0
  17. zrb-1.8.1/src/zrb/util/cmd/command.py +0 -141
  18. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/__init__.py +0 -0
  19. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/attr/__init__.py +0 -0
  20. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/attr/type.py +0 -0
  21. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/__init__.py +0 -0
  22. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/base64.py +0 -0
  23. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/git.py +0 -0
  24. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/git_subtree.py +0 -0
  25. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/group.py +0 -0
  26. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/http.py +0 -0
  27. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/jwt.py +0 -0
  28. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/chat_session.py +0 -0
  29. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/history.py +0 -0
  30. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/input.py +0 -0
  31. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/llm_ask.py +0 -0
  32. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/previous-session.js +0 -0
  33. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/tool/__init__.py +0 -0
  34. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/tool/api.py +0 -0
  35. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/tool/cli.py +0 -0
  36. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/tool/file.py +0 -0
  37. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/tool/rag.py +0 -0
  38. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/tool/sub_agent.py +0 -0
  39. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/llm/tool/web.py +0 -0
  40. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/md5.py +0 -0
  41. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/__init__.py +0 -0
  42. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_input.py +0 -0
  43. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_task.py +0 -0
  44. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.coveragerc +0 -0
  45. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.flake8 +0 -0
  46. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.gitignore +0 -0
  47. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/README.md +0 -0
  48. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/__init__.py +0 -0
  49. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_task.py +0 -0
  50. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_util.py +0 -0
  51. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +0 -0
  52. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +0 -0
  53. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +0 -0
  54. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/gateway/view/content/my-module/my-entity.html +0 -0
  55. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_service.py +0 -0
  56. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_service_factory.py +0 -0
  57. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_db_repository.py +0 -0
  58. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_repository.py +0 -0
  59. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_repository_factory.py +0 -0
  60. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/schema/my_entity.py +0 -0
  61. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/test/my_module/my_entity/test_create_my_entity.py +0 -0
  62. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/test/my_module/my_entity/test_delete_my_entity.py +0 -0
  63. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/test/my_module/my_entity/test_read_my_entity.py +0 -0
  64. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/test/my_module/my_entity/test_update_my_entity.py +0 -0
  65. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +0 -0
  66. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +0 -0
  67. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/navigation_config_file.py +0 -0
  68. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +0 -0
  69. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/group.py +0 -0
  70. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +0 -0
  71. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +0 -0
  72. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +0 -0
  73. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/gateway/subroute/my_module.py +0 -0
  74. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/alembic.ini +0 -0
  75. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_api_client.py +0 -0
  76. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_client.py +0 -0
  77. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_client_factory.py +0 -0
  78. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_direct_client.py +0 -0
  79. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/README +0 -0
  80. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/env.py +0 -0
  81. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/script.py.mako +0 -0
  82. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/versions/.gitkeep +0 -0
  83. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration_metadata.py +0 -0
  84. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/route.py +0 -0
  85. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/service/__init__.py +0 -0
  86. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +0 -0
  87. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/navigation_config_file.py +0 -0
  88. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +0 -0
  89. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task_util.py +0 -0
  90. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +0 -0
  91. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/venv_task.py +0 -0
  92. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/__init__.py +0 -0
  93. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +0 -0
  94. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +0 -0
  95. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +0 -0
  96. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/db_engine_factory.py +0 -0
  97. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +0 -0
  98. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +0 -0
  99. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +0 -0
  100. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/schema.py +0 -0
  101. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +0 -0
  102. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +0 -0
  103. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +0 -0
  104. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +0 -0
  105. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +0 -0
  106. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +0 -0
  107. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/__init__.py +0 -0
  108. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/alembic.ini +0 -0
  109. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +0 -0
  110. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +0 -0
  111. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +0 -0
  112. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +0 -0
  113. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/README +0 -0
  114. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/env.py +0 -0
  115. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/script.py.mako +0 -0
  116. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +0 -0
  117. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/8ed025bcc845_create_permissions.py +0 -0
  118. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +0 -0
  119. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +0 -0
  120. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/__init__.py +0 -0
  121. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/__init__.py +0 -0
  122. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +0 -0
  123. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +0 -0
  124. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_db_repository.py +0 -0
  125. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +0 -0
  126. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository_factory.py +0 -0
  127. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/__init__.py +0 -0
  128. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_db_repository.py +0 -0
  129. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +0 -0
  130. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository_factory.py +0 -0
  131. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +0 -0
  132. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +0 -0
  133. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/__init__.py +0 -0
  134. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +0 -0
  135. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +0 -0
  136. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository_factory.py +0 -0
  137. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +0 -0
  138. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +0 -0
  139. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/alembic.ini +0 -0
  140. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/config/navigation.py +0 -0
  141. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/README +0 -0
  142. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/env.py +0 -0
  143. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/script.py.mako +0 -0
  144. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/versions/.gitkeep +0 -0
  145. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration_metadata.py +0 -0
  146. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +0 -0
  147. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/schema/navigation.py +0 -0
  148. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +0 -0
  149. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/auth.py +0 -0
  150. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +0 -0
  151. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/permission.html +0 -0
  152. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/role.html +0 -0
  153. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/user.html +0 -0
  154. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +0 -0
  155. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +0 -0
  156. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/login.html +0 -0
  157. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/logout.html +0 -0
  158. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/common/util.js +0 -0
  159. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/style.css +0 -0
  160. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/util.js +0 -0
  161. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/pico-style.css +0 -0
  162. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/script.js +0 -0
  163. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/style.css +0 -0
  164. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-192x192.png +0 -0
  165. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-512x512.png +0 -0
  166. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
  167. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.amber.min.css +0 -0
  168. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.blue.min.css +0 -0
  169. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.cyan.min.css +0 -0
  170. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.fuchsia.min.css +0 -0
  171. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.green.min.css +0 -0
  172. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.grey.min.css +0 -0
  173. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.indigo.min.css +0 -0
  174. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.jade.min.css +0 -0
  175. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.lime.min.css +0 -0
  176. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.min.css +0 -0
  177. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.orange.min.css +0 -0
  178. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pink.min.css +0 -0
  179. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pumpkin.min.css +0 -0
  180. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.purple.min.css +0 -0
  181. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.red.min.css +0 -0
  182. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.sand.min.css +0 -0
  183. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.slate.min.css +0 -0
  184. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.violet.min.css +0 -0
  185. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.yellow.min.css +0 -0
  186. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.zinc.min.css +0 -0
  187. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +0 -0
  188. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +0 -0
  189. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/__init__.py +0 -0
  190. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +0 -0
  191. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +0 -0
  192. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +0 -0
  193. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/template.env +0 -0
  194. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/_util/access_token.py +0 -0
  195. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_create_permission.py +0 -0
  196. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_delete_permission.py +0 -0
  197. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_read_permission.py +0 -0
  198. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_update_permission.py +0 -0
  199. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/test_user_session.py +0 -0
  200. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_health_and_readiness.py +0 -0
  201. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_homepage.py +0 -0
  202. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_not_found_error.py +0 -0
  203. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test.sh +0 -0
  204. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/add/fastapp/fastapp_util.py +0 -0
  205. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/create/__init__.py +0 -0
  206. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/create/project-template/README.md +0 -0
  207. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/create/project-template/zrb_init.py +0 -0
  208. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/project/create/project_task.py +0 -0
  209. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/python.py +0 -0
  210. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/random.py +0 -0
  211. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/asdf/asdf_helper.py +0 -0
  212. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/common_input.py +0 -0
  213. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/latex/ubuntu.py +0 -0
  214. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/tmux/tmux_config.sh +0 -0
  215. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/tmux/tmux_helper.py +0 -0
  216. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/zsh/zsh_config.sh +0 -0
  217. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/setup/zsh/zsh_helper.py +0 -0
  218. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/shell/__init__.py +0 -0
  219. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/shell/autocomplete/__init__.py +0 -0
  220. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/shell/autocomplete/bash.py +0 -0
  221. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/shell/autocomplete/subcmd.py +0 -0
  222. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/shell/autocomplete/zsh.py +0 -0
  223. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/todo.py +0 -0
  224. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/builtin/uuid.py +0 -0
  225. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/callback/__init__.py +0 -0
  226. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/callback/any_callback.py +0 -0
  227. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/callback/callback.py +0 -0
  228. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/cmd/__init__.py +0 -0
  229. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/cmd/cmd_result.py +0 -0
  230. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/cmd/cmd_val.py +0 -0
  231. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/content_transformer/__init__.py +0 -0
  232. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/content_transformer/any_content_transformer.py +0 -0
  233. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/content_transformer/content_transformer.py +0 -0
  234. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/context/__init__.py +0 -0
  235. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/context/any_context.py +0 -0
  236. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/context/any_shared_context.py +0 -0
  237. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/context/context.py +0 -0
  238. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/context/shared_context.py +0 -0
  239. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/dot_dict/__init__.py +0 -0
  240. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/dot_dict/dot_dict.py +0 -0
  241. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/env/__init__.py +0 -0
  242. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/env/any_env.py +0 -0
  243. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/env/env.py +0 -0
  244. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/env/env_file.py +0 -0
  245. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/env/env_map.py +0 -0
  246. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/group/__init__.py +0 -0
  247. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/group/any_group.py +0 -0
  248. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/group/group.py +0 -0
  249. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/input/__init__.py +0 -0
  250. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/input/any_input.py +0 -0
  251. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/input/base_input.py +0 -0
  252. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/input/bool_input.py +0 -0
  253. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/input/float_input.py +0 -0
  254. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/input/int_input.py +0 -0
  255. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/input/option_input.py +0 -0
  256. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/input/password_input.py +0 -0
  257. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/input/str_input.py +0 -0
  258. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/input/text_input.py +0 -0
  259. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/__init__.py +0 -0
  260. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/cli.py +0 -0
  261. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/common_util.py +0 -0
  262. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_app.py +0 -0
  263. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_auth_config.py +0 -0
  264. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/__init__.py +0 -0
  265. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/docs_route.py +0 -0
  266. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/error_page/serve_default_404.py +0 -0
  267. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/error_page/show_error_page.py +0 -0
  268. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/error_page/view.html +0 -0
  269. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/home_page/__init__.py +0 -0
  270. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/home_page/home_page_route.py +0 -0
  271. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/home_page/view.html +0 -0
  272. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/login_api_route.py +0 -0
  273. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/login_page/login_page_route.py +0 -0
  274. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/login_page/view.html +0 -0
  275. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/logout_api_route.py +0 -0
  276. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/logout_page/logout_page_route.py +0 -0
  277. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/logout_page/view.html +0 -0
  278. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/node_page/group/show_group_page.py +0 -0
  279. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/node_page/group/view.html +0 -0
  280. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/node_page/node_page_route.py +0 -0
  281. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/node_page/task/partial/input.html +0 -0
  282. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/node_page/task/show_task_page.py +0 -0
  283. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/node_page/task/view.html +0 -0
  284. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/refresh_token_api_route.py +0 -0
  285. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/global_template.html +0 -0
  286. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/refresh-token.template.js +0 -0
  287. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/common.css +0 -0
  288. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/common.js +0 -0
  289. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/favicon-32x32.png +0 -0
  290. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/login/event.js +0 -0
  291. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/logout/event.js +0 -0
  292. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.amber.min.css +0 -0
  293. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.blue.min.css +0 -0
  294. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.cyan.min.css +0 -0
  295. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.fuchsia.min.css +0 -0
  296. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.green.min.css +0 -0
  297. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.grey.min.css +0 -0
  298. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.indigo.min.css +0 -0
  299. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.jade.min.css +0 -0
  300. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.lime.min.css +0 -0
  301. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.min.css +0 -0
  302. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.orange.min.css +0 -0
  303. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.pink.min.css +0 -0
  304. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.pumpkin.min.css +0 -0
  305. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.purple.min.css +0 -0
  306. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.red.min.css +0 -0
  307. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.sand.min.css +0 -0
  308. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.slate.min.css +0 -0
  309. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.violet.min.css +0 -0
  310. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.yellow.min.css +0 -0
  311. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/pico-css/pico.zinc.min.css +0 -0
  312. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/session/common-util.js +0 -0
  313. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/session/current-session.js +0 -0
  314. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/session/event.js +0 -0
  315. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/resources/session/past-session.js +0 -0
  316. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/static/static_route.py +0 -0
  317. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/task_input_api_route.py +0 -0
  318. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_route/task_session_api_route.py +0 -0
  319. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_schema/session.py +0 -0
  320. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_schema/token.py +0 -0
  321. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_schema/user.py +0 -0
  322. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_util/cookie.py +0 -0
  323. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_util/html.py +0 -0
  324. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_util/token.py +0 -0
  325. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/runner/web_util/user.py +0 -0
  326. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/session/__init__.py +0 -0
  327. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/session/any_session.py +0 -0
  328. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/session_state_log/__init__.py +0 -0
  329. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/session_state_log/session_state_log.py +0 -0
  330. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/session_state_logger/__init__.py +0 -0
  331. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/session_state_logger/any_session_state_logger.py +0 -0
  332. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/session_state_logger/file_session_state_logger.py +0 -0
  333. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/session_state_logger/session_state_logger_factory.py +0 -0
  334. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/__init__.py +0 -0
  335. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/any_task.py +0 -0
  336. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/base/__init__.py +0 -0
  337. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/base/context.py +0 -0
  338. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/base/monitoring.py +0 -0
  339. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/base/operators.py +0 -0
  340. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/base_task.py +0 -0
  341. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/base_trigger.py +0 -0
  342. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/http_check.py +0 -0
  343. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/__init__.py +0 -0
  344. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/agent.py +0 -0
  345. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/config.py +0 -0
  346. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/context.py +0 -0
  347. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/context_enrichment.py +0 -0
  348. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/error.py +0 -0
  349. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/history.py +0 -0
  350. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/history_summarization.py +0 -0
  351. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/print_node.py +0 -0
  352. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/tool_wrapper.py +0 -0
  353. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm/typing.py +0 -0
  354. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/llm_task.py +0 -0
  355. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/make_task.py +0 -0
  356. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/rsync_task.py +0 -0
  357. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/scaffolder.py +0 -0
  358. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/scheduler.py +0 -0
  359. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/task.py +0 -0
  360. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task/tcp_check.py +0 -0
  361. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task_status/__init__.py +0 -0
  362. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/task_status/task_status.py +0 -0
  363. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/__init__.py +0 -0
  364. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/attr.py +0 -0
  365. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/cli/__init__.py +0 -0
  366. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/cli/style.py +0 -0
  367. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/cli/subcommand.py +0 -0
  368. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/cmd/__init__.py +0 -0
  369. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/cmd/remote.py +0 -0
  370. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/codemod/__init__.py +0 -0
  371. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/codemod/modification_mode.py +0 -0
  372. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/codemod/modify_class.py +0 -0
  373. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/codemod/modify_class_parent.py +0 -0
  374. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/codemod/modify_class_property.py +0 -0
  375. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/codemod/modify_dict.py +0 -0
  376. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/codemod/modify_function.py +0 -0
  377. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/codemod/modify_function_call.py +0 -0
  378. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/codemod/modify_method.py +0 -0
  379. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/codemod/modify_module.py +0 -0
  380. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/cron.py +0 -0
  381. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/file.py +0 -0
  382. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/git.py +0 -0
  383. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/git_subtree.py +0 -0
  384. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/group.py +0 -0
  385. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/init_path.py +0 -0
  386. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/load.py +0 -0
  387. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/run.py +0 -0
  388. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/string/__init__.py +0 -0
  389. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/string/conversion.py +0 -0
  390. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/string/format.py +0 -0
  391. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/string/name.py +0 -0
  392. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/util/todo.py +0 -0
  393. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/xcom/__init__.py +0 -0
  394. {zrb-1.8.1 → zrb-1.8.3}/src/zrb/xcom/xcom.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 1.8.1
3
+ Version: 1.8.3
4
4
  Summary: Your Automation Powerhouse
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later
@@ -194,6 +194,36 @@ Then open your browser and visit `http://localhost:21213`
194
194
  ![Zrb Web UI](https://raw.githubusercontent.com/state-alchemists/zrb/main/_images/zrb-web-ui.png)
195
195
 
196
196
 
197
+ # 🐋 Running Zrb as a Container
198
+
199
+ Zrb can be run in a containerized environment, offering two distinct versions to suit different needs:
200
+
201
+ - **Standard Version**: Ideal for general use cases where Docker CLI access is not required.
202
+ - **Dind (Docker in Docker) Version**: Includes built-in Docker commands, perfect for scenarios where you need to access the host's Docker CLI.
203
+
204
+ ### Standard Version
205
+
206
+ The standard version of the Zrb container is suitable for most automation tasks. To run this version, execute the following command:
207
+
208
+ ```bash
209
+ # Replace <host-path> and <container-path> with your desired paths
210
+ docker run -v ${HOME}:/zrb-home -it --rm stalchmst/zrb:1.8.1 zrb
211
+ ```
212
+
213
+ ### Dind Version
214
+
215
+ The Dind version is tailored for advanced use cases where Docker commands need to be executed within the container. This version allows the container to interact with the host's Docker daemon. To run the Dind version, use the command below:
216
+
217
+ ```bash
218
+ # Replace <host-path> and <container-path> with your desired paths
219
+ docker run \
220
+ -v ${HOME}:/zrb-home \
221
+ -v /var/run/docker.sock:/var/run/docker.sock \
222
+ -it --rm stalchmst/zrb:1.8.1-dind docker ps
223
+ ```
224
+
225
+ > **Note:** The Dind (Docker in Docker) version of the container is larger in size compared to the standard version due to the inclusion of Docker CLI tools. Consider this when choosing the appropriate version for your needs.
226
+
197
227
  # 🎥 Demo & Documentation
198
228
 
199
229
  - **Full documentation:** [Zrb Documentation](https://github.com/state-alchemists/zrb/blob/main/docs/README.md)
@@ -214,7 +244,7 @@ Then open your browser and visit `http://localhost:21213`
214
244
 
215
245
  If you find Zrb valuable, please consider donating:
216
246
 
217
- [![](https://raw.githubusercontent.com/state-alchemists/zrb/main/_images/donator.png)](https://stalchmst.com/donation)
247
+ [![](https://raw.githubusercontent.com/state-alchemists/zrb/main/_images/donator.png)](https://stalchmst.com)
218
248
 
219
249
  # 🎉 Fun Fact
220
250
 
@@ -156,6 +156,36 @@ Then open your browser and visit `http://localhost:21213`
156
156
  ![Zrb Web UI](https://raw.githubusercontent.com/state-alchemists/zrb/main/_images/zrb-web-ui.png)
157
157
 
158
158
 
159
+ # 🐋 Running Zrb as a Container
160
+
161
+ Zrb can be run in a containerized environment, offering two distinct versions to suit different needs:
162
+
163
+ - **Standard Version**: Ideal for general use cases where Docker CLI access is not required.
164
+ - **Dind (Docker in Docker) Version**: Includes built-in Docker commands, perfect for scenarios where you need to access the host's Docker CLI.
165
+
166
+ ### Standard Version
167
+
168
+ The standard version of the Zrb container is suitable for most automation tasks. To run this version, execute the following command:
169
+
170
+ ```bash
171
+ # Replace <host-path> and <container-path> with your desired paths
172
+ docker run -v ${HOME}:/zrb-home -it --rm stalchmst/zrb:1.8.1 zrb
173
+ ```
174
+
175
+ ### Dind Version
176
+
177
+ The Dind version is tailored for advanced use cases where Docker commands need to be executed within the container. This version allows the container to interact with the host's Docker daemon. To run the Dind version, use the command below:
178
+
179
+ ```bash
180
+ # Replace <host-path> and <container-path> with your desired paths
181
+ docker run \
182
+ -v ${HOME}:/zrb-home \
183
+ -v /var/run/docker.sock:/var/run/docker.sock \
184
+ -it --rm stalchmst/zrb:1.8.1-dind docker ps
185
+ ```
186
+
187
+ > **Note:** The Dind (Docker in Docker) version of the container is larger in size compared to the standard version due to the inclusion of Docker CLI tools. Consider this when choosing the appropriate version for your needs.
188
+
159
189
  # 🎥 Demo & Documentation
160
190
 
161
191
  - **Full documentation:** [Zrb Documentation](https://github.com/state-alchemists/zrb/blob/main/docs/README.md)
@@ -176,7 +206,7 @@ Then open your browser and visit `http://localhost:21213`
176
206
 
177
207
  If you find Zrb valuable, please consider donating:
178
208
 
179
- [![](https://raw.githubusercontent.com/state-alchemists/zrb/main/_images/donator.png)](https://stalchmst.com/donation)
209
+ [![](https://raw.githubusercontent.com/state-alchemists/zrb/main/_images/donator.png)](https://stalchmst.com)
180
210
 
181
211
  # 🎉 Fun Fact
182
212
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "zrb"
3
- version = "1.8.1"
3
+ version = "1.8.3"
4
4
  description = "Your Automation Powerhouse"
5
5
  authors = ["Go Frendi Gunawan <gofrendiasgard@gmail.com>"]
6
6
  license = "AGPL-3.0-or-later"
@@ -60,8 +60,9 @@ def serve_cli():
60
60
  # run the CLI
61
61
  cli.run(sys.argv[1:])
62
62
  except KeyboardInterrupt:
63
+ # The exception is handled by the task runner
63
64
  print(stylize_warning("\nStopped"), file=sys.stderr)
64
- sys.exit(1)
65
+ pass
65
66
  except RuntimeError as e:
66
67
  if f"{e}".lower() != "event loop is closed":
67
68
  raise e
@@ -22,6 +22,7 @@ install_asdf_prerequisites = CmdTask(
22
22
  name="install-asdf-prerequisites",
23
23
  input=[package_manager_input, use_sudo_input],
24
24
  cmd=get_install_prerequisites_cmd,
25
+ is_interactive=True,
25
26
  )
26
27
 
27
28
 
@@ -13,6 +13,7 @@ install_tmux = CmdTask(
13
13
  name="install-tmux",
14
14
  input=[package_manager_input, use_sudo_input],
15
15
  cmd=get_install_tmux_cmd,
16
+ is_interactive=True,
16
17
  )
17
18
 
18
19
 
@@ -1,10 +1,18 @@
1
1
  from zrb.builtin.group import setup_group
2
2
  from zrb.task.cmd_task import CmdTask
3
3
 
4
- update_ubuntu = CmdTask(name="update-ubuntu", cmd="sudo apt update", render_cmd=False)
4
+ update_ubuntu = CmdTask(
5
+ name="update-ubuntu",
6
+ cmd="sudo apt update",
7
+ render_cmd=False,
8
+ is_interactive=True,
9
+ )
5
10
 
6
11
  upgrade_todo = CmdTask(
7
- name="upgrade-ubuntu", cmd="sudo apt upgrade -y", render_cmd=False
12
+ name="upgrade-ubuntu",
13
+ cmd="sudo apt upgrade -y",
14
+ render_cmd=False,
15
+ is_interactive=True,
8
16
  )
9
17
  update_ubuntu >> upgrade_todo
10
18
 
@@ -22,6 +30,7 @@ setup_ubuntu = setup_group.add_task(
22
30
  "cmake make tree tmux zsh neovim xdotool xsel",
23
31
  ],
24
32
  render_cmd=False,
33
+ is_interactive=True,
25
34
  ),
26
35
  alias="ubuntu",
27
36
  )
@@ -13,6 +13,7 @@ install_zsh = CmdTask(
13
13
  name="install-zsh",
14
14
  input=[package_manager_input, use_sudo_input],
15
15
  cmd=get_install_zsh_cmd,
16
+ is_interactive=True,
16
17
  )
17
18
 
18
19
  install_omz = CmdTask(
@@ -14,7 +14,7 @@ _DEFAULT_BANNER = """
14
14
  zzzzz rr bbbbbb {VERSION} Janggala
15
15
  _ _ . . . _ . _ . . .
16
16
  Your Automation Powerhouse
17
- ☕ Donate at: https://stalchmst.com/donation
17
+ ☕ Donate at: https://stalchmst.com
18
18
  🐙 Submit issues/PR at: https://github.com/state-alchemists/zrb
19
19
  🐤 Follow us at: https://twitter.com/zarubastalchmst
20
20
  """
@@ -229,10 +229,6 @@ class Config:
229
229
  def LLM_PERSONA(self) -> str | None:
230
230
  return os.getenv("ZRB_LLM_PERSONA", None)
231
231
 
232
- @property
233
- def LLM_CODE_REVIEW_INSTRUCTION_PROMPT(self) -> str | None:
234
- return os.getenv("ZRB_LLM_CODE_REVIEW_INSTRUCTION_PROMPT", None)
235
-
236
232
  @property
237
233
  def LLM_SPECIAL_INSTRUCTION_PROMPT(self) -> str | None:
238
234
  return os.getenv("ZRB_LLM_SPECIAL_INSTRUCTION_PROMPT", None)
@@ -51,9 +51,9 @@ another JSON object with these details (i.e., {"response": {"context_name": "val
51
51
  If no context can be extracted, return {"response": {}}.
52
52
  """.strip()
53
53
 
54
- DEFAULT_SPECIAL_INSTRUCTION_PROMPT = "" # Default to empty
55
- DEFAULT_CODE_REVIEW_INSTRUCTION_PROMPT = """
56
- Your goal is to review code provided by the user for correctness, readability,
54
+ DEFAULT_SPECIAL_INSTRUCTION_PROMPT = """
55
+ # Coding and Code Review
56
+ When asked to do coding/code review related task, you prioritize correctness, readability,
57
57
  performance, security, and maintainability.
58
58
  Follow these principles:
59
59
  1. **Correctness** Check whether the code performs the intended logic,
@@ -66,9 +66,10 @@ Follow these principles:
66
66
  that could lead to security issues.
67
67
  5. **Consistency** Ensure the code adheres to common language idioms,
68
68
  style guides, and project conventions.
69
- Provide clear, concise, and actionable feedback.
70
- Use inline code examples when helpful.
71
- Do not restate the code unnecessarily.
69
+
70
+ ## Code Review
71
+ When asked to do code review, you provide clear, concise, and actionable feedback.
72
+ Use inline code examples when helpful. Do not restate the code unnecessarily.
72
73
  Focus on meaningful insights that help the user improve the code quality.
73
74
  Avoid excessive nitpicking unless requested.
74
75
  """.strip()
@@ -84,7 +85,6 @@ class LLMConfig:
84
85
  default_persona: str | None = None,
85
86
  default_system_prompt: str | None = None,
86
87
  default_special_instruction_prompt: str | None = None,
87
- default_code_review_instruction_prompt: str | None = None,
88
88
  default_summarization_prompt: str | None = None,
89
89
  default_context_enrichment_prompt: str | None = None,
90
90
  default_summarize_history: bool | None = None,
@@ -101,9 +101,6 @@ class LLMConfig:
101
101
  self._default_persona = default_persona
102
102
  self._default_system_prompt = default_system_prompt
103
103
  self._default_special_instruction_prompt = default_special_instruction_prompt
104
- self._default_code_review_instruction_prompt = (
105
- default_code_review_instruction_prompt
106
- )
107
104
  self._default_summarization_prompt = default_summarization_prompt
108
105
  self._default_context_enrichment_prompt = default_context_enrichment_prompt
109
106
  self._default_summarize_history = default_summarize_history
@@ -175,14 +172,6 @@ class LLMConfig:
175
172
  return CFG.LLM_PERSONA
176
173
  return DEFAULT_PERSONA
177
174
 
178
- @property
179
- def default_code_review_instruction_prompt(self) -> str:
180
- if self._default_code_review_instruction_prompt is not None:
181
- return self._default_code_review_instruction_prompt
182
- if CFG.LLM_CODE_REVIEW_INSTRUCTION_PROMPT is not None:
183
- return CFG.LLM_CODE_REVIEW_INSTRUCTION_PROMPT
184
- return DEFAULT_CODE_REVIEW_INSTRUCTION_PROMPT
185
-
186
175
  @property
187
176
  def default_special_instruction_prompt(self) -> str:
188
177
  if self._default_special_instruction_prompt is not None:
@@ -51,9 +51,9 @@ class Session(AnySession):
51
51
  self._shared_ctx = shared_ctx
52
52
  self._shared_ctx.set_session(self)
53
53
  self._parent = parent
54
- self._action_coros: dict[AnyTask, Coroutine] = {}
55
- self._monitoring_coros: dict[AnyTask, Coroutine] = {}
56
- self._coros: list[Coroutine] = []
54
+ self._action_coros: dict[AnyTask, asyncio.Task] = {}
55
+ self._monitoring_coros: dict[AnyTask, asyncio.Task] = {}
56
+ self._coros: list[asyncio.Task] = []
57
57
  self._colors = [
58
58
  GREEN,
59
59
  YELLOW,
@@ -100,6 +100,12 @@ class Session(AnySession):
100
100
  self._is_terminated = True
101
101
  for task_status in self._task_status.values():
102
102
  task_status.mark_as_terminated()
103
+ for task in self._action_coros.values():
104
+ task.cancel()
105
+ for task in self._monitoring_coros.values():
106
+ task.cancel()
107
+ for task in self._coros:
108
+ task.cancel()
103
109
 
104
110
  @property
105
111
  def is_terminated(self) -> bool:
@@ -180,16 +186,17 @@ class Session(AnySession):
180
186
 
181
187
  def defer_monitoring(self, task: AnyTask, coro: Coroutine):
182
188
  self._register_single_task(task)
183
- self._monitoring_coros[task] = coro
189
+ self._monitoring_coros[task] = asyncio.create_task(coro)
184
190
 
185
191
  def defer_action(self, task: AnyTask, coro: Coroutine):
186
192
  self._register_single_task(task)
187
- self._action_coros[task] = coro
193
+ self._action_coros[task] = asyncio.create_task(coro)
188
194
 
189
195
  def defer_coro(self, coro: Coroutine):
190
- self._coros.append(coro)
196
+ task = asyncio.create_task(coro)
197
+ self._coros.append(task)
191
198
  self._coros = [
192
- existing_coro for existing_coro in self._coros if not existing_coro.done()
199
+ existing_task for existing_task in self._coros if not existing_task.done()
193
200
  ]
194
201
 
195
202
  async def wait_deferred(self):
@@ -175,8 +175,7 @@ async def execute_action_with_retry(task: "BaseTask", session: AnySession) -> An
175
175
  ctx.log_warning("Task cancelled or interrupted")
176
176
  session.get_task_status(task).mark_as_failed() # Mark as failed on cancel
177
177
  # Do not trigger fallbacks/successors on cancellation
178
- return # Or re-raise? Depends on desired cancellation behavior
179
-
178
+ raise
180
179
  except BaseException as e:
181
180
  ctx.log_error(f"Attempt {attempt + 1}/{max_attempt} failed: {e}")
182
181
  session.get_task_status(
@@ -38,26 +38,30 @@ async def run_and_cleanup(
38
38
  ctx = task.get_ctx(session) # Get context for logging
39
39
  ctx.log_info("Terminating session after run completion/error.")
40
40
  session.terminate()
41
-
42
41
  # Clean up other potentially running asyncio tasks (excluding the main one)
43
42
  # Be cautious with blanket cancellation if other background tasks are expected
44
- pending = [
45
- t for t in asyncio.all_tasks() if t is not main_task_coro and not t.done()
46
- ]
47
- if pending:
48
- ctx = task.get_ctx(session) # Get context for logging
49
- ctx.log_debug(f"Cleaning up {len(pending)} pending asyncio tasks...")
50
- for t in pending:
51
- t.cancel()
52
- try:
53
- # Give cancelled tasks a moment to process cancellation
54
- await asyncio.wait(pending, timeout=1.0)
55
- except asyncio.CancelledError:
56
- # Expected if tasks handle cancellation promptly
57
- pass
58
- except Exception as cleanup_exc:
59
- # Log errors during cleanup if necessary
60
- ctx.log_warning(f"Error during task cleanup: {cleanup_exc}")
43
+ try:
44
+ pending = [
45
+ t
46
+ for t in asyncio.all_tasks()
47
+ if t is not main_task_coro and not t.done()
48
+ ]
49
+ if pending:
50
+ ctx = task.get_ctx(session) # Get context for logging
51
+ ctx.log_debug(f"Cleaning up {len(pending)} pending asyncio tasks...")
52
+ for t in pending:
53
+ t.cancel()
54
+ try:
55
+ # Give cancelled tasks a moment to process cancellation
56
+ await asyncio.wait(pending, timeout=1.0)
57
+ except asyncio.CancelledError:
58
+ # Expected if tasks handle cancellation promptly
59
+ pass
60
+ except Exception as cleanup_exc:
61
+ # Log errors during cleanup if necessary
62
+ ctx.log_warning(f"Error during task cleanup: {cleanup_exc}")
63
+ except RuntimeError as cleanup_exc:
64
+ ctx.log_warning(f"Error during task cleanup: {cleanup_exc}")
61
65
 
62
66
 
63
67
  async def run_task_async(
@@ -48,6 +48,7 @@ class CmdTask(BaseTask):
48
48
  warn_unrecommended_command: bool | None = None,
49
49
  max_output_line: int = 1000,
50
50
  max_error_line: int = 1000,
51
+ is_interactive: bool = False,
51
52
  execute_condition: BoolAttr = True,
52
53
  retries: int = 2,
53
54
  retry_period: float = 0,
@@ -104,6 +105,7 @@ class CmdTask(BaseTask):
104
105
  self._max_error_line = max_error_line
105
106
  self._should_plain_print = plain_print
106
107
  self._should_warn_unrecommended_command = warn_unrecommended_command
108
+ self._is_interactive = is_interactive
107
109
 
108
110
  async def _exec_action(self, ctx: AnyContext) -> CmdResult:
109
111
  """Turn _cmd attribute into subprocess.Popen and execute it as task's action.
@@ -140,6 +142,7 @@ class CmdTask(BaseTask):
140
142
  register_pid_method=lambda pid: ctx.xcom.get(xcom_pid_key).push(pid),
141
143
  max_output_line=self._max_output_line,
142
144
  max_error_line=self._max_error_line,
145
+ is_interactive=self._is_interactive,
143
146
  )
144
147
  # Check for errors
145
148
  if return_code > 0:
@@ -52,19 +52,7 @@ def get_special_instruction_prompt(
52
52
  )
53
53
  if special_instruction is not None:
54
54
  return special_instruction
55
- aggregated_special_instruction = ""
56
- if llm_config.default_code_review_instruction_prompt:
57
- aggregated_special_instruction += "\n".join(
58
- [
59
- "# Code review instruction",
60
- llm_config.default_code_review_instruction_prompt,
61
- ]
62
- )
63
- if llm_config.default_special_instruction_prompt:
64
- aggregated_special_instruction += "\n" + "\n".join(
65
- ["# Code review instruction", llm_config.default_special_instruction_prompt]
66
- )
67
- return aggregated_special_instruction or ""
55
+ return llm_config.default_special_instruction_prompt
68
56
 
69
57
 
70
58
  def get_combined_system_prompt(
@@ -0,0 +1,192 @@
1
+ import asyncio
2
+ import os
3
+ import re
4
+ import signal
5
+ import sys
6
+ from collections import deque
7
+ from collections.abc import Callable
8
+ from typing import TextIO
9
+
10
+ import psutil
11
+
12
+ from zrb.cmd.cmd_result import CmdResult
13
+
14
+
15
+ def check_unrecommended_commands(cmd_script: str) -> dict[str, str]:
16
+ """
17
+ Check a command script for the use of unrecommended or non-POSIX compliant commands.
18
+
19
+ Args:
20
+ cmd_script (str): The command script string to check.
21
+
22
+ Returns:
23
+ dict[str, str]: A dictionary where keys are the violating commands/patterns
24
+ and values are the reasons they are unrecommended.
25
+ """
26
+ banned_commands = {
27
+ "<(": "Process substitution isn't POSIX compliant and causes trouble",
28
+ "column": "Command isn't included in Ubuntu packages and is not POSIX compliant",
29
+ "echo": "echo isn't consistent across OS; use printf instead",
30
+ "eval": "Avoid eval as it can accidentally execute arbitrary strings",
31
+ "realpath": "Not available by default on OSX",
32
+ "source": "Not POSIX compliant; use '.' instead",
33
+ " test": "Use '[' instead for consistency",
34
+ "which": "Command in not POSIX compliant, use command -v",
35
+ }
36
+ banned_commands_regex = {
37
+ r"grep.* -y": "grep -y does not work on Alpine; use grep -i",
38
+ r"grep.* -P": "grep -P is not valid on OSX",
39
+ r"grep[^|]+--\w{2,}": "grep long commands do not work on Alpine",
40
+ r'readlink.+-.*f.+["$]': "readlink -f behaves differently on OSX",
41
+ r"sort.*-V": "sort -V is not supported everywhere",
42
+ r"sort.*--sort-versions": "sort --sort-version is not supported everywhere",
43
+ r"\bls ": "Avoid using ls; use shell globs or find instead",
44
+ }
45
+ violations = {}
46
+ # Check banned commands
47
+ for cmd, reason in banned_commands.items():
48
+ if cmd in cmd_script:
49
+ violations[cmd] = reason
50
+ # Check banned regex patterns
51
+ for pattern, reason in banned_commands_regex.items():
52
+ if re.search(pattern, cmd_script):
53
+ violations[pattern] = reason
54
+ return violations
55
+
56
+
57
+ async def run_command(
58
+ cmd: list[str],
59
+ cwd: str | None = None,
60
+ env_map: dict[str, str] | None = None,
61
+ print_method: Callable[..., None] | None = None,
62
+ register_pid_method: Callable[[int], None] | None = None,
63
+ max_output_line: int = 1000,
64
+ max_error_line: int = 1000,
65
+ is_interactive: bool = False,
66
+ ) -> tuple[CmdResult, int]:
67
+ """
68
+ Executes a command using the robust `readline` strategy with a memory
69
+ limit, and correctly handles terminal control characters in the output.
70
+ Please note that `interactive` execution is generally not recommended and thus
71
+ disabled by default.
72
+ When using `interactive execution, the command will not be started in new session
73
+ and will share the same stdin as the main process, which might trigger race condition.
74
+ You can use interactive execution for a limited usecase when the command
75
+ require user input.
76
+ """
77
+ actual_print_method = print_method if print_method is not None else print
78
+ if cwd is None:
79
+ cwd = os.getcwd()
80
+ # While environment variables alone weren't the fix, they are still
81
+ # good practice for encouraging simpler output from tools.
82
+ child_env = (env_map or os.environ).copy()
83
+ child_env["TERM"] = "xterm-256color" # A capable but standard terminal
84
+ child_env["NO_COLOR"] = "0" # Explicitly allow color
85
+ cmd_process = await asyncio.create_subprocess_exec(
86
+ *cmd,
87
+ cwd=cwd,
88
+ env=child_env,
89
+ start_new_session=not is_interactive,
90
+ stdin=__get_cmd_stdin(is_interactive),
91
+ stdout=asyncio.subprocess.PIPE,
92
+ stderr=asyncio.subprocess.PIPE,
93
+ limit=10 * 10 * 1024, # Buffer memory limit
94
+ )
95
+ if register_pid_method is not None:
96
+ register_pid_method(cmd_process.pid)
97
+ # Use the new, simple, and correct stream reader.
98
+ stdout_task = asyncio.create_task(
99
+ __read_stream(cmd_process.stdout, actual_print_method, max_output_line)
100
+ )
101
+ stderr_task = asyncio.create_task(
102
+ __read_stream(cmd_process.stderr, actual_print_method, max_error_line)
103
+ )
104
+ try:
105
+ return_code = await cmd_process.wait()
106
+ stdout, stderr = await asyncio.gather(stdout_task, stderr_task)
107
+ return CmdResult(stdout, stderr), return_code
108
+ except (KeyboardInterrupt, asyncio.CancelledError):
109
+ try:
110
+ os.killpg(cmd_process.pid, signal.SIGINT)
111
+ await asyncio.wait_for(cmd_process.wait(), timeout=2.0)
112
+ except asyncio.TimeoutError:
113
+ # If it doesn't terminate, kill it forcefully
114
+ actual_print_method(
115
+ f"Process {cmd_process.pid} did not terminate gracefully, killing."
116
+ )
117
+ kill_pid(cmd_process.pid, print_method=actual_print_method)
118
+ except Exception:
119
+ pass
120
+ # Final cleanup
121
+ stdout_task.cancel()
122
+ stderr_task.cancel()
123
+ await asyncio.gather(stdout_task, stderr_task, return_exceptions=True)
124
+ raise
125
+
126
+
127
+ def __get_cmd_stdin(is_interactive: bool) -> int | TextIO:
128
+ if is_interactive and sys.stdin.isatty():
129
+ return sys.stdin
130
+ return asyncio.subprocess.DEVNULL
131
+
132
+
133
+ async def __read_stream(
134
+ stream: asyncio.StreamReader,
135
+ print_method: Callable[..., None],
136
+ max_lines: int,
137
+ ) -> str:
138
+ """
139
+ Reads from the stream using the robust `readline()` and correctly
140
+ interprets carriage returns (`\r`) as distinct print events.
141
+ """
142
+ captured_lines = deque(maxlen=max_lines if max_lines > 0 else 0)
143
+ while True:
144
+ try:
145
+ line_bytes = await stream.readline()
146
+ if not line_bytes:
147
+ break
148
+ except ValueError:
149
+ # Safety valve for the memory limit.
150
+ error_msg = "[ERROR] A single line of output was too long to process."
151
+ print_method(error_msg)
152
+ if max_lines > 0:
153
+ captured_lines.append(error_msg)
154
+ break
155
+ except (KeyboardInterrupt, asyncio.CancelledError):
156
+ raise
157
+ except Exception:
158
+ break
159
+ decoded_line = line_bytes.decode("utf-8", errors="replace")
160
+ parts = decoded_line.replace("\r", "\n").splitlines()
161
+ for part in parts:
162
+ clean_part = part.rstrip()
163
+ if clean_part:
164
+ try:
165
+ print_method(clean_part, end="\r\n")
166
+ except Exception:
167
+ print_method(clean_part)
168
+ if max_lines > 0:
169
+ captured_lines.append(clean_part)
170
+ return "\r\n".join(captured_lines)
171
+
172
+
173
+ def kill_pid(pid: int, print_method: Callable[..., None] | None = None):
174
+ """
175
+ Kill a process and its children given the parent process ID.
176
+
177
+ Args:
178
+ pid (int): The process ID of the parent process.
179
+ print_method (Callable[..., None] | None): A method to print status messages.
180
+ Defaults to the built-in print function.
181
+ """
182
+ actual_print_method = print_method if print_method is not None else print
183
+ try:
184
+ parent = psutil.Process(pid)
185
+ children = parent.children(recursive=True)
186
+ for child in children:
187
+ actual_print_method(f"Killing child process {child.pid}")
188
+ child.kill()
189
+ actual_print_method(f"Killing process {pid}")
190
+ parent.kill()
191
+ except psutil.NoSuchProcess:
192
+ actual_print_method(f"Process with pid: {pid} already terminated")