agr-opentui 0.2.1__tar.gz → 0.3.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.
- agr_opentui-0.3.1/.github/CODEOWNERS +5 -0
- agr_opentui-0.3.1/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- agr_opentui-0.3.1/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.github/workflows/bump-version.yml +27 -3
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.github/workflows/publish-pypi.yml +38 -1
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/PKG-INFO +36 -68
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/README.md +34 -66
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/pyproject.toml +2 -2
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/app.ts +1 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/app_logic.ts +9 -7
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_actions.ts +2 -1
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/ui/controller.ts +11 -3
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/app_logic.test.ts +25 -1
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_actions_service.test.ts +1 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/runtime_handlers.test.ts +11 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/ui_controller.test.ts +1 -1
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/uv.lock +2 -2
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.github/renovate.json5 +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.github/workflows/build-bin.yml +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.github/workflows/ci.yml +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.gitignore +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/Makefile +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/agr_opentui/__init__.py +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/agr_opentui/bridge.py +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/bun.lock +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/bunfig.toml +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/package.json +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/skills.json +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/commands.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/deps.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/main.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/runtime/doctor.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/runtime/handlers.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/runtime/modal_input_handler.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/add_flow.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/agr.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/agr_actions.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/clipboard.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/data.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/discover_filter.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/discover_labels.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/feedback.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/handle_match.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/input_mode.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/navigation.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/preview.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_all.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_details.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_footer.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_help.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_list.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_missing_config.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_preview.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_run_modal.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_run_options.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_tabs.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_update_confirm.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_verify.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/runtime_ops.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/selection.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/skills_file.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/skills_source.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/ui_feedback.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/update.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/verify.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/verify_coordinator.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/visible_items.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/state.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/ui/layout.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/ui/render.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/ui/rows_render.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/ui.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/add_flow_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/agr_actions.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/agr_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/clipboard_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/commands_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/data_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/discover_filter_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/discover_labels.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/feedback_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/handle_match_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/input_mode_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/navigation_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/preview_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_all_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_details_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_footer_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_help_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_list_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_missing_config_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_preview_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_run_modal_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_run_options_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_tabs_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_update_confirm_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_verify_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/rows_render.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/runtime_doctor.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/runtime_ops_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/selection_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/skills_file_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/skills_source.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/ui_feedback_adapter.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/update_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/verify_coordinator_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/verify_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/visible_items_service.test.ts +0 -0
- {agr_opentui-0.2.1 → agr_opentui-0.3.1}/tsconfig.json +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Create a report to help us improve
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
**Describe the bug**
|
|
11
|
+
A clear and concise description of what the bug is.
|
|
12
|
+
|
|
13
|
+
**To Reproduce**
|
|
14
|
+
Steps to reproduce the behavior:
|
|
15
|
+
1. Go to '...'
|
|
16
|
+
2. Click on '....'
|
|
17
|
+
3. Scroll down to '....'
|
|
18
|
+
4. See error
|
|
19
|
+
|
|
20
|
+
**Expected behavior**
|
|
21
|
+
A clear and concise description of what you expected to happen.
|
|
22
|
+
|
|
23
|
+
**Screenshots**
|
|
24
|
+
If applicable, add screenshots to help explain your problem.
|
|
25
|
+
|
|
26
|
+
**Desktop (please complete the following information):**
|
|
27
|
+
- OS: [e.g. iOS]
|
|
28
|
+
- Browser [e.g. chrome, safari]
|
|
29
|
+
- Version [e.g. 22]
|
|
30
|
+
|
|
31
|
+
**Smartphone (please complete the following information):**
|
|
32
|
+
- Device: [e.g. iPhone6]
|
|
33
|
+
- OS: [e.g. iOS8.1]
|
|
34
|
+
- Browser [e.g. stock browser, safari]
|
|
35
|
+
- Version [e.g. 22]
|
|
36
|
+
|
|
37
|
+
**Additional context**
|
|
38
|
+
Add any other context about the problem here.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea for this project
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
**Is your feature request related to a problem? Please describe.**
|
|
11
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
12
|
+
|
|
13
|
+
**Describe the solution you'd like**
|
|
14
|
+
A clear and concise description of what you want to happen.
|
|
15
|
+
|
|
16
|
+
**Describe alternatives you've considered**
|
|
17
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
|
18
|
+
|
|
19
|
+
**Additional context**
|
|
20
|
+
Add any other context or screenshots about the feature request here.
|
|
@@ -15,7 +15,31 @@ on:
|
|
|
15
15
|
create_tag:
|
|
16
16
|
description: "Create and push git tag v<version> after bump"
|
|
17
17
|
required: true
|
|
18
|
-
default:
|
|
18
|
+
default: true
|
|
19
|
+
type: boolean
|
|
20
|
+
create_release:
|
|
21
|
+
description: "Create a GitHub release after tagging"
|
|
22
|
+
required: false
|
|
23
|
+
default: true
|
|
24
|
+
type: boolean
|
|
25
|
+
workflow_call:
|
|
26
|
+
inputs:
|
|
27
|
+
version:
|
|
28
|
+
description: "New version (example: 0.3.0)"
|
|
29
|
+
required: true
|
|
30
|
+
type: string
|
|
31
|
+
branch:
|
|
32
|
+
description: "Branch to update"
|
|
33
|
+
required: true
|
|
34
|
+
type: string
|
|
35
|
+
create_tag:
|
|
36
|
+
description: "Create and push git tag v<version> after bump"
|
|
37
|
+
required: true
|
|
38
|
+
type: boolean
|
|
39
|
+
create_release:
|
|
40
|
+
description: "Create a GitHub release after tagging"
|
|
41
|
+
required: false
|
|
42
|
+
default: true
|
|
19
43
|
type: boolean
|
|
20
44
|
|
|
21
45
|
permissions:
|
|
@@ -37,7 +61,7 @@ jobs:
|
|
|
37
61
|
python-version: "3.14.3"
|
|
38
62
|
|
|
39
63
|
- name: Setup uv
|
|
40
|
-
uses: astral-sh/setup-uv@
|
|
64
|
+
uses: astral-sh/setup-uv@v7
|
|
41
65
|
|
|
42
66
|
- name: Validate and apply version bump
|
|
43
67
|
env:
|
|
@@ -107,7 +131,7 @@ jobs:
|
|
|
107
131
|
git push origin "${TAG}"
|
|
108
132
|
|
|
109
133
|
- name: Create GitHub release
|
|
110
|
-
if: inputs.create_tag
|
|
134
|
+
if: inputs.create_tag && inputs.create_release
|
|
111
135
|
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
|
|
112
136
|
with:
|
|
113
137
|
tag_name: v${{ inputs.version }}
|
|
@@ -5,6 +5,20 @@ on:
|
|
|
5
5
|
types: [published]
|
|
6
6
|
workflow_dispatch:
|
|
7
7
|
inputs:
|
|
8
|
+
bump_version:
|
|
9
|
+
description: "Run bump-version before building and publishing"
|
|
10
|
+
required: true
|
|
11
|
+
type: boolean
|
|
12
|
+
default: false
|
|
13
|
+
version:
|
|
14
|
+
description: "New version to use when bump_version is enabled (example: 0.3.0)"
|
|
15
|
+
required: false
|
|
16
|
+
type: string
|
|
17
|
+
branch:
|
|
18
|
+
description: "Branch to build from (and bump when enabled)"
|
|
19
|
+
required: true
|
|
20
|
+
type: string
|
|
21
|
+
default: master
|
|
8
22
|
target:
|
|
9
23
|
description: "Where to publish the package"
|
|
10
24
|
required: true
|
|
@@ -14,11 +28,34 @@ on:
|
|
|
14
28
|
- testpypi
|
|
15
29
|
default: pypi
|
|
16
30
|
|
|
31
|
+
permissions:
|
|
32
|
+
contents: write
|
|
33
|
+
|
|
17
34
|
jobs:
|
|
35
|
+
bump-version:
|
|
36
|
+
if: github.event_name == 'workflow_dispatch' && inputs.bump_version
|
|
37
|
+
uses: ./.github/workflows/bump-version.yml
|
|
38
|
+
with:
|
|
39
|
+
version: ${{ inputs.version }}
|
|
40
|
+
branch: ${{ inputs.branch }}
|
|
41
|
+
create_tag: true
|
|
42
|
+
create_release: false
|
|
43
|
+
secrets: inherit
|
|
44
|
+
|
|
18
45
|
build:
|
|
46
|
+
needs: bump-version
|
|
47
|
+
if: ${{ always() && (needs.bump-version.result == 'success' || needs.bump-version.result == 'skipped') }}
|
|
19
48
|
runs-on: ubuntu-latest
|
|
20
49
|
steps:
|
|
21
|
-
- name: Checkout
|
|
50
|
+
- name: Checkout (workflow_dispatch branch)
|
|
51
|
+
if: github.event_name == 'workflow_dispatch'
|
|
52
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
53
|
+
with:
|
|
54
|
+
ref: ${{ inputs.branch }}
|
|
55
|
+
fetch-depth: 0
|
|
56
|
+
|
|
57
|
+
- name: Checkout (release ref)
|
|
58
|
+
if: github.event_name == 'release'
|
|
22
59
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
23
60
|
|
|
24
61
|
- name: Setup Python
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agr-opentui
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: OpenTUI frontend for agr
|
|
5
5
|
Project-URL: Homepage, https://github.com/RelativeSure/agr-opentui
|
|
6
6
|
Project-URL: Repository, https://github.com/RelativeSure/agr-opentui
|
|
@@ -17,13 +17,25 @@ Classifier: Programming Language :: Python :: 3
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.14
|
|
18
18
|
Classifier: Topic :: Software Development :: Build Tools
|
|
19
19
|
Classifier: Topic :: Utilities
|
|
20
|
-
Requires-Python: >=3.14
|
|
20
|
+
Requires-Python: >=3.14.3
|
|
21
21
|
Requires-Dist: agr>=0.7.4
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
<div align="center">
|
|
25
25
|
|
|
26
|
-
OpenTUI
|
|
26
|
+
# OpenTUI for `agr` and `agrx`
|
|
27
|
+
|
|
28
|
+
An OpenTUI interface for the `agr`/`agrx` CLI: view configured skills, trigger `agr` actions and preview `SKILL.md`
|
|
29
|
+
|
|
30
|
+
[](https://pypi.org/project/agr-opentui/)
|
|
31
|
+
[](https://opensource.org/licenses/MIT)
|
|
32
|
+
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
`agr-opentui` is an OpenTUI front-end for `agr`/`agrx`.
|
|
38
|
+
The default discover source in this repo points to `https://github.com/kasperjunge/agent-resources`.
|
|
27
39
|
|
|
28
40
|
## Usage
|
|
29
41
|
|
|
@@ -83,95 +95,50 @@ Discover flow:
|
|
|
83
95
|
|
|
84
96
|
## Requirements
|
|
85
97
|
|
|
86
|
-
|
|
87
|
-
- Zig (required by OpenTUI build tooling)
|
|
98
|
+
### Runtime (using `agr-tui`):
|
|
88
99
|
- Python 3.10+
|
|
89
100
|
- `uv`
|
|
90
101
|
- `agr` + `agrx` on your `PATH`
|
|
91
102
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
bun install
|
|
96
|
-
```
|
|
103
|
+
### Build/Development (working on this repo):
|
|
104
|
+
- Bun 1.3.8+
|
|
105
|
+
- Zig (required by OpenTUI build tooling)
|
|
97
106
|
|
|
98
|
-
|
|
107
|
+
#### Build
|
|
99
108
|
|
|
100
109
|
```bash
|
|
101
|
-
bun run
|
|
110
|
+
bun run build
|
|
102
111
|
```
|
|
103
|
-
|
|
104
|
-
Run it from the repo you want to manage (the current working directory is the target repo).
|
|
105
|
-
`agr.toml` is expected in that target repo for `agr add/remove/sync` operations.
|
|
106
|
-
|
|
107
|
-
### Run From Target Repo
|
|
108
|
-
|
|
112
|
+
or
|
|
109
113
|
```bash
|
|
110
|
-
|
|
111
|
-
agr-tui
|
|
114
|
+
make build
|
|
112
115
|
```
|
|
113
|
-
|
|
114
|
-
`agr-opentui` itself does not need to contain your target repo's `agr.toml`.
|
|
115
|
-
|
|
116
|
-
## Build
|
|
117
|
-
|
|
118
|
-
```bash
|
|
119
|
-
bun run build
|
|
120
|
-
```
|
|
121
|
-
|
|
122
116
|
This creates `bin/agr-tui`.
|
|
123
117
|
|
|
124
|
-
## Publish to PyPI
|
|
125
118
|
|
|
126
|
-
|
|
127
|
-
- Create a `pypi` environment in this GitHub repo.
|
|
128
|
-
- In your PyPI project settings, add this repo/workflow as a Trusted Publisher for `.github/workflows/publish-pypi.yml`.
|
|
129
|
-
- Optional: add `testpypi` environment and TestPyPI Trusted Publisher too.
|
|
130
|
-
|
|
131
|
-
Publish via GitHub Actions:
|
|
132
|
-
- Release publish: creating a GitHub release triggers publish to PyPI.
|
|
133
|
-
- Manual: run `publish-pypi` workflow and choose `pypi` or `testpypi`.
|
|
134
|
-
|
|
135
|
-
Publish from local machine:
|
|
119
|
+
#### Install
|
|
136
120
|
|
|
137
121
|
```bash
|
|
138
|
-
|
|
139
|
-
make py-publish # Upload to PyPI
|
|
140
|
-
make py-publish-test # Upload to TestPyPI
|
|
122
|
+
bun install
|
|
141
123
|
```
|
|
142
124
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
Update package version before creating a release:
|
|
146
|
-
|
|
147
|
-
1. Edit `pyproject.toml` and bump `[project].version`.
|
|
148
|
-
2. Regenerate `uv.lock` so the local package entry matches:
|
|
125
|
+
#### Run
|
|
149
126
|
|
|
150
127
|
```bash
|
|
151
|
-
|
|
128
|
+
bun run src/main.ts
|
|
152
129
|
```
|
|
153
130
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
```bash
|
|
157
|
-
make check
|
|
158
|
-
```
|
|
131
|
+
Run it from the repo you want to manage (the current working directory is the target repo).
|
|
132
|
+
`agr.toml` is expected in that target repo for `agr add/remove/sync` operations.
|
|
159
133
|
|
|
160
|
-
|
|
134
|
+
### Run From Target Repo
|
|
161
135
|
|
|
162
136
|
```bash
|
|
163
|
-
|
|
164
|
-
|
|
137
|
+
cd /path/to/your/project
|
|
138
|
+
agr-tui
|
|
165
139
|
```
|
|
166
140
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
`publish-pypi.yml` runs automatically when a release is published.
|
|
170
|
-
|
|
171
|
-
Alternative: use `.github/workflows/bump-version.yml` via **Actions → bump-version → Run workflow** and provide:
|
|
172
|
-
- `version` (required): target version like `0.3.0`
|
|
173
|
-
- `branch` (required): target branch to update (default `master`)
|
|
174
|
-
- `create_tag` (required): when enabled, creates/pushes tag `v<version>` and creates a GitHub Release
|
|
141
|
+
`agr-opentui` itself does not need to contain your target repo's `agr.toml`.
|
|
175
142
|
|
|
176
143
|
## Discover List (`skills.json`)
|
|
177
144
|
|
|
@@ -180,6 +147,8 @@ If `skills.json` exists, the `Discover` tab will list its entries. It supports:
|
|
|
180
147
|
- An array of strings or objects (`{ "label": "...", "handle": "...", "repo": "owner/repo" }`).
|
|
181
148
|
- An object with `source` metadata and `skills` array (see `skills.json` in this repo).
|
|
182
149
|
|
|
150
|
+
In this repository, `skills.json` is configured to source skills from `kasperjunge/agent-resources` (`agr.toml` on `main`).
|
|
151
|
+
|
|
183
152
|
When a `source` is configured, the app checks the remote list periodically (about every 6 hours) and can update `skills.json` using the `u`/`U`/`s`/`S` controls.
|
|
184
153
|
|
|
185
154
|
## Troubleshooting
|
|
@@ -191,7 +160,6 @@ When a `source` is configured, the app checks the remote list periodically (abou
|
|
|
191
160
|
- `skills.json not found` or parse errors: fix the file format (array or `{ "source": ..., "skills": [...] }`).
|
|
192
161
|
- Discover list not updating: check the `source` URL/repo/branch/path and network access.
|
|
193
162
|
- `SKILL.md` preview says “not found”: the skill may not ship a `SKILL.md` or the path is nonstandard.
|
|
194
|
-
- Copy to clipboard doesn’t work: install `pbcopy` (macOS), `wl-copy` (Wayland), or `xclip` (X11).
|
|
195
163
|
|
|
196
164
|
## Notes
|
|
197
165
|
|
|
@@ -1,6 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
OpenTUI
|
|
3
|
+
# OpenTUI for `agr` and `agrx`
|
|
4
|
+
|
|
5
|
+
An OpenTUI interface for the `agr`/`agrx` CLI: view configured skills, trigger `agr` actions and preview `SKILL.md`
|
|
6
|
+
|
|
7
|
+
[](https://pypi.org/project/agr-opentui/)
|
|
8
|
+
[](https://opensource.org/licenses/MIT)
|
|
9
|
+
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
`agr-opentui` is an OpenTUI front-end for `agr`/`agrx`.
|
|
15
|
+
The default discover source in this repo points to `https://github.com/kasperjunge/agent-resources`.
|
|
4
16
|
|
|
5
17
|
## Usage
|
|
6
18
|
|
|
@@ -60,95 +72,50 @@ Discover flow:
|
|
|
60
72
|
|
|
61
73
|
## Requirements
|
|
62
74
|
|
|
63
|
-
|
|
64
|
-
- Zig (required by OpenTUI build tooling)
|
|
75
|
+
### Runtime (using `agr-tui`):
|
|
65
76
|
- Python 3.10+
|
|
66
77
|
- `uv`
|
|
67
78
|
- `agr` + `agrx` on your `PATH`
|
|
68
79
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
bun install
|
|
73
|
-
```
|
|
80
|
+
### Build/Development (working on this repo):
|
|
81
|
+
- Bun 1.3.8+
|
|
82
|
+
- Zig (required by OpenTUI build tooling)
|
|
74
83
|
|
|
75
|
-
|
|
84
|
+
#### Build
|
|
76
85
|
|
|
77
86
|
```bash
|
|
78
|
-
bun run
|
|
87
|
+
bun run build
|
|
79
88
|
```
|
|
80
|
-
|
|
81
|
-
Run it from the repo you want to manage (the current working directory is the target repo).
|
|
82
|
-
`agr.toml` is expected in that target repo for `agr add/remove/sync` operations.
|
|
83
|
-
|
|
84
|
-
### Run From Target Repo
|
|
85
|
-
|
|
89
|
+
or
|
|
86
90
|
```bash
|
|
87
|
-
|
|
88
|
-
agr-tui
|
|
91
|
+
make build
|
|
89
92
|
```
|
|
90
|
-
|
|
91
|
-
`agr-opentui` itself does not need to contain your target repo's `agr.toml`.
|
|
92
|
-
|
|
93
|
-
## Build
|
|
94
|
-
|
|
95
|
-
```bash
|
|
96
|
-
bun run build
|
|
97
|
-
```
|
|
98
|
-
|
|
99
93
|
This creates `bin/agr-tui`.
|
|
100
94
|
|
|
101
|
-
## Publish to PyPI
|
|
102
95
|
|
|
103
|
-
|
|
104
|
-
- Create a `pypi` environment in this GitHub repo.
|
|
105
|
-
- In your PyPI project settings, add this repo/workflow as a Trusted Publisher for `.github/workflows/publish-pypi.yml`.
|
|
106
|
-
- Optional: add `testpypi` environment and TestPyPI Trusted Publisher too.
|
|
107
|
-
|
|
108
|
-
Publish via GitHub Actions:
|
|
109
|
-
- Release publish: creating a GitHub release triggers publish to PyPI.
|
|
110
|
-
- Manual: run `publish-pypi` workflow and choose `pypi` or `testpypi`.
|
|
111
|
-
|
|
112
|
-
Publish from local machine:
|
|
96
|
+
#### Install
|
|
113
97
|
|
|
114
98
|
```bash
|
|
115
|
-
|
|
116
|
-
make py-publish # Upload to PyPI
|
|
117
|
-
make py-publish-test # Upload to TestPyPI
|
|
99
|
+
bun install
|
|
118
100
|
```
|
|
119
101
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
Update package version before creating a release:
|
|
123
|
-
|
|
124
|
-
1. Edit `pyproject.toml` and bump `[project].version`.
|
|
125
|
-
2. Regenerate `uv.lock` so the local package entry matches:
|
|
102
|
+
#### Run
|
|
126
103
|
|
|
127
104
|
```bash
|
|
128
|
-
|
|
105
|
+
bun run src/main.ts
|
|
129
106
|
```
|
|
130
107
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
make check
|
|
135
|
-
```
|
|
108
|
+
Run it from the repo you want to manage (the current working directory is the target repo).
|
|
109
|
+
`agr.toml` is expected in that target repo for `agr add/remove/sync` operations.
|
|
136
110
|
|
|
137
|
-
|
|
111
|
+
### Run From Target Repo
|
|
138
112
|
|
|
139
113
|
```bash
|
|
140
|
-
|
|
141
|
-
|
|
114
|
+
cd /path/to/your/project
|
|
115
|
+
agr-tui
|
|
142
116
|
```
|
|
143
117
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
`publish-pypi.yml` runs automatically when a release is published.
|
|
147
|
-
|
|
148
|
-
Alternative: use `.github/workflows/bump-version.yml` via **Actions → bump-version → Run workflow** and provide:
|
|
149
|
-
- `version` (required): target version like `0.3.0`
|
|
150
|
-
- `branch` (required): target branch to update (default `master`)
|
|
151
|
-
- `create_tag` (required): when enabled, creates/pushes tag `v<version>` and creates a GitHub Release
|
|
118
|
+
`agr-opentui` itself does not need to contain your target repo's `agr.toml`.
|
|
152
119
|
|
|
153
120
|
## Discover List (`skills.json`)
|
|
154
121
|
|
|
@@ -157,6 +124,8 @@ If `skills.json` exists, the `Discover` tab will list its entries. It supports:
|
|
|
157
124
|
- An array of strings or objects (`{ "label": "...", "handle": "...", "repo": "owner/repo" }`).
|
|
158
125
|
- An object with `source` metadata and `skills` array (see `skills.json` in this repo).
|
|
159
126
|
|
|
127
|
+
In this repository, `skills.json` is configured to source skills from `kasperjunge/agent-resources` (`agr.toml` on `main`).
|
|
128
|
+
|
|
160
129
|
When a `source` is configured, the app checks the remote list periodically (about every 6 hours) and can update `skills.json` using the `u`/`U`/`s`/`S` controls.
|
|
161
130
|
|
|
162
131
|
## Troubleshooting
|
|
@@ -168,7 +137,6 @@ When a `source` is configured, the app checks the remote list periodically (abou
|
|
|
168
137
|
- `skills.json not found` or parse errors: fix the file format (array or `{ "source": ..., "skills": [...] }`).
|
|
169
138
|
- Discover list not updating: check the `source` URL/repo/branch/path and network access.
|
|
170
139
|
- `SKILL.md` preview says “not found”: the skill may not ship a `SKILL.md` or the path is nonstandard.
|
|
171
|
-
- Copy to clipboard doesn’t work: install `pbcopy` (macOS), `wl-copy` (Wayland), or `xclip` (X11).
|
|
172
140
|
|
|
173
141
|
## Notes
|
|
174
142
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "agr-opentui"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.3.1"
|
|
4
4
|
description = "OpenTUI frontend for agr"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -19,7 +19,7 @@ classifiers = [
|
|
|
19
19
|
"Topic :: Software Development :: Build Tools",
|
|
20
20
|
"Topic :: Utilities",
|
|
21
21
|
]
|
|
22
|
-
requires-python = ">=3.14"
|
|
22
|
+
requires-python = ">=3.14.3"
|
|
23
23
|
dependencies = [
|
|
24
24
|
"agr>=0.7.4",
|
|
25
25
|
]
|
|
@@ -323,9 +323,12 @@ export function buildHelpLines(tab: "Skills" | "Discover"): string[] {
|
|
|
323
323
|
];
|
|
324
324
|
}
|
|
325
325
|
|
|
326
|
-
export function buildActionLines(
|
|
326
|
+
export function buildActionLines(
|
|
327
|
+
tab: "Skills" | "Discover",
|
|
328
|
+
options?: { updateAvailable?: boolean },
|
|
329
|
+
): string[] {
|
|
327
330
|
if (tab === "Skills") {
|
|
328
|
-
|
|
331
|
+
const lines = [
|
|
329
332
|
"f: filter list",
|
|
330
333
|
"p: pin selected",
|
|
331
334
|
"space: toggle select",
|
|
@@ -337,9 +340,6 @@ export function buildActionLines(tab: "Skills" | "Discover"): string[] {
|
|
|
337
340
|
"g: run",
|
|
338
341
|
"G: run options",
|
|
339
342
|
"u: check updates",
|
|
340
|
-
"U: apply update",
|
|
341
|
-
"s: apply (confirm)",
|
|
342
|
-
"S: apply + sync",
|
|
343
343
|
"a: add skill",
|
|
344
344
|
"d: doctor",
|
|
345
345
|
"T: test popup",
|
|
@@ -349,16 +349,18 @@ export function buildActionLines(tab: "Skills" | "Discover"): string[] {
|
|
|
349
349
|
"Arrow keys: move",
|
|
350
350
|
"q: quit",
|
|
351
351
|
];
|
|
352
|
+
if (options?.updateAvailable) {
|
|
353
|
+
lines.splice(11, 0, "U: apply update", "s: apply (confirm)", "S: apply + sync");
|
|
354
|
+
}
|
|
355
|
+
return lines;
|
|
352
356
|
}
|
|
353
357
|
return [
|
|
354
358
|
"f: filter list",
|
|
355
359
|
"p: pin selected",
|
|
356
360
|
"i: add selected",
|
|
357
|
-
"r: remove selected",
|
|
358
361
|
"z: undo last add/remove",
|
|
359
362
|
"L: run history",
|
|
360
363
|
"y: copy handle/repo",
|
|
361
|
-
"space: toggle select",
|
|
362
364
|
"a: add skill",
|
|
363
365
|
"d: doctor",
|
|
364
366
|
"T: test popup",
|
|
@@ -4,8 +4,9 @@ import { applyRows } from "../ui/rows_render";
|
|
|
4
4
|
export function renderActionsWithUi(input: {
|
|
5
5
|
tab: "Skills" | "Discover";
|
|
6
6
|
rowCount: number;
|
|
7
|
+
updateAvailable: boolean;
|
|
7
8
|
lines: Array<{ content: unknown; fg: unknown }>;
|
|
8
9
|
}): void {
|
|
9
|
-
const rows = buildActionRows({ tab: input.tab, rowCount: input.rowCount });
|
|
10
|
+
const rows = buildActionRows({ tab: input.tab, rowCount: input.rowCount, updateAvailable: input.updateAvailable });
|
|
10
11
|
applyRows(input.lines, rows);
|
|
11
12
|
}
|
|
@@ -166,8 +166,12 @@ export function buildDetailsRows(input: {
|
|
|
166
166
|
return rows;
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
-
export function buildActionRows(input: {
|
|
170
|
-
|
|
169
|
+
export function buildActionRows(input: {
|
|
170
|
+
tab: "Skills" | "Discover";
|
|
171
|
+
rowCount: number;
|
|
172
|
+
updateAvailable?: boolean;
|
|
173
|
+
}): UiRow[] {
|
|
174
|
+
const lines = buildActionLines(input.tab, { updateAvailable: input.updateAvailable });
|
|
171
175
|
const rows: UiRow[] = [];
|
|
172
176
|
for (let i = 0; i < input.rowCount; i += 1) {
|
|
173
177
|
const content = lines[i] ?? "";
|
|
@@ -280,7 +284,11 @@ export function buildThreePaneSnapshot(input: {
|
|
|
280
284
|
rowCount: 12,
|
|
281
285
|
});
|
|
282
286
|
|
|
283
|
-
const actions = buildActionRows({
|
|
287
|
+
const actions = buildActionRows({
|
|
288
|
+
tab: input.tab,
|
|
289
|
+
rowCount: 12,
|
|
290
|
+
updateAvailable: false,
|
|
291
|
+
});
|
|
284
292
|
|
|
285
293
|
return {
|
|
286
294
|
list: list.rows.map((row) => row.content),
|
|
@@ -288,7 +288,7 @@ describe("integration smoke: mocked command run", () => {
|
|
|
288
288
|
|
|
289
289
|
describe("help/action line snapshots", () => {
|
|
290
290
|
test("skills action lines stay stable", () => {
|
|
291
|
-
expect(buildActionLines("Skills")).toEqual([
|
|
291
|
+
expect(buildActionLines("Skills", { updateAvailable: true })).toEqual([
|
|
292
292
|
"f: filter list",
|
|
293
293
|
"p: pin selected",
|
|
294
294
|
"space: toggle select",
|
|
@@ -314,6 +314,30 @@ describe("help/action line snapshots", () => {
|
|
|
314
314
|
]);
|
|
315
315
|
});
|
|
316
316
|
|
|
317
|
+
test("skills action lines hide apply actions when no update is available", () => {
|
|
318
|
+
expect(buildActionLines("Skills", { updateAvailable: false })).toEqual([
|
|
319
|
+
"f: filter list",
|
|
320
|
+
"p: pin selected",
|
|
321
|
+
"space: toggle select",
|
|
322
|
+
"i: install selected",
|
|
323
|
+
"r: remove selected",
|
|
324
|
+
"z: undo last add/remove",
|
|
325
|
+
"L: run history",
|
|
326
|
+
"v: show SKILL",
|
|
327
|
+
"g: run",
|
|
328
|
+
"G: run options",
|
|
329
|
+
"u: check updates",
|
|
330
|
+
"a: add skill",
|
|
331
|
+
"d: doctor",
|
|
332
|
+
"T: test popup",
|
|
333
|
+
"c: reload config",
|
|
334
|
+
"H: help",
|
|
335
|
+
"Tab: next panel",
|
|
336
|
+
"Arrow keys: move",
|
|
337
|
+
"q: quit",
|
|
338
|
+
]);
|
|
339
|
+
});
|
|
340
|
+
|
|
317
341
|
test("discover help lines stay stable", () => {
|
|
318
342
|
expect(buildHelpLines("Discover")).toEqual([
|
|
319
343
|
"Discover lists skills from skills.json.",
|
|
@@ -223,4 +223,15 @@ describe("runtime key handler", () => {
|
|
|
223
223
|
expect(calls.openRunHistory).toBe(1);
|
|
224
224
|
expect(calls.undoLastAction).toBe(1);
|
|
225
225
|
});
|
|
226
|
+
|
|
227
|
+
test("invalid action key on active tab is ignored without blocking next input", () => {
|
|
228
|
+
const { state, calls, handleKey } = createDeps();
|
|
229
|
+
state.tabIndex = 1; // Discover tab
|
|
230
|
+
|
|
231
|
+
expect(handleKey("r")).toBe(false);
|
|
232
|
+
expect(calls.enterInputMode).toHaveLength(0);
|
|
233
|
+
|
|
234
|
+
expect(handleKey("f")).toBe(true);
|
|
235
|
+
expect(calls.enterInputMode).toEqual([{ mode: "filter", seed: "" }]);
|
|
236
|
+
});
|
|
226
237
|
});
|
|
@@ -88,7 +88,7 @@ describe("three-pane render snapshots", () => {
|
|
|
88
88
|
selectedIndex: 1,
|
|
89
89
|
list: [" alpha - org/repo", "> alpha - org/other", ""],
|
|
90
90
|
details: ["Name: alpha", "Source: org/other", "Handle: org/other/alpha", "Repo: org/other", ""],
|
|
91
|
-
actions: ["f: filter list", "p: pin selected", "i: add selected", "
|
|
91
|
+
actions: ["f: filter list", "p: pin selected", "i: add selected", "z: undo last add/remove", "L: run history"],
|
|
92
92
|
});
|
|
93
93
|
});
|
|
94
94
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
version = 1
|
|
2
2
|
revision = 3
|
|
3
|
-
requires-python = ">=3.14"
|
|
3
|
+
requires-python = ">=3.14.3"
|
|
4
4
|
|
|
5
5
|
[[package]]
|
|
6
6
|
name = "agr"
|
|
@@ -19,7 +19,7 @@ wheels = [
|
|
|
19
19
|
|
|
20
20
|
[[package]]
|
|
21
21
|
name = "agr-opentui"
|
|
22
|
-
version = "0.
|
|
22
|
+
version = "0.3.1"
|
|
23
23
|
source = { editable = "." }
|
|
24
24
|
dependencies = [
|
|
25
25
|
{ name = "agr" },
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|