fm2web 0.0.1__py3-none-any.whl
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.
- fm2web-0.0.1.dist-info/METADATA +274 -0
- fm2web-0.0.1.dist-info/RECORD +22 -0
- fm2web-0.0.1.dist-info/WHEEL +4 -0
- fm2web-0.0.1.dist-info/entry_points.txt +2 -0
- fm2web_cli/__init__.py +3 -0
- fm2web_cli/analyse/__init__.py +0 -0
- fm2web_cli/analyse/service.py +1012 -0
- fm2web_cli/cli/__init__.py +0 -0
- fm2web_cli/cli/app.py +337 -0
- fm2web_cli/core/__init__.py +0 -0
- fm2web_cli/core/models.py +111 -0
- fm2web_cli/core/paths.py +35 -0
- fm2web_cli/extract/__init__.py +0 -0
- fm2web_cli/extract/ddr_parser.py +329 -0
- fm2web_cli/extract/service.py +304 -0
- fm2web_cli/llm/__init__.py +0 -0
- fm2web_cli/llm/service.py +37 -0
- fm2web_cli/retrieval/__init__.py +0 -0
- fm2web_cli/retrieval/service.py +365 -0
- fm2web_cli/store/__init__.py +0 -0
- fm2web_cli/store/db.py +47 -0
- fm2web_cli/store/schema.py +156 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fm2web
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: CLI-first FileMaker DDR extraction, analysis, and LLM context engine
|
|
5
|
+
Author: Marcus Swift
|
|
6
|
+
License: Proprietary
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Requires-Dist: pydantic-settings>=2.2
|
|
9
|
+
Requires-Dist: pydantic>=2.6
|
|
10
|
+
Requires-Dist: rich>=13.7
|
|
11
|
+
Requires-Dist: typer>=0.12
|
|
12
|
+
Provides-Extra: dev
|
|
13
|
+
Requires-Dist: mypy>=1.8; extra == 'dev'
|
|
14
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
15
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
16
|
+
Provides-Extra: qdrant
|
|
17
|
+
Requires-Dist: qdrant-client>=1.9.0; extra == 'qdrant'
|
|
18
|
+
Provides-Extra: vector
|
|
19
|
+
Requires-Dist: sqlite-vec>=0.1.0; extra == 'vector'
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
|
|
22
|
+
# FM2Web
|
|
23
|
+
|
|
24
|
+
FM2Web is a CLI-first FileMaker DDR extraction, analysis, and LLM-context engine.
|
|
25
|
+
|
|
26
|
+
It turns FileMaker DDR XML exports into a local SQLite knowledge store containing normalized entities, relationships, evidence, retrieval chunks, and deterministic analysis findings. FM2Web does **not** call an internal LLM. Instead, it gives external agents and LLM tools grounded commands for retrieval, inspection, tracing, evidence lookup, and context-pack creation.
|
|
27
|
+
|
|
28
|
+
## Install with uv
|
|
29
|
+
|
|
30
|
+
Install from PyPI:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
uv tool install fm2web
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Confirm the command is on your `PATH`:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
fm2web --version
|
|
40
|
+
fm2web --help
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Upgrade later with:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
uv tool upgrade fm2web
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
If `uv` is not installed yet:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Quick start
|
|
56
|
+
|
|
57
|
+
Extract a single DDR XML file:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
fm2web extract \
|
|
61
|
+
--ddr /path/to/FileMaker_DDR.xml \
|
|
62
|
+
--project clean-sweep
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Extract a multi-file DDR directory containing `Summary.xml`:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
fm2web extract \
|
|
69
|
+
--ddr /path/to/DDR-directory \
|
|
70
|
+
--project clean-sweep
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Run deterministic analysis:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
fm2web analyse --project clean-sweep --refresh
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`analyse` is canonical Canadian spelling. `analyze` is also available as an alias.
|
|
80
|
+
|
|
81
|
+
Ask for an LLM-ready context pack without calling an internal LLM:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
fm2web ask \
|
|
85
|
+
--project clean-sweep \
|
|
86
|
+
"How does invoice creation work? Cite evidence." \
|
|
87
|
+
--json
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Core commands
|
|
91
|
+
|
|
92
|
+
### `extract`
|
|
93
|
+
|
|
94
|
+
Parses FileMaker DDR XML and writes normalized facts into SQLite.
|
|
95
|
+
|
|
96
|
+
Supported inputs:
|
|
97
|
+
|
|
98
|
+
- single DDR XML report
|
|
99
|
+
- `Summary.xml`
|
|
100
|
+
- directory containing `Summary.xml`
|
|
101
|
+
|
|
102
|
+
Extracted domains include:
|
|
103
|
+
|
|
104
|
+
- schema tables and fields
|
|
105
|
+
- relationship graph/table occurrences
|
|
106
|
+
- scripts and script steps
|
|
107
|
+
- script-call relationships
|
|
108
|
+
- layouts, layout objects, buttons, field references
|
|
109
|
+
- button-to-script activations
|
|
110
|
+
- custom functions
|
|
111
|
+
- value lists
|
|
112
|
+
- accounts and privilege sets
|
|
113
|
+
- evidence records
|
|
114
|
+
- retrieval chunks and FTS index
|
|
115
|
+
|
|
116
|
+
### `analyse` / `analyze`
|
|
117
|
+
|
|
118
|
+
Writes deterministic findings over the extracted facts.
|
|
119
|
+
|
|
120
|
+
Current finding layers include:
|
|
121
|
+
|
|
122
|
+
- `schema_quality`
|
|
123
|
+
- `script_call_graph`
|
|
124
|
+
- `script_data_access`
|
|
125
|
+
- `script_semantics`
|
|
126
|
+
- `layout_implementation`
|
|
127
|
+
- `feature_flow`
|
|
128
|
+
- `workflow_candidate`
|
|
129
|
+
- `business_feature`
|
|
130
|
+
- `security_mapping`
|
|
131
|
+
- `migration_risk`
|
|
132
|
+
|
|
133
|
+
Semantic analysis uses extracted script-step entities to classify action, intent, mutation, control-flow, integration, and UI/reporting behavior. These semantics roll up into layout feature flows and business feature findings.
|
|
134
|
+
|
|
135
|
+
### `retrieve`
|
|
136
|
+
|
|
137
|
+
Returns citation-bearing context chunks for a query:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
fm2web retrieve --project clean-sweep "square foot quoting" --json
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### `ask`
|
|
144
|
+
|
|
145
|
+
Builds an LLM-ready context packet and answer contract. FM2Web does not answer internally:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
fm2web ask --project clean-sweep "How does square foot quoting work?" --json
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### `findings`
|
|
152
|
+
|
|
153
|
+
Lists persisted analysis findings with explicit pagination:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
fm2web findings \
|
|
157
|
+
--project clean-sweep \
|
|
158
|
+
--type business_feature \
|
|
159
|
+
--limit 50 \
|
|
160
|
+
--offset 0 \
|
|
161
|
+
--json
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Analysis writes complete persisted findings. Output volume controls belong to read commands like `findings --limit/--offset`, not to the analyser.
|
|
165
|
+
|
|
166
|
+
### `inspect`
|
|
167
|
+
|
|
168
|
+
Inspects exact stored facts:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
fm2web inspect schema --project clean-sweep --table Contacts --json
|
|
172
|
+
fm2web inspect script --project clean-sweep --name "Save Invoice" --json
|
|
173
|
+
fm2web inspect layout --project clean-sweep --name "Invoice Detail" --json
|
|
174
|
+
fm2web inspect security --project clean-sweep --json
|
|
175
|
+
fm2web inspect entity --project clean-sweep --name Contacts --json
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### `trace`
|
|
179
|
+
|
|
180
|
+
Traverses dependencies and impacts in the stored relationship graph:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
fm2web trace \
|
|
184
|
+
--project clean-sweep \
|
|
185
|
+
--entity script:clean-sweep:save-invoice \
|
|
186
|
+
--direction both \
|
|
187
|
+
--depth 3 \
|
|
188
|
+
--json
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Directions:
|
|
192
|
+
|
|
193
|
+
- `upstream`
|
|
194
|
+
- `downstream`
|
|
195
|
+
- `both`
|
|
196
|
+
|
|
197
|
+
### `evidence`
|
|
198
|
+
|
|
199
|
+
Dereferences raw evidence by ID:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
fm2web evidence --project clean-sweep --id evidence:abc123 --json
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### `export context`
|
|
206
|
+
|
|
207
|
+
Writes a reusable Markdown context pack:
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
fm2web export context \
|
|
211
|
+
--project clean-sweep \
|
|
212
|
+
--question "How does invoicing work?" \
|
|
213
|
+
--out invoicing-context.md
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### `doctor`
|
|
217
|
+
|
|
218
|
+
Checks local readiness:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
fm2web doctor --json
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Store location
|
|
225
|
+
|
|
226
|
+
By default FM2Web uses project-local state under:
|
|
227
|
+
|
|
228
|
+
```text
|
|
229
|
+
.fm2web/fm2web.sqlite
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Override with:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
fm2web extract --store /path/to/fm2web.sqlite --ddr /path/to/ddr.xml --project clean-sweep
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Use the same `--store` path for follow-up commands.
|
|
239
|
+
|
|
240
|
+
## Optional extras
|
|
241
|
+
|
|
242
|
+
Install optional vector dependencies:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
uv tool install 'fm2web[vector]'
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Install optional Qdrant dependencies:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
uv tool install 'fm2web[qdrant]'
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
SQLite/FTS works without these extras.
|
|
255
|
+
|
|
256
|
+
## Development
|
|
257
|
+
|
|
258
|
+
From a source checkout:
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
uv sync --extra dev
|
|
262
|
+
uv run pytest
|
|
263
|
+
uv run fm2web --help
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Build locally:
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
uv build
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## License
|
|
273
|
+
|
|
274
|
+
Proprietary.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
fm2web_cli/__init__.py,sha256=y6lUwjOlwIehWV3WRpcRXJfg-Q5xf0n25paX8-PRAH0,48
|
|
2
|
+
fm2web_cli/analyse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
fm2web_cli/analyse/service.py,sha256=zNZfs_aqrgOFsaPai9xWG83gQxXR1gVkUKegfqJ3nXs,51186
|
|
4
|
+
fm2web_cli/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
fm2web_cli/cli/app.py,sha256=-JXbxK_cMfmzpqc61zPK00dfP7S21ToYDN4GPu4J2Pc,14107
|
|
6
|
+
fm2web_cli/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
fm2web_cli/core/models.py,sha256=wNaJsr5tAcEb9IiVUkew5KpQ5787TzVyJXP7qaHx3WU,2417
|
|
8
|
+
fm2web_cli/core/paths.py,sha256=bi8EcAsdUeltyYF_EYc09UECAtO25lh-Rdsv-N8dCaw,857
|
|
9
|
+
fm2web_cli/extract/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
+
fm2web_cli/extract/ddr_parser.py,sha256=B2eFTROd2yguB2JcqnFigqWbX8O1cPFtPKf1DOjhgAM,19252
|
|
11
|
+
fm2web_cli/extract/service.py,sha256=P2dcC9RI84V_kcDJW2FtyeA4TQxsiZLPa05ci4t6qDE,11675
|
|
12
|
+
fm2web_cli/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
+
fm2web_cli/llm/service.py,sha256=WcnvQ9z8ESAJFAGfohq4ZRPzHXO6hvc7b2nFdGH4kKw,1349
|
|
14
|
+
fm2web_cli/retrieval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
+
fm2web_cli/retrieval/service.py,sha256=xrSW81MHiFvnCvEfaNV9WIs-KmzFFa-hh4hz_7It-n0,14821
|
|
16
|
+
fm2web_cli/store/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
fm2web_cli/store/db.py,sha256=xMewzE7DofVmKOwT-WTvaJjGStqESSV-x835u2m8VGY,1598
|
|
18
|
+
fm2web_cli/store/schema.py,sha256=W-MVV2GnvJyjS24ONkTdnblnNGEI_2mJiVfuJ-sSPCo,4306
|
|
19
|
+
fm2web-0.0.1.dist-info/METADATA,sha256=ZfhRJHOcw2IRmjjiEQYyDQgyRN_eZLqxTBSwlmEJqSg,5617
|
|
20
|
+
fm2web-0.0.1.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
|
|
21
|
+
fm2web-0.0.1.dist-info/entry_points.txt,sha256=cWXykZX0RJIk4-jPUcYXzKtkBOXFmJnt219k1wYEOwI,50
|
|
22
|
+
fm2web-0.0.1.dist-info/RECORD,,
|
fm2web_cli/__init__.py
ADDED
|
File without changes
|