ctrlrelay 0.1.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. ctrlrelay-0.1.5/.github/ISSUE_TEMPLATE/bug_report.md +45 -0
  2. ctrlrelay-0.1.5/.github/ISSUE_TEMPLATE/feature_request.md +41 -0
  3. ctrlrelay-0.1.5/.github/PULL_REQUEST_TEMPLATE.md +49 -0
  4. ctrlrelay-0.1.5/.github/dependabot.yml +27 -0
  5. ctrlrelay-0.1.5/.github/workflows/build.yml +51 -0
  6. ctrlrelay-0.1.5/.github/workflows/cla.yml +28 -0
  7. ctrlrelay-0.1.5/.github/workflows/pages.yml +63 -0
  8. ctrlrelay-0.1.5/.github/workflows/publish.yml +67 -0
  9. ctrlrelay-0.1.5/.github/workflows/test.yml +45 -0
  10. ctrlrelay-0.1.5/.gitignore +39 -0
  11. ctrlrelay-0.1.5/CHANGELOG.md +416 -0
  12. ctrlrelay-0.1.5/CODE_OF_CONDUCT.md +81 -0
  13. ctrlrelay-0.1.5/CONTRIBUTING.md +244 -0
  14. ctrlrelay-0.1.5/LICENSE +201 -0
  15. ctrlrelay-0.1.5/PKG-INFO +251 -0
  16. ctrlrelay-0.1.5/README.md +212 -0
  17. ctrlrelay-0.1.5/SECURITY.md +50 -0
  18. ctrlrelay-0.1.5/config/orchestrator.yaml.example +53 -0
  19. ctrlrelay-0.1.5/docs/Gemfile +19 -0
  20. ctrlrelay-0.1.5/docs/_config.yml +59 -0
  21. ctrlrelay-0.1.5/docs/architecture.md +208 -0
  22. ctrlrelay-0.1.5/docs/bridge.md +202 -0
  23. ctrlrelay-0.1.5/docs/cli.md +227 -0
  24. ctrlrelay-0.1.5/docs/configuration.md +239 -0
  25. ctrlrelay-0.1.5/docs/development.md +156 -0
  26. ctrlrelay-0.1.5/docs/feedback-loop.md +194 -0
  27. ctrlrelay-0.1.5/docs/getting-started.md +168 -0
  28. ctrlrelay-0.1.5/docs/index.md +67 -0
  29. ctrlrelay-0.1.5/docs/operations.md +339 -0
  30. ctrlrelay-0.1.5/docs/reference/claude-code-project-guide.md +462 -0
  31. ctrlrelay-0.1.5/docs/reference/index.md +34 -0
  32. ctrlrelay-0.1.5/docs/reference/orchestrator-spec.md +631 -0
  33. ctrlrelay-0.1.5/docs/reference/plans/2026-04-17-dev-sync-phase0-package-skeleton.md +1300 -0
  34. ctrlrelay-0.1.5/docs/reference/plans/2026-04-17-dev-sync-phase1-checkpoint-audit.md +1511 -0
  35. ctrlrelay-0.1.5/docs/reference/plans/2026-04-17-dev-sync-phase2-telegram-bridge.md +1995 -0
  36. ctrlrelay-0.1.5/docs/reference/plans/2026-04-17-dev-sync-phase3-secops-pipeline.md +2330 -0
  37. ctrlrelay-0.1.5/docs/reference/plans/2026-04-17-dev-sync-phase4-dev-pipeline.md +2362 -0
  38. ctrlrelay-0.1.5/docs/reference/plans/index.md +24 -0
  39. ctrlrelay-0.1.5/docs/reference/specs/index.md +17 -0
  40. ctrlrelay-0.1.5/docs/reference/specs/orchestrator-design.md +518 -0
  41. ctrlrelay-0.1.5/pyproject.toml +71 -0
  42. ctrlrelay-0.1.5/src/ctrlrelay/__init__.py +8 -0
  43. ctrlrelay-0.1.5/src/ctrlrelay/bridge/__init__.py +21 -0
  44. ctrlrelay-0.1.5/src/ctrlrelay/bridge/__main__.py +69 -0
  45. ctrlrelay-0.1.5/src/ctrlrelay/bridge/protocol.py +75 -0
  46. ctrlrelay-0.1.5/src/ctrlrelay/bridge/server.py +285 -0
  47. ctrlrelay-0.1.5/src/ctrlrelay/bridge/telegram_handler.py +117 -0
  48. ctrlrelay-0.1.5/src/ctrlrelay/cli.py +1449 -0
  49. ctrlrelay-0.1.5/src/ctrlrelay/core/__init__.py +54 -0
  50. ctrlrelay-0.1.5/src/ctrlrelay/core/audit.py +257 -0
  51. ctrlrelay-0.1.5/src/ctrlrelay/core/checkpoint.py +155 -0
  52. ctrlrelay-0.1.5/src/ctrlrelay/core/config.py +291 -0
  53. ctrlrelay-0.1.5/src/ctrlrelay/core/dispatcher.py +202 -0
  54. ctrlrelay-0.1.5/src/ctrlrelay/core/github.py +272 -0
  55. ctrlrelay-0.1.5/src/ctrlrelay/core/obs.py +118 -0
  56. ctrlrelay-0.1.5/src/ctrlrelay/core/poller.py +319 -0
  57. ctrlrelay-0.1.5/src/ctrlrelay/core/pr_verifier.py +177 -0
  58. ctrlrelay-0.1.5/src/ctrlrelay/core/pr_watcher.py +121 -0
  59. ctrlrelay-0.1.5/src/ctrlrelay/core/scheduler.py +337 -0
  60. ctrlrelay-0.1.5/src/ctrlrelay/core/state.py +167 -0
  61. ctrlrelay-0.1.5/src/ctrlrelay/core/worktree.py +673 -0
  62. ctrlrelay-0.1.5/src/ctrlrelay/dashboard/__init__.py +5 -0
  63. ctrlrelay-0.1.5/src/ctrlrelay/dashboard/client.py +159 -0
  64. ctrlrelay-0.1.5/src/ctrlrelay/pipelines/__init__.py +15 -0
  65. ctrlrelay-0.1.5/src/ctrlrelay/pipelines/base.py +50 -0
  66. ctrlrelay-0.1.5/src/ctrlrelay/pipelines/dev.py +562 -0
  67. ctrlrelay-0.1.5/src/ctrlrelay/pipelines/post_merge.py +279 -0
  68. ctrlrelay-0.1.5/src/ctrlrelay/pipelines/secops.py +379 -0
  69. ctrlrelay-0.1.5/src/ctrlrelay/transports/__init__.py +33 -0
  70. ctrlrelay-0.1.5/src/ctrlrelay/transports/base.py +47 -0
  71. ctrlrelay-0.1.5/src/ctrlrelay/transports/file_mock.py +94 -0
  72. ctrlrelay-0.1.5/src/ctrlrelay/transports/socket_client.py +180 -0
  73. ctrlrelay-0.1.5/tests/__init__.py +1 -0
  74. ctrlrelay-0.1.5/tests/conftest.py +59 -0
  75. ctrlrelay-0.1.5/tests/test_audit.py +261 -0
  76. ctrlrelay-0.1.5/tests/test_bridge_protocol.py +85 -0
  77. ctrlrelay-0.1.5/tests/test_bridge_server.py +290 -0
  78. ctrlrelay-0.1.5/tests/test_checkpoint.py +202 -0
  79. ctrlrelay-0.1.5/tests/test_cli_dev.py +59 -0
  80. ctrlrelay-0.1.5/tests/test_cli_secops.py +17 -0
  81. ctrlrelay-0.1.5/tests/test_cli_start.py +673 -0
  82. ctrlrelay-0.1.5/tests/test_cli_version.py +22 -0
  83. ctrlrelay-0.1.5/tests/test_config.py +193 -0
  84. ctrlrelay-0.1.5/tests/test_dashboard_client.py +102 -0
  85. ctrlrelay-0.1.5/tests/test_dev_integration.py +426 -0
  86. ctrlrelay-0.1.5/tests/test_dev_pipeline.py +867 -0
  87. ctrlrelay-0.1.5/tests/test_dispatcher.py +169 -0
  88. ctrlrelay-0.1.5/tests/test_docs_site.py +112 -0
  89. ctrlrelay-0.1.5/tests/test_github.py +342 -0
  90. ctrlrelay-0.1.5/tests/test_obs.py +315 -0
  91. ctrlrelay-0.1.5/tests/test_pipeline_base.py +33 -0
  92. ctrlrelay-0.1.5/tests/test_poller.py +700 -0
  93. ctrlrelay-0.1.5/tests/test_post_merge.py +666 -0
  94. ctrlrelay-0.1.5/tests/test_pr_verifier.py +355 -0
  95. ctrlrelay-0.1.5/tests/test_pr_watcher.py +192 -0
  96. ctrlrelay-0.1.5/tests/test_scheduler.py +405 -0
  97. ctrlrelay-0.1.5/tests/test_secops_integration.py +95 -0
  98. ctrlrelay-0.1.5/tests/test_secops_pipeline.py +555 -0
  99. ctrlrelay-0.1.5/tests/test_state.py +88 -0
  100. ctrlrelay-0.1.5/tests/test_telegram_handler.py +45 -0
  101. ctrlrelay-0.1.5/tests/test_transport.py +171 -0
  102. ctrlrelay-0.1.5/tests/test_worktree.py +1018 -0
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Create a report to help us improve
4
+ title: '[BUG] '
5
+ labels: 'bug'
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Bug Description
10
+
11
+ A clear and concise description of what the bug is.
12
+
13
+ ## Steps to Reproduce
14
+
15
+ 1. Go to '...'
16
+ 2. Click on '...'
17
+ 3. Scroll down to '...'
18
+ 4. See error
19
+
20
+ ## Expected Behavior
21
+
22
+ A clear and concise description of what you expected to happen.
23
+
24
+ ## Actual Behavior
25
+
26
+ A clear and concise description of what actually happened.
27
+
28
+ ## Screenshots
29
+
30
+ If applicable, add screenshots to help explain your problem.
31
+
32
+ ## Environment
33
+
34
+ - **OS**: [e.g., macOS 13.0, Windows 11, Ubuntu 22.04]
35
+ - **Browser**: [e.g., Chrome 119, Firefox 120, Safari 17] (if applicable)
36
+ - **Version**: [e.g., 1.2.3]
37
+ - **Node Version**: [e.g., 18.17.0] (if applicable)
38
+
39
+ ## Additional Context
40
+
41
+ Add any other context about the problem here.
42
+
43
+ ## Possible Solution
44
+
45
+ If you have suggestions on how to fix the bug, please describe them here.
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: Feature Request
3
+ about: Suggest an idea for this project
4
+ title: '[FEATURE] '
5
+ labels: 'enhancement'
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Feature Description
10
+
11
+ A clear and concise description of the feature you'd like to see.
12
+
13
+ ## Problem Statement
14
+
15
+ Describe the problem this feature would solve. Ex. I'm always frustrated when [...]
16
+
17
+ ## Proposed Solution
18
+
19
+ A clear and concise description of what you want to happen.
20
+
21
+ ## Alternatives Considered
22
+
23
+ Describe any alternative solutions or features you've considered.
24
+
25
+ ## Use Case
26
+
27
+ Describe the use case(s) for this feature. Who would benefit from it and how?
28
+
29
+ ## Additional Context
30
+
31
+ Add any other context, screenshots, or examples about the feature request here.
32
+
33
+ ## Implementation Ideas
34
+
35
+ If you have ideas about how this could be implemented, please share them here.
36
+
37
+ ## Willingness to Contribute
38
+
39
+ - [ ] I am willing to help implement this feature
40
+ - [ ] I can help with documentation
41
+ - [ ] I can help with testing
@@ -0,0 +1,49 @@
1
+ # Description
2
+
3
+ Please include a summary of the changes and the related issue. Please also include relevant motivation and context.
4
+
5
+ Fixes # (issue)
6
+
7
+ ## Type of Change
8
+
9
+ Please delete options that are not relevant.
10
+
11
+ - [ ] Bug fix (non-breaking change which fixes an issue)
12
+ - [ ] New feature (non-breaking change which adds functionality)
13
+ - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
14
+ - [ ] Documentation update
15
+ - [ ] Performance improvement
16
+ - [ ] Code refactoring
17
+ - [ ] Dependency update
18
+
19
+ ## How Has This Been Tested?
20
+
21
+ Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce.
22
+
23
+ - [ ] Test A
24
+ - [ ] Test B
25
+
26
+ **Test Configuration**:
27
+ - OS:
28
+ - Node version:
29
+ - Other relevant details:
30
+
31
+ ## Checklist
32
+
33
+ - [ ] My code follows the style guidelines of this project
34
+ - [ ] I have performed a self-review of my own code
35
+ - [ ] I have commented my code, particularly in hard-to-understand areas
36
+ - [ ] I have made corresponding changes to the documentation
37
+ - [ ] My changes generate no new warnings
38
+ - [ ] I have added tests that prove my fix is effective or that my feature works
39
+ - [ ] New and existing unit tests pass locally with my changes
40
+ - [ ] Any dependent changes have been merged and published
41
+ - [ ] I have updated the CHANGELOG.md
42
+
43
+ ## Screenshots (if applicable)
44
+
45
+ Add screenshots to help explain your changes.
46
+
47
+ ## Additional Notes
48
+
49
+ Add any additional notes or context about the pull request here.
@@ -0,0 +1,27 @@
1
+ version: 2
2
+ updates:
3
+ # Weekly updates for our own GitHub Actions workflows.
4
+ - package-ecosystem: "github-actions"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ day: "monday"
9
+ labels:
10
+ - "dependencies"
11
+ - "github-actions"
12
+ commit-message:
13
+ prefix: "ci"
14
+
15
+ # Weekly updates for our Python runtime + dev dependencies.
16
+ - package-ecosystem: "pip"
17
+ directory: "/"
18
+ schedule:
19
+ interval: "weekly"
20
+ day: "monday"
21
+ labels:
22
+ - "dependencies"
23
+ - "python"
24
+ commit-message:
25
+ prefix: "chore(deps)"
26
+ # Respect our configured policies — patch auto, minor ask, major never.
27
+ versioning-strategy: "increase-if-necessary"
@@ -0,0 +1,51 @@
1
+ name: Build Python distribution
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ tags: ['v*']
7
+ pull_request:
8
+ release:
9
+ types: [published]
10
+
11
+ permissions:
12
+ contents: write
13
+
14
+ jobs:
15
+ build:
16
+ name: Build sdist and wheel
17
+ runs-on: ubuntu-latest
18
+
19
+ steps:
20
+ - name: Checkout
21
+ uses: actions/checkout@v6
22
+
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v7
25
+ with:
26
+ python-version: "3.12"
27
+
28
+ - name: Build sdist and wheel
29
+ run: uv build
30
+
31
+ - name: List built artifacts
32
+ run: ls -la dist/
33
+
34
+ - name: Upload distribution artifacts
35
+ uses: actions/upload-artifact@v7
36
+ with:
37
+ name: dist
38
+ path: dist/*
39
+ if-no-files-found: error
40
+
41
+ - name: Attach artifacts to GitHub release
42
+ if: github.event_name == 'release' || startsWith(github.ref, 'refs/tags/v')
43
+ env:
44
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
45
+ run: |
46
+ TAG="${GITHUB_REF#refs/tags/}"
47
+ if [ "$GITHUB_EVENT_NAME" = "release" ]; then
48
+ TAG="${{ github.event.release.tag_name }}"
49
+ fi
50
+ echo "Uploading dist/* to release ${TAG}"
51
+ gh release upload "${TAG}" dist/* --repo "${GITHUB_REPOSITORY}" --clobber
@@ -0,0 +1,28 @@
1
+ name: CLA Assistant
2
+
3
+ # Delegates to AInvirion's org-wide reusable CLA workflow, which wraps
4
+ # `contributor-assistant/github-action` and enforces the Contributor
5
+ # Assignment Agreement. See:
6
+ #
7
+ # https://github.com/AInvirion/.github/blob/main/.github/workflows/cla.yml
8
+ #
9
+ # Requirements (configured at the org level, not in this repo):
10
+ # - `CLA_TOKEN` organization secret with Contents + Pull requests
11
+ # write access.
12
+
13
+ on:
14
+ issue_comment:
15
+ types: [created]
16
+ pull_request_target:
17
+ types: [opened, synchronize, reopened]
18
+
19
+ permissions:
20
+ contents: write
21
+ pull-requests: write
22
+ actions: read
23
+
24
+ jobs:
25
+ cla:
26
+ uses: AInvirion/.github/.github/workflows/cla.yml@main
27
+ secrets:
28
+ CLA_TOKEN: ${{ secrets.CLA_TOKEN }}
@@ -0,0 +1,63 @@
1
+ name: Deploy docs to GitHub Pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - "docs/**"
8
+ - ".github/workflows/pages.yml"
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+ pages: write
14
+ id-token: write
15
+
16
+ concurrency:
17
+ group: pages
18
+ cancel-in-progress: false
19
+
20
+ jobs:
21
+ build:
22
+ runs-on: ubuntu-latest
23
+ defaults:
24
+ run:
25
+ working-directory: docs
26
+ steps:
27
+ - name: Checkout
28
+ uses: actions/checkout@v6
29
+
30
+ - name: Setup Ruby
31
+ uses: ruby/setup-ruby@v1
32
+ with:
33
+ ruby-version: "3.3"
34
+ bundler-cache: true
35
+ working-directory: docs
36
+
37
+ - name: Setup Pages
38
+ id: pages
39
+ uses: actions/configure-pages@v6
40
+
41
+ - name: Build site
42
+ env:
43
+ JEKYLL_ENV: production
44
+ run: |
45
+ bundle exec jekyll build \
46
+ --source . \
47
+ --destination ./_site
48
+
49
+ - name: Upload artifact
50
+ uses: actions/upload-pages-artifact@v3
51
+ with:
52
+ path: docs/_site
53
+
54
+ deploy:
55
+ needs: build
56
+ runs-on: ubuntu-latest
57
+ environment:
58
+ name: github-pages
59
+ url: ${{ steps.deployment.outputs.page_url }}
60
+ steps:
61
+ - name: Deploy to GitHub Pages
62
+ id: deployment
63
+ uses: actions/deploy-pages@v5
@@ -0,0 +1,67 @@
1
+ name: Publish to PyPI
2
+
3
+ # Publishes the built sdist + wheel to PyPI on every GitHub release.
4
+ #
5
+ # Uses PyPI Trusted Publishing (OIDC) — no API tokens stored as GitHub
6
+ # secrets. The project must be registered on PyPI with a trusted
7
+ # publisher pointing at this exact workflow:
8
+ #
9
+ # Project: ctrlrelay
10
+ # Owner: AInvirion
11
+ # Repository: ctrlrelay
12
+ # Workflow: publish.yml
13
+ # Environment: pypi
14
+ #
15
+ # The `pypi` environment adds a manual approval gate — releases pause
16
+ # at the "Publish" step until a repo maintainer approves, so a
17
+ # compromised tag alone can't silently push to PyPI.
18
+
19
+ on:
20
+ release:
21
+ types: [published]
22
+
23
+ permissions:
24
+ contents: read
25
+
26
+ jobs:
27
+ build:
28
+ name: Build sdist and wheel
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - name: Checkout
32
+ uses: actions/checkout@v6
33
+
34
+ - name: Install uv
35
+ uses: astral-sh/setup-uv@v7
36
+ with:
37
+ python-version: "3.12"
38
+
39
+ - name: Build
40
+ run: uv build
41
+
42
+ - name: Upload artifacts
43
+ uses: actions/upload-artifact@v7
44
+ with:
45
+ name: dist
46
+ path: dist/*
47
+ if-no-files-found: error
48
+
49
+ publish:
50
+ name: Publish to PyPI
51
+ needs: build
52
+ runs-on: ubuntu-latest
53
+ environment:
54
+ name: pypi
55
+ url: https://pypi.org/project/ctrlrelay/
56
+ permissions:
57
+ id-token: write # required for OIDC token exchange with PyPI
58
+
59
+ steps:
60
+ - name: Download built artifacts
61
+ uses: actions/download-artifact@v8
62
+ with:
63
+ name: dist
64
+ path: dist/
65
+
66
+ - name: Publish to PyPI (trusted publishing)
67
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,45 @@
1
+ name: Tests and lint
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ test:
13
+ name: pytest + ruff
14
+ runs-on: ubuntu-latest
15
+
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v6
19
+
20
+ - name: Install uv
21
+ uses: astral-sh/setup-uv@v7
22
+ with:
23
+ python-version: "3.12"
24
+
25
+ - name: Create virtual environment
26
+ # setup-uv@v7 dropped the implicit auto-venv that v5 created via
27
+ # VIRTUAL_ENV. Ubuntu 24.04's system Python is PEP 668 marked
28
+ # ("externally managed") so --system also fails. Create our own
29
+ # venv explicitly; uv exports VIRTUAL_ENV so subsequent uv pip /
30
+ # uv run steps pick it up automatically.
31
+ run: uv venv
32
+
33
+ - name: Install project with dev extras
34
+ run: uv pip install -e ".[dev]"
35
+
36
+ - name: Ruff lint
37
+ run: uv run ruff check src/ tests/
38
+
39
+ - name: Pytest
40
+ # Deselect the pre-existing unrelated docs-site test that asserts
41
+ # nav_order uniqueness across docs/ — tracked separately and
42
+ # unchanged by this PR.
43
+ run: |
44
+ uv run pytest tests/ -v \
45
+ --deselect tests/test_docs_site.py::test_nav_order_unique_per_sibling_group
@@ -0,0 +1,39 @@
1
+ *.swp
2
+ *.swo
3
+ .DS_Store
4
+ node_modules/
5
+
6
+ # Python
7
+ __pycache__/
8
+ *.pyc
9
+ *.pyo
10
+ .coverage
11
+
12
+ # IDE
13
+ .idea/
14
+ .vscode/
15
+
16
+ # Claude local state (worktrees, sessions, etc.)
17
+ .claude/
18
+
19
+ # Jekyll (docs site)
20
+ docs/_site/
21
+ docs/.jekyll-cache/
22
+ docs/.jekyll-metadata
23
+ docs/vendor/
24
+ docs/Gemfile.lock
25
+
26
+ # Backup of old config system
27
+ bkp/
28
+
29
+ # Operator-specific config — ship only the .example. The real file
30
+ # contains personal chat_id, private repo list, and local paths.
31
+ config/orchestrator.yaml
32
+
33
+ # Historic local artifact — not consumed by ctrlrelay itself. Keeps a
34
+ # local list of repos to clone; no reason to track it publicly.
35
+ repos.manifest
36
+
37
+
38
+ # Lock file — not committed per AInvirion Python-SDK convention.
39
+ uv.lock