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.
Files changed (123) hide show
  1. frob-0.0.0/PKG-INFO +206 -0
  2. frob-0.0.0/README.md +186 -0
  3. frob-0.0.0/pyproject.toml +65 -0
  4. frob-0.0.0/setup.cfg +4 -0
  5. frob-0.0.0/src/frob/__init__.py +0 -0
  6. frob-0.0.0/src/frob/__main__.py +296 -0
  7. frob-0.0.0/src/frob/_compat.py +18 -0
  8. frob-0.0.0/src/frob/app/__init__.py +4 -0
  9. frob-0.0.0/src/frob/app/app.py +68 -0
  10. frob-0.0.0/src/frob/app/arch_runner.py +43 -0
  11. frob-0.0.0/src/frob/app/bind_runner.py +73 -0
  12. frob-0.0.0/src/frob/app/bundle_runner.py +28 -0
  13. frob-0.0.0/src/frob/app/config.py +211 -0
  14. frob-0.0.0/src/frob/app/cycle_runner.py +67 -0
  15. frob-0.0.0/src/frob/app/docs_runner.py +79 -0
  16. frob-0.0.0/src/frob/app/dup_runner.py +36 -0
  17. frob-0.0.0/src/frob/app/init_runner.py +31 -0
  18. frob-0.0.0/src/frob/app/inspect_runner.py +85 -0
  19. frob-0.0.0/src/frob/app/map_runner.py +18 -0
  20. frob-0.0.0/src/frob/app/outline_runner.py +26 -0
  21. frob-0.0.0/src/frob/app/parse_runner.py +84 -0
  22. frob-0.0.0/src/frob/app/stub_runner.py +28 -0
  23. frob-0.0.0/src/frob/app/tokens_runner.py +18 -0
  24. frob-0.0.0/src/frob/app/xref_runner.py +29 -0
  25. frob-0.0.0/src/frob/arch/__init__.py +566 -0
  26. frob-0.0.0/src/frob/ast/__init__.py +0 -0
  27. frob-0.0.0/src/frob/ast/avr.py +0 -0
  28. frob-0.0.0/src/frob/ast/common.py +49 -0
  29. frob-0.0.0/src/frob/ast/cpp.py +155 -0
  30. frob-0.0.0/src/frob/ast/python.py +201 -0
  31. frob-0.0.0/src/frob/bind/__init__.py +95 -0
  32. frob-0.0.0/src/frob/bundle/__init__.py +226 -0
  33. frob-0.0.0/src/frob/cycle/__init__.py +0 -0
  34. frob-0.0.0/src/frob/cycle/graph.py +70 -0
  35. frob-0.0.0/src/frob/docs/__init__.py +270 -0
  36. frob-0.0.0/src/frob/dup/__init__.py +644 -0
  37. frob-0.0.0/src/frob/init/__init__.py +0 -0
  38. frob-0.0.0/src/frob/init/data/README.md.j2 +1 -0
  39. frob-0.0.0/src/frob/init/data/cpp_library.CMakeLists.txt.j2 +51 -0
  40. frob-0.0.0/src/frob/init/data/cpp_library.cmake.Config.cmake.in.j2 +4 -0
  41. frob-0.0.0/src/frob/init/data/cpp_library.include.h.j2 +3 -0
  42. frob-0.0.0/src/frob/init/data/cpp_library.src.cpp.j2 +3 -0
  43. frob-0.0.0/src/frob/init/data/cpp_library.tests.CMakeLists.txt.j2 +16 -0
  44. frob-0.0.0/src/frob/init/data/cpp_library.tests.cpp.j2 +7 -0
  45. frob-0.0.0/src/frob/init/data/cpp_shared.Makefile.j2 +72 -0
  46. frob-0.0.0/src/frob/init/data/cpp_shared.README.md.j2 +16 -0
  47. frob-0.0.0/src/frob/init/data/cpp_shared.cmake.toolchain-linux-arm64.cmake.j2 +9 -0
  48. frob-0.0.0/src/frob/init/data/cpp_shared.docs.index.md.j2 +30 -0
  49. frob-0.0.0/src/frob/init/data/cpp_shared.github.branch-protection.yml.j2 +34 -0
  50. frob-0.0.0/src/frob/init/data/cpp_shared.github.ci.yml.j2 +71 -0
  51. frob-0.0.0/src/frob/init/data/cpp_shared.github.release.yml.j2 +99 -0
  52. frob-0.0.0/src/frob/init/data/cpp_shared.gitignore.j2 +11 -0
  53. frob-0.0.0/src/frob/init/data/cpp_shared.tests.CMakeLists.txt.j2 +41 -0
  54. frob-0.0.0/src/frob/init/data/cpp_tool.CMakeLists.txt.j2 +22 -0
  55. frob-0.0.0/src/frob/init/data/cpp_tool.include.h.j2 +3 -0
  56. frob-0.0.0/src/frob/init/data/cpp_tool.src.cpp.j2 +3 -0
  57. frob-0.0.0/src/frob/init/data/cpp_tool.src.main.cpp.j2 +7 -0
  58. frob-0.0.0/src/frob/init/data/cpp_tool.tests.CMakeLists.txt.j2 +16 -0
  59. frob-0.0.0/src/frob/init/data/cpp_tool.tests.cpp.j2 +7 -0
  60. frob-0.0.0/src/frob/init/data/pybind11_library.CMakeLists.txt.j2 +16 -0
  61. frob-0.0.0/src/frob/init/data/pybind11_library.Makefile.j2 +21 -0
  62. frob-0.0.0/src/frob/init/data/pybind11_library.github.ci.yml.j2 +30 -0
  63. frob-0.0.0/src/frob/init/data/pybind11_library.include.h.j2 +3 -0
  64. frob-0.0.0/src/frob/init/data/pybind11_library.pyproject.toml.j2 +21 -0
  65. frob-0.0.0/src/frob/init/data/pybind11_library.python.__init__.py.j2 +3 -0
  66. frob-0.0.0/src/frob/init/data/pybind11_library.src.bindings.cpp.j2 +12 -0
  67. frob-0.0.0/src/frob/init/data/pybind11_library.src.cpp.j2 +5 -0
  68. frob-0.0.0/src/frob/init/data/pybind11_library.tests.test_bindings.py.j2 +6 -0
  69. frob-0.0.0/src/frob/init/data/pybind11_shared.gitignore.j2 +12 -0
  70. frob-0.0.0/src/frob/init/data/pyo3_library.Cargo.toml.j2 +11 -0
  71. frob-0.0.0/src/frob/init/data/pyo3_library.Makefile.j2 +22 -0
  72. frob-0.0.0/src/frob/init/data/pyo3_library.github.ci.yml.j2 +36 -0
  73. frob-0.0.0/src/frob/init/data/pyo3_library.pyproject.toml.j2 +23 -0
  74. frob-0.0.0/src/frob/init/data/pyo3_library.python.__init__.py.j2 +3 -0
  75. frob-0.0.0/src/frob/init/data/pyo3_library.src.lib.rs.j2 +13 -0
  76. frob-0.0.0/src/frob/init/data/pyo3_library.tests.test_bindings.py.j2 +6 -0
  77. frob-0.0.0/src/frob/init/data/pyo3_shared.gitignore.j2 +7 -0
  78. frob-0.0.0/src/frob/init/data/pyproject.toml.j2 +50 -0
  79. frob-0.0.0/src/frob/init/data/python_lib.__init__.py.j2 +1 -0
  80. frob-0.0.0/src/frob/init/data/python_shared.Makefile.j2 +67 -0
  81. frob-0.0.0/src/frob/init/data/python_shared.docs.index.md.j2 +25 -0
  82. frob-0.0.0/src/frob/init/data/python_shared.github.branch-protection.yml.j2 +32 -0
  83. frob-0.0.0/src/frob/init/data/python_shared.github.ci.yml.j2 +39 -0
  84. frob-0.0.0/src/frob/init/data/python_shared.gitignore.j2 +11 -0
  85. frob-0.0.0/src/frob/init/data/python_shared.logging.__init__.py.j2 +3 -0
  86. frob-0.0.0/src/frob/init/data/python_shared.logging.config.toml.j2 +30 -0
  87. frob-0.0.0/src/frob/init/data/python_shared.logging.filter.py.j2 +14 -0
  88. frob-0.0.0/src/frob/init/data/python_shared.logging.formatter.py.j2 +17 -0
  89. frob-0.0.0/src/frob/init/data/python_shared.logging.logger.py.j2 +32 -0
  90. frob-0.0.0/src/frob/init/data/python_shared.tests.conftest.py.j2 +4 -0
  91. frob-0.0.0/src/frob/init/data/python_shared.tests.system.test_build.py.j2 +37 -0
  92. frob-0.0.0/src/frob/init/data/python_shared.tests.unit.test_placeholder.py.j2 +2 -0
  93. frob-0.0.0/src/frob/init/data/python_tool.__init__.py.j2 +1 -0
  94. frob-0.0.0/src/frob/init/data/python_tool.__main__.py.j2 +18 -0
  95. frob-0.0.0/src/frob/init/data/python_tool.app.py.j2 +10 -0
  96. frob-0.0.0/src/frob/init/data/python_tool.config.py.j2 +26 -0
  97. frob-0.0.0/src/frob/init/project.py +266 -0
  98. frob-0.0.0/src/frob/inspect/__init__.py +119 -0
  99. frob-0.0.0/src/frob/logging/__init__.py +3 -0
  100. frob-0.0.0/src/frob/logging/config.toml +30 -0
  101. frob-0.0.0/src/frob/logging/filter.py +12 -0
  102. frob-0.0.0/src/frob/logging/formatter.py +18 -0
  103. frob-0.0.0/src/frob/logging/handler.py +0 -0
  104. frob-0.0.0/src/frob/logging/logger.py +25 -0
  105. frob-0.0.0/src/frob/map/__init__.py +138 -0
  106. frob-0.0.0/src/frob/outline/__init__.py +228 -0
  107. frob-0.0.0/src/frob/process/__init__.py +34 -0
  108. frob-0.0.0/src/frob/process/parsers/__init__.py +23 -0
  109. frob-0.0.0/src/frob/process/parsers/clang.py +66 -0
  110. frob-0.0.0/src/frob/process/parsers/common.py +122 -0
  111. frob-0.0.0/src/frob/process/parsers/junit.py +86 -0
  112. frob-0.0.0/src/frob/process/parsers/pycharm.py +148 -0
  113. frob-0.0.0/src/frob/process/parsers/pytest.py +126 -0
  114. frob-0.0.0/src/frob/process/parsers/ruff.py +104 -0
  115. frob-0.0.0/src/frob/process/parsers/ty.py +92 -0
  116. frob-0.0.0/src/frob/stub/__init__.py +59 -0
  117. frob-0.0.0/src/frob/tokens/__init__.py +168 -0
  118. frob-0.0.0/src/frob/xref/__init__.py +205 -0
  119. frob-0.0.0/src/frob.egg-info/PKG-INFO +206 -0
  120. frob-0.0.0/src/frob.egg-info/SOURCES.txt +121 -0
  121. frob-0.0.0/src/frob.egg-info/dependency_links.txt +1 -0
  122. frob-0.0.0/src/frob.egg-info/requires.txt +9 -0
  123. 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
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
File without changes