10xscale-agentflow-cli 0.3.0__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 (154) hide show
  1. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/PKG-INFO +23 -4
  2. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/SOURCES.txt +38 -2
  3. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/requires.txt +6 -2
  4. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/MANIFEST.in +1 -0
  5. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/PKG-INFO +23 -4
  6. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/README.md +18 -1
  7. 10xscale_agentflow_cli-0.3.2/agentflow.json +15 -0
  8. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/commands/skills.py +306 -0
  9. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/main.py +62 -0
  10. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/SKILL.md +102 -0
  11. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/agents-and-tools.md +65 -0
  12. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/api-client.md +67 -0
  13. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/api-configuration.md +74 -0
  14. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/api-settings-and-middleware.md +90 -0
  15. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/architecture.md +55 -0
  16. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/auth-and-authorization.md +88 -0
  17. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/callbacks-and-command.md +266 -0
  18. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/checkpointing-and-threads.md +63 -0
  19. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/cli-commands.md +73 -0
  20. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/client-auth-and-errors.md +95 -0
  21. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/client-messages-invoke-stream.md +117 -0
  22. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/client-threads-memory-files.md +82 -0
  23. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/context-id-background.md +82 -0
  24. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/dependency-injection.md +58 -0
  25. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/id-and-thread-name-generators.md +71 -0
  26. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/media-and-files.md +66 -0
  27. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/memory-and-store.md +70 -0
  28. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/prebuilt-agents-and-tools.md +60 -0
  29. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/production-runtime.md +56 -0
  30. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/providers-and-adapters.md +81 -0
  31. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/publishers-and-runtime-protocols.md +78 -0
  32. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/rate-limiting.md +194 -0
  33. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/remote-tools.md +86 -0
  34. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/rest-api-and-errors.md +93 -0
  35. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/security-and-validators.md +69 -0
  36. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/state-and-messages.md +68 -0
  37. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/state-graph.md +67 -0
  38. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/streaming.md +53 -0
  39. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/testing-and-evaluation.md +66 -0
  40. 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/copilot/agentflow.instructions.md +54 -0
  41. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/jwt_auth.py +12 -1
  42. 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/config/graph_config.py +248 -0
  43. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/setup_middleware.py +35 -1
  44. 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/__init__.py +25 -0
  45. 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/__init__.py +15 -0
  46. 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/base.py +27 -0
  47. 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/factory.py +98 -0
  48. 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/memory.py +98 -0
  49. 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/middleware.py +93 -0
  50. 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/redis.py +115 -0
  51. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/main.py +6 -1
  52. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/media/extractor.py +1 -1
  53. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/pyproject.toml +11 -4
  54. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/requirements.txt +0 -2
  55. 10xscale_agentflow_cli-0.3.0/ActionPlan.md +0 -712
  56. 10xscale_agentflow_cli-0.3.0/agentflow.json +0 -6
  57. 10xscale_agentflow_cli-0.3.0/agentflow_cli/src/app/core/config/graph_config.py +0 -86
  58. 10xscale_agentflow_cli-0.3.0/agentflow_cli/src/app/core/middleware/__init__.py +0 -11
  59. 10xscale_agentflow_cli-0.3.0/plan.md +0 -190
  60. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/dependency_links.txt +0 -0
  61. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/entry_points.txt +0 -0
  62. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/not-zip-safe +0 -0
  63. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/top_level.txt +0 -0
  64. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/__init__.py +0 -0
  65. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/__init__.py +0 -0
  66. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/commands/__init__.py +0 -0
  67. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/commands/api.py +0 -0
  68. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/commands/build.py +0 -0
  69. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/commands/init.py +0 -0
  70. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/commands/version.py +0 -0
  71. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/constants.py +0 -0
  72. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/core/__init__.py +0 -0
  73. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/core/config.py +0 -0
  74. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/core/output.py +0 -0
  75. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/core/validation.py +0 -0
  76. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/exceptions.py +0 -0
  77. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/logger.py +0 -0
  78. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/templates/__init__.py +0 -0
  79. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/templates/defaults.py +0 -0
  80. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/__init__.py +0 -0
  81. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/__init__.py +0 -0
  82. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/__init__.py +0 -0
  83. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/__init__.py +0 -0
  84. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/auth_backend.py +0 -0
  85. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/authorization.py +0 -0
  86. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/base_auth.py +0 -0
  87. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/permissions.py +0 -0
  88. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/__init__.py +0 -0
  89. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/media_settings.py +0 -0
  90. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/sentry_config.py +0 -0
  91. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/settings.py +0 -0
  92. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/setup_logs.py +0 -0
  93. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/worker_middleware.py +0 -0
  94. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/exceptions/__init__.py +0 -0
  95. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/exceptions/general_exception.py +0 -0
  96. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/exceptions/handle_errors.py +0 -0
  97. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/exceptions/resources_exceptions.py +0 -0
  98. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/exceptions/user_exception.py +0 -0
  99. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/middleware/request_limits.py +0 -0
  100. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/middleware/security_headers.py +0 -0
  101. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/utils/__init__.py +0 -0
  102. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/utils/log_sanitizer.py +0 -0
  103. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/loader.py +0 -0
  104. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/__init__.py +0 -0
  105. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/a2a.py +0 -0
  106. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/a2ui.py +0 -0
  107. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/__init__.py +0 -0
  108. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/router.py +0 -0
  109. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/schemas/__init__.py +0 -0
  110. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/schemas/checkpointer_schemas.py +0 -0
  111. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/services/__init__.py +0 -0
  112. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/services/checkpointer_service.py +0 -0
  113. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/__init__.py +0 -0
  114. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/router.py +0 -0
  115. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/schemas/__init__.py +0 -0
  116. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/schemas/graph_schemas.py +0 -0
  117. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/services/__init__.py +0 -0
  118. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/services/graph_service.py +0 -0
  119. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/services/multimodal_preprocessor.py +0 -0
  120. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/media/__init__.py +0 -0
  121. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/media/router.py +0 -0
  122. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/media/schemas.py +0 -0
  123. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/ping/__init__.py +0 -0
  124. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/ping/router.py +0 -0
  125. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/setup_router.py +0 -0
  126. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/__init__.py +0 -0
  127. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/router.py +0 -0
  128. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/schemas/__init__.py +0 -0
  129. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/schemas/store_schemas.py +0 -0
  130. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/services/__init__.py +0 -0
  131. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/services/store_service.py +0 -0
  132. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/tasks/__init__.py +0 -0
  133. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/tasks/user_tasks.py +0 -0
  134. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/__init__.py +0 -0
  135. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/callable_helper.py +0 -0
  136. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/media/__init__.py +0 -0
  137. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/media/pipeline.py +0 -0
  138. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/parse_output.py +0 -0
  139. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/response_helper.py +0 -0
  140. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/schemas/__init__.py +0 -0
  141. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/schemas/output_schemas.py +0 -0
  142. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/schemas/user_schemas.py +0 -0
  143. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/snowflake_id_generator.py +0 -0
  144. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/swagger_helper.py +0 -0
  145. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/thread_name_generator.py +0 -0
  146. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/worker.py +0 -0
  147. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/graph/__init__.py +0 -0
  148. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/graph/react.py +0 -0
  149. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/graph/thread_name_generator.py +0 -0
  150. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/scripts/generate_docs.py +0 -0
  151. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/setup.cfg +0 -0
  152. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/tests/test_multimodal_sprint2_extraction.py +0 -0
  153. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/tests/test_sprint4_media_api.py +0 -0
  154. {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/tests/test_utils_parse_and_callable.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: 10xscale-agentflow-cli
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: CLI and API for 10xscale AgentFlow
5
5
  Author-email: 10xscale <contact@10xscale.ai>
6
6
  Maintainer-email: Shudipto Trafder <shudiptotrafder@gmail.com>
@@ -31,8 +31,6 @@ Requires-Dist: pydantic-settings
31
31
  Requires-Dist: uvicorn
32
32
  Requires-Dist: typer
33
33
  Requires-Dist: python-dotenv
34
- Requires-Dist: PyJWT
35
- Requires-Dist: textxtract[docx,html,md,pdf,xml]>=0.2.0
36
34
  Provides-Extra: sentry
37
35
  Requires-Dist: sentry-sdk>=2.10.0; extra == "sentry"
38
36
  Provides-Extra: firebase
@@ -42,6 +40,10 @@ Provides-Extra: snowflakekit
42
40
  Requires-Dist: snowflakekit; extra == "snowflakekit"
43
41
  Provides-Extra: redis
44
42
  Requires-Dist: redis>=5.0.7; extra == "redis"
43
+ Provides-Extra: jwt
44
+ Requires-Dist: PyJWT; extra == "jwt"
45
+ Provides-Extra: media
46
+ Requires-Dist: textxtract[docx,html,md,pdf,xml]>=0.2.0; extra == "media"
45
47
  Provides-Extra: gcloud
46
48
  Requires-Dist: google-cloud-logging; extra == "gcloud"
47
49
 
@@ -55,6 +57,7 @@ A professional Python API framework for building agent-based applications with F
55
57
  - **[Configuration Guide](./docs/configuration.md)** - All configuration options explained
56
58
  - **[Deployment Guide](./docs/deployment.md)** - Docker, Kubernetes, and cloud deployment
57
59
  - **[Authentication Guide](./docs/authentication.md)** - JWT and custom authentication
60
+ - **[Rate Limiting Guide](./docs/rate-limiting.md)** - Memory, Redis, and custom rate-limit backends
58
61
  - **[ID Generation Guide](./docs/id-generation.md)** - Snowflake ID generation
59
62
  - **[Thread Name Generator Guide](./docs/thread-name-generator.md)** - Thread naming strategies
60
63
 
@@ -66,6 +69,21 @@ A professional Python API framework for building agent-based applications with F
66
69
  pip install 10xscale-agentflow-cli
67
70
  ```
68
71
 
72
+ Redis rate limiting is optional. Install the Redis extra only when you configure
73
+ `rate_limit.backend` as `redis`:
74
+
75
+ ```bash
76
+ pip install "10xscale-agentflow-cli[redis]"
77
+ ```
78
+
79
+ JWT auth and document text extraction are optional too. Install only the extra
80
+ you need:
81
+
82
+ ```bash
83
+ pip install "10xscale-agentflow-cli[jwt]"
84
+ pip install "10xscale-agentflow-cli[media]"
85
+ ```
86
+
69
87
  ### Initialize a New Project
70
88
 
71
89
  ```bash
@@ -100,6 +118,7 @@ agentflow build --docker-compose
100
118
  - ✅ **State Graph Orchestration** - Build complex agent workflows with LangGraph
101
119
  - ✅ **FastAPI Backend** - High-performance async web framework
102
120
  - ✅ **Authentication** - Built-in JWT auth and custom authentication support
121
+ - ✅ **Rate Limiting** - Sliding-window limits with memory, Redis, and custom backends
103
122
  - ✅ **ID Generation** - Distributed Snowflake ID generation
104
123
  - ✅ **Thread Management** - Intelligent thread naming and conversation management
105
124
  - ✅ **Docker Ready** - Generate production-ready Docker files
@@ -221,6 +240,7 @@ The configuration file (`agentflow.json`) defines your agent, authentication, an
221
240
  | `injectq` | string\|null | Path to InjectQ container |
222
241
  | `store` | string\|null | Path to data store |
223
242
  | `redis` | string\|null | Redis connection URL |
243
+ | `rate_limit` | object\|null | Sliding-window rate limiting configuration |
224
244
  | `thread_name_generator` | string\|null | Path to custom thread name generator |
225
245
 
226
246
  See the [Configuration Guide](./docs/configuration.md) for complete details.
@@ -591,4 +611,3 @@ Developed by [10xScale](https://10xscale.ai) and maintained by the community.
591
611
  ---
592
612
 
593
613
  **Made with ❤️ for the AI agent development community**
594
-
@@ -1,8 +1,6 @@
1
- ActionPlan.md
2
1
  MANIFEST.in
3
2
  README.md
4
3
  agentflow.json
5
- plan.md
6
4
  pyproject.toml
7
5
  requirements.txt
8
6
  10xscale_agentflow_cli.egg-info/PKG-INFO
@@ -22,6 +20,7 @@ agentflow_cli/cli/commands/__init__.py
22
20
  agentflow_cli/cli/commands/api.py
23
21
  agentflow_cli/cli/commands/build.py
24
22
  agentflow_cli/cli/commands/init.py
23
+ agentflow_cli/cli/commands/skills.py
25
24
  agentflow_cli/cli/commands/version.py
26
25
  agentflow_cli/cli/core/__init__.py
27
26
  agentflow_cli/cli/core/config.py
@@ -29,6 +28,37 @@ agentflow_cli/cli/core/output.py
29
28
  agentflow_cli/cli/core/validation.py
30
29
  agentflow_cli/cli/templates/__init__.py
31
30
  agentflow_cli/cli/templates/defaults.py
31
+ agentflow_cli/cli/templates/skills/agent-skills/SKILL.md
32
+ agentflow_cli/cli/templates/skills/agent-skills/references/agents-and-tools.md
33
+ agentflow_cli/cli/templates/skills/agent-skills/references/api-client.md
34
+ agentflow_cli/cli/templates/skills/agent-skills/references/api-configuration.md
35
+ agentflow_cli/cli/templates/skills/agent-skills/references/api-settings-and-middleware.md
36
+ agentflow_cli/cli/templates/skills/agent-skills/references/architecture.md
37
+ agentflow_cli/cli/templates/skills/agent-skills/references/auth-and-authorization.md
38
+ agentflow_cli/cli/templates/skills/agent-skills/references/callbacks-and-command.md
39
+ agentflow_cli/cli/templates/skills/agent-skills/references/checkpointing-and-threads.md
40
+ agentflow_cli/cli/templates/skills/agent-skills/references/cli-commands.md
41
+ agentflow_cli/cli/templates/skills/agent-skills/references/client-auth-and-errors.md
42
+ agentflow_cli/cli/templates/skills/agent-skills/references/client-messages-invoke-stream.md
43
+ agentflow_cli/cli/templates/skills/agent-skills/references/client-threads-memory-files.md
44
+ agentflow_cli/cli/templates/skills/agent-skills/references/context-id-background.md
45
+ agentflow_cli/cli/templates/skills/agent-skills/references/dependency-injection.md
46
+ agentflow_cli/cli/templates/skills/agent-skills/references/id-and-thread-name-generators.md
47
+ agentflow_cli/cli/templates/skills/agent-skills/references/media-and-files.md
48
+ agentflow_cli/cli/templates/skills/agent-skills/references/memory-and-store.md
49
+ agentflow_cli/cli/templates/skills/agent-skills/references/prebuilt-agents-and-tools.md
50
+ agentflow_cli/cli/templates/skills/agent-skills/references/production-runtime.md
51
+ agentflow_cli/cli/templates/skills/agent-skills/references/providers-and-adapters.md
52
+ agentflow_cli/cli/templates/skills/agent-skills/references/publishers-and-runtime-protocols.md
53
+ agentflow_cli/cli/templates/skills/agent-skills/references/rate-limiting.md
54
+ agentflow_cli/cli/templates/skills/agent-skills/references/remote-tools.md
55
+ agentflow_cli/cli/templates/skills/agent-skills/references/rest-api-and-errors.md
56
+ agentflow_cli/cli/templates/skills/agent-skills/references/security-and-validators.md
57
+ agentflow_cli/cli/templates/skills/agent-skills/references/state-and-messages.md
58
+ agentflow_cli/cli/templates/skills/agent-skills/references/state-graph.md
59
+ agentflow_cli/cli/templates/skills/agent-skills/references/streaming.md
60
+ agentflow_cli/cli/templates/skills/agent-skills/references/testing-and-evaluation.md
61
+ agentflow_cli/cli/templates/skills/copilot/agentflow.instructions.md
32
62
  agentflow_cli/src/__init__.py
33
63
  agentflow_cli/src/app/__init__.py
34
64
  agentflow_cli/src/app/loader.py
@@ -57,6 +87,12 @@ agentflow_cli/src/app/core/exceptions/user_exception.py
57
87
  agentflow_cli/src/app/core/middleware/__init__.py
58
88
  agentflow_cli/src/app/core/middleware/request_limits.py
59
89
  agentflow_cli/src/app/core/middleware/security_headers.py
90
+ agentflow_cli/src/app/core/middleware/rate_limit/__init__.py
91
+ agentflow_cli/src/app/core/middleware/rate_limit/base.py
92
+ agentflow_cli/src/app/core/middleware/rate_limit/factory.py
93
+ agentflow_cli/src/app/core/middleware/rate_limit/memory.py
94
+ agentflow_cli/src/app/core/middleware/rate_limit/middleware.py
95
+ agentflow_cli/src/app/core/middleware/rate_limit/redis.py
60
96
  agentflow_cli/src/app/core/utils/__init__.py
61
97
  agentflow_cli/src/app/core/utils/log_sanitizer.py
62
98
  agentflow_cli/src/app/routers/__init__.py
@@ -8,8 +8,6 @@ pydantic-settings
8
8
  uvicorn
9
9
  typer
10
10
  python-dotenv
11
- PyJWT
12
- textxtract[docx,html,md,pdf,xml]>=0.2.0
13
11
 
14
12
  [firebase]
15
13
  firebase-admin>=6.5.0
@@ -18,6 +16,12 @@ oauth2client>=4.1.3
18
16
  [gcloud]
19
17
  google-cloud-logging
20
18
 
19
+ [jwt]
20
+ PyJWT
21
+
22
+ [media]
23
+ textxtract[docx,html,md,pdf,xml]>=0.2.0
24
+
21
25
  [redis]
22
26
  redis>=5.0.7
23
27
 
@@ -6,6 +6,7 @@ include example_weather_agent.py
6
6
  recursive-include agentflow_cli *.json
7
7
  recursive-include agentflow_cli *.yaml
8
8
  recursive-include agentflow_cli *.yml
9
+ recursive-include agentflow_cli *.md
9
10
  recursive-include agentflow_cli *.py
10
11
  recursive-include src *.json
11
12
  recursive-include src *.yaml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: 10xscale-agentflow-cli
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: CLI and API for 10xscale AgentFlow
5
5
  Author-email: 10xscale <contact@10xscale.ai>
6
6
  Maintainer-email: Shudipto Trafder <shudiptotrafder@gmail.com>
@@ -31,8 +31,6 @@ Requires-Dist: pydantic-settings
31
31
  Requires-Dist: uvicorn
32
32
  Requires-Dist: typer
33
33
  Requires-Dist: python-dotenv
34
- Requires-Dist: PyJWT
35
- Requires-Dist: textxtract[docx,html,md,pdf,xml]>=0.2.0
36
34
  Provides-Extra: sentry
37
35
  Requires-Dist: sentry-sdk>=2.10.0; extra == "sentry"
38
36
  Provides-Extra: firebase
@@ -42,6 +40,10 @@ Provides-Extra: snowflakekit
42
40
  Requires-Dist: snowflakekit; extra == "snowflakekit"
43
41
  Provides-Extra: redis
44
42
  Requires-Dist: redis>=5.0.7; extra == "redis"
43
+ Provides-Extra: jwt
44
+ Requires-Dist: PyJWT; extra == "jwt"
45
+ Provides-Extra: media
46
+ Requires-Dist: textxtract[docx,html,md,pdf,xml]>=0.2.0; extra == "media"
45
47
  Provides-Extra: gcloud
46
48
  Requires-Dist: google-cloud-logging; extra == "gcloud"
47
49
 
@@ -55,6 +57,7 @@ A professional Python API framework for building agent-based applications with F
55
57
  - **[Configuration Guide](./docs/configuration.md)** - All configuration options explained
56
58
  - **[Deployment Guide](./docs/deployment.md)** - Docker, Kubernetes, and cloud deployment
57
59
  - **[Authentication Guide](./docs/authentication.md)** - JWT and custom authentication
60
+ - **[Rate Limiting Guide](./docs/rate-limiting.md)** - Memory, Redis, and custom rate-limit backends
58
61
  - **[ID Generation Guide](./docs/id-generation.md)** - Snowflake ID generation
59
62
  - **[Thread Name Generator Guide](./docs/thread-name-generator.md)** - Thread naming strategies
60
63
 
@@ -66,6 +69,21 @@ A professional Python API framework for building agent-based applications with F
66
69
  pip install 10xscale-agentflow-cli
67
70
  ```
68
71
 
72
+ Redis rate limiting is optional. Install the Redis extra only when you configure
73
+ `rate_limit.backend` as `redis`:
74
+
75
+ ```bash
76
+ pip install "10xscale-agentflow-cli[redis]"
77
+ ```
78
+
79
+ JWT auth and document text extraction are optional too. Install only the extra
80
+ you need:
81
+
82
+ ```bash
83
+ pip install "10xscale-agentflow-cli[jwt]"
84
+ pip install "10xscale-agentflow-cli[media]"
85
+ ```
86
+
69
87
  ### Initialize a New Project
70
88
 
71
89
  ```bash
@@ -100,6 +118,7 @@ agentflow build --docker-compose
100
118
  - ✅ **State Graph Orchestration** - Build complex agent workflows with LangGraph
101
119
  - ✅ **FastAPI Backend** - High-performance async web framework
102
120
  - ✅ **Authentication** - Built-in JWT auth and custom authentication support
121
+ - ✅ **Rate Limiting** - Sliding-window limits with memory, Redis, and custom backends
103
122
  - ✅ **ID Generation** - Distributed Snowflake ID generation
104
123
  - ✅ **Thread Management** - Intelligent thread naming and conversation management
105
124
  - ✅ **Docker Ready** - Generate production-ready Docker files
@@ -221,6 +240,7 @@ The configuration file (`agentflow.json`) defines your agent, authentication, an
221
240
  | `injectq` | string\|null | Path to InjectQ container |
222
241
  | `store` | string\|null | Path to data store |
223
242
  | `redis` | string\|null | Redis connection URL |
243
+ | `rate_limit` | object\|null | Sliding-window rate limiting configuration |
224
244
  | `thread_name_generator` | string\|null | Path to custom thread name generator |
225
245
 
226
246
  See the [Configuration Guide](./docs/configuration.md) for complete details.
@@ -591,4 +611,3 @@ Developed by [10xScale](https://10xscale.ai) and maintained by the community.
591
611
  ---
592
612
 
593
613
  **Made with ❤️ for the AI agent development community**
594
-
@@ -8,6 +8,7 @@ A professional Python API framework for building agent-based applications with F
8
8
  - **[Configuration Guide](./docs/configuration.md)** - All configuration options explained
9
9
  - **[Deployment Guide](./docs/deployment.md)** - Docker, Kubernetes, and cloud deployment
10
10
  - **[Authentication Guide](./docs/authentication.md)** - JWT and custom authentication
11
+ - **[Rate Limiting Guide](./docs/rate-limiting.md)** - Memory, Redis, and custom rate-limit backends
11
12
  - **[ID Generation Guide](./docs/id-generation.md)** - Snowflake ID generation
12
13
  - **[Thread Name Generator Guide](./docs/thread-name-generator.md)** - Thread naming strategies
13
14
 
@@ -19,6 +20,21 @@ A professional Python API framework for building agent-based applications with F
19
20
  pip install 10xscale-agentflow-cli
20
21
  ```
21
22
 
23
+ Redis rate limiting is optional. Install the Redis extra only when you configure
24
+ `rate_limit.backend` as `redis`:
25
+
26
+ ```bash
27
+ pip install "10xscale-agentflow-cli[redis]"
28
+ ```
29
+
30
+ JWT auth and document text extraction are optional too. Install only the extra
31
+ you need:
32
+
33
+ ```bash
34
+ pip install "10xscale-agentflow-cli[jwt]"
35
+ pip install "10xscale-agentflow-cli[media]"
36
+ ```
37
+
22
38
  ### Initialize a New Project
23
39
 
24
40
  ```bash
@@ -53,6 +69,7 @@ agentflow build --docker-compose
53
69
  - ✅ **State Graph Orchestration** - Build complex agent workflows with LangGraph
54
70
  - ✅ **FastAPI Backend** - High-performance async web framework
55
71
  - ✅ **Authentication** - Built-in JWT auth and custom authentication support
72
+ - ✅ **Rate Limiting** - Sliding-window limits with memory, Redis, and custom backends
56
73
  - ✅ **ID Generation** - Distributed Snowflake ID generation
57
74
  - ✅ **Thread Management** - Intelligent thread naming and conversation management
58
75
  - ✅ **Docker Ready** - Generate production-ready Docker files
@@ -174,6 +191,7 @@ The configuration file (`agentflow.json`) defines your agent, authentication, an
174
191
  | `injectq` | string\|null | Path to InjectQ container |
175
192
  | `store` | string\|null | Path to data store |
176
193
  | `redis` | string\|null | Redis connection URL |
194
+ | `rate_limit` | object\|null | Sliding-window rate limiting configuration |
177
195
  | `thread_name_generator` | string\|null | Path to custom thread name generator |
178
196
 
179
197
  See the [Configuration Guide](./docs/configuration.md) for complete details.
@@ -544,4 +562,3 @@ Developed by [10xScale](https://10xscale.ai) and maintained by the community.
544
562
  ---
545
563
 
546
564
  **Made with ❤️ for the AI agent development community**
547
-
@@ -0,0 +1,15 @@
1
+ {
2
+ "agent": "graph.react:app",
3
+ "thread_name_generator": "graph.thread_name_generator:MyNameGenerator",
4
+ "env": ".env",
5
+ "auth": null,
6
+ "rate_limit": {
7
+ "enabled": true,
8
+ "backend": "memory",
9
+ "requests": 100,
10
+ "window": 60,
11
+ "by": "ip",
12
+ "trusted_proxy_headers": false,
13
+ "exclude_paths": ["/health", "/docs", "/redoc", "/openapi.json"]
14
+ }
15
+ }
@@ -0,0 +1,306 @@
1
+ """Skills command implementation."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import shutil
7
+ import sys
8
+ from dataclasses import dataclass
9
+ from datetime import UTC, datetime
10
+ from pathlib import Path
11
+ from typing import Any, Literal
12
+
13
+ import typer
14
+
15
+ from agentflow_cli.cli.commands import BaseCommand
16
+ from agentflow_cli.cli.constants import CLI_VERSION
17
+ from agentflow_cli.cli.exceptions import FileOperationError, ValidationError
18
+
19
+
20
+ _MANIFEST_FILENAME = ".agentflow-skill.json"
21
+
22
+
23
+ @dataclass(frozen=True)
24
+ class _InstallArtifact:
25
+ """Describes one file or folder installed for an agent."""
26
+
27
+ kind: Literal["folder", "file"]
28
+ install_relpath: str
29
+ source_relpath: str
30
+ manifest: bool = False
31
+
32
+
33
+ @dataclass(frozen=True)
34
+ class _AgentTarget:
35
+ """Describes how the bundled skill is materialised for one agent."""
36
+
37
+ name: str
38
+ artifacts: tuple[_InstallArtifact, ...]
39
+
40
+ @property
41
+ def kind(self) -> str:
42
+ kinds = {artifact.kind for artifact in self.artifacts}
43
+ if len(kinds) == 1:
44
+ return next(iter(kinds))
45
+ return "file+folder"
46
+
47
+
48
+ _TARGETS: tuple[_AgentTarget, ...] = (
49
+ _AgentTarget(
50
+ name="Codex",
51
+ artifacts=(
52
+ _InstallArtifact(
53
+ kind="folder",
54
+ install_relpath=".agents/skills/agentflow",
55
+ source_relpath="agent-skills",
56
+ manifest=True,
57
+ ),
58
+ ),
59
+ ),
60
+ _AgentTarget(
61
+ name="Claude",
62
+ artifacts=(
63
+ _InstallArtifact(
64
+ kind="folder",
65
+ install_relpath=".claude/skills/agentflow",
66
+ source_relpath="agent-skills",
67
+ manifest=True,
68
+ ),
69
+ ),
70
+ ),
71
+ _AgentTarget(
72
+ name="GitHub",
73
+ artifacts=(
74
+ _InstallArtifact(
75
+ kind="file",
76
+ install_relpath=".github/instructions/agentflow.instructions.md",
77
+ source_relpath="copilot/agentflow.instructions.md",
78
+ ),
79
+ _InstallArtifact(
80
+ kind="folder",
81
+ install_relpath=".github/skills/agentflow",
82
+ source_relpath="agent-skills",
83
+ manifest=True,
84
+ ),
85
+ ),
86
+ ),
87
+ )
88
+
89
+ _AGENT_LOOKUP: dict[str, _AgentTarget] = {
90
+ **{t.name.lower(): t for t in _TARGETS},
91
+ "1": _TARGETS[0],
92
+ "2": _TARGETS[1],
93
+ "3": _TARGETS[2],
94
+ }
95
+
96
+
97
+ class SkillsCommand(BaseCommand):
98
+ """Command to install bundled Agentflow skills for supported agents."""
99
+
100
+ def execute(
101
+ self,
102
+ agent: str | None = None,
103
+ path: str = ".",
104
+ force: bool = False,
105
+ all_agents: bool = False,
106
+ list_agents: bool = False,
107
+ **kwargs: Any,
108
+ ) -> int:
109
+ """Execute the skills command.
110
+
111
+ Args:
112
+ agent: Target agent name or menu number.
113
+ path: Project directory where the agent skill should be installed.
114
+ force: Overwrite an existing installation.
115
+ all_agents: Install for every supported agent.
116
+ list_agents: Print supported agents and exit.
117
+ **kwargs: Additional arguments.
118
+
119
+ Returns:
120
+ Exit code.
121
+ """
122
+ try:
123
+ self.output.print_banner(
124
+ "Skills",
125
+ "Install bundled Agentflow skills for Codex, Claude, or GitHub Copilot.",
126
+ color="magenta",
127
+ )
128
+
129
+ if list_agents:
130
+ self._print_agents()
131
+ return 0
132
+
133
+ if all_agents and agent:
134
+ raise ValidationError("--all cannot be combined with --agent.", field="agent")
135
+
136
+ templates_root = self._templates_root()
137
+ project_root = self._safe_project_root(path)
138
+
139
+ if all_agents:
140
+ return self._install_all(templates_root, project_root, force=force)
141
+
142
+ target = self._select_agent(agent)
143
+ self._install_one(templates_root, project_root, target, force=force)
144
+ return 0
145
+
146
+ except (FileOperationError, ValidationError) as e:
147
+ return self.handle_error(e)
148
+ except OSError as e:
149
+ file_error = FileOperationError(f"Failed to install Agentflow skills: {e}")
150
+ file_error.__cause__ = e
151
+ return self.handle_error(file_error)
152
+
153
+ def _install_one(
154
+ self,
155
+ templates_root: Path,
156
+ project_root: Path,
157
+ target: _AgentTarget,
158
+ *,
159
+ force: bool,
160
+ ) -> None:
161
+ installs = [
162
+ (
163
+ artifact,
164
+ templates_root / artifact.source_relpath,
165
+ project_root / artifact.install_relpath,
166
+ )
167
+ for artifact in target.artifacts
168
+ ]
169
+ for _artifact, source, _dest in installs:
170
+ if not source.exists():
171
+ raise FileOperationError(
172
+ f"Bundled skills template not found: {source}", file_path=str(source)
173
+ )
174
+
175
+ existing = [dest for _artifact, _source, dest in installs if dest.exists()]
176
+ if existing and not force:
177
+ paths = ", ".join(str(dest) for dest in existing)
178
+ raise FileOperationError(
179
+ f"Skill already installed at {paths}. Use --force to overwrite.",
180
+ file_path=str(existing[0]),
181
+ )
182
+
183
+ for _artifact, _source, dest in installs:
184
+ if dest.exists():
185
+ if dest.is_dir():
186
+ shutil.rmtree(dest)
187
+ else:
188
+ dest.unlink()
189
+
190
+ installed_paths: list[str] = []
191
+ for artifact, source, dest in installs:
192
+ dest.parent.mkdir(parents=True, exist_ok=True)
193
+
194
+ if artifact.kind == "folder":
195
+ shutil.copytree(
196
+ source,
197
+ dest,
198
+ ignore=shutil.ignore_patterns("__pycache__", "*.pyc", ".DS_Store"),
199
+ )
200
+ if artifact.manifest:
201
+ self._write_manifest(dest, target.name)
202
+ else:
203
+ shutil.copyfile(source, dest)
204
+ installed_paths.append(str(dest))
205
+
206
+ self.output.success(
207
+ f"Installed Agentflow skills for {target.name} at {', '.join(installed_paths)}"
208
+ )
209
+
210
+ def _install_all(self, templates_root: Path, project_root: Path, *, force: bool) -> int:
211
+ installed = 0
212
+ skipped: list[str] = []
213
+ failed: list[str] = []
214
+ for target in _TARGETS:
215
+ existing = [
216
+ project_root / artifact.install_relpath
217
+ for artifact in target.artifacts
218
+ if (project_root / artifact.install_relpath).exists()
219
+ ]
220
+ if existing and not force:
221
+ paths = ", ".join(str(dest) for dest in existing)
222
+ skipped.append(f"{target.name} ({paths})")
223
+ continue
224
+ try:
225
+ self._install_one(templates_root, project_root, target, force=force)
226
+ installed += 1
227
+ except (FileOperationError, OSError, UnicodeError) as e:
228
+ self.logger.error("Install failed for %s: %s", target.name, e)
229
+ failed.append(f"{target.name}: {e}")
230
+
231
+ if skipped:
232
+ self.output.warning(
233
+ "Skipped existing installs (use --force to overwrite): " + ", ".join(skipped)
234
+ )
235
+ if failed:
236
+ self.output.error("Failed installs: " + "; ".join(failed))
237
+
238
+ if failed and installed == 0:
239
+ return 1
240
+ return 0
241
+
242
+ def _write_manifest(self, target_dir: Path, agent_name: str) -> None:
243
+ manifest = {
244
+ "agent": agent_name,
245
+ "cli_version": CLI_VERSION,
246
+ "installed_at": datetime.now(UTC).isoformat(timespec="seconds"),
247
+ }
248
+ (target_dir / _MANIFEST_FILENAME).write_text(
249
+ json.dumps(manifest, indent=2) + "\n", encoding="utf-8"
250
+ )
251
+
252
+ def _print_agents(self) -> None:
253
+ rows = [
254
+ [t.name, t.kind, ", ".join(a.install_relpath for a in t.artifacts)] for t in _TARGETS
255
+ ]
256
+ self.output.print_table(
257
+ ["Agent", "Kind", "Install path (relative to --path)"],
258
+ rows,
259
+ title="Supported agents",
260
+ )
261
+
262
+ def _safe_project_root(self, path: str) -> Path:
263
+ project_root = Path(path).resolve()
264
+ if project_root.parent == project_root:
265
+ raise ValidationError(
266
+ f"Refusing to install skills at filesystem root: {project_root}",
267
+ field="path",
268
+ )
269
+ if project_root == Path.home().resolve():
270
+ raise ValidationError(
271
+ f"Refusing to install skills directly into the home directory: {project_root}. "
272
+ "Pass --path pointing at a project directory.",
273
+ field="path",
274
+ )
275
+ return project_root
276
+
277
+ def _select_agent(self, agent: str | None) -> _AgentTarget:
278
+ if agent:
279
+ return self._normalize_agent(agent)
280
+
281
+ if not sys.stdin.isatty():
282
+ raise ValidationError(
283
+ "No --agent provided and stdin is not interactive. "
284
+ "Pass --agent codex|claude|github or --all.",
285
+ field="agent",
286
+ )
287
+
288
+ self.output.print_list(
289
+ [f"{i}. {t.name}" for i, t in enumerate(_TARGETS, 1)],
290
+ title="Which agent?",
291
+ bullet="-",
292
+ )
293
+ selected = typer.prompt("Select an agent", default="1")
294
+ return self._normalize_agent(selected)
295
+
296
+ def _normalize_agent(self, value: str) -> _AgentTarget:
297
+ key = value.strip().lower()
298
+ if key in _AGENT_LOOKUP:
299
+ return _AGENT_LOOKUP[key]
300
+
301
+ valid = "Codex, Claude, GitHub, or 1, 2, 3"
302
+ raise ValidationError(f"Invalid agent '{value}'. Choose {valid}.", field="agent")
303
+
304
+ def _templates_root(self) -> Path:
305
+ cli_dir = Path(__file__).resolve().parents[1]
306
+ return cli_dir / "templates" / "skills"