mfcli 0.2.5__tar.gz → 0.2.7__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.
- {mfcli-0.2.5 → mfcli-0.2.7}/PKG-INFO +83 -21
- {mfcli-0.2.5 → mfcli-0.2.7}/README.md +82 -18
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/.env.example +11 -5
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/agents/controller/agent.py +2 -2
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/agents/controller/config.yaml +1 -1
- mfcli-0.2.7/mfcli/cli/main.py +350 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/constants/file_types.py +12 -5
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/crud/project.py +65 -20
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/classifier.py +22 -13
- mfcli-0.2.7/mfcli/pipeline/extractor.py +37 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/pipeline.py +210 -23
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/sub_classifier.py +7 -5
- mfcli-0.2.7/mfcli/utils/cheatsheet_regenerator.py +498 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/cline_rules.py +2 -2
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/config.py +2 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/configurator.py +74 -25
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/data_cleaner.py +0 -1
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/datasheet_vectorizer.py +4 -5
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/directory_manager.py +4 -7
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/system_check.py +1 -1
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli.egg-info/SOURCES.txt +1 -1
- {mfcli-0.2.5 → mfcli-0.2.7}/pyproject.toml +1 -3
- mfcli-0.2.5/mfcli/cli/main.py +0 -220
- mfcli-0.2.5/mfcli/client/llama_parse.py +0 -38
- mfcli-0.2.5/mfcli/pipeline/extractor.py +0 -34
- {mfcli-0.2.5 → mfcli-0.2.7}/BUILD.md +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/CONFIGURATION.md +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/INSTALL.md +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/LICENSE +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/MANIFEST.in +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/MCP_SETUP.md +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/install.ps1 +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/install.sh +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/agents/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/agents/controller/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/agents/controller/tools.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/agents/tools/general.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/alembic/env.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/alembic/script.py.mako +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/alembic/versions/6ccc0c7c397c_added_fields_to_pdf_parts_model.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/alembic/versions/769019ef4870_added_gemini_file_path_to_pdf_part_model.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/alembic/versions/7a2e3a779fdc_added_functional_block_and_component_.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/alembic/versions/7d5adb2a47a7_added_pdf_parts_model.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/alembic/versions/7fcb7d6a5836_init.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/alembic/versions/e0f2b5765c72_added_cascade_delete_for_models_that_.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/alembic/versions/f1234567890a_make_bom_description_nullable.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/alembic.ini +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/cli/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/cli/dependencies.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/client/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/client/chroma_db.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/client/docling.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/client/gemini.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/client/vector_db.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/constants/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/constants/base_enum.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/constants/directory_names.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/constants/gemini.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/constants/openai.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/constants/pipeline_run_status.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/crud/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/crud/file.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/crud/functional_blocks.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/crud/netlist.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/crud/pipeline_run.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/digikey/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/digikey/digikey.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/main.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/mcp/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/mcp/configs/cline_mcp_settings.json +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/mcp/configs/mfcli.mcp.json +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/mcp/mcp_instance.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/mcp/server.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/mcp/state_manager.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/mcp/tools/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/mcp/tools/query_knowledgebase.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/base.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/bom.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/datasheet.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/debug_setup.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/file.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/file_docket.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/file_metadata.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/functional_blocks.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/llm_response.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/mcu.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/mcu_errata.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/netlist.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/pdf_parts.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/pipeline_run.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/project.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/project_metadata.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/models/schematic_cheatsheet.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/bom_netlist_mapper.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/bom/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/bom/bom.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/debug_setup/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/debug_setup/debug_setup.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/debug_setup/instructions.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/functional_blocks/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/functional_blocks/functional_blocks.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/functional_blocks/instructions.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/functional_blocks/validator.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/generator.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/generator_base.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/mcu/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/mcu/instructions.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/mcu/mcu.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/mcu_errata/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/mcu_errata/instructions.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/mcu_errata/mcu_errata.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/schematic/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/schematic/instructions.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/schematic/schematic.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/summary/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/analysis/generators/summary/summary.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/data_enricher.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/extractors/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/extractors/pdf.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parser.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parsers/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parsers/netlist/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parsers/netlist/edif.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parsers/netlist/kicad_legacy_net.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parsers/netlist/kicad_spice.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parsers/netlist/pads.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parsers/netlist/protel.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parsers/netlist/protel_detector.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parsers/schematic/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/parsers/schematic/kicad_sch_detector.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/preprocessors/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/preprocessors/user_guide.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/run_context.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/pipeline/schema_mapper.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/__init__.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/file_upload.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/files.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/http_requests.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/kb_lister.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/kb_remover.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/logger.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/mcp_configurator.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/migrations.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/orm.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/pdf_splitter.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/pre_uninstall.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/query_service.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/ssl_installer.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/tools.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/mfcli/utils/vectorizer.py +0 -0
- {mfcli-0.2.5 → mfcli-0.2.7}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mfcli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7
|
|
4
4
|
Summary: AI-powered CLI for analyzing hardware engineering documents
|
|
5
5
|
Author: Multifactor AI
|
|
6
6
|
License: MIT
|
|
@@ -32,8 +32,6 @@ Requires-Dist: botocore
|
|
|
32
32
|
Requires-Dist: pydantic==2.11.9
|
|
33
33
|
Requires-Dist: protobuf
|
|
34
34
|
Requires-Dist: sqlmodel
|
|
35
|
-
Requires-Dist: llama-parse
|
|
36
|
-
Requires-Dist: llama-index-core
|
|
37
35
|
Requires-Dist: requests
|
|
38
36
|
Requires-Dist: openai
|
|
39
37
|
Requires-Dist: langchain
|
|
@@ -75,6 +73,7 @@ An AI-powered engineering document processing pipeline that intelligently analyz
|
|
|
75
73
|
|
|
76
74
|
## 📋 Table of Contents
|
|
77
75
|
|
|
76
|
+
- [Quick Start](#quick-start)
|
|
78
77
|
- [Architecture](#architecture)
|
|
79
78
|
- [Prerequisites](#prerequisites)
|
|
80
79
|
- [Installation](#installation)
|
|
@@ -89,6 +88,23 @@ An AI-powered engineering document processing pipeline that intelligently analyz
|
|
|
89
88
|
- [Development](#development)
|
|
90
89
|
- [Troubleshooting](#troubleshooting)
|
|
91
90
|
|
|
91
|
+
## 🚀 Quick Start
|
|
92
|
+
|
|
93
|
+
**New to mfcli?** Check out our **[Quick Start Guide](QUICKSTART.md)** for step-by-step instructions to get up and running in minutes!
|
|
94
|
+
|
|
95
|
+
The Quick Start Guide covers:
|
|
96
|
+
- ✅ Installing Cline for VS Code
|
|
97
|
+
- ✅ Installing mfcli with pipx (recommended)
|
|
98
|
+
- ✅ Setting up API keys
|
|
99
|
+
- ✅ Creating your first project
|
|
100
|
+
- ✅ Processing your hardware documents
|
|
101
|
+
- ✅ Querying your knowledge base with AI
|
|
102
|
+
- ✅ Currently unsupported features and workarounds
|
|
103
|
+
|
|
104
|
+
**[👉 Go to Quick Start Guide →](QUICKSTART.md)**
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
92
108
|
## 🏗️ Architecture
|
|
93
109
|
|
|
94
110
|
The system uses a streamlined architecture with a single controller agent that orchestrates a sequential processing pipeline:
|
|
@@ -96,7 +112,7 @@ The system uses a streamlined architecture with a single controller agent that o
|
|
|
96
112
|
```
|
|
97
113
|
Controller Agent
|
|
98
114
|
├── Tools:
|
|
99
|
-
│ ├──
|
|
115
|
+
│ ├── run (Sequential pipeline execution)
|
|
100
116
|
│ └── query_knowledgebase (RAG-based document queries)
|
|
101
117
|
│
|
|
102
118
|
└── Pipeline Stages:
|
|
@@ -360,18 +376,18 @@ mfcli init
|
|
|
360
376
|
```
|
|
361
377
|
|
|
362
378
|
You'll be prompted to enter a project name (3-45 characters, alphanumeric with underscores/hyphens allowed). If your directory is a git repository, the repository name will be suggested as the default - simply press Enter to accept it or type a different name. This creates a `multifactor/` folder at the git root (or current directory) containing:
|
|
363
|
-
- `
|
|
379
|
+
- `design/` - **Place your hardware design files here for processing**
|
|
364
380
|
- `config.json` - Project configuration with your project name
|
|
365
381
|
- `file_docket.json` - File tracking and metadata
|
|
366
382
|
- `generated_files/`, `hw_cheat_sheets/`, `data_sheets/`, etc. - Output folders
|
|
367
383
|
|
|
368
|
-
**3. Place your files in the
|
|
384
|
+
**3. Place your files in the design folder:**
|
|
369
385
|
|
|
370
386
|
```bash
|
|
371
|
-
# Copy or move your hardware design files to the
|
|
387
|
+
# Copy or move your hardware design files to the design folder
|
|
372
388
|
# Example for git repo at C:\git\my-project\:
|
|
373
|
-
copy *.pdf C:\git\my-project\multifactor\
|
|
374
|
-
copy *.csv C:\git\my-project\multifactor\
|
|
389
|
+
copy *.pdf C:\git\my-project\multifactor\design\
|
|
390
|
+
copy *.csv C:\git\my-project\multifactor\design\
|
|
375
391
|
```
|
|
376
392
|
|
|
377
393
|
**4. Run the pipeline:**
|
|
@@ -381,7 +397,7 @@ mfcli run
|
|
|
381
397
|
```
|
|
382
398
|
|
|
383
399
|
This will:
|
|
384
|
-
- Process all supported files in the `multifactor/
|
|
400
|
+
- Process all supported files in the `multifactor/design/` directory
|
|
385
401
|
- Skip files that have already been processed (matching MD5 checksum)
|
|
386
402
|
- Prompt for confirmation if a file has been modified (different MD5)
|
|
387
403
|
- Generate BOM CSV files (if schematics are found)
|
|
@@ -416,9 +432,56 @@ This ensures efficient processing by only analyzing new or changed files, while
|
|
|
416
432
|
The `mfcli` tool provides the following commands:
|
|
417
433
|
|
|
418
434
|
- **`mfcli init`** - Initialize a new project in the current directory
|
|
419
|
-
- **`mfcli
|
|
435
|
+
- **`mfcli run`** - Run the analysis pipeline on the current directory
|
|
420
436
|
- **`mfcli web [--port PORT]`** - Start the web UI (default port: 9999)
|
|
421
|
-
- **`mfcli
|
|
437
|
+
- **`mfcli add FILE [--purpose PURPOSE]`** - Add a file to ChromaDB knowledge base
|
|
438
|
+
- **`mfcli ls`** - List all files that have been vectorized into the knowledge base
|
|
439
|
+
- **`mfcli rm FILENAME [--yes]`** - Remove files from the knowledge base by filename
|
|
440
|
+
- **`mfcli configure [--check]`** - Interactive setup wizard to configure API keys and settings
|
|
441
|
+
- **`mfcli log-level LEVEL`** - Set the logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
|
|
442
|
+
- **`mfcli setup-mcp`** - Auto-configure MCP server for Cline and Claude Code
|
|
443
|
+
- **`mfcli doctor`** - Run system health checks and diagnose issues
|
|
444
|
+
- **`mfcli clean [--accept] [--all]`** - Clean all mfcli app data
|
|
445
|
+
- **`mfcli pre-uninstall`** - Check for running processes before uninstallation
|
|
446
|
+
|
|
447
|
+
#### Configure Logging Level
|
|
448
|
+
|
|
449
|
+
Set the logging verbosity level for mfcli operations:
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
# Set to DEBUG for detailed troubleshooting
|
|
453
|
+
mfcli log-level DEBUG
|
|
454
|
+
|
|
455
|
+
# Set to INFO for normal operation (default)
|
|
456
|
+
mfcli log-level INFO
|
|
457
|
+
|
|
458
|
+
# Set to WARNING to only see warnings and errors
|
|
459
|
+
mfcli log-level WARNING
|
|
460
|
+
|
|
461
|
+
# Set to ERROR to only see errors
|
|
462
|
+
mfcli log-level ERROR
|
|
463
|
+
|
|
464
|
+
# Set to CRITICAL for only critical errors
|
|
465
|
+
mfcli log-level CRITICAL
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
The log level setting is stored in your configuration file (`~/Multifactor/.env`) and will take effect on the next mfcli command. This is particularly useful when:
|
|
469
|
+
- **DEBUG**: Troubleshooting issues or understanding detailed pipeline operations
|
|
470
|
+
- **INFO**: Normal day-to-day operation with informative messages
|
|
471
|
+
- **WARNING**: Production use where you only want to see potential issues
|
|
472
|
+
- **ERROR**: When you only care about actual errors
|
|
473
|
+
|
|
474
|
+
**Example:**
|
|
475
|
+
```bash
|
|
476
|
+
# Enable detailed logging for troubleshooting
|
|
477
|
+
mfcli log-level DEBUG
|
|
478
|
+
|
|
479
|
+
# Run the pipeline with verbose output
|
|
480
|
+
mfcli run
|
|
481
|
+
|
|
482
|
+
# Return to normal logging
|
|
483
|
+
mfcli log-level INFO
|
|
484
|
+
```
|
|
422
485
|
|
|
423
486
|
#### Start Web UI
|
|
424
487
|
|
|
@@ -519,7 +582,7 @@ To use the MCP server with Cline (or other MCP-compatible clients), add the foll
|
|
|
519
582
|
```bash
|
|
520
583
|
cd /path/to/hardware/files
|
|
521
584
|
mfcli init
|
|
522
|
-
mfcli
|
|
585
|
+
mfcli run
|
|
523
586
|
```
|
|
524
587
|
|
|
525
588
|
3. **Add the MCP configuration** to your Cline/Claude settings file (see Configuration above)
|
|
@@ -543,7 +606,7 @@ To use the MCP server with Cline (or other MCP-compatible clients), add the foll
|
|
|
543
606
|
- **Solution**: Run the pipeline at least once to create the vector database:
|
|
544
607
|
```bash
|
|
545
608
|
mfcli init
|
|
546
|
-
mfcli
|
|
609
|
+
mfcli run
|
|
547
610
|
```
|
|
548
611
|
|
|
549
612
|
**Error**: `MCP server timeout`
|
|
@@ -666,12 +729,11 @@ Created within a **"multifactor"** folder at the **git repository root** if you'
|
|
|
666
729
|
└── multifactor/ # Parent folder for all project files and outputs
|
|
667
730
|
├── config.json # Project configuration (project name, etc.)
|
|
668
731
|
├── file_docket.json # File tracking and processing metadata
|
|
669
|
-
├──
|
|
732
|
+
├── design/ # Place your hardware design files here for processing
|
|
670
733
|
├── generated_files/ # BOM CSV files generated from schematics
|
|
671
734
|
├── hw_cheat_sheets/ # JSON cheat sheets (MCU, errata, debug, functional blocks)
|
|
672
735
|
├── data_sheets/ # Downloaded component datasheets (from BOM processing)
|
|
673
736
|
├── pdf_parts/ # Extracted PDF parts for analysis
|
|
674
|
-
├── agent_instructions/ # (Reserved for future use)
|
|
675
737
|
├── fw_tasks/ # (Reserved for future use)
|
|
676
738
|
└── requirements/ # (Reserved for future use)
|
|
677
739
|
```
|
|
@@ -682,7 +744,7 @@ If you're in a git repository at `C:\git\my-hardware-project\` and run `mfcli in
|
|
|
682
744
|
|
|
683
745
|
- `C:\git\my-hardware-project\multifactor\config.json` - Project configuration
|
|
684
746
|
- `C:\git\my-hardware-project\multifactor\file_docket.json` - File tracking
|
|
685
|
-
- `C:\git\my-hardware-project\multifactor\
|
|
747
|
+
- `C:\git\my-hardware-project\multifactor\design\` - Place source files here
|
|
686
748
|
- `C:\git\my-hardware-project\multifactor\generated_files\` - Generated BOM files
|
|
687
749
|
- `C:\git\my-hardware-project\multifactor\hw_cheat_sheets\` - Cheat sheets
|
|
688
750
|
- `C:\git\my-hardware-project\multifactor\data_sheets\` - Downloaded datasheets
|
|
@@ -694,7 +756,7 @@ If you're NOT in a git repository and run `mfcli init` from `C:\Projects\hardwar
|
|
|
694
756
|
|
|
695
757
|
- `C:\Projects\hardware\board_v1\multifactor\config.json` - Project configuration
|
|
696
758
|
- `C:\Projects\hardware\board_v1\multifactor\file_docket.json` - File tracking
|
|
697
|
-
- `C:\Projects\hardware\board_v1\multifactor\
|
|
759
|
+
- `C:\Projects\hardware\board_v1\multifactor\design\` - Place source files here
|
|
698
760
|
- `C:\Projects\hardware\board_v1\multifactor\generated_files\` - Generated BOM files
|
|
699
761
|
- `C:\Projects\hardware\board_v1\multifactor\hw_cheat_sheets\` - Cheat sheets
|
|
700
762
|
- `C:\Projects\hardware\board_v1\multifactor\data_sheets\` - Downloaded datasheets
|
|
@@ -805,7 +867,7 @@ First, navigate to your hardware files directory and initialize:
|
|
|
805
867
|
```bash
|
|
806
868
|
cd /path/to/hardware/files
|
|
807
869
|
mfcli init
|
|
808
|
-
mfcli
|
|
870
|
+
mfcli run
|
|
809
871
|
```
|
|
810
872
|
|
|
811
873
|
### Starting the Web UI
|
|
@@ -902,10 +964,10 @@ pytest app/tests/
|
|
|
902
964
|
#### 4. Pipeline Processing Failures
|
|
903
965
|
|
|
904
966
|
**Error**: `Could not find metadata file. Please initialize this repo with "mfcli init"`
|
|
905
|
-
- **Solution**: You need to run `mfcli init` in your hardware files directory before running `mfcli
|
|
967
|
+
- **Solution**: You need to run `mfcli init` in your hardware files directory before running `mfcli run`
|
|
906
968
|
|
|
907
969
|
**Error**: `File not found`
|
|
908
|
-
- **Solution**: Make sure you're running `mfcli
|
|
970
|
+
- **Solution**: Make sure you're running `mfcli run` from within your hardware files directory (where you ran `mfcli init`)
|
|
909
971
|
|
|
910
972
|
**Error**: `File extension is not supported`
|
|
911
973
|
- **Solution**: Check that your files are in supported formats (PDF, EDIF, CSV, .net, .cir, .asc)
|
|
@@ -17,6 +17,7 @@ An AI-powered engineering document processing pipeline that intelligently analyz
|
|
|
17
17
|
|
|
18
18
|
## 📋 Table of Contents
|
|
19
19
|
|
|
20
|
+
- [Quick Start](#quick-start)
|
|
20
21
|
- [Architecture](#architecture)
|
|
21
22
|
- [Prerequisites](#prerequisites)
|
|
22
23
|
- [Installation](#installation)
|
|
@@ -31,6 +32,23 @@ An AI-powered engineering document processing pipeline that intelligently analyz
|
|
|
31
32
|
- [Development](#development)
|
|
32
33
|
- [Troubleshooting](#troubleshooting)
|
|
33
34
|
|
|
35
|
+
## 🚀 Quick Start
|
|
36
|
+
|
|
37
|
+
**New to mfcli?** Check out our **[Quick Start Guide](QUICKSTART.md)** for step-by-step instructions to get up and running in minutes!
|
|
38
|
+
|
|
39
|
+
The Quick Start Guide covers:
|
|
40
|
+
- ✅ Installing Cline for VS Code
|
|
41
|
+
- ✅ Installing mfcli with pipx (recommended)
|
|
42
|
+
- ✅ Setting up API keys
|
|
43
|
+
- ✅ Creating your first project
|
|
44
|
+
- ✅ Processing your hardware documents
|
|
45
|
+
- ✅ Querying your knowledge base with AI
|
|
46
|
+
- ✅ Currently unsupported features and workarounds
|
|
47
|
+
|
|
48
|
+
**[👉 Go to Quick Start Guide →](QUICKSTART.md)**
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
34
52
|
## 🏗️ Architecture
|
|
35
53
|
|
|
36
54
|
The system uses a streamlined architecture with a single controller agent that orchestrates a sequential processing pipeline:
|
|
@@ -38,7 +56,7 @@ The system uses a streamlined architecture with a single controller agent that o
|
|
|
38
56
|
```
|
|
39
57
|
Controller Agent
|
|
40
58
|
├── Tools:
|
|
41
|
-
│ ├──
|
|
59
|
+
│ ├── run (Sequential pipeline execution)
|
|
42
60
|
│ └── query_knowledgebase (RAG-based document queries)
|
|
43
61
|
│
|
|
44
62
|
└── Pipeline Stages:
|
|
@@ -302,18 +320,18 @@ mfcli init
|
|
|
302
320
|
```
|
|
303
321
|
|
|
304
322
|
You'll be prompted to enter a project name (3-45 characters, alphanumeric with underscores/hyphens allowed). If your directory is a git repository, the repository name will be suggested as the default - simply press Enter to accept it or type a different name. This creates a `multifactor/` folder at the git root (or current directory) containing:
|
|
305
|
-
- `
|
|
323
|
+
- `design/` - **Place your hardware design files here for processing**
|
|
306
324
|
- `config.json` - Project configuration with your project name
|
|
307
325
|
- `file_docket.json` - File tracking and metadata
|
|
308
326
|
- `generated_files/`, `hw_cheat_sheets/`, `data_sheets/`, etc. - Output folders
|
|
309
327
|
|
|
310
|
-
**3. Place your files in the
|
|
328
|
+
**3. Place your files in the design folder:**
|
|
311
329
|
|
|
312
330
|
```bash
|
|
313
|
-
# Copy or move your hardware design files to the
|
|
331
|
+
# Copy or move your hardware design files to the design folder
|
|
314
332
|
# Example for git repo at C:\git\my-project\:
|
|
315
|
-
copy *.pdf C:\git\my-project\multifactor\
|
|
316
|
-
copy *.csv C:\git\my-project\multifactor\
|
|
333
|
+
copy *.pdf C:\git\my-project\multifactor\design\
|
|
334
|
+
copy *.csv C:\git\my-project\multifactor\design\
|
|
317
335
|
```
|
|
318
336
|
|
|
319
337
|
**4. Run the pipeline:**
|
|
@@ -323,7 +341,7 @@ mfcli run
|
|
|
323
341
|
```
|
|
324
342
|
|
|
325
343
|
This will:
|
|
326
|
-
- Process all supported files in the `multifactor/
|
|
344
|
+
- Process all supported files in the `multifactor/design/` directory
|
|
327
345
|
- Skip files that have already been processed (matching MD5 checksum)
|
|
328
346
|
- Prompt for confirmation if a file has been modified (different MD5)
|
|
329
347
|
- Generate BOM CSV files (if schematics are found)
|
|
@@ -358,9 +376,56 @@ This ensures efficient processing by only analyzing new or changed files, while
|
|
|
358
376
|
The `mfcli` tool provides the following commands:
|
|
359
377
|
|
|
360
378
|
- **`mfcli init`** - Initialize a new project in the current directory
|
|
361
|
-
- **`mfcli
|
|
379
|
+
- **`mfcli run`** - Run the analysis pipeline on the current directory
|
|
362
380
|
- **`mfcli web [--port PORT]`** - Start the web UI (default port: 9999)
|
|
363
|
-
- **`mfcli
|
|
381
|
+
- **`mfcli add FILE [--purpose PURPOSE]`** - Add a file to ChromaDB knowledge base
|
|
382
|
+
- **`mfcli ls`** - List all files that have been vectorized into the knowledge base
|
|
383
|
+
- **`mfcli rm FILENAME [--yes]`** - Remove files from the knowledge base by filename
|
|
384
|
+
- **`mfcli configure [--check]`** - Interactive setup wizard to configure API keys and settings
|
|
385
|
+
- **`mfcli log-level LEVEL`** - Set the logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
|
|
386
|
+
- **`mfcli setup-mcp`** - Auto-configure MCP server for Cline and Claude Code
|
|
387
|
+
- **`mfcli doctor`** - Run system health checks and diagnose issues
|
|
388
|
+
- **`mfcli clean [--accept] [--all]`** - Clean all mfcli app data
|
|
389
|
+
- **`mfcli pre-uninstall`** - Check for running processes before uninstallation
|
|
390
|
+
|
|
391
|
+
#### Configure Logging Level
|
|
392
|
+
|
|
393
|
+
Set the logging verbosity level for mfcli operations:
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
# Set to DEBUG for detailed troubleshooting
|
|
397
|
+
mfcli log-level DEBUG
|
|
398
|
+
|
|
399
|
+
# Set to INFO for normal operation (default)
|
|
400
|
+
mfcli log-level INFO
|
|
401
|
+
|
|
402
|
+
# Set to WARNING to only see warnings and errors
|
|
403
|
+
mfcli log-level WARNING
|
|
404
|
+
|
|
405
|
+
# Set to ERROR to only see errors
|
|
406
|
+
mfcli log-level ERROR
|
|
407
|
+
|
|
408
|
+
# Set to CRITICAL for only critical errors
|
|
409
|
+
mfcli log-level CRITICAL
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
The log level setting is stored in your configuration file (`~/Multifactor/.env`) and will take effect on the next mfcli command. This is particularly useful when:
|
|
413
|
+
- **DEBUG**: Troubleshooting issues or understanding detailed pipeline operations
|
|
414
|
+
- **INFO**: Normal day-to-day operation with informative messages
|
|
415
|
+
- **WARNING**: Production use where you only want to see potential issues
|
|
416
|
+
- **ERROR**: When you only care about actual errors
|
|
417
|
+
|
|
418
|
+
**Example:**
|
|
419
|
+
```bash
|
|
420
|
+
# Enable detailed logging for troubleshooting
|
|
421
|
+
mfcli log-level DEBUG
|
|
422
|
+
|
|
423
|
+
# Run the pipeline with verbose output
|
|
424
|
+
mfcli run
|
|
425
|
+
|
|
426
|
+
# Return to normal logging
|
|
427
|
+
mfcli log-level INFO
|
|
428
|
+
```
|
|
364
429
|
|
|
365
430
|
#### Start Web UI
|
|
366
431
|
|
|
@@ -461,7 +526,7 @@ To use the MCP server with Cline (or other MCP-compatible clients), add the foll
|
|
|
461
526
|
```bash
|
|
462
527
|
cd /path/to/hardware/files
|
|
463
528
|
mfcli init
|
|
464
|
-
mfcli
|
|
529
|
+
mfcli run
|
|
465
530
|
```
|
|
466
531
|
|
|
467
532
|
3. **Add the MCP configuration** to your Cline/Claude settings file (see Configuration above)
|
|
@@ -485,7 +550,7 @@ To use the MCP server with Cline (or other MCP-compatible clients), add the foll
|
|
|
485
550
|
- **Solution**: Run the pipeline at least once to create the vector database:
|
|
486
551
|
```bash
|
|
487
552
|
mfcli init
|
|
488
|
-
mfcli
|
|
553
|
+
mfcli run
|
|
489
554
|
```
|
|
490
555
|
|
|
491
556
|
**Error**: `MCP server timeout`
|
|
@@ -608,12 +673,11 @@ Created within a **"multifactor"** folder at the **git repository root** if you'
|
|
|
608
673
|
└── multifactor/ # Parent folder for all project files and outputs
|
|
609
674
|
├── config.json # Project configuration (project name, etc.)
|
|
610
675
|
├── file_docket.json # File tracking and processing metadata
|
|
611
|
-
├──
|
|
676
|
+
├── design/ # Place your hardware design files here for processing
|
|
612
677
|
├── generated_files/ # BOM CSV files generated from schematics
|
|
613
678
|
├── hw_cheat_sheets/ # JSON cheat sheets (MCU, errata, debug, functional blocks)
|
|
614
679
|
├── data_sheets/ # Downloaded component datasheets (from BOM processing)
|
|
615
680
|
├── pdf_parts/ # Extracted PDF parts for analysis
|
|
616
|
-
├── agent_instructions/ # (Reserved for future use)
|
|
617
681
|
├── fw_tasks/ # (Reserved for future use)
|
|
618
682
|
└── requirements/ # (Reserved for future use)
|
|
619
683
|
```
|
|
@@ -624,7 +688,7 @@ If you're in a git repository at `C:\git\my-hardware-project\` and run `mfcli in
|
|
|
624
688
|
|
|
625
689
|
- `C:\git\my-hardware-project\multifactor\config.json` - Project configuration
|
|
626
690
|
- `C:\git\my-hardware-project\multifactor\file_docket.json` - File tracking
|
|
627
|
-
- `C:\git\my-hardware-project\multifactor\
|
|
691
|
+
- `C:\git\my-hardware-project\multifactor\design\` - Place source files here
|
|
628
692
|
- `C:\git\my-hardware-project\multifactor\generated_files\` - Generated BOM files
|
|
629
693
|
- `C:\git\my-hardware-project\multifactor\hw_cheat_sheets\` - Cheat sheets
|
|
630
694
|
- `C:\git\my-hardware-project\multifactor\data_sheets\` - Downloaded datasheets
|
|
@@ -636,7 +700,7 @@ If you're NOT in a git repository and run `mfcli init` from `C:\Projects\hardwar
|
|
|
636
700
|
|
|
637
701
|
- `C:\Projects\hardware\board_v1\multifactor\config.json` - Project configuration
|
|
638
702
|
- `C:\Projects\hardware\board_v1\multifactor\file_docket.json` - File tracking
|
|
639
|
-
- `C:\Projects\hardware\board_v1\multifactor\
|
|
703
|
+
- `C:\Projects\hardware\board_v1\multifactor\design\` - Place source files here
|
|
640
704
|
- `C:\Projects\hardware\board_v1\multifactor\generated_files\` - Generated BOM files
|
|
641
705
|
- `C:\Projects\hardware\board_v1\multifactor\hw_cheat_sheets\` - Cheat sheets
|
|
642
706
|
- `C:\Projects\hardware\board_v1\multifactor\data_sheets\` - Downloaded datasheets
|
|
@@ -747,7 +811,7 @@ First, navigate to your hardware files directory and initialize:
|
|
|
747
811
|
```bash
|
|
748
812
|
cd /path/to/hardware/files
|
|
749
813
|
mfcli init
|
|
750
|
-
mfcli
|
|
814
|
+
mfcli run
|
|
751
815
|
```
|
|
752
816
|
|
|
753
817
|
### Starting the Web UI
|
|
@@ -844,10 +908,10 @@ pytest app/tests/
|
|
|
844
908
|
#### 4. Pipeline Processing Failures
|
|
845
909
|
|
|
846
910
|
**Error**: `Could not find metadata file. Please initialize this repo with "mfcli init"`
|
|
847
|
-
- **Solution**: You need to run `mfcli init` in your hardware files directory before running `mfcli
|
|
911
|
+
- **Solution**: You need to run `mfcli init` in your hardware files directory before running `mfcli run`
|
|
848
912
|
|
|
849
913
|
**Error**: `File not found`
|
|
850
|
-
- **Solution**: Make sure you're running `mfcli
|
|
914
|
+
- **Solution**: Make sure you're running `mfcli run` from within your hardware files directory (where you ran `mfcli init`)
|
|
851
915
|
|
|
852
916
|
**Error**: `File extension is not supported`
|
|
853
917
|
- **Solution**: Check that your files are in supported formats (PDF, EDIF, CSV, .net, .cir, .asc)
|
|
@@ -24,17 +24,23 @@ google_api_key=your_google_api_key_here
|
|
|
24
24
|
# Note: Requires billing enabled on your OpenAI account
|
|
25
25
|
openai_api_key=your_openai_api_key_here
|
|
26
26
|
|
|
27
|
-
# LlamaParse API Key
|
|
28
|
-
# Used for advanced PDF parsing and text extraction
|
|
29
|
-
# Get your key from: https://cloud.llamaindex.ai/
|
|
30
|
-
llama_cloud_api_key=your_llamaparse_api_key_here
|
|
31
|
-
|
|
32
27
|
# DigiKey API Credentials
|
|
33
28
|
# Used for automatic datasheet downloads from DigiKey
|
|
34
29
|
# Get your credentials from: https://developer.digikey.com/
|
|
35
30
|
digikey_client_id=your_digikey_client_id_here
|
|
36
31
|
digikey_client_secret=your_digikey_client_secret_here
|
|
37
32
|
|
|
33
|
+
# ============================================================
|
|
34
|
+
# LOGGING CONFIGURATION
|
|
35
|
+
# ============================================================
|
|
36
|
+
|
|
37
|
+
# Log level for mfcli operations
|
|
38
|
+
# Available levels: DEBUG, INFO, WARNING, ERROR, CRITICAL
|
|
39
|
+
# Default: INFO
|
|
40
|
+
# Use DEBUG for detailed troubleshooting, INFO for normal operation
|
|
41
|
+
# Change with: mfcli log-level <LEVEL>
|
|
42
|
+
log_level=INFO
|
|
43
|
+
|
|
38
44
|
# ============================================================
|
|
39
45
|
# VECTOR DATABASE CONFIGURATION
|
|
40
46
|
# ============================================================
|
|
@@ -4,7 +4,7 @@ from google.adk.agents import Agent
|
|
|
4
4
|
|
|
5
5
|
from mfcli.agents.controller.tools import query_knowledgebase, list_projects
|
|
6
6
|
from mfcli.agents.tools.general import load_agent_config
|
|
7
|
-
from mfcli.pipeline.pipeline import
|
|
7
|
+
from mfcli.pipeline.pipeline import run
|
|
8
8
|
|
|
9
9
|
config_path = Path(__file__).parent / "config.yaml"
|
|
10
10
|
config = load_agent_config(config_path)
|
|
@@ -14,6 +14,6 @@ root_agent = Agent(
|
|
|
14
14
|
model=config.model,
|
|
15
15
|
description=config.description,
|
|
16
16
|
instruction=config.instructions,
|
|
17
|
-
tools=[
|
|
17
|
+
tools=[run, query_knowledgebase, list_projects],
|
|
18
18
|
output_key="pipeline_run_output"
|
|
19
19
|
)
|
|
@@ -9,7 +9,7 @@ instructions: |
|
|
|
9
9
|
- The user asks you to analyze documents in a directory
|
|
10
10
|
- If the user does not specify the name of the project to analyze, run the list_projects tool and ask the user to choose it from the returned list first
|
|
11
11
|
- Display the list of projects neatly as a bulleted list
|
|
12
|
-
- Once the user has chosen a project, you MUST then run the
|
|
12
|
+
- Once the user has chosen a project, you MUST then run the run tool to start the pipeline
|
|
13
13
|
- Respond to the user with the output from the pipeline
|
|
14
14
|
- You will receive a summary from the completed pipeline about the number of files which were successfully processed, the number that failed and the total
|
|
15
15
|
- You will also receive a list of errors, if any
|