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.
- da_factory-1.1.1/.github/workflows/branch-to-dev-pr.yml +54 -0
- da_factory-1.1.1/.github/workflows/dev-to-main-pr.yml +99 -0
- da_factory-1.1.1/.github/workflows/publish.yml +176 -0
- da_factory-1.1.1/.gitignore +28 -0
- da_factory-1.1.1/.pre-commit-config.yaml +14 -0
- da_factory-1.1.1/CHANGELOG.md +44 -0
- da_factory-1.1.1/LICENSE +5 -0
- da_factory-1.1.1/PKG-INFO +79 -0
- da_factory-1.1.1/README.md +54 -0
- da_factory-1.1.1/codemap/.content_hash_state.json +18 -0
- da_factory-1.1.1/codemap/CODE_MAP.md +34 -0
- da_factory-1.1.1/codemap/src_agent_foundry.md +45 -0
- da_factory-1.1.1/codemap/src_agent_foundry_catalog.md +44 -0
- da_factory-1.1.1/codemap/src_agent_foundry_guardrails.md +46 -0
- da_factory-1.1.1/docs/TECH_DEBT.md +6 -0
- da_factory-1.1.1/docs/analysis/CHANGE-FIX-2A77F38E.md +41 -0
- da_factory-1.1.1/docs/analysis/CHANGE-FIX-352F7AE5.md +34 -0
- da_factory-1.1.1/docs/analysis/CHANGE-FIX-8866B1D7.md +67 -0
- da_factory-1.1.1/docs/analysis/FIXSPEC-FIX-2A77F38E.md +11 -0
- da_factory-1.1.1/docs/analysis/FIXSPEC-FIX-352F7AE5.md +14 -0
- da_factory-1.1.1/docs/analysis/FIXSPEC-FIX-8866B1D7.md +67 -0
- da_factory-1.1.1/docs/analysis/PR-REVIEW-FIX-2A77F38E.md +46 -0
- da_factory-1.1.1/docs/analysis/PR-REVIEW-FIX-352F7AE5.md +45 -0
- da_factory-1.1.1/docs/analysis/PR-REVIEW-FIX-8866B1D7.md +71 -0
- da_factory-1.1.1/docs/closure/FIX-2A77F38E-CLOSURE.md +15 -0
- da_factory-1.1.1/docs/closure/FIX-352F7AE5-CLOSURE.md +15 -0
- da_factory-1.1.1/docs/closure/FIX-8866B1D7-CLOSURE.md +24 -0
- da_factory-1.1.1/docs/project_status.md +34 -0
- da_factory-1.1.1/nablr-reports/context/project.jsonl +2 -0
- da_factory-1.1.1/nablr-reports/context/story_FIX-8866B1D7.jsonl +1 -0
- da_factory-1.1.1/nablr-reports/context_graph.index.json +516 -0
- da_factory-1.1.1/nablr-reports/context_graph.json +727 -0
- da_factory-1.1.1/nablr-reports/efficiency/ledger.jsonl +35 -0
- da_factory-1.1.1/nablr-reports/executive-summary.json +19 -0
- da_factory-1.1.1/nablr-reports/graph.html +39 -0
- da_factory-1.1.1/nablr-reports/handoff_log.jsonl +71 -0
- da_factory-1.1.1/nablr-reports/platform_engineer/health_report.json +15 -0
- da_factory-1.1.1/nablr-reports/platform_engineer/health_report.md +26 -0
- da_factory-1.1.1/nablr-reports/platform_engineer/test_suite_report.json +66 -0
- da_factory-1.1.1/nablr-reports/security/security_audit_2026-09-12.md +114 -0
- da_factory-1.1.1/pyproject.toml +76 -0
- da_factory-1.1.1/release.toml +51 -0
- da_factory-1.1.1/scripts/block_main_push.sh +17 -0
- da_factory-1.1.1/src/agent_foundry/__init__.py +5 -0
- da_factory-1.1.1/src/agent_foundry/catalog/__init__.py +3 -0
- da_factory-1.1.1/src/agent_foundry/catalog/build.py +74 -0
- da_factory-1.1.1/src/agent_foundry/catalog/discovery.py +72 -0
- da_factory-1.1.1/src/agent_foundry/catalog/manifest_schemas.py +81 -0
- da_factory-1.1.1/src/agent_foundry/cli.py +117 -0
- da_factory-1.1.1/src/agent_foundry/guardrails/__init__.py +66 -0
- da_factory-1.1.1/src/agent_foundry/guardrails/injection.py +231 -0
- da_factory-1.1.1/src/agent_foundry/guardrails/pii.py +185 -0
- da_factory-1.1.1/src/agent_foundry/guardrails/secrets.py +130 -0
- da_factory-1.1.1/src/agent_foundry/guardrails/tool_scope.py +49 -0
- da_factory-1.1.1/src/agent_foundry/guardrails/toxicity.py +158 -0
- da_factory-1.1.1/src/agent_foundry/orchestration.py +97 -0
- da_factory-1.1.1/tests/model_doubles.py +77 -0
- da_factory-1.1.1/tests/test_block_main_push.py +57 -0
- da_factory-1.1.1/tests/test_catalog_build.py +89 -0
- da_factory-1.1.1/tests/test_cli_new_agent.py +42 -0
- da_factory-1.1.1/tests/test_guardrails_injection.py +107 -0
- da_factory-1.1.1/tests/test_guardrails_pii.py +83 -0
- da_factory-1.1.1/tests/test_guardrails_secrets.py +73 -0
- da_factory-1.1.1/tests/test_guardrails_toxicity.py +126 -0
- da_factory-1.1.1/tests/test_manifest_discovery.py +93 -0
- da_factory-1.1.1/tests/test_orchestration.py +112 -0
- 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
|
da_factory-1.1.1/LICENSE
ADDED
|
@@ -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 |
|