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.
Files changed (109) hide show
  1. agr_opentui-0.3.1/.github/CODEOWNERS +5 -0
  2. agr_opentui-0.3.1/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  3. agr_opentui-0.3.1/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.github/workflows/bump-version.yml +27 -3
  5. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.github/workflows/publish-pypi.yml +38 -1
  6. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/PKG-INFO +36 -68
  7. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/README.md +34 -66
  8. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/pyproject.toml +2 -2
  9. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/app.ts +1 -0
  10. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/app_logic.ts +9 -7
  11. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_actions.ts +2 -1
  12. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/ui/controller.ts +11 -3
  13. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/app_logic.test.ts +25 -1
  14. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_actions_service.test.ts +1 -0
  15. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/runtime_handlers.test.ts +11 -0
  16. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/ui_controller.test.ts +1 -1
  17. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/uv.lock +2 -2
  18. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.github/renovate.json5 +0 -0
  19. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.github/workflows/build-bin.yml +0 -0
  20. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.github/workflows/ci.yml +0 -0
  21. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/.gitignore +0 -0
  22. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/Makefile +0 -0
  23. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/agr_opentui/__init__.py +0 -0
  24. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/agr_opentui/bridge.py +0 -0
  25. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/bun.lock +0 -0
  26. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/bunfig.toml +0 -0
  27. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/package.json +0 -0
  28. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/skills.json +0 -0
  29. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/commands.ts +0 -0
  30. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/deps.ts +0 -0
  31. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/main.ts +0 -0
  32. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/runtime/doctor.ts +0 -0
  33. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/runtime/handlers.ts +0 -0
  34. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/runtime/modal_input_handler.ts +0 -0
  35. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/add_flow.ts +0 -0
  36. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/agr.ts +0 -0
  37. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/agr_actions.ts +0 -0
  38. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/clipboard.ts +0 -0
  39. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/data.ts +0 -0
  40. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/discover_filter.ts +0 -0
  41. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/discover_labels.ts +0 -0
  42. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/feedback.ts +0 -0
  43. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/handle_match.ts +0 -0
  44. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/input_mode.ts +0 -0
  45. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/navigation.ts +0 -0
  46. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/preview.ts +0 -0
  47. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_all.ts +0 -0
  48. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_details.ts +0 -0
  49. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_footer.ts +0 -0
  50. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_help.ts +0 -0
  51. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_list.ts +0 -0
  52. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_missing_config.ts +0 -0
  53. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_preview.ts +0 -0
  54. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_run_modal.ts +0 -0
  55. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_run_options.ts +0 -0
  56. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_tabs.ts +0 -0
  57. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_update_confirm.ts +0 -0
  58. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/render_verify.ts +0 -0
  59. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/runtime_ops.ts +0 -0
  60. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/selection.ts +0 -0
  61. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/skills_file.ts +0 -0
  62. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/skills_source.ts +0 -0
  63. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/ui_feedback.ts +0 -0
  64. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/update.ts +0 -0
  65. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/verify.ts +0 -0
  66. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/verify_coordinator.ts +0 -0
  67. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/services/visible_items.ts +0 -0
  68. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/state.ts +0 -0
  69. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/ui/layout.ts +0 -0
  70. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/ui/render.ts +0 -0
  71. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/ui/rows_render.ts +0 -0
  72. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/src/ui.ts +0 -0
  73. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/add_flow_service.test.ts +0 -0
  74. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/agr_actions.test.ts +0 -0
  75. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/agr_service.test.ts +0 -0
  76. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/clipboard_service.test.ts +0 -0
  77. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/commands_service.test.ts +0 -0
  78. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/data_service.test.ts +0 -0
  79. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/discover_filter_service.test.ts +0 -0
  80. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/discover_labels.test.ts +0 -0
  81. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/feedback_service.test.ts +0 -0
  82. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/handle_match_service.test.ts +0 -0
  83. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/input_mode_service.test.ts +0 -0
  84. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/navigation_service.test.ts +0 -0
  85. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/preview_service.test.ts +0 -0
  86. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_all_service.test.ts +0 -0
  87. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_details_service.test.ts +0 -0
  88. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_footer_service.test.ts +0 -0
  89. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_help_service.test.ts +0 -0
  90. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_list_service.test.ts +0 -0
  91. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_missing_config_service.test.ts +0 -0
  92. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_preview_service.test.ts +0 -0
  93. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_run_modal_service.test.ts +0 -0
  94. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_run_options_service.test.ts +0 -0
  95. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_tabs_service.test.ts +0 -0
  96. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_update_confirm_service.test.ts +0 -0
  97. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/render_verify_service.test.ts +0 -0
  98. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/rows_render.test.ts +0 -0
  99. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/runtime_doctor.test.ts +0 -0
  100. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/runtime_ops_service.test.ts +0 -0
  101. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/selection_service.test.ts +0 -0
  102. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/skills_file_service.test.ts +0 -0
  103. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/skills_source.test.ts +0 -0
  104. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/ui_feedback_adapter.test.ts +0 -0
  105. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/update_service.test.ts +0 -0
  106. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/verify_coordinator_service.test.ts +0 -0
  107. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/verify_service.test.ts +0 -0
  108. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/test/visible_items_service.test.ts +0 -0
  109. {agr_opentui-0.2.1 → agr_opentui-0.3.1}/tsconfig.json +0 -0
@@ -0,0 +1,5 @@
1
+ # These owners will be the default owners for everything in
2
+ # the repo. Unless a later match takes precedence,
3
+ # @global-owner1 and @global-owner2 will be requested for
4
+ # review when someone opens a pull request.
5
+ * @RelativeSure
@@ -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: false
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@v6
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.2.1
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
- # OpenTUI for agr
24
+ <div align="center">
25
25
 
26
- OpenTUI front-end for managing `agr` skills: browse `agr.toml`, install/remove skills, preview `SKILL.md`, and run skills via `agrx`. Skill discovery is based on `https://github.com/kasperjunge/agent-resources`.
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
+ [![PyPI](https://img.shields.io/pypi/v/agr-opentui?color=blue)](https://pypi.org/project/agr-opentui/)
31
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
- - Bun 1.3.8+
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
- ## Install
93
-
94
- ```bash
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
- ## Run
107
+ #### Build
99
108
 
100
109
  ```bash
101
- bun run src/main.ts
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
- cd /path/to/your/project
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
- One-time setup:
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
- python -m pip install --upgrade build twine
139
- make py-publish # Upload to PyPI
140
- make py-publish-test # Upload to TestPyPI
122
+ bun install
141
123
  ```
142
124
 
143
- ## Bump Version
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
- uv lock
128
+ bun run src/main.ts
152
129
  ```
153
130
 
154
- 3. Run checks:
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
- 4. Commit the version bump:
134
+ ### Run From Target Repo
161
135
 
162
136
  ```bash
163
- git add pyproject.toml uv.lock
164
- git commit -m "chore: bump version to X.Y.Z"
137
+ cd /path/to/your/project
138
+ agr-tui
165
139
  ```
166
140
 
167
- 5. Create a GitHub release for `vX.Y.Z` (or manually run `publish-pypi` workflow).
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
- # OpenTUI for agr
1
+ <div align="center">
2
2
 
3
- OpenTUI front-end for managing `agr` skills: browse `agr.toml`, install/remove skills, preview `SKILL.md`, and run skills via `agrx`. Skill discovery is based on `https://github.com/kasperjunge/agent-resources`.
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
+ [![PyPI](https://img.shields.io/pypi/v/agr-opentui?color=blue)](https://pypi.org/project/agr-opentui/)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
- - Bun 1.3.8+
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
- ## Install
70
-
71
- ```bash
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
- ## Run
84
+ #### Build
76
85
 
77
86
  ```bash
78
- bun run src/main.ts
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
- cd /path/to/your/project
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
- One-time setup:
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
- python -m pip install --upgrade build twine
116
- make py-publish # Upload to PyPI
117
- make py-publish-test # Upload to TestPyPI
99
+ bun install
118
100
  ```
119
101
 
120
- ## Bump Version
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
- uv lock
105
+ bun run src/main.ts
129
106
  ```
130
107
 
131
- 3. Run checks:
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
- 4. Commit the version bump:
111
+ ### Run From Target Repo
138
112
 
139
113
  ```bash
140
- git add pyproject.toml uv.lock
141
- git commit -m "chore: bump version to X.Y.Z"
114
+ cd /path/to/your/project
115
+ agr-tui
142
116
  ```
143
117
 
144
- 5. Create a GitHub release for `vX.Y.Z` (or manually run `publish-pypi` workflow).
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.2.1"
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
  ]
@@ -353,6 +353,7 @@ function renderActions(): void {
353
353
  renderActionsWithUi({
354
354
  tab: getActiveTab() === "Discover" ? "Discover" : "Skills",
355
355
  rowCount: actionLines.length,
356
+ updateAvailable: state.updateAvailable,
356
357
  lines: actionLines,
357
358
  });
358
359
  }
@@ -323,9 +323,12 @@ export function buildHelpLines(tab: "Skills" | "Discover"): string[] {
323
323
  ];
324
324
  }
325
325
 
326
- export function buildActionLines(tab: "Skills" | "Discover"): string[] {
326
+ export function buildActionLines(
327
+ tab: "Skills" | "Discover",
328
+ options?: { updateAvailable?: boolean },
329
+ ): string[] {
327
330
  if (tab === "Skills") {
328
- return [
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: { tab: "Skills" | "Discover"; rowCount: number }): UiRow[] {
170
- const lines = buildActionLines(input.tab);
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({ tab: input.tab, rowCount: 12 });
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.",
@@ -13,6 +13,7 @@ describe("render actions service", () => {
13
13
  renderActionsWithUi({
14
14
  tab: "Discover",
15
15
  rowCount: lines.length,
16
+ updateAvailable: false,
16
17
  lines,
17
18
  });
18
19
 
@@ -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", "r: remove selected", "z: undo last add/remove"],
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.2.1"
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