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.
Files changed (103) hide show
  1. downbeat-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +69 -0
  2. downbeat-0.1.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. downbeat-0.1.1/.github/workflows/ci.yml +18 -0
  4. downbeat-0.1.1/.github/workflows/release.yml +71 -0
  5. downbeat-0.1.1/.gitignore +11 -0
  6. downbeat-0.1.1/.pre-commit-config.yaml +12 -0
  7. downbeat-0.1.1/CHANGELOG.md +703 -0
  8. downbeat-0.1.1/CODE_OF_CONDUCT.md +68 -0
  9. downbeat-0.1.1/CONTRIBUTING.md +74 -0
  10. downbeat-0.1.1/LICENSE +21 -0
  11. downbeat-0.1.1/PKG-INFO +193 -0
  12. downbeat-0.1.1/README.md +156 -0
  13. downbeat-0.1.1/SECURITY.md +43 -0
  14. downbeat-0.1.1/docs/decisions.md +101 -0
  15. downbeat-0.1.1/docs/launch-plan.md +89 -0
  16. downbeat-0.1.1/docs/oss-readiness-research.md +268 -0
  17. downbeat-0.1.1/docs/release-setup.md +159 -0
  18. downbeat-0.1.1/docs/superpowers/specs/2026-07-01-downbeat-product-identity.md +76 -0
  19. downbeat-0.1.1/pyproject.toml +113 -0
  20. downbeat-0.1.1/src/downbeat/__init__.py +1 -0
  21. downbeat-0.1.1/src/downbeat/assets/commands/relay-monitor.md +37 -0
  22. downbeat-0.1.1/src/downbeat/assets/commands/relay-peers.md +17 -0
  23. downbeat-0.1.1/src/downbeat/assets/commands/relay-register.md +16 -0
  24. downbeat-0.1.1/src/downbeat/assets/commands/relay-reply.md +36 -0
  25. downbeat-0.1.1/src/downbeat/assets/commands/relay-send.md +25 -0
  26. downbeat-0.1.1/src/downbeat/assets/hooks/relay-inbox.py +269 -0
  27. downbeat-0.1.1/src/downbeat/assets/hooks/relay-poll-offer.py +116 -0
  28. downbeat-0.1.1/src/downbeat/assets/hooks_manifest.json +8 -0
  29. downbeat-0.1.1/src/downbeat/cli/__init__.py +0 -0
  30. downbeat-0.1.1/src/downbeat/cli/__main__.py +190 -0
  31. downbeat-0.1.1/src/downbeat/cli/commands/__init__.py +0 -0
  32. downbeat-0.1.1/src/downbeat/cli/commands/init_cmd.py +362 -0
  33. downbeat-0.1.1/src/downbeat/cli/commands/relay_cmds.py +304 -0
  34. downbeat-0.1.1/src/downbeat/core/__init__.py +0 -0
  35. downbeat-0.1.1/src/downbeat/core/errors.py +18 -0
  36. downbeat-0.1.1/src/downbeat/core/groups.py +37 -0
  37. downbeat-0.1.1/src/downbeat/core/logging.py +42 -0
  38. downbeat-0.1.1/src/downbeat/core/models.py +160 -0
  39. downbeat-0.1.1/src/downbeat/core/paths.py +27 -0
  40. downbeat-0.1.1/src/downbeat/core/session.py +153 -0
  41. downbeat-0.1.1/src/downbeat/core/state.py +70 -0
  42. downbeat-0.1.1/src/downbeat/core/store.py +682 -0
  43. downbeat-0.1.1/src/downbeat/core/watcher.py +129 -0
  44. downbeat-0.1.1/src/downbeat/skill/SKILL.md +127 -0
  45. downbeat-0.1.1/src/downbeat/skill/__init__.py +0 -0
  46. downbeat-0.1.1/src/downbeat/tui/__init__.py +0 -0
  47. downbeat-0.1.1/src/downbeat/tui/app.py +89 -0
  48. downbeat-0.1.1/src/downbeat/tui/messages.py +9 -0
  49. downbeat-0.1.1/src/downbeat/tui/screens/__init__.py +0 -0
  50. downbeat-0.1.1/src/downbeat/tui/screens/broadcast_status.py +30 -0
  51. downbeat-0.1.1/src/downbeat/tui/screens/chat.py +307 -0
  52. downbeat-0.1.1/src/downbeat/tui/screens/help.py +63 -0
  53. downbeat-0.1.1/src/downbeat/tui/screens/main.py +215 -0
  54. downbeat-0.1.1/src/downbeat/tui/screens/message_detail.py +171 -0
  55. downbeat-0.1.1/src/downbeat/tui/screens/peers.py +125 -0
  56. downbeat-0.1.1/src/downbeat/tui/screens/quarantine.py +120 -0
  57. downbeat-0.1.1/src/downbeat/tui/theme.tcss +64 -0
  58. downbeat-0.1.1/src/downbeat/tui/widgets/__init__.py +0 -0
  59. downbeat-0.1.1/src/downbeat/tui/widgets/add_peer_modal.py +59 -0
  60. downbeat-0.1.1/src/downbeat/tui/widgets/chat_composer.py +101 -0
  61. downbeat-0.1.1/src/downbeat/tui/widgets/chat_stream.py +327 -0
  62. downbeat-0.1.1/src/downbeat/tui/widgets/clipboard.py +41 -0
  63. downbeat-0.1.1/src/downbeat/tui/widgets/composer.py +87 -0
  64. downbeat-0.1.1/src/downbeat/tui/widgets/confirm.py +35 -0
  65. downbeat-0.1.1/src/downbeat/tui/widgets/edit_modal.py +49 -0
  66. downbeat-0.1.1/src/downbeat/tui/widgets/find_message.py +57 -0
  67. downbeat-0.1.1/src/downbeat/tui/widgets/inbox_list.py +61 -0
  68. downbeat-0.1.1/src/downbeat/tui/widgets/log_viewer.py +63 -0
  69. downbeat-0.1.1/src/downbeat/tui/widgets/message_view.py +62 -0
  70. downbeat-0.1.1/src/downbeat/tui/widgets/peer_admin.py +111 -0
  71. downbeat-0.1.1/src/downbeat/tui/widgets/peer_list.py +130 -0
  72. downbeat-0.1.1/src/downbeat/tui/widgets/peer_tabs.py +89 -0
  73. downbeat-0.1.1/src/downbeat/tui/widgets/rebind_modal.py +52 -0
  74. downbeat-0.1.1/src/downbeat/tui/widgets/switch_acting_as.py +46 -0
  75. downbeat-0.1.1/tests/__init__.py +0 -0
  76. downbeat-0.1.1/tests/conftest.py +24 -0
  77. downbeat-0.1.1/tests/test_cli.py +165 -0
  78. downbeat-0.1.1/tests/test_cli_delivery.py +28 -0
  79. downbeat-0.1.1/tests/test_cli_init.py +201 -0
  80. downbeat-0.1.1/tests/test_groups.py +13 -0
  81. downbeat-0.1.1/tests/test_logging.py +32 -0
  82. downbeat-0.1.1/tests/test_models.py +102 -0
  83. downbeat-0.1.1/tests/test_paths.py +24 -0
  84. downbeat-0.1.1/tests/test_rebind.py +87 -0
  85. downbeat-0.1.1/tests/test_session.py +101 -0
  86. downbeat-0.1.1/tests/test_state.py +28 -0
  87. downbeat-0.1.1/tests/test_store_broadcast.py +41 -0
  88. downbeat-0.1.1/tests/test_store_delivery.py +119 -0
  89. downbeat-0.1.1/tests/test_store_messages.py +212 -0
  90. downbeat-0.1.1/tests/test_store_peers.py +92 -0
  91. downbeat-0.1.1/tests/test_store_quarantine.py +192 -0
  92. downbeat-0.1.1/tests/test_tui_chat.py +686 -0
  93. downbeat-0.1.1/tests/test_tui_composer.py +50 -0
  94. downbeat-0.1.1/tests/test_tui_edit_delete.py +53 -0
  95. downbeat-0.1.1/tests/test_tui_inbox.py +102 -0
  96. downbeat-0.1.1/tests/test_tui_message_detail.py +57 -0
  97. downbeat-0.1.1/tests/test_tui_message_view.py +53 -0
  98. downbeat-0.1.1/tests/test_tui_peer_admin.py +149 -0
  99. downbeat-0.1.1/tests/test_tui_peers.py +105 -0
  100. downbeat-0.1.1/tests/test_tui_smoke.py +62 -0
  101. downbeat-0.1.1/tests/test_watch.py +195 -0
  102. downbeat-0.1.1/tests/test_watcher.py +27 -0
  103. 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,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Feature request / idea
4
+ url: https://github.com/FreddieMcHeart/downbeat/discussions
5
+ about: Feature requests and ideas start as a Discussion, not an Issue — this lets us talk through scope before committing to it.
@@ -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,11 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ dist/
7
+ build/
8
+ *.egg-info/
9
+ .coverage
10
+ .textual_dev/
11
+ .DS_Store
@@ -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]