devsper 2.1.6__py3-none-any.whl
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.
- devsper/__init__.py +14 -0
- devsper/agents/a2a/__init__.py +27 -0
- devsper/agents/a2a/client.py +126 -0
- devsper/agents/a2a/discovery.py +24 -0
- devsper/agents/a2a/server.py +128 -0
- devsper/agents/a2a/tool_adapter.py +68 -0
- devsper/agents/a2a/types.py +49 -0
- devsper/agents/agent.py +602 -0
- devsper/agents/critic.py +80 -0
- devsper/agents/message_bus.py +124 -0
- devsper/agents/roles.py +181 -0
- devsper/agents/run_agent.py +78 -0
- devsper/analytics/__init__.py +5 -0
- devsper/analytics/tool_analytics.py +78 -0
- devsper/audit/__init__.py +5 -0
- devsper/audit/logger.py +214 -0
- devsper/bus/__init__.py +29 -0
- devsper/bus/backends/__init__.py +5 -0
- devsper/bus/backends/base.py +38 -0
- devsper/bus/backends/memory.py +55 -0
- devsper/bus/backends/redis.py +146 -0
- devsper/bus/message.py +56 -0
- devsper/bus/schema_version.py +3 -0
- devsper/bus/topics.py +19 -0
- devsper/cache/__init__.py +6 -0
- devsper/cache/embedding_index.py +98 -0
- devsper/cache/hashing.py +24 -0
- devsper/cache/store.py +153 -0
- devsper/cache/task_cache.py +191 -0
- devsper/cli/__init__.py +6 -0
- devsper/cli/commands/reg.py +733 -0
- devsper/cli/github_oauth.py +157 -0
- devsper/cli/init.py +637 -0
- devsper/cli/main.py +2956 -0
- devsper/cli/run_progress.py +103 -0
- devsper/cli/ui/__init__.py +65 -0
- devsper/cli/ui/components.py +94 -0
- devsper/cli/ui/errors.py +104 -0
- devsper/cli/ui/logging.py +120 -0
- devsper/cli/ui/onboarding.py +102 -0
- devsper/cli/ui/progress.py +43 -0
- devsper/cli/ui/run_view.py +308 -0
- devsper/cli/ui/theme.py +40 -0
- devsper/cluster/__init__.py +29 -0
- devsper/cluster/election.py +84 -0
- devsper/cluster/local.py +97 -0
- devsper/cluster/node_info.py +77 -0
- devsper/cluster/registry.py +71 -0
- devsper/cluster/router.py +117 -0
- devsper/cluster/state_backend.py +105 -0
- devsper/compliance/__init__.py +5 -0
- devsper/compliance/pii.py +147 -0
- devsper/config/__init__.py +52 -0
- devsper/config/config_loader.py +121 -0
- devsper/config/defaults.py +77 -0
- devsper/config/resolver.py +342 -0
- devsper/config/schema.py +237 -0
- devsper/credentials/__init__.py +19 -0
- devsper/credentials/cli.py +197 -0
- devsper/credentials/migration.py +124 -0
- devsper/credentials/store.py +142 -0
- devsper/dashboard/__init__.py +9 -0
- devsper/dashboard/dashboard.py +87 -0
- devsper/dev/__init__.py +25 -0
- devsper/dev/builder.py +195 -0
- devsper/dev/debugger.py +95 -0
- devsper/dev/repo_index.py +138 -0
- devsper/dev/sandbox.py +203 -0
- devsper/dev/scaffold.py +122 -0
- devsper/embeddings/__init__.py +5 -0
- devsper/embeddings/service.py +36 -0
- devsper/explainability/__init__.py +14 -0
- devsper/explainability/decision_tree.py +104 -0
- devsper/explainability/rationale.py +38 -0
- devsper/explainability/simulation.py +56 -0
- devsper/hitl/__init__.py +13 -0
- devsper/hitl/approval.py +160 -0
- devsper/hitl/escalation.py +95 -0
- devsper/intelligence/__init__.py +9 -0
- devsper/intelligence/adaptation.py +88 -0
- devsper/intelligence/analysis/__init__.py +19 -0
- devsper/intelligence/analysis/analyzer.py +71 -0
- devsper/intelligence/analysis/cost_estimator.py +66 -0
- devsper/intelligence/analysis/formatter.py +103 -0
- devsper/intelligence/analysis/run_report.py +402 -0
- devsper/intelligence/learning_engine.py +92 -0
- devsper/intelligence/strategies/__init__.py +23 -0
- devsper/intelligence/strategies/base.py +14 -0
- devsper/intelligence/strategies/code_analysis_strategy.py +33 -0
- devsper/intelligence/strategies/data_science_strategy.py +33 -0
- devsper/intelligence/strategies/document_pipeline_strategy.py +33 -0
- devsper/intelligence/strategies/experiment_strategy.py +33 -0
- devsper/intelligence/strategies/research_strategy.py +34 -0
- devsper/intelligence/strategy_selector.py +84 -0
- devsper/intelligence/synthesis.py +132 -0
- devsper/intelligence/task_optimizer.py +92 -0
- devsper/knowledge/__init__.py +5 -0
- devsper/knowledge/extractor.py +204 -0
- devsper/knowledge/knowledge_graph.py +184 -0
- devsper/knowledge/query.py +285 -0
- devsper/memory/__init__.py +35 -0
- devsper/memory/consolidation.py +138 -0
- devsper/memory/embeddings.py +60 -0
- devsper/memory/memory_index.py +97 -0
- devsper/memory/memory_router.py +62 -0
- devsper/memory/memory_store.py +221 -0
- devsper/memory/memory_types.py +54 -0
- devsper/memory/namespaces.py +45 -0
- devsper/memory/scoring.py +77 -0
- devsper/memory/summarizer.py +52 -0
- devsper/nodes/__init__.py +5 -0
- devsper/nodes/controller.py +449 -0
- devsper/nodes/rpc.py +127 -0
- devsper/nodes/single.py +161 -0
- devsper/nodes/worker.py +506 -0
- devsper/orchestration/__init__.py +19 -0
- devsper/orchestration/meta_planner.py +239 -0
- devsper/orchestration/priority_queue.py +61 -0
- devsper/plugins/__init__.py +19 -0
- devsper/plugins/marketplace/__init__.py +0 -0
- devsper/plugins/plugin_loader.py +70 -0
- devsper/plugins/plugin_registry.py +34 -0
- devsper/plugins/registry.py +83 -0
- devsper/protocols/__init__.py +6 -0
- devsper/providers/__init__.py +17 -0
- devsper/providers/anthropic.py +84 -0
- devsper/providers/base.py +75 -0
- devsper/providers/complexity_router.py +94 -0
- devsper/providers/gemini.py +36 -0
- devsper/providers/github.py +180 -0
- devsper/providers/model_router.py +40 -0
- devsper/providers/openai.py +105 -0
- devsper/providers/router/__init__.py +21 -0
- devsper/providers/router/backends/__init__.py +19 -0
- devsper/providers/router/backends/anthropic_backend.py +111 -0
- devsper/providers/router/backends/custom_backend.py +138 -0
- devsper/providers/router/backends/gemini_backend.py +89 -0
- devsper/providers/router/backends/github_backend.py +165 -0
- devsper/providers/router/backends/ollama_backend.py +104 -0
- devsper/providers/router/backends/openai_backend.py +142 -0
- devsper/providers/router/backends/vllm_backend.py +35 -0
- devsper/providers/router/base.py +60 -0
- devsper/providers/router/factory.py +92 -0
- devsper/providers/router/legacy.py +101 -0
- devsper/providers/router/router.py +135 -0
- devsper/reasoning/__init__.py +12 -0
- devsper/reasoning/graph.py +59 -0
- devsper/reasoning/nodes.py +20 -0
- devsper/reasoning/store.py +67 -0
- devsper/runtime/__init__.py +12 -0
- devsper/runtime/health.py +88 -0
- devsper/runtime/replay.py +53 -0
- devsper/runtime/replay_engine.py +142 -0
- devsper/runtime/run_history.py +204 -0
- devsper/runtime/telemetry.py +116 -0
- devsper/runtime/visualize.py +58 -0
- devsper/sandbox/__init__.py +13 -0
- devsper/sandbox/sandbox.py +161 -0
- devsper/swarm/checkpointer.py +65 -0
- devsper/swarm/executor.py +558 -0
- devsper/swarm/map_reduce.py +44 -0
- devsper/swarm/planner.py +197 -0
- devsper/swarm/prefetcher.py +91 -0
- devsper/swarm/scheduler.py +153 -0
- devsper/swarm/speculation.py +47 -0
- devsper/swarm/swarm.py +562 -0
- devsper/tools/__init__.py +33 -0
- devsper/tools/base.py +29 -0
- devsper/tools/code_intelligence/__init__.py +13 -0
- devsper/tools/code_intelligence/api_surface_extractor.py +73 -0
- devsper/tools/code_intelligence/architecture_analyzer.py +65 -0
- devsper/tools/code_intelligence/codebase_indexer.py +71 -0
- devsper/tools/code_intelligence/dependency_graph_builder.py +67 -0
- devsper/tools/code_intelligence/design_pattern_detector.py +62 -0
- devsper/tools/code_intelligence/large_function_detector.py +68 -0
- devsper/tools/code_intelligence/module_responsibility_mapper.py +56 -0
- devsper/tools/code_intelligence/parallel_codebase_analysis.py +44 -0
- devsper/tools/code_intelligence/refactor_candidate_detector.py +81 -0
- devsper/tools/code_intelligence/repository_semantic_index.py +61 -0
- devsper/tools/code_intelligence/test_coverage_estimator.py +62 -0
- devsper/tools/coding/__init__.py +12 -0
- devsper/tools/coding/analyze_code_complexity.py +48 -0
- devsper/tools/coding/dependency_analyzer.py +42 -0
- devsper/tools/coding/extract_functions.py +38 -0
- devsper/tools/coding/format_python.py +50 -0
- devsper/tools/coding/generate_docstrings.py +40 -0
- devsper/tools/coding/generate_unit_tests.py +42 -0
- devsper/tools/coding/lint_python.py +51 -0
- devsper/tools/coding/refactor_function.py +41 -0
- devsper/tools/coding/repo_structure_map.py +54 -0
- devsper/tools/coding/run_python.py +53 -0
- devsper/tools/data/__init__.py +12 -0
- devsper/tools/data/column_type_detection.py +64 -0
- devsper/tools/data/csv_summary.py +52 -0
- devsper/tools/data/dataframe_filter.py +51 -0
- devsper/tools/data/dataframe_groupby.py +47 -0
- devsper/tools/data/dataframe_stats.py +38 -0
- devsper/tools/data/dataset_sampling.py +55 -0
- devsper/tools/data/dataset_schema.py +45 -0
- devsper/tools/data/json_pretty_print.py +37 -0
- devsper/tools/data/json_query.py +46 -0
- devsper/tools/data/missing_value_report.py +47 -0
- devsper/tools/data_science/__init__.py +13 -0
- devsper/tools/data_science/correlation_heatmap.py +72 -0
- devsper/tools/data_science/dataset_bias_detector.py +49 -0
- devsper/tools/data_science/dataset_distribution_report.py +64 -0
- devsper/tools/data_science/dataset_drift_detector.py +64 -0
- devsper/tools/data_science/dataset_outlier_detector.py +65 -0
- devsper/tools/data_science/dataset_profile.py +76 -0
- devsper/tools/data_science/distributed_dataset_processor.py +54 -0
- devsper/tools/data_science/feature_engineering_suggestions.py +69 -0
- devsper/tools/data_science/feature_importance_estimator.py +82 -0
- devsper/tools/data_science/model_input_validator.py +59 -0
- devsper/tools/data_science/time_series_analyzer.py +57 -0
- devsper/tools/documents/__init__.py +11 -0
- devsper/tools/documents/_docproc.py +56 -0
- devsper/tools/documents/document_to_markdown.py +29 -0
- devsper/tools/documents/extract_document_images.py +39 -0
- devsper/tools/documents/extract_document_text.py +29 -0
- devsper/tools/documents/extract_equations.py +36 -0
- devsper/tools/documents/extract_tables.py +47 -0
- devsper/tools/documents/summarize_document.py +42 -0
- devsper/tools/documents/write_latex_document.py +133 -0
- devsper/tools/documents/write_markdown_document.py +89 -0
- devsper/tools/documents/write_word_document.py +149 -0
- devsper/tools/experiments/__init__.py +13 -0
- devsper/tools/experiments/bootstrap_estimator.py +54 -0
- devsper/tools/experiments/experiment_report_generator.py +50 -0
- devsper/tools/experiments/experiment_tracker.py +36 -0
- devsper/tools/experiments/grid_search_runner.py +50 -0
- devsper/tools/experiments/model_benchmark_runner.py +45 -0
- devsper/tools/experiments/monte_carlo_experiment.py +38 -0
- devsper/tools/experiments/parameter_sweep_runner.py +51 -0
- devsper/tools/experiments/result_comparator.py +58 -0
- devsper/tools/experiments/simulation_runner.py +43 -0
- devsper/tools/experiments/statistical_significance_test.py +56 -0
- devsper/tools/experiments/swarm_map_reduce.py +42 -0
- devsper/tools/filesystem/__init__.py +12 -0
- devsper/tools/filesystem/append_file.py +42 -0
- devsper/tools/filesystem/file_hash.py +40 -0
- devsper/tools/filesystem/file_line_count.py +36 -0
- devsper/tools/filesystem/file_metadata.py +38 -0
- devsper/tools/filesystem/file_preview.py +55 -0
- devsper/tools/filesystem/find_large_files.py +50 -0
- devsper/tools/filesystem/list_directory.py +39 -0
- devsper/tools/filesystem/read_file.py +35 -0
- devsper/tools/filesystem/search_files.py +60 -0
- devsper/tools/filesystem/write_file.py +41 -0
- devsper/tools/flagship/__init__.py +15 -0
- devsper/tools/flagship/distributed_document_analysis.py +77 -0
- devsper/tools/flagship/docproc_corpus_pipeline.py +91 -0
- devsper/tools/flagship/repository_semantic_map.py +99 -0
- devsper/tools/flagship/research_graph_builder.py +111 -0
- devsper/tools/flagship/swarm_experiment_runner.py +86 -0
- devsper/tools/knowledge/__init__.py +10 -0
- devsper/tools/knowledge/citation_graph_builder.py +69 -0
- devsper/tools/knowledge/concept_frequency_analyzer.py +74 -0
- devsper/tools/knowledge/corpus_builder.py +66 -0
- devsper/tools/knowledge/cross_document_entity_linker.py +71 -0
- devsper/tools/knowledge/document_corpus_summary.py +68 -0
- devsper/tools/knowledge/document_topic_extractor.py +58 -0
- devsper/tools/knowledge/knowledge_graph_extractor.py +58 -0
- devsper/tools/knowledge/timeline_extractor.py +59 -0
- devsper/tools/math/__init__.py +12 -0
- devsper/tools/math/calculate_expression.py +52 -0
- devsper/tools/math/correlation.py +44 -0
- devsper/tools/math/distribution_summary.py +39 -0
- devsper/tools/math/histogram.py +53 -0
- devsper/tools/math/linear_regression.py +47 -0
- devsper/tools/math/matrix_multiply.py +38 -0
- devsper/tools/math/mean_std.py +35 -0
- devsper/tools/math/monte_carlo_simulation.py +43 -0
- devsper/tools/math/polynomial_fit.py +40 -0
- devsper/tools/math/random_sample.py +36 -0
- devsper/tools/mcp/__init__.py +23 -0
- devsper/tools/mcp/adapter.py +53 -0
- devsper/tools/mcp/client.py +235 -0
- devsper/tools/mcp/discovery.py +53 -0
- devsper/tools/memory/__init__.py +16 -0
- devsper/tools/memory/delete_memory.py +25 -0
- devsper/tools/memory/list_memory.py +34 -0
- devsper/tools/memory/search_memory.py +36 -0
- devsper/tools/memory/store_memory.py +47 -0
- devsper/tools/memory/summarize_memory.py +41 -0
- devsper/tools/memory/tag_memory.py +47 -0
- devsper/tools/pipelines.py +92 -0
- devsper/tools/registry.py +39 -0
- devsper/tools/research/__init__.py +12 -0
- devsper/tools/research/arxiv_download.py +55 -0
- devsper/tools/research/arxiv_search.py +58 -0
- devsper/tools/research/citation_extractor.py +35 -0
- devsper/tools/research/duckduckgo_search.py +42 -0
- devsper/tools/research/paper_metadata_extractor.py +45 -0
- devsper/tools/research/paper_summarizer.py +41 -0
- devsper/tools/research/research_question_generator.py +39 -0
- devsper/tools/research/topic_cluster.py +46 -0
- devsper/tools/research/web_search.py +47 -0
- devsper/tools/research/wikipedia_lookup.py +50 -0
- devsper/tools/research_advanced/__init__.py +14 -0
- devsper/tools/research_advanced/citation_context_extractor.py +60 -0
- devsper/tools/research_advanced/literature_review_generator.py +79 -0
- devsper/tools/research_advanced/methodology_extractor.py +58 -0
- devsper/tools/research_advanced/paper_contribution_extractor.py +50 -0
- devsper/tools/research_advanced/paper_dataset_identifier.py +49 -0
- devsper/tools/research_advanced/paper_method_comparator.py +62 -0
- devsper/tools/research_advanced/paper_similarity_search.py +69 -0
- devsper/tools/research_advanced/paper_trend_analyzer.py +69 -0
- devsper/tools/research_advanced/parallel_document_analyzer.py +56 -0
- devsper/tools/research_advanced/research_gap_finder.py +71 -0
- devsper/tools/research_advanced/research_topic_mapper.py +69 -0
- devsper/tools/research_advanced/swarm_literature_review.py +58 -0
- devsper/tools/scoring/__init__.py +52 -0
- devsper/tools/scoring/report.py +44 -0
- devsper/tools/scoring/scorer.py +39 -0
- devsper/tools/scoring/selector.py +61 -0
- devsper/tools/scoring/store.py +267 -0
- devsper/tools/selector.py +130 -0
- devsper/tools/system/__init__.py +12 -0
- devsper/tools/system/cpu_usage.py +22 -0
- devsper/tools/system/disk_usage.py +35 -0
- devsper/tools/system/environment_variables.py +29 -0
- devsper/tools/system/memory_usage.py +23 -0
- devsper/tools/system/pip_install.py +44 -0
- devsper/tools/system/pip_search.py +29 -0
- devsper/tools/system/process_list.py +34 -0
- devsper/tools/system/python_package_list.py +40 -0
- devsper/tools/system/run_shell_command.py +51 -0
- devsper/tools/system/system_info.py +26 -0
- devsper/tools/tool_runner.py +122 -0
- devsper/tui/__init__.py +5 -0
- devsper/tui/activity_feed_view.py +73 -0
- devsper/tui/adaptive_tasks_view.py +75 -0
- devsper/tui/agent_role_view.py +35 -0
- devsper/tui/app.py +395 -0
- devsper/tui/dashboard_screen.py +290 -0
- devsper/tui/dev_view.py +99 -0
- devsper/tui/inject_screen.py +73 -0
- devsper/tui/knowledge_graph_view.py +46 -0
- devsper/tui/layout.py +43 -0
- devsper/tui/logs_view.py +83 -0
- devsper/tui/memory_view.py +58 -0
- devsper/tui/performance_view.py +33 -0
- devsper/tui/reasoning_graph_view.py +39 -0
- devsper/tui/results_view.py +139 -0
- devsper/tui/swarm_view.py +37 -0
- devsper/tui/task_detail_screen.py +55 -0
- devsper/tui/task_view.py +103 -0
- devsper/types/event.py +97 -0
- devsper/types/exceptions.py +21 -0
- devsper/types/swarm.py +41 -0
- devsper/types/task.py +80 -0
- devsper/upgrade/__init__.py +21 -0
- devsper/upgrade/changelog.py +124 -0
- devsper/upgrade/cli.py +145 -0
- devsper/upgrade/installer.py +103 -0
- devsper/upgrade/notifier.py +52 -0
- devsper/upgrade/version_check.py +121 -0
- devsper/utils/event_logger.py +88 -0
- devsper/utils/http.py +43 -0
- devsper/utils/models.py +54 -0
- devsper/visualization/__init__.py +5 -0
- devsper/visualization/dag_export.py +67 -0
- devsper/workflow/__init__.py +18 -0
- devsper/workflow/conditions.py +157 -0
- devsper/workflow/context.py +108 -0
- devsper/workflow/loader.py +156 -0
- devsper/workflow/resolver.py +109 -0
- devsper/workflow/runner.py +562 -0
- devsper/workflow/schema.py +63 -0
- devsper/workflow/validator.py +128 -0
- devsper-2.1.6.dist-info/METADATA +346 -0
- devsper-2.1.6.dist-info/RECORD +375 -0
- devsper-2.1.6.dist-info/WHEEL +4 -0
- devsper-2.1.6.dist-info/entry_points.txt +3 -0
- devsper-2.1.6.dist-info/licenses/LICENSE +639 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""Validate workflow definition: references, DAG, conditions, dead output."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
from devsper.workflow.resolver import build_execution_order, validate_dag
|
|
7
|
+
from devsper.workflow.schema import WorkflowDefinition, WorkflowStep
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class ValidationReport:
|
|
12
|
+
valid: bool
|
|
13
|
+
errors: list[str] # blockers
|
|
14
|
+
warnings: list[str] # non-fatal issues
|
|
15
|
+
info: list[str] # stats/notes
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _template_refs(template: str) -> list[tuple[str, str]]:
|
|
19
|
+
"""Return list of (step_id, field) for references like steps.STEP_ID.FIELD or steps.STEP_ID.result."""
|
|
20
|
+
refs: list[tuple[str, str]] = []
|
|
21
|
+
# Match {steps.STEP_ID.FIELD} or {steps.STEP_ID.result}
|
|
22
|
+
for m in re.finditer(r"\{steps\.([a-zA-Z_][a-zA-Z0-9_]*)\.([a-zA-Z0-9_]+)\}", template):
|
|
23
|
+
refs.append((m.group(1), m.group(2)))
|
|
24
|
+
return refs
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _condition_ref(expression: str) -> tuple[str, str] | None:
|
|
28
|
+
"""Return (step_id, field) if expression is steps.STEP_ID.FIELD <op> value."""
|
|
29
|
+
m = re.match(
|
|
30
|
+
r"^\s*steps\.([a-zA-Z_][a-zA-Z0-9_]*)\.([a-zA-Z_][a-zA-Z0-9_]*)\s",
|
|
31
|
+
expression.strip(),
|
|
32
|
+
)
|
|
33
|
+
if m:
|
|
34
|
+
return (m.group(1), m.group(2))
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def validate_workflow(definition: WorkflowDefinition) -> ValidationReport:
|
|
39
|
+
errors: list[str] = []
|
|
40
|
+
warnings: list[str] = []
|
|
41
|
+
info: list[str] = []
|
|
42
|
+
|
|
43
|
+
step_ids = {s.id for s in definition.steps}
|
|
44
|
+
step_by_id = {s.id: s for s in definition.steps}
|
|
45
|
+
|
|
46
|
+
# DAG and depends_on
|
|
47
|
+
dag_errors = validate_dag(definition.steps)
|
|
48
|
+
errors.extend(dag_errors)
|
|
49
|
+
|
|
50
|
+
waves = None
|
|
51
|
+
if not dag_errors:
|
|
52
|
+
try:
|
|
53
|
+
waves = build_execution_order(definition.steps)
|
|
54
|
+
info.append(f"Total steps: {len(definition.steps)}")
|
|
55
|
+
info.append(f"Parallel waves: {len(waves)}")
|
|
56
|
+
info.append(f"Critical path length: {len(waves)}")
|
|
57
|
+
except Exception as e:
|
|
58
|
+
errors.append(str(e))
|
|
59
|
+
|
|
60
|
+
# All {steps.X.field} template references point to steps with output_schema defining that field (or .result)
|
|
61
|
+
for step in definition.steps:
|
|
62
|
+
for step_id, field in _template_refs(step.task):
|
|
63
|
+
if step_id not in step_ids:
|
|
64
|
+
errors.append(
|
|
65
|
+
f"Step {step.id!r} task references steps.{step_id}.{field} but step {step_id!r} does not exist."
|
|
66
|
+
)
|
|
67
|
+
else:
|
|
68
|
+
ref_step = step_by_id[step_id]
|
|
69
|
+
if field == "result":
|
|
70
|
+
continue # always valid
|
|
71
|
+
if not ref_step.output_schema:
|
|
72
|
+
errors.append(
|
|
73
|
+
f"Step {step.id!r} task references steps.{step_id}.{field} but step {step_id!r} has no output_schema."
|
|
74
|
+
)
|
|
75
|
+
else:
|
|
76
|
+
names = [f.name for f in ref_step.output_schema]
|
|
77
|
+
if field not in names:
|
|
78
|
+
errors.append(
|
|
79
|
+
f"Step {step.id!r} task references steps.{step_id}.{field} but step {step_id!r} output_schema has: {names}."
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# All if: expressions reference steps that appear earlier in dependency order
|
|
83
|
+
# and output_schema fields referenced in conditions exist
|
|
84
|
+
if waves:
|
|
85
|
+
order_so_far: set[str] = set()
|
|
86
|
+
for wave in waves:
|
|
87
|
+
for s in wave:
|
|
88
|
+
if s.if_:
|
|
89
|
+
ref = _condition_ref(s.if_.expression)
|
|
90
|
+
if ref:
|
|
91
|
+
cond_step_id, cond_field = ref
|
|
92
|
+
if cond_step_id not in order_so_far:
|
|
93
|
+
errors.append(
|
|
94
|
+
f"Step {s.id!r} condition references steps.{cond_step_id}.{cond_field} "
|
|
95
|
+
f"but {cond_step_id!r} is not a dependency (must run before this step)."
|
|
96
|
+
)
|
|
97
|
+
elif cond_step_id in step_by_id:
|
|
98
|
+
cond_step = step_by_id[cond_step_id]
|
|
99
|
+
if cond_field != "result":
|
|
100
|
+
names = [f.name for f in cond_step.output_schema]
|
|
101
|
+
if cond_field not in names:
|
|
102
|
+
errors.append(
|
|
103
|
+
f"Step {s.id!r} condition references steps.{cond_step_id}.{cond_field} "
|
|
104
|
+
f"but that step's output_schema has: {names}."
|
|
105
|
+
)
|
|
106
|
+
order_so_far.add(s.id)
|
|
107
|
+
|
|
108
|
+
# Warning: steps with no id set (we require id; no auto-generated opaque ids in schema)
|
|
109
|
+
# Our schema requires id, so skip.
|
|
110
|
+
|
|
111
|
+
# Warning: steps with output_schema but no downstream steps that use the output (dead output)
|
|
112
|
+
consumers: dict[str, set[str]] = {sid: set() for sid in step_ids}
|
|
113
|
+
for step in definition.steps:
|
|
114
|
+
for step_id, field in _template_refs(step.task):
|
|
115
|
+
if step_id in step_ids:
|
|
116
|
+
consumers[step_id].add(step.id)
|
|
117
|
+
for step in definition.steps:
|
|
118
|
+
if step.output_schema and step.id in consumers and not consumers[step.id]:
|
|
119
|
+
warnings.append(
|
|
120
|
+
f"Step {step.id!r} has output_schema but no downstream step uses its output (dead output)."
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
return ValidationReport(
|
|
124
|
+
valid=len(errors) == 0,
|
|
125
|
+
errors=errors,
|
|
126
|
+
warnings=warnings,
|
|
127
|
+
info=info,
|
|
128
|
+
)
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: devsper
|
|
3
|
+
Version: 2.1.6
|
|
4
|
+
Summary: Orchestrate distributed swarms of AI agents that collaboratively solve complex tasks.
|
|
5
|
+
Project-URL: Homepage, https://github.com/devsper-com/runtime
|
|
6
|
+
Project-URL: Documentation, https://docs.devsper.com
|
|
7
|
+
Project-URL: Changelog, https://github.com/devsper-com/runtime/blob/main/CHANGELOG.md
|
|
8
|
+
Project-URL: Worker, https://github.com/devsper-com/runtime/pkgs/container/devsper-worker
|
|
9
|
+
License-Expression: GPL-3.0-or-later
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: agents,ai,distributed,llm,multi-agent,orchestration,swarm
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
19
|
+
Requires-Python: >=3.12
|
|
20
|
+
Requires-Dist: httpx>=0.27.0
|
|
21
|
+
Requires-Dist: keyring>=24.0
|
|
22
|
+
Requires-Dist: langchain-anthropic>=1.3.4
|
|
23
|
+
Requires-Dist: langchain-google-genai>=4.2.1
|
|
24
|
+
Requires-Dist: langchain-openai>=1.1.10
|
|
25
|
+
Requires-Dist: langchain>=1.2.10
|
|
26
|
+
Requires-Dist: networkx>=3.6.1
|
|
27
|
+
Requires-Dist: numpy>=2.4.2
|
|
28
|
+
Requires-Dist: pydantic>=2.12.5
|
|
29
|
+
Requires-Dist: pyfiglet>=1.0
|
|
30
|
+
Requires-Dist: python-dotenv>=1.2.2
|
|
31
|
+
Requires-Dist: rich>=14.3.3
|
|
32
|
+
Requires-Dist: shtab>=1.6.0
|
|
33
|
+
Requires-Dist: textual>=0.50.0
|
|
34
|
+
Provides-Extra: a2a
|
|
35
|
+
Requires-Dist: fastapi>=0.110; extra == 'a2a'
|
|
36
|
+
Requires-Dist: httpx>=0.27; extra == 'a2a'
|
|
37
|
+
Requires-Dist: sse-starlette>=2.0; extra == 'a2a'
|
|
38
|
+
Requires-Dist: uvicorn>=0.29; extra == 'a2a'
|
|
39
|
+
Provides-Extra: compliance
|
|
40
|
+
Requires-Dist: spacy>=3.7; extra == 'compliance'
|
|
41
|
+
Provides-Extra: data
|
|
42
|
+
Requires-Dist: pandas>=2.0.0; extra == 'data'
|
|
43
|
+
Requires-Dist: scikit-learn>=1.3.0; extra == 'data'
|
|
44
|
+
Provides-Extra: distributed
|
|
45
|
+
Requires-Dist: fastapi>=0.110.0; extra == 'distributed'
|
|
46
|
+
Requires-Dist: hiredis>=2.3.0; extra == 'distributed'
|
|
47
|
+
Requires-Dist: redis>=5.0.0; extra == 'distributed'
|
|
48
|
+
Requires-Dist: uvicorn>=0.29.0; extra == 'distributed'
|
|
49
|
+
Provides-Extra: docs
|
|
50
|
+
Requires-Dist: mike>=1.1.0; extra == 'docs'
|
|
51
|
+
Requires-Dist: mkdocs-material>=9.5.0; extra == 'docs'
|
|
52
|
+
Requires-Dist: mkdocs<2,>=1.6.0; extra == 'docs'
|
|
53
|
+
Provides-Extra: document
|
|
54
|
+
Requires-Dist: docproc>=2.0.0; extra == 'document'
|
|
55
|
+
Requires-Dist: python-docx>=1.0.0; extra == 'document'
|
|
56
|
+
Provides-Extra: embeddings
|
|
57
|
+
Requires-Dist: sentence-transformers>=3.0.0; extra == 'embeddings'
|
|
58
|
+
Provides-Extra: explainability
|
|
59
|
+
Provides-Extra: hitl
|
|
60
|
+
Requires-Dist: httpx>=0.27; extra == 'hitl'
|
|
61
|
+
Provides-Extra: mcp
|
|
62
|
+
Requires-Dist: anyio>=4.0; extra == 'mcp'
|
|
63
|
+
Requires-Dist: httpx>=0.27; extra == 'mcp'
|
|
64
|
+
Provides-Extra: ollama
|
|
65
|
+
Provides-Extra: research
|
|
66
|
+
Requires-Dist: duckduckgo-search>=6.0.0; extra == 'research'
|
|
67
|
+
Provides-Extra: worker
|
|
68
|
+
Description-Content-Type: text/markdown
|
|
69
|
+
|
|
70
|
+
<p align="center">
|
|
71
|
+
<img src="https://raw.githubusercontent.com/rithulkamesh/devsper/refs/heads/main/branding/logo_bg.svg" alt="devsper" width="120" height="140" />
|
|
72
|
+
</p>
|
|
73
|
+
|
|
74
|
+
<h1 align="center">devsper</h1>
|
|
75
|
+
<p align="center"><strong>Distributed AI Swarm Runtime</strong></p>
|
|
76
|
+
|
|
77
|
+
<p align="center">
|
|
78
|
+
<a href="https://pypi.org/project/devsper/"><img src="https://img.shields.io/pypi/v/devsper?label=PyPI" alt="PyPI"></a>
|
|
79
|
+
<a href="https://www.gnu.org/licenses/gpl-3.0"><img src="https://img.shields.io/badge/License-GPLv3-blue.svg" alt="License: GPL v3"></a>
|
|
80
|
+
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.12+-green.svg" alt="Python 3.12+"></a>
|
|
81
|
+
</p>
|
|
82
|
+
|
|
83
|
+
<p align="center">
|
|
84
|
+
<em>Orchestrate multi-agent systems with a swarm execution model: tasks → DAG → parallel execution.</em>
|
|
85
|
+
</p>
|
|
86
|
+
|
|
87
|
+
> **Install:** PyPI package **`devsper`** · CLI **`devsper`**
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Quick start
|
|
92
|
+
|
|
93
|
+
**1. Install (Python 3.12+):**
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
pip install devsper
|
|
97
|
+
# or: uv add devsper
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**2. Set up API keys (pick one):**
|
|
101
|
+
|
|
102
|
+
Store credentials in your OS keychain so you never re-enter them:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
devsper credentials set openai api_key # prompts for value
|
|
106
|
+
devsper credentials set anthropic api_key
|
|
107
|
+
devsper credentials set github token
|
|
108
|
+
# or migrate from .env:
|
|
109
|
+
devsper credentials migrate
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Or use environment variables: `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GITHUB_TOKEN`, etc. (see [Credentials](#credentials)).
|
|
113
|
+
|
|
114
|
+
**3. Create a project and run:**
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
devsper init
|
|
118
|
+
devsper run "Summarize swarm intelligence in one paragraph."
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**4. Optional — shell completion:**
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Bash: add to ~/.bashrc
|
|
125
|
+
eval "$(devsper completion bash)"
|
|
126
|
+
|
|
127
|
+
# Zsh: add to ~/.zshrc
|
|
128
|
+
eval "$(devsper completion zsh)"
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Run from code
|
|
134
|
+
|
|
135
|
+
**From config file:**
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
from devsper import Swarm
|
|
139
|
+
|
|
140
|
+
swarm = Swarm(config="devsper.toml")
|
|
141
|
+
results = swarm.run("Analyze diffusion models and write a one-page summary.")
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Explicit parameters:**
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
from devsper import Swarm
|
|
148
|
+
|
|
149
|
+
swarm = Swarm(worker_count=4, worker_model="gpt-4o-mini", planner_model="gpt-4o-mini", use_tools=True)
|
|
150
|
+
results = swarm.run("Your task here.")
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Credentials are injected from the keyring (or env) when config is resolved—no code changes needed.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Credentials
|
|
158
|
+
|
|
159
|
+
API keys are **not** stored in config files. Use the **credential store** (OS keychain) or environment variables.
|
|
160
|
+
|
|
161
|
+
| What you want | Command or method |
|
|
162
|
+
|---------------|-------------------|
|
|
163
|
+
| Store a key securely | `devsper credentials set <provider> <key>` (prompts; uses keyring) |
|
|
164
|
+
| List stored keys (no values) | `devsper credentials list` |
|
|
165
|
+
| Import from `.env` / TOML | `devsper credentials migrate` |
|
|
166
|
+
| Export for sourcing / `.env` | `devsper credentials export <provider>` → prints `KEY=value` lines |
|
|
167
|
+
| Remove a key | `devsper credentials delete <provider> <key>` |
|
|
168
|
+
|
|
169
|
+
**Providers:** `openai`, `anthropic`, `github`, `gemini`, `azure`, `azure_anthropic` (keys: `api_key`, `token`, `endpoint`, `deployment`, `api_version` as applicable).
|
|
170
|
+
|
|
171
|
+
**Example — export and source in a script:**
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
eval "$(devsper credentials export azure)"
|
|
175
|
+
devsper run "Your task"
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
See [Configuration](docs/configuration.md#credentials-api-keys) and [CLI](docs/cli.md#credentials) for details.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## CLI
|
|
183
|
+
|
|
184
|
+
| Command | Description |
|
|
185
|
+
|--------|-------------|
|
|
186
|
+
| `devsper init` | Set up a new project (`devsper.toml`) |
|
|
187
|
+
| `devsper doctor` | Check environment (keys, config, tools) |
|
|
188
|
+
| `devsper run "task"` | Run swarm on a task |
|
|
189
|
+
| `devsper tui` | Terminal UI (prompt, dashboard, logs) |
|
|
190
|
+
| `devsper credentials set/list/migrate/export/delete` | Manage API keys (keyring) |
|
|
191
|
+
| `devsper completion bash \| zsh` | Print shell completion script |
|
|
192
|
+
| `devsper research [path]` | Literature review on a directory |
|
|
193
|
+
| `devsper analyze [path]` | Analyze repository architecture |
|
|
194
|
+
| `devsper memory [--limit N]` | List memory entries |
|
|
195
|
+
| `devsper query "…"` | Query knowledge graph |
|
|
196
|
+
| `devsper workflow <name>` | Run a workflow from `workflow.devsper.toml` |
|
|
197
|
+
| `devsper graph [run_id]` | Export task DAG as Mermaid |
|
|
198
|
+
| `devsper replay [run_id]` | Replay a run from event log |
|
|
199
|
+
| `devsper cache stats \| clear` | Task result cache |
|
|
200
|
+
| `devsper analytics` | Tool usage stats |
|
|
201
|
+
| `devsper build "app description" [-o dir]` | Autonomous app builder |
|
|
202
|
+
| `devsper upgrade [--check \| -y]` | Check for updates / upgrade |
|
|
203
|
+
|
|
204
|
+
Run `devsper --help` or `devsper <command> --help` for examples and options.
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Features
|
|
209
|
+
|
|
210
|
+
- **Planner → Scheduler → Executor → Agents** — DAG-based execution with configurable parallelism
|
|
211
|
+
- **Strategy-based planning** — Auto-selected strategies (research, code, data science, document, experiment) or LLM fallback
|
|
212
|
+
- **120+ tools** — Research, coding, data science, documents, experiments, memory; **smart tool selection** (top-k by similarity)
|
|
213
|
+
- **TOML config** — `devsper.toml` / `workflow.devsper.toml`; env > project > user > defaults
|
|
214
|
+
- **Memory & knowledge graph** — Episodic, semantic, research, artifact memory; summarization, namespaces, entity/relationship search
|
|
215
|
+
- **Map-reduce runtime** — `swarm.map_reduce(dataset, map_fn, reduce_fn)` using the worker pool
|
|
216
|
+
- **Workflows** — Define steps in `workflow.devsper.toml`; run with `devsper workflow <name>`; **structured output self-correction** (v1.7) retries with a correction prompt when JSON parsing fails
|
|
217
|
+
- **Critic & agent messaging (v1.7)** — Optional second-pass critic scores results and requests one retry; per-run message bus lets agents share discoveries via `BROADCAST:`
|
|
218
|
+
- **Speculative pre-fetching (v1.7)** — Pre-warm memory and tools for successor tasks while others run; reduces standing-up time
|
|
219
|
+
- **Plugin ecosystem** — Discover tools via entry_points (`devsper.plugins`)
|
|
220
|
+
- **Provider routing** — OpenAI, Anthropic, Azure, Gemini, **GitHub Models (Copilot)** (`provider:model` or model name); **429 retry with backoff** for GitHub rate limits
|
|
221
|
+
- **Automatic model routing** — `planner = "auto"` and `worker = "auto"` for cost/latency/quality-aware selection
|
|
222
|
+
- **EventLog, replay, telemetry** — Structured events for debugging and metrics
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Architecture
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
Planner
|
|
230
|
+
↓
|
|
231
|
+
Scheduler
|
|
232
|
+
↓
|
|
233
|
+
Executor
|
|
234
|
+
↓
|
|
235
|
+
Agents → Tools → Memory → Knowledge Graph
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Configuration
|
|
241
|
+
|
|
242
|
+
**Priority:** env > project config > user `~/.config/devsper/config.toml` > defaults.
|
|
243
|
+
|
|
244
|
+
**Locations:** `./devsper.toml`, `./workflow.devsper.toml`, `~/.config/devsper/config.toml`, or legacy `.devsper/config.toml`.
|
|
245
|
+
|
|
246
|
+
**Keep secrets out of TOML.** Use `devsper credentials` or environment variables for API keys. Non-secret settings (models, workers, paths) go in TOML.
|
|
247
|
+
|
|
248
|
+
**Example `devsper.toml`:**
|
|
249
|
+
|
|
250
|
+
```toml
|
|
251
|
+
[swarm]
|
|
252
|
+
workers = 6
|
|
253
|
+
adaptive_planning = true
|
|
254
|
+
max_iterations = 10
|
|
255
|
+
critic_enabled = true
|
|
256
|
+
critic_roles = ["research", "analysis", "code"]
|
|
257
|
+
message_bus_enabled = true
|
|
258
|
+
prefetch_enabled = true
|
|
259
|
+
|
|
260
|
+
[models]
|
|
261
|
+
planner = "auto"
|
|
262
|
+
worker = "auto"
|
|
263
|
+
|
|
264
|
+
[memory]
|
|
265
|
+
enabled = true
|
|
266
|
+
store_results = true
|
|
267
|
+
top_k = 5
|
|
268
|
+
|
|
269
|
+
[tools]
|
|
270
|
+
enabled = ["research", "coding", "documents"]
|
|
271
|
+
top_k = 12
|
|
272
|
+
|
|
273
|
+
[telemetry]
|
|
274
|
+
enabled = true
|
|
275
|
+
save_events = true
|
|
276
|
+
|
|
277
|
+
[providers.azure]
|
|
278
|
+
endpoint = "" # or use credentials store / env
|
|
279
|
+
deployment = ""
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Env overrides: `DEVSPER_WORKER_MODEL`, `DEVSPER_PLANNER_MODEL`, `DEVSPER_EVENTS_DIR`, `DEVSPER_DATA_DIR`, plus provider keys. Full schema: [docs/configuration.md](docs/configuration.md), [docs/providers.md](docs/providers.md).
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Distributed mode (v1.10)
|
|
287
|
+
|
|
288
|
+
Run a **controller** and **workers** across processes or machines. Workers can be Python or **Rust** (`devsper-worker` binary) for higher throughput.
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
# Redis + workers + controller (see examples/distributed/README.md)
|
|
292
|
+
docker compose up -d
|
|
293
|
+
uv run python examples/distributed/run_worker.py # or Rust: DEVSPER_WORKER_MODEL=github:gpt-4o ./worker/target/release/devsper-worker
|
|
294
|
+
uv run python examples/distributed/run_controller.py "Your task" --parallel
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Rust workers: set `DEVSPER_WORKER_MODEL=github:gpt-4o` (or your model), `DEVSPER_PYTHON_BIN=.venv/bin/python`, `DEVSPER_RPC_PORT=0` for multiple workers on one host. Credentials load from keychain in the subprocess.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Examples
|
|
302
|
+
|
|
303
|
+
| Workflow | Command |
|
|
304
|
+
|----------|---------|
|
|
305
|
+
| Distributed (v1.10) | `uv run python examples/distributed/run_controller.py "Task" --parallel` |
|
|
306
|
+
| Literature review | `devsper research papers/` or `uv run python examples/research/literature_review.py [dir]` |
|
|
307
|
+
| Repository analysis | `devsper analyze .` or `uv run python examples/coding/analyze_repository.py [path]` |
|
|
308
|
+
| Dataset analysis | `uv run python examples/data_science/dataset_analysis.py [path-to.csv]` |
|
|
309
|
+
| Document intelligence | `uv run python examples/documents/analyze_documents.py [dir]` |
|
|
310
|
+
| Parameter sweep | `uv run python examples/experiments/parameter_sweep.py --params '{"lr":[0.01,0.1]}'` |
|
|
311
|
+
|
|
312
|
+
Outputs under `examples/output/`. Run from project root when using script paths.
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## Documentation
|
|
317
|
+
|
|
318
|
+
Full docs (with versioning and dark mode): **[docs.devsper.com](https://docs.devsper.com)**. Source lives in `website/docs/` and is built with [Docusaurus](https://docusaurus.io).
|
|
319
|
+
|
|
320
|
+
| Doc | Description |
|
|
321
|
+
|-----|-------------|
|
|
322
|
+
| [Introduction](https://docs.devsper.com/docs/introduction) | What devsper is, problem, core concepts |
|
|
323
|
+
| [Architecture](https://docs.devsper.com/docs/architecture) | Planner, Scheduler, Executor, Agents, Tools, Memory, strategies |
|
|
324
|
+
| [Configuration](https://docs.devsper.com/docs/configuration) | TOML schema, locations, env, **credentials** |
|
|
325
|
+
| [Swarm runtime](https://docs.devsper.com/docs/swarm_runtime) | Task lifecycle, flow, map-reduce |
|
|
326
|
+
| [Tools](https://docs.devsper.com/docs/tools) | Registry, runner, smart selection, plugins |
|
|
327
|
+
| [Memory](https://docs.devsper.com/docs/memory_system) | Types, store, retrieval, knowledge graph |
|
|
328
|
+
| [Providers](https://docs.devsper.com/docs/providers) | Provider routing, Azure, GitHub Models, auto routing |
|
|
329
|
+
| [CLI](https://docs.devsper.com/docs/cli) | All commands, **credentials**, completion |
|
|
330
|
+
| [TUI](https://docs.devsper.com/docs/tui) | Layout, panels, shortcuts |
|
|
331
|
+
| [Examples](https://docs.devsper.com/docs/examples) | Workflows and commands |
|
|
332
|
+
| [Development](https://docs.devsper.com/docs/development) | Structure, adding tools/plugins/workflows |
|
|
333
|
+
| [Contributing](CONTRIBUTING.md) | Setup, testing, PR guidelines |
|
|
334
|
+
| [FAQ](https://docs.devsper.com/docs/faq) | Common questions |
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## Contributing
|
|
339
|
+
|
|
340
|
+
Contributions welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## License
|
|
345
|
+
|
|
346
|
+
**GPL-3.0-or-later** — see [LICENSE](LICENSE).
|