foundry-mcp 0.3.3__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.
Files changed (135) hide show
  1. foundry_mcp/__init__.py +7 -0
  2. foundry_mcp/cli/__init__.py +80 -0
  3. foundry_mcp/cli/__main__.py +9 -0
  4. foundry_mcp/cli/agent.py +96 -0
  5. foundry_mcp/cli/commands/__init__.py +37 -0
  6. foundry_mcp/cli/commands/cache.py +137 -0
  7. foundry_mcp/cli/commands/dashboard.py +148 -0
  8. foundry_mcp/cli/commands/dev.py +446 -0
  9. foundry_mcp/cli/commands/journal.py +377 -0
  10. foundry_mcp/cli/commands/lifecycle.py +274 -0
  11. foundry_mcp/cli/commands/modify.py +824 -0
  12. foundry_mcp/cli/commands/plan.py +633 -0
  13. foundry_mcp/cli/commands/pr.py +393 -0
  14. foundry_mcp/cli/commands/review.py +652 -0
  15. foundry_mcp/cli/commands/session.py +479 -0
  16. foundry_mcp/cli/commands/specs.py +856 -0
  17. foundry_mcp/cli/commands/tasks.py +807 -0
  18. foundry_mcp/cli/commands/testing.py +676 -0
  19. foundry_mcp/cli/commands/validate.py +982 -0
  20. foundry_mcp/cli/config.py +98 -0
  21. foundry_mcp/cli/context.py +259 -0
  22. foundry_mcp/cli/flags.py +266 -0
  23. foundry_mcp/cli/logging.py +212 -0
  24. foundry_mcp/cli/main.py +44 -0
  25. foundry_mcp/cli/output.py +122 -0
  26. foundry_mcp/cli/registry.py +110 -0
  27. foundry_mcp/cli/resilience.py +178 -0
  28. foundry_mcp/cli/transcript.py +217 -0
  29. foundry_mcp/config.py +850 -0
  30. foundry_mcp/core/__init__.py +144 -0
  31. foundry_mcp/core/ai_consultation.py +1636 -0
  32. foundry_mcp/core/cache.py +195 -0
  33. foundry_mcp/core/capabilities.py +446 -0
  34. foundry_mcp/core/concurrency.py +898 -0
  35. foundry_mcp/core/context.py +540 -0
  36. foundry_mcp/core/discovery.py +1603 -0
  37. foundry_mcp/core/error_collection.py +728 -0
  38. foundry_mcp/core/error_store.py +592 -0
  39. foundry_mcp/core/feature_flags.py +592 -0
  40. foundry_mcp/core/health.py +749 -0
  41. foundry_mcp/core/journal.py +694 -0
  42. foundry_mcp/core/lifecycle.py +412 -0
  43. foundry_mcp/core/llm_config.py +1350 -0
  44. foundry_mcp/core/llm_patterns.py +510 -0
  45. foundry_mcp/core/llm_provider.py +1569 -0
  46. foundry_mcp/core/logging_config.py +374 -0
  47. foundry_mcp/core/metrics_persistence.py +584 -0
  48. foundry_mcp/core/metrics_registry.py +327 -0
  49. foundry_mcp/core/metrics_store.py +641 -0
  50. foundry_mcp/core/modifications.py +224 -0
  51. foundry_mcp/core/naming.py +123 -0
  52. foundry_mcp/core/observability.py +1216 -0
  53. foundry_mcp/core/otel.py +452 -0
  54. foundry_mcp/core/otel_stubs.py +264 -0
  55. foundry_mcp/core/pagination.py +255 -0
  56. foundry_mcp/core/progress.py +317 -0
  57. foundry_mcp/core/prometheus.py +577 -0
  58. foundry_mcp/core/prompts/__init__.py +464 -0
  59. foundry_mcp/core/prompts/fidelity_review.py +546 -0
  60. foundry_mcp/core/prompts/markdown_plan_review.py +511 -0
  61. foundry_mcp/core/prompts/plan_review.py +623 -0
  62. foundry_mcp/core/providers/__init__.py +225 -0
  63. foundry_mcp/core/providers/base.py +476 -0
  64. foundry_mcp/core/providers/claude.py +460 -0
  65. foundry_mcp/core/providers/codex.py +619 -0
  66. foundry_mcp/core/providers/cursor_agent.py +642 -0
  67. foundry_mcp/core/providers/detectors.py +488 -0
  68. foundry_mcp/core/providers/gemini.py +405 -0
  69. foundry_mcp/core/providers/opencode.py +616 -0
  70. foundry_mcp/core/providers/opencode_wrapper.js +302 -0
  71. foundry_mcp/core/providers/package-lock.json +24 -0
  72. foundry_mcp/core/providers/package.json +25 -0
  73. foundry_mcp/core/providers/registry.py +607 -0
  74. foundry_mcp/core/providers/test_provider.py +171 -0
  75. foundry_mcp/core/providers/validation.py +729 -0
  76. foundry_mcp/core/rate_limit.py +427 -0
  77. foundry_mcp/core/resilience.py +600 -0
  78. foundry_mcp/core/responses.py +934 -0
  79. foundry_mcp/core/review.py +366 -0
  80. foundry_mcp/core/security.py +438 -0
  81. foundry_mcp/core/spec.py +1650 -0
  82. foundry_mcp/core/task.py +1289 -0
  83. foundry_mcp/core/testing.py +450 -0
  84. foundry_mcp/core/validation.py +2081 -0
  85. foundry_mcp/dashboard/__init__.py +32 -0
  86. foundry_mcp/dashboard/app.py +119 -0
  87. foundry_mcp/dashboard/components/__init__.py +17 -0
  88. foundry_mcp/dashboard/components/cards.py +88 -0
  89. foundry_mcp/dashboard/components/charts.py +234 -0
  90. foundry_mcp/dashboard/components/filters.py +136 -0
  91. foundry_mcp/dashboard/components/tables.py +195 -0
  92. foundry_mcp/dashboard/data/__init__.py +11 -0
  93. foundry_mcp/dashboard/data/stores.py +433 -0
  94. foundry_mcp/dashboard/launcher.py +289 -0
  95. foundry_mcp/dashboard/views/__init__.py +12 -0
  96. foundry_mcp/dashboard/views/errors.py +217 -0
  97. foundry_mcp/dashboard/views/metrics.py +174 -0
  98. foundry_mcp/dashboard/views/overview.py +160 -0
  99. foundry_mcp/dashboard/views/providers.py +83 -0
  100. foundry_mcp/dashboard/views/sdd_workflow.py +255 -0
  101. foundry_mcp/dashboard/views/tool_usage.py +139 -0
  102. foundry_mcp/prompts/__init__.py +9 -0
  103. foundry_mcp/prompts/workflows.py +525 -0
  104. foundry_mcp/resources/__init__.py +9 -0
  105. foundry_mcp/resources/specs.py +591 -0
  106. foundry_mcp/schemas/__init__.py +38 -0
  107. foundry_mcp/schemas/sdd-spec-schema.json +386 -0
  108. foundry_mcp/server.py +164 -0
  109. foundry_mcp/tools/__init__.py +10 -0
  110. foundry_mcp/tools/unified/__init__.py +71 -0
  111. foundry_mcp/tools/unified/authoring.py +1487 -0
  112. foundry_mcp/tools/unified/context_helpers.py +98 -0
  113. foundry_mcp/tools/unified/documentation_helpers.py +198 -0
  114. foundry_mcp/tools/unified/environment.py +939 -0
  115. foundry_mcp/tools/unified/error.py +462 -0
  116. foundry_mcp/tools/unified/health.py +225 -0
  117. foundry_mcp/tools/unified/journal.py +841 -0
  118. foundry_mcp/tools/unified/lifecycle.py +632 -0
  119. foundry_mcp/tools/unified/metrics.py +777 -0
  120. foundry_mcp/tools/unified/plan.py +745 -0
  121. foundry_mcp/tools/unified/pr.py +294 -0
  122. foundry_mcp/tools/unified/provider.py +629 -0
  123. foundry_mcp/tools/unified/review.py +685 -0
  124. foundry_mcp/tools/unified/review_helpers.py +299 -0
  125. foundry_mcp/tools/unified/router.py +102 -0
  126. foundry_mcp/tools/unified/server.py +580 -0
  127. foundry_mcp/tools/unified/spec.py +808 -0
  128. foundry_mcp/tools/unified/task.py +2202 -0
  129. foundry_mcp/tools/unified/test.py +370 -0
  130. foundry_mcp/tools/unified/verification.py +520 -0
  131. foundry_mcp-0.3.3.dist-info/METADATA +337 -0
  132. foundry_mcp-0.3.3.dist-info/RECORD +135 -0
  133. foundry_mcp-0.3.3.dist-info/WHEEL +4 -0
  134. foundry_mcp-0.3.3.dist-info/entry_points.txt +3 -0
  135. foundry_mcp-0.3.3.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,337 @@
1
+ Metadata-Version: 2.4
2
+ Name: foundry-mcp
3
+ Version: 0.3.3
4
+ Summary: MCP server for SDD toolkit spec management
5
+ Project-URL: Homepage, https://github.com/tylerburleigh/foundry-mcp
6
+ Project-URL: Repository, https://github.com/tylerburleigh/foundry-mcp
7
+ Author: Tyler Burleigh
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: mcp,sdd,spec-driven-development,specification
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Requires-Python: >=3.10
19
+ Requires-Dist: click>=8.0.0
20
+ Requires-Dist: fastmcp>=0.1.0
21
+ Requires-Dist: mcp>=1.0.0
22
+ Requires-Dist: tomli>=2.0.0; python_version < '3.11'
23
+ Provides-Extra: dashboard
24
+ Requires-Dist: pandas>=2.0.0; extra == 'dashboard'
25
+ Requires-Dist: plotly>=5.18.0; extra == 'dashboard'
26
+ Requires-Dist: streamlit>=1.28.0; extra == 'dashboard'
27
+ Provides-Extra: metrics
28
+ Requires-Dist: prometheus-client>=0.17.0; extra == 'metrics'
29
+ Provides-Extra: observability
30
+ Requires-Dist: opentelemetry-exporter-otlp>=1.20.0; extra == 'observability'
31
+ Requires-Dist: opentelemetry-sdk>=1.20.0; extra == 'observability'
32
+ Requires-Dist: prometheus-client>=0.17.0; extra == 'observability'
33
+ Provides-Extra: test
34
+ Requires-Dist: hypothesis>=6.0.0; extra == 'test'
35
+ Requires-Dist: jsonschema>=4.0.0; extra == 'test'
36
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == 'test'
37
+ Requires-Dist: pytest-xdist>=3.0.0; extra == 'test'
38
+ Requires-Dist: pytest>=7.0.0; extra == 'test'
39
+ Provides-Extra: tracing
40
+ Requires-Dist: opentelemetry-exporter-otlp>=1.20.0; extra == 'tracing'
41
+ Requires-Dist: opentelemetry-sdk>=1.20.0; extra == 'tracing'
42
+ Description-Content-Type: text/markdown
43
+
44
+ # foundry-mcp
45
+
46
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
47
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
48
+ [![MCP Compatible](https://img.shields.io/badge/MCP-compatible-green.svg)](https://modelcontextprotocol.io/)
49
+ [![Development Status](https://img.shields.io/badge/status-alpha-orange.svg)](https://pypi.org/project/foundry-mcp/)
50
+
51
+ **An MCP server and native CLI that bring spec-driven development to your AI assistant.**
52
+
53
+ foundry-mcp packages the spec lifecycle, a single CLI/service layer, and MCP adapters described in the completed specs under `specs/completed/`. Every MCP response uses the standardized `response-v2` envelope, the CLI shares the same service layer, and feature-flagged tool suites cover environment setup, authoring, validation, LLM review, and automated testing.
54
+
55
+ ## 🚀 Why foundry-mcp?
56
+
57
+ - **Single service layer for CLI + MCP** — The completed CLI re-implementation and subprocess elimination specs ensure the CLI and MCP tools share contracts, observability, and feature flags.
58
+ - **Spec lifecycle automation** — Tools manage creation, validation, lifecycle transitions, blockers, and journaling with cursor-based pagination and dependency tracking.
59
+ - **Quality gates & behavioral testing** — A dedicated regression harness keeps foundry-mcp aligned with the legacy claude-sdd-toolkit CLI while integration/unit/property suites guard regressions.
60
+ - **LLM-ready workflows** — Provider abstractions, prompt shielding, and graceful fallbacks power AI review, documentation, and PR creation workflows when LLM access is available.
61
+ - **Security & governance baked in** — API keys, workspace scoping, rate limiting, structured logging, and audit trails are enforced before business logic as mandated by the MCP best-practices remediation spec.
62
+ - **Discovery-first design** — Capabilities are declared through `mcp/capabilities_manifest.json` so clients can negotiate response contracts, feature flags, and tool availability.
63
+
64
+ ## 📦 Installation
65
+
66
+ ### Pre-requisites
67
+
68
+ - Python 3.10 or higher
69
+ - macOS, Linux, or Windows
70
+ - MCP-compatible client (e.g., Claude Code)
71
+
72
+ ### Quick install
73
+
74
+ #### Run instantly with `uvx`
75
+
76
+ ```bash
77
+ uvx foundry-mcp
78
+ ```
79
+
80
+ #### Install from PyPI with `pip`
81
+
82
+ ```bash
83
+ pip install foundry-mcp
84
+ ```
85
+
86
+ #### Install from source (development)
87
+
88
+ ```bash
89
+ git clone https://github.com/tylerburleigh/foundry-mcp.git
90
+ cd foundry-mcp
91
+ pip install -e ".[test]"
92
+ ```
93
+
94
+ #### Launch the native SDD CLI
95
+
96
+ ```bash
97
+ python -m foundry_mcp.cli --help
98
+ ```
99
+
100
+ ## 📅 Release cadence & support channels
101
+
102
+ - The project currently ships **alpha** releases after each spec milestone; see [CHANGELOG.md](CHANGELOG.md) for the latest tagged version.
103
+ - PyPI publishes semantic versions that align with the spec roadmap (`response_contract_v2`, feature flags, test suites, etc.).
104
+ - MCP capabilities expose rollout state so clients can opt-in to new contracts (for example `response_contract=v2`).
105
+
106
+ ## 📋 Key features
107
+
108
+ ### Spec lifecycle & governance
109
+
110
+ ```
111
+ specs/
112
+ ├── pending/ # New specs awaiting activation
113
+ ├── active/ # Currently being worked on
114
+ ├── completed/ # Finished specs (automatically journaled)
115
+ └── archived/ # Historical reference
116
+ ```
117
+
118
+ - Discover and validate specs via `spec(action=...)`.
119
+ - Transition spec folders/states via `lifecycle(action=...)`.
120
+ - Automatically journal decisions, blockers, and dependency updates with audit metadata.
121
+
122
+ ### Task operations & execution
123
+
124
+ - `task(action=next|prepare|start|complete|...)` and blocker flows expose the full dependency graph.
125
+ - `plan(action=create|list|review)` supports lightweight planning and review flows.
126
+ - Notifications and sampling channels surface phase completions to MCP clients.
127
+
128
+ ### Code, docs, and testing intelligence
129
+
130
+ - Code navigation tools via `code(action=...)` support symbol lookup and call-graph tracing.
131
+ - Testing tools via `test(action=run|discover, preset=quick|unit|full)` run pytest presets with structured output.
132
+ - Shared adapters mirror claude-sdd-toolkit behavior and integrate with the regression testing harness.
133
+
134
+ ### LLM-powered workflows
135
+
136
+ - Configurable provider abstraction with OpenAI, Anthropic, and local backends (Ollama, etc.) plus prompt shielding and observability hooks.
137
+ - AI-enhanced review via `review(action=spec|fidelity|parse-feedback)` and PR helpers degrade gracefully when no LLM is configured.
138
+ - Timeouts, retries, and circuit breakers follow the resilience patterns from the remediation specs.
139
+
140
+ ### CLI + MCP integration
141
+
142
+ - Run `foundry-mcp` as an MCP server or `python -m foundry_mcp.cli` for the JSON-first CLI.
143
+ - Both surfaces share response helpers, validation, feature flags, and discovery metadata so you can switch between automated MCP clients and terminal workflows without drift.
144
+
145
+ ### Resources & prompts
146
+
147
+ - `foundry://specs/` resources expose full spec hierarchies, journals, and templates for AI assistants.
148
+ - Workflow prompts (`start_feature`, `debug_test`, `complete_phase`, etc.) guide SDD operations end-to-end.
149
+
150
+ ## 🔐 Access & security
151
+
152
+ - Workspace roots are scoped via configuration to prevent directory escape.
153
+ - Optional API keys (`FOUNDRY_MCP_API_KEYS`) or tenant TOML overrides enforce authentication before any tool runs.
154
+ - Rate limits and concurrency budgets are declared in the capabilities manifest and enforced server-side with structured audit logs.
155
+ - Sensitive data redaction, prompt shielding, and validation helpers protect against prompt injection or oversized payloads.
156
+
157
+ ## 🧾 Response contract & discovery
158
+
159
+ All MCP tools emit the standardized envelope defined in `docs/codebase_standards/mcp_response_schema.md`:
160
+
161
+ ```json
162
+ {
163
+ "success": true,
164
+ "data": { ... },
165
+ "error": null,
166
+ "meta": {
167
+ "version": "response-v2",
168
+ "pagination": { ... },
169
+ "warnings": []
170
+ }
171
+ }
172
+ ```
173
+
174
+ - `success`, `data`, `error`, and `meta` are always present so clients never guess at output shape.
175
+ - `response_contract_v2` is feature-flagged; clients advertise support via capability negotiation.
176
+ - `mcp/capabilities_manifest.json` advertises the 17 unified tools (plus feature flags like `unified_manifest`).
177
+
178
+ **Legacy → unified mapping (examples)**
179
+
180
+ | Legacy tool | Unified call |
181
+ |---|---|
182
+ | Legacy Tool (Removed) | Unified Equivalent |
183
+ |----------------------|--------------------|
184
+ | `task-next` | `task(action="next")` |
185
+ | `spec-validate` | `spec(action="validate")` |
186
+ | `test-run` | `test(action="run", preset="full")` |
187
+ | `tool-list` | `server(action="tools")` |
188
+ | `get-server-context` | `server(action="context")` |
189
+
190
+ ## ⚙️ Configuration
191
+
192
+ ### Environment variables
193
+
194
+ | Variable | Description | Default |
195
+ |----------|-------------|---------|
196
+ | `FOUNDRY_MCP_SPECS_DIR` | Path to specs directory | Auto-detected from workspace |
197
+ | `FOUNDRY_MCP_LOG_LEVEL` | Logging level (DEBUG, INFO, etc.) | `INFO` |
198
+ | `FOUNDRY_MCP_WORKFLOW_MODE` | Execution mode: `single`, `autonomous`, `batch` | `single` |
199
+ | `FOUNDRY_MCP_API_KEYS` | Comma-separated API keys required for tool access | Disabled |
200
+ | `FOUNDRY_MCP_FEATURE_FLAGS` | Additional feature flags to enable (e.g., `planning_tools`) | Based on spec rollout |
201
+ | `FOUNDRY_MCP_RESPONSE_CONTRACT` | Force response contract version (`v2`) | Auto-negotiated |
202
+ | `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` | LLM provider credentials | Not set |
203
+
204
+ ### TOML configuration
205
+
206
+ Create `foundry-mcp.toml` for shared settings:
207
+
208
+ ```toml
209
+ [workspace]
210
+ specs_dir = "/path/to/specs"
211
+
212
+ [logging]
213
+ level = "INFO"
214
+ structured = true
215
+
216
+ [workflow]
217
+ mode = "single"
218
+ auto_validate = true
219
+ journal_enabled = true
220
+
221
+ [llm]
222
+ provider = "openai" # or "anthropic", "local"
223
+ model = "gpt-4"
224
+ timeout = 30
225
+
226
+ [security]
227
+ require_api_key = true
228
+ allowed_keys = ["tenant-prod", "tenant-dev"]
229
+ workspace_roots = ["/repos/specs"]
230
+
231
+ [feature_flags]
232
+ enabled = ["environment_tools", "spec_helpers", "planning_tools", "response_contract_v2"]
233
+ ```
234
+
235
+ ## 🚀 Getting started
236
+
237
+ ### Launch as an MCP server
238
+
239
+ ```bash
240
+ foundry-mcp
241
+ ```
242
+
243
+ The server will advertise its capabilities, feature flags, and response contract so MCP clients (Claude Code, Gemini CLI, etc.) can connect automatically.
244
+
245
+ ### Use the native SDD CLI
246
+
247
+ ```bash
248
+ python -m foundry_mcp.cli task next --specs-dir /path/to/specs
249
+ ```
250
+
251
+ All CLI commands output JSON for reliable parsing by AI coding tools and mirror the legacy `claude-sdd-toolkit` surface.
252
+
253
+ ### Claude Code setup
254
+
255
+ Add foundry-mcp through Claude Code settings (Command Palette → **Claude Code: Configure MCP Servers**) and include:
256
+
257
+ ```json
258
+ {
259
+ "mcpServers": {
260
+ "foundry-mcp": {
261
+ "command": "uvx",
262
+ "args": ["foundry-mcp"],
263
+ "env": {
264
+ "FOUNDRY_MCP_SPECS_DIR": "/path/to/specs",
265
+ "FOUNDRY_MCP_RESPONSE_CONTRACT": "v2"
266
+ }
267
+ }
268
+ }
269
+ }
270
+ ```
271
+
272
+ <details>
273
+ <summary>Using a pip installation instead?</summary>
274
+
275
+ ```json
276
+ {
277
+ "mcpServers": {
278
+ "foundry-mcp": {
279
+ "command": "foundry-mcp",
280
+ "env": {
281
+ "FOUNDRY_MCP_SPECS_DIR": "/path/to/specs"
282
+ }
283
+ }
284
+ }
285
+ }
286
+ ```
287
+ </details>
288
+
289
+ ### Quick usage examples
290
+
291
+ ```bash
292
+ # List specs via MCP tool (unified router)
293
+ echo '{"action": "list"}' | foundry-mcp --tool spec
294
+
295
+ # Validate a spec via MCP tool
296
+ echo '{"action": "validate", "spec_id": "sdd-core-operations-2025-11-27-001"}' | foundry-mcp --tool spec
297
+
298
+ # Run CLI validation without an MCP client
299
+ python -m foundry_mcp.cli --specs-dir ./specs validate check sdd-core-operations-2025-11-27-001
300
+ ```
301
+
302
+ ## 📚 Documentation
303
+
304
+ | Guide | Description |
305
+ |-------|-------------|
306
+ | [SDD Philosophy](docs/concepts/sdd-philosophy.md) | Why spec-driven development matters |
307
+ | [Architecture Overview](docs/architecture/adr-001-cli-architecture.md) | CLI/MCP architecture decision record |
308
+ | [Development Guide](docs/guides/development-guide.md) | Setup, architecture, contributing |
309
+ | [Testing Guide](docs/guides/testing.md) | Running and debugging tests / fixtures |
310
+ | [LLM Configuration](docs/guides/llm-configuration.md) | Provider setup & fallbacks |
311
+ | [MCP Best Practices](docs/mcp_best_practices/README.md) | Canonical implementation checklist |
312
+ | [Response Schema](docs/codebase_standards/mcp_response_schema.md) | Standardized envelope reference |
313
+ | [CLI Output Contract](docs/codebase_standards/cli-output.md) | JSON-first CLI expectations |
314
+
315
+ ## 🧪 Testing & quality gates
316
+
317
+ ```bash
318
+ pytest # Full suite
319
+ pytest tests/integration/test_mcp_smoke.py # MCP smoke tests
320
+ pytest tests/integration/test_mcp_tools.py # Tool contract coverage
321
+ ```
322
+
323
+ - Regression tests keep MCP/CLI adapters aligned with the legacy claude-sdd-toolkit contracts.
324
+ - Golden fixtures (`tests/fixtures/golden`) ensure response envelopes, error semantics, and pagination never regress.
325
+ - Freshness checks (doc generation, capability manifests) run alongside core unit and integration suites.
326
+
327
+ ## 🤝 Contributing
328
+
329
+ Contributions are welcome! Please read the [MCP Best Practices](docs/mcp_best_practices/README.md) before submitting PRs. All changes should keep specs, docs, code, and fixtures in sync and follow the decision matrix in `AGENTS.md`.
330
+
331
+ ## 📄 License
332
+
333
+ MIT License — see [LICENSE](LICENSE) for details.
334
+
335
+ ---
336
+
337
+ **Built by [Tyler Burleigh](https://github.com/tylerburleigh)** · [Report an Issue](https://github.com/tylerburleigh/foundry-mcp/issues) · [View on GitHub](https://github.com/tylerburleigh/foundry-mcp)
@@ -0,0 +1,135 @@
1
+ foundry_mcp/__init__.py,sha256=-ioCy0T9SKP61LjLdabx3rEHBrDan3SjmrErulXsZz0,191
2
+ foundry_mcp/config.py,sha256=neqA7-YyfS33Aap8SV2jFTbLuKVuqUoAp7flJfHFOY8,31237
3
+ foundry_mcp/server.py,sha256=Efi7FtjuiFHqaU5L40yy-1hu7oQEdrpEutSc8Z-Aezo,5382
4
+ foundry_mcp/cli/__init__.py,sha256=tHj_9cQK1yBsqY0wxsn2eg5OHPyW6wN3oRJ-w-eBvuc,1887
5
+ foundry_mcp/cli/__main__.py,sha256=wPwlid-SomQl5oGxtM319jjN4OSE-KWZtsdHctp4juU,167
6
+ foundry_mcp/cli/agent.py,sha256=QPuoZkLeNwmvjqCb2a3CPXJx9YWNJmd8s4a9iRbENIM,2855
7
+ foundry_mcp/cli/config.py,sha256=9jdpVw_LfTOOLR9LO3wzm82ziwKq7tv1JMBrj40iWsE,2980
8
+ foundry_mcp/cli/context.py,sha256=PUBwWqzvxW-qOibu3yedPNeWJcbANEsalUjl45i6jwo,8998
9
+ foundry_mcp/cli/flags.py,sha256=_9W-xj1VhTtAT5cSp3Ch7zoAhhoC_HRcjztmHRq24lw,8137
10
+ foundry_mcp/cli/logging.py,sha256=z-O-qQSIfndcIOiCkKr8TJ78Pldn0jNXWtjrCk8t1Ho,5974
11
+ foundry_mcp/cli/main.py,sha256=0BPbEbbNzZtS1rDjTqQlLZw2cGL4jaOdHtSk5ov9NWU,1088
12
+ foundry_mcp/cli/output.py,sha256=OOYfASmErEUajwbPajqnZzQ9elCnhUPQVNh1EE5tvio,3965
13
+ foundry_mcp/cli/registry.py,sha256=25yV3o-q7VgnfqjDvqVQHyphe9BQF6y2y70zY52jWLM,2816
14
+ foundry_mcp/cli/resilience.py,sha256=o4flW5JN9nOPq5RVYvRf88cEb4KbqgI3kg2rfkcxv6g,5248
15
+ foundry_mcp/cli/transcript.py,sha256=DbusgsUCipi9l8YVHY20U5rbE13dM76PQbUokGocgV4,7227
16
+ foundry_mcp/cli/commands/__init__.py,sha256=vU8zLcC1opoM5Ox4du-0mG4gxHJ6N1tRaE4F0KoJBfk,1171
17
+ foundry_mcp/cli/commands/cache.py,sha256=_bVPkWXRT4Q-EtDOQIYY6TkJR1m49dm4RQ_lbSEaqRE,3373
18
+ foundry_mcp/cli/commands/dashboard.py,sha256=9T_Lu78p9y491_njoPgM02uPBccp11jbDNBJ1IttGUU,3868
19
+ foundry_mcp/cli/commands/dev.py,sha256=kBtZacvf-lXyGpmdNuZIZZrdZdtMEtxsQqP6HtUR5mk,12210
20
+ foundry_mcp/cli/commands/journal.py,sha256=T7SGvZrdnV0iN1TgHibqBoZSVSMWaye7FiFED3duYik,10936
21
+ foundry_mcp/cli/commands/lifecycle.py,sha256=vtmNyw4QL1igwEeQMoyM0lD-blCvY-3qlYF6sZHc4Z8,8301
22
+ foundry_mcp/cli/commands/modify.py,sha256=Loe5J-P093E9rFJJDZyRFnQB6ez6OkWlZ_eF1bVmiC0,21936
23
+ foundry_mcp/cli/commands/plan.py,sha256=OgOaZkA8W9ZCU1PYWHSeAzw_UBEJBKOjzz6zLKG1dic,17609
24
+ foundry_mcp/cli/commands/pr.py,sha256=4PnLJrsB7op6RIP7Z1cDvrcSGMfknRRfBJrDd8aXBpw,11035
25
+ foundry_mcp/cli/commands/review.py,sha256=TXQt8A9VVF6runZL2iPYQ_Ozx6X6ziaw00wnB50Ying,20604
26
+ foundry_mcp/cli/commands/session.py,sha256=IIZIEGk8ME7Z2DB_DTJLt9GYGIhFe2E4olxuymyBiN0,15970
27
+ foundry_mcp/cli/commands/specs.py,sha256=B6FhDkYrpe34BVu2fdJdS750hb_p8B1jYNmpD8__QOE,26352
28
+ foundry_mcp/cli/commands/tasks.py,sha256=TToK6pcwlAqF1zYQ2mKB36Esw9C3htAyvx6Qc8-nOQE,25246
29
+ foundry_mcp/cli/commands/testing.py,sha256=5ZtZ2XJ79V9FmsnvgQ1Z47qGGKMVeFuCOf7GivntMkI,20317
30
+ foundry_mcp/cli/commands/validate.py,sha256=Y_dJmx0WgdxYQkIa8y6H0HSHtQBhXYaqFMv62wEwuD8,30630
31
+ foundry_mcp/core/__init__.py,sha256=LgBtknZIRhvDQT2c8D07TeymkSmDZonrCxWZUZOgeSM,3025
32
+ foundry_mcp/core/ai_consultation.py,sha256=738PtRMM7_3eSHGdkTPq45wBL1mI_gJW9wU_QCCCbVQ,57174
33
+ foundry_mcp/core/cache.py,sha256=7eM1-J_CXgQUid1JTTRS0aRxOZK9HgTRLEzX-k534po,5443
34
+ foundry_mcp/core/capabilities.py,sha256=Zq6QJ7bvHL4GIOxjQNjmUGLFBeEjvVNj4XP2RLswebE,13144
35
+ foundry_mcp/core/concurrency.py,sha256=qOlfYmlSDYU-deqnqa0r5ccGwey-MIM5QiDag_K6xzk,26571
36
+ foundry_mcp/core/context.py,sha256=2M77uy-1KW-EzVxT2bdWPUFc6mWbANK1iYsCNFhMOls,16292
37
+ foundry_mcp/core/discovery.py,sha256=GRMMZBo44he-4t3z7Kg0shUhkQMfCIvpW1KHpHfXrho,53856
38
+ foundry_mcp/core/error_collection.py,sha256=MjpYU0OrTpQRIg8ND-EQzd-H-vM4LKtRHUNuveQFvp8,25069
39
+ foundry_mcp/core/error_store.py,sha256=AthrqQSktYTdwlf7Vfji-2dpGGTbylLpLy7T35RlzpU,20739
40
+ foundry_mcp/core/feature_flags.py,sha256=Pv4E4vFBe1bfLHRG3xRqfWmyVRhrw0GLcoZnYKA_DBo,19599
41
+ foundry_mcp/core/health.py,sha256=GcpLnHDSF5W_nf0k7-5icGeZmrKw-sUU_67ddMe8Kt4,25115
42
+ foundry_mcp/core/journal.py,sha256=f1q52bjVOOLqMevd4hmdii2vCeLRT-sQhEwaUj0s9Bk,19124
43
+ foundry_mcp/core/lifecycle.py,sha256=LALbkljjUrXtGe0No8eux9vAr-AIlDDltn9jz1HToHY,10959
44
+ foundry_mcp/core/llm_config.py,sha256=OZOCUWMq06vjWM3WFjB11YKAw3tYlr0Ii99qdeHoD_w,47322
45
+ foundry_mcp/core/llm_patterns.py,sha256=1ZCuCkZ6ov2abk4Wt6T35a2Fg0Dp-0ALV5sdm5N9gXE,15336
46
+ foundry_mcp/core/llm_provider.py,sha256=VG4lJn5gIF8QNbAV81ysyEPkbg3XehCdw5m2KDtae9c,52595
47
+ foundry_mcp/core/logging_config.py,sha256=Dlo6lL5eollUXk9U43PviuvU9d6jW_AREEQK63vE2IE,10960
48
+ foundry_mcp/core/metrics_persistence.py,sha256=rvcNsaGXC811feicjLu7nq7ayUX_aTD7tyHcDGPYO8w,18231
49
+ foundry_mcp/core/metrics_registry.py,sha256=TpOkaFXpPMDagV537IbNPW4InZH1IaQT8v0pLZyBXJc,10438
50
+ foundry_mcp/core/metrics_store.py,sha256=T26VDgHZPCC1UUPkwX59jNcYZ4rGMZu5YzsAwe1A_QY,22496
51
+ foundry_mcp/core/modifications.py,sha256=g6nnXunEhqjXyr5HrV3dPoMMmMjML-3tYWKjlmxt1GY,6343
52
+ foundry_mcp/core/naming.py,sha256=3ru58LJC68wcrfvxlsVwE9Sey7fo5OSWfOAd3u1NNFc,4094
53
+ foundry_mcp/core/observability.py,sha256=Y7f9ws8Glml4ThoMynj4G0vkhZEAw2rHtglw9uap7Vo,41477
54
+ foundry_mcp/core/otel.py,sha256=BVb4rgyo11GMUnJuGSji_0mjvTNyO8f5E1LNCoyVe08,13516
55
+ foundry_mcp/core/otel_stubs.py,sha256=lVWL7qQHo7QRj9NvvyqNvvxzjGvLFiDEdJQDqpc5XcE,6834
56
+ foundry_mcp/core/pagination.py,sha256=S_iTmZYmLda1to-__LLMM0sQI1xJMvAzjW0NAHLKx6A,7243
57
+ foundry_mcp/core/progress.py,sha256=Rc3dvGnFIA1khFkg6wphv_r0HcwJaIlM7P868vOgM9M,9724
58
+ foundry_mcp/core/prometheus.py,sha256=4sE58NzWzK5FTp3qGJ27r9Sd_aOa0ogh2mSKtOrhu3Q,17814
59
+ foundry_mcp/core/rate_limit.py,sha256=6Hrx60Az4z8lxXW0DeEx1hrGQPXRwbhhRVI1PA72BKQ,13395
60
+ foundry_mcp/core/resilience.py,sha256=DrH6fbMYXjRmjKDukT8zLL49JEKsgza2LGsgBow4usQ,18831
61
+ foundry_mcp/core/responses.py,sha256=bAZCbpsrte8PxNwXU9unI0kkuzuZG0LrmQCsnNUGUX0,31250
62
+ foundry_mcp/core/review.py,sha256=DkiNG1DWgmm5PCuZrGstYI6mcd7ub9sXQpPARbk-HWM,11183
63
+ foundry_mcp/core/security.py,sha256=4ABOhWBzu7P9gMuC8gTXr3PrjEmEp_eSAgrFZG2sjyI,15444
64
+ foundry_mcp/core/spec.py,sha256=uJjbziJ2enKmVb7zbhtu1GftBmhrAOG7rnjXXXNkOFY,50470
65
+ foundry_mcp/core/task.py,sha256=e4AACpMBC0CeWTbmWkh5WtYy3WaRBq0i-gE_eAoVp98,41710
66
+ foundry_mcp/core/testing.py,sha256=-B_XR9rIv0EYhEaDYIaJXL6Uf39c4bBJch8s1QBsMIg,12549
67
+ foundry_mcp/core/validation.py,sha256=1lunXVQPFUvkNrNfrmUAA62p7aaoSSTGr_JsF_iuLSA,68870
68
+ foundry_mcp/core/prompts/__init__.py,sha256=0rx9sX-D_Zgfah-gPoUPYxW5GnhjxZmCVNzvurMOk8s,14316
69
+ foundry_mcp/core/prompts/fidelity_review.py,sha256=Du0vAP9RUZlj8FJLR4vPSMJ79RTEIElaqiEES07Cpxk,16544
70
+ foundry_mcp/core/prompts/markdown_plan_review.py,sha256=yIYxzepSULPVHvYn7Ez-KmRj0_thYmrEvNAI-Xuqqws,17880
71
+ foundry_mcp/core/prompts/plan_review.py,sha256=BMEzJ9A-FwS75m-3zQi9PTl4SRC5cm_9FLLfaoiZ7E0,21616
72
+ foundry_mcp/core/providers/__init__.py,sha256=wWP2_G6EMJuwl-enLoyVBXhl558gOI89lxlM7kLIPz0,5914
73
+ foundry_mcp/core/providers/base.py,sha256=LG4e6sPqRlssniaLR4j0x8T-ftfbFMLYw_veKlnPCUE,16584
74
+ foundry_mcp/core/providers/claude.py,sha256=_8Y-a5-olIp0BwmhMO7SFtm6f1k5ZOEtYL1KNtU0hqc,15024
75
+ foundry_mcp/core/providers/codex.py,sha256=2UxDvk-_tGz0kPqNDelFP0WM6zpoDDNSg-QRLLWvEU4,20781
76
+ foundry_mcp/core/providers/cursor_agent.py,sha256=W1pmS98PmdbWVeerZKlfRDLNoYMJhLjJkioAuQgpmYM,22492
77
+ foundry_mcp/core/providers/detectors.py,sha256=cFt-FMcOQpbMNsOLlTXqLFACnYyvF66GIPDA_CMSUeU,15398
78
+ foundry_mcp/core/providers/gemini.py,sha256=4ZnPooPw84lTsvYGcUC85ac6KbK9yBDOgLEHFR6R74E,13521
79
+ foundry_mcp/core/providers/opencode.py,sha256=VFDMGwN2SLZsfAqWkenrUNhkYWDUHNDETqW8HyTbOjw,22114
80
+ foundry_mcp/core/providers/opencode_wrapper.js,sha256=m7zHGmXwYGM8SQn29Wq3o8rVUa-gOLXq_haPwXHDI4w,7521
81
+ foundry_mcp/core/providers/package-lock.json,sha256=NaVOX26YlJlKw6suq_Vg9MWES_B_pEIkRiVIxXcthss,646
82
+ foundry_mcp/core/providers/package.json,sha256=qQ80lM53NDZYEt7sUYLAydzUAnNJBUE6a-NLyFLnxNo,511
83
+ foundry_mcp/core/providers/registry.py,sha256=uAVJ0dvE_lTtTM6lE_RV9QCvGjP33gYxxXYCy_68Y8c,19147
84
+ foundry_mcp/core/providers/test_provider.py,sha256=7RlAkc8H-2uBd25tmKs_Cu7Fl6EUpBB5eXKTx7G1Esk,5213
85
+ foundry_mcp/core/providers/validation.py,sha256=ik82u5Uiclnb2AWVe337M2kIKq-lhPwuhtOtq5-Vf6o,21767
86
+ foundry_mcp/dashboard/__init__.py,sha256=3XUgs6JJbcrx37ABvZPosgNzd5oFqdDm7raNDqWkmFs,811
87
+ foundry_mcp/dashboard/app.py,sha256=Ktv0o6nBjtkXF08g2Oq15daR_hgV22vs1DlUZ55kJGI,3004
88
+ foundry_mcp/dashboard/launcher.py,sha256=U58onATJyWsSPvOJYHfWPfBAyISVLHb9cO7lL3dPliQ,7742
89
+ foundry_mcp/dashboard/components/__init__.py,sha256=etYzKPHwfZdYvm9u7s2CPR0VPnBmWHl8FyJ2YoE7mEI,352
90
+ foundry_mcp/dashboard/components/cards.py,sha256=QQTa4dlLyHwAUVe6zBwPoATmyIMXq24kTVRC0Uyvqno,2414
91
+ foundry_mcp/dashboard/components/charts.py,sha256=hWBr5DHrjZLUqzRwlNXcZg5XndM-LafzgakZazVe9n0,5432
92
+ foundry_mcp/dashboard/components/filters.py,sha256=uN7rFrBvZk6oacPcOiexET02BExNM5olWepjCXDrTf8,3061
93
+ foundry_mcp/dashboard/components/tables.py,sha256=WVq_BMbWBGyaIxuvy3qUrH6tBWsJABC5wfulojJNEK0,4873
94
+ foundry_mcp/dashboard/data/__init__.py,sha256=CFz07CIZhmD12kx77Mr2LG0J--b9DTvyu3uaHDJusvI,261
95
+ foundry_mcp/dashboard/data/stores.py,sha256=-2193Vdz1q4Ls2qmP1aQZ7cF1DWRxeCItq4LxJi6UnA,12391
96
+ foundry_mcp/dashboard/views/__init__.py,sha256=12fUzf3TkGMs0dJHfA6Y856qJEO7lOS_hs6msP3xYRs,208
97
+ foundry_mcp/dashboard/views/errors.py,sha256=suDaoQQsnyr2sYOWhN2nNNWIuIBZPkVIHGMlVvYsgr8,7305
98
+ foundry_mcp/dashboard/views/metrics.py,sha256=t5M_QckgMPnBonPM2ynduTbG8WZ-Sa7oLrS5jf9uBjU,6186
99
+ foundry_mcp/dashboard/views/overview.py,sha256=mBJelbRMVBiy2EdVPf1KcjFqQye9TH0SW-ZF-bpr7sI,5821
100
+ foundry_mcp/dashboard/views/providers.py,sha256=sFCh-F8xIhLRQQzgjd_dwZz_S6AgolWSmP3iqczxxYE,2819
101
+ foundry_mcp/dashboard/views/sdd_workflow.py,sha256=lKvh8Ru6WBg5nE8vCcNZibemtRvhMoB3P5boK5Sd68M,8281
102
+ foundry_mcp/dashboard/views/tool_usage.py,sha256=-SD9VwhDJ1SRpHkYXDPINenSaLrQAiXRFEvRrp3-HbA,4760
103
+ foundry_mcp/prompts/__init__.py,sha256=AeAFELo1TTBdw4MVg4VoeDWsGGvzFTmdRtHHOBxwVzA,200
104
+ foundry_mcp/prompts/workflows.py,sha256=1bg43V6lEGeGuGX37G49UYGtDjZ6SZqsXguKb_zZQss,18369
105
+ foundry_mcp/resources/__init__.py,sha256=rnxmkQKsDcL-p-NyVlZtEh9Ie2BQn0nzQ_16NuCLBPY,201
106
+ foundry_mcp/resources/specs.py,sha256=dkJcfry5F6X18J6uz6DAd5PzW573XLz4cB-v9QD_SxU,19271
107
+ foundry_mcp/schemas/__init__.py,sha256=iKHwedYPusMeg-Ozdeq-gHDT5nhmqEPP-a9jXi8VyOM,1140
108
+ foundry_mcp/schemas/sdd-spec-schema.json,sha256=9dhaS7mpkhGIRutQpjHqiKqsZDRh9j5HsKTWIDlVMro,11484
109
+ foundry_mcp/tools/__init__.py,sha256=yNmGFFGNp-OMA758oAMxB4z7cvXb_6KPxm-ZyHbi-9I,199
110
+ foundry_mcp/tools/unified/__init__.py,sha256=ilXrrgJNs3lK-DMXQvpcVtGN2_KFeG9v2b_0kSxcXJM,2609
111
+ foundry_mcp/tools/unified/authoring.py,sha256=zgGw5yOqOqLVBZoQIPLyp9YU4QMMKSVVBe03slllg6c,49423
112
+ foundry_mcp/tools/unified/context_helpers.py,sha256=JcaEdn1nVgaZ4GfTktRdZ7oD4pHkU9TH6O8WfWJ9lr0,3056
113
+ foundry_mcp/tools/unified/documentation_helpers.py,sha256=NhYxFx3RF7ZJy4A_NcOTdhV3-mUZy1ecaClHFZRXhiM,7615
114
+ foundry_mcp/tools/unified/environment.py,sha256=rTmS6nK0GLGlKBIj2yyUEqGWdXld3zryYMOw6KBeL_w,31437
115
+ foundry_mcp/tools/unified/error.py,sha256=OIqgcMvhaV_MUyoI3ghtShVU_2io4g3wLXDI3YycITY,14048
116
+ foundry_mcp/tools/unified/health.py,sha256=8oo61HeTfuyxTYyuKQPLMHvvYh54ju33invxIGFi5s4,6833
117
+ foundry_mcp/tools/unified/journal.py,sha256=mbVivCiJymd6QFq2u1stVkqhLMM7odrpSyU6X9nRnak,23262
118
+ foundry_mcp/tools/unified/lifecycle.py,sha256=RDKuVCGhboDgwRV2JpNeb_5rHU344cfxxzWE3DWJ9b0,19792
119
+ foundry_mcp/tools/unified/metrics.py,sha256=Q1vIXLpQnTfHnpFxXKWwqQpNDc2_iuGIr48Bg7EM47c,22600
120
+ foundry_mcp/tools/unified/plan.py,sha256=W6Remrmb4IJPmCOFQMcxnqBOMp9m9NSgbbIP822aDTc,23562
121
+ foundry_mcp/tools/unified/pr.py,sha256=L_Gk9oVP-8PgmbdULFr_BwXBPaLRib_55H8MyHuZ_34,9786
122
+ foundry_mcp/tools/unified/provider.py,sha256=6v4eihUts59eoBVkxA7ZuM12v360jD0LbLvq2e8Jl_A,21770
123
+ foundry_mcp/tools/unified/review.py,sha256=eUOqaB0KKqzL6uU7R20g_D70qfPgOFVB2oDqHwNeWhg,23791
124
+ foundry_mcp/tools/unified/review_helpers.py,sha256=k1_zJXMOGSgp7AP6_swEQdDLwcduOb_iy0D7wUX4YVk,9463
125
+ foundry_mcp/tools/unified/router.py,sha256=sWqAaey9yhiAoxyrnL8lr2reMWyPgmyIPlwrNgZZmRI,3489
126
+ foundry_mcp/tools/unified/server.py,sha256=2QiID5O4cHVSWkakcDH1qwhJM7IHjJ5LdenffbzXmEY,19812
127
+ foundry_mcp/tools/unified/spec.py,sha256=imTDpZ3UcAeDPI2diuBvt_bDJX5PUvDD5WZVWbIzH_c,26363
128
+ foundry_mcp/tools/unified/task.py,sha256=iKO57JTGLF0XUsLa_BSGNVAbwMq9fE_GWgwjRlNPVgw,75725
129
+ foundry_mcp/tools/unified/test.py,sha256=k2_Ko_Ek9qFgtrE8e-HMJk8nsN4rN83dWcgiks2TkOY,11736
130
+ foundry_mcp/tools/unified/verification.py,sha256=Kq3BJ7-Rnp2R35dHoFSTdwHPjEf60nce8vWMIKOA32s,16945
131
+ foundry_mcp-0.3.3.dist-info/METADATA,sha256=UNKnJ7t2qSVxgrMIEClUteFtv4aDR2A7cmOC0b_hxC0,13221
132
+ foundry_mcp-0.3.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
133
+ foundry_mcp-0.3.3.dist-info/entry_points.txt,sha256=EBy4TVvlciNngt9ErVIyNjTImjczKa2FkoZRtIEw6aU,95
134
+ foundry_mcp-0.3.3.dist-info/licenses/LICENSE,sha256=8dabQwxo8HuixKsQaXcVaIHLLQWvPPLuKQFZLAIXL4w,1071
135
+ foundry_mcp-0.3.3.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ foundry-cli = foundry_mcp.cli.main:cli
3
+ foundry-mcp = foundry_mcp.server:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Tyler Burleigh
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.