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.
- ctrlrelay-0.1.5/.github/ISSUE_TEMPLATE/bug_report.md +45 -0
- ctrlrelay-0.1.5/.github/ISSUE_TEMPLATE/feature_request.md +41 -0
- ctrlrelay-0.1.5/.github/PULL_REQUEST_TEMPLATE.md +49 -0
- ctrlrelay-0.1.5/.github/dependabot.yml +27 -0
- ctrlrelay-0.1.5/.github/workflows/build.yml +51 -0
- ctrlrelay-0.1.5/.github/workflows/cla.yml +28 -0
- ctrlrelay-0.1.5/.github/workflows/pages.yml +63 -0
- ctrlrelay-0.1.5/.github/workflows/publish.yml +67 -0
- ctrlrelay-0.1.5/.github/workflows/test.yml +45 -0
- ctrlrelay-0.1.5/.gitignore +39 -0
- ctrlrelay-0.1.5/CHANGELOG.md +416 -0
- ctrlrelay-0.1.5/CODE_OF_CONDUCT.md +81 -0
- ctrlrelay-0.1.5/CONTRIBUTING.md +244 -0
- ctrlrelay-0.1.5/LICENSE +201 -0
- ctrlrelay-0.1.5/PKG-INFO +251 -0
- ctrlrelay-0.1.5/README.md +212 -0
- ctrlrelay-0.1.5/SECURITY.md +50 -0
- ctrlrelay-0.1.5/config/orchestrator.yaml.example +53 -0
- ctrlrelay-0.1.5/docs/Gemfile +19 -0
- ctrlrelay-0.1.5/docs/_config.yml +59 -0
- ctrlrelay-0.1.5/docs/architecture.md +208 -0
- ctrlrelay-0.1.5/docs/bridge.md +202 -0
- ctrlrelay-0.1.5/docs/cli.md +227 -0
- ctrlrelay-0.1.5/docs/configuration.md +239 -0
- ctrlrelay-0.1.5/docs/development.md +156 -0
- ctrlrelay-0.1.5/docs/feedback-loop.md +194 -0
- ctrlrelay-0.1.5/docs/getting-started.md +168 -0
- ctrlrelay-0.1.5/docs/index.md +67 -0
- ctrlrelay-0.1.5/docs/operations.md +339 -0
- ctrlrelay-0.1.5/docs/reference/claude-code-project-guide.md +462 -0
- ctrlrelay-0.1.5/docs/reference/index.md +34 -0
- ctrlrelay-0.1.5/docs/reference/orchestrator-spec.md +631 -0
- ctrlrelay-0.1.5/docs/reference/plans/2026-04-17-dev-sync-phase0-package-skeleton.md +1300 -0
- ctrlrelay-0.1.5/docs/reference/plans/2026-04-17-dev-sync-phase1-checkpoint-audit.md +1511 -0
- ctrlrelay-0.1.5/docs/reference/plans/2026-04-17-dev-sync-phase2-telegram-bridge.md +1995 -0
- ctrlrelay-0.1.5/docs/reference/plans/2026-04-17-dev-sync-phase3-secops-pipeline.md +2330 -0
- ctrlrelay-0.1.5/docs/reference/plans/2026-04-17-dev-sync-phase4-dev-pipeline.md +2362 -0
- ctrlrelay-0.1.5/docs/reference/plans/index.md +24 -0
- ctrlrelay-0.1.5/docs/reference/specs/index.md +17 -0
- ctrlrelay-0.1.5/docs/reference/specs/orchestrator-design.md +518 -0
- ctrlrelay-0.1.5/pyproject.toml +71 -0
- ctrlrelay-0.1.5/src/ctrlrelay/__init__.py +8 -0
- ctrlrelay-0.1.5/src/ctrlrelay/bridge/__init__.py +21 -0
- ctrlrelay-0.1.5/src/ctrlrelay/bridge/__main__.py +69 -0
- ctrlrelay-0.1.5/src/ctrlrelay/bridge/protocol.py +75 -0
- ctrlrelay-0.1.5/src/ctrlrelay/bridge/server.py +285 -0
- ctrlrelay-0.1.5/src/ctrlrelay/bridge/telegram_handler.py +117 -0
- ctrlrelay-0.1.5/src/ctrlrelay/cli.py +1449 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/__init__.py +54 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/audit.py +257 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/checkpoint.py +155 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/config.py +291 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/dispatcher.py +202 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/github.py +272 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/obs.py +118 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/poller.py +319 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/pr_verifier.py +177 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/pr_watcher.py +121 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/scheduler.py +337 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/state.py +167 -0
- ctrlrelay-0.1.5/src/ctrlrelay/core/worktree.py +673 -0
- ctrlrelay-0.1.5/src/ctrlrelay/dashboard/__init__.py +5 -0
- ctrlrelay-0.1.5/src/ctrlrelay/dashboard/client.py +159 -0
- ctrlrelay-0.1.5/src/ctrlrelay/pipelines/__init__.py +15 -0
- ctrlrelay-0.1.5/src/ctrlrelay/pipelines/base.py +50 -0
- ctrlrelay-0.1.5/src/ctrlrelay/pipelines/dev.py +562 -0
- ctrlrelay-0.1.5/src/ctrlrelay/pipelines/post_merge.py +279 -0
- ctrlrelay-0.1.5/src/ctrlrelay/pipelines/secops.py +379 -0
- ctrlrelay-0.1.5/src/ctrlrelay/transports/__init__.py +33 -0
- ctrlrelay-0.1.5/src/ctrlrelay/transports/base.py +47 -0
- ctrlrelay-0.1.5/src/ctrlrelay/transports/file_mock.py +94 -0
- ctrlrelay-0.1.5/src/ctrlrelay/transports/socket_client.py +180 -0
- ctrlrelay-0.1.5/tests/__init__.py +1 -0
- ctrlrelay-0.1.5/tests/conftest.py +59 -0
- ctrlrelay-0.1.5/tests/test_audit.py +261 -0
- ctrlrelay-0.1.5/tests/test_bridge_protocol.py +85 -0
- ctrlrelay-0.1.5/tests/test_bridge_server.py +290 -0
- ctrlrelay-0.1.5/tests/test_checkpoint.py +202 -0
- ctrlrelay-0.1.5/tests/test_cli_dev.py +59 -0
- ctrlrelay-0.1.5/tests/test_cli_secops.py +17 -0
- ctrlrelay-0.1.5/tests/test_cli_start.py +673 -0
- ctrlrelay-0.1.5/tests/test_cli_version.py +22 -0
- ctrlrelay-0.1.5/tests/test_config.py +193 -0
- ctrlrelay-0.1.5/tests/test_dashboard_client.py +102 -0
- ctrlrelay-0.1.5/tests/test_dev_integration.py +426 -0
- ctrlrelay-0.1.5/tests/test_dev_pipeline.py +867 -0
- ctrlrelay-0.1.5/tests/test_dispatcher.py +169 -0
- ctrlrelay-0.1.5/tests/test_docs_site.py +112 -0
- ctrlrelay-0.1.5/tests/test_github.py +342 -0
- ctrlrelay-0.1.5/tests/test_obs.py +315 -0
- ctrlrelay-0.1.5/tests/test_pipeline_base.py +33 -0
- ctrlrelay-0.1.5/tests/test_poller.py +700 -0
- ctrlrelay-0.1.5/tests/test_post_merge.py +666 -0
- ctrlrelay-0.1.5/tests/test_pr_verifier.py +355 -0
- ctrlrelay-0.1.5/tests/test_pr_watcher.py +192 -0
- ctrlrelay-0.1.5/tests/test_scheduler.py +405 -0
- ctrlrelay-0.1.5/tests/test_secops_integration.py +95 -0
- ctrlrelay-0.1.5/tests/test_secops_pipeline.py +555 -0
- ctrlrelay-0.1.5/tests/test_state.py +88 -0
- ctrlrelay-0.1.5/tests/test_telegram_handler.py +45 -0
- ctrlrelay-0.1.5/tests/test_transport.py +171 -0
- 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
|