agentic-devtools 0.2.4__tar.gz → 0.2.5__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.
- agentic_devtools-0.2.5/.github/agents/security-scan.agent.md +294 -0
- agentic_devtools-0.2.5/.github/workflows/security-scan-on-merge.yml +326 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/PKG-INFO +61 -1
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/README.md +60 -0
- agentic_devtools-0.2.5/SECURITY_SCANNING.md +197 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/_version.py +2 -2
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.devcontainer/README.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.devcontainer/devcontainer.json +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.dfly-temp/background-tasks/all-background-tasks.json +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.dfly-temp/dfly-state.json +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/MARKDOWN_LINTING.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/.markdownlint.json +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.apply-pr-suggestions.initiate.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.create-jira-epic.initiate.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.create-jira-issue.initiate.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.create-jira-subtask.initiate.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.pull-request-review.completion.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.pull-request-review.decision.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.pull-request-review.file-review.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.pull-request-review.initiate.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.pull-request-review.summary.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.update-jira-issue.initiate.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.checklist-creation.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.commit.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.completion.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.implementation-review.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.implementation.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.initiate.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.planning.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.pull-request.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.retrieve.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.setup.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/agdt.work-on-jira-issue.verification.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/copilot-instructions.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/senior-python-developer.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/speckit.analyze.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/speckit.checklist.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/speckit.clarify.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/speckit.constitution.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/speckit.implement.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/speckit.plan.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/speckit.specify.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/speckit.tasks.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/agents/speckit.taskstoissues.agent.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/copilot-instructions.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/.markdownlint.json +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.apply-pr-suggestions.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.create-jira-epic.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.create-jira-issue.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.create-jira-subtask.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.pull-request-review.completion.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.pull-request-review.decision.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.pull-request-review.file-review.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.pull-request-review.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.pull-request-review.summary.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.update-jira-issue.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.checklist-creation.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.commit.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.completion.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.implementation-review.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.implementation.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.planning.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.pull-request.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.retrieve.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.setup.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/agdt.work-on-jira-issue.verification.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/speckit.analyze.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/speckit.checklist.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/speckit.clarify.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/speckit.constitution.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/speckit.implement.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/speckit.plan.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/speckit.specify.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/speckit.tasks.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/prompts/speckit.taskstoissues.prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/scripts/speckit-trigger/check-idempotency.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/scripts/speckit-trigger/create-spec-pr.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/scripts/speckit-trigger/generate-spec-from-issue.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/scripts/speckit-trigger/post-issue-comment.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/scripts/speckit-trigger/sanitize-branch-name.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/scripts/speckit-trigger/templates/.markdownlint.json +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/scripts/speckit-trigger/templates/already-processed.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/scripts/speckit-trigger/templates/completed.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/scripts/speckit-trigger/templates/failed.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/scripts/speckit-trigger/templates/started.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/README.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/auto-fix-on-failure.yml +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/lint.yml +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/publish.yml +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/release.yml +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/scripts/check-release-exists.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/scripts/create-github-release.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/scripts/create-release-packages.ps1 +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/scripts/create-release-packages.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/scripts/generate-release-notes.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/scripts/get-next-version.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/scripts/update-version.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/speckit-issue-trigger.yml +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.github/workflows/test.yml +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.gitignore +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.markdownlint-cli2.jsonc +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.markdownlint.json +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.push-trigger +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/SDD_QUICK_REFERENCE.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/memory/constitution.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/scripts/bash/common.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/scripts/bash/setup-plan.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/scripts/powershell/check-prerequisites.ps1 +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/scripts/powershell/common.ps1 +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/scripts/powershell/create-new-feature.ps1 +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/scripts/powershell/setup-plan.ps1 +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/scripts/powershell/update-agent-context.ps1 +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/agent-file-template.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/checklist-template.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/commands/.markdownlint.json +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/commands/analyze.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/commands/checklist.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/commands/clarify.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/commands/constitution.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/commands/implement.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/commands/plan.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/commands/specify.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/commands/tasks.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/commands/taskstoissues.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/plan-template.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/spec-template.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/tasks-template.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.specify/templates/vscode-settings.json +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/.work-folder-info +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/CHANGELOG.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/CONTRIBUTING.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/LICENSE +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/PR_DESCRIPTION.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/PR_INSTRUCTIONS.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/RELEASING.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/SOLUTION_SUMMARY.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/SPEC_DRIVEN_DEVELOPMENT.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agdt_ai_helpers/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/background_tasks.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure/app_insights_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure/auth.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure/config.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_context/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_context/commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_context/config.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_context/management.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/async_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/auth.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/config.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/file_review_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/helpers.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/mark_reviewed.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/pipeline_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/pr_summary_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/pull_request_details_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/review_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/review_helpers.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/review_jira.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/review_prompts.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/run_details_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/azure_devops/vpn_toggle.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/git/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/git/async_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/git/commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/git/core.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/git/diff.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/git/operations.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/adf.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/async_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/async_status.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/comment_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/config.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/create_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/formatting.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/get_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/helpers.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/parse_error_report.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/role_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/state_helpers.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/update_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/jira/vpn_wrapper.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/network/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/network/commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/network/detection.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/release/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/release/commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/release/helpers.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/runner.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/state.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/subprocess_utils.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/tasks/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/tasks/commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/testing.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/vpn/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/vpn/commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/vpn/runner.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/workflows/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/workflows/advancement.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/workflows/base.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/workflows/checklist.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/workflows/commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/workflows/manager.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/workflows/preflight.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/cli/workflows/worktree_setup.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/dispatcher.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/file_locking.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/apply-pull-request-review-suggestions/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/create-jira-epic/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/create-jira-issue/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/create-jira-subtask/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/loader.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/pull-request-review/default-completion-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/pull-request-review/default-decision-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/pull-request-review/default-file-review-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/pull-request-review/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/pull-request-review/default-summary-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/update-jira-issue/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-checklist-creation-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-commit-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-completion-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-implementation-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-implementation-review-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-planning-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-pull-request-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-retrieve-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-setup-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/prompts/work-on-jira-issue/default-verification-prompt.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/state.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/agentic_devtools/task_state.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/ayaiay.json +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/pyproject.toml +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/scripts/validate_test_structure.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/scripts/verify-agent-coverage.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-add-workflow-step-agents/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-add-workflow-step-agents/plan.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-add-workflow-step-agents/spec.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-add-workflow-step-agents/tasks.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-pypi-wheel-release/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-pypi-wheel-release/plan.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-pypi-wheel-release/spec.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-pypi-wheel-release/tasks.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-separate-docs/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-separate-docs/plan.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-separate-docs/spec.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/001-separate-docs/tasks.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/002-github-action-speckit-trigger/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/002-github-action-speckit-trigger/plan.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/002-github-action-speckit-trigger/spec.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/002-github-action-speckit-trigger/tasks.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/002-github-action-speckit-trigger/workflow-sequence-diagram.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/003-comprehensive-e2e-smoke-tests/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/003-comprehensive-e2e-smoke-tests/spec.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/003-e2e-smoke-tests-cli/plan.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/specs/README.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/README.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_context/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_context/test_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_context/test_config.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_context/test_management.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/conftest.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_async_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_auth.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_commands_api.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_commands_dry_run.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_config.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_file_review_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_helpers.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_mark_reviewed.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_pipeline_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_pr_summary_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_pull_request_details_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_review_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_run_details_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/azure_devops/test_vpn_toggle.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/cli/test_azure_app_insights_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/cli/test_azure_auth.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/cli/test_azure_config.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/cli/test_runner.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/conftest.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/e2e_smoke/README.md +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/e2e_smoke/__init__.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/e2e_smoke/conftest.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/e2e_smoke/fixtures/cassettes/azure_devops_create_pr.yaml +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/e2e_smoke/fixtures/cassettes/jira_add_comment.yaml +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/e2e_smoke/fixtures/cassettes/jira_get_issue.yaml +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/e2e_smoke/test_azure_devops_commands_e2e.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/e2e_smoke/test_git_commands_e2e.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/e2e_smoke/test_jira_commands_e2e.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/network/test_detection.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/network/test_network_cli.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_background_tasks.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_checklist.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_checklist_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_cli_state.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_dispatcher.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_file_locking.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_file_locking_platform.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_file_review_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_file_review_queue_management.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_git_async.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_git_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_git_core.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_git_diff.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_git_operations.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_git_utilities.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_jira_adf.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_jira_async.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_jira_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_jira_config.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_jira_formatting.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_jira_helpers.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_jira_state.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_jira_update_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_parse_error_report.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_preflight.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_prompt_loader.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_release_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_release_helpers.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_release_integration.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_review_jira.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_review_prompts.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_role_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_state.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_subprocess_utils.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_task_state.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_tasks_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_testing.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_version.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_vpn_wrapper.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_workflow_advancement.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_workflow_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_workflow_prompt.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_workflow_state.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/test_worktree_setup.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/vpn/test_vpn_commands.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/tests/vpn/test_vpn_runner.py +0 -0
- {agentic_devtools-0.2.4 → agentic_devtools-0.2.5}/trigger.txt +0 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 'Security Scanning Agent'
|
|
3
|
+
description: 'Specialized agent for scanning code vulnerabilities and security issues'
|
|
4
|
+
model: claude-opus-4.5
|
|
5
|
+
temperature: 0.3
|
|
6
|
+
max_tokens: 8192
|
|
7
|
+
tools:
|
|
8
|
+
- view
|
|
9
|
+
- grep
|
|
10
|
+
- glob
|
|
11
|
+
- bash
|
|
12
|
+
- web_search
|
|
13
|
+
- github-mcp-server
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Security Scanning Agent
|
|
17
|
+
|
|
18
|
+
## Role
|
|
19
|
+
|
|
20
|
+
You are a specialized security scanning agent with expertise in identifying vulnerabilities, security issues, and potential threats in codebases. Your primary responsibility is to perform comprehensive security analysis and provide actionable recommendations.
|
|
21
|
+
|
|
22
|
+
## Core Expertise
|
|
23
|
+
|
|
24
|
+
### 1. Security Vulnerability Analysis
|
|
25
|
+
|
|
26
|
+
You excel at identifying:
|
|
27
|
+
|
|
28
|
+
- **Code Vulnerabilities**: SQL injection, XSS, CSRF, command injection
|
|
29
|
+
- **Authentication/Authorization Issues**: Weak credentials, improper access controls
|
|
30
|
+
- **Data Security**: Sensitive data exposure, insufficient encryption
|
|
31
|
+
- **Dependency Vulnerabilities**: Outdated packages with known CVEs
|
|
32
|
+
- **Configuration Issues**: Insecure defaults, exposed secrets
|
|
33
|
+
- **Input Validation**: Missing or inadequate input sanitization
|
|
34
|
+
- **API Security**: Rate limiting, authentication, authorization issues
|
|
35
|
+
|
|
36
|
+
### 2. Security Scanning Tools
|
|
37
|
+
|
|
38
|
+
You leverage multiple security scanning tools:
|
|
39
|
+
|
|
40
|
+
- **Python Security**: `bandit`, `safety`, `pip-audit`
|
|
41
|
+
- **Dependency Scanning**: Check for known vulnerabilities in dependencies
|
|
42
|
+
- **Secret Detection**: Scan for hardcoded credentials, API keys, tokens
|
|
43
|
+
- **SAST (Static Analysis)**: Identify code-level security issues
|
|
44
|
+
- **Linting**: Security-focused linting rules
|
|
45
|
+
|
|
46
|
+
### 3. Security Review Process
|
|
47
|
+
|
|
48
|
+
When scanning code for vulnerabilities:
|
|
49
|
+
|
|
50
|
+
1. **Scan Dependencies**: Check all dependencies for known vulnerabilities
|
|
51
|
+
2. **Static Analysis**: Run security-focused static analysis tools
|
|
52
|
+
3. **Secret Detection**: Search for exposed credentials and API keys
|
|
53
|
+
4. **Code Review**: Manual review of critical security areas
|
|
54
|
+
5. **Configuration Review**: Check for insecure configurations
|
|
55
|
+
6. **Documentation**: Generate comprehensive security report
|
|
56
|
+
|
|
57
|
+
### 4. Risk Assessment
|
|
58
|
+
|
|
59
|
+
For each finding, you provide:
|
|
60
|
+
|
|
61
|
+
- **Severity Level**: Critical, High, Medium, Low, Informational
|
|
62
|
+
- **Impact Description**: What could go wrong if exploited
|
|
63
|
+
- **Affected Components**: Specific files, functions, or modules
|
|
64
|
+
- **Remediation Steps**: Clear instructions to fix the issue
|
|
65
|
+
- **Priority**: Immediate action required vs. technical debt
|
|
66
|
+
|
|
67
|
+
## Scanning Workflow
|
|
68
|
+
|
|
69
|
+
When invoked to scan a repository:
|
|
70
|
+
|
|
71
|
+
### Step 1: Environment Setup
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Navigate to repository root
|
|
75
|
+
cd /path/to/repository
|
|
76
|
+
|
|
77
|
+
# Check Python version and environment
|
|
78
|
+
python --version
|
|
79
|
+
|
|
80
|
+
# Install security scanning tools if not available
|
|
81
|
+
pip install bandit safety pip-audit
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Step 2: Dependency Vulnerability Scan
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Check for known vulnerabilities in installed packages
|
|
88
|
+
pip-audit
|
|
89
|
+
|
|
90
|
+
# Check for security issues in dependencies
|
|
91
|
+
safety scan --json
|
|
92
|
+
|
|
93
|
+
# Generate dependency report
|
|
94
|
+
pip list --format=json > dependencies.json
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Step 3: Static Security Analysis
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Run bandit security scanner
|
|
101
|
+
bandit -r . -f json -o bandit-report.json
|
|
102
|
+
|
|
103
|
+
# Run with baseline for comparison (if available)
|
|
104
|
+
bandit -r . -f screen
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Step 4: Secret Detection
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Search for potential secrets using grep patterns
|
|
111
|
+
grep -r -E "(password|secret|api_key|token|credential)" . --include="*.py" --include="*.json" --include="*.yml" --include="*.yaml" --exclude-dir=".git" --exclude-dir="node_modules" --exclude-dir="venv" --exclude-dir=".venv"
|
|
112
|
+
|
|
113
|
+
# Check for common secret patterns
|
|
114
|
+
grep -r -E "[0-9a-f]{32,}" . --include="*.py" --exclude-dir=".git" --exclude-dir="venv"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Step 5: Manual Code Review
|
|
118
|
+
|
|
119
|
+
Focus on:
|
|
120
|
+
|
|
121
|
+
- **Authentication/Authorization logic**
|
|
122
|
+
- **Input validation and sanitization**
|
|
123
|
+
- **Database queries and ORM usage**
|
|
124
|
+
- **File operations and path handling**
|
|
125
|
+
- **Encryption and hashing implementations**
|
|
126
|
+
- **API endpoints and request handling**
|
|
127
|
+
- **Configuration files and environment variables**
|
|
128
|
+
|
|
129
|
+
### Step 6: Generate Security Report
|
|
130
|
+
|
|
131
|
+
Create a comprehensive report including:
|
|
132
|
+
|
|
133
|
+
#### Executive Summary
|
|
134
|
+
|
|
135
|
+
- Total number of findings
|
|
136
|
+
- Breakdown by severity
|
|
137
|
+
- Critical issues requiring immediate attention
|
|
138
|
+
- Overall security posture assessment
|
|
139
|
+
|
|
140
|
+
#### Detailed Findings
|
|
141
|
+
|
|
142
|
+
For each vulnerability:
|
|
143
|
+
|
|
144
|
+
```markdown
|
|
145
|
+
### [SEVERITY] Vulnerability Title
|
|
146
|
+
|
|
147
|
+
**File**: `path/to/file.py:line_number`
|
|
148
|
+
|
|
149
|
+
**Description**: Brief description of the vulnerability
|
|
150
|
+
|
|
151
|
+
**Impact**: What could happen if this is exploited
|
|
152
|
+
|
|
153
|
+
**Remediation**:
|
|
154
|
+
1. Step-by-step fix instructions
|
|
155
|
+
2. Code example if applicable
|
|
156
|
+
3. Additional security best practices
|
|
157
|
+
|
|
158
|
+
**References**:
|
|
159
|
+
- CWE ID (if applicable)
|
|
160
|
+
- OWASP reference (if applicable)
|
|
161
|
+
- CVE ID (if applicable)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
#### Recommendations
|
|
165
|
+
|
|
166
|
+
- **Immediate Actions**: Critical fixes needed now
|
|
167
|
+
- **Short-term Improvements**: High/Medium priority items
|
|
168
|
+
- **Long-term Enhancements**: Security posture improvements
|
|
169
|
+
- **Security Best Practices**: General recommendations
|
|
170
|
+
|
|
171
|
+
## Output Format
|
|
172
|
+
|
|
173
|
+
Your security scan report should follow this structure:
|
|
174
|
+
|
|
175
|
+
```markdown
|
|
176
|
+
# Security Scan Report
|
|
177
|
+
|
|
178
|
+
**Date**: YYYY-MM-DD
|
|
179
|
+
**Repository**: [repository name]
|
|
180
|
+
**Branch**: [branch name]
|
|
181
|
+
**Commit**: [commit SHA]
|
|
182
|
+
|
|
183
|
+
## Executive Summary
|
|
184
|
+
|
|
185
|
+
- **Total Findings**: X issues detected
|
|
186
|
+
- Critical: X
|
|
187
|
+
- High: X
|
|
188
|
+
- Medium: X
|
|
189
|
+
- Low: X
|
|
190
|
+
- Informational: X
|
|
191
|
+
|
|
192
|
+
- **Overall Risk Level**: [Critical/High/Medium/Low]
|
|
193
|
+
|
|
194
|
+
## Critical Findings (Immediate Action Required)
|
|
195
|
+
|
|
196
|
+
[List of critical issues with details]
|
|
197
|
+
|
|
198
|
+
## High Priority Findings
|
|
199
|
+
|
|
200
|
+
[List of high priority issues]
|
|
201
|
+
|
|
202
|
+
## Medium Priority Findings
|
|
203
|
+
|
|
204
|
+
[List of medium priority issues]
|
|
205
|
+
|
|
206
|
+
## Low Priority & Informational
|
|
207
|
+
|
|
208
|
+
[List of low priority and informational findings]
|
|
209
|
+
|
|
210
|
+
## Dependency Vulnerabilities
|
|
211
|
+
|
|
212
|
+
[Results from pip-audit and safety check]
|
|
213
|
+
|
|
214
|
+
## Security Best Practices Recommendations
|
|
215
|
+
|
|
216
|
+
[General security recommendations for the codebase]
|
|
217
|
+
|
|
218
|
+
## Tool Output Summary
|
|
219
|
+
|
|
220
|
+
- **Bandit**: [summary]
|
|
221
|
+
- **pip-audit**: [summary]
|
|
222
|
+
- **Safety**: [summary]
|
|
223
|
+
- **Manual Review**: [summary]
|
|
224
|
+
|
|
225
|
+
## Next Steps
|
|
226
|
+
|
|
227
|
+
1. Address all critical findings immediately
|
|
228
|
+
2. Create tickets for high priority issues
|
|
229
|
+
3. Schedule reviews for medium priority items
|
|
230
|
+
4. Consider implementing security best practices
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
*Automated security scan performed by Security Scanning Agent*
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Security Scanning Best Practices
|
|
237
|
+
|
|
238
|
+
1. **Be Thorough**: Don't skip any critical areas
|
|
239
|
+
2. **Be Accurate**: Minimize false positives with verification
|
|
240
|
+
3. **Be Clear**: Provide actionable remediation steps
|
|
241
|
+
4. **Be Timely**: Complete scans efficiently
|
|
242
|
+
5. **Be Constructive**: Focus on improvement, not blame
|
|
243
|
+
|
|
244
|
+
## Common Vulnerability Patterns to Check
|
|
245
|
+
|
|
246
|
+
### Python-Specific
|
|
247
|
+
|
|
248
|
+
- `eval()` and `exec()` usage
|
|
249
|
+
- `pickle` deserialization without validation
|
|
250
|
+
- SQL string concatenation instead of parameterized queries
|
|
251
|
+
- Insecure random number generation (`random` vs `secrets`)
|
|
252
|
+
- Unsafe YAML loading (`yaml.load` vs `yaml.safe_load`)
|
|
253
|
+
- Command injection via `os.system()`, `subprocess.shell=True`
|
|
254
|
+
- Path traversal in file operations
|
|
255
|
+
- Hardcoded credentials or secrets
|
|
256
|
+
|
|
257
|
+
### Dependencies
|
|
258
|
+
|
|
259
|
+
- Packages with known CVEs
|
|
260
|
+
- Outdated versions with security patches available
|
|
261
|
+
- Packages from untrusted sources
|
|
262
|
+
- Unnecessary dependencies increasing attack surface
|
|
263
|
+
|
|
264
|
+
### Configuration
|
|
265
|
+
|
|
266
|
+
- Debug mode enabled in production
|
|
267
|
+
- Exposed error messages with stack traces
|
|
268
|
+
- Insecure default configurations
|
|
269
|
+
- Missing security headers
|
|
270
|
+
- Weak cryptographic settings
|
|
271
|
+
|
|
272
|
+
## False Positive Handling
|
|
273
|
+
|
|
274
|
+
When a security tool reports a finding:
|
|
275
|
+
|
|
276
|
+
1. **Verify**: Is this a real vulnerability or false positive?
|
|
277
|
+
2. **Context**: Consider the specific use case and context
|
|
278
|
+
3. **Risk**: Assess the actual exploitability and impact
|
|
279
|
+
4. **Document**: If it's a false positive, document why
|
|
280
|
+
5. **Suppress**: Add appropriate suppressions with justification
|
|
281
|
+
|
|
282
|
+
## Communication Style
|
|
283
|
+
|
|
284
|
+
- **Professional**: Technical and precise
|
|
285
|
+
- **Clear**: Easy to understand even for non-security experts
|
|
286
|
+
- **Actionable**: Always provide clear next steps
|
|
287
|
+
- **Prioritized**: Focus on what matters most
|
|
288
|
+
- **Balanced**: Acknowledge both risks and mitigations
|
|
289
|
+
|
|
290
|
+
## Remember
|
|
291
|
+
|
|
292
|
+
Your goal is to improve security, not to create alarm. Be thorough but pragmatic. Prioritize real risks over theoretical vulnerabilities. Provide context and help the team understand not just what's wrong, but why it matters and how to fix it.
|
|
293
|
+
|
|
294
|
+
Every security scan is an opportunity to improve the codebase and strengthen the organization's security posture. Your work directly protects users, data, and systems.
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
name: Security Scan on Main Merge
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
issues: write
|
|
11
|
+
pull-requests: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
security-scan:
|
|
15
|
+
name: Run Security Scanning Agent
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout code
|
|
20
|
+
uses: actions/checkout@v4
|
|
21
|
+
with:
|
|
22
|
+
fetch-depth: 0 # Full history for better analysis
|
|
23
|
+
|
|
24
|
+
- name: Set up Python
|
|
25
|
+
uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: '3.11'
|
|
28
|
+
cache: 'pip'
|
|
29
|
+
|
|
30
|
+
- name: Install dependencies
|
|
31
|
+
run: |
|
|
32
|
+
python -m pip install --upgrade pip
|
|
33
|
+
pip install -e ".[dev]"
|
|
34
|
+
# Install security scanning tools
|
|
35
|
+
pip install bandit safety pip-audit
|
|
36
|
+
|
|
37
|
+
- name: Get Merge Information
|
|
38
|
+
id: merge-info
|
|
39
|
+
uses: actions/github-script@v7
|
|
40
|
+
with:
|
|
41
|
+
script: |
|
|
42
|
+
const commitSha = context.sha;
|
|
43
|
+
console.log(`Current commit SHA: ${commitSha}`);
|
|
44
|
+
|
|
45
|
+
// Get the commit details
|
|
46
|
+
const { data: commit } = await github.rest.repos.getCommit({
|
|
47
|
+
owner: context.repo.owner,
|
|
48
|
+
repo: context.repo.repo,
|
|
49
|
+
ref: commitSha
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
console.log(`Commit message: ${commit.commit.message}`);
|
|
53
|
+
console.log(`Author: ${commit.commit.author.name}`);
|
|
54
|
+
|
|
55
|
+
// Check if this is a merge commit
|
|
56
|
+
const isMerge = commit.parents.length > 1;
|
|
57
|
+
console.log(`Is merge commit: ${isMerge}`);
|
|
58
|
+
|
|
59
|
+
core.setOutput('commit_sha', commitSha);
|
|
60
|
+
core.setOutput('commit_message', commit.commit.message);
|
|
61
|
+
core.setOutput('is_merge', isMerge);
|
|
62
|
+
|
|
63
|
+
// Try to find associated PR using GitHub API
|
|
64
|
+
let prNumber = null;
|
|
65
|
+
let prTitle = '';
|
|
66
|
+
let prUrl = '';
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
// Use the API to list PRs associated with this commit
|
|
70
|
+
const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({
|
|
71
|
+
owner: context.repo.owner,
|
|
72
|
+
repo: context.repo.repo,
|
|
73
|
+
commit_sha: commitSha
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (prs.length > 0) {
|
|
77
|
+
// Take the first merged PR
|
|
78
|
+
const pr = prs.find(p => p.merged_at) || prs[0];
|
|
79
|
+
prNumber = pr.number;
|
|
80
|
+
prTitle = pr.title;
|
|
81
|
+
prUrl = pr.html_url;
|
|
82
|
+
console.log(`Found associated PR via API: #${prNumber} - ${prTitle}`);
|
|
83
|
+
}
|
|
84
|
+
} catch (error) {
|
|
85
|
+
console.log(`Could not fetch associated PRs via API: ${error.message}`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Fallback: try to parse PR number from commit message
|
|
89
|
+
if (!prNumber && isMerge) {
|
|
90
|
+
const prMatch = commit.commit.message.match(/#(\d+)/);
|
|
91
|
+
if (prMatch) {
|
|
92
|
+
prNumber = parseInt(prMatch[1]);
|
|
93
|
+
console.log(`Found PR number from commit message: ${prNumber}`);
|
|
94
|
+
|
|
95
|
+
// Get PR details
|
|
96
|
+
try {
|
|
97
|
+
const { data: pr } = await github.rest.pulls.get({
|
|
98
|
+
owner: context.repo.owner,
|
|
99
|
+
repo: context.repo.repo,
|
|
100
|
+
pull_number: prNumber
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
prTitle = pr.title;
|
|
104
|
+
prUrl = pr.html_url;
|
|
105
|
+
console.log(`Fetched PR details: #${prNumber} - ${prTitle}`);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.log(`Could not fetch PR details: ${error.message}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (prNumber) {
|
|
113
|
+
core.setOutput('pr_number', prNumber);
|
|
114
|
+
core.setOutput('pr_title', prTitle);
|
|
115
|
+
core.setOutput('pr_url', prUrl);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
- name: Run Dependency Vulnerability Scan
|
|
119
|
+
id: pip-audit
|
|
120
|
+
run: |
|
|
121
|
+
echo "Running pip-audit..."
|
|
122
|
+
pip-audit --format json > pip-audit-report.json || true
|
|
123
|
+
|
|
124
|
+
# Check if vulnerabilities were actually found by parsing JSON
|
|
125
|
+
if [ -s pip-audit-report.json ]; then
|
|
126
|
+
vuln_count=$(python -c "import json; data=json.load(open('pip-audit-report.json')); print(len(data.get('vulnerabilities', [])))" 2>/dev/null || echo "0")
|
|
127
|
+
if [ "$vuln_count" -gt 0 ]; then
|
|
128
|
+
echo "Dependency vulnerabilities found: $vuln_count vulnerability(ies)"
|
|
129
|
+
pip-audit || true
|
|
130
|
+
else
|
|
131
|
+
echo "No dependency vulnerabilities found"
|
|
132
|
+
fi
|
|
133
|
+
else
|
|
134
|
+
echo "pip-audit did not produce a report"
|
|
135
|
+
fi
|
|
136
|
+
continue-on-error: true
|
|
137
|
+
|
|
138
|
+
- name: Run Bandit Security Scanner
|
|
139
|
+
id: bandit
|
|
140
|
+
run: |
|
|
141
|
+
echo "Running bandit security scanner..."
|
|
142
|
+
bandit -r agentic_devtools -f json -o bandit-report.json || true
|
|
143
|
+
|
|
144
|
+
# Check if issues were actually found by parsing JSON
|
|
145
|
+
if [ -s bandit-report.json ]; then
|
|
146
|
+
issue_count=$(python -c "import json; data=json.load(open('bandit-report.json')); print(len(data.get('results', [])))" 2>/dev/null || echo "0")
|
|
147
|
+
if [ "$issue_count" -gt 0 ]; then
|
|
148
|
+
echo "Security issues found: $issue_count issue(s)"
|
|
149
|
+
bandit -r agentic_devtools -f screen || true
|
|
150
|
+
else
|
|
151
|
+
echo "No security issues found by bandit"
|
|
152
|
+
fi
|
|
153
|
+
else
|
|
154
|
+
echo "Bandit did not produce a report"
|
|
155
|
+
fi
|
|
156
|
+
continue-on-error: true
|
|
157
|
+
|
|
158
|
+
- name: Run Safety Scan
|
|
159
|
+
id: safety
|
|
160
|
+
run: |
|
|
161
|
+
echo "Running safety scan..."
|
|
162
|
+
safety scan --json > safety-report.json
|
|
163
|
+
safety_exit_code=$?
|
|
164
|
+
|
|
165
|
+
# Validate that the report exists and is valid JSON before interpreting results
|
|
166
|
+
if [ ! -s safety-report.json ]; then
|
|
167
|
+
echo "Safety scan did not produce a report (exit code: ${safety_exit_code})"
|
|
168
|
+
elif ! python -c "import json; json.load(open('safety-report.json'))" 2>/dev/null; then
|
|
169
|
+
echo "Safety scan produced an invalid JSON report (exit code: ${safety_exit_code})"
|
|
170
|
+
else
|
|
171
|
+
# At this point, we have a non-empty, parseable JSON report
|
|
172
|
+
if [ "${safety_exit_code}" -eq 0 ]; then
|
|
173
|
+
echo "No vulnerabilities found by safety"
|
|
174
|
+
else
|
|
175
|
+
echo "Vulnerabilities or issues reported by safety - see safety-report.json"
|
|
176
|
+
# Run a human-readable summary; ignore its exit code to keep the workflow running
|
|
177
|
+
safety scan || true
|
|
178
|
+
fi
|
|
179
|
+
fi
|
|
180
|
+
continue-on-error: true
|
|
181
|
+
|
|
182
|
+
- name: Create Security Scan Issue
|
|
183
|
+
uses: actions/github-script@v7
|
|
184
|
+
with:
|
|
185
|
+
script: |
|
|
186
|
+
const fs = require('fs');
|
|
187
|
+
const commitSha = '${{ steps.merge-info.outputs.commit_sha }}';
|
|
188
|
+
const isMerge = '${{ steps.merge-info.outputs.is_merge }}' === 'true';
|
|
189
|
+
const prNumber = '${{ steps.merge-info.outputs.pr_number }}';
|
|
190
|
+
const prTitle = ${{ toJson(steps.merge-info.outputs.pr_title) }};
|
|
191
|
+
const prUrl = ${{ toJson(steps.merge-info.outputs.pr_url) }};
|
|
192
|
+
|
|
193
|
+
// Read scan results
|
|
194
|
+
let pipAuditResults = 'No vulnerabilities detected';
|
|
195
|
+
let banditResults = 'No issues detected';
|
|
196
|
+
let safetyResults = 'No vulnerabilities detected';
|
|
197
|
+
|
|
198
|
+
try {
|
|
199
|
+
if (fs.existsSync('pip-audit-report.json')) {
|
|
200
|
+
const pipAudit = JSON.parse(fs.readFileSync('pip-audit-report.json', 'utf8'));
|
|
201
|
+
if (pipAudit.vulnerabilities && pipAudit.vulnerabilities.length > 0) {
|
|
202
|
+
pipAuditResults = `Found ${pipAudit.vulnerabilities.length} vulnerability(ies)`;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
} catch (e) {
|
|
206
|
+
console.log('Could not read pip-audit results:', e.message);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
if (fs.existsSync('bandit-report.json')) {
|
|
211
|
+
const bandit = JSON.parse(fs.readFileSync('bandit-report.json', 'utf8'));
|
|
212
|
+
if (bandit.results && bandit.results.length > 0) {
|
|
213
|
+
const critical = bandit.results.filter(r => r.issue_severity === 'HIGH').length;
|
|
214
|
+
const medium = bandit.results.filter(r => r.issue_severity === 'MEDIUM').length;
|
|
215
|
+
const low = bandit.results.filter(r => r.issue_severity === 'LOW').length;
|
|
216
|
+
banditResults = `Found ${bandit.results.length} issue(s): ${critical} high, ${medium} medium, ${low} low`;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
} catch (e) {
|
|
220
|
+
console.log('Could not read bandit results:', e.message);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
try {
|
|
224
|
+
if (fs.existsSync('safety-report.json')) {
|
|
225
|
+
const safety = JSON.parse(fs.readFileSync('safety-report.json', 'utf8'));
|
|
226
|
+
if (safety.vulnerabilities && safety.vulnerabilities.length > 0) {
|
|
227
|
+
safetyResults = `Found ${safety.vulnerabilities.length} vulnerability(ies)`;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
} catch (e) {
|
|
231
|
+
console.log('Could not read safety results:', e.message);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Determine if there are any findings
|
|
235
|
+
const hasFindings =
|
|
236
|
+
pipAuditResults.includes('Found') ||
|
|
237
|
+
banditResults.includes('Found') ||
|
|
238
|
+
safetyResults.includes('Found');
|
|
239
|
+
|
|
240
|
+
// Build issue body
|
|
241
|
+
let issueBody = [
|
|
242
|
+
'<!-- security-scan-report -->',
|
|
243
|
+
'',
|
|
244
|
+
'# 🔒 Security Scan Report',
|
|
245
|
+
'',
|
|
246
|
+
'**Date**: ' + new Date().toISOString().split('T')[0],
|
|
247
|
+
'**Commit**: ' + commitSha.substring(0, 7),
|
|
248
|
+
'**Branch**: main',
|
|
249
|
+
''
|
|
250
|
+
];
|
|
251
|
+
|
|
252
|
+
if (isMerge && prNumber) {
|
|
253
|
+
issueBody.push(`**Merged PR**: [#${prNumber} - ${prTitle}](${prUrl})`);
|
|
254
|
+
issueBody.push('');
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
issueBody.push('## Summary');
|
|
258
|
+
issueBody.push('');
|
|
259
|
+
|
|
260
|
+
if (hasFindings) {
|
|
261
|
+
issueBody.push('⚠️ **Security findings detected** - review required.');
|
|
262
|
+
} else {
|
|
263
|
+
issueBody.push('✅ **No security issues detected** - all scans passed.');
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
issueBody.push('');
|
|
267
|
+
issueBody.push('## Scan Results');
|
|
268
|
+
issueBody.push('');
|
|
269
|
+
issueBody.push('### Dependency Vulnerabilities (pip-audit)');
|
|
270
|
+
issueBody.push('');
|
|
271
|
+
issueBody.push(pipAuditResults);
|
|
272
|
+
issueBody.push('');
|
|
273
|
+
issueBody.push('### Static Security Analysis (bandit)');
|
|
274
|
+
issueBody.push('');
|
|
275
|
+
issueBody.push(banditResults);
|
|
276
|
+
issueBody.push('');
|
|
277
|
+
issueBody.push('### Dependency Safety Check (safety)');
|
|
278
|
+
issueBody.push('');
|
|
279
|
+
issueBody.push(safetyResults);
|
|
280
|
+
issueBody.push('');
|
|
281
|
+
issueBody.push('## Next Steps');
|
|
282
|
+
issueBody.push('');
|
|
283
|
+
|
|
284
|
+
if (hasFindings) {
|
|
285
|
+
issueBody.push('1. Review the [workflow logs](' + context.payload.repository.html_url + '/actions/runs/' + context.runId + ') for detailed findings');
|
|
286
|
+
issueBody.push('2. Address critical and high-severity issues immediately');
|
|
287
|
+
issueBody.push('3. Create tickets for medium-priority items');
|
|
288
|
+
issueBody.push('4. Tag @copilot for assistance with remediation');
|
|
289
|
+
} else {
|
|
290
|
+
issueBody.push('No action required. Continue monitoring for security issues.');
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
issueBody.push('');
|
|
294
|
+
issueBody.push('---');
|
|
295
|
+
issueBody.push('');
|
|
296
|
+
issueBody.push('*Automated security scan performed by the Security Scanning Agent*');
|
|
297
|
+
issueBody.push('*View [workflow run](' + context.payload.repository.html_url + '/actions/runs/' + context.runId + ') for full details*');
|
|
298
|
+
|
|
299
|
+
const issueTitle = hasFindings
|
|
300
|
+
? '🔒 Security Scan Report - Findings Detected'
|
|
301
|
+
: '🔒 Security Scan Report - All Clear';
|
|
302
|
+
|
|
303
|
+
// Create the issue
|
|
304
|
+
const { data: issue } = await github.rest.issues.create({
|
|
305
|
+
owner: context.repo.owner,
|
|
306
|
+
repo: context.repo.repo,
|
|
307
|
+
title: issueTitle,
|
|
308
|
+
body: issueBody.join('\n'),
|
|
309
|
+
labels: hasFindings
|
|
310
|
+
? ['security', 'security-scan', 'needs-review']
|
|
311
|
+
: ['security', 'security-scan', 'all-clear']
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
console.log(`Created issue #${issue.number}: ${issue.title}`);
|
|
315
|
+
console.log(`Issue URL: ${issue.html_url}`);
|
|
316
|
+
|
|
317
|
+
- name: Upload Scan Reports
|
|
318
|
+
uses: actions/upload-artifact@v4
|
|
319
|
+
if: always()
|
|
320
|
+
with:
|
|
321
|
+
name: security-scan-reports
|
|
322
|
+
path: |
|
|
323
|
+
pip-audit-report.json
|
|
324
|
+
bandit-report.json
|
|
325
|
+
safety-report.json
|
|
326
|
+
retention-days: 90
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentic-devtools
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: AI assistant helper commands for the Dragonfly platform
|
|
5
5
|
Author: Dragonfly Team
|
|
6
6
|
License-Expression: MIT
|
|
@@ -800,3 +800,63 @@ The workflow uses labels to manage state:
|
|
|
800
800
|
- `speckit:processing` - Specification generation in progress
|
|
801
801
|
- `speckit:completed` - Specification created successfully
|
|
802
802
|
- `speckit:failed` - Generation failed (check workflow logs)
|
|
803
|
+
|
|
804
|
+
## GitHub Actions: Security Scanning on Main Merge
|
|
805
|
+
|
|
806
|
+
The repository includes an automated security scanning workflow that runs whenever
|
|
807
|
+
code is merged to the main branch. This ensures continuous security monitoring and
|
|
808
|
+
helps identify vulnerabilities early.
|
|
809
|
+
|
|
810
|
+
### How It Works
|
|
811
|
+
|
|
812
|
+
1. Workflow triggers automatically on push to main branch (typically after PR merge)
|
|
813
|
+
2. Installs security scanning tools: `bandit`, `pip-audit`, `safety`
|
|
814
|
+
3. Runs comprehensive security scans:
|
|
815
|
+
- **pip-audit**: Scans dependencies for known vulnerabilities (CVEs)
|
|
816
|
+
- **bandit**: Static analysis for common security issues in Python code
|
|
817
|
+
- **safety**: Checks dependencies against a database of known security issues
|
|
818
|
+
4. Creates a GitHub issue with the security scan report
|
|
819
|
+
5. Attaches scan reports as artifacts for detailed review
|
|
820
|
+
|
|
821
|
+
### Security Scan Report
|
|
822
|
+
|
|
823
|
+
After each merge to main, an issue is automatically created with:
|
|
824
|
+
|
|
825
|
+
- **Summary**: Quick overview of security status
|
|
826
|
+
- **Scan Results**: Findings from each security tool
|
|
827
|
+
- **Severity Breakdown**: Critical, high, medium, low issues
|
|
828
|
+
- **Next Steps**: Recommended actions to address findings
|
|
829
|
+
- **Artifacts**: Detailed JSON reports attached to the workflow run
|
|
830
|
+
|
|
831
|
+
### Labels
|
|
832
|
+
|
|
833
|
+
The workflow uses labels to categorize scan results:
|
|
834
|
+
|
|
835
|
+
- `security` - All security scan reports
|
|
836
|
+
- `security-scan` - Identifies automated scan issues
|
|
837
|
+
- `needs-review` - Findings detected, review required
|
|
838
|
+
- `all-clear` - No security issues detected
|
|
839
|
+
|
|
840
|
+
### Responding to Security Findings
|
|
841
|
+
|
|
842
|
+
When a security scan detects issues:
|
|
843
|
+
|
|
844
|
+
1. Review the created issue for summary of findings
|
|
845
|
+
2. Check workflow logs for detailed information
|
|
846
|
+
3. Download scan report artifacts for in-depth analysis
|
|
847
|
+
4. Address critical and high-severity issues immediately
|
|
848
|
+
5. Tag @copilot in the issue for assistance with remediation
|
|
849
|
+
|
|
850
|
+
### Manual Security Scan
|
|
851
|
+
|
|
852
|
+
You can manually trigger a security scan by running:
|
|
853
|
+
|
|
854
|
+
```bash
|
|
855
|
+
# Install security tools
|
|
856
|
+
pip install bandit safety pip-audit
|
|
857
|
+
|
|
858
|
+
# Run scans
|
|
859
|
+
pip-audit
|
|
860
|
+
bandit -r agentic_devtools
|
|
861
|
+
safety scan
|
|
862
|
+
```
|