agentic-fabric 1.2.0__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 (93) hide show
  1. agentic_fabric-1.2.0/.gitignore +15 -0
  2. agentic_fabric-1.2.0/CHANGELOG.md +54 -0
  3. agentic_fabric-1.2.0/PKG-INFO +292 -0
  4. agentic_fabric-1.2.0/README.md +224 -0
  5. agentic_fabric-1.2.0/examples/README.md +18 -0
  6. agentic_fabric-1.2.0/examples/__init__.py +1 -0
  7. agentic_fabric-1.2.0/examples/discovery_workflow.py +49 -0
  8. agentic_fabric-1.2.0/examples/mcp_adapters.py +45 -0
  9. agentic_fabric-1.2.0/examples/runtime_context.py +27 -0
  10. agentic_fabric-1.2.0/examples/sample_workspace/packages/review/.fabric/fabric_agents/implementation_review/agents.yaml +9 -0
  11. agentic_fabric-1.2.0/examples/sample_workspace/packages/review/.fabric/fabric_agents/implementation_review/tasks.yaml +9 -0
  12. agentic_fabric-1.2.0/examples/sample_workspace/packages/review/.fabric/manifest.yaml +7 -0
  13. agentic_fabric-1.2.0/examples/tool_registry.py +29 -0
  14. agentic_fabric-1.2.0/pyproject.toml +183 -0
  15. agentic_fabric-1.2.0/src/agentic_fabric/__init__.py +90 -0
  16. agentic_fabric-1.2.0/src/agentic_fabric/__main__.py +9 -0
  17. agentic_fabric-1.2.0/src/agentic_fabric/agentic_data.py +284 -0
  18. agentic_fabric-1.2.0/src/agentic_fabric/base/__init__.py +150 -0
  19. agentic_fabric-1.2.0/src/agentic_fabric/base/archetypes.yaml +75 -0
  20. agentic_fabric-1.2.0/src/agentic_fabric/capabilities.py +130 -0
  21. agentic_fabric-1.2.0/src/agentic_fabric/config/__init__.py +10 -0
  22. agentic_fabric-1.2.0/src/agentic_fabric/config/agents.yaml +101 -0
  23. agentic_fabric-1.2.0/src/agentic_fabric/config/llm.py +285 -0
  24. agentic_fabric-1.2.0/src/agentic_fabric/config/tasks.yaml +177 -0
  25. agentic_fabric-1.2.0/src/agentic_fabric/core/__init__.py +17 -0
  26. agentic_fabric-1.2.0/src/agentic_fabric/core/decomposer.py +278 -0
  27. agentic_fabric-1.2.0/src/agentic_fabric/core/discovery.py +359 -0
  28. agentic_fabric-1.2.0/src/agentic_fabric/core/loader.py +207 -0
  29. agentic_fabric-1.2.0/src/agentic_fabric/core/manager.py +296 -0
  30. agentic_fabric-1.2.0/src/agentic_fabric/core/runner.py +70 -0
  31. agentic_fabric-1.2.0/src/agentic_fabric/fabric_agents/__init__.py +1 -0
  32. agentic_fabric-1.2.0/src/agentic_fabric/fabric_agents/connector_builder/__init__.py +1 -0
  33. agentic_fabric-1.2.0/src/agentic_fabric/fabric_agents/connector_builder/config/agents.yaml +16 -0
  34. agentic_fabric-1.2.0/src/agentic_fabric/fabric_agents/connector_builder/config/tasks.yaml +14 -0
  35. agentic_fabric-1.2.0/src/agentic_fabric/fabric_agents/connector_builder/connector_builder_fabric.py +103 -0
  36. agentic_fabric-1.2.0/src/agentic_fabric/main.py +591 -0
  37. agentic_fabric-1.2.0/src/agentic_fabric/runners/__init__.py +32 -0
  38. agentic_fabric-1.2.0/src/agentic_fabric/runners/base.py +369 -0
  39. agentic_fabric-1.2.0/src/agentic_fabric/runners/crewai_runner.py +206 -0
  40. agentic_fabric-1.2.0/src/agentic_fabric/runners/langgraph_runner.py +199 -0
  41. agentic_fabric-1.2.0/src/agentic_fabric/runners/local_cli_profiles.yaml +169 -0
  42. agentic_fabric-1.2.0/src/agentic_fabric/runners/local_cli_runner.py +491 -0
  43. agentic_fabric-1.2.0/src/agentic_fabric/runners/registry.py +165 -0
  44. agentic_fabric-1.2.0/src/agentic_fabric/runners/single_agent_runner.py +77 -0
  45. agentic_fabric-1.2.0/src/agentic_fabric/runners/strands_runner.py +214 -0
  46. agentic_fabric-1.2.0/src/agentic_fabric/tools/__init__.py +76 -0
  47. agentic_fabric-1.2.0/src/agentic_fabric/tools/adapters.py +128 -0
  48. agentic_fabric-1.2.0/src/agentic_fabric/tools/file_tools.py +391 -0
  49. agentic_fabric-1.2.0/src/agentic_fabric/tools/meshy_mcp.py +214 -0
  50. agentic_fabric-1.2.0/src/agentic_fabric/tools/registry.py +169 -0
  51. agentic_fabric-1.2.0/src/agentic_fabric/tools/scraping_tools.py +148 -0
  52. agentic_fabric-1.2.0/src/agentic_fabric/tools/vendor.py +110 -0
  53. agentic_fabric-1.2.0/src/agentic_fabric/tools/vendor_mcp.py +338 -0
  54. agentic_fabric-1.2.0/src/agentic_fabric/utils/__init__.py +6 -0
  55. agentic_fabric-1.2.0/src/agentic_fabric/utils/files.py +25 -0
  56. agentic_fabric-1.2.0/tests/__init__.py +3 -0
  57. agentic_fabric-1.2.0/tests/conftest.py +150 -0
  58. agentic_fabric-1.2.0/tests/e2e/README.md +215 -0
  59. agentic_fabric-1.2.0/tests/e2e/__init__.py +7 -0
  60. agentic_fabric-1.2.0/tests/e2e/conftest.py +14 -0
  61. agentic_fabric-1.2.0/tests/e2e/test_crewai_e2e.py +216 -0
  62. agentic_fabric-1.2.0/tests/e2e/test_langgraph_e2e.py +227 -0
  63. agentic_fabric-1.2.0/tests/e2e/test_strands_e2e.py +266 -0
  64. agentic_fabric-1.2.0/tests/test_agentic_data.py +319 -0
  65. agentic_fabric-1.2.0/tests/test_archetypes.py +256 -0
  66. agentic_fabric-1.2.0/tests/test_capabilities.py +100 -0
  67. agentic_fabric-1.2.0/tests/test_cli_commands.py +673 -0
  68. agentic_fabric-1.2.0/tests/test_cli_smoke.py +131 -0
  69. agentic_fabric-1.2.0/tests/test_connector_builder_fabric.py +149 -0
  70. agentic_fabric-1.2.0/tests/test_core_runner.py +103 -0
  71. agentic_fabric-1.2.0/tests/test_decomposer_edge_cases.py +324 -0
  72. agentic_fabric-1.2.0/tests/test_discovery.py +574 -0
  73. agentic_fabric-1.2.0/tests/test_discovery_nested.py +195 -0
  74. agentic_fabric-1.2.0/tests/test_examples.py +107 -0
  75. agentic_fabric-1.2.0/tests/test_fabric_mocker.py +73 -0
  76. agentic_fabric-1.2.0/tests/test_file_tool_paths.py +204 -0
  77. agentic_fabric-1.2.0/tests/test_file_tools.py +311 -0
  78. agentic_fabric-1.2.0/tests/test_import_surfaces.py +146 -0
  79. agentic_fabric-1.2.0/tests/test_llm_config.py +235 -0
  80. agentic_fabric-1.2.0/tests/test_loader_unit.py +279 -0
  81. agentic_fabric-1.2.0/tests/test_manager.py +448 -0
  82. agentic_fabric-1.2.0/tests/test_mcp_adapters.py +508 -0
  83. agentic_fabric-1.2.0/tests/test_runners.py +1209 -0
  84. agentic_fabric-1.2.0/tests/test_runtime_registry.py +115 -0
  85. agentic_fabric-1.2.0/tests/test_scraping_tool_crawler.py +161 -0
  86. agentic_fabric-1.2.0/tests/test_scraping_tools.py +31 -0
  87. agentic_fabric-1.2.0/tests/test_single_agent_runners.py +656 -0
  88. agentic_fabric-1.2.0/tests/test_tool_adapters.py +269 -0
  89. agentic_fabric-1.2.0/tests/test_tool_registry.py +281 -0
  90. agentic_fabric-1.2.0/tests/test_tools_init.py +92 -0
  91. agentic_fabric-1.2.0/tests/test_utils_files.py +26 -0
  92. agentic_fabric-1.2.0/tests/test_workflow_contracts.py +50 -0
  93. agentic_fabric-1.2.0/tests/test_yaml_config_errors.py +398 -0
@@ -0,0 +1,15 @@
1
+ .DS_Store
2
+ .coverage
3
+ .mypy_cache/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ .tox/
7
+ .venv/
8
+ __pycache__/
9
+ build/
10
+ dist/
11
+ htmlcov/
12
+ *.egg-info/
13
+ *.pyc
14
+ docs/_build/
15
+ docs/apidocs/
@@ -0,0 +1,54 @@
1
+ # CHANGELOG
2
+
3
+ <!-- version list -->
4
+
5
+ ## [1.2.0](https://github.com/jbcom/agentic-fabric/compare/agentic-fabric-v1.1.0...agentic-fabric-v1.2.0) (2026-06-27)
6
+
7
+
8
+ ### Features
9
+
10
+ * fix all assessment findings + add Ollama E2E support ([#4](https://github.com/jbcom/agentic-fabric/issues/4)) ([37cc3b6](https://github.com/jbcom/agentic-fabric/commit/37cc3b6b62de867676d37a7959dab955ac1d331c))
11
+
12
+ ## [1.1.0](https://github.com/jbcom/agentic-fabric/compare/agentic-fabric-v1.0.0...agentic-fabric-v1.1.0) (2026-06-27)
13
+
14
+
15
+ ### Features
16
+
17
+ * bootstrap agentic fabric workspace ([#1](https://github.com/jbcom/agentic-fabric/issues/1)) ([2704e67](https://github.com/jbcom/agentic-fabric/commit/2704e6758a77661477c01678073a1b78ca1abcbc))
18
+
19
+ ## v1.0.0 (2025-12-25)
20
+
21
+ ### Initial Stable Release
22
+
23
+ Framework-agnostic AI fabric agent orchestration is now production-ready!
24
+
25
+ ### Features
26
+
27
+ - **Multi-Framework Support**: Run fabric agents on CrewAI, LangGraph, or Strands
28
+ - **Auto-Detection**: Automatically selects best available framework
29
+ - **Universal YAML Format**: Define once, run anywhere
30
+ - **Single-Agent CLI Runners**: Support for aider, claude-code, ollama, and more
31
+ - **MCP Adapters**: Expose vendor-fabric catalog/data methods and Meshy capability metadata over MCP
32
+ - **Knowledge Base Integration**: Load domain knowledge from markdown files
33
+ - **Agent Archetypes**: Reusable agent templates
34
+ - **Comprehensive Testing**: 122+ unit tests, E2E test suite
35
+
36
+ ### Breaking Changes
37
+
38
+ - **Minimum Python version increased from 3.10 to 3.11**
39
+ - Required for CrewAI 1.5.0+ compatibility
40
+ - Python 3.11, 3.12, 3.13, 3.14 now supported
41
+
42
+ ### Documentation
43
+
44
+ - Complete API documentation with Sphinx
45
+ - Quick start guide and architecture overview
46
+ - jbcom dark theme branding applied
47
+ - Integration guides for vendor-fabric
48
+
49
+ ### Internal
50
+
51
+ - Full test coverage across all runners
52
+ - Ruff linting and formatting
53
+ - Type hints with mypy
54
+ - Tox for multi-version testing
@@ -0,0 +1,292 @@
1
+ Metadata-Version: 2.4
2
+ Name: agentic-fabric
3
+ Version: 1.2.0
4
+ Summary: Framework-agnostic agent fabric orchestration for CrewAI, LangGraph, Strands, local CLI runners, and vendor-fabric tools
5
+ Project-URL: Documentation, https://jonbogaty.com/agentic-fabric/
6
+ Project-URL: Issues, https://github.com/jbcom/agentic-fabric/issues
7
+ Project-URL: Source, https://github.com/jbcom/agentic-fabric
8
+ Project-URL: Changelog, https://github.com/jbcom/agentic-fabric/blob/main/CHANGELOG.md
9
+ Author-email: Jon Bogaty <jon@jonbogaty.com>
10
+ Maintainer-email: Jon Bogaty <jon@jonbogaty.com>
11
+ License: MIT
12
+ Keywords: ai-agents,crewai,langgraph,multi-agent,orchestration,strands,vendor-fabric
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Typing :: Typed
22
+ Requires-Python: >=3.11
23
+ Requires-Dist: pyyaml>=6.0.3
24
+ Provides-Extra: dev
25
+ Requires-Dist: coverage[toml]>=7.14.3; extra == 'dev'
26
+ Requires-Dist: mypy>=2.1.0; extra == 'dev'
27
+ Requires-Dist: pytest-agentic-fabric[tests]; extra == 'dev'
28
+ Requires-Dist: pytest-asyncio>=1.4.0; extra == 'dev'
29
+ Requires-Dist: pytest-cov>=7.1.0; extra == 'dev'
30
+ Requires-Dist: pytest-mock>=3.15.1; extra == 'dev'
31
+ Requires-Dist: pytest-timeout>=2.4.0; extra == 'dev'
32
+ Requires-Dist: pytest-xdist>=3.8.0; extra == 'dev'
33
+ Requires-Dist: pytest>=9.1.1; extra == 'dev'
34
+ Requires-Dist: ruff>=0.15.20; extra == 'dev'
35
+ Requires-Dist: types-pyyaml>=6.0.12.20260518; extra == 'dev'
36
+ Requires-Dist: types-requests>=2.33.0.20260518; extra == 'dev'
37
+ Provides-Extra: docs
38
+ Requires-Dist: furo>=2025.12.19; extra == 'docs'
39
+ Requires-Dist: myst-parser<6.0.0,>=5.1.0; extra == 'docs'
40
+ Requires-Dist: sphinx-autodoc2>=0.5.0; extra == 'docs'
41
+ Requires-Dist: sphinx-copybutton>=0.5.2; extra == 'docs'
42
+ Requires-Dist: sphinx<10.0.0,>=8.2.3; extra == 'docs'
43
+ Provides-Extra: langgraph
44
+ Requires-Dist: langchain-anthropic>=0.3.0; extra == 'langgraph'
45
+ Requires-Dist: langchain-ollama>=0.3.0; extra == 'langgraph'
46
+ Requires-Dist: langgraph>=0.2.0; extra == 'langgraph'
47
+ Provides-Extra: mcp
48
+ Requires-Dist: mcp>=1.0.0; extra == 'mcp'
49
+ Provides-Extra: scraping
50
+ Requires-Dist: beautifulsoup4>=4.12.0; extra == 'scraping'
51
+ Requires-Dist: requests>=2.31.0; extra == 'scraping'
52
+ Provides-Extra: strands
53
+ Requires-Dist: strands-agents[ollama]>=0.1.0; extra == 'strands'
54
+ Provides-Extra: tests
55
+ Requires-Dist: coverage[toml]>=7.14.3; extra == 'tests'
56
+ Requires-Dist: pytest-agentic-fabric[tests]; extra == 'tests'
57
+ Requires-Dist: pytest-asyncio>=1.4.0; extra == 'tests'
58
+ Requires-Dist: pytest-cov>=7.1.0; extra == 'tests'
59
+ Requires-Dist: pytest-mock>=3.15.1; extra == 'tests'
60
+ Requires-Dist: pytest-timeout>=2.4.0; extra == 'tests'
61
+ Requires-Dist: pytest-xdist>=3.8.0; extra == 'tests'
62
+ Requires-Dist: pytest>=9.1.1; extra == 'tests'
63
+ Provides-Extra: typing
64
+ Requires-Dist: mypy>=2.1.0; extra == 'typing'
65
+ Requires-Dist: types-pyyaml>=6.0.12.20260518; extra == 'typing'
66
+ Requires-Dist: types-requests>=2.33.0.20260518; extra == 'typing'
67
+ Description-Content-Type: text/markdown
68
+
69
+ # agentic-fabric
70
+
71
+ [![PyPI version](https://img.shields.io/pypi/v/agentic-fabric.svg)](https://pypi.org/project/agentic-fabric/)
72
+ [![CI](https://github.com/jbcom/agentic-fabric/actions/workflows/ci.yml/badge.svg)](https://github.com/jbcom/agentic-fabric/actions/workflows/ci.yml)
73
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
74
+ [![Python](https://img.shields.io/pypi/pyversions/agentic-fabric.svg)](https://pypi.org/project/agentic-fabric/)
75
+
76
+ Framework-agnostic agent fabric orchestration. Declare fabric agents once in YAML, then
77
+ run them on CrewAI, LangGraph, Strands, or local CLI runners without changing a
78
+ single fabric agent definition. Runtime frameworks are optional and are detected lazily
79
+ from what is installed.
80
+
81
+ [Documentation](https://jonbogaty.com/agentic-fabric/) | [Source](https://github.com/jbcom/agentic-fabric) | [Issues](https://github.com/jbcom/agentic-fabric/issues)
82
+
83
+ ## Installation
84
+
85
+ ```bash
86
+ # Core discovery, loading, runner selection, local CLI, and neutral file tools
87
+ pip install agentic-fabric
88
+
89
+ # With a specific framework
90
+ pip install "agentic-fabric[langgraph]"
91
+ pip install "agentic-fabric[strands]"
92
+
93
+ # Non-framework optional surfaces
94
+ pip install "agentic-fabric[mcp]"
95
+ pip install "agentic-fabric[scraping]"
96
+ ```
97
+
98
+ Local CLI runners do not require a Python extra. Install the external CLI
99
+ (`aider`, `claude`, `codex`, `ollama`, or a custom executable) and inspect
100
+ profiles with `agentic-fabric list-runners --json`.
101
+
102
+ Vendor-backed passthrough extras will be added after the upstream
103
+ `vendor-fabric` optional-extra contract is published and stable. Until then,
104
+ vendor references stay lazy and report install guidance at use time.
105
+
106
+ There is no aggregate AI extra. Install exactly the framework or provider path
107
+ you use. The CrewAI adapter remains lazy, but `agentic-fabric` does not publish
108
+ a CrewAI extra while CrewAI depends on ChromaDB releases covered by an upstream
109
+ critical advisory with no patched version. Install CrewAI separately only after
110
+ reviewing that advisory state. Core, local-CLI, and first-party scraping
111
+ installs are unaffected.
112
+
113
+ ## Quick Start
114
+
115
+ ### 1. Define a Fabric Agent (YAML)
116
+
117
+ ```yaml
118
+ # .fabric/fabric_agents/analyzer/agents.yaml
119
+ code_reviewer:
120
+ role: Senior Code Reviewer
121
+ goal: Find bugs and improvements
122
+ backstory: Expert at code analysis
123
+ ```
124
+
125
+ ```yaml
126
+ # .fabric/fabric_agents/analyzer/tasks.yaml
127
+ review_code:
128
+ description: Review the provided code for issues
129
+ expected_output: List of findings with severity
130
+ agent: code_reviewer
131
+ ```
132
+
133
+ ### 2. Run It
134
+
135
+ ```python
136
+ from pathlib import Path
137
+
138
+ from agentic_fabric import detect_framework, get_fabric_agent_config, run_fabric_agent_auto
139
+
140
+ # See what framework is available
141
+ framework = detect_framework()
142
+
143
+ # Load a fabric agent manifest discovered in a package or workspace
144
+ config = get_fabric_agent_config(Path(".fabric"), "analyzer")
145
+
146
+ # Auto-detect best framework and run
147
+ result = run_fabric_agent_auto(config, inputs={"code": "..."})
148
+ ```
149
+
150
+ Or from the CLI:
151
+
152
+ ```bash
153
+ agentic-fabric run my-package analyzer --input "Review this code: ..."
154
+ ```
155
+
156
+ ### 3. Use a Specific Runner
157
+
158
+ ```python
159
+ from agentic_fabric import get_runner
160
+
161
+ runner = get_runner("langgraph") # Force LangGraph
162
+ fabric_agent = runner.build_fabric_agent(config)
163
+ result = runner.run(fabric_agent, inputs)
164
+ ```
165
+
166
+ ### 4. Carry Runtime Context with Data
167
+
168
+ ```python
169
+ from agentic_fabric import AgenticData, get_framework_info
170
+
171
+ print(get_framework_info())
172
+
173
+ session = AgenticData({"repo": "jbcom/agentic-fabric"})
174
+ session.register_fabric_agent("reviewer", config)
175
+ result = session.run_fabric_agent("reviewer", runtime="crewai")
176
+ ```
177
+
178
+ ## Key Features
179
+
180
+ - Framework agnostic: one fabric agent definition, multiple runtime backends.
181
+ - Lazy imports: core package import does not require CrewAI, LangGraph,
182
+ Strands, or vendor SDKs.
183
+ - Framework-neutral file tools: built-in filesystem tools can be resolved
184
+ without installing CrewAI or Pydantic; framework adapters add schema wrappers
185
+ only when their optional dependencies are present.
186
+ - Focused extras: `langgraph`, `strands`, `mcp`, `scraping`,
187
+ `tests`, `typing`, `docs`, and `dev`.
188
+ - `AgenticData`: carries data, registered fabric agents, active runtime selection, and
189
+ vendor-layer context together.
190
+ - Capability decorators: runners and tools expose declared capabilities through
191
+ read-only metadata and deterministic dispatch.
192
+ - Tool resolution: built-in, vendor URI, and registered factories are preferred;
193
+ external dynamic imports require `AGENTIC_FABRIC_TOOL_IMPORT_ALLOWLIST`.
194
+ - Vendor tool catalogs: `AgenticData.vendor_tools()` adapts inherited
195
+ `VendorData` capability metadata into agent-facing tools without importing
196
+ provider SDKs directly.
197
+ - YAML-first: fabric agent configuration in YAML, not Python boilerplate.
198
+ - Hierarchical orchestration: `ManagerAgent` delegates across fabric agents.
199
+ - Package discovery: finds `.fabric/`, `.crewai/`, `.langgraph/`, and
200
+ `.strands/` directories.
201
+ - Vendor passthrough extras are deferred until `vendor-fabric` is published
202
+ with a stable optional-extra contract.
203
+ - CLI and library: use from the command line or import as a module.
204
+
205
+ ## Framework Priority
206
+
207
+ 1. CrewAI, if installed.
208
+ 2. LangGraph, if CrewAI is unavailable.
209
+ 3. Strands, if neither CrewAI nor LangGraph is available.
210
+
211
+ You can always force a specific runner with `get_runner("langgraph")` or
212
+ `agentic-fabric run --framework langgraph`.
213
+
214
+ If the selected runtime is not installed, errors point to the matching
215
+ `agentic-fabric[...]` extra. Framework-specific config directories also enforce
216
+ their runtime: a fabric agent in `.langgraph/` will not silently run on CrewAI.
217
+
218
+ ## Local CLI Runners
219
+
220
+ For single-agent coding tools, use the `--runner` CLI path:
221
+
222
+ ```bash
223
+ agentic-fabric list-runners --json
224
+ agentic-fabric run --runner aider --input "Add validation to auth.py"
225
+ agentic-fabric run --runner ollama --model deepseek-coder --input "Explain this module"
226
+ ```
227
+
228
+ Profiles are loaded from the packaged `local_cli_profiles.yaml`, validated
229
+ before use, and rejected on POSIX systems if the profiles file is group- or
230
+ world-writable.
231
+
232
+ ## MCP Adapters
233
+
234
+ The `mcp` extra installs the MCP transport dependency and enables two console
235
+ entry points:
236
+
237
+ ```bash
238
+ agentic-fabric-vendor-mcp
239
+ agentic-fabric-meshy-mcp
240
+ ```
241
+
242
+ `agentic-fabric-vendor-mcp` exposes credential-free vendor catalog tools and
243
+ public `vendor-fabric` data methods. `agentic-fabric-meshy-mcp` converts
244
+ Meshy capability metadata from `vendor-fabric[meshy]` into MCP tools. Both
245
+ servers import provider code lazily; install the matching `vendor-fabric`
246
+ package/extras in the same environment before running provider-backed tools.
247
+ If provider startup fails, the adapter error includes the `agentic-fabric[mcp]`
248
+ or `vendor-fabric[...]` install guidance plus the original import failure so
249
+ missing provider extras are visible.
250
+
251
+ ## Repository Boundary
252
+
253
+ - `extended-data` owns base data containers, logging, input handling, files,
254
+ redaction, and generic workflows.
255
+ - `vendor-fabric` owns vendor connectors, provider-backed sync, the SecretSync
256
+ Python facade/capability surfaces, provider capability metadata, and provider
257
+ dispatch.
258
+ - `agentic-fabric` owns fabric agent discovery, runner selection, framework adapters,
259
+ agent-facing tool wrappers, and orchestration.
260
+
261
+ Full guides and API documentation are published at
262
+ [jonbogaty.com/agentic-fabric](https://jonbogaty.com/agentic-fabric/).
263
+ `AGENTS.md` contains durable repository guidance for Codex sessions.
264
+
265
+ ## Documentation
266
+
267
+ The docs are built with Sphinx, Furo, and sphinx-autodoc2:
268
+
269
+ ```bash
270
+ tox -e docs
271
+ ```
272
+
273
+ Local validation:
274
+
275
+ ```bash
276
+ uv sync --all-packages --all-extras --dev
277
+ tox -e lint
278
+ tox -e typecheck
279
+ tox -e audit
280
+ tox -e py311
281
+ tox -e py312
282
+ tox -e py313
283
+ tox -e py314
284
+ tox -e coverage
285
+ tox -e plugin
286
+ tox -e examples
287
+ tox -e build
288
+ ```
289
+
290
+ ## License
291
+
292
+ MIT
@@ -0,0 +1,224 @@
1
+ # agentic-fabric
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/agentic-fabric.svg)](https://pypi.org/project/agentic-fabric/)
4
+ [![CI](https://github.com/jbcom/agentic-fabric/actions/workflows/ci.yml/badge.svg)](https://github.com/jbcom/agentic-fabric/actions/workflows/ci.yml)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Python](https://img.shields.io/pypi/pyversions/agentic-fabric.svg)](https://pypi.org/project/agentic-fabric/)
7
+
8
+ Framework-agnostic agent fabric orchestration. Declare fabric agents once in YAML, then
9
+ run them on CrewAI, LangGraph, Strands, or local CLI runners without changing a
10
+ single fabric agent definition. Runtime frameworks are optional and are detected lazily
11
+ from what is installed.
12
+
13
+ [Documentation](https://jonbogaty.com/agentic-fabric/) | [Source](https://github.com/jbcom/agentic-fabric) | [Issues](https://github.com/jbcom/agentic-fabric/issues)
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ # Core discovery, loading, runner selection, local CLI, and neutral file tools
19
+ pip install agentic-fabric
20
+
21
+ # With a specific framework
22
+ pip install "agentic-fabric[langgraph]"
23
+ pip install "agentic-fabric[strands]"
24
+
25
+ # Non-framework optional surfaces
26
+ pip install "agentic-fabric[mcp]"
27
+ pip install "agentic-fabric[scraping]"
28
+ ```
29
+
30
+ Local CLI runners do not require a Python extra. Install the external CLI
31
+ (`aider`, `claude`, `codex`, `ollama`, or a custom executable) and inspect
32
+ profiles with `agentic-fabric list-runners --json`.
33
+
34
+ Vendor-backed passthrough extras will be added after the upstream
35
+ `vendor-fabric` optional-extra contract is published and stable. Until then,
36
+ vendor references stay lazy and report install guidance at use time.
37
+
38
+ There is no aggregate AI extra. Install exactly the framework or provider path
39
+ you use. The CrewAI adapter remains lazy, but `agentic-fabric` does not publish
40
+ a CrewAI extra while CrewAI depends on ChromaDB releases covered by an upstream
41
+ critical advisory with no patched version. Install CrewAI separately only after
42
+ reviewing that advisory state. Core, local-CLI, and first-party scraping
43
+ installs are unaffected.
44
+
45
+ ## Quick Start
46
+
47
+ ### 1. Define a Fabric Agent (YAML)
48
+
49
+ ```yaml
50
+ # .fabric/fabric_agents/analyzer/agents.yaml
51
+ code_reviewer:
52
+ role: Senior Code Reviewer
53
+ goal: Find bugs and improvements
54
+ backstory: Expert at code analysis
55
+ ```
56
+
57
+ ```yaml
58
+ # .fabric/fabric_agents/analyzer/tasks.yaml
59
+ review_code:
60
+ description: Review the provided code for issues
61
+ expected_output: List of findings with severity
62
+ agent: code_reviewer
63
+ ```
64
+
65
+ ### 2. Run It
66
+
67
+ ```python
68
+ from pathlib import Path
69
+
70
+ from agentic_fabric import detect_framework, get_fabric_agent_config, run_fabric_agent_auto
71
+
72
+ # See what framework is available
73
+ framework = detect_framework()
74
+
75
+ # Load a fabric agent manifest discovered in a package or workspace
76
+ config = get_fabric_agent_config(Path(".fabric"), "analyzer")
77
+
78
+ # Auto-detect best framework and run
79
+ result = run_fabric_agent_auto(config, inputs={"code": "..."})
80
+ ```
81
+
82
+ Or from the CLI:
83
+
84
+ ```bash
85
+ agentic-fabric run my-package analyzer --input "Review this code: ..."
86
+ ```
87
+
88
+ ### 3. Use a Specific Runner
89
+
90
+ ```python
91
+ from agentic_fabric import get_runner
92
+
93
+ runner = get_runner("langgraph") # Force LangGraph
94
+ fabric_agent = runner.build_fabric_agent(config)
95
+ result = runner.run(fabric_agent, inputs)
96
+ ```
97
+
98
+ ### 4. Carry Runtime Context with Data
99
+
100
+ ```python
101
+ from agentic_fabric import AgenticData, get_framework_info
102
+
103
+ print(get_framework_info())
104
+
105
+ session = AgenticData({"repo": "jbcom/agentic-fabric"})
106
+ session.register_fabric_agent("reviewer", config)
107
+ result = session.run_fabric_agent("reviewer", runtime="crewai")
108
+ ```
109
+
110
+ ## Key Features
111
+
112
+ - Framework agnostic: one fabric agent definition, multiple runtime backends.
113
+ - Lazy imports: core package import does not require CrewAI, LangGraph,
114
+ Strands, or vendor SDKs.
115
+ - Framework-neutral file tools: built-in filesystem tools can be resolved
116
+ without installing CrewAI or Pydantic; framework adapters add schema wrappers
117
+ only when their optional dependencies are present.
118
+ - Focused extras: `langgraph`, `strands`, `mcp`, `scraping`,
119
+ `tests`, `typing`, `docs`, and `dev`.
120
+ - `AgenticData`: carries data, registered fabric agents, active runtime selection, and
121
+ vendor-layer context together.
122
+ - Capability decorators: runners and tools expose declared capabilities through
123
+ read-only metadata and deterministic dispatch.
124
+ - Tool resolution: built-in, vendor URI, and registered factories are preferred;
125
+ external dynamic imports require `AGENTIC_FABRIC_TOOL_IMPORT_ALLOWLIST`.
126
+ - Vendor tool catalogs: `AgenticData.vendor_tools()` adapts inherited
127
+ `VendorData` capability metadata into agent-facing tools without importing
128
+ provider SDKs directly.
129
+ - YAML-first: fabric agent configuration in YAML, not Python boilerplate.
130
+ - Hierarchical orchestration: `ManagerAgent` delegates across fabric agents.
131
+ - Package discovery: finds `.fabric/`, `.crewai/`, `.langgraph/`, and
132
+ `.strands/` directories.
133
+ - Vendor passthrough extras are deferred until `vendor-fabric` is published
134
+ with a stable optional-extra contract.
135
+ - CLI and library: use from the command line or import as a module.
136
+
137
+ ## Framework Priority
138
+
139
+ 1. CrewAI, if installed.
140
+ 2. LangGraph, if CrewAI is unavailable.
141
+ 3. Strands, if neither CrewAI nor LangGraph is available.
142
+
143
+ You can always force a specific runner with `get_runner("langgraph")` or
144
+ `agentic-fabric run --framework langgraph`.
145
+
146
+ If the selected runtime is not installed, errors point to the matching
147
+ `agentic-fabric[...]` extra. Framework-specific config directories also enforce
148
+ their runtime: a fabric agent in `.langgraph/` will not silently run on CrewAI.
149
+
150
+ ## Local CLI Runners
151
+
152
+ For single-agent coding tools, use the `--runner` CLI path:
153
+
154
+ ```bash
155
+ agentic-fabric list-runners --json
156
+ agentic-fabric run --runner aider --input "Add validation to auth.py"
157
+ agentic-fabric run --runner ollama --model deepseek-coder --input "Explain this module"
158
+ ```
159
+
160
+ Profiles are loaded from the packaged `local_cli_profiles.yaml`, validated
161
+ before use, and rejected on POSIX systems if the profiles file is group- or
162
+ world-writable.
163
+
164
+ ## MCP Adapters
165
+
166
+ The `mcp` extra installs the MCP transport dependency and enables two console
167
+ entry points:
168
+
169
+ ```bash
170
+ agentic-fabric-vendor-mcp
171
+ agentic-fabric-meshy-mcp
172
+ ```
173
+
174
+ `agentic-fabric-vendor-mcp` exposes credential-free vendor catalog tools and
175
+ public `vendor-fabric` data methods. `agentic-fabric-meshy-mcp` converts
176
+ Meshy capability metadata from `vendor-fabric[meshy]` into MCP tools. Both
177
+ servers import provider code lazily; install the matching `vendor-fabric`
178
+ package/extras in the same environment before running provider-backed tools.
179
+ If provider startup fails, the adapter error includes the `agentic-fabric[mcp]`
180
+ or `vendor-fabric[...]` install guidance plus the original import failure so
181
+ missing provider extras are visible.
182
+
183
+ ## Repository Boundary
184
+
185
+ - `extended-data` owns base data containers, logging, input handling, files,
186
+ redaction, and generic workflows.
187
+ - `vendor-fabric` owns vendor connectors, provider-backed sync, the SecretSync
188
+ Python facade/capability surfaces, provider capability metadata, and provider
189
+ dispatch.
190
+ - `agentic-fabric` owns fabric agent discovery, runner selection, framework adapters,
191
+ agent-facing tool wrappers, and orchestration.
192
+
193
+ Full guides and API documentation are published at
194
+ [jonbogaty.com/agentic-fabric](https://jonbogaty.com/agentic-fabric/).
195
+ `AGENTS.md` contains durable repository guidance for Codex sessions.
196
+
197
+ ## Documentation
198
+
199
+ The docs are built with Sphinx, Furo, and sphinx-autodoc2:
200
+
201
+ ```bash
202
+ tox -e docs
203
+ ```
204
+
205
+ Local validation:
206
+
207
+ ```bash
208
+ uv sync --all-packages --all-extras --dev
209
+ tox -e lint
210
+ tox -e typecheck
211
+ tox -e audit
212
+ tox -e py311
213
+ tox -e py312
214
+ tox -e py313
215
+ tox -e py314
216
+ tox -e coverage
217
+ tox -e plugin
218
+ tox -e examples
219
+ tox -e build
220
+ ```
221
+
222
+ ## License
223
+
224
+ MIT
@@ -0,0 +1,18 @@
1
+ # Examples
2
+
3
+ These examples are intentionally executable in CI. They avoid live LLM calls
4
+ and optional framework imports unless explicitly noted, so they also serve as
5
+ integration checks for the public API.
6
+
7
+ ```bash
8
+ python examples/discovery_workflow.py
9
+ python examples/tool_registry.py
10
+ python examples/runtime_context.py
11
+ python examples/mcp_adapters.py
12
+ ```
13
+
14
+ The bundled `sample_workspace/` directory demonstrates a framework-agnostic
15
+ `.fabric/` layout.
16
+
17
+ `mcp_adapters.py` shows the agentic-fabric-owned MCP entry points and a
18
+ client configuration shape without importing the MCP SDK or provider packages.
@@ -0,0 +1 @@
1
+ """Runnable agentic-fabric examples."""
@@ -0,0 +1,49 @@
1
+ """Discover and inspect a framework-agnostic fabric workspace."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import sys
7
+
8
+ from pathlib import Path
9
+ from typing import Any
10
+
11
+ from agentic_fabric.core.discovery import discover_packages, get_fabric_agent_config, load_manifest
12
+
13
+
14
+ DEFAULT_WORKSPACE = Path(__file__).parent / "sample_workspace"
15
+
16
+
17
+ def summarize_workspace(workspace_root: Path = DEFAULT_WORKSPACE) -> dict[str, Any]:
18
+ """Return a deterministic summary of fabric agents in a workspace."""
19
+ packages = discover_packages(workspace_root=workspace_root)
20
+ summary: dict[str, Any] = {"workspace": str(workspace_root), "packages": {}}
21
+
22
+ for package_name, config_dir in sorted(packages.items()):
23
+ manifest = load_manifest(config_dir)
24
+ fabric_agent_summaries = {}
25
+ for fabric_agent_name in sorted(manifest.get("fabric_agents", {})):
26
+ fabric_agent_config = get_fabric_agent_config(config_dir, fabric_agent_name)
27
+ fabric_agent_summaries[fabric_agent_name] = {
28
+ "description": fabric_agent_config.get("description", ""),
29
+ "required_framework": fabric_agent_config.get("required_framework"),
30
+ "agents": sorted(fabric_agent_config.get("agents", {})),
31
+ "tasks": sorted(fabric_agent_config.get("tasks", {})),
32
+ }
33
+
34
+ summary["packages"][package_name] = {
35
+ "config_dir": config_dir.name,
36
+ "fabric_agents": fabric_agent_summaries,
37
+ }
38
+
39
+ return summary
40
+
41
+
42
+ def main() -> None:
43
+ """Print the sample workspace summary as JSON."""
44
+ sys.stdout.write(json.dumps(summarize_workspace(), indent=2, sort_keys=True))
45
+ sys.stdout.write("\n")
46
+
47
+
48
+ if __name__ == "__main__":
49
+ main()