first-agentic-csa 0.2.0__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.
- first_agentic_csa-0.2.0.dist-info/METADATA +409 -0
- first_agentic_csa-0.2.0.dist-info/RECORD +37 -0
- first_agentic_csa-0.2.0.dist-info/WHEEL +4 -0
- first_agentic_csa-0.2.0.dist-info/entry_points.txt +2 -0
- first_agentic_csa-0.2.0.dist-info/licenses/LICENSE +28 -0
- wpilib_mcp/__init__.py +7 -0
- wpilib_mcp/plugin_loader.py +278 -0
- wpilib_mcp/plugins/__init__.py +9 -0
- wpilib_mcp/plugins/base.py +269 -0
- wpilib_mcp/plugins/ctre/__init__.py +9 -0
- wpilib_mcp/plugins/ctre/build_index.py +205 -0
- wpilib_mcp/plugins/ctre/data/index.json +735 -0
- wpilib_mcp/plugins/ctre/plugin.py +256 -0
- wpilib_mcp/plugins/photonvision/__init__.py +6 -0
- wpilib_mcp/plugins/photonvision/build_index.py +262 -0
- wpilib_mcp/plugins/photonvision/data/index.json +639 -0
- wpilib_mcp/plugins/photonvision/plugin.py +251 -0
- wpilib_mcp/plugins/redux/__init__.py +9 -0
- wpilib_mcp/plugins/redux/build_index.py +180 -0
- wpilib_mcp/plugins/redux/data/index.json +231 -0
- wpilib_mcp/plugins/redux/plugin.py +255 -0
- wpilib_mcp/plugins/rev/__init__.py +9 -0
- wpilib_mcp/plugins/rev/build_index.py +193 -0
- wpilib_mcp/plugins/rev/data/index.json +527 -0
- wpilib_mcp/plugins/rev/plugin.py +255 -0
- wpilib_mcp/plugins/wpilib/__init__.py +9 -0
- wpilib_mcp/plugins/wpilib/build_index.py +211 -0
- wpilib_mcp/plugins/wpilib/data/index_2025.json +171 -0
- wpilib_mcp/plugins/wpilib/data/index_stable.json +2143 -0
- wpilib_mcp/plugins/wpilib/plugin.py +281 -0
- wpilib_mcp/server.py +326 -0
- wpilib_mcp/tool_router.py +318 -0
- wpilib_mcp/utils/__init__.py +9 -0
- wpilib_mcp/utils/fetch.py +155 -0
- wpilib_mcp/utils/html.py +257 -0
- wpilib_mcp/utils/indexer.py +333 -0
- wpilib_mcp/utils/search.py +207 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: first-agentic-csa
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Plugin-based FRC documentation agent as an MCP server for WPILib and vendor libraries
|
|
5
|
+
Author: Rami Mouro
|
|
6
|
+
License: BSD-3-Clause
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Keywords: csa,documentation,first,frc,mcp,robotics,wpilib
|
|
9
|
+
Classifier: Development Status :: 3 - Alpha
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Requires-Python: >=3.11
|
|
15
|
+
Requires-Dist: beautifulsoup4>=4.12.0
|
|
16
|
+
Requires-Dist: httpx>=0.27.0
|
|
17
|
+
Requires-Dist: lxml>=5.0.0
|
|
18
|
+
Requires-Dist: mcp>=1.0.0
|
|
19
|
+
Requires-Dist: rank-bm25>=0.2.2
|
|
20
|
+
Provides-Extra: dev
|
|
21
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
22
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# FIRST Agentic CSA
|
|
26
|
+
|
|
27
|
+
A plugin-based FRC documentation agent implemented as a Model Context Protocol (MCP) server. Search across WPILib and vendor documentation (REV, CTRE, Redux, PhotonVision) using natural language queries. Built for FIRST Robotics Competition teams and CSAs (Control System Advisors).
|
|
28
|
+
|
|
29
|
+
## Features
|
|
30
|
+
|
|
31
|
+
- **Unified Search**: Query WPILib + vendor docs with a single tool
|
|
32
|
+
- **Plugin Architecture**: Extensible system for adding new documentation sources
|
|
33
|
+
- **BM25 Ranking**: High-quality text search without embedding costs
|
|
34
|
+
- **Multi-Vendor Support**: WPILib, REV Robotics, CTRE Phoenix, Redux Robotics, PhotonVision
|
|
35
|
+
- **Language Filtering**: Filter results by Java, Python, or C++
|
|
36
|
+
- **Version Support**: Search specific documentation versions (2024, 2025, etc.)
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
### Quick Install (PyPI)
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Using uvx (recommended)
|
|
44
|
+
uvx first-agentic-csa
|
|
45
|
+
|
|
46
|
+
# Or with pip
|
|
47
|
+
pip install first-agentic-csa
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### From Source
|
|
51
|
+
|
|
52
|
+
If you want to modify or contribute to the project:
|
|
53
|
+
|
|
54
|
+
1. **Install uv** (fast Python package manager):
|
|
55
|
+
|
|
56
|
+
**Windows (PowerShell):**
|
|
57
|
+
```powershell
|
|
58
|
+
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**macOS/Linux:**
|
|
62
|
+
```bash
|
|
63
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
2. **Clone and install:**
|
|
67
|
+
```bash
|
|
68
|
+
git clone https://github.com/YOUR_USERNAME/first-agentic-csa.git
|
|
69
|
+
cd first-agentic-csa
|
|
70
|
+
uv sync
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Quick Start
|
|
74
|
+
|
|
75
|
+
### Running the Server
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# With uv
|
|
79
|
+
uv run first-agentic-csa
|
|
80
|
+
|
|
81
|
+
# Or directly
|
|
82
|
+
python -m wpilib_mcp.server
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Configure in Claude Desktop / Cursor
|
|
86
|
+
|
|
87
|
+
Add to your MCP configuration (`claude_desktop_config.json` or Cursor settings):
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"mcpServers": {
|
|
92
|
+
"frc-docs": {
|
|
93
|
+
"command": "uvx",
|
|
94
|
+
"args": ["first-agentic-csa"]
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
If running from source:
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"mcpServers": {
|
|
104
|
+
"frc-docs": {
|
|
105
|
+
"command": "uv",
|
|
106
|
+
"args": ["--directory", "/path/to/first-agentic-csa", "run", "first-agentic-csa"]
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Configure in Other MCP Clients
|
|
113
|
+
|
|
114
|
+
The server uses stdio transport and is compatible with any MCP client.
|
|
115
|
+
|
|
116
|
+
## Available Tools
|
|
117
|
+
|
|
118
|
+
### `search_frc_docs`
|
|
119
|
+
|
|
120
|
+
Search FRC documentation across WPILib and vendor libraries.
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
query: "SparkMax configure"
|
|
124
|
+
vendors: ["all"] | ["wpilib", "rev", "ctre", "redux"]
|
|
125
|
+
version: "2025"
|
|
126
|
+
language: "Java" | "Python" | "C++"
|
|
127
|
+
max_results: 1-25
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### `fetch_frc_doc_page`
|
|
131
|
+
|
|
132
|
+
Fetch the full content of a documentation page by URL.
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
url: "https://docs.wpilib.org/en/stable/docs/software/commandbased/commands.html"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### `list_frc_doc_sections`
|
|
139
|
+
|
|
140
|
+
List available documentation sections from vendors.
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
vendors: ["all"] | ["wpilib", "rev"]
|
|
144
|
+
version: "2025"
|
|
145
|
+
language: "Java"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Configuration
|
|
149
|
+
|
|
150
|
+
Edit `config.json` to customize plugin settings:
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"plugins": {
|
|
155
|
+
"wpilib": {
|
|
156
|
+
"enabled": true,
|
|
157
|
+
"versions": ["2025"],
|
|
158
|
+
"languages": ["Java", "Python", "C++"]
|
|
159
|
+
},
|
|
160
|
+
"rev": {
|
|
161
|
+
"enabled": true,
|
|
162
|
+
"languages": ["Java", "C++"]
|
|
163
|
+
},
|
|
164
|
+
"ctre": {
|
|
165
|
+
"enabled": false
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
"cache": {
|
|
169
|
+
"ttl_seconds": 3600
|
|
170
|
+
},
|
|
171
|
+
"search": {
|
|
172
|
+
"default_max_results": 10,
|
|
173
|
+
"default_language": "Java"
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Supported Plugins
|
|
179
|
+
|
|
180
|
+
| Plugin | Vendor | Documentation |
|
|
181
|
+
|--------|--------|---------------|
|
|
182
|
+
| `wpilib` | WPILib | docs.wpilib.org |
|
|
183
|
+
| `rev` | REV Robotics | docs.revrobotics.com |
|
|
184
|
+
| `ctre` | CTRE Phoenix | v6.docs.ctr-electronics.com |
|
|
185
|
+
| `redux` | Redux Robotics | docs.reduxrobotics.com |
|
|
186
|
+
| `photonvision` | PhotonVision | docs.photonvision.org |
|
|
187
|
+
|
|
188
|
+
## Building Documentation Indexes
|
|
189
|
+
|
|
190
|
+
Each plugin has its own index builder that vendors can maintain independently.
|
|
191
|
+
|
|
192
|
+
### Using the convenience wrapper:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# Build all plugin indexes
|
|
196
|
+
python scripts/build_index.py all
|
|
197
|
+
|
|
198
|
+
# Build specific vendor
|
|
199
|
+
python scripts/build_index.py wpilib --version 2025
|
|
200
|
+
python scripts/build_index.py rev
|
|
201
|
+
python scripts/build_index.py ctre
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Running plugin builders directly:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# Each plugin has its own build_index.py with vendor-specific options
|
|
208
|
+
python -m wpilib_mcp.plugins.wpilib.build_index --version stable --verbose
|
|
209
|
+
python -m wpilib_mcp.plugins.rev.build_index --verbose
|
|
210
|
+
python -m wpilib_mcp.plugins.ctre.build_index --version stable
|
|
211
|
+
python -m wpilib_mcp.plugins.redux.build_index
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Plugin Development
|
|
215
|
+
|
|
216
|
+
Create a new plugin by following this structure:
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
plugins/
|
|
220
|
+
└── myplugin/
|
|
221
|
+
├── __init__.py
|
|
222
|
+
├── plugin.py # Must export `Plugin` class
|
|
223
|
+
├── build_index.py # Index builder script (vendor-maintained)
|
|
224
|
+
└── data/
|
|
225
|
+
└── index.json
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Your `Plugin` class must implement `PluginBase`, and you should provide a `build_index.py` script:
|
|
229
|
+
|
|
230
|
+
### Plugin Implementation
|
|
231
|
+
|
|
232
|
+
Your `Plugin` class must implement `PluginBase`:
|
|
233
|
+
|
|
234
|
+
```python
|
|
235
|
+
from wpilib_mcp.plugins.base import PluginBase, PluginConfig, SearchResult, PageContent, DocSection
|
|
236
|
+
|
|
237
|
+
class Plugin(PluginBase):
|
|
238
|
+
@property
|
|
239
|
+
def name(self) -> str:
|
|
240
|
+
return "myplugin"
|
|
241
|
+
|
|
242
|
+
@property
|
|
243
|
+
def display_name(self) -> str:
|
|
244
|
+
return "My Plugin"
|
|
245
|
+
|
|
246
|
+
@property
|
|
247
|
+
def description(self) -> str:
|
|
248
|
+
return "Description of my plugin"
|
|
249
|
+
|
|
250
|
+
@property
|
|
251
|
+
def supported_versions(self) -> list[str]:
|
|
252
|
+
return ["2025"]
|
|
253
|
+
|
|
254
|
+
@property
|
|
255
|
+
def supported_languages(self) -> list[str]:
|
|
256
|
+
return ["Java", "Python"]
|
|
257
|
+
|
|
258
|
+
@property
|
|
259
|
+
def base_urls(self) -> list[str]:
|
|
260
|
+
return ["https://docs.example.com"]
|
|
261
|
+
|
|
262
|
+
async def initialize(self, config: PluginConfig) -> None:
|
|
263
|
+
# Load index, build search corpus
|
|
264
|
+
pass
|
|
265
|
+
|
|
266
|
+
async def search(self, query, version=None, language=None, max_results=10) -> list[SearchResult]:
|
|
267
|
+
# Return search results
|
|
268
|
+
pass
|
|
269
|
+
|
|
270
|
+
async def fetch_page(self, url) -> PageContent:
|
|
271
|
+
# Fetch and clean page content
|
|
272
|
+
pass
|
|
273
|
+
|
|
274
|
+
async def list_sections(self, version=None, language=None) -> list[DocSection]:
|
|
275
|
+
# Return documentation sections
|
|
276
|
+
pass
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Index Builder
|
|
280
|
+
|
|
281
|
+
Create a `build_index.py` that extends `BaseIndexBuilder`:
|
|
282
|
+
|
|
283
|
+
```python
|
|
284
|
+
from wpilib_mcp.utils.indexer import BaseIndexBuilder
|
|
285
|
+
|
|
286
|
+
class MyPluginIndexBuilder(BaseIndexBuilder):
|
|
287
|
+
def __init__(self):
|
|
288
|
+
super().__init__(
|
|
289
|
+
vendor="myplugin",
|
|
290
|
+
base_url="https://docs.example.com",
|
|
291
|
+
max_pages=200,
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
@property
|
|
295
|
+
def start_urls(self) -> list[str]:
|
|
296
|
+
return ["https://docs.example.com/getting-started"]
|
|
297
|
+
|
|
298
|
+
def should_crawl(self, url: str) -> bool:
|
|
299
|
+
return "docs.example.com" in url
|
|
300
|
+
|
|
301
|
+
def extract_section(self, soup, url) -> str:
|
|
302
|
+
# Return section name based on URL/content
|
|
303
|
+
return "General"
|
|
304
|
+
|
|
305
|
+
def extract_language(self, soup, url) -> str:
|
|
306
|
+
return "All"
|
|
307
|
+
|
|
308
|
+
if __name__ == "__main__":
|
|
309
|
+
import asyncio
|
|
310
|
+
asyncio.run(MyPluginIndexBuilder().build_and_save("latest", Path("data/index.json")))
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## Index File Format
|
|
314
|
+
|
|
315
|
+
Each plugin uses a JSON index with this structure:
|
|
316
|
+
|
|
317
|
+
```json
|
|
318
|
+
{
|
|
319
|
+
"vendor": "myplugin",
|
|
320
|
+
"version": "2025",
|
|
321
|
+
"built_at": "2025-01-15T00:00:00Z",
|
|
322
|
+
"pages": [
|
|
323
|
+
{
|
|
324
|
+
"url": "https://docs.example.com/page",
|
|
325
|
+
"title": "Page Title",
|
|
326
|
+
"section": "Section Name",
|
|
327
|
+
"language": "Java",
|
|
328
|
+
"content": "Full searchable content...",
|
|
329
|
+
"content_preview": "First 300 chars for display..."
|
|
330
|
+
}
|
|
331
|
+
]
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
## Development
|
|
336
|
+
|
|
337
|
+
### Running Tests
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
uv run pytest tests/ -v
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Project Structure
|
|
344
|
+
|
|
345
|
+
```
|
|
346
|
+
wpilib-mcp/
|
|
347
|
+
├── pyproject.toml # Project configuration
|
|
348
|
+
├── config.json # User configuration
|
|
349
|
+
├── src/wpilib_mcp/
|
|
350
|
+
│ ├── server.py # MCP server entry point
|
|
351
|
+
│ ├── plugin_loader.py # Plugin discovery/loading
|
|
352
|
+
│ ├── tool_router.py # Routes tools to plugins
|
|
353
|
+
│ ├── utils/
|
|
354
|
+
│ │ ├── fetch.py # HTTP with caching
|
|
355
|
+
│ │ ├── html.py # HTML cleaning
|
|
356
|
+
│ │ └── search.py # BM25 search
|
|
357
|
+
│ └── plugins/
|
|
358
|
+
│ ├── base.py # Plugin base class
|
|
359
|
+
│ ├── wpilib/ # WPILib plugin
|
|
360
|
+
│ ├── rev/ # REV plugin
|
|
361
|
+
│ ├── ctre/ # CTRE plugin
|
|
362
|
+
│ └── redux/ # Redux plugin
|
|
363
|
+
├── scripts/
|
|
364
|
+
│ └── build_index.py # Index builder script
|
|
365
|
+
└── tests/
|
|
366
|
+
├── test_search.py
|
|
367
|
+
└── test_plugins.py
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
## Example Queries
|
|
371
|
+
|
|
372
|
+
**Finding Command-Based Programming docs:**
|
|
373
|
+
```
|
|
374
|
+
search_frc_docs(query="command based programming subsystems", vendors=["wpilib"])
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
**Comparing motor controllers:**
|
|
378
|
+
```
|
|
379
|
+
search_frc_docs(query="SparkMax configuration", vendors=["rev"])
|
|
380
|
+
search_frc_docs(query="TalonFX configuration", vendors=["ctre"])
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
**Looking up specific hardware:**
|
|
384
|
+
```
|
|
385
|
+
search_frc_docs(query="CANcoder absolute position swerve", vendors=["ctre"])
|
|
386
|
+
search_frc_docs(query="through bore encoder", vendors=["rev"])
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
**Cross-vendor search:**
|
|
390
|
+
```
|
|
391
|
+
search_frc_docs(query="brushless motor closed loop velocity control", vendors=["all"])
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
## License
|
|
395
|
+
|
|
396
|
+
BSD-3-Clause License - see LICENSE file for details.
|
|
397
|
+
|
|
398
|
+
## Contributing
|
|
399
|
+
|
|
400
|
+
Contributions welcome! Please:
|
|
401
|
+
|
|
402
|
+
1. Fork the repository
|
|
403
|
+
2. Add tests for new functionality
|
|
404
|
+
3. Submit a pull request
|
|
405
|
+
|
|
406
|
+
For new vendor plugins, please include:
|
|
407
|
+
- Complete plugin implementation
|
|
408
|
+
- Pre-built index file
|
|
409
|
+
- Documentation updates
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
wpilib_mcp/__init__.py,sha256=cXMssSHAC_SUiHYnlu72IfcPZIxeUxegAkDAG06oIp0,91
|
|
2
|
+
wpilib_mcp/plugin_loader.py,sha256=nCmRpVEs2zv7_F_ptV4DgJCNxNSuJJUWoivwA62AkDo,8962
|
|
3
|
+
wpilib_mcp/server.py,sha256=fhk_gP1VIGYBho6UOqgdI41I0xohIydZA-XF3nRNsE4,10951
|
|
4
|
+
wpilib_mcp/tool_router.py,sha256=3Fca3Z4BiHq7ipP7wZQi-rfGn4wKz1fx0Uwwcvdroj4,9963
|
|
5
|
+
wpilib_mcp/plugins/__init__.py,sha256=6NYhvOIhx1Q5MIkLLQDcQJo0uK3ezOoOQOG-dTNL9xk,187
|
|
6
|
+
wpilib_mcp/plugins/base.py,sha256=OTZSJtlJjo3oKvpLkj9G_y_Hw-Oe2Y7QuRusNK0sxdQ,7002
|
|
7
|
+
wpilib_mcp/plugins/ctre/__init__.py,sha256=dse6ZjgP_ovuxP_1R8vsNNt3hyfy7NpHhbY7IQtOvok,95
|
|
8
|
+
wpilib_mcp/plugins/ctre/build_index.py,sha256=rFtcKFLLN-DI5cjRh5luNvd-jUeIkxhtGCRRFYY5p24,6039
|
|
9
|
+
wpilib_mcp/plugins/ctre/plugin.py,sha256=41B-352tG12nuR8NYxdwWWkwH2yRy1aCvIbvDxEHP38,7869
|
|
10
|
+
wpilib_mcp/plugins/ctre/data/index.json,sha256=ftTCa-FEBREwjnYkDm4NRsnEzg5cRBEBCtkZVou-AWs,434350
|
|
11
|
+
wpilib_mcp/plugins/photonvision/__init__.py,sha256=B4N75yF0wp4kumBaCS9T-dmUZU4PZMQ1yMoVlIMpJpo,92
|
|
12
|
+
wpilib_mcp/plugins/photonvision/build_index.py,sha256=numVCFBv9BpY08DPla6kzAYKpoNYtsl3eT2vxnCN1Nk,8932
|
|
13
|
+
wpilib_mcp/plugins/photonvision/plugin.py,sha256=BCceXXnpka7c1AIOlgzXe_6RNIhGLyGzUXUPmNICXOY,7833
|
|
14
|
+
wpilib_mcp/plugins/photonvision/data/index.json,sha256=7zMO1yQGvuSwqUmGMEZpJhWcmOMj7V-hiBHTpRMHbcs,247612
|
|
15
|
+
wpilib_mcp/plugins/redux/__init__.py,sha256=ioq3E6okUy_P0_6LHKUZqwE0dWoUXCWBh9pYkkUzC6U,97
|
|
16
|
+
wpilib_mcp/plugins/redux/build_index.py,sha256=fpIbcipFhoYuL30h7iyF1oxjKQEKTzZqO4wjKDQAjf8,4895
|
|
17
|
+
wpilib_mcp/plugins/redux/plugin.py,sha256=1BVv1k5RIzGc-2udonZwVLeXdDZ1IotZnOMHYV1qYIs,7812
|
|
18
|
+
wpilib_mcp/plugins/redux/data/index.json,sha256=XANxS_HbVxsd5msGZ6HCh1hprNBw8cvlj_gWGZSrRYQ,98370
|
|
19
|
+
wpilib_mcp/plugins/rev/__init__.py,sha256=hrP4mZFfP_DsWoIoAk9pc8JosavHwEioWJYcPvxr17g,95
|
|
20
|
+
wpilib_mcp/plugins/rev/build_index.py,sha256=nqQV9RRGi5AHQU0_EHjR-ffaxSKl8Y7TPuG9lN5Ihqg,5703
|
|
21
|
+
wpilib_mcp/plugins/rev/plugin.py,sha256=7oZavjIBA8miWBFU97myH0oznu-VYmPWYZijSVtm1nA,7765
|
|
22
|
+
wpilib_mcp/plugins/rev/data/index.json,sha256=h-mzM-trfe82LL8TzIsg5YwvYlzyJ5zzd1ZpZ-mZaQQ,210040
|
|
23
|
+
wpilib_mcp/plugins/wpilib/__init__.py,sha256=G86KSRIPuOma2PGEBjmomLZFplzq4nCLo9xpp9fHA8Y,89
|
|
24
|
+
wpilib_mcp/plugins/wpilib/build_index.py,sha256=jw8-xJzAhtWxI_Oo6kdQoqteOeNiOtTT1y4slqbQ2gY,6684
|
|
25
|
+
wpilib_mcp/plugins/wpilib/plugin.py,sha256=lwZ5D80gXqX2M8_QYtDbckeMrWiJYUDqBDQQ3eCqNVE,8778
|
|
26
|
+
wpilib_mcp/plugins/wpilib/data/index_2025.json,sha256=wqs95sPACYzvvpEKEC6-leROBd0_mnnVMmaekXoeqEw,17386
|
|
27
|
+
wpilib_mcp/plugins/wpilib/data/index_stable.json,sha256=q1QCOoj8Xa1Vm1QO0xU9jps410SAVvoZrCm1jIh7gaA,1927785
|
|
28
|
+
wpilib_mcp/utils/__init__.py,sha256=sGGqwgbMNR8emv9vxsc-nhs1G2yLDa6XGXEYk5r51vk,286
|
|
29
|
+
wpilib_mcp/utils/fetch.py,sha256=zSsXFoo2dWJDpkKBHzcvSFobwRdktQEdoPtbHoxl-io,4640
|
|
30
|
+
wpilib_mcp/utils/html.py,sha256=uy1OXkoE9s7tRqA-Oc1VIGgF4V2s9XJiuxypSLbFapQ,8955
|
|
31
|
+
wpilib_mcp/utils/indexer.py,sha256=MncZslFy51gDf8G5esn8soGoK_6_gQ28XbFOHqmF2E0,9675
|
|
32
|
+
wpilib_mcp/utils/search.py,sha256=_KZgi_1n-dwLTO6JXXPizkfkdxBLoT0Y4YH_IoCexU4,6058
|
|
33
|
+
first_agentic_csa-0.2.0.dist-info/METADATA,sha256=fF_mZ681CpbEm61cooO7-7jUCOgbNxPQrut0u9laS_U,10183
|
|
34
|
+
first_agentic_csa-0.2.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
35
|
+
first_agentic_csa-0.2.0.dist-info/entry_points.txt,sha256=H9utHQ6kCQhVqoP10Ap3qUeMzUivFzFbhCScpjvKpec,61
|
|
36
|
+
first_agentic_csa-0.2.0.dist-info/licenses/LICENSE,sha256=EzfGZ7xpAEI8h-ZU9KjGNt8ny2mTCTMTC0WexTh5xXo,1497
|
|
37
|
+
first_agentic_csa-0.2.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025, Rami Mouro
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|