ananke-plexus 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ananke_plexus-0.1.0/.ananke/apm.lock +22 -0
- ananke_plexus-0.1.0/.ananke/architecture/diagrams.md +14 -0
- ananke_plexus-0.1.0/.ananke/architecture/system.calm.json +8 -0
- ananke_plexus-0.1.0/.ananke/config.local.toml.example +10 -0
- ananke_plexus-0.1.0/.ananke/config.toml +19 -0
- ananke_plexus-0.1.0/.ananke/policy/default.toml +7 -0
- ananke_plexus-0.1.0/.ananke/skills/installed/code-graph-reviewer@0.1.0/README.md +1 -0
- ananke_plexus-0.1.0/.ananke/skills/installed/code-graph-reviewer@0.1.0/SKILL.md +3 -0
- ananke_plexus-0.1.0/.ananke/skills/installed/code-graph-reviewer@0.1.0/ananke-skill.toml +23 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-EPIC-SPECKIT-implement-spec-kit-end-to-end-lifecycle/bmad.yaml +13 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-EPIC-SPECKIT-implement-spec-kit-end-to-end-lifecycle/plan.md +7 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-EPIC-SPECKIT-implement-spec-kit-end-to-end-lifecycle/requirement.md +12 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-EPIC-SPECKIT-implement-spec-kit-end-to-end-lifecycle/spec.lock.json +11 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-EPIC-SPECKIT-implement-spec-kit-end-to-end-lifecycle/spec.md +9 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-EPIC-SPECKIT-implement-spec-kit-end-to-end-lifecycle/tasks.md +7 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-ROADMAP-ALL-implement-all-ideated-ananke-plexus-capabilities/bmad.yaml +17 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-ROADMAP-ALL-implement-all-ideated-ananke-plexus-capabilities/plan.md +7 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-ROADMAP-ALL-implement-all-ideated-ananke-plexus-capabilities/requirement.md +14 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-ROADMAP-ALL-implement-all-ideated-ananke-plexus-capabilities/spec.lock.json +11 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-ROADMAP-ALL-implement-all-ideated-ananke-plexus-capabilities/spec.md +11 -0
- ananke_plexus-0.1.0/.ananke/specs/ANANKE-ROADMAP-ALL-implement-all-ideated-ananke-plexus-capabilities/tasks.md +7 -0
- ananke_plexus-0.1.0/.env.example +42 -0
- ananke_plexus-0.1.0/.github/workflows/ci.yml +120 -0
- ananke_plexus-0.1.0/.github/workflows/codeql.yml +33 -0
- ananke_plexus-0.1.0/.github/workflows/dependency-review.yml +14 -0
- ananke_plexus-0.1.0/.github/workflows/docs.yml +29 -0
- ananke_plexus-0.1.0/.github/workflows/release-pypi.yml +142 -0
- ananke_plexus-0.1.0/.github/workflows/release-testpypi.yml +127 -0
- ananke_plexus-0.1.0/.github/workflows/scorecard.yml +37 -0
- ananke_plexus-0.1.0/.github/workflows/security.yml +108 -0
- ananke_plexus-0.1.0/.github/workflows/workflow-lint.yml +24 -0
- ananke_plexus-0.1.0/.gitignore +249 -0
- ananke_plexus-0.1.0/.pre-commit-config.yaml +13 -0
- ananke_plexus-0.1.0/.python-version +1 -0
- ananke_plexus-0.1.0/.trivyignore +12 -0
- ananke_plexus-0.1.0/ANANKE_PLEXUS_MASTER_SPEC.md +3859 -0
- ananke_plexus-0.1.0/CHANGELOG.md +114 -0
- ananke_plexus-0.1.0/LICENSE +201 -0
- ananke_plexus-0.1.0/Makefile +108 -0
- ananke_plexus-0.1.0/NOTICE +4 -0
- ananke_plexus-0.1.0/PKG-INFO +1083 -0
- ananke_plexus-0.1.0/README.md +1015 -0
- ananke_plexus-0.1.0/SECURITY.md +16 -0
- ananke_plexus-0.1.0/assets/ananke_plexus_architecture_overview.png +0 -0
- ananke_plexus-0.1.0/assets/ananke_plexus_governed_software_architecture.png +0 -0
- ananke_plexus-0.1.0/assets/code_graph_intelligence_infographic.png +0 -0
- ananke_plexus-0.1.0/assets/from_intent_to_implementation.png +0 -0
- ananke_plexus-0.1.0/assets/governed_agentic_execution_pipeline.png +0 -0
- ananke_plexus-0.1.0/assets/open_ecosystem_getting_started.png +0 -0
- ananke_plexus-0.1.0/assets/verifiable_pipeline_for_autonomous_engineering.png +0 -0
- ananke_plexus-0.1.0/assets/why_adlc_matters_governed_autonomous_development.png +0 -0
- ananke_plexus-0.1.0/docs/Ananke Plexus.md +3011 -0
- ananke_plexus-0.1.0/docs/concepts/architecture.md +161 -0
- ananke_plexus-0.1.0/docs/concepts/bmad.md +196 -0
- ananke_plexus-0.1.0/docs/concepts/graph.md +201 -0
- ananke_plexus-0.1.0/docs/concepts/mcp-apm.md +216 -0
- ananke_plexus-0.1.0/docs/concepts/policy-security.md +220 -0
- ananke_plexus-0.1.0/docs/concepts/why-ananke.md +144 -0
- ananke_plexus-0.1.0/docs/guides/getting-started.md +276 -0
- ananke_plexus-0.1.0/docs/guides/implementation-log.md +136 -0
- ananke_plexus-0.1.0/docs/guides/release.md +154 -0
- ananke_plexus-0.1.0/docs/guides/setup-and-capabilities.md +257 -0
- ananke_plexus-0.1.0/docs/index.md +111 -0
- ananke_plexus-0.1.0/docs/reference/commands.md +84 -0
- ananke_plexus-0.1.0/docs/reference/configuration.md +115 -0
- ananke_plexus-0.1.0/docs/reference/policy.md +137 -0
- ananke_plexus-0.1.0/mkdocs.yml +83 -0
- ananke_plexus-0.1.0/pyproject.toml +164 -0
- ananke_plexus-0.1.0/scripts/publish_local_pypi.sh +31 -0
- ananke_plexus-0.1.0/scripts/publish_local_testpypi.sh +25 -0
- ananke_plexus-0.1.0/src/ananke/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/__init__.py +6 -0
- ananke_plexus-0.1.0/src/ananke/plexus/api.py +893 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/audit.py +24 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/bundle.py +87 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/cli.py +177 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/importers/copilot.py +65 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/installer.py +67 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/lockfile.py +24 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/manifest.py +48 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/provenance.py +12 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/registry.py +44 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/resolver.py +25 -0
- ananke_plexus-0.1.0/src/ananke/plexus/apm/sandbox.py +120 -0
- ananke_plexus-0.1.0/src/ananke/plexus/architecture/calm.py +238 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/adapters/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/adapters/amazon_q.py +69 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/adapters/copilot.py +81 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/adapters/fake.py +97 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/adapters/generic_cli.py +90 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/adapters/hermes.py +77 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/adapters/kiro.py +69 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/base.py +66 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/capabilities.py +21 -0
- ananke_plexus-0.1.0/src/ananke/plexus/backends/registry.py +94 -0
- ananke_plexus-0.1.0/src/ananke/plexus/cli/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/cli/app.py +1166 -0
- ananke_plexus-0.1.0/src/ananke/plexus/cli/rendering.py +18 -0
- ananke_plexus-0.1.0/src/ananke/plexus/config/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/config/credentials.py +341 -0
- ananke_plexus-0.1.0/src/ananke/plexus/config/loader.py +117 -0
- ananke_plexus-0.1.0/src/ananke/plexus/config/migration.py +136 -0
- ananke_plexus-0.1.0/src/ananke/plexus/config/models.py +36 -0
- ananke_plexus-0.1.0/src/ananke/plexus/config/secrets.py +121 -0
- ananke_plexus-0.1.0/src/ananke/plexus/contracts/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/contracts/architecture.py +41 -0
- ananke_plexus-0.1.0/src/ananke/plexus/contracts/behavior.py +76 -0
- ananke_plexus-0.1.0/src/ananke/plexus/contracts/bmad.py +60 -0
- ananke_plexus-0.1.0/src/ananke/plexus/contracts/model.py +56 -0
- ananke_plexus-0.1.0/src/ananke/plexus/core/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/core/ids.py +35 -0
- ananke_plexus-0.1.0/src/ananke/plexus/core/paths.py +31 -0
- ananke_plexus-0.1.0/src/ananke/plexus/core/result.py +54 -0
- ananke_plexus-0.1.0/src/ananke/plexus/core/workflow_audit.py +47 -0
- ananke_plexus-0.1.0/src/ananke/plexus/events/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/events/bus.py +80 -0
- ananke_plexus-0.1.0/src/ananke/plexus/events/models.py +46 -0
- ananke_plexus-0.1.0/src/ananke/plexus/events/subscribers.py +16 -0
- ananke_plexus-0.1.0/src/ananke/plexus/evidence/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/evidence/bundle.py +80 -0
- ananke_plexus-0.1.0/src/ananke/plexus/evidence/hash.py +12 -0
- ananke_plexus-0.1.0/src/ananke/plexus/evidence/retention.py +97 -0
- ananke_plexus-0.1.0/src/ananke/plexus/evidence/sarif.py +110 -0
- ananke_plexus-0.1.0/src/ananke/plexus/execution/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/execution/approvals.py +137 -0
- ananke_plexus-0.1.0/src/ananke/plexus/execution/checkpoint.py +69 -0
- ananke_plexus-0.1.0/src/ananke/plexus/execution/compensation.py +58 -0
- ananke_plexus-0.1.0/src/ananke/plexus/execution/plan.py +126 -0
- ananke_plexus-0.1.0/src/ananke/plexus/execution/scheduler.py +118 -0
- ananke_plexus-0.1.0/src/ananke/plexus/execution/state.py +78 -0
- ananke_plexus-0.1.0/src/ananke/plexus/gates/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/gates/runner.py +97 -0
- ananke_plexus-0.1.0/src/ananke/plexus/graph/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/graph/models.py +109 -0
- ananke_plexus-0.1.0/src/ananke/plexus/graph/providers/__init__.py +5 -0
- ananke_plexus-0.1.0/src/ananke/plexus/graph/providers/base.py +14 -0
- ananke_plexus-0.1.0/src/ananke/plexus/graph/providers/code_review_graph.py +100 -0
- ananke_plexus-0.1.0/src/ananke/plexus/graph/providers/graphifyy.py +104 -0
- ananke_plexus-0.1.0/src/ananke/plexus/graph/providers/native.py +18 -0
- ananke_plexus-0.1.0/src/ananke/plexus/graph/providers/registry.py +38 -0
- ananke_plexus-0.1.0/src/ananke/plexus/graph/service.py +151 -0
- ananke_plexus-0.1.0/src/ananke/plexus/hooks/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/hooks/manager.py +238 -0
- ananke_plexus-0.1.0/src/ananke/plexus/hooks/models.py +34 -0
- ananke_plexus-0.1.0/src/ananke/plexus/hooks/runner.py +25 -0
- ananke_plexus-0.1.0/src/ananke/plexus/hooks/stages.py +94 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/adapters.py +318 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/compensation.py +134 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/confluence.py +266 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/evidence.py +277 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/git.py +108 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/http_client.py +78 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/issues.py +53 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/pr_evidence.py +186 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/scm.py +54 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/store.py +29 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/telemetry.py +120 -0
- ananke_plexus-0.1.0/src/ananke/plexus/lifecycle/worktree.py +97 -0
- ananke_plexus-0.1.0/src/ananke/plexus/mcp/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/mcp/auth.py +52 -0
- ananke_plexus-0.1.0/src/ananke/plexus/mcp/http.py +79 -0
- ananke_plexus-0.1.0/src/ananke/plexus/mcp/prompts.py +20 -0
- ananke_plexus-0.1.0/src/ananke/plexus/mcp/resources.py +116 -0
- ananke_plexus-0.1.0/src/ananke/plexus/mcp/server.py +90 -0
- ananke_plexus-0.1.0/src/ananke/plexus/mcp/tools.py +161 -0
- ananke_plexus-0.1.0/src/ananke/plexus/plugins/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/plugins/discovery.py +57 -0
- ananke_plexus-0.1.0/src/ananke/plexus/plugins/metadata.py +16 -0
- ananke_plexus-0.1.0/src/ananke/plexus/policy/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/policy/engine.py +198 -0
- ananke_plexus-0.1.0/src/ananke/plexus/policy/packs.py +237 -0
- ananke_plexus-0.1.0/src/ananke/plexus/specs/__init__.py +1 -0
- ananke_plexus-0.1.0/src/ananke/plexus/specs/lock.py +76 -0
- ananke_plexus-0.1.0/src/ananke/plexus/specs/models.py +19 -0
- ananke_plexus-0.1.0/src/ananke/plexus/specs/pipeline.py +31 -0
- ananke_plexus-0.1.0/src/ananke/plexus/specs/providers/__init__.py +5 -0
- ananke_plexus-0.1.0/src/ananke/plexus/specs/providers/base.py +20 -0
- ananke_plexus-0.1.0/src/ananke/plexus/specs/providers/native.py +100 -0
- ananke_plexus-0.1.0/src/ananke/plexus/specs/providers/registry.py +12 -0
- ananke_plexus-0.1.0/src/ananke/plexus/specs/providers/speckit.py +93 -0
- ananke_plexus-0.1.0/src/ananke/plexus/specs/service.py +82 -0
- ananke_plexus-0.1.0/src/ananke/plexus/version.py +3 -0
- ananke_plexus-0.1.0/tests/fixtures/copilot-skills/sample/SKILL.md +3 -0
- ananke_plexus-0.1.0/tests/fixtures/sample-skill/SKILL.md +3 -0
- ananke_plexus-0.1.0/tests/fixtures/sample-skill/ananke-skill.toml +23 -0
- ananke_plexus-0.1.0/tests/unit/test_admin_cli.py +48 -0
- ananke_plexus-0.1.0/tests/unit/test_apm_audit_sandbox.py +24 -0
- ananke_plexus-0.1.0/tests/unit/test_apm_bundle.py +44 -0
- ananke_plexus-0.1.0/tests/unit/test_apm_cli.py +61 -0
- ananke_plexus-0.1.0/tests/unit/test_apm_import_copilot.py +14 -0
- ananke_plexus-0.1.0/tests/unit/test_apm_registry_audit.py +51 -0
- ananke_plexus-0.1.0/tests/unit/test_apm_resolver.py +25 -0
- ananke_plexus-0.1.0/tests/unit/test_apm_sandbox_full.py +160 -0
- ananke_plexus-0.1.0/tests/unit/test_architecture.py +53 -0
- ananke_plexus-0.1.0/tests/unit/test_auth_configure.py +116 -0
- ananke_plexus-0.1.0/tests/unit/test_backends.py +117 -0
- ananke_plexus-0.1.0/tests/unit/test_bmad_contracts.py +91 -0
- ananke_plexus-0.1.0/tests/unit/test_cli_spec_superpowers.py +33 -0
- ananke_plexus-0.1.0/tests/unit/test_cli_version.py +10 -0
- ananke_plexus-0.1.0/tests/unit/test_config_migrate.py +46 -0
- ananke_plexus-0.1.0/tests/unit/test_config_precedence.py +39 -0
- ananke_plexus-0.1.0/tests/unit/test_core_result.py +42 -0
- ananke_plexus-0.1.0/tests/unit/test_events.py +79 -0
- ananke_plexus-0.1.0/tests/unit/test_evidence_bundle_sarif.py +53 -0
- ananke_plexus-0.1.0/tests/unit/test_evidence_prune.py +39 -0
- ananke_plexus-0.1.0/tests/unit/test_evidence_sarif.py +78 -0
- ananke_plexus-0.1.0/tests/unit/test_execution_compensation.py +65 -0
- ananke_plexus-0.1.0/tests/unit/test_execution_engine.py +156 -0
- ananke_plexus-0.1.0/tests/unit/test_gate_runner.py +16 -0
- ananke_plexus-0.1.0/tests/unit/test_graph_and_run.py +48 -0
- ananke_plexus-0.1.0/tests/unit/test_graph_export.py +21 -0
- ananke_plexus-0.1.0/tests/unit/test_graph_models.py +57 -0
- ananke_plexus-0.1.0/tests/unit/test_graph_providers.py +59 -0
- ananke_plexus-0.1.0/tests/unit/test_graph_service_full.py +67 -0
- ananke_plexus-0.1.0/tests/unit/test_hooks.py +107 -0
- ananke_plexus-0.1.0/tests/unit/test_init_and_verify.py +31 -0
- ananke_plexus-0.1.0/tests/unit/test_lifecycle_adapters.py +179 -0
- ananke_plexus-0.1.0/tests/unit/test_lifecycle_baseline.py +247 -0
- ananke_plexus-0.1.0/tests/unit/test_lifecycle_cli.py +78 -0
- ananke_plexus-0.1.0/tests/unit/test_lifecycle_confluence.py +75 -0
- ananke_plexus-0.1.0/tests/unit/test_lifecycle_git_service.py +60 -0
- ananke_plexus-0.1.0/tests/unit/test_lifecycle_http_and_compensation.py +47 -0
- ananke_plexus-0.1.0/tests/unit/test_lifecycle_new.py +122 -0
- ananke_plexus-0.1.0/tests/unit/test_lifecycle_worktrees.py +15 -0
- ananke_plexus-0.1.0/tests/unit/test_mcp_http.py +36 -0
- ananke_plexus-0.1.0/tests/unit/test_mcp_resources_full.py +80 -0
- ananke_plexus-0.1.0/tests/unit/test_mcp_server.py +32 -0
- ananke_plexus-0.1.0/tests/unit/test_mcp_tools_full.py +134 -0
- ananke_plexus-0.1.0/tests/unit/test_mcp_tools_resources.py +105 -0
- ananke_plexus-0.1.0/tests/unit/test_misc_coverage.py +80 -0
- ananke_plexus-0.1.0/tests/unit/test_new_cli_commands.py +217 -0
- ananke_plexus-0.1.0/tests/unit/test_plugin_discovery.py +12 -0
- ananke_plexus-0.1.0/tests/unit/test_plugins_full.py +43 -0
- ananke_plexus-0.1.0/tests/unit/test_policy_engine.py +63 -0
- ananke_plexus-0.1.0/tests/unit/test_policy_packs.py +76 -0
- ananke_plexus-0.1.0/tests/unit/test_secrets_and_ids.py +110 -0
- ananke_plexus-0.1.0/tests/unit/test_spec_pipeline.py +48 -0
- ananke_plexus-0.1.0/tests/unit/test_specs_lock_and_service.py +78 -0
- ananke_plexus-0.1.0/tests/unit/test_specs_service_full.py +39 -0
- ananke_plexus-0.1.0/tests/unit/test_workflow_audit.py +56 -0
- ananke_plexus-0.1.0/uv.lock +2557 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"packages": [
|
|
3
|
+
{
|
|
4
|
+
"name": "code-graph-reviewer",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"source": "/Users/abhikanap/Documents/Repositories/Ananke-Plexus/.ananke/tmp/import-code-graph-reviewer",
|
|
7
|
+
"digest": "63efd3b0ed2fcfeca0536c4c28e6559adc6e534e8c863dc2da780ed7b999aa98",
|
|
8
|
+
"installed_at": "2026-09-16T03:49:14.866819+00:00",
|
|
9
|
+
"permissions": {
|
|
10
|
+
"filesystem_read": [
|
|
11
|
+
"src/**",
|
|
12
|
+
".ananke/**"
|
|
13
|
+
],
|
|
14
|
+
"filesystem_write": [
|
|
15
|
+
".ananke/evidence/**"
|
|
16
|
+
],
|
|
17
|
+
"network": [],
|
|
18
|
+
"shell": []
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Local-only overrides. Copy to config.local.toml (ignored by git).
|
|
2
|
+
[jira]
|
|
3
|
+
base_url = "https://example.atlassian.net"
|
|
4
|
+
email = ""
|
|
5
|
+
token = { env = "ANANKE_JIRA_TOKEN" }
|
|
6
|
+
|
|
7
|
+
[bitbucket]
|
|
8
|
+
base_url = "https://api.bitbucket.org"
|
|
9
|
+
username = ""
|
|
10
|
+
app_password = { env = "ANANKE_BITBUCKET_APP_PASSWORD" }
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "ananke-project"
|
|
3
|
+
default_branch = "main"
|
|
4
|
+
|
|
5
|
+
[ananke]
|
|
6
|
+
mode = "developer"
|
|
7
|
+
fail_closed = true
|
|
8
|
+
offline = false
|
|
9
|
+
|
|
10
|
+
[spec]
|
|
11
|
+
provider = "speckit"
|
|
12
|
+
contract_mode = "ananke-bmad"
|
|
13
|
+
|
|
14
|
+
[security]
|
|
15
|
+
allow_network = false
|
|
16
|
+
secret_scan = true
|
|
17
|
+
sast = true
|
|
18
|
+
sca = true
|
|
19
|
+
license_scan = true
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Imported from Copilot skill format.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
[skill]
|
|
2
|
+
name = "code-graph-reviewer"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Imported Copilot skill"
|
|
5
|
+
license = "UNKNOWN"
|
|
6
|
+
|
|
7
|
+
[compatibility]
|
|
8
|
+
ananke = ">=0.1,<1"
|
|
9
|
+
skill_api = "1"
|
|
10
|
+
|
|
11
|
+
[permissions]
|
|
12
|
+
filesystem_read = ["src/**", ".ananke/**"]
|
|
13
|
+
filesystem_write = [".ananke/evidence/**"]
|
|
14
|
+
network = []
|
|
15
|
+
shell = []
|
|
16
|
+
|
|
17
|
+
[entrypoints]
|
|
18
|
+
instructions = "SKILL.md"
|
|
19
|
+
|
|
20
|
+
[provenance]
|
|
21
|
+
source = "copilot"
|
|
22
|
+
repository = "tests/fixtures/copilot-skills"
|
|
23
|
+
revision = "local"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
behavior:
|
|
2
|
+
scenarios:
|
|
3
|
+
- id: AC-1
|
|
4
|
+
description: "Spec Kit provider adapter exists"
|
|
5
|
+
- id: AC-2
|
|
6
|
+
description: "converge generates requirement spec plan tasks bmad lock"
|
|
7
|
+
- id: AC-3
|
|
8
|
+
description: "validate passes and drift shows none"
|
|
9
|
+
model:
|
|
10
|
+
schemas:
|
|
11
|
+
- requirement_boundary_v1
|
|
12
|
+
architecture:
|
|
13
|
+
calm_ref: .ananke/architecture/system.calm.json
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Requirement ANANKE-EPIC-SPECKIT
|
|
2
|
+
|
|
3
|
+
## Title
|
|
4
|
+
Implement Spec Kit end-to-end lifecycle
|
|
5
|
+
|
|
6
|
+
## Body
|
|
7
|
+
Implement provider-based Spec Kit integration, spec lifecycle commands, lock/drift checks, and superpowers converge flow.
|
|
8
|
+
|
|
9
|
+
## Acceptance Criteria
|
|
10
|
+
- Spec Kit provider adapter exists
|
|
11
|
+
- converge generates requirement spec plan tasks bmad lock
|
|
12
|
+
- validate passes and drift shows none
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"feature_dir": "ANANKE-EPIC-SPECKIT-implement-spec-kit-end-to-end-lifecycle",
|
|
3
|
+
"content_hash": "bc173e712d806c10082c53bc7963a4bb63d34ca61d95bc95877b47b0172402de",
|
|
4
|
+
"files": {
|
|
5
|
+
"requirement.md": "ce32cc5c6cd4c7a0aed157228aa4856208156de0d764cd5292383ce43987de9c",
|
|
6
|
+
"spec.md": "2c7823715654015e9a11480cddb978b00db2f5b0a8ed62ab97548729cda0c274",
|
|
7
|
+
"plan.md": "2a7d1538ba7854451dc133bd43725e8745aa85837a855aa5587859d7f74a0e6b",
|
|
8
|
+
"tasks.md": "76728d2bea9bc0ec7461b9bd88bb695885af6efa4be0942064106104f99dd481",
|
|
9
|
+
"bmad.yaml": "d740341397c4e4445e3e7afd69f9e5249f71e7070546a5bd19addab31a42bc78"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Spec for ANANKE-EPIC-SPECKIT
|
|
2
|
+
|
|
3
|
+
## Scope
|
|
4
|
+
Implement the requirement with explicit, testable behavior.
|
|
5
|
+
|
|
6
|
+
## Behavioral Contract
|
|
7
|
+
- AC: Spec Kit provider adapter exists
|
|
8
|
+
- AC: converge generates requirement spec plan tasks bmad lock
|
|
9
|
+
- AC: validate passes and drift shows none
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
behavior:
|
|
2
|
+
scenarios:
|
|
3
|
+
- id: AC-1
|
|
4
|
+
description: "All epics A-M have tracked implementation tasks"
|
|
5
|
+
- id: AC-2
|
|
6
|
+
description: "Spec pipeline maintains lock and drift checks"
|
|
7
|
+
- id: AC-3
|
|
8
|
+
description: "Each roadmap phase is represented by executable milestones"
|
|
9
|
+
- id: AC-4
|
|
10
|
+
description: "Security and provenance controls are part of release criteria"
|
|
11
|
+
- id: AC-5
|
|
12
|
+
description: "MCP APM lifecycle and graph integrations are delivered incrementally"
|
|
13
|
+
model:
|
|
14
|
+
schemas:
|
|
15
|
+
- requirement_boundary_v1
|
|
16
|
+
architecture:
|
|
17
|
+
calm_ref: .ananke/architecture/system.calm.json
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Requirement ANANKE-ROADMAP-ALL
|
|
2
|
+
|
|
3
|
+
## Title
|
|
4
|
+
Implement all ideated Ananke Plexus capabilities
|
|
5
|
+
|
|
6
|
+
## Body
|
|
7
|
+
Drive implementation across all roadmap phases including core, specs, architecture, graph, policy, MCP, APM, lifecycle, run engine, and release hardening.
|
|
8
|
+
|
|
9
|
+
## Acceptance Criteria
|
|
10
|
+
- All epics A-M have tracked implementation tasks
|
|
11
|
+
- Spec pipeline maintains lock and drift checks
|
|
12
|
+
- Each roadmap phase is represented by executable milestones
|
|
13
|
+
- Security and provenance controls are part of release criteria
|
|
14
|
+
- MCP APM lifecycle and graph integrations are delivered incrementally
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"feature_dir": "ANANKE-ROADMAP-ALL-implement-all-ideated-ananke-plexus-capabilities",
|
|
3
|
+
"content_hash": "613971010993379c67dcf1058c23d1bdfa4895035a37386d6ebf8d0f2f82652f",
|
|
4
|
+
"files": {
|
|
5
|
+
"requirement.md": "37b7485df865b25961f0e8c1f5760feb68e0b123238f6c7eee4d760ad255a82f",
|
|
6
|
+
"spec.md": "ededc5025f08bf9d349b09283356742e297de58dbc1d2e7d36124eda0555a1d1",
|
|
7
|
+
"plan.md": "2a7d1538ba7854451dc133bd43725e8745aa85837a855aa5587859d7f74a0e6b",
|
|
8
|
+
"tasks.md": "76728d2bea9bc0ec7461b9bd88bb695885af6efa4be0942064106104f99dd481",
|
|
9
|
+
"bmad.yaml": "a39768c96bc137b39746add3401d418dbdc35168181844afd18bd7b2ad994c2e"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Spec for ANANKE-ROADMAP-ALL
|
|
2
|
+
|
|
3
|
+
## Scope
|
|
4
|
+
Implement the requirement with explicit, testable behavior.
|
|
5
|
+
|
|
6
|
+
## Behavioral Contract
|
|
7
|
+
- AC: All epics A-M have tracked implementation tasks
|
|
8
|
+
- AC: Spec pipeline maintains lock and drift checks
|
|
9
|
+
- AC: Each roadmap phase is represented by executable milestones
|
|
10
|
+
- AC: Security and provenance controls are part of release criteria
|
|
11
|
+
- AC: MCP APM lifecycle and graph integrations are delivered incrementally
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# ── Ananke Plexus local environment template ─────────────────────────────────
|
|
2
|
+
# Copy to .env and fill in values you actually need.
|
|
3
|
+
# Never commit .env to git.
|
|
4
|
+
# Secrets are referenced by name in config (not stored inline).
|
|
5
|
+
|
|
6
|
+
# ── Publishing via uv ─────────────────────────────────────────────────────────
|
|
7
|
+
# Used by: make publish-pypi / make publish-testpypi
|
|
8
|
+
# In CI, OIDC Trusted Publishing is used instead — no token needed.
|
|
9
|
+
UV_PUBLISH_TOKEN=pypi-xxxx_replace_me
|
|
10
|
+
UV_PUBLISH_TOKEN_TESTPYPI=pypi-xxxx_replace_me
|
|
11
|
+
|
|
12
|
+
# ── Security scanning ─────────────────────────────────────────────────────────
|
|
13
|
+
# TRIVY_TOKEN is only needed if scanning private registries
|
|
14
|
+
# TRIVY_TOKEN=
|
|
15
|
+
|
|
16
|
+
# Gitleaks licence key (optional — community edition works without it)
|
|
17
|
+
# GITLEAKS_LICENSE=
|
|
18
|
+
|
|
19
|
+
# ── Jira integration ─────────────────────────────────────────────────────────
|
|
20
|
+
ANANKE_JIRA_BASE_URL=https://your-domain.atlassian.net
|
|
21
|
+
ANANKE_JIRA_EMAIL=you@example.com
|
|
22
|
+
ANANKE_JIRA_TOKEN=
|
|
23
|
+
# Or use a command reference in config.toml: token = { env = "ANANKE_JIRA_TOKEN" }
|
|
24
|
+
|
|
25
|
+
# ── Confluence integration ────────────────────────────────────────────────────
|
|
26
|
+
ANANKE_CONFLUENCE_BASE_URL=https://your-domain.atlassian.net
|
|
27
|
+
ANANKE_CONFLUENCE_EMAIL=you@example.com
|
|
28
|
+
ANANKE_CONFLUENCE_TOKEN=
|
|
29
|
+
|
|
30
|
+
# ── Bitbucket integration ─────────────────────────────────────────────────────
|
|
31
|
+
ANANKE_BITBUCKET_BASE_URL=https://api.bitbucket.org
|
|
32
|
+
ANANKE_BITBUCKET_WORKSPACE=your-workspace
|
|
33
|
+
ANANKE_BITBUCKET_REPO_SLUG=your-repo
|
|
34
|
+
ANANKE_BITBUCKET_USERNAME=
|
|
35
|
+
ANANKE_BITBUCKET_APP_PASSWORD=
|
|
36
|
+
|
|
37
|
+
# ── MCP HTTP bearer token (for ananke serve-mcp --transport http) ─────────────
|
|
38
|
+
ANANKE_MCP_HTTP_TOKEN=
|
|
39
|
+
|
|
40
|
+
# ── Runtime behaviour ─────────────────────────────────────────────────────────
|
|
41
|
+
ANANKE_OFFLINE=false
|
|
42
|
+
ANANKE_FAIL_CLOSED=true
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main"]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
quality:
|
|
13
|
+
name: quality (${{ matrix.python-version }})
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
strategy:
|
|
16
|
+
fail-fast: false
|
|
17
|
+
matrix:
|
|
18
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout
|
|
21
|
+
uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- name: Install uv
|
|
24
|
+
uses: astral-sh/setup-uv@v5
|
|
25
|
+
with:
|
|
26
|
+
version: "latest"
|
|
27
|
+
enable-cache: true
|
|
28
|
+
|
|
29
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
30
|
+
run: uv python install ${{ matrix.python-version }}
|
|
31
|
+
|
|
32
|
+
- name: Install dependencies
|
|
33
|
+
run: uv sync --all-extras --python ${{ matrix.python-version }}
|
|
34
|
+
|
|
35
|
+
- name: Lint (ruff check)
|
|
36
|
+
run: uv run ruff check src tests
|
|
37
|
+
|
|
38
|
+
- name: Format check (ruff format)
|
|
39
|
+
run: uv run ruff format --check src tests
|
|
40
|
+
|
|
41
|
+
- name: Type check (mypy)
|
|
42
|
+
run: uv run mypy src
|
|
43
|
+
|
|
44
|
+
- name: Tests with coverage
|
|
45
|
+
run: uv run pytest --cov=src/ananke --cov-report=xml --cov-report=term
|
|
46
|
+
|
|
47
|
+
- name: Upload coverage report
|
|
48
|
+
if: matrix.python-version == '3.11'
|
|
49
|
+
uses: actions/upload-artifact@v4
|
|
50
|
+
with:
|
|
51
|
+
name: coverage-report
|
|
52
|
+
path: coverage.xml
|
|
53
|
+
|
|
54
|
+
build:
|
|
55
|
+
name: build & validate
|
|
56
|
+
runs-on: ubuntu-latest
|
|
57
|
+
needs: quality
|
|
58
|
+
steps:
|
|
59
|
+
- name: Checkout
|
|
60
|
+
uses: actions/checkout@v4
|
|
61
|
+
|
|
62
|
+
- name: Install uv
|
|
63
|
+
uses: astral-sh/setup-uv@v5
|
|
64
|
+
with:
|
|
65
|
+
version: "latest"
|
|
66
|
+
|
|
67
|
+
- name: Build wheel and sdist
|
|
68
|
+
run: uv build
|
|
69
|
+
|
|
70
|
+
- name: Validate package metadata (twine check)
|
|
71
|
+
run: uv run --with twine twine check dist/*
|
|
72
|
+
|
|
73
|
+
- name: Smoke-test wheel install
|
|
74
|
+
run: |
|
|
75
|
+
uv run --with dist/*.whl --no-project -- ananke version
|
|
76
|
+
|
|
77
|
+
- name: Upload dist artifacts
|
|
78
|
+
uses: actions/upload-artifact@v4
|
|
79
|
+
with:
|
|
80
|
+
name: dist-${{ github.sha }}
|
|
81
|
+
path: dist/
|
|
82
|
+
|
|
83
|
+
trivy:
|
|
84
|
+
name: trivy filesystem scan
|
|
85
|
+
runs-on: ubuntu-latest
|
|
86
|
+
needs: quality
|
|
87
|
+
permissions:
|
|
88
|
+
contents: read
|
|
89
|
+
security-events: write
|
|
90
|
+
steps:
|
|
91
|
+
- name: Checkout
|
|
92
|
+
uses: actions/checkout@v4
|
|
93
|
+
|
|
94
|
+
- name: Trivy — SARIF report (upload to Security tab)
|
|
95
|
+
uses: aquasecurity/trivy-action@v0.28.0
|
|
96
|
+
with:
|
|
97
|
+
scan-type: fs
|
|
98
|
+
scan-ref: .
|
|
99
|
+
format: sarif
|
|
100
|
+
output: trivy-results.sarif
|
|
101
|
+
severity: CRITICAL,HIGH
|
|
102
|
+
ignore-unfixed: true
|
|
103
|
+
trivyignores: .trivyignore
|
|
104
|
+
|
|
105
|
+
- name: Upload Trivy SARIF
|
|
106
|
+
uses: github/codeql-action/upload-sarif@v3
|
|
107
|
+
if: always()
|
|
108
|
+
with:
|
|
109
|
+
sarif_file: trivy-results.sarif
|
|
110
|
+
|
|
111
|
+
- name: Trivy — blocking table scan (CRITICAL only)
|
|
112
|
+
uses: aquasecurity/trivy-action@v0.28.0
|
|
113
|
+
with:
|
|
114
|
+
scan-type: fs
|
|
115
|
+
scan-ref: .
|
|
116
|
+
format: table
|
|
117
|
+
severity: CRITICAL
|
|
118
|
+
ignore-unfixed: true
|
|
119
|
+
trivyignores: .trivyignore
|
|
120
|
+
exit-code: "1"
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: codeql
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main"]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
actions: read
|
|
10
|
+
contents: read
|
|
11
|
+
security-events: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
analyze:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
strategy:
|
|
17
|
+
fail-fast: false
|
|
18
|
+
matrix:
|
|
19
|
+
language: ["python"]
|
|
20
|
+
steps:
|
|
21
|
+
- name: Checkout
|
|
22
|
+
uses: actions/checkout@v4
|
|
23
|
+
|
|
24
|
+
- name: Initialize CodeQL
|
|
25
|
+
uses: github/codeql-action/init@v3
|
|
26
|
+
with:
|
|
27
|
+
languages: ${{ matrix.language }}
|
|
28
|
+
|
|
29
|
+
- name: Autobuild
|
|
30
|
+
uses: github/codeql-action/autobuild@v3
|
|
31
|
+
|
|
32
|
+
- name: Perform CodeQL Analysis
|
|
33
|
+
uses: github/codeql-action/analyze@v3
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main"]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
deploy:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- name: Checkout
|
|
16
|
+
uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- name: Setup Python
|
|
19
|
+
uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.11"
|
|
22
|
+
|
|
23
|
+
- name: Install docs dependencies
|
|
24
|
+
run: |
|
|
25
|
+
python -m pip install --upgrade pip
|
|
26
|
+
pip install .[docs]
|
|
27
|
+
|
|
28
|
+
- name: Build and deploy docs
|
|
29
|
+
run: mkdocs gh-deploy --force
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
name: release-pypi
|
|
2
|
+
|
|
3
|
+
# Triggered by a vX.Y.Z tag push.
|
|
4
|
+
# Build-once, attest, scan with Trivy, then publish via uv + OIDC Trusted Publishing.
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
tags:
|
|
9
|
+
- "v*"
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
# ── 1. Build ───────────────────────────────────────────────────────────────
|
|
16
|
+
build:
|
|
17
|
+
name: build artifacts
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout
|
|
21
|
+
uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- name: Install uv
|
|
24
|
+
uses: astral-sh/setup-uv@v5
|
|
25
|
+
with:
|
|
26
|
+
version: "latest"
|
|
27
|
+
|
|
28
|
+
- name: Build wheel and sdist
|
|
29
|
+
run: uv build
|
|
30
|
+
|
|
31
|
+
- name: Validate package metadata
|
|
32
|
+
run: uv run --with twine twine check dist/*
|
|
33
|
+
|
|
34
|
+
- name: Generate SBOM (CycloneDX)
|
|
35
|
+
run: |
|
|
36
|
+
uv run --with cyclonedx-bom cyclonedx-py environment \
|
|
37
|
+
--output-format json \
|
|
38
|
+
--output-file dist/sbom.cdx.json
|
|
39
|
+
continue-on-error: true
|
|
40
|
+
|
|
41
|
+
- name: Upload dist artifacts
|
|
42
|
+
uses: actions/upload-artifact@v4
|
|
43
|
+
with:
|
|
44
|
+
name: pypi-dist-${{ github.ref_name }}
|
|
45
|
+
path: dist/
|
|
46
|
+
if-no-files-found: error
|
|
47
|
+
|
|
48
|
+
# ── 2. Trivy security gate ─────────────────────────────────────────────────
|
|
49
|
+
trivy:
|
|
50
|
+
name: trivy security gate
|
|
51
|
+
runs-on: ubuntu-latest
|
|
52
|
+
needs: build
|
|
53
|
+
permissions:
|
|
54
|
+
contents: read
|
|
55
|
+
security-events: write
|
|
56
|
+
steps:
|
|
57
|
+
- name: Checkout
|
|
58
|
+
uses: actions/checkout@v4
|
|
59
|
+
|
|
60
|
+
- name: Trivy SARIF scan (all severities)
|
|
61
|
+
uses: aquasecurity/trivy-action@v0.28.0
|
|
62
|
+
with:
|
|
63
|
+
scan-type: fs
|
|
64
|
+
scan-ref: .
|
|
65
|
+
format: sarif
|
|
66
|
+
output: trivy-results.sarif
|
|
67
|
+
severity: CRITICAL,HIGH,MEDIUM
|
|
68
|
+
ignore-unfixed: true
|
|
69
|
+
trivyignores: .trivyignore
|
|
70
|
+
|
|
71
|
+
- name: Upload SARIF to GitHub Security
|
|
72
|
+
uses: github/codeql-action/upload-sarif@v3
|
|
73
|
+
if: always()
|
|
74
|
+
with:
|
|
75
|
+
sarif_file: trivy-results.sarif
|
|
76
|
+
|
|
77
|
+
- name: Trivy blocking gate (CRITICAL + HIGH, unfixed)
|
|
78
|
+
uses: aquasecurity/trivy-action@v0.28.0
|
|
79
|
+
with:
|
|
80
|
+
scan-type: fs
|
|
81
|
+
scan-ref: .
|
|
82
|
+
format: table
|
|
83
|
+
severity: CRITICAL,HIGH
|
|
84
|
+
ignore-unfixed: true
|
|
85
|
+
trivyignores: .trivyignore
|
|
86
|
+
exit-code: "1"
|
|
87
|
+
|
|
88
|
+
# ── 3. Build provenance attestation ───────────────────────────────────────
|
|
89
|
+
provenance:
|
|
90
|
+
name: attest provenance
|
|
91
|
+
runs-on: ubuntu-latest
|
|
92
|
+
needs: [build, trivy]
|
|
93
|
+
permissions:
|
|
94
|
+
id-token: write
|
|
95
|
+
contents: read
|
|
96
|
+
attestations: write
|
|
97
|
+
steps:
|
|
98
|
+
- name: Download dist
|
|
99
|
+
uses: actions/download-artifact@v4
|
|
100
|
+
with:
|
|
101
|
+
name: pypi-dist-${{ github.ref_name }}
|
|
102
|
+
path: dist/
|
|
103
|
+
|
|
104
|
+
- name: Attest build provenance
|
|
105
|
+
uses: actions/attest-build-provenance@v2
|
|
106
|
+
with:
|
|
107
|
+
subject-path: "dist/*"
|
|
108
|
+
|
|
109
|
+
# ── 4. Publish to PyPI ─────────────────────────────────────────────────────
|
|
110
|
+
publish:
|
|
111
|
+
name: publish to PyPI
|
|
112
|
+
runs-on: ubuntu-latest
|
|
113
|
+
needs: [build, trivy, provenance]
|
|
114
|
+
environment: pypi
|
|
115
|
+
permissions:
|
|
116
|
+
id-token: write
|
|
117
|
+
contents: write
|
|
118
|
+
steps:
|
|
119
|
+
- name: Download exact dist artifacts from build step
|
|
120
|
+
uses: actions/download-artifact@v4
|
|
121
|
+
with:
|
|
122
|
+
name: pypi-dist-${{ github.ref_name }}
|
|
123
|
+
path: dist/
|
|
124
|
+
|
|
125
|
+
- name: Install uv
|
|
126
|
+
uses: astral-sh/setup-uv@v5
|
|
127
|
+
with:
|
|
128
|
+
version: "latest"
|
|
129
|
+
|
|
130
|
+
- name: Publish to PyPI (OIDC Trusted Publishing)
|
|
131
|
+
run: uv publish --trusted-publishing always
|
|
132
|
+
|
|
133
|
+
- name: Create GitHub Release
|
|
134
|
+
uses: softprops/action-gh-release@v2
|
|
135
|
+
with:
|
|
136
|
+
files: dist/*
|
|
137
|
+
generate_release_notes: true
|
|
138
|
+
body: |
|
|
139
|
+
## ${{ github.ref_name }}
|
|
140
|
+
|
|
141
|
+
Published to [PyPI](https://pypi.org/project/ananke-plexus/).
|
|
142
|
+
See [CHANGELOG.md](https://github.com/neo-pragnya/ananke-plexus/blob/main/CHANGELOG.md) for details.
|