downbeat 0.1.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.
- downbeat-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +69 -0
- downbeat-0.1.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
- downbeat-0.1.1/.github/workflows/ci.yml +18 -0
- downbeat-0.1.1/.github/workflows/release.yml +71 -0
- downbeat-0.1.1/.gitignore +11 -0
- downbeat-0.1.1/.pre-commit-config.yaml +12 -0
- downbeat-0.1.1/CHANGELOG.md +703 -0
- downbeat-0.1.1/CODE_OF_CONDUCT.md +68 -0
- downbeat-0.1.1/CONTRIBUTING.md +74 -0
- downbeat-0.1.1/LICENSE +21 -0
- downbeat-0.1.1/PKG-INFO +193 -0
- downbeat-0.1.1/README.md +156 -0
- downbeat-0.1.1/SECURITY.md +43 -0
- downbeat-0.1.1/docs/decisions.md +101 -0
- downbeat-0.1.1/docs/launch-plan.md +89 -0
- downbeat-0.1.1/docs/oss-readiness-research.md +268 -0
- downbeat-0.1.1/docs/release-setup.md +159 -0
- downbeat-0.1.1/docs/superpowers/specs/2026-07-01-downbeat-product-identity.md +76 -0
- downbeat-0.1.1/pyproject.toml +113 -0
- downbeat-0.1.1/src/downbeat/__init__.py +1 -0
- downbeat-0.1.1/src/downbeat/assets/commands/relay-monitor.md +37 -0
- downbeat-0.1.1/src/downbeat/assets/commands/relay-peers.md +17 -0
- downbeat-0.1.1/src/downbeat/assets/commands/relay-register.md +16 -0
- downbeat-0.1.1/src/downbeat/assets/commands/relay-reply.md +36 -0
- downbeat-0.1.1/src/downbeat/assets/commands/relay-send.md +25 -0
- downbeat-0.1.1/src/downbeat/assets/hooks/relay-inbox.py +269 -0
- downbeat-0.1.1/src/downbeat/assets/hooks/relay-poll-offer.py +116 -0
- downbeat-0.1.1/src/downbeat/assets/hooks_manifest.json +8 -0
- downbeat-0.1.1/src/downbeat/cli/__init__.py +0 -0
- downbeat-0.1.1/src/downbeat/cli/__main__.py +190 -0
- downbeat-0.1.1/src/downbeat/cli/commands/__init__.py +0 -0
- downbeat-0.1.1/src/downbeat/cli/commands/init_cmd.py +362 -0
- downbeat-0.1.1/src/downbeat/cli/commands/relay_cmds.py +304 -0
- downbeat-0.1.1/src/downbeat/core/__init__.py +0 -0
- downbeat-0.1.1/src/downbeat/core/errors.py +18 -0
- downbeat-0.1.1/src/downbeat/core/groups.py +37 -0
- downbeat-0.1.1/src/downbeat/core/logging.py +42 -0
- downbeat-0.1.1/src/downbeat/core/models.py +160 -0
- downbeat-0.1.1/src/downbeat/core/paths.py +27 -0
- downbeat-0.1.1/src/downbeat/core/session.py +153 -0
- downbeat-0.1.1/src/downbeat/core/state.py +70 -0
- downbeat-0.1.1/src/downbeat/core/store.py +682 -0
- downbeat-0.1.1/src/downbeat/core/watcher.py +129 -0
- downbeat-0.1.1/src/downbeat/skill/SKILL.md +127 -0
- downbeat-0.1.1/src/downbeat/skill/__init__.py +0 -0
- downbeat-0.1.1/src/downbeat/tui/__init__.py +0 -0
- downbeat-0.1.1/src/downbeat/tui/app.py +89 -0
- downbeat-0.1.1/src/downbeat/tui/messages.py +9 -0
- downbeat-0.1.1/src/downbeat/tui/screens/__init__.py +0 -0
- downbeat-0.1.1/src/downbeat/tui/screens/broadcast_status.py +30 -0
- downbeat-0.1.1/src/downbeat/tui/screens/chat.py +307 -0
- downbeat-0.1.1/src/downbeat/tui/screens/help.py +63 -0
- downbeat-0.1.1/src/downbeat/tui/screens/main.py +215 -0
- downbeat-0.1.1/src/downbeat/tui/screens/message_detail.py +171 -0
- downbeat-0.1.1/src/downbeat/tui/screens/peers.py +125 -0
- downbeat-0.1.1/src/downbeat/tui/screens/quarantine.py +120 -0
- downbeat-0.1.1/src/downbeat/tui/theme.tcss +64 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/__init__.py +0 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/add_peer_modal.py +59 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/chat_composer.py +101 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/chat_stream.py +327 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/clipboard.py +41 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/composer.py +87 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/confirm.py +35 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/edit_modal.py +49 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/find_message.py +57 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/inbox_list.py +61 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/log_viewer.py +63 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/message_view.py +62 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/peer_admin.py +111 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/peer_list.py +130 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/peer_tabs.py +89 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/rebind_modal.py +52 -0
- downbeat-0.1.1/src/downbeat/tui/widgets/switch_acting_as.py +46 -0
- downbeat-0.1.1/tests/__init__.py +0 -0
- downbeat-0.1.1/tests/conftest.py +24 -0
- downbeat-0.1.1/tests/test_cli.py +165 -0
- downbeat-0.1.1/tests/test_cli_delivery.py +28 -0
- downbeat-0.1.1/tests/test_cli_init.py +201 -0
- downbeat-0.1.1/tests/test_groups.py +13 -0
- downbeat-0.1.1/tests/test_logging.py +32 -0
- downbeat-0.1.1/tests/test_models.py +102 -0
- downbeat-0.1.1/tests/test_paths.py +24 -0
- downbeat-0.1.1/tests/test_rebind.py +87 -0
- downbeat-0.1.1/tests/test_session.py +101 -0
- downbeat-0.1.1/tests/test_state.py +28 -0
- downbeat-0.1.1/tests/test_store_broadcast.py +41 -0
- downbeat-0.1.1/tests/test_store_delivery.py +119 -0
- downbeat-0.1.1/tests/test_store_messages.py +212 -0
- downbeat-0.1.1/tests/test_store_peers.py +92 -0
- downbeat-0.1.1/tests/test_store_quarantine.py +192 -0
- downbeat-0.1.1/tests/test_tui_chat.py +686 -0
- downbeat-0.1.1/tests/test_tui_composer.py +50 -0
- downbeat-0.1.1/tests/test_tui_edit_delete.py +53 -0
- downbeat-0.1.1/tests/test_tui_inbox.py +102 -0
- downbeat-0.1.1/tests/test_tui_message_detail.py +57 -0
- downbeat-0.1.1/tests/test_tui_message_view.py +53 -0
- downbeat-0.1.1/tests/test_tui_peer_admin.py +149 -0
- downbeat-0.1.1/tests/test_tui_peers.py +105 -0
- downbeat-0.1.1/tests/test_tui_smoke.py +62 -0
- downbeat-0.1.1/tests/test_watch.py +195 -0
- downbeat-0.1.1/tests/test_watcher.py +27 -0
- downbeat-0.1.1/uv.lock +1692 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Something isn't working as expected
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: dropdown
|
|
6
|
+
id: surface
|
|
7
|
+
attributes:
|
|
8
|
+
label: Which surface is affected?
|
|
9
|
+
options:
|
|
10
|
+
- TUI
|
|
11
|
+
- CLI
|
|
12
|
+
- Library (importing downbeat directly)
|
|
13
|
+
- Claude Code skill / hooks / slash-commands
|
|
14
|
+
- Packaging / install (init, uninstall)
|
|
15
|
+
- Other / not sure
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
|
|
19
|
+
- type: input
|
|
20
|
+
id: version
|
|
21
|
+
attributes:
|
|
22
|
+
label: Version
|
|
23
|
+
description: Output of `downbeat --version`
|
|
24
|
+
placeholder: "downbeat 0.1.0"
|
|
25
|
+
validations:
|
|
26
|
+
required: true
|
|
27
|
+
|
|
28
|
+
- type: textarea
|
|
29
|
+
id: what-happened
|
|
30
|
+
attributes:
|
|
31
|
+
label: What happened?
|
|
32
|
+
description: A clear description of the bug. Include exact commands/keystrokes if relevant.
|
|
33
|
+
validations:
|
|
34
|
+
required: true
|
|
35
|
+
|
|
36
|
+
- type: textarea
|
|
37
|
+
id: expected
|
|
38
|
+
attributes:
|
|
39
|
+
label: What did you expect to happen?
|
|
40
|
+
validations:
|
|
41
|
+
required: false
|
|
42
|
+
|
|
43
|
+
- type: textarea
|
|
44
|
+
id: repro
|
|
45
|
+
attributes:
|
|
46
|
+
label: Steps to reproduce
|
|
47
|
+
placeholder: |
|
|
48
|
+
1. `downbeat register foo --role parent`
|
|
49
|
+
2. `downbeat send bar hi hello`
|
|
50
|
+
3. ...
|
|
51
|
+
validations:
|
|
52
|
+
required: false
|
|
53
|
+
|
|
54
|
+
- type: textarea
|
|
55
|
+
id: logs
|
|
56
|
+
attributes:
|
|
57
|
+
label: Relevant logs / output
|
|
58
|
+
description: Run with `--debug` if possible. Paste terminal output; no need for backticks, it will be auto-formatted.
|
|
59
|
+
render: shell
|
|
60
|
+
validations:
|
|
61
|
+
required: false
|
|
62
|
+
|
|
63
|
+
- type: input
|
|
64
|
+
id: os
|
|
65
|
+
attributes:
|
|
66
|
+
label: OS + Python version
|
|
67
|
+
placeholder: "macOS 15, Python 3.12"
|
|
68
|
+
validations:
|
|
69
|
+
required: false
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
on: [push, pull_request]
|
|
3
|
+
jobs:
|
|
4
|
+
test:
|
|
5
|
+
runs-on: ${{ matrix.os }}
|
|
6
|
+
strategy:
|
|
7
|
+
fail-fast: false
|
|
8
|
+
matrix:
|
|
9
|
+
os: [ubuntu-latest, macos-latest]
|
|
10
|
+
python: ["3.11", "3.12", "3.13"]
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- uses: astral-sh/setup-uv@v5
|
|
14
|
+
with:
|
|
15
|
+
python-version: ${{ matrix.python }}
|
|
16
|
+
- run: uv sync --locked --extra dev
|
|
17
|
+
- run: uv run ruff check .
|
|
18
|
+
- run: uv run pytest -q
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
|
|
6
|
+
# NOTE: this workflow trusts that `main` only receives commits that already
|
|
7
|
+
# passed ci.yml (via required-status-checks branch protection on GitHub —
|
|
8
|
+
# configure that in repo Settings → Branches; cannot be set from a workflow
|
|
9
|
+
# file). It does not re-run tests itself.
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
release:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
concurrency: release
|
|
18
|
+
permissions:
|
|
19
|
+
contents: write # to push the version-bump commit, changelog, and tag
|
|
20
|
+
outputs:
|
|
21
|
+
released: ${{ steps.release.outputs.released }}
|
|
22
|
+
tag: ${{ steps.release.outputs.tag }}
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
with:
|
|
26
|
+
fetch-depth: 0
|
|
27
|
+
persist-credentials: true
|
|
28
|
+
# PAT, not the default GITHUB_TOKEN: main's branch ruleset requires
|
|
29
|
+
# all 6 ci.yml status checks and only bypasses RepositoryRole:Admin.
|
|
30
|
+
# The actual `git push` of the version-bump commit happens via the
|
|
31
|
+
# credentials persisted HERE (by actions/checkout), regardless of
|
|
32
|
+
# what token the semantic-release action below is given — the bot
|
|
33
|
+
# identity behind GITHUB_TOKEN isn't covered by the bypass and gets
|
|
34
|
+
# GH013-rejected. See docs/release-setup.md Step 4.
|
|
35
|
+
token: ${{ secrets.RELEASE_TOKEN }}
|
|
36
|
+
# NOTE: no setup-uv step here — this action runs build_command inside
|
|
37
|
+
# its OWN Docker container, isolated from the runner's PATH, so
|
|
38
|
+
# installing uv on the host has no effect. See build_command in
|
|
39
|
+
# pyproject.toml's [tool.semantic_release] for how uv gets installed
|
|
40
|
+
# where it's actually needed (inside the container).
|
|
41
|
+
- name: Python Semantic Release
|
|
42
|
+
id: release
|
|
43
|
+
uses: python-semantic-release/python-semantic-release@v9
|
|
44
|
+
with:
|
|
45
|
+
github_token: ${{ secrets.RELEASE_TOKEN }}
|
|
46
|
+
|
|
47
|
+
publish:
|
|
48
|
+
needs: release
|
|
49
|
+
if: needs.release.outputs.released == 'true'
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
# Requires a "pypi" environment configured in repo Settings → Environments,
|
|
52
|
+
# with a Trusted Publisher registered on pypi.org for this repo + workflow
|
|
53
|
+
# (org/repo, workflow filename "release.yml", environment "pypi"). Manual,
|
|
54
|
+
# one-time, PyPI-web-console setup — cannot be done from this workflow.
|
|
55
|
+
environment:
|
|
56
|
+
name: pypi
|
|
57
|
+
url: https://pypi.org/project/downbeat/
|
|
58
|
+
permissions:
|
|
59
|
+
contents: read # needed for actions/checkout — a job-level `permissions:`
|
|
60
|
+
# block zeroes every unlisted scope (repo is private, so checkout without
|
|
61
|
+
# this 404s as "Repository not found" rather than 403 — GitHub hides
|
|
62
|
+
# private-repo existence from tokens that can't read it)
|
|
63
|
+
id-token: write # OIDC token exchange for Trusted Publishing — no API token stored
|
|
64
|
+
steps:
|
|
65
|
+
- uses: actions/checkout@v4
|
|
66
|
+
with:
|
|
67
|
+
ref: main # semantic-release already pushed the version-bump commit here
|
|
68
|
+
- uses: astral-sh/setup-uv@v5
|
|
69
|
+
- run: uv build
|
|
70
|
+
- name: Publish to PyPI (Trusted Publishing)
|
|
71
|
+
run: uv publish
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Enforces Conventional Commits on every commit message — required because
|
|
2
|
+
# version bumps, CHANGELOG generation, and PyPI releases (semantic-release,
|
|
3
|
+
# see pyproject.toml [tool.semantic_release]) are all derived from commit
|
|
4
|
+
# history. See CONTRIBUTING.md.
|
|
5
|
+
#
|
|
6
|
+
# Install once per checkout: `uv run pre-commit install --hook-type commit-msg`
|
|
7
|
+
repos:
|
|
8
|
+
- repo: https://github.com/compilerla/conventional-pre-commit
|
|
9
|
+
rev: v3.4.0
|
|
10
|
+
hooks:
|
|
11
|
+
- id: conventional-pre-commit
|
|
12
|
+
stages: [commit-msg]
|