da-factory 1.1.1__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 (67) hide show
  1. da_factory-1.1.1/.github/workflows/branch-to-dev-pr.yml +54 -0
  2. da_factory-1.1.1/.github/workflows/dev-to-main-pr.yml +99 -0
  3. da_factory-1.1.1/.github/workflows/publish.yml +176 -0
  4. da_factory-1.1.1/.gitignore +28 -0
  5. da_factory-1.1.1/.pre-commit-config.yaml +14 -0
  6. da_factory-1.1.1/CHANGELOG.md +44 -0
  7. da_factory-1.1.1/LICENSE +5 -0
  8. da_factory-1.1.1/PKG-INFO +79 -0
  9. da_factory-1.1.1/README.md +54 -0
  10. da_factory-1.1.1/codemap/.content_hash_state.json +18 -0
  11. da_factory-1.1.1/codemap/CODE_MAP.md +34 -0
  12. da_factory-1.1.1/codemap/src_agent_foundry.md +45 -0
  13. da_factory-1.1.1/codemap/src_agent_foundry_catalog.md +44 -0
  14. da_factory-1.1.1/codemap/src_agent_foundry_guardrails.md +46 -0
  15. da_factory-1.1.1/docs/TECH_DEBT.md +6 -0
  16. da_factory-1.1.1/docs/analysis/CHANGE-FIX-2A77F38E.md +41 -0
  17. da_factory-1.1.1/docs/analysis/CHANGE-FIX-352F7AE5.md +34 -0
  18. da_factory-1.1.1/docs/analysis/CHANGE-FIX-8866B1D7.md +67 -0
  19. da_factory-1.1.1/docs/analysis/FIXSPEC-FIX-2A77F38E.md +11 -0
  20. da_factory-1.1.1/docs/analysis/FIXSPEC-FIX-352F7AE5.md +14 -0
  21. da_factory-1.1.1/docs/analysis/FIXSPEC-FIX-8866B1D7.md +67 -0
  22. da_factory-1.1.1/docs/analysis/PR-REVIEW-FIX-2A77F38E.md +46 -0
  23. da_factory-1.1.1/docs/analysis/PR-REVIEW-FIX-352F7AE5.md +45 -0
  24. da_factory-1.1.1/docs/analysis/PR-REVIEW-FIX-8866B1D7.md +71 -0
  25. da_factory-1.1.1/docs/closure/FIX-2A77F38E-CLOSURE.md +15 -0
  26. da_factory-1.1.1/docs/closure/FIX-352F7AE5-CLOSURE.md +15 -0
  27. da_factory-1.1.1/docs/closure/FIX-8866B1D7-CLOSURE.md +24 -0
  28. da_factory-1.1.1/docs/project_status.md +34 -0
  29. da_factory-1.1.1/nablr-reports/context/project.jsonl +2 -0
  30. da_factory-1.1.1/nablr-reports/context/story_FIX-8866B1D7.jsonl +1 -0
  31. da_factory-1.1.1/nablr-reports/context_graph.index.json +516 -0
  32. da_factory-1.1.1/nablr-reports/context_graph.json +727 -0
  33. da_factory-1.1.1/nablr-reports/efficiency/ledger.jsonl +35 -0
  34. da_factory-1.1.1/nablr-reports/executive-summary.json +19 -0
  35. da_factory-1.1.1/nablr-reports/graph.html +39 -0
  36. da_factory-1.1.1/nablr-reports/handoff_log.jsonl +71 -0
  37. da_factory-1.1.1/nablr-reports/platform_engineer/health_report.json +15 -0
  38. da_factory-1.1.1/nablr-reports/platform_engineer/health_report.md +26 -0
  39. da_factory-1.1.1/nablr-reports/platform_engineer/test_suite_report.json +66 -0
  40. da_factory-1.1.1/nablr-reports/security/security_audit_2026-09-12.md +114 -0
  41. da_factory-1.1.1/pyproject.toml +76 -0
  42. da_factory-1.1.1/release.toml +51 -0
  43. da_factory-1.1.1/scripts/block_main_push.sh +17 -0
  44. da_factory-1.1.1/src/agent_foundry/__init__.py +5 -0
  45. da_factory-1.1.1/src/agent_foundry/catalog/__init__.py +3 -0
  46. da_factory-1.1.1/src/agent_foundry/catalog/build.py +74 -0
  47. da_factory-1.1.1/src/agent_foundry/catalog/discovery.py +72 -0
  48. da_factory-1.1.1/src/agent_foundry/catalog/manifest_schemas.py +81 -0
  49. da_factory-1.1.1/src/agent_foundry/cli.py +117 -0
  50. da_factory-1.1.1/src/agent_foundry/guardrails/__init__.py +66 -0
  51. da_factory-1.1.1/src/agent_foundry/guardrails/injection.py +231 -0
  52. da_factory-1.1.1/src/agent_foundry/guardrails/pii.py +185 -0
  53. da_factory-1.1.1/src/agent_foundry/guardrails/secrets.py +130 -0
  54. da_factory-1.1.1/src/agent_foundry/guardrails/tool_scope.py +49 -0
  55. da_factory-1.1.1/src/agent_foundry/guardrails/toxicity.py +158 -0
  56. da_factory-1.1.1/src/agent_foundry/orchestration.py +97 -0
  57. da_factory-1.1.1/tests/model_doubles.py +77 -0
  58. da_factory-1.1.1/tests/test_block_main_push.py +57 -0
  59. da_factory-1.1.1/tests/test_catalog_build.py +89 -0
  60. da_factory-1.1.1/tests/test_cli_new_agent.py +42 -0
  61. da_factory-1.1.1/tests/test_guardrails_injection.py +107 -0
  62. da_factory-1.1.1/tests/test_guardrails_pii.py +83 -0
  63. da_factory-1.1.1/tests/test_guardrails_secrets.py +73 -0
  64. da_factory-1.1.1/tests/test_guardrails_toxicity.py +126 -0
  65. da_factory-1.1.1/tests/test_manifest_discovery.py +93 -0
  66. da_factory-1.1.1/tests/test_orchestration.py +112 -0
  67. da_factory-1.1.1/uv.lock +1393 -0
@@ -0,0 +1,54 @@
1
+ # Opens a promotion PR from any feature branch into dev.
2
+ name: Open branch to dev PR
3
+
4
+ # FIX-8866B1D7: ported from nablr's workflow of the same name. Every push to
5
+ # any branch other than dev/main opens (or updates) a PR into dev, so dev only
6
+ # ever advances via a reviewed PR instead of waiting on someone to remember to
7
+ # click "Compare & pull request". Never auto-merges -- a human still reviews.
8
+
9
+ on:
10
+ push:
11
+ branches-ignore: [dev, main]
12
+
13
+ permissions:
14
+ pull-requests: write
15
+ contents: read
16
+
17
+ jobs:
18
+ open-or-update-pr:
19
+ name: Open or update branch -> dev PR
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - name: Checkout
23
+ uses: actions/checkout@v4
24
+ with:
25
+ fetch-depth: 0
26
+
27
+ - name: Check for existing PR
28
+ id: existing
29
+ env:
30
+ GH_TOKEN: ${{ github.token }}
31
+ run: |
32
+ existing="$(gh pr list --head "${{ github.ref_name }}" --base dev --json number --jq '.[0].number' || true)"
33
+ if [[ -n "$existing" ]]; then
34
+ echo "PR #$existing already open for ${{ github.ref_name }} -- this push already updated it."
35
+ echo "found=true" >> "$GITHUB_OUTPUT"
36
+ else
37
+ echo "found=false" >> "$GITHUB_OUTPUT"
38
+ fi
39
+
40
+ - name: Open PR
41
+ if: steps.existing.outputs.found == 'false'
42
+ env:
43
+ GH_TOKEN: ${{ github.token }}
44
+ run: |
45
+ commits="$(git log origin/dev.."${{ github.ref_name }}" --pretty=format:'- %s (%h)' || true)"
46
+ if [[ -z "$commits" ]]; then
47
+ echo "No commits ahead of dev -- nothing to open a PR for, skipping."
48
+ exit 0
49
+ fi
50
+ body="## Commits since dev
51
+ ${commits}"
52
+ gh pr create --head "${{ github.ref_name }}" --base dev \
53
+ --title "${{ github.ref_name }} → dev" \
54
+ --body "$body"
@@ -0,0 +1,99 @@
1
+ # Opens the release-promotion PR from dev into main.
2
+ name: Open dev to main PR
3
+
4
+ # FIX-8866B1D7: ported from nablr's workflow of the same name. Every push to
5
+ # dev opens (or updates) a PR into main, so main only ever advances via a
6
+ # reviewed, human-merged PR. Never auto-merges.
7
+ #
8
+ # The release version-bump commit lands here, on dev, before the PR is
9
+ # opened/updated -- not on main via a direct push. Tag creation happens in
10
+ # publish.yml's tag-release job, firing only after this PR's merge commit
11
+ # lands on main and that same push's lint/test/build all pass.
12
+
13
+ on:
14
+ push:
15
+ branches: [dev]
16
+
17
+ permissions:
18
+ pull-requests: write
19
+ contents: write
20
+
21
+ jobs:
22
+ open-or-update-pr:
23
+ name: Open or update dev -> main PR
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - name: Checkout
27
+ uses: actions/checkout@v4
28
+ with:
29
+ fetch-depth: 0
30
+
31
+ - name: Install uv
32
+ uses: astral-sh/setup-uv@v5
33
+ with:
34
+ enable-cache: true
35
+
36
+ - name: Configure git identity for release commit
37
+ run: |
38
+ git config user.name "github-actions[bot]"
39
+ git config user.email "github-actions[bot]@users.noreply.github.com"
40
+
41
+ # Compute + stamp + commit the release version bump onto dev,
42
+ # idempotently, before the PR reflects it. Reuses publish.yml's
43
+ # tag-release job's exact computation (same tool, same config) -- only
44
+ # the target ref moves.
45
+ - name: Compute, stamp, and commit release version
46
+ env:
47
+ GH_TOKEN: ${{ github.token }}
48
+ run: |
49
+ current="$(grep -m1 '^version = ' pyproject.toml | cut -d '"' -f2)"
50
+ next="$(uvx --from python-semantic-release semantic-release \
51
+ --config release.toml version --no-commit --no-tag --no-vcs-release --print)"
52
+ if [ "$next" = "$current" ]; then
53
+ echo "No release due (still $current) -- skipping bump commit."
54
+ exit 0
55
+ fi
56
+ head_subject="$(git log -1 --pretty=%s)"
57
+ if [ "$head_subject" = "chore(release): bump version to $next" ]; then
58
+ echo "Bump to $next already at HEAD -- skipping (idempotency guard)."
59
+ exit 0
60
+ fi
61
+ uvx --from python-semantic-release semantic-release \
62
+ --config release.toml version --no-commit --no-tag --no-vcs-release
63
+ uv lock
64
+ git add pyproject.toml CHANGELOG.md uv.lock
65
+ if git diff --cached --quiet; then
66
+ echo "Stamp produced no file changes despite next ($next) != current ($current) -- skipping, nothing to commit."
67
+ exit 0
68
+ fi
69
+ git commit -m "chore(release): bump version to $next"
70
+ git push origin HEAD:dev
71
+
72
+ - name: Check for existing PR
73
+ id: existing
74
+ env:
75
+ GH_TOKEN: ${{ github.token }}
76
+ run: |
77
+ existing="$(gh pr list --head dev --base main --json number --jq '.[0].number' || true)"
78
+ if [[ -n "$existing" ]]; then
79
+ echo "PR #$existing already open on dev -- this push already updated it."
80
+ echo "found=true" >> "$GITHUB_OUTPUT"
81
+ else
82
+ echo "found=false" >> "$GITHUB_OUTPUT"
83
+ fi
84
+
85
+ - name: Open PR
86
+ if: steps.existing.outputs.found == 'false'
87
+ env:
88
+ GH_TOKEN: ${{ github.token }}
89
+ run: |
90
+ commits="$(git log origin/main..dev --pretty=format:'- %s (%h)' || true)"
91
+ if [[ -z "$commits" ]]; then
92
+ echo "No commits between main and dev -- nothing to open a PR for, skipping."
93
+ exit 0
94
+ fi
95
+ body="## Commits since main
96
+ ${commits}"
97
+ gh pr create --head dev --base main \
98
+ --title "dev → main" \
99
+ --body "$body"
@@ -0,0 +1,176 @@
1
+ # Lints, tests, builds, tags, and publishes da-factory to PyPI.
2
+ name: CI
3
+
4
+ # FIX-8866B1D7: dev/main split (mirrors nablr's own live workflow shape, see
5
+ # nablr/.github/workflows/publish.yml). File renamed from ci.yml -- PyPI
6
+ # Trusted Publishing (OIDC) trust binds to the workflow filename
7
+ # (workflow_ref claim), not the YAML `name:` field, so this filename must
8
+ # match what's registered on PyPI. Version bump now happens on dev
9
+ # (dev-to-main-pr.yml), before the dev -> main PR is opened -- main never
10
+ # receives a direct push; tag-release below only fires after a human merges
11
+ # that PR and this same push's lint/test/build all pass.
12
+ on:
13
+ push:
14
+ branches: [main, dev]
15
+ pull_request:
16
+ branches: [main, dev]
17
+
18
+ concurrency:
19
+ group: ${{ github.workflow }}-${{ github.ref }}
20
+ cancel-in-progress: true
21
+
22
+ jobs:
23
+ lint:
24
+ name: Lint & Type Check
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: astral-sh/setup-uv@v5
29
+ with:
30
+ enable-cache: true
31
+ - name: Set up Python
32
+ run: uv python install
33
+ - name: Install dependencies
34
+ run: uv sync --all-extras --dev
35
+ - name: Lint (Ruff)
36
+ run: uv run ruff check .
37
+ - name: Format check (Ruff)
38
+ run: uv run ruff format --check .
39
+ - name: Type check (Pyright)
40
+ run: uv run pyright
41
+
42
+ test:
43
+ name: Test
44
+ runs-on: ubuntu-latest
45
+ steps:
46
+ - uses: actions/checkout@v4
47
+ - uses: astral-sh/setup-uv@v5
48
+ with:
49
+ enable-cache: true
50
+ - name: Set up Python
51
+ run: uv python install
52
+ - name: Install dependencies
53
+ run: uv sync --all-extras --dev
54
+ - name: Run tests
55
+ run: uv run pytest
56
+
57
+ build:
58
+ name: Build package
59
+ runs-on: ubuntu-latest
60
+ needs: [lint, test]
61
+ steps:
62
+ - uses: actions/checkout@v4
63
+ - uses: astral-sh/setup-uv@v5
64
+ with:
65
+ enable-cache: true
66
+ - name: Set up Python
67
+ run: uv python install
68
+ - name: Build wheel & sdist
69
+ run: uv build
70
+ - uses: actions/upload-artifact@v4
71
+ with:
72
+ name: python-package-dist
73
+ path: dist/
74
+
75
+ # Tags the version dev-to-main-pr.yml already bumped -- only after a human
76
+ # has merged the dev -> main PR and this push's lint/test/build pass.
77
+ # FIX-8866B1D7: replaces the old single-branch `bump` job, which pushed
78
+ # straight to main with no review step.
79
+ tag-release:
80
+ name: Tag Release
81
+ runs-on: ubuntu-latest
82
+ needs: [lint, test, build]
83
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
84
+ permissions:
85
+ contents: write
86
+ outputs:
87
+ version: ${{ steps.check.outputs.version }}
88
+ is_release: ${{ steps.check.outputs.is_release }}
89
+ steps:
90
+ - uses: actions/checkout@v4
91
+ with:
92
+ fetch-depth: 0 # full tag history required for the "already tagged" check
93
+
94
+ - name: Check whether main's current version is already tagged
95
+ id: check
96
+ run: |
97
+ version="$(grep -m1 '^version = ' pyproject.toml | cut -d '"' -f2)"
98
+ echo "version=$version" >> "$GITHUB_OUTPUT"
99
+ if git rev-parse -q --verify "refs/tags/v$version" >/dev/null; then
100
+ echo "Tag v$version already exists -- nothing to tag."
101
+ echo "is_release=false" >> "$GITHUB_OUTPUT"
102
+ else
103
+ echo "is_release=true" >> "$GITHUB_OUTPUT"
104
+ fi
105
+
106
+ - name: Tag the release
107
+ if: steps.check.outputs.is_release == 'true'
108
+ run: |
109
+ version="$(grep -m1 '^version = ' pyproject.toml | cut -d '"' -f2)"
110
+ if git rev-parse -q --verify "refs/tags/v$version" >/dev/null; then
111
+ echo "Tag v$version already exists -- nothing to do."
112
+ exit 0
113
+ fi
114
+ git tag "v$version"
115
+ git push origin "v$version"
116
+
117
+ # Release tags land only on main. Without this, dev's own history never
118
+ # sees them, so dev-to-main-pr.yml's `semantic-release version --print`
119
+ # step walks dev's ancestry, never finds the tag, and silently reports "no
120
+ # release due" forever after the first release. Ported from nablr's own
121
+ # job of the same name (nablr hit this for real).
122
+ sync-dev-with-release:
123
+ name: Sync dev with release tag
124
+ runs-on: ubuntu-latest
125
+ needs: tag-release
126
+ if: needs.tag-release.result == 'success' && needs.tag-release.outputs.is_release == 'true'
127
+ permissions:
128
+ contents: write
129
+ steps:
130
+ - uses: actions/checkout@v4
131
+ with:
132
+ ref: main
133
+ fetch-depth: 0
134
+ - name: Merge main into dev so the release tag is ancestor-visible there
135
+ env:
136
+ GH_TOKEN: ${{ github.token }}
137
+ RELEASE_VERSION: ${{ needs.tag-release.outputs.version }}
138
+ run: |
139
+ git config user.name "github-actions[bot]"
140
+ git config user.email "github-actions[bot]@users.noreply.github.com"
141
+ main_sha="$(git rev-parse HEAD)"
142
+ git fetch origin dev
143
+ git checkout -B dev origin/dev
144
+ if git merge-base --is-ancestor "$main_sha" HEAD; then
145
+ echo "dev already contains $main_sha (v$RELEASE_VERSION) -- nothing to sync."
146
+ exit 0
147
+ fi
148
+ git merge --no-edit "$main_sha" \
149
+ -m "chore(release): merge main into dev after v$RELEASE_VERSION" \
150
+ -m "Keeps the v$RELEASE_VERSION tag ancestor-visible from dev so dev-to-main-pr.yml's semantic-release bump step can see commits since the last release instead of silently no-op'ing forever."
151
+ git push origin dev
152
+
153
+ publish:
154
+ name: Upload release to PyPI
155
+ runs-on: ubuntu-latest
156
+ needs: [build, tag-release]
157
+ # Explicit `if:` re-asserts the needs-must-succeed condition: a
158
+ # tag-release run that set is_release=true in its check step but then
159
+ # failed on the actual `git push` tag step would otherwise still satisfy
160
+ # GitHub Actions' implicit "needs succeeded" check and publish untagged.
161
+ if: needs.tag-release.result == 'success' && needs.tag-release.outputs.is_release == 'true'
162
+ environment:
163
+ name: pypi
164
+ url: https://pypi.org/p/da-factory
165
+ permissions:
166
+ id-token: write # required for trusted publishing
167
+ steps:
168
+ - uses: actions/download-artifact@v4
169
+ with:
170
+ name: python-package-dist
171
+ path: dist/
172
+ - uses: astral-sh/setup-uv@v5
173
+ - name: Check metadata (Twine)
174
+ run: uv tool run twine check dist/*
175
+ - name: Publish package distributions to PyPI
176
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,28 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # Test artifacts
13
+ .coverage
14
+ coverage.xml
15
+ htmlcov/
16
+
17
+ # Caches & IDEs
18
+ .idea/
19
+ .pytest_cache/
20
+ .ruff_cache/
21
+ .DS_Store
22
+
23
+ # nablr local session/cache state -- contains a local signing key
24
+ # (.nablr_state/marker_signing_key.json), session locks, and derived caches.
25
+ # Not source; not meant to be shared. codemap/, docs/, nablr-reports/ stay
26
+ # tracked (nablr's own docs call those git-tracked artifacts).
27
+ .nablr_state/
28
+ .nablr_cache/
@@ -0,0 +1,14 @@
1
+ # FIX-8866B1D7: local pre-push guard, ported from nablr's
2
+ # .pre-commit-config.yaml. Soft enforcement -- GitHub branch protection is
3
+ # plan-gated on this private repo (confirmed live: 403 "Upgrade to GitHub
4
+ # Pro..."). Run `pre-commit install --hook-type pre-push` once per clone.
5
+ repos:
6
+ - repo: local
7
+ hooks:
8
+ - id: block-main-push
9
+ name: Block direct push to main (use PR flow instead)
10
+ entry: bash scripts/block_main_push.sh
11
+ language: system
12
+ pass_filenames: false
13
+ always_run: true
14
+ stages: [pre-push]
@@ -0,0 +1,44 @@
1
+ # Changelog
2
+
3
+ <!-- version list -->
4
+
5
+ ## v1.1.1 (2026-09-12)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **docs**: Drop stale 0.x version claim from README status line
10
+ ([`bf34724`](https://github.com/Mishtert/agent-foundry/commit/bf34724351562d68334f6fb168947f9fc106e6e1))
11
+
12
+
13
+ ## v1.1.0 (2026-09-12)
14
+
15
+ ### Bug Fixes
16
+
17
+ - **cli**: Stop stamping dead logic.py/schema.py in new-agent scaffold
18
+ ([`ba2d50f`](https://github.com/Mishtert/agent-foundry/commit/ba2d50f4ef51450e0f987bd14f629cc559e33a80))
19
+
20
+ - **guardrails,catalog**: Set agent_id on every built and judge Agent
21
+ ([`20c0ce2`](https://github.com/Mishtert/agent-foundry/commit/20c0ce27428873611481930b88e2c81c1a6a8331))
22
+
23
+ ### Chores
24
+
25
+ - Exclude nablr local session/cache state from git
26
+ ([`fa56905`](https://github.com/Mishtert/agent-foundry/commit/fa56905526daa43e7d868294d6e618d9eb80809b))
27
+
28
+ ### Features
29
+
30
+ - **ci**: Dev/main branch model + rename ci.yml to publish.yml
31
+ ([`69f07c0`](https://github.com/Mishtert/agent-foundry/commit/69f07c056d2f97b1f3fe06b7809046a4c90e71b9))
32
+
33
+
34
+ ## v1.0.1 (2026-09-12)
35
+
36
+ ### Bug Fixes
37
+
38
+ - **ci**: Pass GH_TOKEN to semantic-release so it can create the GitHub release
39
+ ([`513dd97`](https://github.com/Mishtert/agent-foundry/commit/513dd979cd74bb4b06d500f5679f062d9622a8d0))
40
+
41
+
42
+ ## v1.0.0 (2026-09-12)
43
+
44
+ - Initial Release
@@ -0,0 +1,5 @@
1
+ Copyright (c) 2026 Mishtert T. All rights reserved.
2
+
3
+ No license is granted at this time. This is a placeholder pending a
4
+ deliberate licensing decision (e.g. MIT/Apache-2.0 for a public SDK vs. a
5
+ proprietary license) before the first public PyPI release.
@@ -0,0 +1,79 @@
1
+ Metadata-Version: 2.5
2
+ Name: da-factory
3
+ Version: 1.1.1
4
+ Summary: Declarative agent manifests -> runnable Strands agents: concurrent/sequential orchestration, built-in guardrails, context-management passthrough.
5
+ Project-URL: Homepage, https://github.com/Mishtert/agent-foundry
6
+ Project-URL: Repository, https://github.com/Mishtert/agent-foundry
7
+ Project-URL: Bug Tracker, https://github.com/Mishtert/agent-foundry/issues
8
+ Author-email: Mishtert T <Mishtert.Thangaraj@myridius.com>
9
+ License: Proprietary
10
+ License-File: LICENSE
11
+ Keywords: agents,guardrails,llm,orchestration,strands
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
19
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
20
+ Requires-Python: >=3.11
21
+ Requires-Dist: pydantic>=2.0
22
+ Requires-Dist: pyyaml>=6.0
23
+ Requires-Dist: strands-agents[openai]>=1.54.0
24
+ Description-Content-Type: text/markdown
25
+
26
+ # da-factory
27
+
28
+ Dynamic Agent Factory.
29
+
30
+ Declarative agent manifests -> runnable [Strands](https://strandsagents.com) agents.
31
+
32
+ Hand the SDK a manifest (prompt, tools, guardrails, context policy) and get back a
33
+ correctly-wired, runnable agent -- without hand-assembling `hooks`/`interventions`
34
+ boilerplate per agent, per project.
35
+
36
+ No dependency on `strands.multiagent.*` (Graph/Workflow): orchestration is
37
+ `concurrent` (fan-out + optional aggregator) or `sequential` (chain), both built on
38
+ nothing but `strands.Agent.invoke_async` + `asyncio`.
39
+
40
+ ## Status
41
+
42
+ Early alpha. API surface is still settling.
43
+
44
+ ## Install
45
+
46
+ ```bash
47
+ pip install da-factory
48
+ ```
49
+
50
+ ## Quick example
51
+
52
+ ```python
53
+ from agent_foundry.catalog.discovery import discover_agents
54
+ from agent_foundry.catalog.build import build_agent
55
+ from agent_foundry.orchestration import run_concurrent
56
+
57
+ manifests = discover_agents("path/to/definitions")
58
+ agents = {m.id: build_agent(m) for m in manifests}
59
+ result = await run_concurrent(agents, "some input")
60
+ ```
61
+
62
+ ## Guardrails
63
+
64
+ Built in, declared per-manifest via `guardrails: [injection, pii, secrets, toxicity]`.
65
+ Each follows the same two-layer shape: a deterministic pre-filter, plus (where it
66
+ adds value) a semantic LLM judge invoked only when the pre-filter finds nothing.
67
+
68
+ ## Development
69
+
70
+ ```bash
71
+ uv sync --all-extras --dev
72
+ uv run pytest
73
+ uv run ruff check . && uv run ruff format --check .
74
+ uv run pyright
75
+ ```
76
+
77
+ ## License
78
+
79
+ See [LICENSE](LICENSE) -- not yet finalized (placeholder, no license granted).
@@ -0,0 +1,54 @@
1
+ # da-factory
2
+
3
+ Dynamic Agent Factory.
4
+
5
+ Declarative agent manifests -> runnable [Strands](https://strandsagents.com) agents.
6
+
7
+ Hand the SDK a manifest (prompt, tools, guardrails, context policy) and get back a
8
+ correctly-wired, runnable agent -- without hand-assembling `hooks`/`interventions`
9
+ boilerplate per agent, per project.
10
+
11
+ No dependency on `strands.multiagent.*` (Graph/Workflow): orchestration is
12
+ `concurrent` (fan-out + optional aggregator) or `sequential` (chain), both built on
13
+ nothing but `strands.Agent.invoke_async` + `asyncio`.
14
+
15
+ ## Status
16
+
17
+ Early alpha. API surface is still settling.
18
+
19
+ ## Install
20
+
21
+ ```bash
22
+ pip install da-factory
23
+ ```
24
+
25
+ ## Quick example
26
+
27
+ ```python
28
+ from agent_foundry.catalog.discovery import discover_agents
29
+ from agent_foundry.catalog.build import build_agent
30
+ from agent_foundry.orchestration import run_concurrent
31
+
32
+ manifests = discover_agents("path/to/definitions")
33
+ agents = {m.id: build_agent(m) for m in manifests}
34
+ result = await run_concurrent(agents, "some input")
35
+ ```
36
+
37
+ ## Guardrails
38
+
39
+ Built in, declared per-manifest via `guardrails: [injection, pii, secrets, toxicity]`.
40
+ Each follows the same two-layer shape: a deterministic pre-filter, plus (where it
41
+ adds value) a semantic LLM judge invoked only when the pre-filter finds nothing.
42
+
43
+ ## Development
44
+
45
+ ```bash
46
+ uv sync --all-extras --dev
47
+ uv run pytest
48
+ uv run ruff check . && uv run ruff format --check .
49
+ uv run pyright
50
+ ```
51
+
52
+ ## License
53
+
54
+ See [LICENSE](LICENSE) -- not yet finalized (placeholder, no license granted).
@@ -0,0 +1,18 @@
1
+ {
2
+ "/Users/mthangaraj/my_projects/01/agent_foundry/codemap/CODE_MAP.md": {
3
+ "sha256": "ccd574cb5fe2510d4df9a286ff0d2c3f041ab0d3de900e7480cbb7eefc3a83e1",
4
+ "last_changed": 1789234417.284534
5
+ },
6
+ "/Users/mthangaraj/my_projects/01/agent_foundry/codemap/src_agent_foundry.md": {
7
+ "sha256": "ea3fed227d0c16679bcd2254df3b1ff958e0929d1c160d495a1f24266c2f75ef",
8
+ "last_changed": 1789234307.618131
9
+ },
10
+ "/Users/mthangaraj/my_projects/01/agent_foundry/codemap/src_agent_foundry_catalog.md": {
11
+ "sha256": "d2f1c7176be02f8d7ff03d204cf10309d9549afa7ce06b5464d67c2082590358",
12
+ "last_changed": 1789234307.621813
13
+ },
14
+ "/Users/mthangaraj/my_projects/01/agent_foundry/codemap/src_agent_foundry_guardrails.md": {
15
+ "sha256": "c7d02bab3b1fd20f15b693ab838a2fd8fcf60bb70f4384f95ac1b3a96956233d",
16
+ "last_changed": 1789234307.624861
17
+ }
18
+ }
@@ -0,0 +1,34 @@
1
+ # CODE_MAP: Project Overview
2
+
3
+
4
+ ## Purpose
5
+ <!-- nablr:MANUAL -->
6
+ [Describe the overall project purpose]
7
+
8
+
9
+
10
+
11
+
12
+
13
+ ## Package Index
14
+ <!-- nablr:AUTO -->
15
+ | Package | Path | Purpose |
16
+ |---------|------|---------|
17
+ | [agent_foundry](./src_agent_foundry.md) | `src/agent_foundry` | agent-foundry: declarative agent manifests -> runnable Strands agents. |
18
+ | [catalog](./src_agent_foundry_catalog.md) | `src/agent_foundry/catalog` | Manifest schema, discovery, and agent construction. |
19
+ | [guardrails](./src_agent_foundry_guardrails.md) | `src/agent_foundry/guardrails` | Guardrail catalog: resolve a manifest's `guardrails: [...]` names into |
20
+
21
+
22
+ ## Project Statistics
23
+ <!-- nablr:AUTO -->
24
+ - **Total Packages:** 3
25
+ - **Generated:** Auto-updated by discovery
26
+
27
+
28
+ ## Quick Navigation
29
+ <!-- nablr:MANUAL -->
30
+ *Add frequently accessed modules here*
31
+
32
+ | Module | Description |
33
+ |--------|-------------|
34
+ | ... | ... |
@@ -0,0 +1,45 @@
1
+ # CODE_MAP: `src/agent_foundry`
2
+
3
+
4
+ ## Purpose
5
+ <!-- nablr:MANUAL -->
6
+ [Describe the purpose of this module]
7
+
8
+
9
+
10
+
11
+ ## Directory Structure
12
+ <!-- nablr:AUTO -->
13
+ | Item | Type | Purpose | Dependencies |
14
+ |------|------|---------|--------------|
15
+ | `guardrails/` | Dir | Guardrail catalog: resolve a manifest's `guardrails: [...]` names into | - |
16
+ | `catalog/` | Dir | Manifest schema, discovery, and agent construction. | - |
17
+ | `__init__.py` | File | agent-foundry: declarative agent manifests -> runnable Strands agents. | - |
18
+ | `orchestration.py` | File | Orchestration: `concurrent` (fan-out + optional aggregator) and | - |
19
+ | `cli.py` | File | `agent-foundry` CLI: scaffold a new agent manifest, or validate an | - |
20
+
21
+
22
+ ## Key Classes / Functions
23
+ <!-- nablr:MANUAL -->
24
+ | Name | File | Purpose | Dependencies |
25
+ |------|------|---------|--------------|
26
+ | ... | ... | ... | ... |
27
+
28
+
29
+
30
+
31
+ ## External Dependencies
32
+ <!-- nablr:AUTO -->
33
+ *Auto-detected by external_detector.py*
34
+
35
+ No external dependencies detected.
36
+
37
+
38
+
39
+ ## Integration Boundaries
40
+ <!-- nablr:MANUAL -->
41
+ *Where this module connects to external systems*
42
+
43
+ | Boundary Type | Local Code | External System | Data Flow | Risk Level |
44
+ |---------------|------------|-----------------|-----------|------------|
45
+ | API Call | [file.py] | [External API] | Outbound | Medium |