sp-local-bridge 0.2.1__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.
- sp_local_bridge-0.2.1/.editorconfig +18 -0
- sp_local_bridge-0.2.1/.github/dependabot.yml +18 -0
- sp_local_bridge-0.2.1/.github/workflows/ci.yml +54 -0
- sp_local_bridge-0.2.1/.github/workflows/docs.yml +53 -0
- sp_local_bridge-0.2.1/.github/workflows/release.yml +81 -0
- sp_local_bridge-0.2.1/.gitignore +66 -0
- sp_local_bridge-0.2.1/.pre-commit-config.yaml +20 -0
- sp_local_bridge-0.2.1/.python-version +1 -0
- sp_local_bridge-0.2.1/AGENTS.md +62 -0
- sp_local_bridge-0.2.1/CHANGELOG.md +82 -0
- sp_local_bridge-0.2.1/CLAUDE.md +3 -0
- sp_local_bridge-0.2.1/LICENSE +21 -0
- sp_local_bridge-0.2.1/Makefile +53 -0
- sp_local_bridge-0.2.1/PKG-INFO +124 -0
- sp_local_bridge-0.2.1/README.md +101 -0
- sp_local_bridge-0.2.1/docs/architecture.md +46 -0
- sp_local_bridge-0.2.1/docs/getting-started.md +100 -0
- sp_local_bridge-0.2.1/docs/hosts/claude-desktop.md +79 -0
- sp_local_bridge-0.2.1/docs/hosts/codex.md +80 -0
- sp_local_bridge-0.2.1/docs/hosts/index.md +27 -0
- sp_local_bridge-0.2.1/docs/hosts/vscode-copilot.md +76 -0
- sp_local_bridge-0.2.1/docs/index.md +20 -0
- sp_local_bridge-0.2.1/docs/operations.md +245 -0
- sp_local_bridge-0.2.1/docs/security.md +51 -0
- sp_local_bridge-0.2.1/docs/troubleshooting.md +96 -0
- sp_local_bridge-0.2.1/docs/validation.md +122 -0
- sp_local_bridge-0.2.1/package-lock.json +2550 -0
- sp_local_bridge-0.2.1/package.json +13 -0
- sp_local_bridge-0.2.1/pyproject.toml +84 -0
- sp_local_bridge-0.2.1/scripts/install.sh +254 -0
- sp_local_bridge-0.2.1/scripts/uninstall.sh +122 -0
- sp_local_bridge-0.2.1/skills/sp-local-bridge-setup/SKILL.md +136 -0
- sp_local_bridge-0.2.1/skills/sp-local-bridge-setup/manifest.yaml +7 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/__init__.py +3 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/__main__.py +6 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/adapters/__init__.py +1 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/adapters/mcp_server.py +358 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/cli.py +207 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/core/__init__.py +6 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/core/errors.py +26 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/core/models.py +40 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/core/operations.py +24 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/core/service.py +373 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/diagnostics/__init__.py +1 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/diagnostics/configure.py +374 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/diagnostics/doctor.py +179 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/diagnostics/host_config.py +220 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/sp_rest/__init__.py +5 -0
- sp_local_bridge-0.2.1/src/sp_local_bridge/sp_rest/client.py +164 -0
- sp_local_bridge-0.2.1/tests/__init__.py +0 -0
- sp_local_bridge-0.2.1/tests/conftest.py +17 -0
- sp_local_bridge-0.2.1/tests/fixtures/app-not-ready-error.json +7 -0
- sp_local_bridge-0.2.1/tests/fixtures/health-ok.json +6 -0
- sp_local_bridge-0.2.1/tests/fixtures/project-list-ok.json +16 -0
- sp_local_bridge-0.2.1/tests/fixtures/status-ok.json +7 -0
- sp_local_bridge-0.2.1/tests/fixtures/tag-list-ok.json +12 -0
- sp_local_bridge-0.2.1/tests/fixtures/task-create-error-with-details.json +8 -0
- sp_local_bridge-0.2.1/tests/fixtures/task-create-error.json +7 -0
- sp_local_bridge-0.2.1/tests/fixtures/task-create-ok.json +12 -0
- sp_local_bridge-0.2.1/tests/fixtures/task-create-request.json +7 -0
- sp_local_bridge-0.2.1/tests/fixtures/task-list-ok.json +24 -0
- sp_local_bridge-0.2.1/tests/fixtures/task-update-ok.json +12 -0
- sp_local_bridge-0.2.1/tests/fixtures/task-update-request.json +4 -0
- sp_local_bridge-0.2.1/tests/test_cli.py +218 -0
- sp_local_bridge-0.2.1/tests/test_configure.py +335 -0
- sp_local_bridge-0.2.1/tests/test_core_models.py +64 -0
- sp_local_bridge-0.2.1/tests/test_core_service.py +719 -0
- sp_local_bridge-0.2.1/tests/test_doctor.py +190 -0
- sp_local_bridge-0.2.1/tests/test_host_config.py +182 -0
- sp_local_bridge-0.2.1/tests/test_install_scripts.py +260 -0
- sp_local_bridge-0.2.1/tests/test_mcp_adapter.py +194 -0
- sp_local_bridge-0.2.1/tests/test_mcp_protocol.py +302 -0
- sp_local_bridge-0.2.1/tests/test_rest_client.py +184 -0
- sp_local_bridge-0.2.1/tests/test_smoke.py +23 -0
- sp_local_bridge-0.2.1/uv.lock +1184 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
root = true
|
|
2
|
+
|
|
3
|
+
[*]
|
|
4
|
+
end_of_line = lf
|
|
5
|
+
insert_final_newline = true
|
|
6
|
+
trim_trailing_whitespace = true
|
|
7
|
+
charset = utf-8
|
|
8
|
+
|
|
9
|
+
[*.py]
|
|
10
|
+
indent_style = space
|
|
11
|
+
indent_size = 4
|
|
12
|
+
|
|
13
|
+
[*.{js,json,yaml,yml,toml,md}]
|
|
14
|
+
indent_style = space
|
|
15
|
+
indent_size = 2
|
|
16
|
+
|
|
17
|
+
[Makefile]
|
|
18
|
+
indent_style = tab
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "pip"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
groups:
|
|
8
|
+
dev-deps:
|
|
9
|
+
patterns:
|
|
10
|
+
- "ruff"
|
|
11
|
+
- "pyright"
|
|
12
|
+
- "pytest*"
|
|
13
|
+
- "pre-commit"
|
|
14
|
+
|
|
15
|
+
- package-ecosystem: "github-actions"
|
|
16
|
+
directory: "/"
|
|
17
|
+
schedule:
|
|
18
|
+
interval: "weekly"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
# Least privilege by default: these jobs only read the repository.
|
|
10
|
+
# A job needing more declares it itself, so the elevation stays visible
|
|
11
|
+
# at the job that uses it.
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
check:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
strategy:
|
|
19
|
+
matrix:
|
|
20
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v7
|
|
23
|
+
|
|
24
|
+
- uses: astral-sh/setup-uv@v7
|
|
25
|
+
with:
|
|
26
|
+
version: "latest"
|
|
27
|
+
|
|
28
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
29
|
+
run: uv python install ${{ matrix.python-version }}
|
|
30
|
+
|
|
31
|
+
- name: Install dependencies
|
|
32
|
+
run: uv sync --python ${{ matrix.python-version }}
|
|
33
|
+
|
|
34
|
+
- name: Format check
|
|
35
|
+
run: uv run ruff format --check .
|
|
36
|
+
|
|
37
|
+
- name: Lint
|
|
38
|
+
run: uv run ruff check .
|
|
39
|
+
|
|
40
|
+
- name: Type check
|
|
41
|
+
run: uv run pyright
|
|
42
|
+
|
|
43
|
+
- name: Test
|
|
44
|
+
run: uv run pytest --cov --cov-report=xml
|
|
45
|
+
|
|
46
|
+
- name: Build
|
|
47
|
+
run: uv build --quiet
|
|
48
|
+
|
|
49
|
+
- name: Upload coverage
|
|
50
|
+
if: matrix.python-version == '3.11'
|
|
51
|
+
uses: actions/upload-artifact@v7
|
|
52
|
+
with:
|
|
53
|
+
name: coverage-report
|
|
54
|
+
path: coverage.xml
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- 'docs/**'
|
|
8
|
+
- 'package.json'
|
|
9
|
+
- 'package-lock.json'
|
|
10
|
+
- '.github/workflows/docs.yml'
|
|
11
|
+
workflow_dispatch:
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
pages: write
|
|
16
|
+
id-token: write
|
|
17
|
+
|
|
18
|
+
concurrency:
|
|
19
|
+
group: pages
|
|
20
|
+
cancel-in-progress: false
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
build:
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v7
|
|
27
|
+
|
|
28
|
+
- uses: actions/setup-node@v7
|
|
29
|
+
with:
|
|
30
|
+
node-version: 22
|
|
31
|
+
|
|
32
|
+
- name: Install dependencies
|
|
33
|
+
run: npm ci
|
|
34
|
+
|
|
35
|
+
- name: Build docs
|
|
36
|
+
run: npm run docs:build
|
|
37
|
+
|
|
38
|
+
- uses: actions/configure-pages@v6
|
|
39
|
+
|
|
40
|
+
- uses: actions/upload-pages-artifact@v5
|
|
41
|
+
with:
|
|
42
|
+
path: docs/.vitepress/dist
|
|
43
|
+
|
|
44
|
+
deploy:
|
|
45
|
+
needs: build
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
environment:
|
|
48
|
+
name: github-pages
|
|
49
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
50
|
+
steps:
|
|
51
|
+
- name: Deploy to GitHub Pages
|
|
52
|
+
id: deployment
|
|
53
|
+
uses: actions/deploy-pages@v5
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
# Least privilege by default; the publish job adds id-token for PyPI's
|
|
9
|
+
# trusted publishing and nothing else.
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
build:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
permissions:
|
|
17
|
+
contents: write
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v7
|
|
20
|
+
|
|
21
|
+
- name: Install uv
|
|
22
|
+
uses: astral-sh/setup-uv@v7
|
|
23
|
+
|
|
24
|
+
- name: Set up Python
|
|
25
|
+
run: uv python install 3.11
|
|
26
|
+
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: uv sync
|
|
29
|
+
|
|
30
|
+
- name: Run checks
|
|
31
|
+
run: |
|
|
32
|
+
uv run ruff format --check .
|
|
33
|
+
uv run ruff check .
|
|
34
|
+
uv run pyright
|
|
35
|
+
uv run pytest
|
|
36
|
+
|
|
37
|
+
- name: Build package
|
|
38
|
+
run: uv build
|
|
39
|
+
|
|
40
|
+
- name: Generate checksums
|
|
41
|
+
run: |
|
|
42
|
+
cd dist
|
|
43
|
+
sha256sum * > SHA256SUMS
|
|
44
|
+
|
|
45
|
+
- name: Create GitHub Release
|
|
46
|
+
uses: softprops/action-gh-release@v3
|
|
47
|
+
with:
|
|
48
|
+
generate_release_notes: true
|
|
49
|
+
files: |
|
|
50
|
+
dist/*.whl
|
|
51
|
+
dist/*.tar.gz
|
|
52
|
+
dist/SHA256SUMS
|
|
53
|
+
|
|
54
|
+
# Only the distributions — pypi-publish rejects a directory containing
|
|
55
|
+
# anything else, and SHA256SUMS is not a distribution.
|
|
56
|
+
- name: Upload distributions
|
|
57
|
+
uses: actions/upload-artifact@v4
|
|
58
|
+
with:
|
|
59
|
+
name: python-package-distributions
|
|
60
|
+
path: |
|
|
61
|
+
dist/*.whl
|
|
62
|
+
dist/*.tar.gz
|
|
63
|
+
|
|
64
|
+
pypi:
|
|
65
|
+
needs: build
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
# Must match the PyPI trusted publisher configuration exactly: this
|
|
68
|
+
# workflow filename and this environment name are both part of the claim
|
|
69
|
+
# PyPI verifies.
|
|
70
|
+
environment: pypi
|
|
71
|
+
permissions:
|
|
72
|
+
id-token: write
|
|
73
|
+
steps:
|
|
74
|
+
- name: Download distributions
|
|
75
|
+
uses: actions/download-artifact@v4
|
|
76
|
+
with:
|
|
77
|
+
name: python-package-distributions
|
|
78
|
+
path: dist/
|
|
79
|
+
|
|
80
|
+
- name: Publish to PyPI
|
|
81
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
*.egg-info/
|
|
7
|
+
*.egg
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
MANIFEST
|
|
11
|
+
|
|
12
|
+
# Node (docs site only)
|
|
13
|
+
node_modules/
|
|
14
|
+
docs/.vitepress/dist/
|
|
15
|
+
docs/.vitepress/cache/
|
|
16
|
+
docs/.vitepress/.temp/
|
|
17
|
+
|
|
18
|
+
# Virtual environments
|
|
19
|
+
.venv/
|
|
20
|
+
venv/
|
|
21
|
+
env/
|
|
22
|
+
|
|
23
|
+
# Type checkers
|
|
24
|
+
.mypy_cache/
|
|
25
|
+
.pytype/
|
|
26
|
+
.pyre/
|
|
27
|
+
|
|
28
|
+
# Testing / coverage
|
|
29
|
+
.pytest_cache/
|
|
30
|
+
.coverage
|
|
31
|
+
.coverage.*
|
|
32
|
+
htmlcov/
|
|
33
|
+
coverage.xml
|
|
34
|
+
|
|
35
|
+
# Ruff
|
|
36
|
+
.ruff_cache/
|
|
37
|
+
|
|
38
|
+
# IDE
|
|
39
|
+
.idea/
|
|
40
|
+
.vscode/
|
|
41
|
+
*.swp
|
|
42
|
+
*.swo
|
|
43
|
+
|
|
44
|
+
# OS
|
|
45
|
+
.DS_Store
|
|
46
|
+
Thumbs.db
|
|
47
|
+
|
|
48
|
+
# Environments / secrets
|
|
49
|
+
.env
|
|
50
|
+
.envrc
|
|
51
|
+
|
|
52
|
+
# Build artifacts
|
|
53
|
+
*.whl
|
|
54
|
+
|
|
55
|
+
# Personal working files (planning, research, notes)
|
|
56
|
+
working/
|
|
57
|
+
|
|
58
|
+
# Reference repos (cloned for development reference)
|
|
59
|
+
refs/
|
|
60
|
+
|
|
61
|
+
# Plugin (not shipped until fallback implementation exists)
|
|
62
|
+
plugin/
|
|
63
|
+
|
|
64
|
+
# VitePress (docs site)
|
|
65
|
+
.vitepress
|
|
66
|
+
.temp
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v5.0.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: trailing-whitespace
|
|
6
|
+
- id: end-of-file-fixer
|
|
7
|
+
- id: check-yaml
|
|
8
|
+
- id: check-toml
|
|
9
|
+
- id: check-json
|
|
10
|
+
- id: check-added-large-files
|
|
11
|
+
args: [--maxkb=500]
|
|
12
|
+
- id: check-merge-conflict
|
|
13
|
+
- id: debug-statements
|
|
14
|
+
|
|
15
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
16
|
+
rev: v0.11.12
|
|
17
|
+
hooks:
|
|
18
|
+
- id: ruff-format
|
|
19
|
+
- id: ruff
|
|
20
|
+
args: [--fix]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.11
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
Instructions for AI coding agents working in this repository.
|
|
4
|
+
|
|
5
|
+
## Project
|
|
6
|
+
|
|
7
|
+
Super Productivity Local Bridge — a local automation bridge for the Super Productivity desktop app. Uses the SP Local REST API (`http://127.0.0.1:3876`) as the primary app-control path, with MCP as one thin host adapter.
|
|
8
|
+
|
|
9
|
+
## Stack
|
|
10
|
+
|
|
11
|
+
- **Python 3.11+** with `uv` for environment/dependency management
|
|
12
|
+
- **Pydantic** for models and validation
|
|
13
|
+
- **httpx** for the SP Local REST client
|
|
14
|
+
- **MCP Python SDK** for the MCP adapter (stdio transport)
|
|
15
|
+
- **Ruff** for formatting and linting
|
|
16
|
+
- **Pyright** for type checking
|
|
17
|
+
- **Pytest** for testing
|
|
18
|
+
|
|
19
|
+
## Layout
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
src/sp_local_bridge/ Python package (src layout)
|
|
23
|
+
core/ Core operation models, errors, service
|
|
24
|
+
sp_rest/ SP Local REST API client
|
|
25
|
+
adapters/ Host adapters (MCP server)
|
|
26
|
+
diagnostics/ Doctor, health checks
|
|
27
|
+
cli.py CLI entry point
|
|
28
|
+
tests/ Pytest tests
|
|
29
|
+
scripts/ Install/uninstall shell scripts
|
|
30
|
+
docs/ Documentation + host guides
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Commands
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
uv sync # Install deps (creates .venv)
|
|
37
|
+
uv run ruff format . # Format
|
|
38
|
+
uv run ruff check . # Lint
|
|
39
|
+
uv run pyright # Type check
|
|
40
|
+
uv run pytest # Test
|
|
41
|
+
uv run pytest --cov # Test with coverage
|
|
42
|
+
make check # Run all checks (format, lint, types, tests)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Conventions
|
|
46
|
+
|
|
47
|
+
- All Python code lives under `src/sp_local_bridge/` (src layout).
|
|
48
|
+
- Use pydantic BaseModel for data structures crossing boundaries.
|
|
49
|
+
- Use `httpx.AsyncClient` for HTTP calls to SP.
|
|
50
|
+
- MCP adapter is thin — all logic lives in `core/`.
|
|
51
|
+
- No Claude/agent-specific language in tool descriptions or core code.
|
|
52
|
+
- Use SP-native camelCase field names at REST boundaries (`projectId`, `tagIds`).
|
|
53
|
+
- Type annotations on all public functions.
|
|
54
|
+
- Tests in `tests/` mirror `src/` structure.
|
|
55
|
+
|
|
56
|
+
## Do NOT
|
|
57
|
+
|
|
58
|
+
- Add runtime deps without discussing (the dep tree is intentionally small).
|
|
59
|
+
- Put business logic in the MCP adapter.
|
|
60
|
+
- Reference specific AI hosts (Claude, Cursor, etc.) outside `docs/hosts/`.
|
|
61
|
+
- Create files named after phases or milestones.
|
|
62
|
+
- Commit `.venv/`, `working/`, `refs/`, or build artifacts.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.2.1] — 2026-09-05
|
|
9
|
+
|
|
10
|
+
Final release. The project is archived; this version exists so the package name
|
|
11
|
+
is registered on PyPI and cannot be claimed by anyone else.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Publish to PyPI from CI using trusted publishing (OIDC), so the distribution
|
|
16
|
+
that carries this name has verifiable provenance. Earlier releases were
|
|
17
|
+
GitHub Release artifacts only — the name was never registered on PyPI, which
|
|
18
|
+
left it available for anyone to take.
|
|
19
|
+
- The release is **yanked** on PyPI: the name stays reserved, but resolvers skip
|
|
20
|
+
it, so it will not be installed by accident. An exact pin
|
|
21
|
+
(`sp-local-bridge==0.2.1`) still resolves for anyone who genuinely needs it.
|
|
22
|
+
|
|
23
|
+
### Note
|
|
24
|
+
|
|
25
|
+
No functional changes. Use
|
|
26
|
+
[super-productivity-local-gobridge](https://github.com/CameronBrooks11/super-productivity-local-gobridge)
|
|
27
|
+
instead.
|
|
28
|
+
|
|
29
|
+
## [0.2.0] — 2026-05-31
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
- **Task list filters**: `query`, `projectId`, `tagId`, `includeDone`, `source` parameters on `task.list`
|
|
34
|
+
- **Time fields**: `timeEstimate` and `timeSpent` (milliseconds, non-negative) on `task.create` and `task.update`
|
|
35
|
+
- **Current task**: `task.get_current` to read the active task, `task.set_current` to set or clear it
|
|
36
|
+
- **Status read**: `status.get` operation for SP application status summary
|
|
37
|
+
- **Project/tag search**: `query` parameter on `project.list` and `tag.list`
|
|
38
|
+
- MCP tools: `get_status`, `get_current_task`, `set_current_task`
|
|
39
|
+
- CLI commands: `status`, `tasks current`, `tasks set-current <id>`, `tasks clear-current`, filter flags on `tasks list`, `--query` on `projects list` / `tags list`
|
|
40
|
+
- 46 new tests (212 total)
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
|
|
44
|
+
- Operation count: 13 → 16
|
|
45
|
+
- `task.list` now accepts optional filter payload (previously rejected any payload)
|
|
46
|
+
- `project.list` and `tag.list` now accept optional `query` payload
|
|
47
|
+
|
|
48
|
+
## [0.1.1] — 2026-05-31
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- `sp-local-bridge-configure` command for auto-writing MCP config to host files
|
|
53
|
+
- Agent setup skill (`skills/sp-local-bridge-setup/`) for guided installation
|
|
54
|
+
- Regression tests for TOML preservation, doctor parse-error handling, uninstall ordering
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- TOML auto-config: surgical write now only touches `[mcp_servers.superProductivity]`, preserving all other file content including inline tables, env maps, and numbers
|
|
59
|
+
- TOML auto-config: malformed existing TOML fails closed (error code 1) instead of silently appending
|
|
60
|
+
- TOML auto-config: removal now deletes descendant tables (e.g. `[mcp_servers.superProductivity.env]`)
|
|
61
|
+
- Doctor: malformed host config produces a failed diagnostic check instead of crashing or false-passing
|
|
62
|
+
- Uninstall: host config cleanup runs before package removal; failures are surfaced clearly
|
|
63
|
+
|
|
64
|
+
## [0.1.0] — 2026-05-30
|
|
65
|
+
|
|
66
|
+
### Added
|
|
67
|
+
|
|
68
|
+
- Core operation layer with 13 operations: `task.list`, `task.get`, `task.create`, `task.update`, `task.complete`, `task.uncomplete`, `task.start`, `task.stop_current`, `task.archive`, `task.restore`, `project.list`, `tag.list`, `bridge.health`
|
|
69
|
+
- SP Local REST API client with full envelope parsing, timeout handling, and error translation
|
|
70
|
+
- MCP adapter with tool annotations, structured content, and complete input schemas
|
|
71
|
+
- CLI with `health`, `tasks`, `projects`, `tags` subcommands
|
|
72
|
+
- Doctor command (`sp-local-bridge-doctor`) for bridge health diagnostics
|
|
73
|
+
- Host config generator (`sp-local-bridge-print-config`) for MCP host setup
|
|
74
|
+
- Install/uninstall scripts with `--dry-run` support
|
|
75
|
+
- CI pipeline (GitHub Actions) with Python 3.11/3.12/3.13 matrix
|
|
76
|
+
- 135+ tests covering core validation, REST translation, MCP protocol, and diagnostics
|
|
77
|
+
- Documentation: operations reference, host setup guides
|
|
78
|
+
|
|
79
|
+
### Notes
|
|
80
|
+
|
|
81
|
+
- Plugin fallback (file-spool bridge) is deferred — all operations use the Local REST API
|
|
82
|
+
- Requires Super Productivity desktop app with Local REST API enabled (Settings → Misc)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Cameron Brooks
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
.PHONY: install format lint typecheck test cov check clean build doctor print-config checksums
|
|
2
|
+
|
|
3
|
+
## Install dependencies
|
|
4
|
+
install:
|
|
5
|
+
uv sync
|
|
6
|
+
|
|
7
|
+
## Format code
|
|
8
|
+
format:
|
|
9
|
+
uv run ruff format .
|
|
10
|
+
|
|
11
|
+
## Lint code (with auto-fix)
|
|
12
|
+
lint:
|
|
13
|
+
uv run ruff check --fix .
|
|
14
|
+
|
|
15
|
+
## Type check
|
|
16
|
+
typecheck:
|
|
17
|
+
uv run pyright
|
|
18
|
+
|
|
19
|
+
## Run tests
|
|
20
|
+
test:
|
|
21
|
+
uv run pytest
|
|
22
|
+
|
|
23
|
+
## Run tests with coverage
|
|
24
|
+
cov:
|
|
25
|
+
uv run pytest --cov --cov-report=term-missing
|
|
26
|
+
|
|
27
|
+
## Run all checks (CI-equivalent)
|
|
28
|
+
check: install
|
|
29
|
+
uv run ruff format --check .
|
|
30
|
+
uv run ruff check .
|
|
31
|
+
uv run pyright
|
|
32
|
+
uv run pytest
|
|
33
|
+
uv build --quiet
|
|
34
|
+
|
|
35
|
+
## Build release artifacts
|
|
36
|
+
build:
|
|
37
|
+
uv build
|
|
38
|
+
|
|
39
|
+
## Generate checksums for release artifacts
|
|
40
|
+
checksums:
|
|
41
|
+
cd dist && sha256sum * > checksums.txt
|
|
42
|
+
|
|
43
|
+
## Run bridge doctor
|
|
44
|
+
doctor:
|
|
45
|
+
uv run sp-local-bridge-doctor
|
|
46
|
+
|
|
47
|
+
## Print host config
|
|
48
|
+
print-config:
|
|
49
|
+
uv run sp-local-bridge-print-config claude-desktop
|
|
50
|
+
|
|
51
|
+
## Remove build artifacts
|
|
52
|
+
clean:
|
|
53
|
+
rm -rf dist/ build/ *.egg-info .pytest_cache .ruff_cache .mypy_cache htmlcov .coverage
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: sp-local-bridge
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: Local automation bridge for Super Productivity — REST-first with MCP adapter
|
|
5
|
+
Project-URL: Repository, https://github.com/CameronBrooks11/super-productivity-local-bridge
|
|
6
|
+
Author: Cameron Brooks
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Keywords: automation,local-bridge,mcp,super-productivity
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
18
|
+
Requires-Python: >=3.11
|
|
19
|
+
Requires-Dist: httpx<1,>=0.28
|
|
20
|
+
Requires-Dist: mcp<3,>=1.9
|
|
21
|
+
Requires-Dist: pydantic<3,>=2.12
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
|
|
24
|
+
# Super Productivity Local Bridge
|
|
25
|
+
|
|
26
|
+
> [!IMPORTANT]
|
|
27
|
+
> **This repository is archived. It has been superseded by the [Go bridge](https://github.com/CameronBrooks11/super-productivity-local-gobridge).**
|
|
28
|
+
>
|
|
29
|
+
> The Go rewrite provides the same 16 operations, installs as a single binary
|
|
30
|
+
> with no Python or `uv` runtime to manage, and is where all further development
|
|
31
|
+
> happens. This repository is read-only: no further fixes, releases, or
|
|
32
|
+
> dependency updates.
|
|
33
|
+
>
|
|
34
|
+
> **New and existing installations should move to
|
|
35
|
+
> [super-productivity-local-gobridge](https://github.com/CameronBrooks11/super-productivity-local-gobridge)**
|
|
36
|
+
> ([docs](https://cameronbrooks11.github.io/super-productivity-local-gobridge/),
|
|
37
|
+
> [migration guide](https://cameronbrooks11.github.io/super-productivity-local-gobridge/migration)).
|
|
38
|
+
>
|
|
39
|
+
> The content below describes the final Python release (v0.2.0) and is kept for
|
|
40
|
+
> reference.
|
|
41
|
+
|
|
42
|
+
[](https://github.com/CameronBrooks11/super-productivity-local-bridge/actions/workflows/ci.yml)
|
|
43
|
+
[](https://www.python.org/downloads/)
|
|
44
|
+
[](LICENSE)
|
|
45
|
+
|
|
46
|
+
Control [Super Productivity](https://super-productivity.com/) tasks, projects, and tags from MCP hosts, CLI, and local automation tools — all through the desktop app's Local REST API.
|
|
47
|
+
|
|
48
|
+
## Why
|
|
49
|
+
|
|
50
|
+
Super Productivity is a great task manager. This bridge lets AI coding agents and automation scripts interact with it programmatically — creating tasks, tracking work, and managing projects without leaving your workflow.
|
|
51
|
+
|
|
52
|
+
The bridge talks only to your local Super Productivity API on `127.0.0.1:3876`. Your MCP host may have its own data handling, so review the host's privacy model before granting task access.
|
|
53
|
+
|
|
54
|
+
## Features
|
|
55
|
+
|
|
56
|
+
- **16 operations** — list/get/create/update/complete/uncomplete/start/stop/archive/restore tasks, current task get/set, list projects, list tags, status, health check, plus filters and time fields
|
|
57
|
+
- **MCP adapter** — live-validated with VS Code Copilot; includes setup guides and config generation for Claude Desktop and Codex CLI
|
|
58
|
+
- **CLI** — command-line access to common operations (health, status, list/get/create tasks, current task, projects, tags)
|
|
59
|
+
- **Host config generator** — prints ready-to-paste config with absolute paths for each supported host
|
|
60
|
+
- **Doctor command** — diagnoses connectivity and configuration issues
|
|
61
|
+
|
|
62
|
+
## Install
|
|
63
|
+
|
|
64
|
+
Requires Python 3.11+ and [uv](https://docs.astral.sh/uv/).
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
git clone https://github.com/CameronBrooks11/super-productivity-local-bridge.git
|
|
68
|
+
cd super-productivity-local-bridge
|
|
69
|
+
scripts/install.sh
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Use `--dry-run` to preview.
|
|
73
|
+
|
|
74
|
+
Alternatively, install from a [GitHub Release](https://github.com/CameronBrooks11/super-productivity-local-bridge/releases) wheel:
|
|
75
|
+
|
|
76
|
+
```sh
|
|
77
|
+
uv tool install https://github.com/CameronBrooks11/super-productivity-local-bridge/releases/download/v0.2.0/sp_local_bridge-0.2.0-py3-none-any.whl
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Configure an MCP Host
|
|
81
|
+
|
|
82
|
+
```sh
|
|
83
|
+
sp-local-bridge-print-config vscode-copilot # VS Code Copilot
|
|
84
|
+
sp-local-bridge-print-config claude-desktop # Claude Desktop
|
|
85
|
+
sp-local-bridge-print-config codex # Codex CLI
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Add the printed snippet to the config file shown in the output, then restart the host.
|
|
89
|
+
|
|
90
|
+
See the [host setup guides](https://cameronbrooks11.github.io/super-productivity-local-bridge/hosts/) for detailed instructions.
|
|
91
|
+
|
|
92
|
+
## Verify
|
|
93
|
+
|
|
94
|
+
```sh
|
|
95
|
+
sp-local-bridge-doctor
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Safety
|
|
99
|
+
|
|
100
|
+
This bridge has **write access** to your Super Productivity data (create, update, complete, archive tasks). It talks only to localhost. `task.delete` is intentionally excluded. Back up your SP data before heavy automation use.
|
|
101
|
+
|
|
102
|
+
See [Security](https://cameronbrooks11.github.io/super-productivity-local-bridge/security) for the full risk profile.
|
|
103
|
+
|
|
104
|
+
## Documentation
|
|
105
|
+
|
|
106
|
+
Full docs: [cameronbrooks11.github.io/super-productivity-local-bridge](https://cameronbrooks11.github.io/super-productivity-local-bridge/)
|
|
107
|
+
|
|
108
|
+
- [Getting Started](https://cameronbrooks11.github.io/super-productivity-local-bridge/getting-started)
|
|
109
|
+
- [Operations Reference](https://cameronbrooks11.github.io/super-productivity-local-bridge/operations)
|
|
110
|
+
- [Architecture](https://cameronbrooks11.github.io/super-productivity-local-bridge/architecture)
|
|
111
|
+
- [Troubleshooting](https://cameronbrooks11.github.io/super-productivity-local-bridge/troubleshooting)
|
|
112
|
+
|
|
113
|
+
## Development
|
|
114
|
+
|
|
115
|
+
```sh
|
|
116
|
+
uv sync # Install deps
|
|
117
|
+
make check # Format, lint, typecheck, test, build
|
|
118
|
+
uv run pytest --cov # Tests with coverage
|
|
119
|
+
uv run pre-commit install # Git hooks
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## License
|
|
123
|
+
|
|
124
|
+
[MIT](LICENSE)
|