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.
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/PKG-INFO +23 -4
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/SOURCES.txt +38 -2
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/requires.txt +6 -2
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/MANIFEST.in +1 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/PKG-INFO +23 -4
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/README.md +18 -1
- 10xscale_agentflow_cli-0.3.2/agentflow.json +15 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/commands/skills.py +306 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/main.py +62 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/SKILL.md +102 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/agents-and-tools.md +65 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/api-client.md +67 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/api-configuration.md +74 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/api-settings-and-middleware.md +90 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/architecture.md +55 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/auth-and-authorization.md +88 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/callbacks-and-command.md +266 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/checkpointing-and-threads.md +63 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/cli-commands.md +73 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/client-auth-and-errors.md +95 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/client-messages-invoke-stream.md +117 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/client-threads-memory-files.md +82 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/context-id-background.md +82 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/dependency-injection.md +58 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/id-and-thread-name-generators.md +71 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/media-and-files.md +66 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/memory-and-store.md +70 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/prebuilt-agents-and-tools.md +60 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/production-runtime.md +56 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/providers-and-adapters.md +81 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/publishers-and-runtime-protocols.md +78 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/rate-limiting.md +194 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/remote-tools.md +86 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/rest-api-and-errors.md +93 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/security-and-validators.md +69 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/state-and-messages.md +68 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/state-graph.md +67 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/streaming.md +53 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/agent-skills/references/testing-and-evaluation.md +66 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/cli/templates/skills/copilot/agentflow.instructions.md +54 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/jwt_auth.py +12 -1
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/config/graph_config.py +248 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/setup_middleware.py +35 -1
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/__init__.py +25 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/__init__.py +15 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/base.py +27 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/factory.py +98 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/memory.py +98 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/middleware.py +93 -0
- 10xscale_agentflow_cli-0.3.2/agentflow_cli/src/app/core/middleware/rate_limit/redis.py +115 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/main.py +6 -1
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/media/extractor.py +1 -1
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/pyproject.toml +11 -4
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/requirements.txt +0 -2
- 10xscale_agentflow_cli-0.3.0/ActionPlan.md +0 -712
- 10xscale_agentflow_cli-0.3.0/agentflow.json +0 -6
- 10xscale_agentflow_cli-0.3.0/agentflow_cli/src/app/core/config/graph_config.py +0 -86
- 10xscale_agentflow_cli-0.3.0/agentflow_cli/src/app/core/middleware/__init__.py +0 -11
- 10xscale_agentflow_cli-0.3.0/plan.md +0 -190
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/dependency_links.txt +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/entry_points.txt +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/not-zip-safe +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/10xscale_agentflow_cli.egg-info/top_level.txt +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/commands/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/commands/api.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/commands/build.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/commands/init.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/commands/version.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/constants.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/core/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/core/config.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/core/output.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/core/validation.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/exceptions.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/logger.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/templates/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/cli/templates/defaults.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/auth_backend.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/authorization.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/base_auth.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/auth/permissions.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/media_settings.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/sentry_config.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/settings.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/setup_logs.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/config/worker_middleware.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/exceptions/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/exceptions/general_exception.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/exceptions/handle_errors.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/exceptions/resources_exceptions.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/exceptions/user_exception.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/middleware/request_limits.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/middleware/security_headers.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/utils/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/core/utils/log_sanitizer.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/loader.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/a2a.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/a2ui.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/router.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/schemas/checkpointer_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/services/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/checkpointer/services/checkpointer_service.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/router.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/schemas/graph_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/services/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/services/graph_service.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/graph/services/multimodal_preprocessor.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/media/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/media/router.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/media/schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/ping/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/ping/router.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/setup_router.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/router.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/schemas/store_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/services/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/routers/store/services/store_service.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/tasks/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/tasks/user_tasks.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/callable_helper.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/media/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/media/pipeline.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/parse_output.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/response_helper.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/schemas/output_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/schemas/user_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/snowflake_id_generator.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/swagger_helper.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/utils/thread_name_generator.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/agentflow_cli/src/app/worker.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/graph/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/graph/react.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/graph/thread_name_generator.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/scripts/generate_docs.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/setup.cfg +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/tests/test_multimodal_sprint2_extraction.py +0 -0
- {10xscale_agentflow_cli-0.3.0 → 10xscale_agentflow_cli-0.3.2}/tests/test_sprint4_media_api.py +0 -0
- {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.
|
|
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.
|
|
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"
|