synaptixs-spine 1.23.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.
- synaptixs_spine-1.23.0/.env.example +122 -0
- synaptixs_spine-1.23.0/.github/CODEOWNERS +7 -0
- synaptixs_spine-1.23.0/.github/ISSUE_TEMPLATE/bug_report.md +22 -0
- synaptixs_spine-1.23.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- synaptixs_spine-1.23.0/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
- synaptixs_spine-1.23.0/.github/pull_request_template.md +13 -0
- synaptixs_spine-1.23.0/.github/release.yml +16 -0
- synaptixs_spine-1.23.0/.github/workflows/ci.yml +51 -0
- synaptixs_spine-1.23.0/.github/workflows/publish-pypi.yml +40 -0
- synaptixs_spine-1.23.0/.github/workflows/publish-testpypi.yml +119 -0
- synaptixs_spine-1.23.0/.github/workflows/release.yml +45 -0
- synaptixs_spine-1.23.0/.github/workflows/security-scan.yml +38 -0
- synaptixs_spine-1.23.0/.gitignore +33 -0
- synaptixs_spine-1.23.0/.mcp.json +8 -0
- synaptixs_spine-1.23.0/.pre-commit-config.yaml +23 -0
- synaptixs_spine-1.23.0/.python-version +1 -0
- synaptixs_spine-1.23.0/CODE_OF_CONDUCT.md +43 -0
- synaptixs_spine-1.23.0/COMMUNITY.md +83 -0
- synaptixs_spine-1.23.0/CONTRIBUTING.md +57 -0
- synaptixs_spine-1.23.0/FEATURES.md +84 -0
- synaptixs_spine-1.23.0/LICENSE +21 -0
- synaptixs_spine-1.23.0/OPERATIONS.md +162 -0
- synaptixs_spine-1.23.0/PKG-INFO +227 -0
- synaptixs_spine-1.23.0/README.md +161 -0
- synaptixs_spine-1.23.0/SECURITY.md +64 -0
- synaptixs_spine-1.23.0/SETUP.md +353 -0
- synaptixs_spine-1.23.0/USER_GUIDE.md +506 -0
- synaptixs_spine-1.23.0/alembic.ini +41 -0
- synaptixs_spine-1.23.0/assets/spine-banner.png +0 -0
- synaptixs_spine-1.23.0/assets/spine-banner.svg +26 -0
- synaptixs_spine-1.23.0/docker-compose.dev.yml +128 -0
- synaptixs_spine-1.23.0/examples/gap_rules/intent_gaps.yaml +41 -0
- synaptixs_spine-1.23.0/examples/intake/sample-spec.md +33 -0
- synaptixs_spine-1.23.0/examples/templates/business_writer.yaml +44 -0
- synaptixs_spine-1.23.0/examples/templates/code_executor.yaml +54 -0
- synaptixs_spine-1.23.0/examples/templates/code_reviewer.yaml +79 -0
- synaptixs_spine-1.23.0/examples/templates/data_analyst.yaml +56 -0
- synaptixs_spine-1.23.0/examples/templates/document_summarizer.yaml +53 -0
- synaptixs_spine-1.23.0/examples/templates/intent_extractor.yaml +49 -0
- synaptixs_spine-1.23.0/examples/templates/policy_checker.yaml +48 -0
- synaptixs_spine-1.23.0/examples/templates/research_agent.yaml +57 -0
- synaptixs_spine-1.23.0/examples/templates/spec_writer.yaml +46 -0
- synaptixs_spine-1.23.0/migrations/env.py +59 -0
- synaptixs_spine-1.23.0/migrations/script.py.mako +27 -0
- synaptixs_spine-1.23.0/migrations/versions/0001_initial_registry_tables.py +106 -0
- synaptixs_spine-1.23.0/migrations/versions/0002_glossary_entries.py +64 -0
- synaptixs_spine-1.23.0/migrations/versions/0003_calibration_history.py +56 -0
- synaptixs_spine-1.23.0/migrations/versions/0004_approval_requests.py +83 -0
- synaptixs_spine-1.23.0/migrations/versions/0005_add_tenant_id.py +37 -0
- synaptixs_spine-1.23.0/migrations/versions/0006_agent_memory.py +52 -0
- synaptixs_spine-1.23.0/pyproject.toml +172 -0
- synaptixs_spine-1.23.0/scripts/agentic_eval.py +147 -0
- synaptixs_spine-1.23.0/scripts/audit_eval.py +86 -0
- synaptixs_spine-1.23.0/scripts/codegen_ab.py +294 -0
- synaptixs_spine-1.23.0/scripts/codegen_benchmark.py +1366 -0
- synaptixs_spine-1.23.0/scripts/intents_to_confluence.py +168 -0
- synaptixs_spine-1.23.0/scripts/live_confluence.py +113 -0
- synaptixs_spine-1.23.0/scripts/live_github_auth.py +78 -0
- synaptixs_spine-1.23.0/scripts/live_review.py +119 -0
- synaptixs_spine-1.23.0/scripts/live_sdlc_worker.py +64 -0
- synaptixs_spine-1.23.0/scripts/skill_ab.py +253 -0
- synaptixs_spine-1.23.0/scripts/skill_promote.py +126 -0
- synaptixs_spine-1.23.0/scripts/smoke-test.sh +169 -0
- synaptixs_spine-1.23.0/src/orchestrator/__init__.py +1 -0
- synaptixs_spine-1.23.0/src/orchestrator/agentic/__init__.py +38 -0
- synaptixs_spine-1.23.0/src/orchestrator/agentic/codegen_tools.py +128 -0
- synaptixs_spine-1.23.0/src/orchestrator/agentic/export.py +107 -0
- synaptixs_spine-1.23.0/src/orchestrator/agentic/loop.py +495 -0
- synaptixs_spine-1.23.0/src/orchestrator/agentic/mcp_tools.py +74 -0
- synaptixs_spine-1.23.0/src/orchestrator/agentic/memory_tools.py +82 -0
- synaptixs_spine-1.23.0/src/orchestrator/agentic/policy.py +112 -0
- synaptixs_spine-1.23.0/src/orchestrator/agentic/tools.py +168 -0
- synaptixs_spine-1.23.0/src/orchestrator/approval/__init__.py +36 -0
- synaptixs_spine-1.23.0/src/orchestrator/approval/models.py +122 -0
- synaptixs_spine-1.23.0/src/orchestrator/approval/repository.py +219 -0
- synaptixs_spine-1.23.0/src/orchestrator/catalog/__init__.py +61 -0
- synaptixs_spine-1.23.0/src/orchestrator/catalog/catalog.py +132 -0
- synaptixs_spine-1.23.0/src/orchestrator/catalog/models.py +107 -0
- synaptixs_spine-1.23.0/src/orchestrator/catalog/planner.py +57 -0
- synaptixs_spine-1.23.0/src/orchestrator/catalog/profile.py +155 -0
- synaptixs_spine-1.23.0/src/orchestrator/catalog/skill_import.py +108 -0
- synaptixs_spine-1.23.0/src/orchestrator/catalog/skills.py +190 -0
- synaptixs_spine-1.23.0/src/orchestrator/catalog/vetting.py +60 -0
- synaptixs_spine-1.23.0/src/orchestrator/cli.py +1364 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/__init__.py +23 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/auth.py +138 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/config.py +85 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/diff_utils.py +56 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/github_client.py +250 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/grounding.py +153 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/models.py +87 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/reviewer.py +328 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/semgrep.py +146 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/verifiers.py +297 -0
- synaptixs_spine-1.23.0/src/orchestrator/codereview/webhook.py +211 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/__init__.py +0 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/claim.py +40 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/env.py +41 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/llm/__init__.py +43 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/llm/budget.py +115 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/llm/client.py +115 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/llm/litellm_client.py +176 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/llm/mock.py +133 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/llm/recording.py +153 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/state.py +68 -0
- synaptixs_spine-1.23.0/src/orchestrator/core/tool_client.py +135 -0
- synaptixs_spine-1.23.0/src/orchestrator/doctor.py +151 -0
- synaptixs_spine-1.23.0/src/orchestrator/evals/__init__.py +58 -0
- synaptixs_spine-1.23.0/src/orchestrator/evals/graders.py +211 -0
- synaptixs_spine-1.23.0/src/orchestrator/evals/harness.py +107 -0
- synaptixs_spine-1.23.0/src/orchestrator/evals/models.py +145 -0
- synaptixs_spine-1.23.0/src/orchestrator/evals/promotion.py +248 -0
- synaptixs_spine-1.23.0/src/orchestrator/evals/skill_ab.py +152 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/__init__.py +29 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/api/__init__.py +0 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/api/app.py +93 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/api/routes.py +151 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/auth.py +58 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/handlers.py +73 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/invocation.py +41 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/loader.py +80 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/rate_limit.py +59 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/tools/__init__.py +50 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/tools/echo.py +37 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/tools/fetch_artifact.py +89 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/tools/fetch_metric_definition.py +81 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/tools/fetch_url.py +76 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/tools/query_document_store.py +70 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/tools/query_warehouse.py +68 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/tools/run_python_analysis.py +295 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/tools/summarize_text.py +74 -0
- synaptixs_spine-1.23.0/src/orchestrator/gateway/tools/web_search.py +85 -0
- synaptixs_spine-1.23.0/src/orchestrator/init_scaffold.py +123 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/__init__.py +58 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/backlog_doc.py +60 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/cache.py +223 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/confluence.py +212 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/factory.py +128 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/file_source.py +184 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/gaps.py +160 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/intents.py +207 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/jira.py +250 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/mcp_source.py +123 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/notion.py +199 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/report.py +192 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/service.py +205 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/source.py +78 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/specs.py +183 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/web/__init__.py +12 -0
- synaptixs_spine-1.23.0/src/orchestrator/intake/web/app.py +235 -0
- synaptixs_spine-1.23.0/src/orchestrator/ir/__init__.py +0 -0
- synaptixs_spine-1.23.0/src/orchestrator/ir/graph.py +153 -0
- synaptixs_spine-1.23.0/src/orchestrator/ir/validator.py +307 -0
- synaptixs_spine-1.23.0/src/orchestrator/knowledge/__init__.py +13 -0
- synaptixs_spine-1.23.0/src/orchestrator/knowledge/access.py +63 -0
- synaptixs_spine-1.23.0/src/orchestrator/knowledge/consolidate.py +193 -0
- synaptixs_spine-1.23.0/src/orchestrator/knowledge/renderers.py +212 -0
- synaptixs_spine-1.23.0/src/orchestrator/knowledge/understand.py +78 -0
- synaptixs_spine-1.23.0/src/orchestrator/mcp/__init__.py +31 -0
- synaptixs_spine-1.23.0/src/orchestrator/mcp/client.py +103 -0
- synaptixs_spine-1.23.0/src/orchestrator/mcp/config.py +94 -0
- synaptixs_spine-1.23.0/src/orchestrator/mcp/contract.py +106 -0
- synaptixs_spine-1.23.0/src/orchestrator/mcp/db.py +110 -0
- synaptixs_spine-1.23.0/src/orchestrator/mcp/handler.py +107 -0
- synaptixs_spine-1.23.0/src/orchestrator/mcp/models.py +38 -0
- synaptixs_spine-1.23.0/src/orchestrator/mcp/onboard.py +85 -0
- synaptixs_spine-1.23.0/src/orchestrator/mcp/registry.py +77 -0
- synaptixs_spine-1.23.0/src/orchestrator/notify/__init__.py +5 -0
- synaptixs_spine-1.23.0/src/orchestrator/notify/slack.py +150 -0
- synaptixs_spine-1.23.0/src/orchestrator/obs/__init__.py +5 -0
- synaptixs_spine-1.23.0/src/orchestrator/obs/tracing.py +263 -0
- synaptixs_spine-1.23.0/src/orchestrator/personas/__init__.py +28 -0
- synaptixs_spine-1.23.0/src/orchestrator/personas/auditor.py +268 -0
- synaptixs_spine-1.23.0/src/orchestrator/personas/binding.py +78 -0
- synaptixs_spine-1.23.0/src/orchestrator/personas/registry.py +22 -0
- synaptixs_spine-1.23.0/src/orchestrator/personas/software_engineer.py +50 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/__init__.py +69 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/docs.py +225 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/export.py +234 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/extractor.py +499 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/facts.py +127 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/java_extractor.py +201 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/persistence.py +183 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/rdf.py +80 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/retrieval.py +233 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/schema.py +101 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/stats.py +192 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/store.py +117 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/typescript_extractor.py +283 -0
- synaptixs_spine-1.23.0/src/orchestrator/pkg/verifier.py +139 -0
- synaptixs_spine-1.23.0/src/orchestrator/planner/__init__.py +6 -0
- synaptixs_spine-1.23.0/src/orchestrator/planner/v0.py +171 -0
- synaptixs_spine-1.23.0/src/orchestrator/planner/v1.py +676 -0
- synaptixs_spine-1.23.0/src/orchestrator/plugin/__init__.py +9 -0
- synaptixs_spine-1.23.0/src/orchestrator/plugin/__main__.py +77 -0
- synaptixs_spine-1.23.0/src/orchestrator/plugin/auth.py +174 -0
- synaptixs_spine-1.23.0/src/orchestrator/plugin/server.py +271 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/__init__.py +0 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/_common.py +54 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/agent_template.py +71 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/__init__.py +0 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/app.py +125 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/approvals.py +242 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/backlog.py +59 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/config.py +55 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/console.py +61 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/deps.py +126 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/inbox.py +54 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/middleware.py +83 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/personas.py +103 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/routes.py +276 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/runs.py +141 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/session.py +57 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/stream.py +135 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/tasks.py +569 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/trace.py +225 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/__init__.py +17 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/auth.py +93 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/home.py +109 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/shell.py +54 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/static/app.css +179 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/static/console.css +73 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/static/console.js +120 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/static/inbox.css +73 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/static/inbox.js +138 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/static/intake.css +48 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/static/intake.js +62 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/static/login.js +20 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/api/web/static/personas.js +36 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/calibration.py +115 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/db/__init__.py +0 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/db/models.py +253 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/db/session.py +32 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/glossary.py +36 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/loader.py +32 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/repositories.py +332 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/tool_contract.py +101 -0
- synaptixs_spine-1.23.0/src/orchestrator/registry/validation.py +101 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/__init__.py +82 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/agent_node.py +183 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/artifacts.py +85 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/chain_node.py +142 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/checkpointer.py +42 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/failure_dispatch.py +150 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/graphs.py +202 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/manager_graph.py +456 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/post_conditions.py +222 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/specialist.py +121 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/task_orchestration.py +235 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/verifier.py +189 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/verifiers/__init__.py +45 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/verifiers/base.py +121 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/verifiers/chain.py +110 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/verifiers/confidence.py +87 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/verifiers/evidence.py +224 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/verifiers/glossary.py +126 -0
- synaptixs_spine-1.23.0/src/orchestrator/runtime/verifiers/policy.py +202 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/__init__.py +15 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/activities.py +599 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/ci.py +137 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/codegen.py +1433 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/conventions.py +186 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/deps.py +68 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/escalation.py +119 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/feature_runner.py +395 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/forge.py +276 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/gitauth.py +136 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/grounding.py +106 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/layout.py +306 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/preflight.py +103 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/review.py +217 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/review_response.py +118 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/run_control.py +204 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/scaffold.py +234 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/testenv.py +375 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/testrunner.py +234 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/types.py +130 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/worker.py +309 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/workflows.py +913 -0
- synaptixs_spine-1.23.0/src/orchestrator/sdlc/workspace.py +190 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/__init__.py +117 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/benchmark.py +91 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/drift.py +119 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/entity_key.py +84 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/execute.py +89 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/grounder.py +138 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/grounding.py +67 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/lineage.py +194 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/mapper.py +214 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/ontology.py +59 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/ontomesh_client.py +107 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/remediation.py +142 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/shipment.py +192 -0
- synaptixs_spine-1.23.0/src/orchestrator/spine/store.py +83 -0
- synaptixs_spine-1.23.0/src/orchestrator/storage/__init__.py +15 -0
- synaptixs_spine-1.23.0/src/orchestrator/storage/client.py +120 -0
- synaptixs_spine-1.23.0/src/orchestrator/temporal/__init__.py +22 -0
- synaptixs_spine-1.23.0/src/orchestrator/temporal/activities.py +435 -0
- synaptixs_spine-1.23.0/src/orchestrator/temporal/config.py +81 -0
- synaptixs_spine-1.23.0/src/orchestrator/temporal/deps.py +37 -0
- synaptixs_spine-1.23.0/src/orchestrator/temporal/worker.py +156 -0
- synaptixs_spine-1.23.0/src/orchestrator/temporal/workflow.py +506 -0
- synaptixs_spine-1.23.0/src/orchestrator/tui/__init__.py +14 -0
- synaptixs_spine-1.23.0/src/orchestrator/tui/app.py +130 -0
- synaptixs_spine-1.23.0/src/orchestrator/tui/client.py +52 -0
- synaptixs_spine-1.23.0/tests/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/agentic/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/agentic/test_approval.py +230 -0
- synaptixs_spine-1.23.0/tests/agentic/test_codegen_tools.py +58 -0
- synaptixs_spine-1.23.0/tests/agentic/test_export.py +79 -0
- synaptixs_spine-1.23.0/tests/agentic/test_loop.py +143 -0
- synaptixs_spine-1.23.0/tests/agentic/test_loop_tracing.py +112 -0
- synaptixs_spine-1.23.0/tests/agentic/test_mcp_tools.py +101 -0
- synaptixs_spine-1.23.0/tests/agentic/test_memory_tools.py +110 -0
- synaptixs_spine-1.23.0/tests/agentic/test_policy.py +95 -0
- synaptixs_spine-1.23.0/tests/agentic/test_tools.py +95 -0
- synaptixs_spine-1.23.0/tests/approval/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/approval/test_models.py +89 -0
- synaptixs_spine-1.23.0/tests/catalog/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/catalog/test_catalog_and_planner.py +123 -0
- synaptixs_spine-1.23.0/tests/catalog/test_profile.py +69 -0
- synaptixs_spine-1.23.0/tests/catalog/test_skill_import.py +67 -0
- synaptixs_spine-1.23.0/tests/catalog/test_skills.py +141 -0
- synaptixs_spine-1.23.0/tests/catalog/test_vetting.py +62 -0
- synaptixs_spine-1.23.0/tests/codereview/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/codereview/test_auth.py +149 -0
- synaptixs_spine-1.23.0/tests/codereview/test_github_client.py +168 -0
- synaptixs_spine-1.23.0/tests/codereview/test_grounding.py +169 -0
- synaptixs_spine-1.23.0/tests/codereview/test_reviewer.py +261 -0
- synaptixs_spine-1.23.0/tests/codereview/test_semgrep.py +97 -0
- synaptixs_spine-1.23.0/tests/codereview/test_verifiers.py +179 -0
- synaptixs_spine-1.23.0/tests/codereview/test_webhook.py +179 -0
- synaptixs_spine-1.23.0/tests/core/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/core/llm/test_budget.py +98 -0
- synaptixs_spine-1.23.0/tests/core/llm/test_litellm_client.py +64 -0
- synaptixs_spine-1.23.0/tests/core/llm/test_recording.py +103 -0
- synaptixs_spine-1.23.0/tests/core/test_claim.py +56 -0
- synaptixs_spine-1.23.0/tests/core/test_env.py +44 -0
- synaptixs_spine-1.23.0/tests/core/test_llm_litellm.py +108 -0
- synaptixs_spine-1.23.0/tests/core/test_llm_mock.py +69 -0
- synaptixs_spine-1.23.0/tests/core/test_llm_toolcalls.py +62 -0
- synaptixs_spine-1.23.0/tests/core/test_state.py +106 -0
- synaptixs_spine-1.23.0/tests/core/test_tool_client.py +73 -0
- synaptixs_spine-1.23.0/tests/evals/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/evals/test_brownfield_loader.py +50 -0
- synaptixs_spine-1.23.0/tests/evals/test_comparison.py +31 -0
- synaptixs_spine-1.23.0/tests/evals/test_graders.py +92 -0
- synaptixs_spine-1.23.0/tests/evals/test_harness.py +90 -0
- synaptixs_spine-1.23.0/tests/evals/test_promotion.py +146 -0
- synaptixs_spine-1.23.0/tests/evals/test_skill_ab.py +125 -0
- synaptixs_spine-1.23.0/tests/evals/test_skill_tasksets.py +108 -0
- synaptixs_spine-1.23.0/tests/fixtures/llm/.gitkeep +0 -0
- synaptixs_spine-1.23.0/tests/gateway/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/gateway/test_auth.py +44 -0
- synaptixs_spine-1.23.0/tests/gateway/test_fetch_metric_definition.py +59 -0
- synaptixs_spine-1.23.0/tests/gateway/test_fetch_url.py +60 -0
- synaptixs_spine-1.23.0/tests/gateway/test_handlers.py +46 -0
- synaptixs_spine-1.23.0/tests/gateway/test_loader.py +46 -0
- synaptixs_spine-1.23.0/tests/gateway/test_object_store_tools.py +92 -0
- synaptixs_spine-1.23.0/tests/gateway/test_query_warehouse.py +38 -0
- synaptixs_spine-1.23.0/tests/gateway/test_rate_limit.py +37 -0
- synaptixs_spine-1.23.0/tests/gateway/test_run_python_analysis.py +80 -0
- synaptixs_spine-1.23.0/tests/gateway/test_summarize_text.py +77 -0
- synaptixs_spine-1.23.0/tests/gateway/test_web_search.py +77 -0
- synaptixs_spine-1.23.0/tests/intake/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/intake/test_backlog_doc.py +46 -0
- synaptixs_spine-1.23.0/tests/intake/test_cache.py +143 -0
- synaptixs_spine-1.23.0/tests/intake/test_confluence.py +241 -0
- synaptixs_spine-1.23.0/tests/intake/test_factory.py +104 -0
- synaptixs_spine-1.23.0/tests/intake/test_file_source.py +106 -0
- synaptixs_spine-1.23.0/tests/intake/test_gaps.py +107 -0
- synaptixs_spine-1.23.0/tests/intake/test_intent_split_eval.py +105 -0
- synaptixs_spine-1.23.0/tests/intake/test_intents.py +105 -0
- synaptixs_spine-1.23.0/tests/intake/test_jira.py +249 -0
- synaptixs_spine-1.23.0/tests/intake/test_mcp_source.py +93 -0
- synaptixs_spine-1.23.0/tests/intake/test_notion.py +137 -0
- synaptixs_spine-1.23.0/tests/intake/test_report.py +149 -0
- synaptixs_spine-1.23.0/tests/intake/test_service.py +242 -0
- synaptixs_spine-1.23.0/tests/intake/test_specs.py +127 -0
- synaptixs_spine-1.23.0/tests/intake/test_web.py +135 -0
- synaptixs_spine-1.23.0/tests/integration/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/integration/conftest.py +53 -0
- synaptixs_spine-1.23.0/tests/integration/test_approvals_api.py +388 -0
- synaptixs_spine-1.23.0/tests/integration/test_approvals_e2e.py +73 -0
- synaptixs_spine-1.23.0/tests/integration/test_calibration.py +59 -0
- synaptixs_spine-1.23.0/tests/integration/test_gateway.py +145 -0
- synaptixs_spine-1.23.0/tests/integration/test_golden_research.py +181 -0
- synaptixs_spine-1.23.0/tests/integration/test_manager_workflow.py +217 -0
- synaptixs_spine-1.23.0/tests/integration/test_mcp_onboard.py +48 -0
- synaptixs_spine-1.23.0/tests/integration/test_migrations.py +30 -0
- synaptixs_spine-1.23.0/tests/integration/test_registry_api.py +131 -0
- synaptixs_spine-1.23.0/tests/integration/test_registry_repo.py +140 -0
- synaptixs_spine-1.23.0/tests/integration/test_replan_loop.py +292 -0
- synaptixs_spine-1.23.0/tests/integration/test_runs_api.py +78 -0
- synaptixs_spine-1.23.0/tests/integration/test_runtime_checkpoint.py +71 -0
- synaptixs_spine-1.23.0/tests/integration/test_sdlc_workflow_e2e.py +173 -0
- synaptixs_spine-1.23.0/tests/integration/test_sequential_workflow.py +190 -0
- synaptixs_spine-1.23.0/tests/integration/test_trace_ui.py +179 -0
- synaptixs_spine-1.23.0/tests/ir/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/ir/test_graph.py +96 -0
- synaptixs_spine-1.23.0/tests/ir/test_validator.py +121 -0
- synaptixs_spine-1.23.0/tests/ir/test_validator_manager.py +66 -0
- synaptixs_spine-1.23.0/tests/ir/test_validator_sequential.py +63 -0
- synaptixs_spine-1.23.0/tests/knowledge/test_consolidate.py +209 -0
- synaptixs_spine-1.23.0/tests/knowledge/test_memory_bank.py +146 -0
- synaptixs_spine-1.23.0/tests/mcp/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/mcp/test_config.py +58 -0
- synaptixs_spine-1.23.0/tests/mcp/test_contract_and_handler.py +140 -0
- synaptixs_spine-1.23.0/tests/mcp/test_db.py +73 -0
- synaptixs_spine-1.23.0/tests/mcp/test_onboard.py +40 -0
- synaptixs_spine-1.23.0/tests/mcp/test_registry.py +84 -0
- synaptixs_spine-1.23.0/tests/obs/test_tracing.py +160 -0
- synaptixs_spine-1.23.0/tests/orchestrator/notify/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/orchestrator/notify/test_slack.py +268 -0
- synaptixs_spine-1.23.0/tests/personas/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/personas/test_auditor.py +102 -0
- synaptixs_spine-1.23.0/tests/personas/test_auditor_eval.py +71 -0
- synaptixs_spine-1.23.0/tests/personas/test_software_engineer.py +94 -0
- synaptixs_spine-1.23.0/tests/pkg/test_default_extractors.py +52 -0
- synaptixs_spine-1.23.0/tests/pkg/test_docs.py +142 -0
- synaptixs_spine-1.23.0/tests/pkg/test_export.py +101 -0
- synaptixs_spine-1.23.0/tests/pkg/test_facts_and_store.py +79 -0
- synaptixs_spine-1.23.0/tests/pkg/test_impact.py +65 -0
- synaptixs_spine-1.23.0/tests/pkg/test_java_extractor.py +102 -0
- synaptixs_spine-1.23.0/tests/pkg/test_persistence.py +138 -0
- synaptixs_spine-1.23.0/tests/pkg/test_python_extractor.py +182 -0
- synaptixs_spine-1.23.0/tests/pkg/test_retrieval.py +80 -0
- synaptixs_spine-1.23.0/tests/pkg/test_schema.py +66 -0
- synaptixs_spine-1.23.0/tests/pkg/test_typescript_extractor.py +128 -0
- synaptixs_spine-1.23.0/tests/pkg/test_verifier.py +116 -0
- synaptixs_spine-1.23.0/tests/planner/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/planner/test_v0_unit.py +143 -0
- synaptixs_spine-1.23.0/tests/planner/test_v1_unit.py +306 -0
- synaptixs_spine-1.23.0/tests/plugin/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/plugin/test_auth.py +139 -0
- synaptixs_spine-1.23.0/tests/plugin/test_server.py +231 -0
- synaptixs_spine-1.23.0/tests/registry/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/registry/test_agent_template.py +61 -0
- synaptixs_spine-1.23.0/tests/registry/test_api_health.py +53 -0
- synaptixs_spine-1.23.0/tests/registry/test_auth.py +85 -0
- synaptixs_spine-1.23.0/tests/registry/test_backlog.py +109 -0
- synaptixs_spine-1.23.0/tests/registry/test_console_and_runs.py +93 -0
- synaptixs_spine-1.23.0/tests/registry/test_db_models.py +68 -0
- synaptixs_spine-1.23.0/tests/registry/test_examples_load.py +35 -0
- synaptixs_spine-1.23.0/tests/registry/test_inbox.py +45 -0
- synaptixs_spine-1.23.0/tests/registry/test_loader.py +20 -0
- synaptixs_spine-1.23.0/tests/registry/test_middleware.py +31 -0
- synaptixs_spine-1.23.0/tests/registry/test_personas_api.py +58 -0
- synaptixs_spine-1.23.0/tests/registry/test_principal.py +98 -0
- synaptixs_spine-1.23.0/tests/registry/test_repositories.py +47 -0
- synaptixs_spine-1.23.0/tests/registry/test_run_start.py +89 -0
- synaptixs_spine-1.23.0/tests/registry/test_stream.py +96 -0
- synaptixs_spine-1.23.0/tests/registry/test_tool_contract.py +81 -0
- synaptixs_spine-1.23.0/tests/registry/test_validation.py +100 -0
- synaptixs_spine-1.23.0/tests/registry/test_web.py +108 -0
- synaptixs_spine-1.23.0/tests/runtime/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/runtime/test_agent_node.py +191 -0
- synaptixs_spine-1.23.0/tests/runtime/test_artifacts.py +27 -0
- synaptixs_spine-1.23.0/tests/runtime/test_chain_node_replan.py +127 -0
- synaptixs_spine-1.23.0/tests/runtime/test_chain_regression.py +240 -0
- synaptixs_spine-1.23.0/tests/runtime/test_checkpointer.py +61 -0
- synaptixs_spine-1.23.0/tests/runtime/test_failure_dispatch.py +103 -0
- synaptixs_spine-1.23.0/tests/runtime/test_graphs.py +61 -0
- synaptixs_spine-1.23.0/tests/runtime/test_manager_graph.py +237 -0
- synaptixs_spine-1.23.0/tests/runtime/test_post_conditions.py +106 -0
- synaptixs_spine-1.23.0/tests/runtime/test_sequential_graph.py +135 -0
- synaptixs_spine-1.23.0/tests/runtime/test_specialist_models.py +86 -0
- synaptixs_spine-1.23.0/tests/runtime/test_verifier.py +96 -0
- synaptixs_spine-1.23.0/tests/runtime/test_verifier_chain.py +138 -0
- synaptixs_spine-1.23.0/tests/runtime/test_verifier_confidence.py +74 -0
- synaptixs_spine-1.23.0/tests/runtime/test_verifier_evidence.py +185 -0
- synaptixs_spine-1.23.0/tests/runtime/test_verifier_glossary.py +94 -0
- synaptixs_spine-1.23.0/tests/runtime/test_verifier_policy.py +179 -0
- synaptixs_spine-1.23.0/tests/runtime/test_verifiers_base.py +51 -0
- synaptixs_spine-1.23.0/tests/sdlc/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_activities.py +440 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_ci.py +116 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_codegen.py +808 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_codegen_agentic.py +184 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_codegen_memory.py +111 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_consolidate_activity.py +106 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_conventions.py +89 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_escalation.py +110 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_feature_runner.py +306 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_forge.py +113 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_gitauth.py +102 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_grounding.py +208 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_java_integration.py +63 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_layout.py +177 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_merge.py +94 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_preflight.py +33 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_review.py +141 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_review_response.py +143 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_run_control.py +25 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_scaffold.py +112 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_testenv.py +293 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_testrunner.py +55 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_typescript_integration.py +56 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_workflows.py +771 -0
- synaptixs_spine-1.23.0/tests/sdlc/test_workspace.py +163 -0
- synaptixs_spine-1.23.0/tests/spine/test_benchmark.py +41 -0
- synaptixs_spine-1.23.0/tests/spine/test_drift.py +72 -0
- synaptixs_spine-1.23.0/tests/spine/test_entity_key.py +49 -0
- synaptixs_spine-1.23.0/tests/spine/test_execute.py +94 -0
- synaptixs_spine-1.23.0/tests/spine/test_grounder.py +108 -0
- synaptixs_spine-1.23.0/tests/spine/test_lineage.py +117 -0
- synaptixs_spine-1.23.0/tests/spine/test_mapper.py +76 -0
- synaptixs_spine-1.23.0/tests/spine/test_ontomesh_client.py +65 -0
- synaptixs_spine-1.23.0/tests/spine/test_remediation.py +98 -0
- synaptixs_spine-1.23.0/tests/spine/test_shipment.py +128 -0
- synaptixs_spine-1.23.0/tests/spine/test_store.py +49 -0
- synaptixs_spine-1.23.0/tests/spine/test_wiring.py +57 -0
- synaptixs_spine-1.23.0/tests/temporal/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/temporal/test_activities.py +127 -0
- synaptixs_spine-1.23.0/tests/temporal/test_config.py +42 -0
- synaptixs_spine-1.23.0/tests/temporal/test_worker_restart.py +141 -0
- synaptixs_spine-1.23.0/tests/temporal/test_workflow.py +372 -0
- synaptixs_spine-1.23.0/tests/test_cli.py +173 -0
- synaptixs_spine-1.23.0/tests/test_doctor.py +318 -0
- synaptixs_spine-1.23.0/tests/test_env_example.py +41 -0
- synaptixs_spine-1.23.0/tests/test_init_scaffold.py +93 -0
- synaptixs_spine-1.23.0/tests/test_stats.py +322 -0
- synaptixs_spine-1.23.0/tests/tui/__init__.py +0 -0
- synaptixs_spine-1.23.0/tests/tui/test_app.py +65 -0
- synaptixs_spine-1.23.0/tests/tui/test_client.py +49 -0
- synaptixs_spine-1.23.0/uv.lock +4119 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Agent Orchestrator — environment template.
|
|
2
|
+
#
|
|
3
|
+
# cp .env.example .env # then fill in the values you need
|
|
4
|
+
# orchestrator doctor # verify readiness
|
|
5
|
+
#
|
|
6
|
+
# `.env` is gitignored; pydantic-settings + the CLI auto-load it. A real
|
|
7
|
+
# exported shell variable always wins over a value in this file.
|
|
8
|
+
#
|
|
9
|
+
# You do NOT need every variable — fill in the block(s) for what you're doing:
|
|
10
|
+
# • Mode A (local CLI: `ingest`, `sdlc feature`) needs only an LLM provider
|
|
11
|
+
# plus the source you read from (Confluence / Jira / Notion / file).
|
|
12
|
+
# • Mode B (autonomous `sdlc run` + web console) additionally needs the
|
|
13
|
+
# Orchestrator API + database + Temporal blocks.
|
|
14
|
+
# Sections below are tagged [REQUIRED] / [MODE B] / [OPTIONAL] accordingly.
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# ============================================================================
|
|
18
|
+
# 1. LLM provider [REQUIRED]
|
|
19
|
+
# ============================================================================
|
|
20
|
+
# At least ONE of these. Set the key for the model family you use.
|
|
21
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
22
|
+
# OPENAI_API_KEY=sk-...
|
|
23
|
+
# Ollama (local or cloud) needs no API key — set the endpoint and use an
|
|
24
|
+
# ollama/* model below. Local: http://localhost:11434
|
|
25
|
+
# OLLAMA_API_BASE=http://localhost:11434
|
|
26
|
+
|
|
27
|
+
# Model selection — one model drives everything unless overridden. Set this
|
|
28
|
+
# explicitly: a slow default can time out on large generations.
|
|
29
|
+
# ORCHESTRATOR_INTAKE_MODEL=gpt-4o
|
|
30
|
+
# SDLC_CODEGEN_MODEL=gpt-4o # codegen; inherits INTAKE_MODEL if unset
|
|
31
|
+
# SDLC_REVIEW_MODEL=gpt-4o # PR review; inherits INTAKE_MODEL if unset
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# ============================================================================
|
|
35
|
+
# 2. Requirements source — fill in the one(s) you read from
|
|
36
|
+
# ============================================================================
|
|
37
|
+
# `file://` sources (e.g. file://./spec.md) need NO credentials.
|
|
38
|
+
|
|
39
|
+
# --- Confluence (read) -----------------------------------------------------
|
|
40
|
+
CONFLUENCE_BASE_URL=https://yourorg.atlassian.net/wiki
|
|
41
|
+
CONFLUENCE_EMAIL=you@yourorg.com
|
|
42
|
+
CONFLUENCE_API_TOKEN=replace-with-atlassian-api-token
|
|
43
|
+
|
|
44
|
+
# --- Jira (only needed to CREATE issues; dry-run/preview needs none) -------
|
|
45
|
+
JIRA_BASE_URL=https://yourorg.atlassian.net
|
|
46
|
+
JIRA_EMAIL=you@yourorg.com
|
|
47
|
+
JIRA_API_TOKEN=replace-with-atlassian-api-token
|
|
48
|
+
JIRA_PROJECT_KEY=ENG
|
|
49
|
+
JIRA_DRY_RUN=true # false to write real issues
|
|
50
|
+
|
|
51
|
+
# --- Notion (optional source) ----------------------------------------------
|
|
52
|
+
# NOTION_API_TOKEN=secret_...
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# ============================================================================
|
|
56
|
+
# 3. Target repo + GitHub auth — for `sdlc feature`/`run` that push & open PRs
|
|
57
|
+
# ============================================================================
|
|
58
|
+
# SDLC_REPO_URL=https://github.com/yourorg/yourrepo.git
|
|
59
|
+
# Simplest auth — a PAT or pre-minted token (either name works):
|
|
60
|
+
# GITHUB_TOKEN=ghp_...
|
|
61
|
+
# GH_TOKEN=ghp_...
|
|
62
|
+
# Or a GitHub App (also powers the PR reviewer webhook):
|
|
63
|
+
# GITHUB_APP_ENABLED=true
|
|
64
|
+
# GITHUB_APP_ID=123456
|
|
65
|
+
# GITHUB_APP_WEBHOOK_SECRET=replace-with-the-app-webhook-secret
|
|
66
|
+
# GITHUB_APP_PRIVATE_KEY_PATH=./github-app.pem # or inline GITHUB_APP_PRIVATE_KEY
|
|
67
|
+
# GITHUB_APP_API_BASE_URL=https://api.github.com # override for GitHub Enterprise
|
|
68
|
+
# SDLC_GITHUB_INSTALLATION_ID=12345678 # pin a specific App installation
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# ============================================================================
|
|
72
|
+
# 4. Mode B — autonomous pipeline (REST API + console) [MODE B]
|
|
73
|
+
# ============================================================================
|
|
74
|
+
# The CLI uses these to reach a running orchestrator server (e.g. approvals).
|
|
75
|
+
# ORCHESTRATOR_API_URL=http://localhost:8000
|
|
76
|
+
# ORCHESTRATOR_API_KEY=dev-key # must match the key the server starts with
|
|
77
|
+
# Postgres (defaults to the docker-compose dev DB):
|
|
78
|
+
# ORCHESTRATOR_DATABASE_URL=postgresql+psycopg://orchestrator:orchestrator@localhost:5433/orchestrator
|
|
79
|
+
# Temporal (defaults target the local docker stack):
|
|
80
|
+
# TEMPORAL_HOST=localhost:7233
|
|
81
|
+
# TEMPORAL_NAMESPACE=default
|
|
82
|
+
# TEMPORAL_TASK_QUEUE=orchestrator-tasks
|
|
83
|
+
# SDLC_TASK_QUEUE=sdlc-tasks
|
|
84
|
+
# SDLC_WORKSPACE_ROOT=/tmp/sdlc-workspaces
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
# ============================================================================
|
|
88
|
+
# 5. Optional — notifications, budget [OPTIONAL]
|
|
89
|
+
# ============================================================================
|
|
90
|
+
# SLACK_WEBHOOK_URL=https://hooks.slack.com/services/... # approval-gate alerts
|
|
91
|
+
# SDLC_RUN_BUDGET_USD=25 # per-run LLM spend cap; 0 disables
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# ============================================================================
|
|
95
|
+
# 6. MCP — consume external servers (Atlassian, DBs, …) [OPTIONAL]
|
|
96
|
+
# ============================================================================
|
|
97
|
+
# Point at an mcpServers JSON file; transport is inferred (command=stdio, url=http).
|
|
98
|
+
# ORCHESTRATOR_MCP_CONFIG=./mcp.json
|
|
99
|
+
# Override Confluence-via-MCP tool names if your server differs:
|
|
100
|
+
# MCP_CONFLUENCE_SERVER=confluence
|
|
101
|
+
# MCP_CONFLUENCE_PAGE_TOOL=confluence_get_page
|
|
102
|
+
# MCP_CONFLUENCE_CHILDREN_TOOL=confluence_get_page_children
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# ============================================================================
|
|
106
|
+
# 7. Remote MCP plugin server (Phase C: `orchestrator-mcp --http`) [OPTIONAL]
|
|
107
|
+
# ============================================================================
|
|
108
|
+
# Only when serving the orchestrator AS an MCP server over the network (hosted
|
|
109
|
+
# Codex app / claude.ai). The local stdio plugin (`orchestrator-mcp`) needs none.
|
|
110
|
+
# ORCHESTRATOR_MCP_HOST=0.0.0.0
|
|
111
|
+
# ORCHESTRATOR_MCP_PORT=8080
|
|
112
|
+
# ORCHESTRATOR_MCP_PATH=/mcp
|
|
113
|
+
# ORCHESTRATOR_MCP_RESOURCE_URL=https://mcp.yourorg.com # this server's public URL
|
|
114
|
+
# Auth — pick ONE:
|
|
115
|
+
# (a) static shared secret (single-tenant self-host behind TLS):
|
|
116
|
+
# ORCHESTRATOR_MCP_TOKEN=replace-with-a-long-random-secret
|
|
117
|
+
# (b) OAuth 2.0 introspection against your IdP (RFC 7662):
|
|
118
|
+
# ORCHESTRATOR_MCP_ISSUER_URL=https://idp.yourorg.com
|
|
119
|
+
# ORCHESTRATOR_MCP_INTROSPECTION_URL=https://idp.yourorg.com/oauth2/introspect
|
|
120
|
+
# ORCHESTRATOR_MCP_INTROSPECTION_CLIENT_ID=orchestrator-rs
|
|
121
|
+
# ORCHESTRATOR_MCP_INTROSPECTION_CLIENT_SECRET=replace-me
|
|
122
|
+
# ORCHESTRATOR_MCP_REQUIRED_SCOPES=sdlc
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Code owners for the public mirror (synaptixs/spine).
|
|
2
|
+
#
|
|
3
|
+
# The "Protect main" ruleset on synaptixs/spine requires a code-owner review on
|
|
4
|
+
# every PR into main. This assigns ownership to the synaptixs maintainer identity,
|
|
5
|
+
# who approves release PRs (develop → main). Kept off the maintainer's personal
|
|
6
|
+
# handle on purpose — the public repo uses the de-linked org identity.
|
|
7
|
+
* @ssmith-synaptixs
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Report a problem with Spine
|
|
4
|
+
title: "[bug] "
|
|
5
|
+
labels: bug
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
**What happened?**
|
|
9
|
+
|
|
10
|
+
**What did you expect to happen?**
|
|
11
|
+
|
|
12
|
+
**Steps to reproduce**
|
|
13
|
+
1.
|
|
14
|
+
2.
|
|
15
|
+
|
|
16
|
+
**Environment**
|
|
17
|
+
- Spine / `synaptixs-spine` version:
|
|
18
|
+
- Python version:
|
|
19
|
+
- OS:
|
|
20
|
+
- Codegen model / provider:
|
|
21
|
+
|
|
22
|
+
**Logs or trace** (please redact any secrets)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea or improvement for Spine
|
|
4
|
+
title: "[feat] "
|
|
5
|
+
labels: enhancement
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
**Problem / motivation**
|
|
9
|
+
What are you trying to do that's hard or impossible today?
|
|
10
|
+
|
|
11
|
+
**Proposed solution**
|
|
12
|
+
|
|
13
|
+
**Alternatives considered**
|
|
14
|
+
|
|
15
|
+
**Additional context**
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
## What & why
|
|
2
|
+
|
|
3
|
+
<!-- What does this change do, and why? Link any related issue. -->
|
|
4
|
+
|
|
5
|
+
## How it was tested
|
|
6
|
+
|
|
7
|
+
<!-- Commands run, scenarios covered. -->
|
|
8
|
+
|
|
9
|
+
## Checklist
|
|
10
|
+
- [ ] Quality gate green locally (`mypy src tests`, `ruff format --check .`)
|
|
11
|
+
- [ ] Tests added/updated where it matters
|
|
12
|
+
- [ ] No secrets committed
|
|
13
|
+
- [ ] Docs updated if behavior changed
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Categorizes GitHub's auto-generated release notes (grouped by PR label).
|
|
2
|
+
changelog:
|
|
3
|
+
exclude:
|
|
4
|
+
labels:
|
|
5
|
+
- ignore-for-release
|
|
6
|
+
categories:
|
|
7
|
+
- title: ✨ Features
|
|
8
|
+
labels: [feature, enhancement]
|
|
9
|
+
- title: 🐛 Fixes
|
|
10
|
+
labels: [bug, fix]
|
|
11
|
+
- title: 📚 Docs
|
|
12
|
+
labels: [documentation, docs]
|
|
13
|
+
- title: 🔧 Maintenance
|
|
14
|
+
labels: [chore, ci, dependencies]
|
|
15
|
+
- title: Other changes
|
|
16
|
+
labels: ["*"]
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, develop]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
check:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v5
|
|
14
|
+
|
|
15
|
+
- name: Install uv
|
|
16
|
+
uses: astral-sh/setup-uv@v6
|
|
17
|
+
with:
|
|
18
|
+
enable-cache: true
|
|
19
|
+
|
|
20
|
+
- name: Set up Python
|
|
21
|
+
run: uv python install 3.12
|
|
22
|
+
|
|
23
|
+
# JDK for the Java-codegen integration tests (Maven is pre-installed on the
|
|
24
|
+
# runner). The tests skip cleanly when the toolchain is absent.
|
|
25
|
+
- name: Set up JDK
|
|
26
|
+
uses: actions/setup-java@v4
|
|
27
|
+
with:
|
|
28
|
+
distribution: temurin
|
|
29
|
+
java-version: "17"
|
|
30
|
+
|
|
31
|
+
# Node for the TypeScript-codegen integration tests (npm comes with Node).
|
|
32
|
+
# The tests skip cleanly when the toolchain is absent.
|
|
33
|
+
- name: Set up Node
|
|
34
|
+
uses: actions/setup-node@v4
|
|
35
|
+
with:
|
|
36
|
+
node-version: "20"
|
|
37
|
+
|
|
38
|
+
- name: Install project
|
|
39
|
+
run: uv sync --extra dev
|
|
40
|
+
|
|
41
|
+
- name: Lint (ruff)
|
|
42
|
+
run: uv run ruff check .
|
|
43
|
+
|
|
44
|
+
- name: Format check (ruff)
|
|
45
|
+
run: uv run ruff format --check .
|
|
46
|
+
|
|
47
|
+
- name: Type check (mypy)
|
|
48
|
+
run: uv run mypy
|
|
49
|
+
|
|
50
|
+
- name: Tests
|
|
51
|
+
run: uv run pytest
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
# Manual, intentional publish to PRODUCTION PyPI via OIDC Trusted Publishing — no
|
|
4
|
+
# stored token. One-time setup on PyPI (https://pypi.org): register a trusted
|
|
5
|
+
# publisher for the `synaptixs-spine` project:
|
|
6
|
+
# Owner: synaptixs Repository: spine
|
|
7
|
+
# Workflow: publish-pypi.yml Environment: pypi
|
|
8
|
+
# PyPI supports a "pending publisher", so register it BEFORE the first upload —
|
|
9
|
+
# the first publish then creates the project. Bump `version` in pyproject.toml each
|
|
10
|
+
# release (PyPI is immutable; a duplicate version is rejected).
|
|
11
|
+
on:
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
publish-pypi:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
environment: pypi
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read # an explicit permissions block drops the defaults; checkout needs this
|
|
20
|
+
id-token: write # required for OIDC trusted publishing
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v5
|
|
23
|
+
|
|
24
|
+
- name: Install uv
|
|
25
|
+
uses: astral-sh/setup-uv@v6
|
|
26
|
+
with:
|
|
27
|
+
enable-cache: true
|
|
28
|
+
|
|
29
|
+
- name: Set up Python
|
|
30
|
+
run: uv python install 3.12
|
|
31
|
+
|
|
32
|
+
- name: Build sdist + wheel
|
|
33
|
+
run: uv build
|
|
34
|
+
|
|
35
|
+
- name: Check metadata
|
|
36
|
+
run: uvx twine check dist/*
|
|
37
|
+
|
|
38
|
+
- name: Publish to PyPI
|
|
39
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
40
|
+
# No repository-url → defaults to production PyPI (upload.pypi.org).
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
name: Publish to TestPyPI
|
|
2
|
+
|
|
3
|
+
# Manual, intentional publish to the TestPyPI sandbox. Build with the same uv
|
|
4
|
+
# toolchain as CI, then upload the sdist + wheel.
|
|
5
|
+
#
|
|
6
|
+
# Auth uses PyPI **Trusted Publishing** (OIDC) — no API token stored in GitHub.
|
|
7
|
+
# One-time setup on TestPyPI (https://test.pypi.org → the project, or "pending
|
|
8
|
+
# publisher" before the first upload) — register THIS repository as a trusted
|
|
9
|
+
# publisher for the `synaptixs-spine` project:
|
|
10
|
+
# Owner: <this repo's owner> (e.g. synaptixs)
|
|
11
|
+
# Repository: <this repo's name> (e.g. spine)
|
|
12
|
+
# Workflow: publish-testpypi.yml
|
|
13
|
+
# Environment: testpypi
|
|
14
|
+
# A project may have several trusted publishers, but to avoid version races pick
|
|
15
|
+
# ONE repo as the release source. To use an API token instead, delete the
|
|
16
|
+
# `permissions`/`environment` blocks and set
|
|
17
|
+
# `password: ${{ secrets.TEST_PYPI_API_TOKEN }}` on the publish step.
|
|
18
|
+
|
|
19
|
+
on:
|
|
20
|
+
workflow_dispatch:
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
publish-testpypi:
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
environment: testpypi
|
|
26
|
+
permissions:
|
|
27
|
+
contents: read # an explicit permissions block drops the defaults; checkout needs this
|
|
28
|
+
id-token: write # required for OIDC trusted publishing
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v5
|
|
31
|
+
|
|
32
|
+
- name: Install uv
|
|
33
|
+
uses: astral-sh/setup-uv@v6
|
|
34
|
+
with:
|
|
35
|
+
enable-cache: true
|
|
36
|
+
|
|
37
|
+
- name: Set up Python
|
|
38
|
+
run: uv python install 3.12
|
|
39
|
+
|
|
40
|
+
- name: Build sdist + wheel
|
|
41
|
+
run: uv build
|
|
42
|
+
|
|
43
|
+
- name: Check metadata
|
|
44
|
+
run: uvx twine check dist/*
|
|
45
|
+
|
|
46
|
+
- name: Publish to TestPyPI
|
|
47
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
48
|
+
with:
|
|
49
|
+
repository-url: https://test.pypi.org/legacy/
|
|
50
|
+
# Don't hard-fail when a version was already uploaded (TestPyPI is
|
|
51
|
+
# immutable per version — bump `version` in pyproject.toml to release).
|
|
52
|
+
skip-existing: true
|
|
53
|
+
|
|
54
|
+
# Tell testers a new build is up. Runs only after a successful publish.
|
|
55
|
+
# Best-effort: a webhook hiccup must not fail the release.
|
|
56
|
+
#
|
|
57
|
+
# Setup (one-time): in the target Teams channel → ··· → Workflows →
|
|
58
|
+
# template "Post to a channel when a webhook request is received". Copy the
|
|
59
|
+
# generated URL into a GitHub Actions secret named TEAMS_WEBHOOK_URL
|
|
60
|
+
# (repo → Settings → Secrets and variables → Actions). Until that secret
|
|
61
|
+
# exists the step no-ops (it does not fail). The payload is an Adaptive
|
|
62
|
+
# Card wrapped in the message/attachments envelope the Workflows webhook
|
|
63
|
+
# expects (the modern replacement for the retired O365 connectors).
|
|
64
|
+
- name: Notify Teams (testers) of the new build
|
|
65
|
+
env:
|
|
66
|
+
TEAMS_WEBHOOK_URL: ${{ secrets.TEAMS_WEBHOOK_URL }}
|
|
67
|
+
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
|
68
|
+
run: |
|
|
69
|
+
set -euo pipefail
|
|
70
|
+
if [ -z "${TEAMS_WEBHOOK_URL}" ]; then
|
|
71
|
+
echo "TEAMS_WEBHOOK_URL not set — skipping Teams notification."
|
|
72
|
+
exit 0
|
|
73
|
+
fi
|
|
74
|
+
VERSION=$(python -c "import tomllib,pathlib; print(tomllib.loads(pathlib.Path('pyproject.toml').read_text())['project']['version'])")
|
|
75
|
+
INSTALL="pip install -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ \"synaptixs-spine==${VERSION}\""
|
|
76
|
+
PAYLOAD=$(jq -n \
|
|
77
|
+
--arg title "🚀 synaptixs-spine ${VERSION} published to TestPyPI" \
|
|
78
|
+
--arg subtitle "A new build is ready for testing." \
|
|
79
|
+
--arg version "${VERSION}" \
|
|
80
|
+
--arg commit "${GITHUB_SHA:0:7}" \
|
|
81
|
+
--arg branch "${GITHUB_REF_NAME}" \
|
|
82
|
+
--arg install "${INSTALL}" \
|
|
83
|
+
--arg pypi_url "https://test.pypi.org/project/synaptixs-spine/${VERSION}/" \
|
|
84
|
+
--arg run_url "${RUN_URL}" \
|
|
85
|
+
'{
|
|
86
|
+
type: "message",
|
|
87
|
+
attachments: [{
|
|
88
|
+
contentType: "application/vnd.microsoft.card.adaptive",
|
|
89
|
+
content: {
|
|
90
|
+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
91
|
+
type: "AdaptiveCard",
|
|
92
|
+
version: "1.4",
|
|
93
|
+
body: [
|
|
94
|
+
{type:"TextBlock", size:"Large", weight:"Bolder", text:$title, wrap:true},
|
|
95
|
+
{type:"TextBlock", text:$subtitle, wrap:true, spacing:"None"},
|
|
96
|
+
{type:"FactSet", facts:[
|
|
97
|
+
{title:"Version", value:$version},
|
|
98
|
+
{title:"Branch", value:$branch},
|
|
99
|
+
{title:"Commit", value:$commit}
|
|
100
|
+
]},
|
|
101
|
+
{type:"TextBlock", text:"Install:", weight:"Bolder", spacing:"Medium"},
|
|
102
|
+
{type:"TextBlock", text:$install, wrap:true, fontType:"Monospace"}
|
|
103
|
+
],
|
|
104
|
+
actions: [
|
|
105
|
+
{type:"Action.OpenUrl", title:"View on TestPyPI", url:$pypi_url},
|
|
106
|
+
{type:"Action.OpenUrl", title:"Workflow run", url:$run_url}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
}]
|
|
110
|
+
}')
|
|
111
|
+
code=$(curl -sS -o /tmp/teams_resp.txt -w "%{http_code}" \
|
|
112
|
+
-H "Content-Type: application/json" \
|
|
113
|
+
-d "${PAYLOAD}" "${TEAMS_WEBHOOK_URL}") || true
|
|
114
|
+
echo "Teams webhook HTTP ${code}"
|
|
115
|
+
# Workflows returns 200/202 on accept; warn (don't fail) on anything else.
|
|
116
|
+
case "${code}" in
|
|
117
|
+
200|202) echo "Teams notified." ;;
|
|
118
|
+
*) echo "::warning::Teams notification failed (HTTP ${code}): $(cat /tmp/teams_resp.txt)" ;;
|
|
119
|
+
esac
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
name: Release notes
|
|
2
|
+
|
|
3
|
+
# On every release to main (a develop -> main merge), publish a GitHub Release for
|
|
4
|
+
# the current version with auto-generated notes. Idempotent: if a release for the
|
|
5
|
+
# version tag already exists, it does nothing. Notes are categorized by .github/release.yml.
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: [main]
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: write # create the tag + release
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
release:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v5
|
|
19
|
+
with:
|
|
20
|
+
fetch-depth: 0 # full history so release notes can diff against the prior tag
|
|
21
|
+
|
|
22
|
+
- name: Read version from pyproject.toml
|
|
23
|
+
id: ver
|
|
24
|
+
run: |
|
|
25
|
+
set -euo pipefail
|
|
26
|
+
v="$(python -c "import tomllib,pathlib; print(tomllib.loads(pathlib.Path('pyproject.toml').read_text())['project']['version'])")"
|
|
27
|
+
echo "version=$v" >> "$GITHUB_OUTPUT"
|
|
28
|
+
echo "Detected version: $v"
|
|
29
|
+
|
|
30
|
+
- name: Create release if the tag doesn't exist yet
|
|
31
|
+
env:
|
|
32
|
+
GH_TOKEN: ${{ github.token }}
|
|
33
|
+
VERSION: ${{ steps.ver.outputs.version }}
|
|
34
|
+
run: |
|
|
35
|
+
set -euo pipefail
|
|
36
|
+
tag="v${VERSION}"
|
|
37
|
+
if gh release view "$tag" >/dev/null 2>&1; then
|
|
38
|
+
echo "Release $tag already exists — nothing to do."
|
|
39
|
+
exit 0
|
|
40
|
+
fi
|
|
41
|
+
echo "Creating release $tag with auto-generated notes."
|
|
42
|
+
gh release create "$tag" \
|
|
43
|
+
--target "${GITHUB_SHA}" \
|
|
44
|
+
--title "Spine $tag" \
|
|
45
|
+
--generate-notes
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
name: Security scan
|
|
2
|
+
|
|
3
|
+
# Produces the "security scan" status check that the synaptixs/spine "Protect main"
|
|
4
|
+
# ruleset requires on PRs into main. The job NAME must stay exactly "security scan"
|
|
5
|
+
# — the ruleset matches the required check by that context name. Runs on PRs into
|
|
6
|
+
# main (and on demand); a clean tree passes, committed secrets fail it.
|
|
7
|
+
on:
|
|
8
|
+
pull_request:
|
|
9
|
+
branches: [main]
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
scan:
|
|
17
|
+
name: security scan
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v5
|
|
21
|
+
|
|
22
|
+
- name: Scan for committed secrets
|
|
23
|
+
run: |
|
|
24
|
+
set -euo pipefail
|
|
25
|
+
# High-signal credential/key patterns. Fail the check if any are committed.
|
|
26
|
+
patterns='AKIA[0-9A-Z]{16}|ghp_[A-Za-z0-9]{36}|xox[baprs]-[0-9A-Za-z-]{10,}|-----BEGIN [A-Z ]*PRIVATE KEY-----'
|
|
27
|
+
# Allowlist (not real secrets):
|
|
28
|
+
# - this workflow defines the patterns themselves
|
|
29
|
+
# - tests/ and scripts/ hold dummy fixtures for the codereview secret-detector
|
|
30
|
+
# - AKIAIOSFODNN7EXAMPLE is AWS's canonical documentation example key
|
|
31
|
+
matches="$(git grep -nIE "$patterns" -- . ':!.github/workflows' ':!tests' ':!scripts' || true)"
|
|
32
|
+
real="$(printf '%s\n' "$matches" | grep -vE 'AKIAIOSFODNN7EXAMPLE' | grep -v '^$' || true)"
|
|
33
|
+
if [ -n "$real" ]; then
|
|
34
|
+
printf '%s\n' "$real"
|
|
35
|
+
echo "::error::Potential committed secret detected — see matches above."
|
|
36
|
+
exit 1
|
|
37
|
+
fi
|
|
38
|
+
echo "No committed secrets detected."
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/docs/*
|
|
2
|
+
!/docs/specs/
|
|
3
|
+
!/docs/evals/
|
|
4
|
+
|
|
5
|
+
# Python
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.py[cod]
|
|
8
|
+
*.egg-info/
|
|
9
|
+
.venv/
|
|
10
|
+
.pytest_cache/
|
|
11
|
+
.mypy_cache/
|
|
12
|
+
.ruff_cache/
|
|
13
|
+
htmlcov/
|
|
14
|
+
.coverage
|
|
15
|
+
dist/
|
|
16
|
+
build/
|
|
17
|
+
|
|
18
|
+
# Editors / OS
|
|
19
|
+
.DS_Store
|
|
20
|
+
.idea/
|
|
21
|
+
.vscode/
|
|
22
|
+
|
|
23
|
+
# Local smoke-test artefacts
|
|
24
|
+
.smoke-api.log
|
|
25
|
+
|
|
26
|
+
# Claude Code session lockfiles
|
|
27
|
+
.claude/
|
|
28
|
+
|
|
29
|
+
# Secrets / local credentials (live integration testing)
|
|
30
|
+
.env
|
|
31
|
+
.env.*
|
|
32
|
+
!.env.example
|
|
33
|
+
*.pem
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.6.9
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- id: ruff-format
|
|
8
|
+
|
|
9
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
10
|
+
rev: v1.11.2
|
|
11
|
+
hooks:
|
|
12
|
+
- id: mypy
|
|
13
|
+
additional_dependencies: [pydantic>=2.7]
|
|
14
|
+
args: [--strict]
|
|
15
|
+
files: ^(src|tests)/
|
|
16
|
+
|
|
17
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
18
|
+
rev: v5.0.0
|
|
19
|
+
hooks:
|
|
20
|
+
- id: trailing-whitespace
|
|
21
|
+
- id: end-of-file-fixer
|
|
22
|
+
- id: check-yaml
|
|
23
|
+
- id: check-merge-conflict
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
This project adopts the [Contributor Covenant, v2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/) as its Code of Conduct.
|
|
4
|
+
|
|
5
|
+
The full text is available at the link above. A short summary:
|
|
6
|
+
|
|
7
|
+
## Our pledge
|
|
8
|
+
|
|
9
|
+
We pledge to make participation in our community a respectful and welcoming experience for everyone, regardless of background, identity, or experience level.
|
|
10
|
+
|
|
11
|
+
## Expected behavior
|
|
12
|
+
|
|
13
|
+
- Be respectful in discussions, code reviews, and issues.
|
|
14
|
+
- Assume good faith. Ask questions before assuming intent.
|
|
15
|
+
- Give and accept constructive feedback gracefully.
|
|
16
|
+
- Focus on what is best for the project and the community.
|
|
17
|
+
|
|
18
|
+
## Unacceptable behavior
|
|
19
|
+
|
|
20
|
+
- Personal attacks, insults, or derogatory comments.
|
|
21
|
+
- Public or private harassment.
|
|
22
|
+
- Publishing others' private information without explicit permission.
|
|
23
|
+
- Other conduct which could reasonably be considered inappropriate in a professional setting.
|
|
24
|
+
|
|
25
|
+
## Scope
|
|
26
|
+
|
|
27
|
+
This Code of Conduct applies to all project spaces — GitHub issues and pull requests, discussion forums, chat channels, and any in-person or virtual events associated with the project.
|
|
28
|
+
|
|
29
|
+
## Reporting
|
|
30
|
+
|
|
31
|
+
If you experience or witness behavior that violates this Code of Conduct, please report it by emailing the maintainers. Reports will be reviewed and investigated promptly and confidentially.
|
|
32
|
+
|
|
33
|
+
**Contact:** Open a private issue or email the repository maintainer listed in the GitHub org settings. (Replace with a dedicated address once the project has one.)
|
|
34
|
+
|
|
35
|
+
## Enforcement
|
|
36
|
+
|
|
37
|
+
Maintainers are responsible for clarifying and enforcing standards of acceptable behavior. They may take any action they deem appropriate in response to violations, including warnings, temporary bans, or permanent removal from the project.
|
|
38
|
+
|
|
39
|
+
The full enforcement guidelines from the Contributor Covenant v2.1 apply.
|
|
40
|
+
|
|
41
|
+
## Attribution
|
|
42
|
+
|
|
43
|
+
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct/.
|