frob 0.0.0__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.
- frob-0.0.0/PKG-INFO +206 -0
- frob-0.0.0/README.md +186 -0
- frob-0.0.0/pyproject.toml +65 -0
- frob-0.0.0/setup.cfg +4 -0
- frob-0.0.0/src/frob/__init__.py +0 -0
- frob-0.0.0/src/frob/__main__.py +296 -0
- frob-0.0.0/src/frob/_compat.py +18 -0
- frob-0.0.0/src/frob/app/__init__.py +4 -0
- frob-0.0.0/src/frob/app/app.py +68 -0
- frob-0.0.0/src/frob/app/arch_runner.py +43 -0
- frob-0.0.0/src/frob/app/bind_runner.py +73 -0
- frob-0.0.0/src/frob/app/bundle_runner.py +28 -0
- frob-0.0.0/src/frob/app/config.py +211 -0
- frob-0.0.0/src/frob/app/cycle_runner.py +67 -0
- frob-0.0.0/src/frob/app/docs_runner.py +79 -0
- frob-0.0.0/src/frob/app/dup_runner.py +36 -0
- frob-0.0.0/src/frob/app/init_runner.py +31 -0
- frob-0.0.0/src/frob/app/inspect_runner.py +85 -0
- frob-0.0.0/src/frob/app/map_runner.py +18 -0
- frob-0.0.0/src/frob/app/outline_runner.py +26 -0
- frob-0.0.0/src/frob/app/parse_runner.py +84 -0
- frob-0.0.0/src/frob/app/stub_runner.py +28 -0
- frob-0.0.0/src/frob/app/tokens_runner.py +18 -0
- frob-0.0.0/src/frob/app/xref_runner.py +29 -0
- frob-0.0.0/src/frob/arch/__init__.py +566 -0
- frob-0.0.0/src/frob/ast/__init__.py +0 -0
- frob-0.0.0/src/frob/ast/avr.py +0 -0
- frob-0.0.0/src/frob/ast/common.py +49 -0
- frob-0.0.0/src/frob/ast/cpp.py +155 -0
- frob-0.0.0/src/frob/ast/python.py +201 -0
- frob-0.0.0/src/frob/bind/__init__.py +95 -0
- frob-0.0.0/src/frob/bundle/__init__.py +226 -0
- frob-0.0.0/src/frob/cycle/__init__.py +0 -0
- frob-0.0.0/src/frob/cycle/graph.py +70 -0
- frob-0.0.0/src/frob/docs/__init__.py +270 -0
- frob-0.0.0/src/frob/dup/__init__.py +644 -0
- frob-0.0.0/src/frob/init/__init__.py +0 -0
- frob-0.0.0/src/frob/init/data/README.md.j2 +1 -0
- frob-0.0.0/src/frob/init/data/cpp_library.CMakeLists.txt.j2 +51 -0
- frob-0.0.0/src/frob/init/data/cpp_library.cmake.Config.cmake.in.j2 +4 -0
- frob-0.0.0/src/frob/init/data/cpp_library.include.h.j2 +3 -0
- frob-0.0.0/src/frob/init/data/cpp_library.src.cpp.j2 +3 -0
- frob-0.0.0/src/frob/init/data/cpp_library.tests.CMakeLists.txt.j2 +16 -0
- frob-0.0.0/src/frob/init/data/cpp_library.tests.cpp.j2 +7 -0
- frob-0.0.0/src/frob/init/data/cpp_shared.Makefile.j2 +72 -0
- frob-0.0.0/src/frob/init/data/cpp_shared.README.md.j2 +16 -0
- frob-0.0.0/src/frob/init/data/cpp_shared.cmake.toolchain-linux-arm64.cmake.j2 +9 -0
- frob-0.0.0/src/frob/init/data/cpp_shared.docs.index.md.j2 +30 -0
- frob-0.0.0/src/frob/init/data/cpp_shared.github.branch-protection.yml.j2 +34 -0
- frob-0.0.0/src/frob/init/data/cpp_shared.github.ci.yml.j2 +71 -0
- frob-0.0.0/src/frob/init/data/cpp_shared.github.release.yml.j2 +99 -0
- frob-0.0.0/src/frob/init/data/cpp_shared.gitignore.j2 +11 -0
- frob-0.0.0/src/frob/init/data/cpp_shared.tests.CMakeLists.txt.j2 +41 -0
- frob-0.0.0/src/frob/init/data/cpp_tool.CMakeLists.txt.j2 +22 -0
- frob-0.0.0/src/frob/init/data/cpp_tool.include.h.j2 +3 -0
- frob-0.0.0/src/frob/init/data/cpp_tool.src.cpp.j2 +3 -0
- frob-0.0.0/src/frob/init/data/cpp_tool.src.main.cpp.j2 +7 -0
- frob-0.0.0/src/frob/init/data/cpp_tool.tests.CMakeLists.txt.j2 +16 -0
- frob-0.0.0/src/frob/init/data/cpp_tool.tests.cpp.j2 +7 -0
- frob-0.0.0/src/frob/init/data/pybind11_library.CMakeLists.txt.j2 +16 -0
- frob-0.0.0/src/frob/init/data/pybind11_library.Makefile.j2 +21 -0
- frob-0.0.0/src/frob/init/data/pybind11_library.github.ci.yml.j2 +30 -0
- frob-0.0.0/src/frob/init/data/pybind11_library.include.h.j2 +3 -0
- frob-0.0.0/src/frob/init/data/pybind11_library.pyproject.toml.j2 +21 -0
- frob-0.0.0/src/frob/init/data/pybind11_library.python.__init__.py.j2 +3 -0
- frob-0.0.0/src/frob/init/data/pybind11_library.src.bindings.cpp.j2 +12 -0
- frob-0.0.0/src/frob/init/data/pybind11_library.src.cpp.j2 +5 -0
- frob-0.0.0/src/frob/init/data/pybind11_library.tests.test_bindings.py.j2 +6 -0
- frob-0.0.0/src/frob/init/data/pybind11_shared.gitignore.j2 +12 -0
- frob-0.0.0/src/frob/init/data/pyo3_library.Cargo.toml.j2 +11 -0
- frob-0.0.0/src/frob/init/data/pyo3_library.Makefile.j2 +22 -0
- frob-0.0.0/src/frob/init/data/pyo3_library.github.ci.yml.j2 +36 -0
- frob-0.0.0/src/frob/init/data/pyo3_library.pyproject.toml.j2 +23 -0
- frob-0.0.0/src/frob/init/data/pyo3_library.python.__init__.py.j2 +3 -0
- frob-0.0.0/src/frob/init/data/pyo3_library.src.lib.rs.j2 +13 -0
- frob-0.0.0/src/frob/init/data/pyo3_library.tests.test_bindings.py.j2 +6 -0
- frob-0.0.0/src/frob/init/data/pyo3_shared.gitignore.j2 +7 -0
- frob-0.0.0/src/frob/init/data/pyproject.toml.j2 +50 -0
- frob-0.0.0/src/frob/init/data/python_lib.__init__.py.j2 +1 -0
- frob-0.0.0/src/frob/init/data/python_shared.Makefile.j2 +67 -0
- frob-0.0.0/src/frob/init/data/python_shared.docs.index.md.j2 +25 -0
- frob-0.0.0/src/frob/init/data/python_shared.github.branch-protection.yml.j2 +32 -0
- frob-0.0.0/src/frob/init/data/python_shared.github.ci.yml.j2 +39 -0
- frob-0.0.0/src/frob/init/data/python_shared.gitignore.j2 +11 -0
- frob-0.0.0/src/frob/init/data/python_shared.logging.__init__.py.j2 +3 -0
- frob-0.0.0/src/frob/init/data/python_shared.logging.config.toml.j2 +30 -0
- frob-0.0.0/src/frob/init/data/python_shared.logging.filter.py.j2 +14 -0
- frob-0.0.0/src/frob/init/data/python_shared.logging.formatter.py.j2 +17 -0
- frob-0.0.0/src/frob/init/data/python_shared.logging.logger.py.j2 +32 -0
- frob-0.0.0/src/frob/init/data/python_shared.tests.conftest.py.j2 +4 -0
- frob-0.0.0/src/frob/init/data/python_shared.tests.system.test_build.py.j2 +37 -0
- frob-0.0.0/src/frob/init/data/python_shared.tests.unit.test_placeholder.py.j2 +2 -0
- frob-0.0.0/src/frob/init/data/python_tool.__init__.py.j2 +1 -0
- frob-0.0.0/src/frob/init/data/python_tool.__main__.py.j2 +18 -0
- frob-0.0.0/src/frob/init/data/python_tool.app.py.j2 +10 -0
- frob-0.0.0/src/frob/init/data/python_tool.config.py.j2 +26 -0
- frob-0.0.0/src/frob/init/project.py +266 -0
- frob-0.0.0/src/frob/inspect/__init__.py +119 -0
- frob-0.0.0/src/frob/logging/__init__.py +3 -0
- frob-0.0.0/src/frob/logging/config.toml +30 -0
- frob-0.0.0/src/frob/logging/filter.py +12 -0
- frob-0.0.0/src/frob/logging/formatter.py +18 -0
- frob-0.0.0/src/frob/logging/handler.py +0 -0
- frob-0.0.0/src/frob/logging/logger.py +25 -0
- frob-0.0.0/src/frob/map/__init__.py +138 -0
- frob-0.0.0/src/frob/outline/__init__.py +228 -0
- frob-0.0.0/src/frob/process/__init__.py +34 -0
- frob-0.0.0/src/frob/process/parsers/__init__.py +23 -0
- frob-0.0.0/src/frob/process/parsers/clang.py +66 -0
- frob-0.0.0/src/frob/process/parsers/common.py +122 -0
- frob-0.0.0/src/frob/process/parsers/junit.py +86 -0
- frob-0.0.0/src/frob/process/parsers/pycharm.py +148 -0
- frob-0.0.0/src/frob/process/parsers/pytest.py +126 -0
- frob-0.0.0/src/frob/process/parsers/ruff.py +104 -0
- frob-0.0.0/src/frob/process/parsers/ty.py +92 -0
- frob-0.0.0/src/frob/stub/__init__.py +59 -0
- frob-0.0.0/src/frob/tokens/__init__.py +168 -0
- frob-0.0.0/src/frob/xref/__init__.py +205 -0
- frob-0.0.0/src/frob.egg-info/PKG-INFO +206 -0
- frob-0.0.0/src/frob.egg-info/SOURCES.txt +121 -0
- frob-0.0.0/src/frob.egg-info/dependency_links.txt +1 -0
- frob-0.0.0/src/frob.egg-info/requires.txt +9 -0
- frob-0.0.0/src/frob.egg-info/top_level.txt +1 -0
frob-0.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: frob
|
|
3
|
+
Version: 0.0.0
|
|
4
|
+
Summary: These are tools that I use in my development workflow.
|
|
5
|
+
Author-email: Logan Dapp <logan@logand.app>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/lognd/frob
|
|
8
|
+
Project-URL: Documentation, https://github.com/lognd/frob/docs
|
|
9
|
+
Project-URL: Source, https://github.com/lognd/frob
|
|
10
|
+
Project-URL: Issues, https://github.com/lognd/frob/issues
|
|
11
|
+
Requires-Python: >=3.10
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
Requires-Dist: tomli>=2.0; python_version < "3.11"
|
|
14
|
+
Requires-Dist: typani>=0.0.3
|
|
15
|
+
Requires-Dist: pydantic>=2.12.0
|
|
16
|
+
Requires-Dist: tree-sitter>=0.25.2
|
|
17
|
+
Requires-Dist: tree-sitter-python>=0.25.0
|
|
18
|
+
Requires-Dist: tree-sitter-cpp>=0.23.4
|
|
19
|
+
Requires-Dist: jinja2>=3.1
|
|
20
|
+
|
|
21
|
+
# frob
|
|
22
|
+
|
|
23
|
+
Developer workflow CLI tools. Designed for agentic and human use.
|
|
24
|
+
|
|
25
|
+
Install: `pip install frob` or `uvx frob`. For editable dev install: `pip install -e .`
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Commands
|
|
30
|
+
|
|
31
|
+
### `frob init` -- project scaffolding
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
frob init list # list registered project types
|
|
35
|
+
frob init new <type> <name> --output DIR # scaffold a new project
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Project types:
|
|
39
|
+
- `python-library` -- installable Python package with logging, tests, CI
|
|
40
|
+
- `python-tool` -- Python CLI tool with argparse, app/, config, CI
|
|
41
|
+
- `cpp-library` -- FetchContent-compatible C++ library with CMake, GTest/Catch2, CI
|
|
42
|
+
- `cpp-tool` -- C++ executable with CMake, cross-platform CI, release workflow
|
|
43
|
+
- `pybind11-library` -- hybrid Python/C++ library using pybind11 + scikit-build-core
|
|
44
|
+
- `pyo3-library` -- hybrid Python/Rust library using PyO3 + maturin
|
|
45
|
+
|
|
46
|
+
All templates include: Makefile, .gitignore, docs/, GitHub Actions CI, branch-protection workflow.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
### `frob map` -- project structure
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
frob map src/ # directory tree with token counts per file
|
|
54
|
+
frob map src/ --json # JSON with path, lines, tokens, symbols per file
|
|
55
|
+
frob map src/ --depth 2 # limit recursion depth
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
### `frob outline` -- file signatures
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
frob outline src/file.py # functions and classes with line numbers
|
|
64
|
+
frob outline src/file.py --json # structured JSON output
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Shows signatures only -- no bodies. Fast way to see what is in a file before reading it.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
### `frob stub` -- single-function context
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
frob stub src/file.py target_fn # keep target intact, stub everything else
|
|
75
|
+
frob stub src/file.py MyClass.method # class method variant
|
|
76
|
+
frob stub src/file.py target_fn --output FILE
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Useful for giving an LLM minimal context for one function.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### `frob bundle` -- function + its dependencies
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
frob bundle src/file.py fn_name # function + all functions it calls
|
|
87
|
+
frob bundle src/file.py fn_name --depth 2
|
|
88
|
+
frob bundle src/file.py fn_name --format json
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
### `frob tokens` -- token count
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
frob tokens src/file.py # total tokens
|
|
97
|
+
frob tokens src/file.py --detail # per-symbol breakdown
|
|
98
|
+
frob tokens src/ --json # JSON with total_tokens and per-file list
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### `frob xref` -- cross-references
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
frob xref symbol src/ # find definition + all callers of a symbol
|
|
107
|
+
frob xref symbol src/ --json
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
### `frob cycle` -- import cycle detection
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
frob cycle src/ # detect import cycles
|
|
116
|
+
frob cycle src/ --suggest # with refactoring suggestions
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### `frob dup` -- duplicate code detection
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
frob dup src/ # find structurally identical code blocks
|
|
125
|
+
frob dup src/ --min-lines 10 # minimum block size
|
|
126
|
+
frob dup src/ --json # JSON with groups, clone_type, fragments
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Detects exact clones and renamed-variable clones.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### `frob arch` -- architectural lint
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
frob arch src/ # god-class, long-function, deep-nesting
|
|
137
|
+
frob arch src/ --json # JSON with suggestions list
|
|
138
|
+
frob arch src/ --max-function-lines 50
|
|
139
|
+
frob arch src/ --max-class-methods 20
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### `frob docs` -- docstrings and docs/ search
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
frob docs src/file.py # extract all docstrings
|
|
148
|
+
frob docs src/file.py MyClass # docstrings for a specific symbol
|
|
149
|
+
frob docs src/file.py --overview # relevant headings from docs/ folder
|
|
150
|
+
frob docs src/ --search "authentication" # full-text search through docs/ .md files
|
|
151
|
+
frob docs src/file.py --json
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
### `frob bind` -- binding consistency check
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
frob bind . # verify // BIND: comments match source declarations
|
|
160
|
+
frob bind . --json # JSON with ok, mismatches list
|
|
161
|
+
frob bind . --list-bindings # show all BIND declarations found
|
|
162
|
+
frob bind . --list-sources # show all detected source signatures
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Checks pybind11 (`bindings.cpp`) and PyO3 (`lib.rs`) `// BIND: signature` comments
|
|
166
|
+
against actual C++ header declarations and Rust `#[pyfunction]` signatures.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
### `frob parse` -- parse tool output
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
<tool> | frob parse <tool> # parse and summarize
|
|
174
|
+
<tool> | frob parse <tool> --json # structured JSON
|
|
175
|
+
<tool> | frob parse <tool> --passthrough # propagate exit code
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Supported tools: `pytest`, `ruff`, `ty`, `clang`, `junit`, `pycharm`
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
### `frob inspect` -- PyCharm headless inspection
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
frob inspect <project_dir>
|
|
186
|
+
frob inspect <project_dir> --json
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Development
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
make install # uv sync --all-extras
|
|
195
|
+
make format # black + ruff format
|
|
196
|
+
make lint # ruff + ty check
|
|
197
|
+
make test # pytest tests/
|
|
198
|
+
make test-fast # pytest --testmon (incremental)
|
|
199
|
+
make upload # bump version if needed, build wheel, publish to PyPI
|
|
200
|
+
make clean
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
The `.frob-foundation.md` convention: when `smart-start` generates infrastructure code,
|
|
204
|
+
it writes a registry of abstractions to `.frob-foundation.md` at the project root.
|
|
205
|
+
The `implementer` agent reads this file automatically so it knows which base classes,
|
|
206
|
+
protocols, and helpers already exist and should be used.
|
frob-0.0.0/README.md
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# frob
|
|
2
|
+
|
|
3
|
+
Developer workflow CLI tools. Designed for agentic and human use.
|
|
4
|
+
|
|
5
|
+
Install: `pip install frob` or `uvx frob`. For editable dev install: `pip install -e .`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Commands
|
|
10
|
+
|
|
11
|
+
### `frob init` -- project scaffolding
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
frob init list # list registered project types
|
|
15
|
+
frob init new <type> <name> --output DIR # scaffold a new project
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Project types:
|
|
19
|
+
- `python-library` -- installable Python package with logging, tests, CI
|
|
20
|
+
- `python-tool` -- Python CLI tool with argparse, app/, config, CI
|
|
21
|
+
- `cpp-library` -- FetchContent-compatible C++ library with CMake, GTest/Catch2, CI
|
|
22
|
+
- `cpp-tool` -- C++ executable with CMake, cross-platform CI, release workflow
|
|
23
|
+
- `pybind11-library` -- hybrid Python/C++ library using pybind11 + scikit-build-core
|
|
24
|
+
- `pyo3-library` -- hybrid Python/Rust library using PyO3 + maturin
|
|
25
|
+
|
|
26
|
+
All templates include: Makefile, .gitignore, docs/, GitHub Actions CI, branch-protection workflow.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
### `frob map` -- project structure
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
frob map src/ # directory tree with token counts per file
|
|
34
|
+
frob map src/ --json # JSON with path, lines, tokens, symbols per file
|
|
35
|
+
frob map src/ --depth 2 # limit recursion depth
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
### `frob outline` -- file signatures
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
frob outline src/file.py # functions and classes with line numbers
|
|
44
|
+
frob outline src/file.py --json # structured JSON output
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Shows signatures only -- no bodies. Fast way to see what is in a file before reading it.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### `frob stub` -- single-function context
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
frob stub src/file.py target_fn # keep target intact, stub everything else
|
|
55
|
+
frob stub src/file.py MyClass.method # class method variant
|
|
56
|
+
frob stub src/file.py target_fn --output FILE
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Useful for giving an LLM minimal context for one function.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
### `frob bundle` -- function + its dependencies
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
frob bundle src/file.py fn_name # function + all functions it calls
|
|
67
|
+
frob bundle src/file.py fn_name --depth 2
|
|
68
|
+
frob bundle src/file.py fn_name --format json
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
### `frob tokens` -- token count
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
frob tokens src/file.py # total tokens
|
|
77
|
+
frob tokens src/file.py --detail # per-symbol breakdown
|
|
78
|
+
frob tokens src/ --json # JSON with total_tokens and per-file list
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### `frob xref` -- cross-references
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
frob xref symbol src/ # find definition + all callers of a symbol
|
|
87
|
+
frob xref symbol src/ --json
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
### `frob cycle` -- import cycle detection
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
frob cycle src/ # detect import cycles
|
|
96
|
+
frob cycle src/ --suggest # with refactoring suggestions
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### `frob dup` -- duplicate code detection
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
frob dup src/ # find structurally identical code blocks
|
|
105
|
+
frob dup src/ --min-lines 10 # minimum block size
|
|
106
|
+
frob dup src/ --json # JSON with groups, clone_type, fragments
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Detects exact clones and renamed-variable clones.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
### `frob arch` -- architectural lint
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
frob arch src/ # god-class, long-function, deep-nesting
|
|
117
|
+
frob arch src/ --json # JSON with suggestions list
|
|
118
|
+
frob arch src/ --max-function-lines 50
|
|
119
|
+
frob arch src/ --max-class-methods 20
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
### `frob docs` -- docstrings and docs/ search
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
frob docs src/file.py # extract all docstrings
|
|
128
|
+
frob docs src/file.py MyClass # docstrings for a specific symbol
|
|
129
|
+
frob docs src/file.py --overview # relevant headings from docs/ folder
|
|
130
|
+
frob docs src/ --search "authentication" # full-text search through docs/ .md files
|
|
131
|
+
frob docs src/file.py --json
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### `frob bind` -- binding consistency check
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
frob bind . # verify // BIND: comments match source declarations
|
|
140
|
+
frob bind . --json # JSON with ok, mismatches list
|
|
141
|
+
frob bind . --list-bindings # show all BIND declarations found
|
|
142
|
+
frob bind . --list-sources # show all detected source signatures
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Checks pybind11 (`bindings.cpp`) and PyO3 (`lib.rs`) `// BIND: signature` comments
|
|
146
|
+
against actual C++ header declarations and Rust `#[pyfunction]` signatures.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
### `frob parse` -- parse tool output
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
<tool> | frob parse <tool> # parse and summarize
|
|
154
|
+
<tool> | frob parse <tool> --json # structured JSON
|
|
155
|
+
<tool> | frob parse <tool> --passthrough # propagate exit code
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Supported tools: `pytest`, `ruff`, `ty`, `clang`, `junit`, `pycharm`
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
### `frob inspect` -- PyCharm headless inspection
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
frob inspect <project_dir>
|
|
166
|
+
frob inspect <project_dir> --json
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Development
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
make install # uv sync --all-extras
|
|
175
|
+
make format # black + ruff format
|
|
176
|
+
make lint # ruff + ty check
|
|
177
|
+
make test # pytest tests/
|
|
178
|
+
make test-fast # pytest --testmon (incremental)
|
|
179
|
+
make upload # bump version if needed, build wheel, publish to PyPI
|
|
180
|
+
make clean
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
The `.frob-foundation.md` convention: when `smart-start` generates infrastructure code,
|
|
184
|
+
it writes a registry of abstractions to `.frob-foundation.md` at the project root.
|
|
185
|
+
The `implementer` agent reads this file automatically so it knows which base classes,
|
|
186
|
+
protocols, and helpers already exist and should be used.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "frob"
|
|
7
|
+
version = "0.0.0"
|
|
8
|
+
description = "These are tools that I use in my development workflow."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "Logan Dapp", email = "logan@logand.app" }
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
dependencies = [
|
|
17
|
+
"tomli>=2.0; python_version < '3.11'",
|
|
18
|
+
"typani>=0.0.3",
|
|
19
|
+
"pydantic>=2.12.0",
|
|
20
|
+
"tree-sitter>=0.25.2",
|
|
21
|
+
"tree-sitter-python>=0.25.0",
|
|
22
|
+
"tree-sitter-cpp>=0.23.4",
|
|
23
|
+
"jinja2>=3.1",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[project.urls]
|
|
27
|
+
Homepage = "https://github.com/lognd/frob"
|
|
28
|
+
Documentation = "https://github.com/lognd/frob/docs"
|
|
29
|
+
Source = "https://github.com/lognd/frob"
|
|
30
|
+
Issues = "https://github.com/lognd/frob/issues"
|
|
31
|
+
|
|
32
|
+
[dependency-groups]
|
|
33
|
+
dev = [
|
|
34
|
+
"black>=24",
|
|
35
|
+
"packaging",
|
|
36
|
+
"pytest>=8",
|
|
37
|
+
"pytest-testmon>=2",
|
|
38
|
+
"ruff>=0.8",
|
|
39
|
+
"ty>=0.0.1a8",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
[tool.setuptools]
|
|
43
|
+
packages = { find = { where = ["src"] } }
|
|
44
|
+
|
|
45
|
+
[tool.setuptools.package-data]
|
|
46
|
+
frob = ["py.typed", "init/data/*.j2", "logging/config.toml"]
|
|
47
|
+
|
|
48
|
+
[tool.ruff]
|
|
49
|
+
line-length = 88
|
|
50
|
+
|
|
51
|
+
[tool.ruff.lint]
|
|
52
|
+
select = ["E", "F", "W", "I"]
|
|
53
|
+
|
|
54
|
+
[tool.ruff.lint.per-file-ignores]
|
|
55
|
+
"tests/**" = ["E501"]
|
|
56
|
+
# Fixture files are intentionally bad code used to test error detection
|
|
57
|
+
"tests/fixtures/**" = ["E501", "F401", "F811", "F841", "E741", "W"]
|
|
58
|
+
|
|
59
|
+
[tool.black]
|
|
60
|
+
line-length = 88
|
|
61
|
+
|
|
62
|
+
[tool.pytest.ini_options]
|
|
63
|
+
testpaths = ["tests"]
|
|
64
|
+
addopts = "-q"
|
|
65
|
+
pythonpath = ["."]
|
frob-0.0.0/setup.cfg
ADDED
|
File without changes
|