approvalui 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.
- approvalui-0.1.1/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
- approvalui-0.1.1/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- approvalui-0.1.1/.github/PULL_REQUEST_TEMPLATE.md +19 -0
- approvalui-0.1.1/.github/workflows/ci.yml +54 -0
- approvalui-0.1.1/.github/workflows/release.yml +48 -0
- approvalui-0.1.1/.gitignore +47 -0
- approvalui-0.1.1/CHANGELOG.md +29 -0
- approvalui-0.1.1/CODE_OF_CONDUCT.md +25 -0
- approvalui-0.1.1/CONTRIBUTING.md +41 -0
- approvalui-0.1.1/LICENSE +21 -0
- approvalui-0.1.1/PKG-INFO +178 -0
- approvalui-0.1.1/README.md +129 -0
- approvalui-0.1.1/SECURITY.md +19 -0
- approvalui-0.1.1/SKILL.md +48 -0
- approvalui-0.1.1/docs/_config.yml +4 -0
- approvalui-0.1.1/docs/advanced.md +53 -0
- approvalui-0.1.1/docs/architecture.md +55 -0
- approvalui-0.1.1/docs/assets/approvalui-demo.gif +0 -0
- approvalui-0.1.1/docs/assets/approvalui-screenshot.png +0 -0
- approvalui-0.1.1/docs/examples/claude.md +33 -0
- approvalui-0.1.1/docs/examples/codex.md +34 -0
- approvalui-0.1.1/docs/examples/kimi.md +34 -0
- approvalui-0.1.1/docs/index.md +43 -0
- approvalui-0.1.1/docs/troubleshooting.md +39 -0
- approvalui-0.1.1/example/README.md +19 -0
- approvalui-0.1.1/example/approval.html +78 -0
- approvalui-0.1.1/example/fixes.json +13 -0
- approvalui-0.1.1/example/screenshot.svg +8 -0
- approvalui-0.1.1/pyproject.toml +75 -0
- approvalui-0.1.1/src/approvalui/__init__.py +7 -0
- approvalui-0.1.1/src/approvalui/__main__.py +10 -0
- approvalui-0.1.1/src/approvalui/_core.py +177 -0
- approvalui-0.1.1/src/approvalui/cli.py +59 -0
- approvalui-0.1.1/tests/test_approvalui.py +132 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Report a problem with ApprovalUI
|
|
4
|
+
title: "[BUG] "
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Describe the bug
|
|
10
|
+
|
|
11
|
+
A clear and concise description of what the bug is.
|
|
12
|
+
|
|
13
|
+
## To reproduce
|
|
14
|
+
|
|
15
|
+
Steps to reproduce the behavior:
|
|
16
|
+
|
|
17
|
+
1. Run `approvalui ...`
|
|
18
|
+
2. Open `approval.html`
|
|
19
|
+
3. See error
|
|
20
|
+
|
|
21
|
+
## Expected behavior
|
|
22
|
+
|
|
23
|
+
What you expected to happen.
|
|
24
|
+
|
|
25
|
+
## Input JSON
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"title": "...",
|
|
30
|
+
"items": []
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Environment
|
|
35
|
+
|
|
36
|
+
- OS:
|
|
37
|
+
- Python version:
|
|
38
|
+
- ApprovalUI version:
|
|
39
|
+
|
|
40
|
+
## Additional context
|
|
41
|
+
|
|
42
|
+
Add any other context, screenshots, or browser console errors here.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea for ApprovalUI
|
|
4
|
+
title: "[FEATURE] "
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Is your feature request related to a problem?
|
|
10
|
+
|
|
11
|
+
A clear and concise description of what the problem is.
|
|
12
|
+
|
|
13
|
+
## Describe the solution you'd like
|
|
14
|
+
|
|
15
|
+
What should ApprovalUI do?
|
|
16
|
+
|
|
17
|
+
## Describe alternatives you've considered
|
|
18
|
+
|
|
19
|
+
Any alternative solutions or features you've considered.
|
|
20
|
+
|
|
21
|
+
## Additional context
|
|
22
|
+
|
|
23
|
+
Add any other context or screenshots here.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
## What changed
|
|
2
|
+
|
|
3
|
+
Briefly describe the change.
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
|
|
7
|
+
What problem does this solve?
|
|
8
|
+
|
|
9
|
+
## How to test
|
|
10
|
+
|
|
11
|
+
- `pytest`
|
|
12
|
+
- `ruff check src tests`
|
|
13
|
+
- `mypy src`
|
|
14
|
+
|
|
15
|
+
## Checklist
|
|
16
|
+
|
|
17
|
+
- [ ] Tests pass
|
|
18
|
+
- [ ] Lint passes
|
|
19
|
+
- [ ] README or docs updated if needed
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
|
|
15
|
+
- name: Set up Python
|
|
16
|
+
uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.12"
|
|
19
|
+
|
|
20
|
+
- name: Install dev dependencies
|
|
21
|
+
run: |
|
|
22
|
+
python -m pip install --upgrade pip
|
|
23
|
+
pip install -e ".[dev]"
|
|
24
|
+
|
|
25
|
+
- name: Lint with ruff
|
|
26
|
+
run: ruff check src tests
|
|
27
|
+
|
|
28
|
+
- name: Check formatting with ruff
|
|
29
|
+
run: ruff format --check src tests
|
|
30
|
+
|
|
31
|
+
- name: Type check with mypy
|
|
32
|
+
run: mypy src
|
|
33
|
+
|
|
34
|
+
test:
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
strategy:
|
|
37
|
+
matrix:
|
|
38
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
39
|
+
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/checkout@v4
|
|
42
|
+
|
|
43
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
44
|
+
uses: actions/setup-python@v5
|
|
45
|
+
with:
|
|
46
|
+
python-version: ${{ matrix.python-version }}
|
|
47
|
+
|
|
48
|
+
- name: Install package and dev dependencies
|
|
49
|
+
run: |
|
|
50
|
+
python -m pip install --upgrade pip
|
|
51
|
+
pip install -e ".[dev]"
|
|
52
|
+
|
|
53
|
+
- name: Run tests
|
|
54
|
+
run: pytest
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build-and-publish:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
environment:
|
|
12
|
+
name: pypi
|
|
13
|
+
url: https://pypi.org/p/approvalui
|
|
14
|
+
permissions:
|
|
15
|
+
contents: write
|
|
16
|
+
id-token: write
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Set up Python
|
|
21
|
+
uses: actions/setup-python@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: "3.12"
|
|
24
|
+
|
|
25
|
+
- name: Install build tools
|
|
26
|
+
run: |
|
|
27
|
+
python -m pip install --upgrade pip
|
|
28
|
+
pip install build
|
|
29
|
+
|
|
30
|
+
- name: Build distributions
|
|
31
|
+
run: python -m build
|
|
32
|
+
|
|
33
|
+
- name: Check for PyPI token
|
|
34
|
+
id: pypi
|
|
35
|
+
env:
|
|
36
|
+
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
|
37
|
+
run: |
|
|
38
|
+
if [ -n "$PYPI_TOKEN" ]; then
|
|
39
|
+
echo "has_token=true" >> "$GITHUB_OUTPUT"
|
|
40
|
+
else
|
|
41
|
+
echo "has_token=false" >> "$GITHUB_OUTPUT"
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
- name: Publish to PyPI
|
|
45
|
+
if: steps.pypi.outputs.has_token == 'true'
|
|
46
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
47
|
+
with:
|
|
48
|
+
password: ${{ secrets.PYPI_TOKEN }}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# macOS
|
|
2
|
+
.DS_Store
|
|
3
|
+
|
|
4
|
+
# Python
|
|
5
|
+
__pycache__/
|
|
6
|
+
*.py[cod]
|
|
7
|
+
*$py.class
|
|
8
|
+
*.so
|
|
9
|
+
.Python
|
|
10
|
+
build/
|
|
11
|
+
develop-eggs/
|
|
12
|
+
dist/
|
|
13
|
+
downloads/
|
|
14
|
+
eggs/
|
|
15
|
+
.eggs/
|
|
16
|
+
lib/
|
|
17
|
+
lib64/
|
|
18
|
+
parts/
|
|
19
|
+
sdist/
|
|
20
|
+
var/
|
|
21
|
+
wheels/
|
|
22
|
+
*.egg-info/
|
|
23
|
+
.installed.cfg
|
|
24
|
+
*.egg
|
|
25
|
+
MANIFEST
|
|
26
|
+
|
|
27
|
+
# Virtual environments
|
|
28
|
+
.env
|
|
29
|
+
.venv
|
|
30
|
+
env/
|
|
31
|
+
venv/
|
|
32
|
+
ENV/
|
|
33
|
+
|
|
34
|
+
# IDEs
|
|
35
|
+
.idea/
|
|
36
|
+
.vscode/
|
|
37
|
+
*.swp
|
|
38
|
+
*.swo
|
|
39
|
+
*~
|
|
40
|
+
|
|
41
|
+
# pytest
|
|
42
|
+
.pytest_cache/
|
|
43
|
+
.coverage
|
|
44
|
+
htmlcov/
|
|
45
|
+
|
|
46
|
+
# Generated example output (kept in repo for demos)
|
|
47
|
+
# example/approval.html
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.1] - 2026-06-17
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- GitHub Pages docs site with demo GIF and agent examples.
|
|
15
|
+
- PyPI publishing via GitHub Actions.
|
|
16
|
+
|
|
17
|
+
## [0.1.0] - 2026-06-15
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Initial release: `agent-ui-approval` CLI that renders a self-contained HTML approval page from a JSON spec.
|
|
22
|
+
- Approve/reject per item with optional comments.
|
|
23
|
+
- Generate and copy structured review text.
|
|
24
|
+
- Example spec and generated page in `example/`.
|
|
25
|
+
- Floom `SKILL.md` for agent integration.
|
|
26
|
+
|
|
27
|
+
[Unreleased]: https://github.com/floomhq/approvalui/compare/v0.1.1...HEAD
|
|
28
|
+
[0.1.1]: https://github.com/floomhq/approvalui/compare/v0.1.0...v0.1.1
|
|
29
|
+
[0.1.0]: https://github.com/floomhq/approvalui/releases/tag/v0.1.0
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
|
6
|
+
|
|
7
|
+
## Our Standards
|
|
8
|
+
|
|
9
|
+
Examples of behavior that contributes to a positive environment:
|
|
10
|
+
|
|
11
|
+
- Being respectful of differing viewpoints and experiences.
|
|
12
|
+
- Giving and gracefully accepting constructive feedback.
|
|
13
|
+
- Focusing on what is best for the community and users.
|
|
14
|
+
|
|
15
|
+
Examples of unacceptable behavior:
|
|
16
|
+
|
|
17
|
+
- Trolling, insulting or derogatory comments, and personal or political attacks.
|
|
18
|
+
- Public or private harassment.
|
|
19
|
+
- Publishing others' private information without permission.
|
|
20
|
+
|
|
21
|
+
## Enforcement
|
|
22
|
+
|
|
23
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the maintainers at **security@floom.dev**. All complaints will be reviewed and investigated promptly.
|
|
24
|
+
|
|
25
|
+
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for helping make Agent UI Approval better.
|
|
4
|
+
|
|
5
|
+
## Quick start
|
|
6
|
+
|
|
7
|
+
1. Fork the repo and clone your fork.
|
|
8
|
+
2. Create a virtual environment:
|
|
9
|
+
```bash
|
|
10
|
+
python3 -m venv .venv
|
|
11
|
+
source .venv/bin/activate
|
|
12
|
+
```
|
|
13
|
+
3. Install in editable mode with dev dependencies:
|
|
14
|
+
```bash
|
|
15
|
+
pip install -e ".[dev]"
|
|
16
|
+
```
|
|
17
|
+
4. Run the tests:
|
|
18
|
+
```bash
|
|
19
|
+
pytest
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## What to contribute
|
|
23
|
+
|
|
24
|
+
- Bug fixes for JSON parsing or HTML generation.
|
|
25
|
+
- Tests for edge cases in the spec format.
|
|
26
|
+
- Documentation improvements.
|
|
27
|
+
- UI/UX improvements to the generated approval page.
|
|
28
|
+
|
|
29
|
+
## Guidelines
|
|
30
|
+
|
|
31
|
+
- Keep the tool small and focused.
|
|
32
|
+
- Add tests for any new behavior.
|
|
33
|
+
- Update the README if you change the JSON spec or CLI.
|
|
34
|
+
- One logical change per pull request.
|
|
35
|
+
|
|
36
|
+
## Reporting issues
|
|
37
|
+
|
|
38
|
+
Open an issue with:
|
|
39
|
+
- The command you ran.
|
|
40
|
+
- The input JSON (or a minimal version of it).
|
|
41
|
+
- What you expected vs. what happened.
|
approvalui-0.1.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Agent UI Approval contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: approvalui
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Generate a clickable HTML approval page for reviewing UI fixes inside terminal-based AI agents.
|
|
5
|
+
Project-URL: Homepage, https://github.com/floomhq/approvalui
|
|
6
|
+
Project-URL: Repository, https://github.com/floomhq/approvalui
|
|
7
|
+
Project-URL: Issues, https://github.com/floomhq/approvalui/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/floomhq/approvalui/blob/main/CHANGELOG.md
|
|
9
|
+
Author: Federico de Ponte
|
|
10
|
+
License: MIT License
|
|
11
|
+
|
|
12
|
+
Copyright (c) 2026 Agent UI Approval contributors
|
|
13
|
+
|
|
14
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
15
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
16
|
+
in the Software without restriction, including without limitation the rights
|
|
17
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
18
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
19
|
+
furnished to do so, subject to the following conditions:
|
|
20
|
+
|
|
21
|
+
The above copyright notice and this permission notice shall be included in all
|
|
22
|
+
copies or substantial portions of the Software.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
25
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
26
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
27
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
28
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
29
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
30
|
+
SOFTWARE.
|
|
31
|
+
License-File: LICENSE
|
|
32
|
+
Keywords: agent,ai,approval,claude,codex,terminal,ui
|
|
33
|
+
Classifier: Development Status :: 3 - Alpha
|
|
34
|
+
Classifier: Intended Audience :: Developers
|
|
35
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
36
|
+
Classifier: Operating System :: OS Independent
|
|
37
|
+
Classifier: Programming Language :: Python :: 3
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
40
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
41
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
42
|
+
Classifier: Topic :: Utilities
|
|
43
|
+
Requires-Python: >=3.10
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: mypy>=1.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
47
|
+
Requires-Dist: ruff>=0.4.0; extra == 'dev'
|
|
48
|
+
Description-Content-Type: text/markdown
|
|
49
|
+
|
|
50
|
+
# ApprovalUI
|
|
51
|
+
|
|
52
|
+
[](LICENSE)
|
|
53
|
+
[](pyproject.toml)
|
|
54
|
+
[](https://github.com/floomhq/approvalui/actions)
|
|
55
|
+
[](https://pypi.org/project/approvalui/)
|
|
56
|
+
|
|
57
|
+
A tiny open-source loop for reviewing UI fixes inside terminal-based AI agents.
|
|
58
|
+
|
|
59
|
+
Terminal agents are great for code. They are bad at UI feedback, because UI feedback needs eyes, not paragraphs.
|
|
60
|
+
|
|
61
|
+
ApprovalUI renders a clickable HTML approval page from a simple JSON spec. You open it in a browser, tick approve or reject per item, generate a review, and paste it back into the agent.
|
|
62
|
+
|
|
63
|
+
Binary signal. Screenshot attached. No drift.
|
|
64
|
+
|
|
65
|
+

|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Why
|
|
70
|
+
|
|
71
|
+
When you iterate on frontend with a terminal agent, the feedback loop is verbal:
|
|
72
|
+
|
|
73
|
+
> “The divider looks weird — can you make it full height?”
|
|
74
|
+
|
|
75
|
+
The agent reads text, not pixels. You end up describing the same fix five times.
|
|
76
|
+
|
|
77
|
+
ApprovalUI short-circuits that loop. The agent writes a structured spec of the fixes, you review them visually, and the page gives you a structured text block to paste back.
|
|
78
|
+
|
|
79
|
+
Works with Claude Code, Codex, Kimi, or any terminal agent that can write JSON and open a browser.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## How it works
|
|
84
|
+
|
|
85
|
+
1. The agent writes a JSON spec describing each UI fix: title, issue number, screenshot, root cause.
|
|
86
|
+
2. `approvalui` turns the spec into a self-contained HTML page.
|
|
87
|
+
3. You open the page, review each item, tick **Approve** or **Reject**, add comments.
|
|
88
|
+
4. Click **Generate review** to get a structured text block you paste back into the agent.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Install
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
pip install approvalui
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Or clone and install in editable mode:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
git clone https://github.com/floomhq/approvalui.git
|
|
102
|
+
cd approvalui
|
|
103
|
+
pip install -e ".[dev]"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Quick start
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
approvalui example/fixes.json example/approval.html
|
|
112
|
+
open example/approval.html
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Tick approve or reject, add a comment, and click **Generate review**.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## JSON spec format
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"title": "Workeros — Fix Approval",
|
|
124
|
+
"instructions": "Tick the ones you approve, click Generate review, paste it back to me.",
|
|
125
|
+
"items": [
|
|
126
|
+
{
|
|
127
|
+
"id": 1218,
|
|
128
|
+
"title": "Brain split-view divider now runs FULL HEIGHT to the bottom",
|
|
129
|
+
"status": "pending",
|
|
130
|
+
"root_cause": "wrapper used min-h-full so Collection height:100% could not resolve",
|
|
131
|
+
"screenshot": "screenshot.svg"
|
|
132
|
+
}
|
|
133
|
+
]
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Only `id` and `title` are required. `root_cause`, `screenshot`, and `instructions` are optional.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Generated review format
|
|
142
|
+
|
|
143
|
+
```text
|
|
144
|
+
[APPROVE] #1218 — Brain split-view divider now runs FULL HEIGHT to the bottom
|
|
145
|
+
[REJECT] #1219 — Sidebar scrolls horizontally on mobile — comment: still broken on iPhone SE
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Documentation
|
|
151
|
+
|
|
152
|
+
- [Docs site](https://floomhq.github.io/approvalui/)
|
|
153
|
+
- [Architecture](docs/architecture.md)
|
|
154
|
+
- [Advanced usage](docs/advanced.md)
|
|
155
|
+
- [Troubleshooting](docs/troubleshooting.md)
|
|
156
|
+
- [Claude Code example](docs/examples/claude.md)
|
|
157
|
+
- [Codex example](docs/examples/codex.md)
|
|
158
|
+
- [Kimi example](docs/examples/kimi.md)
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Files
|
|
163
|
+
|
|
164
|
+
- `src/approvalui/` — the Python package.
|
|
165
|
+
- `example/` — sample spec, screenshot placeholder, and generated page.
|
|
166
|
+
- `SKILL.md` — Floom skill instructions for agent integration.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Contributing
|
|
171
|
+
|
|
172
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## License
|
|
177
|
+
|
|
178
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# ApprovalUI
|
|
2
|
+
|
|
3
|
+
[](LICENSE)
|
|
4
|
+
[](pyproject.toml)
|
|
5
|
+
[](https://github.com/floomhq/approvalui/actions)
|
|
6
|
+
[](https://pypi.org/project/approvalui/)
|
|
7
|
+
|
|
8
|
+
A tiny open-source loop for reviewing UI fixes inside terminal-based AI agents.
|
|
9
|
+
|
|
10
|
+
Terminal agents are great for code. They are bad at UI feedback, because UI feedback needs eyes, not paragraphs.
|
|
11
|
+
|
|
12
|
+
ApprovalUI renders a clickable HTML approval page from a simple JSON spec. You open it in a browser, tick approve or reject per item, generate a review, and paste it back into the agent.
|
|
13
|
+
|
|
14
|
+
Binary signal. Screenshot attached. No drift.
|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Why
|
|
21
|
+
|
|
22
|
+
When you iterate on frontend with a terminal agent, the feedback loop is verbal:
|
|
23
|
+
|
|
24
|
+
> “The divider looks weird — can you make it full height?”
|
|
25
|
+
|
|
26
|
+
The agent reads text, not pixels. You end up describing the same fix five times.
|
|
27
|
+
|
|
28
|
+
ApprovalUI short-circuits that loop. The agent writes a structured spec of the fixes, you review them visually, and the page gives you a structured text block to paste back.
|
|
29
|
+
|
|
30
|
+
Works with Claude Code, Codex, Kimi, or any terminal agent that can write JSON and open a browser.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## How it works
|
|
35
|
+
|
|
36
|
+
1. The agent writes a JSON spec describing each UI fix: title, issue number, screenshot, root cause.
|
|
37
|
+
2. `approvalui` turns the spec into a self-contained HTML page.
|
|
38
|
+
3. You open the page, review each item, tick **Approve** or **Reject**, add comments.
|
|
39
|
+
4. Click **Generate review** to get a structured text block you paste back into the agent.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Install
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pip install approvalui
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Or clone and install in editable mode:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
git clone https://github.com/floomhq/approvalui.git
|
|
53
|
+
cd approvalui
|
|
54
|
+
pip install -e ".[dev]"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Quick start
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
approvalui example/fixes.json example/approval.html
|
|
63
|
+
open example/approval.html
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Tick approve or reject, add a comment, and click **Generate review**.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## JSON spec format
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"title": "Workeros — Fix Approval",
|
|
75
|
+
"instructions": "Tick the ones you approve, click Generate review, paste it back to me.",
|
|
76
|
+
"items": [
|
|
77
|
+
{
|
|
78
|
+
"id": 1218,
|
|
79
|
+
"title": "Brain split-view divider now runs FULL HEIGHT to the bottom",
|
|
80
|
+
"status": "pending",
|
|
81
|
+
"root_cause": "wrapper used min-h-full so Collection height:100% could not resolve",
|
|
82
|
+
"screenshot": "screenshot.svg"
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Only `id` and `title` are required. `root_cause`, `screenshot`, and `instructions` are optional.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Generated review format
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
[APPROVE] #1218 — Brain split-view divider now runs FULL HEIGHT to the bottom
|
|
96
|
+
[REJECT] #1219 — Sidebar scrolls horizontally on mobile — comment: still broken on iPhone SE
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Documentation
|
|
102
|
+
|
|
103
|
+
- [Docs site](https://floomhq.github.io/approvalui/)
|
|
104
|
+
- [Architecture](docs/architecture.md)
|
|
105
|
+
- [Advanced usage](docs/advanced.md)
|
|
106
|
+
- [Troubleshooting](docs/troubleshooting.md)
|
|
107
|
+
- [Claude Code example](docs/examples/claude.md)
|
|
108
|
+
- [Codex example](docs/examples/codex.md)
|
|
109
|
+
- [Kimi example](docs/examples/kimi.md)
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Files
|
|
114
|
+
|
|
115
|
+
- `src/approvalui/` — the Python package.
|
|
116
|
+
- `example/` — sample spec, screenshot placeholder, and generated page.
|
|
117
|
+
- `SKILL.md` — Floom skill instructions for agent integration.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Contributing
|
|
122
|
+
|
|
123
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## License
|
|
128
|
+
|
|
129
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported versions
|
|
4
|
+
|
|
5
|
+
Only the latest release on the `main` branch is actively supported with security updates.
|
|
6
|
+
|
|
7
|
+
| Version | Supported |
|
|
8
|
+
| ------- | ------------------ |
|
|
9
|
+
| 0.1.x | :white_check_mark: |
|
|
10
|
+
|
|
11
|
+
## Reporting a vulnerability
|
|
12
|
+
|
|
13
|
+
If you discover a security issue, please email **security@floom.dev** with:
|
|
14
|
+
|
|
15
|
+
- A description of the vulnerability.
|
|
16
|
+
- Steps to reproduce it.
|
|
17
|
+
- The affected version or commit.
|
|
18
|
+
|
|
19
|
+
We will respond within 5 business days and coordinate a fix and disclosure.
|