intake-ai-cli 0.3.0__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/CHANGELOG.md +69 -0
  2. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/PKG-INFO +94 -4
  3. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/README.md +88 -3
  4. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/SEGUIMIENTO-V0.md +204 -1
  5. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/README.md +9 -1
  6. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/arquitectura.md +19 -1
  7. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/buenas-practicas.md +41 -0
  8. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/configuracion.md +41 -0
  9. intake_ai_cli-0.4.0/docs/github-notes/v0.4.0.md +278 -0
  10. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/guia-cli.md +125 -2
  11. intake_ai_cli-0.4.0/docs/mcp-server.md +432 -0
  12. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/pipeline.md +59 -0
  13. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/solucion-problemas.md +74 -0
  14. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/verificacion.md +40 -0
  15. intake_ai_cli-0.4.0/docs/watch-mode.md +316 -0
  16. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/pyproject.toml +7 -1
  17. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/__init__.py +1 -1
  18. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/cli.py +142 -0
  19. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/config/schema.py +36 -0
  20. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/claude_code.py +1 -1
  21. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/copilot.py +1 -1
  22. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/cursor.py +1 -1
  23. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/kiro.py +1 -1
  24. intake_ai_cli-0.4.0/src/intake/mcp/__init__.py +68 -0
  25. intake_ai_cli-0.4.0/src/intake/mcp/prompts.py +167 -0
  26. intake_ai_cli-0.4.0/src/intake/mcp/resources.py +108 -0
  27. intake_ai_cli-0.4.0/src/intake/mcp/server.py +154 -0
  28. intake_ai_cli-0.4.0/src/intake/mcp/tools.py +427 -0
  29. intake_ai_cli-0.4.0/src/intake/watch/__init__.py +25 -0
  30. intake_ai_cli-0.4.0/src/intake/watch/watcher.py +237 -0
  31. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_cli.py +62 -1
  32. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_config/test_schema.py +52 -0
  33. intake_ai_cli-0.4.0/tests/test_mcp/test_prompts.py +99 -0
  34. intake_ai_cli-0.4.0/tests/test_mcp/test_resources.py +143 -0
  35. intake_ai_cli-0.4.0/tests/test_mcp/test_server.py +91 -0
  36. intake_ai_cli-0.4.0/tests/test_mcp/test_tools.py +338 -0
  37. intake_ai_cli-0.4.0/tests/test_verify/__init__.py +0 -0
  38. intake_ai_cli-0.4.0/tests/test_watch/__init__.py +0 -0
  39. intake_ai_cli-0.4.0/tests/test_watch/test_watcher.py +505 -0
  40. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/.gitignore +0 -0
  41. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/.intake.yaml.example +0 -0
  42. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/LICENSE +0 -0
  43. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/SECURITY.md +0 -0
  44. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/conectores.md +0 -0
  45. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/despliegue.md +0 -0
  46. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/exportacion.md +0 -0
  47. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/feedback.md +0 -0
  48. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/flujos-trabajo.md +0 -0
  49. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/formatos-entrada.md +0 -0
  50. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/github-notes/v0.1.0.md +0 -0
  51. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/github-notes/v0.2.0.md +0 -0
  52. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/github-notes/v0.3.0.md +0 -0
  53. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/integracion-cicd.md +0 -0
  54. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/plugins.md +0 -0
  55. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/seguridad.md +0 -0
  56. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-jira/README.md +0 -0
  57. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-jira/jira-export.json +0 -0
  58. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-markdown/README.md +0 -0
  59. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-markdown/requirements.md +0 -0
  60. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-scratch/README.md +0 -0
  61. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-scratch/idea.txt +0 -0
  62. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/multi-source/README.md +0 -0
  63. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/multi-source/api-decisions.json +0 -0
  64. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/multi-source/notes.txt +0 -0
  65. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/multi-source/user-stories.md +0 -0
  66. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/__main__.py +0 -0
  67. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/__init__.py +0 -0
  68. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/analyzer.py +0 -0
  69. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/complexity.py +0 -0
  70. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/conflicts.py +0 -0
  71. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/dedup.py +0 -0
  72. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/design.py +0 -0
  73. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/extraction.py +0 -0
  74. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/models.py +0 -0
  75. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/prompts.py +0 -0
  76. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/questions.py +0 -0
  77. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/risks.py +0 -0
  78. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/config/__init__.py +0 -0
  79. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/config/defaults.py +0 -0
  80. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/config/loader.py +0 -0
  81. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/config/presets.py +0 -0
  82. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/connectors/__init__.py +0 -0
  83. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/connectors/base.py +0 -0
  84. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/connectors/confluence_api.py +0 -0
  85. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/connectors/github_api.py +0 -0
  86. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/connectors/jira_api.py +0 -0
  87. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/diff/__init__.py +0 -0
  88. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/diff/differ.py +0 -0
  89. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/doctor/__init__.py +0 -0
  90. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/doctor/checks.py +0 -0
  91. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/__init__.py +0 -0
  92. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/_helpers.py +0 -0
  93. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/architect.py +0 -0
  94. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/base.py +0 -0
  95. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/generic.py +0 -0
  96. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/registry.py +0 -0
  97. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/feedback/__init__.py +0 -0
  98. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/feedback/analyzer.py +0 -0
  99. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/feedback/prompts.py +0 -0
  100. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/feedback/spec_updater.py +0 -0
  101. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/feedback/suggestions.py +0 -0
  102. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/generate/__init__.py +0 -0
  103. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/generate/adaptive.py +0 -0
  104. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/generate/lock.py +0 -0
  105. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/generate/spec_builder.py +0 -0
  106. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/__init__.py +0 -0
  107. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/base.py +0 -0
  108. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/confluence.py +0 -0
  109. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/docx.py +0 -0
  110. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/github_issues.py +0 -0
  111. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/image.py +0 -0
  112. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/jira.py +0 -0
  113. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/markdown.py +0 -0
  114. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/pdf.py +0 -0
  115. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/plaintext.py +0 -0
  116. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/registry.py +0 -0
  117. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/slack.py +0 -0
  118. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/url.py +0 -0
  119. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/yaml_input.py +0 -0
  120. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/llm/__init__.py +0 -0
  121. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/llm/adapter.py +0 -0
  122. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/plugins/__init__.py +0 -0
  123. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/plugins/discovery.py +0 -0
  124. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/plugins/hooks.py +0 -0
  125. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/plugins/protocols.py +0 -0
  126. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/acceptance.yaml.j2 +0 -0
  127. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/claude_md.j2 +0 -0
  128. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/claude_task.md.j2 +0 -0
  129. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/context.md.j2 +0 -0
  130. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/copilot_instructions.md.j2 +0 -0
  131. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/cursor_rules.mdc.j2 +0 -0
  132. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/design.md.j2 +0 -0
  133. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/feedback.md.j2 +0 -0
  134. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/kiro_design.md.j2 +0 -0
  135. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/kiro_requirements.md.j2 +0 -0
  136. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/kiro_tasks.md.j2 +0 -0
  137. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/requirements.md.j2 +0 -0
  138. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/sources.md.j2 +0 -0
  139. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/tasks.md.j2 +0 -0
  140. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/verify_sh.j2 +0 -0
  141. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/__init__.py +0 -0
  142. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/cost.py +0 -0
  143. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/file_detect.py +0 -0
  144. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/logging.py +0 -0
  145. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/project_detect.py +0 -0
  146. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/source_uri.py +0 -0
  147. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/task_state.py +0 -0
  148. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/verify/__init__.py +0 -0
  149. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/verify/engine.py +0 -0
  150. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/verify/reporter.py +0 -0
  151. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/__init__.py +0 -0
  152. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/conftest.py +0 -0
  153. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/confluence_api_response.json +0 -0
  154. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/confluence_page.html +0 -0
  155. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/github_issues.json +0 -0
  156. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/jira_api_response.json +0 -0
  157. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/jira_export.json +0 -0
  158. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/jira_export_multi.json +0 -0
  159. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/sample_webpage.html +0 -0
  160. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/simple_spec.md +0 -0
  161. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/slack_export.json +0 -0
  162. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/slack_thread.txt +0 -0
  163. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/structured_reqs.yaml +0 -0
  164. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/verify_report_failed.json +0 -0
  165. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/wireframe.png +0 -0
  166. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/__init__.py +0 -0
  167. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_analyzer.py +0 -0
  168. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_complexity.py +0 -0
  169. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_conflicts.py +0 -0
  170. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_dedup.py +0 -0
  171. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_design.py +0 -0
  172. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_extraction.py +0 -0
  173. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_llm_adapter.py +0 -0
  174. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_risks.py +0 -0
  175. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_config/__init__.py +0 -0
  176. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_config/test_loader.py +0 -0
  177. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_config/test_presets.py +0 -0
  178. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_connectors/__init__.py +0 -0
  179. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_connectors/test_base.py +0 -0
  180. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_connectors/test_confluence_api.py +0 -0
  181. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_connectors/test_github_api.py +0 -0
  182. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_connectors/test_jira_api.py +0 -0
  183. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_diff/__init__.py +0 -0
  184. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_diff/test_differ.py +0 -0
  185. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_doctor/__init__.py +0 -0
  186. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_doctor/test_checks.py +0 -0
  187. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/__init__.py +0 -0
  188. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_architect.py +0 -0
  189. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_claude_code.py +0 -0
  190. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_copilot.py +0 -0
  191. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_cursor.py +0 -0
  192. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_generic.py +0 -0
  193. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_helpers.py +0 -0
  194. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_kiro.py +0 -0
  195. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_protocol_conformance.py +0 -0
  196. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_registry.py +0 -0
  197. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_feedback/__init__.py +0 -0
  198. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_feedback/test_analyzer.py +0 -0
  199. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_feedback/test_spec_updater.py +0 -0
  200. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_feedback/test_suggestions.py +0 -0
  201. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_generate/__init__.py +0 -0
  202. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_generate/test_adaptive.py +0 -0
  203. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_generate/test_lock.py +0 -0
  204. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_generate/test_spec_builder.py +0 -0
  205. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/__init__.py +0 -0
  206. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_confluence.py +0 -0
  207. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_github_issues.py +0 -0
  208. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_hardening.py +0 -0
  209. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_image.py +0 -0
  210. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_jira.py +0 -0
  211. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_markdown.py +0 -0
  212. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_plaintext.py +0 -0
  213. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_registry.py +0 -0
  214. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_slack.py +0 -0
  215. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_url.py +0 -0
  216. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_yaml_input.py +0 -0
  217. {intake_ai_cli-0.3.0/tests/test_plugins → intake_ai_cli-0.4.0/tests/test_mcp}/__init__.py +0 -0
  218. {intake_ai_cli-0.3.0/tests/test_utils → intake_ai_cli-0.4.0/tests/test_plugins}/__init__.py +0 -0
  219. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_plugins/test_discovery.py +0 -0
  220. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_plugins/test_hooks.py +0 -0
  221. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_plugins/test_protocols.py +0 -0
  222. {intake_ai_cli-0.3.0/tests/test_verify → intake_ai_cli-0.4.0/tests/test_utils}/__init__.py +0 -0
  223. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_cost.py +0 -0
  224. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_file_detect.py +0 -0
  225. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_project_detect.py +0 -0
  226. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_source_uri.py +0 -0
  227. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_task_state.py +0 -0
  228. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_verify/test_engine.py +0 -0
  229. {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_verify/test_reporter.py +0 -0
@@ -5,6 +5,75 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.4.0] - 2026-03-05
9
+
10
+ ### Added
11
+
12
+ #### MCP (Model Context Protocol) server
13
+
14
+ - **MCP server module** (`mcp/`): Full MCP server implementation with stdio and SSE transports. Requires `pip install intake-ai-cli[mcp]`.
15
+ - **`create_server()`** (`mcp/server.py`): Creates and configures the MCP server with all tools, resources, and prompts registered. `MCP_SERVER_NAME = "intake-spec"`.
16
+ - **`run_stdio()`** and **`run_sse()`** (`mcp/server.py`): Two transport modes — stdio for CLI agent integration, SSE (HTTP) for browser/IDE integration via starlette + uvicorn.
17
+ - **7 MCP tools** (`mcp/tools.py`):
18
+ - `intake_show`: Show spec summary with truncated file content (MAX_SECTION_LENGTH = 3000).
19
+ - `intake_get_context`: Read `context.md` for a spec.
20
+ - `intake_get_tasks`: List tasks with status filtering (all/pending/in_progress/done/blocked).
21
+ - `intake_update_task`: Update task status with optional note.
22
+ - `intake_verify`: Run acceptance checks with optional tag filtering.
23
+ - `intake_feedback`: Run verification + analyze failures.
24
+ - `intake_list_specs`: List available specs (filters directories without `requirements.md`).
25
+ - **MCP resources** (`mcp/resources.py`): Dynamic spec file resources via `intake://specs/{name}/{section}` URIs. Supports 6 sections: requirements, tasks, context, acceptance, design, sources. `FILE_MAP` maps section names to actual filenames.
26
+ - **MCP prompts** (`mcp/prompts.py`): Two structured prompt templates:
27
+ - `implement_next_task`: Reads spec files and generates implementation instructions referencing MCP tools.
28
+ - `verify_and_fix`: Generates a verify → fix → re-verify loop until all checks pass.
29
+ - **MCPError exception** (`mcp/__init__.py`): Error with `reason` and `suggestion` attributes.
30
+ - **Lazy imports**: `mcp`, `starlette`, `uvicorn` imported lazily with clear `ImportError` messages and installation commands.
31
+
32
+ #### Watch mode (file monitoring + auto-verification)
33
+
34
+ - **Watch module** (`watch/`): File watcher with selective re-verification. Requires `pip install intake-ai-cli[watch]`.
35
+ - **SpecWatcher** (`watch/watcher.py`): Monitors project directory using `watchfiles` (Rust-based, efficient). On file change, re-runs verification checks and displays results.
36
+ - `run_once()`: Single verification without watching.
37
+ - `run()`: Continuous watch loop with debouncing.
38
+ - `_filter_ignored()`: Filters files by ignore patterns (fnmatch per path component).
39
+ - `_matches_any()`: Static method for pattern matching against individual path components.
40
+ - `_extract_changed_files()`: Extracts relative paths from watchfiles change sets.
41
+ - `MAX_CHANGED_FILES_DISPLAY = 5`: Limits terminal output.
42
+ - **WatchError exception** (`watch/__init__.py`): Error with `reason` and `suggestion` attributes.
43
+ - **Debouncing**: Configurable via `WatchConfig.debounce_seconds`, passed to watchfiles native debouncing.
44
+
45
+ #### Configuration
46
+
47
+ - **MCPConfig** (`config/schema.py`): `specs_dir`, `project_dir`, `transport` (stdio/sse), `sse_port`.
48
+ - **WatchConfig** (`config/schema.py`): `debounce_seconds` (default: 2.0), `ignore_patterns` (default: `["*.pyc", "__pycache__", ".git", "node_modules", ".intake"]`).
49
+ - Both added to `IntakeConfig` as `mcp` and `watch` fields.
50
+
51
+ #### CLI commands
52
+
53
+ - **`intake mcp serve`**: Start the MCP server. Options: `--transport` (stdio/sse), `--port`, `--specs-dir`, `--project-dir`.
54
+ - **`intake watch`**: Watch project files and re-run verification. Options: `--project-dir`, `--tags`, `--debounce`, `--verbose`.
55
+
56
+ #### Optional dependencies
57
+
58
+ - `mcp = ["mcp[cli]>=1.0"]`: MCP server support.
59
+ - `watch = ["watchfiles>=1.0"]`: Watch mode support.
60
+ - `all = [connectors + watch + mcp]`: Install everything.
61
+
62
+ #### Test suite
63
+
64
+ - **772 tests** (up from 673), **0 failures**, **10 skipped** (MCP prompts tests when mcp package not installed). 99 new tests added.
65
+ - 5 new test files: `test_mcp/test_tools.py` (31), `test_mcp/test_resources.py` (17), `test_mcp/test_prompts.py` (10), `test_mcp/test_server.py` (10), `test_watch/test_watcher.py` (27).
66
+ - Config tests: 2 new tests for MCPConfig and WatchConfig nested overrides.
67
+ - CLI tests: 4 new tests for MCP and Watch help output.
68
+
69
+ ### Fixed
70
+
71
+ - **`_filter_ignored` path matching** (`watch/watcher.py`): Fixed fnmatch to check individual path components (e.g., `.git` now correctly matches `.git/objects/abc`). Added `_matches_any()` static method.
72
+ - **Silent exception in `_handle_get_tasks`** (`mcp/tools.py`): Added `logger.debug("task_state_manager_fallback", ...)` to bare `except Exception` block.
73
+ - **Missing `run_sse` export** (`mcp/__init__.py`): Added `run_sse` to `__all__` and convenience re-export function.
74
+ - **`__all__` sort order** (`mcp/__init__.py`): Fixed RUF022 by sorting alphabetically.
75
+ - **ruff TC003 in tests**: Added `per-file-ignores` rule for `tests/**/*.py` to allow stdlib imports at runtime in test fixtures.
76
+
8
77
  ## [0.3.0] - 2026-03-04
9
78
 
10
79
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: intake-ai-cli
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: From requirements in any format to verified implementation
5
5
  Project-URL: Homepage, https://diego303.github.io/intake-docs/
6
6
  Project-URL: Repository, https://github.com/Diego303/intake-cli
@@ -28,6 +28,11 @@ Requires-Dist: python-docx>=1.1
28
28
  Requires-Dist: pyyaml>=6.0
29
29
  Requires-Dist: rich>=13.0
30
30
  Requires-Dist: structlog>=24.0
31
+ Provides-Extra: all
32
+ Requires-Dist: atlassian-python-api>=3.40; extra == 'all'
33
+ Requires-Dist: mcp>=1.0; extra == 'all'
34
+ Requires-Dist: pygithub>=2.0; extra == 'all'
35
+ Requires-Dist: watchfiles>=0.21; extra == 'all'
31
36
  Provides-Extra: connectors
32
37
  Requires-Dist: atlassian-python-api>=3.40; extra == 'connectors'
33
38
  Requires-Dist: pygithub>=2.0; extra == 'connectors'
@@ -94,6 +99,12 @@ intake processes requirements through a 5-phase pipeline:
94
99
 
95
100
  ```bash
96
101
  pip install intake-ai-cli
102
+
103
+ # With optional features
104
+ pip install intake-ai-cli[mcp] # MCP server support
105
+ pip install intake-ai-cli[watch] # Watch mode support
106
+ pip install intake-ai-cli[connectors] # Jira, Confluence, GitHub API connectors
107
+ pip install intake-ai-cli[all] # Everything
97
108
  ```
98
109
 
99
110
  Requires Python 3.12+. The CLI command is `intake`.
@@ -137,6 +148,14 @@ intake init "Sprint planning" -s jira://PROJ/sprint/42
137
148
  intake init "Wiki review" -s confluence://SPACE/Page-Title
138
149
  intake init "Bug triage" -s github://org/repo/issues?labels=bug
139
150
 
151
+ # Start MCP server for AI agent integration
152
+ intake mcp serve --transport stdio
153
+ intake mcp serve --transport sse --port 8080
154
+
155
+ # Watch project files and auto-verify on changes
156
+ intake watch ./specs/auth-oauth2 --project-dir . --verbose
157
+ intake watch ./specs/auth-oauth2 --tags test,lint --debounce 3
158
+
140
159
  # Export for specific agents
141
160
  intake init "Payments" -s reqs.pdf --format claude-code
142
161
  intake export ./specs/auth -f cursor -o .
@@ -231,6 +250,8 @@ connectors:
231
250
  | `intake plugins check` | Validate plugin compatibility | **Available** |
232
251
  | `intake task list` | List tasks from a spec with current status | **Available** |
233
252
  | `intake task update` | Update a task's status (pending/in_progress/done/blocked) | **Available** |
253
+ | `intake mcp serve` | Start MCP server (stdio or SSE transport) | **Available** |
254
+ | `intake watch` | Watch project files and re-run verification on changes | **Available** |
234
255
 
235
256
  ---
236
257
 
@@ -270,6 +291,21 @@ connectors:
270
291
  confluence:
271
292
  url: https://your-org.atlassian.net/wiki
272
293
  github: {} # Uses GITHUB_TOKEN env var
294
+
295
+ mcp:
296
+ specs_dir: ./specs # Where specs live
297
+ project_dir: . # Project root for verification
298
+ transport: stdio # stdio | sse
299
+ sse_port: 8080 # Port for SSE transport
300
+
301
+ watch:
302
+ debounce_seconds: 2.0 # Wait before re-running verification
303
+ ignore_patterns: # Files/dirs to ignore
304
+ - "*.pyc"
305
+ - "__pycache__"
306
+ - ".git"
307
+ - "node_modules"
308
+ - ".intake"
273
309
  ```
274
310
 
275
311
  ### Presets
@@ -309,7 +345,7 @@ See the [`examples/`](examples/) directory for ready-to-run scenarios:
309
345
  src/intake/
310
346
  ├── cli.py # Click CLI — thin adapter, no logic
311
347
  ├── config/ # Pydantic v2 models, presets, layered loader
312
- │ ├── schema.py # 9 config models (LLM, Project, Spec, Verification, Export, Security, Connectors, Feedback)
348
+ │ ├── schema.py # 11 config models (LLM, Project, Spec, Verification, Export, Security, Connectors, Feedback, MCP, Watch)
313
349
  │ ├── presets.py # minimal / standard / enterprise presets
314
350
  │ ├── loader.py # Layered merge: defaults → preset → YAML → CLI
315
351
  │ └── defaults.py # Centralized constants
@@ -366,6 +402,15 @@ src/intake/
366
402
  │ └── generic.py # SPEC.md + verify.sh generation
367
403
  ├── diff/ # Spec comparison
368
404
  │ └── differ.py # Compare two specs by requirement/task IDs
405
+ ├── mcp/ # MCP server (Model Context Protocol)
406
+ │ ├── __init__.py # MCPError + re-exports
407
+ │ ├── server.py # Server creation + stdio/SSE transports
408
+ │ ├── tools.py # 7 tools: show, context, tasks, update, verify, feedback, list
409
+ │ ├── resources.py # Dynamic spec file resources (intake://specs/{name}/{section})
410
+ │ └── prompts.py # Prompt templates: implement_next_task, verify_and_fix
411
+ ├── watch/ # Watch mode (file monitoring + auto-verification)
412
+ │ ├── __init__.py # WatchError exception
413
+ │ └── watcher.py # SpecWatcher with watchfiles integration
369
414
  ├── feedback/ # Feedback loop (analyze failures, suggest fixes)
370
415
  │ ├── analyzer.py # LLM-based failure analysis
371
416
  │ ├── prompts.py # Feedback analysis prompt
@@ -448,6 +493,49 @@ intake export ./specs/auth -f copilot -o .
448
493
  # Generates .github/copilot-instructions.md (auto-loaded by Copilot)
449
494
  ```
450
495
 
496
+ ### MCP Server (AI Agent Integration)
497
+
498
+ intake exposes specs via the [Model Context Protocol](https://modelcontextprotocol.io/), allowing AI agents to consume specs in real time:
499
+
500
+ ```bash
501
+ # Start MCP server with stdio transport (for CLI agents like Claude Code)
502
+ intake mcp serve --transport stdio
503
+
504
+ # Start MCP server with SSE transport (for IDE integrations)
505
+ intake mcp serve --transport sse --port 8080
506
+ ```
507
+
508
+ **MCP tools available to agents:**
509
+ - `intake_show` — View spec summary
510
+ - `intake_get_context` — Read project context
511
+ - `intake_get_tasks` — List tasks with status filtering
512
+ - `intake_update_task` — Mark tasks as done/in_progress
513
+ - `intake_verify` — Run acceptance checks
514
+ - `intake_feedback` — Analyze verification failures
515
+ - `intake_list_specs` — List available specs
516
+
517
+ **MCP resources:** Direct access to spec files via `intake://specs/{name}/{section}` URIs.
518
+
519
+ **MCP prompts:** `implement_next_task` and `verify_and_fix` provide structured starting points for agents.
520
+
521
+ Install MCP support: `pip install intake-ai-cli[mcp]`
522
+
523
+ ### Watch Mode
524
+
525
+ Automatically re-run verification checks when project files change:
526
+
527
+ ```bash
528
+ # Watch with default settings
529
+ intake watch ./specs/auth-oauth2 --project-dir .
530
+
531
+ # Watch with tags filter and custom debounce
532
+ intake watch ./specs/auth-oauth2 --tags test,lint --debounce 3 --verbose
533
+ ```
534
+
535
+ Uses `watchfiles` (Rust-based) for efficient file monitoring with configurable debounce and ignore patterns.
536
+
537
+ Install watch support: `pip install intake-ai-cli[watch]`
538
+
451
539
  ### Feedback Loop
452
540
 
453
541
  ```bash
@@ -492,7 +580,7 @@ ruff format src/ tests/
492
580
  mypy src/ --strict
493
581
  ```
494
582
 
495
- Current test suite: **673 tests**, **0 mypy --strict errors**, **0 ruff warnings**.
583
+ Current test suite: **772 tests**, **0 mypy --strict errors**, **0 ruff warnings**.
496
584
 
497
585
  ### Implementation Status
498
586
 
@@ -506,9 +594,11 @@ Current test suite: **673 tests**, **0 mypy --strict errors**, **0 ruff warnings
506
594
  | Plugins | `plugins/` (protocols + discovery + hooks) | Implemented |
507
595
  | Connectors | `connectors/` (Jira, Confluence, GitHub API connectors) | Implemented |
508
596
  | Feedback | `feedback/` (analyzer + suggestions + spec updater) | Implemented |
597
+ | MCP Server | `mcp/` (server + 7 tools + resources + prompts) | Implemented |
598
+ | Watch Mode | `watch/` (SpecWatcher with watchfiles) | Implemented |
509
599
  | Standalone | `doctor/`, `config/`, `llm/`, `utils/` | Implemented |
510
600
  | Standalone | `diff/` (spec differ) | Implemented |
511
- | CLI | 15 commands/subcommands wired end-to-end | Implemented |
601
+ | CLI | 19 commands/subcommands wired end-to-end | Implemented |
512
602
 
513
603
  ---
514
604
 
@@ -46,6 +46,12 @@ intake processes requirements through a 5-phase pipeline:
46
46
 
47
47
  ```bash
48
48
  pip install intake-ai-cli
49
+
50
+ # With optional features
51
+ pip install intake-ai-cli[mcp] # MCP server support
52
+ pip install intake-ai-cli[watch] # Watch mode support
53
+ pip install intake-ai-cli[connectors] # Jira, Confluence, GitHub API connectors
54
+ pip install intake-ai-cli[all] # Everything
49
55
  ```
50
56
 
51
57
  Requires Python 3.12+. The CLI command is `intake`.
@@ -89,6 +95,14 @@ intake init "Sprint planning" -s jira://PROJ/sprint/42
89
95
  intake init "Wiki review" -s confluence://SPACE/Page-Title
90
96
  intake init "Bug triage" -s github://org/repo/issues?labels=bug
91
97
 
98
+ # Start MCP server for AI agent integration
99
+ intake mcp serve --transport stdio
100
+ intake mcp serve --transport sse --port 8080
101
+
102
+ # Watch project files and auto-verify on changes
103
+ intake watch ./specs/auth-oauth2 --project-dir . --verbose
104
+ intake watch ./specs/auth-oauth2 --tags test,lint --debounce 3
105
+
92
106
  # Export for specific agents
93
107
  intake init "Payments" -s reqs.pdf --format claude-code
94
108
  intake export ./specs/auth -f cursor -o .
@@ -183,6 +197,8 @@ connectors:
183
197
  | `intake plugins check` | Validate plugin compatibility | **Available** |
184
198
  | `intake task list` | List tasks from a spec with current status | **Available** |
185
199
  | `intake task update` | Update a task's status (pending/in_progress/done/blocked) | **Available** |
200
+ | `intake mcp serve` | Start MCP server (stdio or SSE transport) | **Available** |
201
+ | `intake watch` | Watch project files and re-run verification on changes | **Available** |
186
202
 
187
203
  ---
188
204
 
@@ -222,6 +238,21 @@ connectors:
222
238
  confluence:
223
239
  url: https://your-org.atlassian.net/wiki
224
240
  github: {} # Uses GITHUB_TOKEN env var
241
+
242
+ mcp:
243
+ specs_dir: ./specs # Where specs live
244
+ project_dir: . # Project root for verification
245
+ transport: stdio # stdio | sse
246
+ sse_port: 8080 # Port for SSE transport
247
+
248
+ watch:
249
+ debounce_seconds: 2.0 # Wait before re-running verification
250
+ ignore_patterns: # Files/dirs to ignore
251
+ - "*.pyc"
252
+ - "__pycache__"
253
+ - ".git"
254
+ - "node_modules"
255
+ - ".intake"
225
256
  ```
226
257
 
227
258
  ### Presets
@@ -261,7 +292,7 @@ See the [`examples/`](examples/) directory for ready-to-run scenarios:
261
292
  src/intake/
262
293
  ├── cli.py # Click CLI — thin adapter, no logic
263
294
  ├── config/ # Pydantic v2 models, presets, layered loader
264
- │ ├── schema.py # 9 config models (LLM, Project, Spec, Verification, Export, Security, Connectors, Feedback)
295
+ │ ├── schema.py # 11 config models (LLM, Project, Spec, Verification, Export, Security, Connectors, Feedback, MCP, Watch)
265
296
  │ ├── presets.py # minimal / standard / enterprise presets
266
297
  │ ├── loader.py # Layered merge: defaults → preset → YAML → CLI
267
298
  │ └── defaults.py # Centralized constants
@@ -318,6 +349,15 @@ src/intake/
318
349
  │ └── generic.py # SPEC.md + verify.sh generation
319
350
  ├── diff/ # Spec comparison
320
351
  │ └── differ.py # Compare two specs by requirement/task IDs
352
+ ├── mcp/ # MCP server (Model Context Protocol)
353
+ │ ├── __init__.py # MCPError + re-exports
354
+ │ ├── server.py # Server creation + stdio/SSE transports
355
+ │ ├── tools.py # 7 tools: show, context, tasks, update, verify, feedback, list
356
+ │ ├── resources.py # Dynamic spec file resources (intake://specs/{name}/{section})
357
+ │ └── prompts.py # Prompt templates: implement_next_task, verify_and_fix
358
+ ├── watch/ # Watch mode (file monitoring + auto-verification)
359
+ │ ├── __init__.py # WatchError exception
360
+ │ └── watcher.py # SpecWatcher with watchfiles integration
321
361
  ├── feedback/ # Feedback loop (analyze failures, suggest fixes)
322
362
  │ ├── analyzer.py # LLM-based failure analysis
323
363
  │ ├── prompts.py # Feedback analysis prompt
@@ -400,6 +440,49 @@ intake export ./specs/auth -f copilot -o .
400
440
  # Generates .github/copilot-instructions.md (auto-loaded by Copilot)
401
441
  ```
402
442
 
443
+ ### MCP Server (AI Agent Integration)
444
+
445
+ intake exposes specs via the [Model Context Protocol](https://modelcontextprotocol.io/), allowing AI agents to consume specs in real time:
446
+
447
+ ```bash
448
+ # Start MCP server with stdio transport (for CLI agents like Claude Code)
449
+ intake mcp serve --transport stdio
450
+
451
+ # Start MCP server with SSE transport (for IDE integrations)
452
+ intake mcp serve --transport sse --port 8080
453
+ ```
454
+
455
+ **MCP tools available to agents:**
456
+ - `intake_show` — View spec summary
457
+ - `intake_get_context` — Read project context
458
+ - `intake_get_tasks` — List tasks with status filtering
459
+ - `intake_update_task` — Mark tasks as done/in_progress
460
+ - `intake_verify` — Run acceptance checks
461
+ - `intake_feedback` — Analyze verification failures
462
+ - `intake_list_specs` — List available specs
463
+
464
+ **MCP resources:** Direct access to spec files via `intake://specs/{name}/{section}` URIs.
465
+
466
+ **MCP prompts:** `implement_next_task` and `verify_and_fix` provide structured starting points for agents.
467
+
468
+ Install MCP support: `pip install intake-ai-cli[mcp]`
469
+
470
+ ### Watch Mode
471
+
472
+ Automatically re-run verification checks when project files change:
473
+
474
+ ```bash
475
+ # Watch with default settings
476
+ intake watch ./specs/auth-oauth2 --project-dir .
477
+
478
+ # Watch with tags filter and custom debounce
479
+ intake watch ./specs/auth-oauth2 --tags test,lint --debounce 3 --verbose
480
+ ```
481
+
482
+ Uses `watchfiles` (Rust-based) for efficient file monitoring with configurable debounce and ignore patterns.
483
+
484
+ Install watch support: `pip install intake-ai-cli[watch]`
485
+
403
486
  ### Feedback Loop
404
487
 
405
488
  ```bash
@@ -444,7 +527,7 @@ ruff format src/ tests/
444
527
  mypy src/ --strict
445
528
  ```
446
529
 
447
- Current test suite: **673 tests**, **0 mypy --strict errors**, **0 ruff warnings**.
530
+ Current test suite: **772 tests**, **0 mypy --strict errors**, **0 ruff warnings**.
448
531
 
449
532
  ### Implementation Status
450
533
 
@@ -458,9 +541,11 @@ Current test suite: **673 tests**, **0 mypy --strict errors**, **0 ruff warnings
458
541
  | Plugins | `plugins/` (protocols + discovery + hooks) | Implemented |
459
542
  | Connectors | `connectors/` (Jira, Confluence, GitHub API connectors) | Implemented |
460
543
  | Feedback | `feedback/` (analyzer + suggestions + spec updater) | Implemented |
544
+ | MCP Server | `mcp/` (server + 7 tools + resources + prompts) | Implemented |
545
+ | Watch Mode | `watch/` (SpecWatcher with watchfiles) | Implemented |
461
546
  | Standalone | `doctor/`, `config/`, `llm/`, `utils/` | Implemented |
462
547
  | Standalone | `diff/` (spec differ) | Implemented |
463
- | CLI | 15 commands/subcommands wired end-to-end | Implemented |
548
+ | CLI | 19 commands/subcommands wired end-to-end | Implemented |
464
549
 
465
550
  ---
466
551
 
@@ -1,7 +1,7 @@
1
1
  # intake — Seguimiento de Implementación
2
2
 
3
3
  > Tracking detallado del progreso de implementación.
4
- > Actualizado: 2026-03-04 (v0.3.0 — Connectors + Exporters + Feedback + Enterprise Docs)
4
+ > Actualizado: 2026-03-05 (v0.4.0 — MCP Server + Watch Mode)
5
5
 
6
6
  ---
7
7
 
@@ -18,6 +18,8 @@
18
18
  | **v0.2.0** | Phase 2: Connectors + Exporters + Feedback | **Completada** | 673/673 |
19
19
  | **v0.3.0** | Enterprise Docs + SECURITY.md + Version Bump | **Completada** | 673/673 |
20
20
  | **v0.3.0** | QA Audit Phase 2 | **Aprobada** | 673/673 (86% cov, 0 mypy, 0 ruff) |
21
+ | **v0.4.0** | Phase 3: MCP Server + Watch Mode | **Completada** | 772/772 |
22
+ | **v0.4.0** | QA Audit Phase 3 | **Aprobada** | 772/772 (83% cov, 0 ruff) |
21
23
 
22
24
  ---
23
25
 
@@ -967,3 +969,204 @@
967
969
  26. **Feedback usa LLM**: Excepción documentada a la regla de que solo `analyze/` habla con el LLM. El módulo `feedback/` analiza fallos de verificación, no requirements. Usa `FEEDBACK_ANALYSIS_PROMPT` con `{language}` placeholder.
968
970
 
969
971
  27. **Jinja2 templates para todos los exporters**: Incluso los simples (Copilot). Mantiene consistencia y permite personalización sin tocar código Python.
972
+
973
+ ---
974
+
975
+ ## Phase 3 — MCP Server + Watch Mode (v0.4.0) ✅
976
+
977
+ > Implementada: 2026-03-05
978
+ > Objetivo: Servidor MCP (Model Context Protocol) para que agentes IA consuman specs en tiempo real + modo watch para re-verificación automática ante cambios en el proyecto.
979
+
980
+ ### Step 1: Config Schema (MCPConfig + WatchConfig) ✅
981
+
982
+ | Componente | Archivo | Estado | Notas |
983
+ |------------|---------|--------|-------|
984
+ | MCPConfig | `src/intake/config/schema.py` | ✅ | specs_dir, project_dir, transport (stdio/sse), sse_port |
985
+ | WatchConfig | `src/intake/config/schema.py` | ✅ | debounce_seconds, ignore_patterns (*.pyc, __pycache__, .git, node_modules, .intake) |
986
+ | IntakeConfig.mcp | `src/intake/config/schema.py` | ✅ | Campo MCPConfig añadido |
987
+ | IntakeConfig.watch | `src/intake/config/schema.py` | ✅ | Campo WatchConfig añadido |
988
+ | Tests | `tests/test_config/test_schema.py` | ✅ | test_mcp_nested_override, test_watch_nested_override |
989
+
990
+ ### Step 2: MCP Server Core ✅
991
+
992
+ | Componente | Archivo | Estado | Notas |
993
+ |------------|---------|--------|-------|
994
+ | MCPError | `src/intake/mcp/__init__.py` | ✅ | Exception con reason + suggestion |
995
+ | MCP_SERVER_NAME | `src/intake/mcp/server.py` | ✅ | "intake-spec" |
996
+ | create_server() | `src/intake/mcp/server.py` | ✅ | Crea Server MCP, registra tools + resources + prompts |
997
+ | run_stdio() | `src/intake/mcp/server.py` | ✅ | Transporte stdio para integración con agentes CLI |
998
+ | run_sse() | `src/intake/mcp/server.py` | ✅ | Transporte SSE (HTTP) con starlette + uvicorn |
999
+ | __init__.py exports | `src/intake/mcp/__init__.py` | ✅ | MCPError, create_server, run_stdio, run_sse |
1000
+ | Lazy imports | — | ✅ | mcp, starlette, uvicorn importados lazily con ImportError claro |
1001
+
1002
+ ### Step 3: MCP Tools (7 herramientas) ✅
1003
+
1004
+ | Componente | Archivo | Estado | Notas |
1005
+ |------------|---------|--------|-------|
1006
+ | register_tools() | `src/intake/mcp/tools.py` | ✅ | Registra 7 tools en el servidor MCP |
1007
+ | intake_show | `src/intake/mcp/tools.py` | ✅ | Muestra resumen del spec (archivos + contenido truncado) |
1008
+ | intake_get_context | `src/intake/mcp/tools.py` | ✅ | Lee context.md del spec |
1009
+ | intake_get_tasks | `src/intake/mcp/tools.py` | ✅ | Lista tasks con filtro por status (all/pending/in_progress/done/blocked) |
1010
+ | intake_update_task | `src/intake/mcp/tools.py` | ✅ | Actualiza status de una task con nota opcional |
1011
+ | intake_verify | `src/intake/mcp/tools.py` | ✅ | Ejecuta acceptance checks con filtro por tags |
1012
+ | intake_feedback | `src/intake/mcp/tools.py` | ✅ | Verifica + genera feedback sobre fallos |
1013
+ | intake_list_specs | `src/intake/mcp/tools.py` | ✅ | Lista specs disponibles (filtra dirs sin requirements.md) |
1014
+ | SPEC_FILES | `src/intake/mcp/tools.py` | ✅ | Tuple: requirements.md, tasks.md, context.md, design.md |
1015
+ | MAX_SECTION_LENGTH | `src/intake/mcp/tools.py` | ✅ | 3000 chars por sección |
1016
+
1017
+ ### Step 4: MCP Resources ✅
1018
+
1019
+ | Componente | Archivo | Estado | Notas |
1020
+ |------------|---------|--------|-------|
1021
+ | register_resources() | `src/intake/mcp/resources.py` | ✅ | Registra recursos dinámicos en el servidor |
1022
+ | FILE_MAP | `src/intake/mcp/resources.py` | ✅ | 6 secciones → archivos: requirements, tasks, context, acceptance, design, sources |
1023
+ | RESOURCE_URI_PREFIX | `src/intake/mcp/resources.py` | ✅ | "intake://specs/" |
1024
+ | URI format | — | ✅ | `intake://specs/{name}/{section}` |
1025
+
1026
+ ### Step 5: MCP Prompts ✅
1027
+
1028
+ | Componente | Archivo | Estado | Notas |
1029
+ |------------|---------|--------|-------|
1030
+ | register_prompts() | `src/intake/mcp/prompts.py` | ✅ | Registra 2 prompt templates |
1031
+ | implement_next_task | `src/intake/mcp/prompts.py` | ✅ | Contexto spec + siguiente task pendiente + instrucciones de verificación |
1032
+ | verify_and_fix | `src/intake/mcp/prompts.py` | ✅ | Loop: verificar → arreglar → re-verificar hasta pasar |
1033
+ | _build_implement_prompt() | `src/intake/mcp/prompts.py` | ✅ | Lee spec files, genera PromptMessage |
1034
+ | _build_verify_prompt() | `src/intake/mcp/prompts.py` | ✅ | Instrucciones de fix loop |
1035
+
1036
+ ### Step 6: Watch Module ✅
1037
+
1038
+ | Componente | Archivo | Estado | Notas |
1039
+ |------------|---------|--------|-------|
1040
+ | WatchError | `src/intake/watch/__init__.py` | ✅ | Exception con reason + suggestion |
1041
+ | SpecWatcher | `src/intake/watch/watcher.py` | ✅ | Monitorea archivos del proyecto, re-ejecuta verificación |
1042
+ | run_once() | `src/intake/watch/watcher.py` | ✅ | Verificación única sin watching |
1043
+ | run() | `src/intake/watch/watcher.py` | ✅ | Loop continuo con watchfiles |
1044
+ | _run_and_display() | `src/intake/watch/watcher.py` | ✅ | Formato Rich para terminal |
1045
+ | _filter_ignored() | `src/intake/watch/watcher.py` | ✅ | Filtra archivos por patterns (*.pyc, .git, etc.) |
1046
+ | _matches_any() | `src/intake/watch/watcher.py` | ✅ | Match por componente de path (fnmatch) |
1047
+ | _extract_changed_files() | `src/intake/watch/watcher.py` | ✅ | Extrae rutas relativas de cambios |
1048
+ | MAX_CHANGED_FILES_DISPLAY | `src/intake/watch/watcher.py` | ✅ | 5 archivos máx en terminal |
1049
+ | Debouncing | — | ✅ | Configurable via WatchConfig.debounce_seconds |
1050
+ | Lazy watchfiles import | — | ✅ | ImportError claro si no está instalado |
1051
+
1052
+ ### Step 7: CLI Commands (MCP + Watch) ✅
1053
+
1054
+ | Componente | Archivo | Estado | Notas |
1055
+ |------------|---------|--------|-------|
1056
+ | `intake mcp` group | `src/intake/cli.py` | ✅ | Grupo de comandos MCP |
1057
+ | `intake mcp serve` | `src/intake/cli.py` | ✅ | --transport (stdio/sse), --port, --specs-dir, --project-dir |
1058
+ | `intake watch` | `src/intake/cli.py` | ✅ | --project-dir, --tags, --debounce, --verbose |
1059
+ | Tests MCP CLI | `tests/test_cli.py` | ✅ | test_mcp_serve_help_shows_transports, test_mcp_serve_help_shows_examples |
1060
+ | Tests Watch CLI | `tests/test_cli.py` | ✅ | test_watch_help_shows_verbose, test_watch_help_shows_examples |
1061
+
1062
+ ### Step 8: pyproject.toml Updates ✅
1063
+
1064
+ | Componente | Estado | Notas |
1065
+ |------------|--------|-------|
1066
+ | Version bump | ✅ | 0.3.0 → 0.4.0 |
1067
+ | Optional deps: mcp | ✅ | `mcp = ["mcp[cli]>=1.0"]` |
1068
+ | Optional deps: watch | ✅ | `watch = ["watchfiles>=1.0"]` |
1069
+ | Optional deps: all | ✅ | Combina connectors + watch + mcp |
1070
+ | Per-file-ignores | ✅ | TC003 ignorado en `tests/**/*.py` (stdlib imports at runtime) |
1071
+
1072
+ ### Resumen de Archivos Phase 3
1073
+
1074
+ **Archivos nuevos (10):**
1075
+
1076
+ | # | Archivo | Propósito |
1077
+ |---|--------|-----------|
1078
+ | 1 | `src/intake/mcp/__init__.py` | MCPError + re-exports (create_server, run_stdio, run_sse) |
1079
+ | 2 | `src/intake/mcp/server.py` | Server creation + stdio/SSE transports |
1080
+ | 3 | `src/intake/mcp/tools.py` | 7 MCP tools (show, context, tasks, update, verify, feedback, list) |
1081
+ | 4 | `src/intake/mcp/resources.py` | Dynamic spec file resources (6 sections) |
1082
+ | 5 | `src/intake/mcp/prompts.py` | 2 prompt templates (implement, verify_and_fix) |
1083
+ | 6 | `src/intake/watch/__init__.py` | WatchError exception |
1084
+ | 7 | `src/intake/watch/watcher.py` | SpecWatcher with watchfiles integration |
1085
+ | 8 | `tests/test_mcp/test_tools.py` | 31 tests para MCP tools |
1086
+ | 9 | `tests/test_mcp/test_resources.py` | 17 tests para MCP resources |
1087
+ | 10 | `tests/test_mcp/test_prompts.py` | 10 tests para MCP prompts (skip si mcp no instalado) |
1088
+ | 11 | `tests/test_mcp/test_server.py` | 10 tests para server constants + MCPError |
1089
+ | 12 | `tests/test_watch/test_watcher.py` | 27 tests para SpecWatcher |
1090
+
1091
+ **Archivos modificados (4):**
1092
+
1093
+ | Archivo | Cambios |
1094
+ |---------|---------|
1095
+ | `src/intake/config/schema.py` | MCPConfig, WatchConfig, IntakeConfig.mcp, IntakeConfig.watch |
1096
+ | `src/intake/cli.py` | `intake mcp serve` command, `intake watch` command |
1097
+ | `pyproject.toml` | Version 0.4.0, optional deps mcp/watch/all, per-file-ignores |
1098
+ | `tests/test_cli.py` | 4 tests nuevos (MCP + Watch help) |
1099
+
1100
+ ### Tests Phase 3 ✅
1101
+
1102
+ **99 tests nuevos, 772 total, 0 failures, 10 skipped**
1103
+
1104
+ | Test file | Tests | Estado |
1105
+ |-----------|-------|--------|
1106
+ | `tests/test_mcp/test_tools.py` | 31 | ✅ |
1107
+ | `tests/test_mcp/test_resources.py` | 17 | ✅ |
1108
+ | `tests/test_mcp/test_prompts.py` | 10 | ✅ (skip si mcp no instalado) |
1109
+ | `tests/test_mcp/test_server.py` | 10 | ✅ |
1110
+ | `tests/test_watch/test_watcher.py` | 27 | ✅ |
1111
+ | `tests/test_config/test_schema.py` | +2 | ✅ (MCPConfig, WatchConfig) |
1112
+ | `tests/test_cli.py` | +4 | ✅ (MCP serve, Watch help) |
1113
+
1114
+ ### Quality Gates Phase 3 ✅
1115
+
1116
+ | Gate | Estado | Resultado |
1117
+ |------|--------|-----------|
1118
+ | `python3.12 -m pytest tests/` | ✅ | 772 passed, 10 skipped in 33s |
1119
+ | `ruff check src/ tests/` | ✅ | All checks passed! |
1120
+ | `ruff format src/ tests/` | ✅ | 0 issues |
1121
+ | Coverage global | ✅ | 83% (target: 65%) |
1122
+ | MCP tools coverage | ✅ | 66% (handler functions bien cubiertas, registration code requiere mcp package) |
1123
+ | Watch coverage | ✅ | 55% (run_once cubierto, run() requiere watchfiles) |
1124
+
1125
+ ### Distribución de Tests (772 total)
1126
+
1127
+ | Área | Tests |
1128
+ |------|-------|
1129
+ | CLI | 50 |
1130
+ | Config | 37 |
1131
+ | Ingest (parsers + registry) | 136 |
1132
+ | Analyze | 62 |
1133
+ | Generate | 37 |
1134
+ | Export | 112 |
1135
+ | Verify | 26 |
1136
+ | Diff | 12 |
1137
+ | Doctor | 25 |
1138
+ | Plugins | 34 |
1139
+ | Connectors | 30 |
1140
+ | Utils | 63 |
1141
+ | **MCP** | **66** |
1142
+ | **Watch** | **27** |
1143
+ | Feedback | 26 |
1144
+
1145
+ ### Decisiones Técnicas Phase 3
1146
+
1147
+ 28. **Lazy imports para deps opcionales**: `mcp`, `watchfiles`, `starlette`, `uvicorn` se importan lazily dentro de funciones. ImportError con mensaje claro y comando de instalación.
1148
+
1149
+ 29. **Handler functions separadas de registration**: Las funciones `_handle_show()`, `_handle_verify()`, etc. son funciones puras testables sin el package `mcp`. El código de registro (`@server.call_tool()`) requiere `mcp` pero los handlers no.
1150
+
1151
+ 30. **fnmatch por componente de path**: `_matches_any()` verifica cada componente del path (e.g., `.git` en `.git/objects/abc`) además del path completo y el nombre de archivo. Resuelve el bug donde `.git` como patrón no matcheaba `.git/objects/abc`.
1152
+
1153
+ 31. **MCP resources dinámicos**: Los recursos se registran como templates con `intake://specs/{name}/{section}`. El `list_resources()` escanea specs disponibles y genera la lista completa.
1154
+
1155
+ 32. **MCP prompts con spec context**: `implement_next_task` lee los 4 spec files (requirements, tasks, context, design) y genera un mensaje con instrucciones de implementación + referencia a herramientas MCP. `verify_and_fix` genera un loop de verificación-corrección.
1156
+
1157
+ 33. **Watch debouncing via watchfiles**: `watchfiles.watch()` proporciona debouncing nativo basado en Rust. El `debounce_seconds` de WatchConfig se pasa directamente. Más eficiente que polling manual.
1158
+
1159
+ 34. **Coverage MCP inherentemente baja**: Los decoradores `@server.call_tool()`, `@server.list_resources()`, etc. requieren el package `mcp` que no está en deps de desarrollo. Los handlers tienen buena cobertura (66%). No es regresión.
1160
+
1161
+ ### Phase Sign-off
1162
+
1163
+ - [x] All tests pass (772/772, 10 skipped)
1164
+ - [x] Coverage targets met (83% overall)
1165
+ - [x] ruff check: zero warnings
1166
+ - [x] ruff format: zero issues
1167
+ - [x] No regression in v0.3.0 tests
1168
+ - [x] All Phase 3 features covered by tests
1169
+ - [x] CLI commands functional (mcp serve --help, watch --help)
1170
+ - [x] No security issues found
1171
+ - [x] Lazy imports for optional dependencies
1172
+ - [x] Version bumped to 0.4.0
@@ -47,7 +47,7 @@ pip install -e ".[dev]"
47
47
  | Documento | Descripcion |
48
48
  |-----------|-------------|
49
49
  | [Arquitectura](arquitectura.md) | Arquitectura del sistema, modulos, flujo de datos y decisiones de diseno |
50
- | [Guia CLI](guia-cli.md) | Referencia completa de los 15 comandos/subcomandos con todas sus opciones |
50
+ | [Guia CLI](guia-cli.md) | Referencia completa de los 19 comandos/subcomandos con todas sus opciones |
51
51
  | [Configuracion](configuracion.md) | Todas las opciones de `.intake.yaml`, presets y variables de entorno |
52
52
 
53
53
  **Pipeline:**
@@ -61,6 +61,8 @@ pip install -e ".[dev]"
61
61
  | [Verificacion](verificacion.md) | Motor de checks de aceptacion, reporters y CI/CD |
62
62
  | [Exportacion](exportacion.md) | 6 formatos de exportacion para agentes IA |
63
63
  | [Feedback](feedback.md) | Feedback loop: analisis de fallos y enmiendas a la spec |
64
+ | [MCP Server](mcp-server.md) | Servidor MCP para agentes IA: tools, resources, prompts y transportes |
65
+ | [Watch Mode](watch-mode.md) | Modo watch: monitoreo de archivos y re-verificacion automatica |
64
66
 
65
67
  **Operaciones y enterprise:**
66
68
 
@@ -119,6 +121,12 @@ intake plugins list
119
121
  # 11. Seguimiento de tareas
120
122
  intake task list specs/pasarela-de-pagos/
121
123
  intake task update specs/pasarela-de-pagos/ 1 done --note "Implementado"
124
+
125
+ # 12. Servidor MCP para agentes IA
126
+ intake mcp serve --transport stdio
127
+
128
+ # 13. Watch mode: re-verificar al cambiar archivos
129
+ intake watch specs/pasarela-de-pagos/ --project-dir . --verbose
122
130
  ```
123
131
 
124
132
  ---