Skip to content

feat: bootstrap agentic fabric workspace - #1

Merged
jbdevprimary merged 35 commits into
mainfrom
codex/agentic-fabric-bootstrap
Jun 27, 2026
Merged

feat: bootstrap agentic fabric workspace#1
jbdevprimary merged 35 commits into
mainfrom
codex/agentic-fabric-bootstrap

Conversation

@jbdevprimary

@jbdevprimary jbdevprimary commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Bootstrap the agentic-fabric workspace with runtime package and pytest plugin package.
  • Add AgenticData runtime context, capability decorators, lazy runtime registry, vendor-backed tool references, docs, examples, CI, release-please, CD, and CodeQL workflows.
  • Keep vendor-fabric passthrough extras out because vendor-fabric is still not resolvable on PyPI.

Validation

  • uv sync --all-packages
  • tox -e lint,typecheck,docs
  • tox -e py311,py312,py313,py314
  • tox -e plugin,build

Upstream Notes

  • vendor-fabric branch is present locally/remotely, but vendor-fabric is not on PyPI yet.
  • extended-data tracking branch is currently gone after fetch/prune, with only local AGENTS.md untracked in that checkout.

Summary by CodeRabbit

  • New Features

    • Added a new command-line interface for discovering, running, and inspecting fabric agents.
    • Introduced support for multiple runtimes, including framework auto-selection and single-agent CLI runners.
    • Added packaged examples and a published API reference for common workflows.
  • Documentation

    • Expanded setup, architecture, development, and release documentation.
    • Added getting-started guides, usage notes, and workspace examples.
  • Bug Fixes

    • Improved path safety, config validation, and runtime/tool resolution behavior.
    • Strengthened CI, release, and test coverage across supported Python versions.

@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@jbdevprimary, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 44 minutes and 48 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more credits in the billing tab to continue.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3cba0390-208a-4277-af30-82731366f57a

📥 Commits

Reviewing files that changed from the base of the PR and between ceecb7f and 7daa64a.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (48)
  • .github/dependabot.yml
  • .github/workflows/automerge.yml
  • .github/workflows/cd.yml
  • .github/workflows/ci.yml
  • AGENTS.md
  • README.md
  • SECRETS_SYNC_ALIGNMENT.md
  • docs/agentic-workflows.rst
  • docs/api/index.rst
  • docs/architecture.rst
  • docs/conf.py
  • docs/development.rst
  • docs/vendor-fabric.rst
  • packages/agentic-fabric/README.md
  • packages/agentic-fabric/examples/README.md
  • packages/agentic-fabric/examples/mcp_adapters.py
  • packages/agentic-fabric/pyproject.toml
  • packages/agentic-fabric/src/agentic_fabric/base/archetypes.yaml
  • packages/agentic-fabric/src/agentic_fabric/core/discovery.py
  • packages/agentic-fabric/src/agentic_fabric/core/manager.py
  • packages/agentic-fabric/src/agentic_fabric/tools/meshy_mcp.py
  • packages/agentic-fabric/src/agentic_fabric/tools/scraping_tools.py
  • packages/agentic-fabric/src/agentic_fabric/tools/vendor_mcp.py
  • packages/agentic-fabric/tests/conftest.py
  • packages/agentic-fabric/tests/e2e/conftest.py
  • packages/agentic-fabric/tests/test_cli_commands.py
  • packages/agentic-fabric/tests/test_cli_smoke.py
  • packages/agentic-fabric/tests/test_core_runner.py
  • packages/agentic-fabric/tests/test_discovery.py
  • packages/agentic-fabric/tests/test_discovery_nested.py
  • packages/agentic-fabric/tests/test_examples.py
  • packages/agentic-fabric/tests/test_fabric_mocker.py
  • packages/agentic-fabric/tests/test_import_surfaces.py
  • packages/agentic-fabric/tests/test_loader.py
  • packages/agentic-fabric/tests/test_manager.py
  • packages/agentic-fabric/tests/test_mcp_adapters.py
  • packages/agentic-fabric/tests/test_runners.py
  • packages/agentic-fabric/tests/test_scraping_tool_crawler.py
  • packages/agentic-fabric/tests/test_workflow_contracts.py
  • packages/agentic-fabric/tests/test_yaml_config_errors.py
  • packages/pytest-agentic-fabric/README.md
  • packages/pytest-agentic-fabric/pyproject.toml
  • packages/pytest-agentic-fabric/src/pytest_agentic_fabric/__init__.py
  • packages/pytest-agentic-fabric/src/pytest_agentic_fabric/mocking.py
  • packages/pytest-agentic-fabric/src/pytest_agentic_fabric/plugin.py
  • packages/pytest-agentic-fabric/tests/test_plugin.py
  • pyproject.toml
  • tox.ini
📝 Walkthrough

<review_stack_artifact>

</review_stack_artifact>

Walkthrough

Adds repository-wide workspace configuration, shared runtime contracts, orchestration APIs, runner/tool integrations, example scripts, and a pytest-agentic-fabric plugin with e2e tests and fixtures.

Changes

Workspace and docs scaffold

Layer / File(s) Summary
Workspace and docs scaffold
.gitignore, .python-version, .release-please-manifest.json, LICENSE, README.md, pyproject.toml, release-please-config.json, tox.ini, .github/dependabot.yml, .github/workflows/{automerge,ci,cd,release}.yml, docs/{api/index.rst,conf.py,index.rst,architecture.rst,agentic-workflows.rst,development.rst,getting-started.rst,pillars.rst,vendor-fabric.rst,_static/agentic-fabric.css}, AGENTS.md, AGENTIC_REINFORCEMENT.md, SECRETS_SYNC_ALIGNMENT.md
Top-level repository configuration, release automation, and documentation site files are added.
Shared runtime contracts
packages/agentic-fabric/{pyproject.toml,README.md,CHANGELOG.md}, packages/agentic-fabric/src/agentic_fabric/{__init__.py,__main__.py,config/*,capabilities.py,agentic_data.py,utils/*,runners/{registry.py,base.py,single_agent_runner.py},base/archetypes.yaml}, packages/agentic-fabric/tests/{test_runtime_registry.py,test_llm_config.py,test_agentic_data.py,test_capabilities.py,test_utils_files.py,test_import_surfaces.py}
Package metadata, shared runtime contracts, and package-level import surfaces are added for agentic-fabric.
Discovery, orchestration, and CLI
packages/agentic-fabric/src/agentic_fabric/core/{__init__.py,discovery.py,decomposer.py,loader.py,manager.py,runner.py,main.py}, packages/agentic-fabric/tests/{conftest.py,test_discovery.py,test_discovery_nested.py,test_decomposer_edge_cases.py,test_core_runner.py,test_loader.py,test_loader_unit.py,test_manager.py,test_cli_commands.py,test_cli_smoke.py}
Discovery, orchestration, loader, manager, CLI entry points, and their validation tests are added.
Framework runners and tool stack
packages/agentic-fabric/src/agentic_fabric/{base/__init__.py,fabric_agents/*,tools/*,runners/{crewai_runner.py,langgraph_runner.py,strands_runner.py,local_cli_runner.py,local_cli_profiles.yaml}}, packages/agentic-fabric/tests/{_fabric_mocker.py,test_runners.py,test_single_agent_runners.py,test_file_tools.py,test_file_tool_paths.py,test_tool_adapters.py,test_tool_registry.py,test_scraping_tool_crawler.py,test_scraping_tools.py,test_connector_builder_fabric.py,test_mcp_adapters.py,test_fabric_mocker.py,test_tools_init.py,test_import_surfaces.py}
Framework runners, tool resolution, secure file access, and vendor/MCP adapters are added with their tests and base export checks.
Examples and sample workspace
packages/agentic-fabric/examples/*, packages/agentic-fabric/examples/sample_workspace/packages/review/.fabric/**, packages/agentic-fabric/tests/test_examples.py
Example scripts and sample workspace fixtures are added.
pytest-agentic-fabric e2e harness
packages/pytest-agentic-fabric/{README.md,CHANGELOG.md,pyproject.toml}, packages/pytest-agentic-fabric/src/pytest_agentic_fabric/{__init__.py,plugin.py,py.typed}, packages/pytest-agentic-fabric/tests/test_plugin.py, packages/agentic-fabric/tests/e2e/{README.md,__init__.py,conftest.py,test_crewai_e2e.py,test_langgraph_e2e.py,test_strands_e2e.py}
The pytest plugin package and E2E runtime test harness are added.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Poem

A rabbit hopped through docs and code,
With YAML carrots on the road.
The runners twitched, the tests ran bright,
And every path fit just right.
🐇✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the PR as a workspace bootstrap and matches the broad scope of the changes.
Docstring Coverage ✅ Passed Docstring coverage is 93.36% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/agentic-fabric-bootstrap

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@amazon-q-developer amazon-q-developer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

This PR introduces the agentic-fabric workspace with comprehensive runtime support, capability decorators, and CI/CD workflows. The architecture is well-designed with good separation of concerns.

Critical Security Issues Found

I've identified 8 security vulnerabilities that must be addressed before merge:

Path Traversal Vulnerabilities (CWE-22)

  • file_tools.py: All three tools (GameCodeWriterTool, GameCodeReaderTool, DirectoryListTool) have incomplete path traversal protection - they check for ".." but don't validate that resolved paths stay within workspace boundaries
  • discovery.py: Configuration loading constructs file paths from YAML data without validation, allowing potential access to arbitrary files

Code Execution Risks (CWE-94, CWE-78)

  • tools/registry.py: The resolve_tool function allows arbitrary module imports via "module:attribute" syntax without whitelisting
  • local_cli_runner.py: YAML configuration loading and subprocess execution need validation to prevent command injection if config files are compromised

Validation Status

All validation tests mentioned in the PR description have passed (tox lint, typecheck, docs, py311-314, plugin, build), which is good. However, these security issues require fixes before this can be safely merged.

Recommendation

Do not merge until the path traversal and code execution vulnerabilities are addressed. These are not theoretical risks - they could allow attackers to read/write arbitrary files or execute malicious code.


You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.


⚠️ This PR contains more than 30 files. Amazon Q is better at reviewing smaller PRs, and may miss issues in larger changesets.

Comment thread packages/agentic-fabric/src/agentic_fabric/tools/registry.py
Comment thread packages/agentic-fabric/src/agentic_fabric/tools/file_tools.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/tools/file_tools.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/tools/file_tools.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/core/discovery.py Outdated

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request bootstraps the agentic-fabric workspace, introducing a framework-agnostic agent crew orchestration package with support for CrewAI, LangGraph, Strands, and local CLI runners, alongside the sibling pytest-agentic-fabric testing package. The feedback focuses on improving robustness and defensive programming across the codebase. Key recommendations include resolving a potential infinite loop and performance bottleneck in the web crawler by tracking visited URLs immediately and using a deque, replacing exists() checks with is_dir() when traversing directories to avoid NotADirectoryError crashes, and explicitly specifying encoding='utf-8' when opening YAML configurations and manifests to prevent platform-specific decoding errors.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread packages/agentic-fabric/src/agentic_fabric/tools/scraping_tools.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/core/discovery.py
Comment thread packages/agentic-fabric/src/agentic_fabric/core/discovery.py
Comment thread packages/agentic-fabric/src/agentic_fabric/utils/files.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/core/discovery.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/crew.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/core/loader.py
Comment thread packages/agentic-fabric/src/agentic_fabric/runners/crewai_runner.py
Comment thread packages/agentic-fabric/src/agentic_fabric/core/discovery.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

🟡 Minor comments (11)
packages/agentic-fabric/src/agentic_fabric/__main__.py-1-1 (1)

1-1: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Stale module name in docstring.

The docstring says python -m crew_agents, but this package is agentic_fabric.

📝 Proposed fix
-"""Allow running as: python -m crew_agents"""
+"""Allow running as: python -m agentic_fabric"""
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/__main__.py` at line 1, The module
docstring at the top of __main__.py still refers to the old package name, which
is stale. Update the docstring in __main__ so it matches the current package
entrypoint name, changing the referenced run command from the old module name to
agentic_fabric.
packages/agentic-fabric/src/agentic_fabric/runners/langgraph_runner.py-91-93 (1)

91-93: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Comment contradicts the configured default model.

The comment claims "Claude 3.5 Sonnet" while default_model is claude-haiku-4-5-20251001. Align the comment to avoid confusion.

📝 Proposed fix
-        # Default to Claude 3.5 Sonnet if no model specified
-        default_model = "claude-haiku-4-5-20251001"
+        # Default to Claude Haiku 4.5 if no model specified
+        default_model = "claude-haiku-4-5-20251001"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/runners/langgraph_runner.py`
around lines 91 - 93, The default model comment in langgraph_runner’s model
selection path is out of sync with the actual fallback value. Update the comment
near the ChatAnthropic(model=model or default_model) return so it matches the
real default_model identifier, or change the default value to match the intended
model; keep the comment and the default_model constant consistent.
packages/agentic-fabric/tests/test_manager.py-259-262 (1)

259-262: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Assert the promised result ordering explicitly.

The comment says input order must be preserved, but these membership checks still pass if delegate_parallel() returns the two results swapped. Compare against the exact list instead.

Proposed fix
             results = await manager.delegate_parallel(
                 [
                     ("design", "Create design"),
                     ("assets", "Generate assets"),
                 ]
             )
 
             assert len(results) == 2
-            # Verify correct results returned (order matches input order)
-            assert "Design done" in results
-            assert "Assets done" in results
+            # Verify correct results returned in input order
+            assert results == ["Design done", "Assets done"]
             # Both should have been executed
             assert mock_run.call_count == 2
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/tests/test_manager.py` around lines 259 - 262, The
test in test_manager should verify that delegate_parallel preserves input order,
not just that both values are present. Update the assertions around results so
they compare against the exact expected list in order, using the
delegate_parallel behavior and the surrounding results checks to confirm the
returned sequence matches the input sequence precisely.
packages/agentic-fabric/src/agentic_fabric/tools/adapters.py-79-88 (1)

79-88: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Pass the original tool signature through runner or always supply args_schema. With infer_schema=True, a **kwargs-only wrapper won’t surface the tool’s real parameters to LangChain, so the model can end up with an empty/generic input schema instead of the expected fields.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/tools/adapters.py` around lines 79
- 88, The StructuredTool wrapping in the adapters flow is losing the original
tool signature because `_build_runner` returns a `**kwargs`-style wrapper while
`StructuredTool.from_function` may infer schema from that wrapper instead of the
real tool. Update the `adapted_tools.append(...)` path in `adapters.py` so the
original signature is preserved through `runner` or an explicit `args_schema` is
always provided, and make the `infer_schema` behavior consistent with that
choice to ensure LangChain sees the correct parameters.
packages/agentic-fabric/src/agentic_fabric/capabilities.py-90-107 (1)

90-107: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

list_capabilities returns duplicates for aliased capabilities.

agent_capabilities keys every public name (the canonical name plus each alias) to the same AgentCapabilitySpec. So a capability declared with one or more aliases is stored under multiple keys, and list_capabilities (which iterates .values()) emits that spec once per alias rather than once per capability. Deduplicate before returning.

🐛 Proposed fix
     `@classmethod`
     def list_capabilities(cls, *, kind: str | None = None) -> tuple[AgentCapabilitySpec, ...]:
         """Return declared capabilities, optionally filtered by kind."""
-        capabilities = list(cls.agent_capabilities.values())
+        seen: set[int] = set()
+        capabilities: list[AgentCapabilitySpec] = []
+        for capability in cls.agent_capabilities.values():
+            if id(capability) in seen:
+                continue
+            seen.add(id(capability))
+            capabilities.append(capability)
         if kind is not None:
             capabilities = [capability for capability in capabilities if capability.kind == kind]
         return tuple(capabilities)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/capabilities.py` around lines 90 -
107, `list_capabilities` is returning duplicate entries because it reads all
values from `agent_capabilities`, which includes the same `AgentCapabilitySpec`
under the canonical name and each alias. Update `AgentCapable.list_capabilities`
to deduplicate before returning, using the spec identity or canonical name so
each capability is emitted only once, and keep the optional kind filter working
after deduplication. Use `agent_capabilities` and `list_capabilities` as the
main touchpoints when fixing this.
packages/agentic-fabric/src/agentic_fabric/runners/local_cli_runner.py-181-186 (1)

181-186: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Reject unsupported constructor inputs up front.

The final else accepts any object, not just LocalCLIConfig. Passing the wrong type here won't fail until later attribute access, which turns a simple caller error into a much less clear runtime crash.

Proposed fix
-        else:
-            # Use provided LocalCLIConfig directly
-            self.config = profile
+        elif isinstance(profile, LocalCLIConfig):
+            self.config = profile
+        else:
+            msg = "profile must be a profile name, LocalCLIConfig, or config dict"
+            raise TypeError(msg)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/runners/local_cli_runner.py`
around lines 181 - 186, The LocalCLI runner constructor currently falls through
in LocalCLIRunner.__init__ and accepts any object in the final else branch,
which defers bad input failures until later. Tighten the type handling around
the profile/config assignment so only supported inputs are accepted: keep the
dict-to-LocalCLIConfig conversion, allow only an actual LocalCLIConfig instance
in the direct assignment path, and reject everything else immediately with a
clear error. Use the existing LocalCLIRunner and LocalCLIConfig symbols to place
the validation near the current isinstance(profile, dict) logic.
packages/agentic-fabric/src/agentic_fabric/runners/crewai_runner.py-66-74 (1)

66-74: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Forward task-context references are silently dropped.

tasks_by_name only contains tasks built earlier in the iteration, so a task whose context lists a task defined later in tasks_config is silently skipped at Line 69. This produces a crew with missing dependency wiring and no error/warning. Consider a two-pass build (create all tasks first, then wire context), or at least warn on unresolved context names.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/runners/crewai_runner.py` around
lines 66 - 74, The task context wiring in CrewaiRunner is dropping forward
references because `tasks_by_name` only contains already-built tasks. Update
`CrewaiRunner` so `build_task`/task creation supports unresolved context names,
either by doing a two-pass build in `crewai_runner.py` (create all tasks first,
then attach `context`) or by explicitly warning on any names in
`task_cfg.get("context", [])` that are not yet resolved. Make sure the logic
around `tasks_by_name`, `context_tasks`, and `build_task` preserves dependency
links for tasks defined later in `tasks_config`.
packages/agentic-fabric/src/agentic_fabric/core/discovery.py-233-234 (1)

233-234: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Missing agents/tasks keys raise KeyError instead of a clear error.

crew_config["agents"] and crew_config["tasks"] are indexed directly. A manifest crew entry lacking either key raises an opaque KeyError, whereas the docstring advertises ValueError for malformed crews. Use .get() with an explicit validation/error message.

Proposed guard
-    agents_path = _resolve_config_path(config_dir, crew_config["agents"])
-    tasks_path = _resolve_config_path(config_dir, crew_config["tasks"])
+    try:
+        agents_rel = crew_config["agents"]
+        tasks_rel = crew_config["tasks"]
+    except KeyError as exc:
+        raise ValueError(f"Crew '{crew_name}' is missing required key: {exc}") from exc
+    agents_path = _resolve_config_path(config_dir, agents_rel)
+    tasks_path = _resolve_config_path(config_dir, tasks_rel)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/core/discovery.py` around lines
233 - 234, The crew manifest handling in discovery should not index
crew_config["agents"] and crew_config["tasks"] directly because missing keys
currently raise an opaque KeyError. Update the crew-loading logic in
discovery.py to validate these fields with .get() and raise a clear ValueError
with an explicit message when either agents or tasks is absent, keeping the
behavior aligned with the documented malformed-crew error handling in the
relevant discovery function.
.github/workflows/ci.yml-28-32 (1)

28-32: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Harden checkout by disabling credential persistence.

Both actions/checkout steps (Lines 29 and 41) leave persist-credentials at its default (true), which writes the auth token into .git/config. Neither job pushes, so the token is unnecessary post-checkout and can leak through cached artifacts/state.

🔒 Proposed hardening (apply to both checkout steps)
       - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+        with:
+          persist-credentials: false
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 28 - 32, Harden the workflow by
disabling credential persistence on both uses of actions/checkout in the CI job
definitions, since neither job needs to push after checkout. Add the
persist-credentials setting to each checkout step so the auth token is not
written into .git/config and cannot leak through cached state; update both
checkout invocations consistently in the workflow.

Source: Linters/SAST tools

packages/agentic-fabric/tests/test_loader.py-18-21 (1)

18-21: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Mark this module as crewai too.

The import skip handles missing installs, but these tests still run under -m "not crewai" when CrewAI happens to be installed. That breaks the marker split declared in pyproject.toml.

Proposed fix
-pytestmark = pytest.mark.skipif(
-    not pytest.importorskip("crewai", reason="crewai not installed"),
-    reason="crewai not installed",
-)
+pytest.importorskip("crewai", reason="crewai not installed")
+
+pytestmark = [pytest.mark.crewai]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/tests/test_loader.py` around lines 18 - 21, The test
module-level skip only handles missing CrewAI installs, so it still runs under
the crewai marker split when CrewAI is present. Update the pytestmark in
test_loader.py to also apply the crewai marker alongside the existing
import-based skip, using the module-level pytestmark assignment so these tests
are excluded by -m "not crewai" and remain consistent with the marker setup in
pyproject.toml.
packages/agentic-fabric/tests/test_file_tools.py-124-145 (1)

124-145: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Assert the written contents, not just existence.

A writer that creates an empty or stale file still passes this test today. Add a content assertion so the success path actually verifies the write contract.

Suggested assertion
         assert "Successfully wrote" in result
         assert (ecs_dir / "TestComponent.ts").exists()
+        assert (ecs_dir / "TestComponent.ts").read_text() == "export const TestComponent = {};"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/tests/test_file_tools.py` around lines 124 - 145, The
success-path test for GameCodeWriterTool only checks that TestComponent.ts
exists, so it can miss empty or stale writes. Update
test_writes_to_allowed_directory to also verify the file contents after
tool._run completes, using the created TestComponent.ts path under ecs_dir, so
the test asserts the actual write contract rather than just file creation.
🧹 Nitpick comments (13)
packages/agentic-fabric/src/agentic_fabric/runners/langgraph_runner.py (2)

31-41: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Docstring drift: returns a ReAct agent, not a StateGraph.

build_crew documents converting to a StateGraph, but it returns create_react_agent(...). Update the docstring to reflect the current behavior.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/runners/langgraph_runner.py`
around lines 31 - 41, The docstring for build_crew is out of sync with the
implementation: it says the function builds a LangGraph StateGraph, but the
function actually returns create_react_agent(...). Update the build_crew
docstring in LangGraphRunner to describe the real behavior and return type, and
remove the outdated StateGraph wording so the summary, Args, and Returns
sections match the current implementation.

89-93: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

Vendor SDK invoked directly from agent runtime code.

get_llm instantiates langchain_anthropic.ChatAnthropic directly. Per the package boundary, vendor-backed integrations should be routed through vendor-fabric rather than calling provider SDKs from agent code. Please confirm whether LLM construction should also be delegated, or whether runners are an intentional exception to this boundary.

As per coding guidelines: "Route vendor-backed tools through vendor-fabric; do not call SDKs directly from agent code."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/runners/langgraph_runner.py`
around lines 89 - 93, The get_llm path in langgraph_runner currently
instantiates ChatAnthropic directly, which violates the vendor-fabric boundary;
update this runner to construct the LLM through the vendor-fabric abstraction
instead of importing langchain_anthropic here. Use the existing get_llm symbol
in langgraph_runner as the integration point, and if runners are intended to be
an exception, refactor the boundary explicitly so this direct provider SDK call
is removed or replaced with the approved vendor-fabric wrapper.

Source: Coding guidelines

packages/pytest-agentic-fabric/src/pytest_agentic_fabric/__init__.py (1)

9-9: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Avoid hard-coding __version__ here. This duplicates the package version already tracked in pyproject.toml, so it can drift from the published runtime version.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/pytest-agentic-fabric/src/pytest_agentic_fabric/__init__.py` at line
9, Remove the hard-coded __version__ assignment from the package __init__ module
and make the runtime version come from the single source of truth used by the
package metadata in pyproject.toml. Update the module that currently defines
__version__ so it no longer duplicates version state, and keep any version
access points consistent with the package’s existing version-loading or metadata
approach.

Source: Learnings

packages/agentic-fabric/src/agentic_fabric/core/loader.py (1)

41-60: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Double file read when loading knowledge sources.

Each file is fully read via read_text only to test for non-empty content, then TextFileKnowledgeSource reads the same file again. Over large rglob trees this doubles disk I/O. A cheaper emptiness check avoids the redundant full read.

♻️ Proposed change
         for ext in ["*.md", "*.ts", "*.tsx", "*.py"]:
             for file_path in knowledge_path.rglob(ext):
                 try:
-                    # Read file content directly
-                    content = file_path.read_text(encoding="utf-8")
-                    if content.strip():
+                    # Skip empty/whitespace-only files without a full read.
+                    if file_path.stat().st_size > 0 and file_path.read_text(encoding="utf-8").strip():
                         sources.append(
                             TextFileKnowledgeSource(
                                 file_paths=[str(file_path)],
                             )
                         )
                 except (OSError, ValueError) as exc:
                     logger.warning("Could not load knowledge source %s: %s", file_path, exc)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/core/loader.py` around lines 41 -
60, The knowledge source loader is doing a full read of each file in the loop
before creating TextFileKnowledgeSource, which duplicates disk I/O. In the
loader logic that iterates over knowledge_paths and rglob extensions, replace
the read_text-based emptiness test with a cheaper check so you only inspect
enough to decide if the file is empty, then let TextFileKnowledgeSource handle
loading the content once. Keep the existing filtering and error handling in the
same loader flow.
packages/agentic-fabric/src/agentic_fabric/runners/strands_runner.py (1)

25-28: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Install hint diverges from the extras convention.

The PR description and runner convention surface the agentic-fabric[strands] extra, but this error message points users to pip install strands-agents. Aligning the hint avoids confusing users who expect the extras-based install path.

♻️ Suggested wording
-        except ImportError as e:
-            raise RuntimeError("Strands not installed. Install with: pip install strands-agents") from e
+        except ImportError as e:
+            raise RuntimeError(
+                "Strands not installed. Install with: pip install 'agentic-fabric[strands]'"
+            ) from e
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/runners/strands_runner.py` around
lines 25 - 28, The ImportError handling in strands_runner.py uses an install
hint that conflicts with the package’s extras-based convention. Update the
RuntimeError message in the import guard around import strands so it points
users to the agentic-fabric[strands] extra instead of strands-agents, keeping
the message consistent with the runner’s install guidance.
packages/agentic-fabric/src/agentic_fabric/core/decomposer.py (1)

226-299: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated required-framework enforcement in decompose_crew and run_crew_auto.

The required-framework validation block (request-vs-required conflict check, availability check, framework = required_framework) is copy-pasted in both functions. Extract a small helper (e.g. _enforce_required_framework(crew_config, framework) -> str | None) to keep the two in sync as the logic evolves.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/core/decomposer.py` around lines
226 - 299, The required-framework enforcement logic is duplicated in both
`decompose_crew` and `run_crew_auto`, so extract it into a shared helper such as
`_enforce_required_framework(crew_config, framework)` and have both functions
call it before `get_runner`. Move the request-vs-required conflict check,
`is_framework_available` validation, and `framework = required_framework`
assignment into that helper, returning the resolved framework for reuse. Keep
`_get_install_command` unchanged and update both call sites so the behavior
stays identical while avoiding drift.
packages/agentic-fabric/tests/test_decomposer_edge_cases.py (1)

30-31: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Duplicate clear_runtime_cache() call.

clear_runtime_cache() is invoked twice in setup_method; the second call is redundant (likely a copy-paste). Harmless, but remove one for clarity.

♻️ Proposed fix
         _framework_cache.clear()
         clear_runtime_cache()
-        clear_runtime_cache()
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/tests/test_decomposer_edge_cases.py` around lines 30
- 31, The setup_method in test_decomposer_edge_cases.py calls
clear_runtime_cache() twice in a row, and the second invocation is redundant.
Remove the duplicate call and keep a single clear_runtime_cache() invocation in
setup_method for clarity.
packages/agentic-fabric/tests/test_cli_smoke.py (1)

31-50: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Unused fixture setup in this test.

(tmp_path / "packages").mkdir() has no effect since discover_packages and list_crews are both patched to return {}. Safe to drop the directory creation (and tmp_path) to reduce noise. Non-blocking.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/tests/test_cli_smoke.py` around lines 31 - 50, The
test setup in test_list_command_with_no_packages includes unused filesystem
scaffolding, since discover_packages and list_crews are both mocked to return
empty results. Remove the unnecessary tmp_path dependency and the packages
directory creation from test_list_command_with_no_packages, keeping only the
patched agentic_fabric.main behavior and the assertion on captured output.
packages/agentic-fabric/tests/e2e/README.md (1)

85-91: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Add a language to the fenced code block.

The directory-tree block lacks a language hint (markdownlint MD040). Use text to silence the warning.

📝 Proposed fix
-```
+```text
 tests/e2e/
 ├── conftest.py              # E2E fixtures and pytest configuration
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/tests/e2e/README.md` around lines 85 - 91, Add a
language hint to the fenced directory-tree block in the E2E README to satisfy
markdownlint MD040. Update the markdown fence around the tests/e2e listing to
use a text-style code block, keeping the existing tree content unchanged, so the
block is explicitly treated as plain text.

Source: Linters/SAST tools

packages/agentic-fabric/examples/discovery_workflow.py (1)

41-43: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

print() in an agentic-fabric module conflicts with the logging guideline.

This is an example script whose purpose is CLI output, so a print here is reasonable. Flagging only because the path falls under the rule that forbids runtime print() paths in packages/agentic-fabric/**/*.py. If you want strict compliance, route through logging/sys.stdout.write; otherwise consider this acknowledged.

As per coding guidelines: "Use configured logging or Python logging/warnings/exceptions; do not use runtime print() paths."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/examples/discovery_workflow.py` around lines 41 - 43,
The `main()` function in `discovery_workflow.py` uses a runtime `print()` for
CLI output, which conflicts with the logging guideline under
`packages/agentic-fabric/**/*.py`. Update this entrypoint to emit the JSON via
configured logging or `sys.stdout.write` instead of `print()`, keeping the
`summarize_workspace()` output behavior intact and ensuring the script remains a
valid CLI example.

Source: Coding guidelines

packages/agentic-fabric/src/agentic_fabric/crews/connector_builder/connector_builder_crew.py (1)

12-12: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider lazy/registry-backed import of crewai.

The runtime imports crewai eagerly at module load, so importing this module hard-requires crewai to be installed. Per the package conventions, optional framework imports should be lazy and registry-backed so the package remains importable without every framework present.

As per coding guidelines: "Keep optional framework imports lazy and registry-backed."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@packages/agentic-fabric/src/agentic_fabric/crews/connector_builder/connector_builder_crew.py`
at line 12, The module eagerly imports crewai at load time, which makes the
package fail to import when that optional dependency is absent. Update
connector_builder_crew to use a lazy, registry-backed import pattern for crewai
(using the module’s existing registry/deferred import approach) so Agent, Crew,
and Task are only resolved when needed and the package stays importable without
crewai installed.

Source: Coding guidelines

packages/agentic-fabric/src/agentic_fabric/config/llm.py (1)

146-157: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

OpenRouter fallback silently discards the requested model.

When model isn't already prefixed with openrouter/ (e.g. forcing provider=LLMProvider.OPENROUTER with "claude-opus-4-20250514"), the requested model is dropped and replaced with openrouter/auto, so the caller's intent is lost rather than being mapped to an equivalent OpenRouter model. Consider mapping known Claude identifiers to their OpenRouter equivalents (the MODELS table already defines openrouter-haiku) or at least surfacing the substitution.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/config/llm.py` around lines 146 -
157, The _create_openrouter_llm helper is discarding the caller’s requested
model whenever it is not already prefixed with openrouter/, replacing it with
openrouter/auto instead. Update this fallback logic so it preserves intent by
mapping known provider model names to their OpenRouter equivalents using the
MODELS table (for example via an explicit Claude-to-OpenRouter mapping) or, if
no mapping exists, surface the substitution clearly rather than silently
overwriting model before constructing LLM.
packages/agentic-fabric/tests/test_file_tools.py (1)

16-17: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Avoid the module-wide crewai skip here. packages/agentic-fabric/tests/test_file_tools.py:16-17 can use the same fake-crewai import pattern as packages/agentic-fabric/tests/test_file_tool_paths.py, so this only drops redundant coverage in the base test env. Reuse that setup or stub the tool base class instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/tests/test_file_tools.py` around lines 16 - 17, The
module-wide crewai skip in test_file_tools is removing coverage unnecessarily;
instead, follow the fake-crewai import approach used in test_file_tool_paths or
stub the tool base class so the tests can run in the base environment. Update
the setup around the top-level import/pytest.importorskip in test_file_tools to
inject a minimal crewai replacement before importing the tool classes, keeping
the existing test cases intact without skipping the whole module.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/agentic-fabric/src/agentic_fabric/__init__.py`:
- Line 36: The hardcoded __version__ constant in __init__ should be replaced
with a runtime lookup from installed package metadata so it stays aligned with
release-please-managed packaging data. Update the version export logic in
__init__ to read the package version via importlib.metadata for the
agentic_fabric package, and keep the __version__ symbol as the public entry
point without duplicating the value from pyproject.toml.

In
`@packages/agentic-fabric/src/agentic_fabric/crews/connector_builder/connector_builder_crew.py`:
- Around line 63-67: The CrewAI constructor in ConnectorBuilderCrew is passing
an invalid verbosity value to Crew, since Crew.verbose expects a boolean. Update
the Crew instantiation in the connector_builder_crew setup to use verbose=True
instead of verbose=2 so the Crew object can be created without pydantic
validation errors.

In `@packages/agentic-fabric/src/agentic_fabric/main.py`:
- Around line 121-123: The `args.file` read in the command setup happens before
the main `try`/CLI error formatting path, so missing or unreadable files can
bypass structured error handling. Move the file-loading logic for `input_text`
into the existing error-handling flow in `main.py` so both `--file` code paths
are covered by the same JSON/user-facing command error path, and ensure the
`Path(args.file).read_text(...)` access is wrapped alongside the rest of the
command execution logic.
- Around line 156-172: Pass the resolved framework into run_crew_auto() instead
of only the user-requested value. In main.py, use the already computed
framework_used (which respects required_framework, requested, and
auto-detection) when calling run_crew_auto, so the execution path in this branch
cannot ignore a crew’s required_framework and fall back to detect_framework().

In `@packages/agentic-fabric/src/agentic_fabric/runners/local_cli_runner.py`:
- Around line 171-180: The built-in profile lookup in LocalCLIRunner is reusing
a cached mutable LocalCLIConfig instance, so changes can leak across runners.
Update the profile selection logic in LocalCLIRunner (and the other affected
assignment site mentioned in the review) to assign a fresh copy of the cached
profile config instead of the original object, while keeping the unknown-profile
validation and _load_profiles flow unchanged.

In `@packages/agentic-fabric/src/agentic_fabric/tools/registry.py`:
- Around line 115-116: The built-in factory call in resolve_tool is happening
before the existing try/except, so optional-dependency ImportError from
_TOOL_FACTORIES[canonical_name]() can crash tool resolution instead of being
skipped. Move the factory invocation for canonical_name through the same guarded
path used by resolve_tools, or wrap the factory call itself in the existing
exception handling so missing deps are logged as a warning and the tool is
omitted. Use the resolve_tool and resolve_tools flow, along with
_TOOL_FACTORIES, ScrapeWebsiteTool, and CrawlWebsiteTool, to keep unavailable
built-in tools from aborting crew loading.

In `@packages/agentic-fabric/src/agentic_fabric/tools/scraping_tools.py`:
- Around line 43-64: The scraping loop in the crawl method can grow without
bound and exhaust resources. Update the crawl logic around the current_url queue
processing to enforce a maximum page count or depth limit before enqueuing more
links, and use a list-based accumulator in place of repeated scraped_content
concatenation so the final content can be joined once at the end. Keep the
changes localized to the crawling flow that uses urls_to_visit, visited_urls,
and _scrape_content.
- Around line 40-62: `CrawlWebsiteTool` is still vulnerable to internal SSRF and
unbounded crawling because `requests.get` is called on user-controlled URLs and
same-netloc links without validation, and the loop has no page/depth limit.
Update the crawl logic around `urls_to_visit`, `urlparse`, and `requests.get` to
reject non-HTTP(S) targets and block private/loopback/internal hosts before any
fetch, and add a hard cap on pages visited or crawl depth so the queue cannot
grow indefinitely. Keep the checks centralized in the crawl flow so every URL
discovered by the `soup.find_all("a")` path is filtered before being enqueued or
requested.

In `@packages/agentic-fabric/src/agentic_fabric/utils/files.py`:
- Around line 20-22: The YAML loader in load_yaml currently force-casts whatever
yaml.safe_load returns to dict[str, Any], which can hide malformed configs when
the root is not a mapping. Update load_yaml in files.py to validate that the
parsed root is a dictionary before returning it, and raise a clear loader error
if safe_load produces a list, string, number, or other non-mapping value. Keep
the existing load_yaml behavior for valid mapping inputs, but make the return
path explicit so callers don’t get a misleading dict from an invalid YAML root.

In `@packages/agentic-fabric/tests/test_connector_builder_crew.py`:
- Around line 49-61: The helper import_connector_builder_with_fake_crewai leaves
agentic_fabric.crews.connector_builder.connector_builder_crew cached after
importing it with the fake crewai module, which can leak
FakeAgent/FakeTask/FakeCrew into later tests. Update the helper to clean up that
imported module after use by removing the cached connector-builder module from
sys.modules once the import has completed, while still preserving the
monkeypatched crewai setup for the duration of the import.

In `@packages/agentic-fabric/tests/test_core_runner.py`:
- Line 41: The `calls` list in `test_core_runner.py` is typed too narrowly for
the values appended later. Update the annotation on `calls` to accept both tuple
shapes used by the test, since `CrewTestConfig.mock` records a 2-item tuple
while the config branch appends a 3-item `("config", path, crew_name)` tuple;
keep the change local to this test helper so the typechecker matches the actual
`calls` usage.

In `@packages/agentic-fabric/tests/test_file_tools.py`:
- Around line 45-63: The test for get_workspace_root is hardcoding the default
package to otterfall, which bakes a repo-specific assumption into a generic
helper. Update the test around
agentic_fabric.tools.file_tools.get_workspace_root to use the workspace’s
configured/default package source instead of assuming otterfall, or explicitly
set TARGET_PACKAGE/package_name in the setup so the expectation matches the
intended default behavior.

---

Minor comments:
In @.github/workflows/ci.yml:
- Around line 28-32: Harden the workflow by disabling credential persistence on
both uses of actions/checkout in the CI job definitions, since neither job needs
to push after checkout. Add the persist-credentials setting to each checkout
step so the auth token is not written into .git/config and cannot leak through
cached state; update both checkout invocations consistently in the workflow.

In `@packages/agentic-fabric/src/agentic_fabric/__main__.py`:
- Line 1: The module docstring at the top of __main__.py still refers to the old
package name, which is stale. Update the docstring in __main__ so it matches the
current package entrypoint name, changing the referenced run command from the
old module name to agentic_fabric.

In `@packages/agentic-fabric/src/agentic_fabric/capabilities.py`:
- Around line 90-107: `list_capabilities` is returning duplicate entries because
it reads all values from `agent_capabilities`, which includes the same
`AgentCapabilitySpec` under the canonical name and each alias. Update
`AgentCapable.list_capabilities` to deduplicate before returning, using the spec
identity or canonical name so each capability is emitted only once, and keep the
optional kind filter working after deduplication. Use `agent_capabilities` and
`list_capabilities` as the main touchpoints when fixing this.

In `@packages/agentic-fabric/src/agentic_fabric/core/discovery.py`:
- Around line 233-234: The crew manifest handling in discovery should not index
crew_config["agents"] and crew_config["tasks"] directly because missing keys
currently raise an opaque KeyError. Update the crew-loading logic in
discovery.py to validate these fields with .get() and raise a clear ValueError
with an explicit message when either agents or tasks is absent, keeping the
behavior aligned with the documented malformed-crew error handling in the
relevant discovery function.

In `@packages/agentic-fabric/src/agentic_fabric/runners/crewai_runner.py`:
- Around line 66-74: The task context wiring in CrewaiRunner is dropping forward
references because `tasks_by_name` only contains already-built tasks. Update
`CrewaiRunner` so `build_task`/task creation supports unresolved context names,
either by doing a two-pass build in `crewai_runner.py` (create all tasks first,
then attach `context`) or by explicitly warning on any names in
`task_cfg.get("context", [])` that are not yet resolved. Make sure the logic
around `tasks_by_name`, `context_tasks`, and `build_task` preserves dependency
links for tasks defined later in `tasks_config`.

In `@packages/agentic-fabric/src/agentic_fabric/runners/langgraph_runner.py`:
- Around line 91-93: The default model comment in langgraph_runner’s model
selection path is out of sync with the actual fallback value. Update the comment
near the ChatAnthropic(model=model or default_model) return so it matches the
real default_model identifier, or change the default value to match the intended
model; keep the comment and the default_model constant consistent.

In `@packages/agentic-fabric/src/agentic_fabric/runners/local_cli_runner.py`:
- Around line 181-186: The LocalCLI runner constructor currently falls through
in LocalCLIRunner.__init__ and accepts any object in the final else branch,
which defers bad input failures until later. Tighten the type handling around
the profile/config assignment so only supported inputs are accepted: keep the
dict-to-LocalCLIConfig conversion, allow only an actual LocalCLIConfig instance
in the direct assignment path, and reject everything else immediately with a
clear error. Use the existing LocalCLIRunner and LocalCLIConfig symbols to place
the validation near the current isinstance(profile, dict) logic.

In `@packages/agentic-fabric/src/agentic_fabric/tools/adapters.py`:
- Around line 79-88: The StructuredTool wrapping in the adapters flow is losing
the original tool signature because `_build_runner` returns a `**kwargs`-style
wrapper while `StructuredTool.from_function` may infer schema from that wrapper
instead of the real tool. Update the `adapted_tools.append(...)` path in
`adapters.py` so the original signature is preserved through `runner` or an
explicit `args_schema` is always provided, and make the `infer_schema` behavior
consistent with that choice to ensure LangChain sees the correct parameters.

In `@packages/agentic-fabric/tests/test_file_tools.py`:
- Around line 124-145: The success-path test for GameCodeWriterTool only checks
that TestComponent.ts exists, so it can miss empty or stale writes. Update
test_writes_to_allowed_directory to also verify the file contents after
tool._run completes, using the created TestComponent.ts path under ecs_dir, so
the test asserts the actual write contract rather than just file creation.

In `@packages/agentic-fabric/tests/test_loader.py`:
- Around line 18-21: The test module-level skip only handles missing CrewAI
installs, so it still runs under the crewai marker split when CrewAI is present.
Update the pytestmark in test_loader.py to also apply the crewai marker
alongside the existing import-based skip, using the module-level pytestmark
assignment so these tests are excluded by -m "not crewai" and remain consistent
with the marker setup in pyproject.toml.

In `@packages/agentic-fabric/tests/test_manager.py`:
- Around line 259-262: The test in test_manager should verify that
delegate_parallel preserves input order, not just that both values are present.
Update the assertions around results so they compare against the exact expected
list in order, using the delegate_parallel behavior and the surrounding results
checks to confirm the returned sequence matches the input sequence precisely.

---

Nitpick comments:
In `@packages/agentic-fabric/examples/discovery_workflow.py`:
- Around line 41-43: The `main()` function in `discovery_workflow.py` uses a
runtime `print()` for CLI output, which conflicts with the logging guideline
under `packages/agentic-fabric/**/*.py`. Update this entrypoint to emit the JSON
via configured logging or `sys.stdout.write` instead of `print()`, keeping the
`summarize_workspace()` output behavior intact and ensuring the script remains a
valid CLI example.

In `@packages/agentic-fabric/src/agentic_fabric/config/llm.py`:
- Around line 146-157: The _create_openrouter_llm helper is discarding the
caller’s requested model whenever it is not already prefixed with openrouter/,
replacing it with openrouter/auto instead. Update this fallback logic so it
preserves intent by mapping known provider model names to their OpenRouter
equivalents using the MODELS table (for example via an explicit
Claude-to-OpenRouter mapping) or, if no mapping exists, surface the substitution
clearly rather than silently overwriting model before constructing LLM.

In `@packages/agentic-fabric/src/agentic_fabric/core/decomposer.py`:
- Around line 226-299: The required-framework enforcement logic is duplicated in
both `decompose_crew` and `run_crew_auto`, so extract it into a shared helper
such as `_enforce_required_framework(crew_config, framework)` and have both
functions call it before `get_runner`. Move the request-vs-required conflict
check, `is_framework_available` validation, and `framework = required_framework`
assignment into that helper, returning the resolved framework for reuse. Keep
`_get_install_command` unchanged and update both call sites so the behavior
stays identical while avoiding drift.

In `@packages/agentic-fabric/src/agentic_fabric/core/loader.py`:
- Around line 41-60: The knowledge source loader is doing a full read of each
file in the loop before creating TextFileKnowledgeSource, which duplicates disk
I/O. In the loader logic that iterates over knowledge_paths and rglob
extensions, replace the read_text-based emptiness test with a cheaper check so
you only inspect enough to decide if the file is empty, then let
TextFileKnowledgeSource handle loading the content once. Keep the existing
filtering and error handling in the same loader flow.

In
`@packages/agentic-fabric/src/agentic_fabric/crews/connector_builder/connector_builder_crew.py`:
- Line 12: The module eagerly imports crewai at load time, which makes the
package fail to import when that optional dependency is absent. Update
connector_builder_crew to use a lazy, registry-backed import pattern for crewai
(using the module’s existing registry/deferred import approach) so Agent, Crew,
and Task are only resolved when needed and the package stays importable without
crewai installed.

In `@packages/agentic-fabric/src/agentic_fabric/runners/langgraph_runner.py`:
- Around line 31-41: The docstring for build_crew is out of sync with the
implementation: it says the function builds a LangGraph StateGraph, but the
function actually returns create_react_agent(...). Update the build_crew
docstring in LangGraphRunner to describe the real behavior and return type, and
remove the outdated StateGraph wording so the summary, Args, and Returns
sections match the current implementation.
- Around line 89-93: The get_llm path in langgraph_runner currently instantiates
ChatAnthropic directly, which violates the vendor-fabric boundary; update this
runner to construct the LLM through the vendor-fabric abstraction instead of
importing langchain_anthropic here. Use the existing get_llm symbol in
langgraph_runner as the integration point, and if runners are intended to be an
exception, refactor the boundary explicitly so this direct provider SDK call is
removed or replaced with the approved vendor-fabric wrapper.

In `@packages/agentic-fabric/src/agentic_fabric/runners/strands_runner.py`:
- Around line 25-28: The ImportError handling in strands_runner.py uses an
install hint that conflicts with the package’s extras-based convention. Update
the RuntimeError message in the import guard around import strands so it points
users to the agentic-fabric[strands] extra instead of strands-agents, keeping
the message consistent with the runner’s install guidance.

In `@packages/agentic-fabric/tests/e2e/README.md`:
- Around line 85-91: Add a language hint to the fenced directory-tree block in
the E2E README to satisfy markdownlint MD040. Update the markdown fence around
the tests/e2e listing to use a text-style code block, keeping the existing tree
content unchanged, so the block is explicitly treated as plain text.

In `@packages/agentic-fabric/tests/test_cli_smoke.py`:
- Around line 31-50: The test setup in test_list_command_with_no_packages
includes unused filesystem scaffolding, since discover_packages and list_crews
are both mocked to return empty results. Remove the unnecessary tmp_path
dependency and the packages directory creation from
test_list_command_with_no_packages, keeping only the patched agentic_fabric.main
behavior and the assertion on captured output.

In `@packages/agentic-fabric/tests/test_decomposer_edge_cases.py`:
- Around line 30-31: The setup_method in test_decomposer_edge_cases.py calls
clear_runtime_cache() twice in a row, and the second invocation is redundant.
Remove the duplicate call and keep a single clear_runtime_cache() invocation in
setup_method for clarity.

In `@packages/agentic-fabric/tests/test_file_tools.py`:
- Around line 16-17: The module-wide crewai skip in test_file_tools is removing
coverage unnecessarily; instead, follow the fake-crewai import approach used in
test_file_tool_paths or stub the tool base class so the tests can run in the
base environment. Update the setup around the top-level
import/pytest.importorskip in test_file_tools to inject a minimal crewai
replacement before importing the tool classes, keeping the existing test cases
intact without skipping the whole module.

In `@packages/pytest-agentic-fabric/src/pytest_agentic_fabric/__init__.py`:
- Line 9: Remove the hard-coded __version__ assignment from the package __init__
module and make the runtime version come from the single source of truth used by
the package metadata in pyproject.toml. Update the module that currently defines
__version__ so it no longer duplicates version state, and keep any version
access points consistent with the package’s existing version-loading or metadata
approach.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 98f28e65-e18a-46e2-9d15-263950f507e2

📥 Commits

Reviewing files that changed from the base of the PR and between 91e85f3 and 11b75c2.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (116)
  • .github/workflows/cd.yml
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • .gitignore
  • .python-version
  • .release-please-manifest.json
  • AGENTS.md
  • LICENSE
  • README.md
  • docs/_static/agentic-crew.css
  • docs/agentic-workflows.rst
  • docs/api/index.rst
  • docs/architecture.rst
  • docs/conf.py
  • docs/development.rst
  • docs/getting-started.rst
  • docs/index.rst
  • docs/pillars.rst
  • docs/vendor-fabric.rst
  • packages/agentic-fabric/CHANGELOG.md
  • packages/agentic-fabric/README.md
  • packages/agentic-fabric/examples/README.md
  • packages/agentic-fabric/examples/__init__.py
  • packages/agentic-fabric/examples/discovery_workflow.py
  • packages/agentic-fabric/examples/runtime_context.py
  • packages/agentic-fabric/examples/sample_workspace/packages/review/.crew/crews/implementation_review/agents.yaml
  • packages/agentic-fabric/examples/sample_workspace/packages/review/.crew/crews/implementation_review/tasks.yaml
  • packages/agentic-fabric/examples/sample_workspace/packages/review/.crew/manifest.yaml
  • packages/agentic-fabric/examples/tool_registry.py
  • packages/agentic-fabric/pyproject.toml
  • packages/agentic-fabric/src/agentic_fabric/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/__main__.py
  • packages/agentic-fabric/src/agentic_fabric/agentic_data.py
  • packages/agentic-fabric/src/agentic_fabric/base/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/base/archetypes.yaml
  • packages/agentic-fabric/src/agentic_fabric/capabilities.py
  • packages/agentic-fabric/src/agentic_fabric/config/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/config/agents.yaml
  • packages/agentic-fabric/src/agentic_fabric/config/llm.py
  • packages/agentic-fabric/src/agentic_fabric/config/tasks.yaml
  • packages/agentic-fabric/src/agentic_fabric/core/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/core/decomposer.py
  • packages/agentic-fabric/src/agentic_fabric/core/discovery.py
  • packages/agentic-fabric/src/agentic_fabric/core/loader.py
  • packages/agentic-fabric/src/agentic_fabric/core/manager.py
  • packages/agentic-fabric/src/agentic_fabric/core/runner.py
  • packages/agentic-fabric/src/agentic_fabric/crews/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/crews/connector_builder/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/crews/connector_builder/config/agents.yaml
  • packages/agentic-fabric/src/agentic_fabric/crews/connector_builder/config/tasks.yaml
  • packages/agentic-fabric/src/agentic_fabric/crews/connector_builder/connector_builder_crew.py
  • packages/agentic-fabric/src/agentic_fabric/main.py
  • packages/agentic-fabric/src/agentic_fabric/runners/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/runners/base.py
  • packages/agentic-fabric/src/agentic_fabric/runners/crewai_runner.py
  • packages/agentic-fabric/src/agentic_fabric/runners/langgraph_runner.py
  • packages/agentic-fabric/src/agentic_fabric/runners/local_cli_profiles.yaml
  • packages/agentic-fabric/src/agentic_fabric/runners/local_cli_runner.py
  • packages/agentic-fabric/src/agentic_fabric/runners/registry.py
  • packages/agentic-fabric/src/agentic_fabric/runners/single_agent_runner.py
  • packages/agentic-fabric/src/agentic_fabric/runners/strands_runner.py
  • packages/agentic-fabric/src/agentic_fabric/tools/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/tools/adapters.py
  • packages/agentic-fabric/src/agentic_fabric/tools/file_tools.py
  • packages/agentic-fabric/src/agentic_fabric/tools/registry.py
  • packages/agentic-fabric/src/agentic_fabric/tools/scraping_tools.py
  • packages/agentic-fabric/src/agentic_fabric/tools/vendor.py
  • packages/agentic-fabric/src/agentic_fabric/utils/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/utils/files.py
  • packages/agentic-fabric/tests/__init__.py
  • packages/agentic-fabric/tests/_crew_mocker.py
  • packages/agentic-fabric/tests/conftest.py
  • packages/agentic-fabric/tests/e2e/README.md
  • packages/agentic-fabric/tests/e2e/__init__.py
  • packages/agentic-fabric/tests/e2e/conftest.py
  • packages/agentic-fabric/tests/e2e/test_crewai_e2e.py
  • packages/agentic-fabric/tests/e2e/test_langgraph_e2e.py
  • packages/agentic-fabric/tests/e2e/test_strands_e2e.py
  • packages/agentic-fabric/tests/test_agentic_data.py
  • packages/agentic-fabric/tests/test_capabilities.py
  • packages/agentic-fabric/tests/test_cli_commands.py
  • packages/agentic-fabric/tests/test_cli_smoke.py
  • packages/agentic-fabric/tests/test_connector_builder_crew.py
  • packages/agentic-fabric/tests/test_core_runner.py
  • packages/agentic-fabric/tests/test_crew_mocker.py
  • packages/agentic-fabric/tests/test_decomposer_edge_cases.py
  • packages/agentic-fabric/tests/test_discovery.py
  • packages/agentic-fabric/tests/test_discovery_nested.py
  • packages/agentic-fabric/tests/test_examples.py
  • packages/agentic-fabric/tests/test_file_tool_paths.py
  • packages/agentic-fabric/tests/test_file_tools.py
  • packages/agentic-fabric/tests/test_import_surfaces.py
  • packages/agentic-fabric/tests/test_llm_config.py
  • packages/agentic-fabric/tests/test_loader.py
  • packages/agentic-fabric/tests/test_loader_unit.py
  • packages/agentic-fabric/tests/test_manager.py
  • packages/agentic-fabric/tests/test_runners.py
  • packages/agentic-fabric/tests/test_runtime_registry.py
  • packages/agentic-fabric/tests/test_scraping_tool_crawler.py
  • packages/agentic-fabric/tests/test_scraping_tools.py
  • packages/agentic-fabric/tests/test_single_agent_runners.py
  • packages/agentic-fabric/tests/test_tool_adapters.py
  • packages/agentic-fabric/tests/test_tool_registry.py
  • packages/agentic-fabric/tests/test_tools_init.py
  • packages/agentic-fabric/tests/test_utils_files.py
  • packages/agentic-fabric/tests/test_yaml_config_errors.py
  • packages/pytest-agentic-fabric/CHANGELOG.md
  • packages/pytest-agentic-fabric/README.md
  • packages/pytest-agentic-fabric/pyproject.toml
  • packages/pytest-agentic-fabric/src/pytest_agentic_fabric/__init__.py
  • packages/pytest-agentic-fabric/src/pytest_agentic_fabric/plugin.py
  • packages/pytest-agentic-fabric/src/pytest_agentic_fabric/py.typed
  • packages/pytest-agentic-fabric/tests/test_plugin.py
  • pyproject.toml
  • release-please-config.json
  • tox.ini

Comment thread packages/agentic-fabric/src/agentic_fabric/__init__.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/main.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/main.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/runners/local_cli_runner.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/tools/scraping_tools.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/utils/files.py
Comment thread packages/agentic-fabric/tests/test_connector_builder_crew.py Outdated
Comment thread packages/agentic-fabric/tests/test_core_runner.py Outdated
Comment thread packages/agentic-fabric/tests/test_file_tools.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/pytest-agentic-fabric/src/pytest_agentic_fabric/plugin.py (1)

135-171: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep agentic_workspace derived from agentic_fabric_agent_config.

This fixture accepts agentic_fabric_agent_config and then ignores it, so any override or parametrization of that config diverges from the manifest and YAML written to disk. That makes fixture composition misleading in plugin tests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/pytest-agentic-fabric/src/pytest_agentic_fabric/plugin.py` around
lines 135 - 171, The agentic_workspace fixture currently ignores
agentic_fabric_agent_config, so the manifest and YAML it writes can diverge from
the supplied test config. Update agentic_workspace to derive the written
manifest/agents/tasks content from agentic_fabric_agent_config instead of
hardcoding the sample values, and keep the same fixture shape so overrides and
parametrization flow through consistently.
packages/agentic-fabric/src/agentic_fabric/core/discovery.py (1)

81-84: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Reject unknown framework filters instead of widening discovery.

A misspelled framework currently falls back to FRAMEWORK_DIRS, so discover_packages(..., framework="crewaii") returns every config instead of none/an error. That silently defeats the caller’s filter.

Proposed fix
     if framework:
         dir_name = FRAMEWORK_TO_DIR.get(framework)
-        dirs_to_check = [dir_name] if dir_name else FRAMEWORK_DIRS
+        if dir_name is None:
+            raise ValueError(f"Unknown framework: {framework}")
+        dirs_to_check = [dir_name]
     else:
         dirs_to_check = FRAMEWORK_DIRS
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/agentic-fabric/src/agentic_fabric/core/discovery.py` around lines 81
- 84, The framework filter handling in discover_packages() currently widens to
FRAMEWORK_DIRS when FRAMEWORK_TO_DIR.get(framework) returns nothing, which lets
unknown values like a misspelling match everything. Update the discovery logic
in discover_packages() so only recognized framework values map to a directory,
and unknown framework inputs are rejected explicitly (or yield no results)
instead of falling back to all directories; use FRAMEWORK_TO_DIR and
dirs_to_check as the key points to adjust.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/automerge.yml:
- Around line 16-17: The auto-merge condition in the workflow currently trusts
github.event.pull_request.head.ref alone, which is user-controlled and can be
spoofed by any PR author. Update the automerge logic to avoid relying on the
branch-name prefix check by itself; instead, require a trusted author identity
(such as the release-please bot or dependabot[bot]) in the same condition, and
keep the check anchored in the existing pull_request event expression.

In @.github/workflows/cd.yml:
- Around line 83-90: The package validation in the workflow still interpolates
inputs.package directly into the shell script, which leaves the Validate package
input step vulnerable to GitHub Actions template injection. Update the workflow
to bind the dispatch input to an environment variable first, then use that
variable throughout the validation case statement and the uv build invocation
with normal shell quoting. Keep the allowlist behavior in the Validate package
input step, and ensure the later uv build and uv publish steps reference the
safe env-bound value instead of `${{ inputs.package }}`.

In `@packages/agentic-fabric/src/agentic_fabric/core/discovery.py`:
- Around line 167-179: `load_manifest` currently returns whatever
`yaml.safe_load()` produces, but downstream code assumes a dict and calls
`.get()`. Update `load_manifest` to validate that the parsed `manifest.yaml`
content is a mapping/dict and raise a clear configuration error if it is a list,
scalar, or otherwise invalid. Keep the fix centered in `load_manifest` and use
its existing `manifest_path` parsing flow so malformed manifests fail early with
an explicit message.
- Around line 240-245: The discovery loader currently masks missing or invalid
manifest files by substituting empty dicts and accepting non-mapping YAML, so
update the agent/task loading in discovery.py to fail fast instead. In the
discovery flow around the agents_path/tasks_path reads, raise an explicit error
if either required file is absent, and validate that yaml.safe_load returns a
mapping for both agents and tasks before continuing. Use the existing
discovery/config loading symbols such as _resolve_config_path and the
agents/tasks variables so the fix stays localized and surfaces contract
violations immediately.

In `@packages/agentic-fabric/src/agentic_fabric/tools/scraping_tools.py`:
- Around line 61-66: `requests.get` in the scraping flow still follows
redirects, so a URL validated by `_is_safe_crawl_url` can pivot to an unsafe
host; update both `ScrapeWebsiteTool._run` and `CrawlWebsiteTool._run` to
prevent redirect-based SSRF by disabling redirects or validating every redirect
hop before continuing. Make the fix in the shared request logic around the
current `requests.get(..., timeout=30)` call so all scraper paths enforce the
safety check consistently.

In `@packages/agentic-fabric/tests/_fabric_mocker.py`:
- Around line 392-403: The patch helper in patch_get_fabric_agent_config is
treating an explicitly empty config as falsy and replacing it with the default
stub, which prevents tests from simulating empty or malformed
get_fabric_agent_config results. Update the return assignment to distinguish
None from an empty dict by using an explicit is None check, so only a missing
config gets the default while {} is preserved as provided.

In `@packages/agentic-fabric/tests/test_scraping_tool_crawler.py`:
- Around line 81-96: The crawler page-limit test is implicitly relying on the
default crawl depth from CrawlWebsiteTool behavior, so make it self-contained by
explicitly setting MAX_CRAWL_DEPTH in the test alongside MAX_CRAWL_PAGES. Update
test_crawler_enforces_page_limit in test_scraping_tool_crawler.py to monkeypatch
the depth constant before calling CrawlWebsiteTool()._run(), so the requests.get
call-count assertion does not depend on production defaults.

In `@SECRETS_SYNC_ALIGNMENT.md`:
- Around line 14-17: The module naming in the SecretSync alignment doc is
inconsistent: the direct-import ban references secretssync while the declared
Python import/module uses secrets_sync. Update the wording in
SECRETS_SYNC_ALIGNMENT.md so the forbidden direct-import name matches the actual
module/package spelling used elsewhere, and keep the vendor-fabric guidance
aligned with that symbol.

---

Outside diff comments:
In `@packages/agentic-fabric/src/agentic_fabric/core/discovery.py`:
- Around line 81-84: The framework filter handling in discover_packages()
currently widens to FRAMEWORK_DIRS when FRAMEWORK_TO_DIR.get(framework) returns
nothing, which lets unknown values like a misspelling match everything. Update
the discovery logic in discover_packages() so only recognized framework values
map to a directory, and unknown framework inputs are rejected explicitly (or
yield no results) instead of falling back to all directories; use
FRAMEWORK_TO_DIR and dirs_to_check as the key points to adjust.

In `@packages/pytest-agentic-fabric/src/pytest_agentic_fabric/plugin.py`:
- Around line 135-171: The agentic_workspace fixture currently ignores
agentic_fabric_agent_config, so the manifest and YAML it writes can diverge from
the supplied test config. Update agentic_workspace to derive the written
manifest/agents/tasks content from agentic_fabric_agent_config instead of
hardcoding the sample values, and keep the same fixture shape so overrides and
parametrization flow through consistently.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b1cedadc-c554-48aa-b281-2c3633030a7a

📥 Commits

Reviewing files that changed from the base of the PR and between 11b75c2 and ceecb7f.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (104)
  • .github/dependabot.yml
  • .github/workflows/automerge.yml
  • .github/workflows/cd.yml
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • AGENTIC_REINFORCEMENT.md
  • AGENTS.md
  • SECRETS_SYNC_ALIGNMENT.md
  • docs/_static/agentic-fabric.css
  • docs/agentic-workflows.rst
  • docs/architecture.rst
  • docs/development.rst
  • docs/getting-started.rst
  • docs/index.rst
  • docs/pillars.rst
  • docs/vendor-fabric.rst
  • packages/agentic-fabric/CHANGELOG.md
  • packages/agentic-fabric/README.md
  • packages/agentic-fabric/examples/README.md
  • packages/agentic-fabric/examples/discovery_workflow.py
  • packages/agentic-fabric/examples/runtime_context.py
  • packages/agentic-fabric/examples/sample_workspace/packages/review/.fabric/fabric_agents/implementation_review/agents.yaml
  • packages/agentic-fabric/examples/sample_workspace/packages/review/.fabric/fabric_agents/implementation_review/tasks.yaml
  • packages/agentic-fabric/examples/sample_workspace/packages/review/.fabric/manifest.yaml
  • packages/agentic-fabric/pyproject.toml
  • packages/agentic-fabric/src/agentic_fabric/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/__main__.py
  • packages/agentic-fabric/src/agentic_fabric/agentic_data.py
  • packages/agentic-fabric/src/agentic_fabric/base/archetypes.yaml
  • packages/agentic-fabric/src/agentic_fabric/capabilities.py
  • packages/agentic-fabric/src/agentic_fabric/config/llm.py
  • packages/agentic-fabric/src/agentic_fabric/core/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/core/decomposer.py
  • packages/agentic-fabric/src/agentic_fabric/core/discovery.py
  • packages/agentic-fabric/src/agentic_fabric/core/loader.py
  • packages/agentic-fabric/src/agentic_fabric/core/manager.py
  • packages/agentic-fabric/src/agentic_fabric/core/runner.py
  • packages/agentic-fabric/src/agentic_fabric/fabric_agents/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/fabric_agents/connector_builder/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/fabric_agents/connector_builder/config/agents.yaml
  • packages/agentic-fabric/src/agentic_fabric/fabric_agents/connector_builder/config/tasks.yaml
  • packages/agentic-fabric/src/agentic_fabric/fabric_agents/connector_builder/connector_builder_fabric.py
  • packages/agentic-fabric/src/agentic_fabric/main.py
  • packages/agentic-fabric/src/agentic_fabric/runners/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/runners/base.py
  • packages/agentic-fabric/src/agentic_fabric/runners/crewai_runner.py
  • packages/agentic-fabric/src/agentic_fabric/runners/langgraph_runner.py
  • packages/agentic-fabric/src/agentic_fabric/runners/local_cli_runner.py
  • packages/agentic-fabric/src/agentic_fabric/runners/registry.py
  • packages/agentic-fabric/src/agentic_fabric/runners/single_agent_runner.py
  • packages/agentic-fabric/src/agentic_fabric/runners/strands_runner.py
  • packages/agentic-fabric/src/agentic_fabric/tools/__init__.py
  • packages/agentic-fabric/src/agentic_fabric/tools/adapters.py
  • packages/agentic-fabric/src/agentic_fabric/tools/file_tools.py
  • packages/agentic-fabric/src/agentic_fabric/tools/meshy_mcp.py
  • packages/agentic-fabric/src/agentic_fabric/tools/registry.py
  • packages/agentic-fabric/src/agentic_fabric/tools/scraping_tools.py
  • packages/agentic-fabric/src/agentic_fabric/tools/vendor.py
  • packages/agentic-fabric/src/agentic_fabric/tools/vendor_mcp.py
  • packages/agentic-fabric/src/agentic_fabric/utils/files.py
  • packages/agentic-fabric/tests/_fabric_mocker.py
  • packages/agentic-fabric/tests/conftest.py
  • packages/agentic-fabric/tests/e2e/README.md
  • packages/agentic-fabric/tests/e2e/__init__.py
  • packages/agentic-fabric/tests/e2e/conftest.py
  • packages/agentic-fabric/tests/e2e/test_crewai_e2e.py
  • packages/agentic-fabric/tests/e2e/test_langgraph_e2e.py
  • packages/agentic-fabric/tests/e2e/test_strands_e2e.py
  • packages/agentic-fabric/tests/test_agentic_data.py
  • packages/agentic-fabric/tests/test_capabilities.py
  • packages/agentic-fabric/tests/test_cli_commands.py
  • packages/agentic-fabric/tests/test_cli_smoke.py
  • packages/agentic-fabric/tests/test_connector_builder_fabric.py
  • packages/agentic-fabric/tests/test_core_runner.py
  • packages/agentic-fabric/tests/test_decomposer_edge_cases.py
  • packages/agentic-fabric/tests/test_discovery.py
  • packages/agentic-fabric/tests/test_discovery_nested.py
  • packages/agentic-fabric/tests/test_examples.py
  • packages/agentic-fabric/tests/test_fabric_mocker.py
  • packages/agentic-fabric/tests/test_file_tool_paths.py
  • packages/agentic-fabric/tests/test_file_tools.py
  • packages/agentic-fabric/tests/test_import_surfaces.py
  • packages/agentic-fabric/tests/test_llm_config.py
  • packages/agentic-fabric/tests/test_loader.py
  • packages/agentic-fabric/tests/test_loader_unit.py
  • packages/agentic-fabric/tests/test_manager.py
  • packages/agentic-fabric/tests/test_mcp_adapters.py
  • packages/agentic-fabric/tests/test_runners.py
  • packages/agentic-fabric/tests/test_scraping_tool_crawler.py
  • packages/agentic-fabric/tests/test_scraping_tools.py
  • packages/agentic-fabric/tests/test_single_agent_runners.py
  • packages/agentic-fabric/tests/test_tool_adapters.py
  • packages/agentic-fabric/tests/test_tool_registry.py
  • packages/agentic-fabric/tests/test_tools_init.py
  • packages/agentic-fabric/tests/test_utils_files.py
  • packages/agentic-fabric/tests/test_yaml_config_errors.py
  • packages/pytest-agentic-fabric/README.md
  • packages/pytest-agentic-fabric/pyproject.toml
  • packages/pytest-agentic-fabric/src/pytest_agentic_fabric/__init__.py
  • packages/pytest-agentic-fabric/src/pytest_agentic_fabric/plugin.py
  • packages/pytest-agentic-fabric/tests/test_plugin.py
  • pyproject.toml
  • release-please-config.json
  • tox.ini
💤 Files with no reviewable changes (5)
  • packages/agentic-fabric/examples/sample_workspace/packages/review/.fabric/fabric_agents/implementation_review/tasks.yaml
  • packages/agentic-fabric/examples/sample_workspace/packages/review/.fabric/fabric_agents/implementation_review/agents.yaml
  • packages/agentic-fabric/src/agentic_fabric/fabric_agents/connector_builder/config/agents.yaml
  • packages/agentic-fabric/src/agentic_fabric/fabric_agents/connector_builder/config/tasks.yaml
  • docs/_static/agentic-fabric.css
✅ Files skipped from review due to trivial changes (21)
  • packages/agentic-fabric/tests/e2e/init.py
  • packages/agentic-fabric/src/agentic_fabric/fabric_agents/init.py
  • packages/agentic-fabric/src/agentic_fabric/fabric_agents/connector_builder/init.py
  • packages/agentic-fabric/src/agentic_fabric/main.py
  • packages/pytest-agentic-fabric/README.md
  • .github/dependabot.yml
  • packages/agentic-fabric/CHANGELOG.md
  • AGENTIC_REINFORCEMENT.md
  • docs/vendor-fabric.rst
  • docs/pillars.rst
  • packages/agentic-fabric/tests/e2e/README.md
  • docs/development.rst
  • release-please-config.json
  • docs/index.rst
  • docs/getting-started.rst
  • AGENTS.md
  • packages/pytest-agentic-fabric/pyproject.toml
  • packages/agentic-fabric/tests/e2e/conftest.py
  • docs/architecture.rst
  • docs/agentic-workflows.rst
  • packages/agentic-fabric/README.md
🚧 Files skipped from review as they are similar to previous changes (28)
  • packages/agentic-fabric/examples/runtime_context.py
  • packages/agentic-fabric/examples/README.md
  • packages/agentic-fabric/src/agentic_fabric/utils/files.py
  • packages/agentic-fabric/src/agentic_fabric/base/archetypes.yaml
  • packages/agentic-fabric/src/agentic_fabric/runners/init.py
  • packages/agentic-fabric/tests/test_examples.py
  • packages/agentic-fabric/tests/test_tools_init.py
  • packages/agentic-fabric/tests/test_cli_smoke.py
  • packages/agentic-fabric/tests/test_capabilities.py
  • packages/agentic-fabric/tests/test_llm_config.py
  • packages/agentic-fabric/tests/test_loader_unit.py
  • packages/agentic-fabric/src/agentic_fabric/tools/adapters.py
  • packages/agentic-fabric/tests/test_loader.py
  • packages/agentic-fabric/tests/e2e/test_langgraph_e2e.py
  • packages/agentic-fabric/src/agentic_fabric/core/loader.py
  • packages/agentic-fabric/src/agentic_fabric/core/manager.py
  • packages/agentic-fabric/src/agentic_fabric/capabilities.py
  • packages/agentic-fabric/tests/test_runners.py
  • packages/agentic-fabric/tests/test_tool_adapters.py
  • packages/agentic-fabric/src/agentic_fabric/runners/registry.py
  • packages/agentic-fabric/src/agentic_fabric/config/llm.py
  • packages/agentic-fabric/src/agentic_fabric/tools/file_tools.py
  • packages/agentic-fabric/src/agentic_fabric/runners/single_agent_runner.py
  • packages/agentic-fabric/tests/test_file_tool_paths.py
  • packages/agentic-fabric/tests/e2e/test_strands_e2e.py
  • packages/agentic-fabric/src/agentic_fabric/tools/registry.py
  • packages/agentic-fabric/tests/test_manager.py
  • packages/agentic-fabric/tests/test_single_agent_runners.py

Comment thread .github/workflows/automerge.yml Outdated
Comment thread .github/workflows/cd.yml
Comment thread packages/agentic-fabric/src/agentic_fabric/core/discovery.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/core/discovery.py Outdated
Comment thread packages/agentic-fabric/src/agentic_fabric/tools/scraping_tools.py Outdated
Comment thread packages/agentic-fabric/tests/_fabric_mocker.py Outdated
Comment thread packages/agentic-fabric/tests/test_scraping_tool_crawler.py
Comment thread SECRETS_SYNC_ALIGNMENT.md
@jbdevprimary
jbdevprimary merged commit 2704e67 into main Jun 27, 2026
8 checks passed
@jbdevprimary
jbdevprimary deleted the codex/agentic-fabric-bootstrap branch June 27, 2026 11:31
@github-actions github-actions Bot mentioned this pull request Jun 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant