intake-ai-cli 0.3.0__tar.gz → 0.5.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 (238) hide show
  1. intake_ai_cli-0.5.0/.intake.yaml.example +145 -0
  2. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/CHANGELOG.md +111 -0
  3. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/PKG-INFO +180 -6
  4. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/README.md +174 -5
  5. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/SEGUIMIENTO-V0.md +379 -1
  6. intake_ai_cli-0.5.0/action/action.yml +123 -0
  7. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/README.md +19 -1
  8. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/arquitectura.md +19 -1
  9. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/buenas-practicas.md +41 -0
  10. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/configuracion.md +41 -0
  11. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/despliegue.md +1 -1
  12. intake_ai_cli-0.5.0/docs/github-notes/v0.4.0.md +278 -0
  13. intake_ai_cli-0.5.0/docs/github-notes/v0.5.0.md +223 -0
  14. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/guia-cli.md +125 -2
  15. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/integracion-cicd.md +69 -1
  16. intake_ai_cli-0.5.0/docs/mcp-server.md +447 -0
  17. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/pipeline.md +59 -0
  18. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/solucion-problemas.md +107 -0
  19. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/verificacion.md +65 -1
  20. intake_ai_cli-0.5.0/docs/watch-mode.md +316 -0
  21. intake_ai_cli-0.5.0/examples/feedback-loop/README.md +103 -0
  22. intake_ai_cli-0.5.0/examples/from-jira-api/README.md +87 -0
  23. intake_ai_cli-0.5.0/examples/mcp-session/README.md +116 -0
  24. intake_ai_cli-0.5.0/examples/plugin-custom-parser/README.md +242 -0
  25. intake_ai_cli-0.5.0/examples/quick-mode/README.md +90 -0
  26. intake_ai_cli-0.5.0/examples/workflows-github/ci.yml +108 -0
  27. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/pyproject.toml +25 -1
  28. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/__init__.py +1 -1
  29. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/cli.py +170 -2
  30. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/config/schema.py +36 -0
  31. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/connectors/confluence_api.py +20 -14
  32. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/connectors/github_api.py +14 -8
  33. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/connectors/jira_api.py +14 -8
  34. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/export/claude_code.py +1 -1
  35. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/export/copilot.py +1 -1
  36. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/export/cursor.py +1 -1
  37. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/export/kiro.py +1 -1
  38. intake_ai_cli-0.5.0/src/intake/mcp/__init__.py +68 -0
  39. intake_ai_cli-0.5.0/src/intake/mcp/prompts.py +167 -0
  40. intake_ai_cli-0.5.0/src/intake/mcp/resources.py +108 -0
  41. intake_ai_cli-0.5.0/src/intake/mcp/server.py +156 -0
  42. intake_ai_cli-0.5.0/src/intake/mcp/tools.py +427 -0
  43. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/verify/engine.py +2 -1
  44. intake_ai_cli-0.5.0/src/intake/watch/__init__.py +25 -0
  45. intake_ai_cli-0.5.0/src/intake/watch/watcher.py +237 -0
  46. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_cli.py +62 -1
  47. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_config/test_schema.py +52 -0
  48. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_connectors/test_confluence_api.py +17 -0
  49. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_connectors/test_github_api.py +19 -0
  50. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_connectors/test_jira_api.py +19 -0
  51. intake_ai_cli-0.5.0/tests/test_mcp/test_prompts.py +99 -0
  52. intake_ai_cli-0.5.0/tests/test_mcp/test_resources.py +143 -0
  53. intake_ai_cli-0.5.0/tests/test_mcp/test_server.py +91 -0
  54. intake_ai_cli-0.5.0/tests/test_mcp/test_tools.py +338 -0
  55. intake_ai_cli-0.5.0/tests/test_verify/__init__.py +0 -0
  56. intake_ai_cli-0.5.0/tests/test_watch/__init__.py +0 -0
  57. intake_ai_cli-0.5.0/tests/test_watch/test_watcher.py +505 -0
  58. intake_ai_cli-0.3.0/.intake.yaml.example +0 -55
  59. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/.gitignore +0 -0
  60. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/LICENSE +0 -0
  61. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/SECURITY.md +0 -0
  62. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/conectores.md +0 -0
  63. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/exportacion.md +0 -0
  64. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/feedback.md +0 -0
  65. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/flujos-trabajo.md +0 -0
  66. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/formatos-entrada.md +0 -0
  67. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/github-notes/v0.1.0.md +0 -0
  68. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/github-notes/v0.2.0.md +0 -0
  69. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/github-notes/v0.3.0.md +0 -0
  70. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/plugins.md +0 -0
  71. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/docs/seguridad.md +0 -0
  72. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/examples/from-jira/README.md +0 -0
  73. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/examples/from-jira/jira-export.json +0 -0
  74. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/examples/from-markdown/README.md +0 -0
  75. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/examples/from-markdown/requirements.md +0 -0
  76. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/examples/from-scratch/README.md +0 -0
  77. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/examples/from-scratch/idea.txt +0 -0
  78. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/examples/multi-source/README.md +0 -0
  79. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/examples/multi-source/api-decisions.json +0 -0
  80. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/examples/multi-source/notes.txt +0 -0
  81. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/examples/multi-source/user-stories.md +0 -0
  82. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/__main__.py +0 -0
  83. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/__init__.py +0 -0
  84. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/analyzer.py +0 -0
  85. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/complexity.py +0 -0
  86. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/conflicts.py +0 -0
  87. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/dedup.py +0 -0
  88. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/design.py +0 -0
  89. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/extraction.py +0 -0
  90. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/models.py +0 -0
  91. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/prompts.py +0 -0
  92. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/questions.py +0 -0
  93. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/analyze/risks.py +0 -0
  94. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/config/__init__.py +0 -0
  95. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/config/defaults.py +0 -0
  96. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/config/loader.py +0 -0
  97. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/config/presets.py +0 -0
  98. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/connectors/__init__.py +0 -0
  99. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/connectors/base.py +0 -0
  100. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/diff/__init__.py +0 -0
  101. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/diff/differ.py +0 -0
  102. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/doctor/__init__.py +0 -0
  103. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/doctor/checks.py +0 -0
  104. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/export/__init__.py +0 -0
  105. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/export/_helpers.py +0 -0
  106. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/export/architect.py +0 -0
  107. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/export/base.py +0 -0
  108. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/export/generic.py +0 -0
  109. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/export/registry.py +0 -0
  110. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/feedback/__init__.py +0 -0
  111. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/feedback/analyzer.py +0 -0
  112. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/feedback/prompts.py +0 -0
  113. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/feedback/spec_updater.py +0 -0
  114. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/feedback/suggestions.py +0 -0
  115. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/generate/__init__.py +0 -0
  116. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/generate/adaptive.py +0 -0
  117. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/generate/lock.py +0 -0
  118. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/generate/spec_builder.py +0 -0
  119. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/__init__.py +0 -0
  120. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/base.py +0 -0
  121. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/confluence.py +0 -0
  122. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/docx.py +0 -0
  123. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/github_issues.py +0 -0
  124. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/image.py +0 -0
  125. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/jira.py +0 -0
  126. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/markdown.py +0 -0
  127. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/pdf.py +0 -0
  128. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/plaintext.py +0 -0
  129. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/registry.py +0 -0
  130. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/slack.py +0 -0
  131. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/url.py +0 -0
  132. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/ingest/yaml_input.py +0 -0
  133. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/llm/__init__.py +0 -0
  134. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/llm/adapter.py +0 -0
  135. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/plugins/__init__.py +0 -0
  136. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/plugins/discovery.py +0 -0
  137. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/plugins/hooks.py +0 -0
  138. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/plugins/protocols.py +0 -0
  139. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/acceptance.yaml.j2 +0 -0
  140. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/claude_md.j2 +0 -0
  141. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/claude_task.md.j2 +0 -0
  142. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/context.md.j2 +0 -0
  143. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/copilot_instructions.md.j2 +0 -0
  144. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/cursor_rules.mdc.j2 +0 -0
  145. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/design.md.j2 +0 -0
  146. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/feedback.md.j2 +0 -0
  147. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/kiro_design.md.j2 +0 -0
  148. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/kiro_requirements.md.j2 +0 -0
  149. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/kiro_tasks.md.j2 +0 -0
  150. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/requirements.md.j2 +0 -0
  151. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/sources.md.j2 +0 -0
  152. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/tasks.md.j2 +0 -0
  153. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/templates/verify_sh.j2 +0 -0
  154. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/utils/__init__.py +0 -0
  155. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/utils/cost.py +0 -0
  156. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/utils/file_detect.py +0 -0
  157. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/utils/logging.py +0 -0
  158. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/utils/project_detect.py +0 -0
  159. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/utils/source_uri.py +0 -0
  160. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/utils/task_state.py +0 -0
  161. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/verify/__init__.py +0 -0
  162. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/src/intake/verify/reporter.py +0 -0
  163. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/__init__.py +0 -0
  164. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/conftest.py +0 -0
  165. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/confluence_api_response.json +0 -0
  166. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/confluence_page.html +0 -0
  167. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/github_issues.json +0 -0
  168. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/jira_api_response.json +0 -0
  169. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/jira_export.json +0 -0
  170. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/jira_export_multi.json +0 -0
  171. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/sample_webpage.html +0 -0
  172. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/simple_spec.md +0 -0
  173. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/slack_export.json +0 -0
  174. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/slack_thread.txt +0 -0
  175. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/structured_reqs.yaml +0 -0
  176. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/verify_report_failed.json +0 -0
  177. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/fixtures/wireframe.png +0 -0
  178. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_analyze/__init__.py +0 -0
  179. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_analyze/test_analyzer.py +0 -0
  180. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_analyze/test_complexity.py +0 -0
  181. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_analyze/test_conflicts.py +0 -0
  182. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_analyze/test_dedup.py +0 -0
  183. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_analyze/test_design.py +0 -0
  184. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_analyze/test_extraction.py +0 -0
  185. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_analyze/test_llm_adapter.py +0 -0
  186. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_analyze/test_risks.py +0 -0
  187. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_config/__init__.py +0 -0
  188. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_config/test_loader.py +0 -0
  189. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_config/test_presets.py +0 -0
  190. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_connectors/__init__.py +0 -0
  191. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_connectors/test_base.py +0 -0
  192. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_diff/__init__.py +0 -0
  193. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_diff/test_differ.py +0 -0
  194. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_doctor/__init__.py +0 -0
  195. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_doctor/test_checks.py +0 -0
  196. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_export/__init__.py +0 -0
  197. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_export/test_architect.py +0 -0
  198. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_export/test_claude_code.py +0 -0
  199. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_export/test_copilot.py +0 -0
  200. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_export/test_cursor.py +0 -0
  201. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_export/test_generic.py +0 -0
  202. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_export/test_helpers.py +0 -0
  203. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_export/test_kiro.py +0 -0
  204. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_export/test_protocol_conformance.py +0 -0
  205. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_export/test_registry.py +0 -0
  206. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_feedback/__init__.py +0 -0
  207. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_feedback/test_analyzer.py +0 -0
  208. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_feedback/test_spec_updater.py +0 -0
  209. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_feedback/test_suggestions.py +0 -0
  210. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_generate/__init__.py +0 -0
  211. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_generate/test_adaptive.py +0 -0
  212. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_generate/test_lock.py +0 -0
  213. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_generate/test_spec_builder.py +0 -0
  214. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/__init__.py +0 -0
  215. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_confluence.py +0 -0
  216. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_github_issues.py +0 -0
  217. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_hardening.py +0 -0
  218. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_image.py +0 -0
  219. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_jira.py +0 -0
  220. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_markdown.py +0 -0
  221. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_plaintext.py +0 -0
  222. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_registry.py +0 -0
  223. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_slack.py +0 -0
  224. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_url.py +0 -0
  225. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_ingest/test_yaml_input.py +0 -0
  226. {intake_ai_cli-0.3.0/tests/test_plugins → intake_ai_cli-0.5.0/tests/test_mcp}/__init__.py +0 -0
  227. {intake_ai_cli-0.3.0/tests/test_utils → intake_ai_cli-0.5.0/tests/test_plugins}/__init__.py +0 -0
  228. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_plugins/test_discovery.py +0 -0
  229. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_plugins/test_hooks.py +0 -0
  230. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_plugins/test_protocols.py +0 -0
  231. {intake_ai_cli-0.3.0/tests/test_verify → intake_ai_cli-0.5.0/tests/test_utils}/__init__.py +0 -0
  232. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_utils/test_cost.py +0 -0
  233. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_utils/test_file_detect.py +0 -0
  234. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_utils/test_project_detect.py +0 -0
  235. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_utils/test_source_uri.py +0 -0
  236. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_utils/test_task_state.py +0 -0
  237. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_verify/test_engine.py +0 -0
  238. {intake_ai_cli-0.3.0 → intake_ai_cli-0.5.0}/tests/test_verify/test_reporter.py +0 -0
@@ -0,0 +1,145 @@
1
+ # intake configuration
2
+ # Copy this file to .intake.yaml and customize as needed.
3
+ # All values shown below are the defaults — only override what you need.
4
+ #
5
+ # Configuration priority (highest wins):
6
+ # CLI flags > .intake.yaml > preset > hardcoded defaults
7
+ #
8
+ # Presets:
9
+ # --preset minimal → fast & cheap for prototyping
10
+ # --preset standard → balanced (default behavior)
11
+ # --preset enterprise → detailed with full traceability
12
+
13
+ # ─── LLM settings for requirement analysis ───────────────────────────────────
14
+
15
+ llm:
16
+ model: claude-sonnet-4 # Any model supported by LiteLLM
17
+ api_key_env: ANTHROPIC_API_KEY # Environment variable holding the API key
18
+ max_cost_per_spec: 0.50 # Budget limit per spec generation (USD)
19
+ temperature: 0.2 # Lower = more deterministic
20
+ max_retries: 3 # Retry count on LLM failures
21
+ timeout: 120 # Timeout per LLM call (seconds)
22
+
23
+ # ─── Project metadata ────────────────────────────────────────────────────────
24
+
25
+ project:
26
+ name: "" # Auto-detected from description if empty
27
+ stack: [] # Auto-detected from project files if empty
28
+ # E.g.: ["python", "fastapi", "postgresql"]
29
+ language: en # Language for generated spec content
30
+ # Supported: en, es, fr, de, pt, ja, zh, ...
31
+ conventions: {} # Custom conventions, e.g.:
32
+ # testing: pytest
33
+ # linting: ruff
34
+ # style: google-docstrings
35
+
36
+ # ─── Spec generation settings ────────────────────────────────────────────────
37
+
38
+ spec:
39
+ output_dir: ./specs # Where to write generated specs
40
+ requirements_format: ears # ears | user-stories | bdd | free
41
+ design_depth: moderate # minimal | moderate | detailed
42
+ task_granularity: medium # coarse | medium | fine
43
+ include_sources: true # Include source traceability in spec
44
+ version_specs: true # Create versioned spec directories
45
+ generate_lock: true # Generate spec.lock.yaml for reproducibility
46
+ risk_assessment: true # Include risk matrix in analysis
47
+ auto_mode: true # Auto-detect quick/standard/enterprise mode
48
+ # based on input complexity
49
+
50
+ # ─── Verification settings ───────────────────────────────────────────────────
51
+
52
+ verification:
53
+ auto_generate_tests: true # Generate acceptance checks from requirements
54
+ test_output_dir: ./tests/generated # Where to write generated tests
55
+ checks: [] # Additional custom checks (list of strings)
56
+ timeout_per_check: 120 # Timeout per acceptance check (seconds)
57
+
58
+ # ─── Export settings ─────────────────────────────────────────────────────────
59
+
60
+ export:
61
+ default_format: generic # architect | claude-code | cursor | kiro
62
+ # | copilot | generic
63
+ architect_include_guardrails: true # Include guardrails in architect pipeline
64
+ architect_pipeline_template: standard
65
+ claude_code_generate_claude_md: true # Generate CLAUDE.md for Claude Code
66
+ claude_code_task_dir: .intake/tasks # Task files directory for Claude Code
67
+ cursor_rules_dir: .cursor/rules # Rules directory for Cursor
68
+
69
+ # ─── Security settings ──────────────────────────────────────────────────────
70
+
71
+ security:
72
+ redact_patterns: [] # Regex patterns to redact before LLM analysis
73
+ # Examples:
74
+ # - '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' # Emails
75
+ # - '\b\d{3}-\d{2}-\d{4}\b' # SSN
76
+ # - 'password\s*[:=]\s*\S+' # Passwords in text
77
+ redact_files: # File patterns to never include
78
+ - "*.env"
79
+ - "*.pem"
80
+ - "*.key"
81
+
82
+ # ─── Live API connectors ────────────────────────────────────────────────────
83
+ # Requires: pip install intake-ai-cli[connectors]
84
+ # Source URIs: jira://PROJ-123, confluence://SPACE/Title, github://org/repo/issues/42
85
+
86
+ connectors:
87
+ jira:
88
+ url: "" # Jira instance URL (e.g., https://your-org.atlassian.net)
89
+ auth_type: token # token | oauth | api_key
90
+ token_env: JIRA_API_TOKEN # Environment variable for Jira API token
91
+ email_env: JIRA_EMAIL # Environment variable for Jira email
92
+ default_project: "" # Default project key (e.g., PROJ)
93
+ include_comments: true # Include issue comments
94
+ max_comments: 5 # Max comments per issue
95
+ fields: # Jira fields to fetch
96
+ - summary
97
+ - description
98
+ - labels
99
+ - priority
100
+ - status
101
+ - issuelinks
102
+ - comment
103
+
104
+ confluence:
105
+ url: "" # Confluence URL (e.g., https://your-org.atlassian.net/wiki)
106
+ auth_type: token # token | oauth
107
+ token_env: CONFLUENCE_API_TOKEN # Environment variable for Confluence API token
108
+ email_env: CONFLUENCE_EMAIL # Environment variable for Confluence email
109
+ default_space: "" # Default space key (e.g., ENG)
110
+ include_child_pages: false # Fetch child pages recursively
111
+ max_depth: 1 # Max recursion depth for child pages
112
+
113
+ github:
114
+ token_env: GITHUB_TOKEN # Environment variable for GitHub token
115
+ default_repo: "" # Default repo (e.g., org/repo)
116
+
117
+ # ─── Feedback loop ──────────────────────────────────────────────────────────
118
+ # Analyzes verification failures and suggests fixes
119
+
120
+ feedback:
121
+ auto_amend_spec: false # Auto-apply spec amendments from feedback
122
+ max_suggestions: 10 # Max suggestions per feedback analysis
123
+ include_code_snippets: true # Include code examples in suggestions
124
+
125
+ # ─── MCP server (Model Context Protocol) ────────────────────────────────────
126
+ # Requires: pip install intake-ai-cli[mcp]
127
+ # Exposes intake as an MCP server for AI agents
128
+
129
+ mcp:
130
+ specs_dir: ./specs # Base directory for specs
131
+ project_dir: . # Project root for verification
132
+ transport: stdio # stdio (for CLI agents) | sse (for HTTP)
133
+ sse_port: 8080 # Port for SSE transport
134
+
135
+ # ─── Watch mode (file monitoring + auto-verification) ───────────────────────
136
+ # Requires: pip install intake-ai-cli[watch]
137
+
138
+ watch:
139
+ debounce_seconds: 2.0 # Wait after last change before re-checking
140
+ ignore_patterns: # Files/directories to ignore
141
+ - "*.pyc"
142
+ - "__pycache__"
143
+ - ".git"
144
+ - "node_modules"
145
+ - ".intake"
@@ -5,6 +5,117 @@ 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.5.0] - 2026-03-07
9
+
10
+ ### Added
11
+
12
+ #### GitHub Actions action
13
+
14
+ - **`action/action.yml`** (NEW): Composite GitHub Action for verifying spec compliance in CI/CD. Inputs: `spec-dir`, `project-dir`, `report-format` (terminal/json/junit), `report-output`, `tags`, `fail-fast`, `python-version`, `intake-version`. Outputs: `result`, `total-checks`, `passed-checks`, `failed-checks`, `report-path`. Automatically uploads report as artifact.
15
+
16
+ #### CI pipeline
17
+
18
+ - **`.github/workflows/ci.yml`** (NEW): Full CI pipeline with 4 jobs: lint (ruff check + format), typecheck (mypy strict), test (Python 3.12 + 3.13 with coverage), build (package + verify install). Runs on push to main/develop and PRs to main. Concurrency groups cancel in-progress runs.
19
+
20
+ #### Examples
21
+
22
+ - **`examples/from-jira-api/`** (NEW): Live Jira API connector walkthrough with URI format reference and troubleshooting.
23
+ - **`examples/mcp-session/`** (NEW): MCP server setup guide for Claude Code, Cursor, and SSE transport. Tool/resource/prompt reference. Complete implementation walkthrough.
24
+ - **`examples/feedback-loop/`** (NEW): Verify-feedback-fix cycle documentation with failure types, auto-apply amendments, and watch mode integration.
25
+ - **`examples/quick-mode/`** (NEW): Quick mode usage for simple tasks with auto-detection rules and output comparison.
26
+ - **`examples/plugin-custom-parser/`** (NEW): Complete plugin development guide covering parser, exporter, and connector creation with V1 vs V2 protocol reference.
27
+
28
+ #### Documentation
29
+
30
+ - **README.md** updated with MCP setup guides (Claude Code `.mcp.json`, Cursor settings, SSE), GitHub Action usage, plugin development section, 9 examples table.
31
+ - **`.intake.yaml.example`** updated with ALL configuration fields: connectors (jira/confluence/github), feedback, mcp, watch sections with full documentation.
32
+
33
+ #### Test suite
34
+
35
+ - **775 tests** (up from 772), **0 failures**, **10 skipped** (MCP prompts tests when mcp package not installed). 3 new tests for connector temp file error handling.
36
+
37
+ ### Fixed
38
+
39
+ #### mypy strict compliance
40
+
41
+ - **0 mypy --strict errors** (down from 39): Added `[[tool.mypy.overrides]]` for optional dependencies without type stubs (mcp, atlassian, github, uvicorn, starlette, watchfiles). Fixed `type: ignore` comments in MCP modules (tools, resources, prompts, server) to use correct error codes (`attr-defined`, `untyped-decorator`). Changed `create_server()` return type from `object` to `Any`. Removed stale `type: ignore[arg-type]` comments on Starlette Route calls.
42
+
43
+ #### Error handling hardening
44
+
45
+ - **Feedback command** (`cli.py`): Added specific `FileNotFoundError` check for verify report file with actionable hint. Added `json.JSONDecodeError` handling with suggestion to regenerate report.
46
+ - **Connector fetch** (`cli.py`): Added `TimeoutError` and `OSError` handling in `_fetch_connector_source` for graceful degradation on network failures with actionable hints.
47
+ - **Connector temp files** (`connectors/`): All 3 connectors (Jira, Confluence, GitHub) now wrap temp file creation in `try/except OSError` and raise `ConnectorError` with disk space suggestion.
48
+ - **Verify engine** (`verify/engine.py`): Added `logger.warning` for `OSError` when reading files during pattern checks instead of silently continuing.
49
+
50
+ ## [0.4.0] - 2026-03-05
51
+
52
+ ### Added
53
+
54
+ #### MCP (Model Context Protocol) server
55
+
56
+ - **MCP server module** (`mcp/`): Full MCP server implementation with stdio and SSE transports. Requires `pip install intake-ai-cli[mcp]`.
57
+ - **`create_server()`** (`mcp/server.py`): Creates and configures the MCP server with all tools, resources, and prompts registered. `MCP_SERVER_NAME = "intake-spec"`.
58
+ - **`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.
59
+ - **7 MCP tools** (`mcp/tools.py`):
60
+ - `intake_show`: Show spec summary with truncated file content (MAX_SECTION_LENGTH = 3000).
61
+ - `intake_get_context`: Read `context.md` for a spec.
62
+ - `intake_get_tasks`: List tasks with status filtering (all/pending/in_progress/done/blocked).
63
+ - `intake_update_task`: Update task status with optional note.
64
+ - `intake_verify`: Run acceptance checks with optional tag filtering.
65
+ - `intake_feedback`: Run verification + analyze failures.
66
+ - `intake_list_specs`: List available specs (filters directories without `requirements.md`).
67
+ - **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.
68
+ - **MCP prompts** (`mcp/prompts.py`): Two structured prompt templates:
69
+ - `implement_next_task`: Reads spec files and generates implementation instructions referencing MCP tools.
70
+ - `verify_and_fix`: Generates a verify → fix → re-verify loop until all checks pass.
71
+ - **MCPError exception** (`mcp/__init__.py`): Error with `reason` and `suggestion` attributes.
72
+ - **Lazy imports**: `mcp`, `starlette`, `uvicorn` imported lazily with clear `ImportError` messages and installation commands.
73
+
74
+ #### Watch mode (file monitoring + auto-verification)
75
+
76
+ - **Watch module** (`watch/`): File watcher with selective re-verification. Requires `pip install intake-ai-cli[watch]`.
77
+ - **SpecWatcher** (`watch/watcher.py`): Monitors project directory using `watchfiles` (Rust-based, efficient). On file change, re-runs verification checks and displays results.
78
+ - `run_once()`: Single verification without watching.
79
+ - `run()`: Continuous watch loop with debouncing.
80
+ - `_filter_ignored()`: Filters files by ignore patterns (fnmatch per path component).
81
+ - `_matches_any()`: Static method for pattern matching against individual path components.
82
+ - `_extract_changed_files()`: Extracts relative paths from watchfiles change sets.
83
+ - `MAX_CHANGED_FILES_DISPLAY = 5`: Limits terminal output.
84
+ - **WatchError exception** (`watch/__init__.py`): Error with `reason` and `suggestion` attributes.
85
+ - **Debouncing**: Configurable via `WatchConfig.debounce_seconds`, passed to watchfiles native debouncing.
86
+
87
+ #### Configuration
88
+
89
+ - **MCPConfig** (`config/schema.py`): `specs_dir`, `project_dir`, `transport` (stdio/sse), `sse_port`.
90
+ - **WatchConfig** (`config/schema.py`): `debounce_seconds` (default: 2.0), `ignore_patterns` (default: `["*.pyc", "__pycache__", ".git", "node_modules", ".intake"]`).
91
+ - Both added to `IntakeConfig` as `mcp` and `watch` fields.
92
+
93
+ #### CLI commands
94
+
95
+ - **`intake mcp serve`**: Start the MCP server. Options: `--transport` (stdio/sse), `--port`, `--specs-dir`, `--project-dir`.
96
+ - **`intake watch`**: Watch project files and re-run verification. Options: `--project-dir`, `--tags`, `--debounce`, `--verbose`.
97
+
98
+ #### Optional dependencies
99
+
100
+ - `mcp = ["mcp[cli]>=1.0"]`: MCP server support.
101
+ - `watch = ["watchfiles>=1.0"]`: Watch mode support.
102
+ - `all = [connectors + watch + mcp]`: Install everything.
103
+
104
+ #### Test suite
105
+
106
+ - **772 tests** (up from 673), **0 failures**, **10 skipped** (MCP prompts tests when mcp package not installed). 99 new tests added.
107
+ - 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).
108
+ - Config tests: 2 new tests for MCPConfig and WatchConfig nested overrides.
109
+ - CLI tests: 4 new tests for MCP and Watch help output.
110
+
111
+ ### Fixed
112
+
113
+ - **`_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.
114
+ - **Silent exception in `_handle_get_tasks`** (`mcp/tools.py`): Added `logger.debug("task_state_manager_fallback", ...)` to bare `except Exception` block.
115
+ - **Missing `run_sse` export** (`mcp/__init__.py`): Added `run_sse` to `__all__` and convenience re-export function.
116
+ - **`__all__` sort order** (`mcp/__init__.py`): Fixed RUF022 by sorting alphabetically.
117
+ - **ruff TC003 in tests**: Added `per-file-ignores` rule for `tests/**/*.py` to allow stdlib imports at runtime in test fixtures.
118
+
8
119
  ## [0.3.0] - 2026-03-04
9
120
 
10
121
  ### 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.5.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
@@ -298,8 +334,13 @@ See the [`examples/`](examples/) directory for ready-to-run scenarios:
298
334
  |---------|-------------|
299
335
  | [`from-markdown`](examples/from-markdown/) | Single Markdown file with OAuth2 requirements |
300
336
  | [`from-jira`](examples/from-jira/) | Jira JSON export with 3 issues |
337
+ | [`from-jira-api`](examples/from-jira-api/) | Live Jira API connector (no manual export) |
301
338
  | [`from-scratch`](examples/from-scratch/) | Free-text meeting notes |
302
339
  | [`multi-source`](examples/multi-source/) | Combining Markdown + Jira JSON + text notes |
340
+ | [`quick-mode`](examples/quick-mode/) | Simple task with minimal output |
341
+ | [`mcp-session`](examples/mcp-session/) | MCP server setup and walkthrough |
342
+ | [`feedback-loop`](examples/feedback-loop/) | Verify, analyze failures, fix, repeat |
343
+ | [`plugin-custom-parser`](examples/plugin-custom-parser/) | How to create a custom parser plugin |
303
344
 
304
345
  ---
305
346
 
@@ -309,7 +350,7 @@ See the [`examples/`](examples/) directory for ready-to-run scenarios:
309
350
  src/intake/
310
351
  ├── cli.py # Click CLI — thin adapter, no logic
311
352
  ├── config/ # Pydantic v2 models, presets, layered loader
312
- │ ├── schema.py # 9 config models (LLM, Project, Spec, Verification, Export, Security, Connectors, Feedback)
353
+ │ ├── schema.py # 11 config models (LLM, Project, Spec, Verification, Export, Security, Connectors, Feedback, MCP, Watch)
313
354
  │ ├── presets.py # minimal / standard / enterprise presets
314
355
  │ ├── loader.py # Layered merge: defaults → preset → YAML → CLI
315
356
  │ └── defaults.py # Centralized constants
@@ -366,6 +407,15 @@ src/intake/
366
407
  │ └── generic.py # SPEC.md + verify.sh generation
367
408
  ├── diff/ # Spec comparison
368
409
  │ └── differ.py # Compare two specs by requirement/task IDs
410
+ ├── mcp/ # MCP server (Model Context Protocol)
411
+ │ ├── __init__.py # MCPError + re-exports
412
+ │ ├── server.py # Server creation + stdio/SSE transports
413
+ │ ├── tools.py # 7 tools: show, context, tasks, update, verify, feedback, list
414
+ │ ├── resources.py # Dynamic spec file resources (intake://specs/{name}/{section})
415
+ │ └── prompts.py # Prompt templates: implement_next_task, verify_and_fix
416
+ ├── watch/ # Watch mode (file monitoring + auto-verification)
417
+ │ ├── __init__.py # WatchError exception
418
+ │ └── watcher.py # SpecWatcher with watchfiles integration
369
419
  ├── feedback/ # Feedback loop (analyze failures, suggest fixes)
370
420
  │ ├── analyzer.py # LLM-based failure analysis
371
421
  │ ├── prompts.py # Feedback analysis prompt
@@ -448,6 +498,80 @@ intake export ./specs/auth -f copilot -o .
448
498
  # Generates .github/copilot-instructions.md (auto-loaded by Copilot)
449
499
  ```
450
500
 
501
+ ### MCP Server (AI Agent Integration)
502
+
503
+ intake exposes specs via the [Model Context Protocol](https://modelcontextprotocol.io/), allowing AI agents to consume specs in real time during development.
504
+
505
+ Install MCP support: `pip install intake-ai-cli[mcp]`
506
+
507
+ #### Setup for Claude Code
508
+
509
+ Add to your project's `.mcp.json`:
510
+
511
+ ```json
512
+ {
513
+ "mcpServers": {
514
+ "intake": {
515
+ "command": "intake",
516
+ "args": ["mcp", "serve", "--specs-dir", "./specs", "--project-dir", "."]
517
+ }
518
+ }
519
+ }
520
+ ```
521
+
522
+ #### Setup for Cursor
523
+
524
+ Add to Cursor MCP settings (Settings > MCP Servers):
525
+
526
+ ```json
527
+ {
528
+ "intake": {
529
+ "command": "intake",
530
+ "args": ["mcp", "serve", "--specs-dir", "./specs", "--project-dir", "."]
531
+ }
532
+ }
533
+ ```
534
+
535
+ #### SSE Transport (Remote/IDE)
536
+
537
+ ```bash
538
+ intake mcp serve --transport sse --port 8080
539
+ ```
540
+
541
+ #### MCP Tools
542
+
543
+ | Tool | Description |
544
+ |------|-------------|
545
+ | `intake_show` | View spec summary |
546
+ | `intake_get_context` | Read project context (stack, conventions) |
547
+ | `intake_get_tasks` | List tasks with status filtering |
548
+ | `intake_update_task` | Mark tasks as done/in_progress/blocked |
549
+ | `intake_verify` | Run acceptance checks |
550
+ | `intake_feedback` | Analyze verification failures |
551
+ | `intake_list_specs` | List available specs |
552
+
553
+ **MCP resources:** Direct access to spec files via `intake://specs/{name}/{section}` URIs.
554
+
555
+ **MCP prompts:** `implement_next_task` and `verify_and_fix` provide structured starting points for agents.
556
+
557
+ See [`examples/mcp-session/`](examples/mcp-session/) for a complete walkthrough.
558
+
559
+ ### Watch Mode
560
+
561
+ Automatically re-run verification checks when project files change:
562
+
563
+ ```bash
564
+ # Watch with default settings
565
+ intake watch ./specs/auth-oauth2 --project-dir .
566
+
567
+ # Watch with tags filter and custom debounce
568
+ intake watch ./specs/auth-oauth2 --tags test,lint --debounce 3 --verbose
569
+ ```
570
+
571
+ Uses `watchfiles` (Rust-based) for efficient file monitoring with configurable debounce and ignore patterns.
572
+
573
+ Install watch support: `pip install intake-ai-cli[watch]`
574
+
451
575
  ### Feedback Loop
452
576
 
453
577
  ```bash
@@ -463,12 +587,26 @@ intake feedback ./specs/auth --agent-format claude-code
463
587
 
464
588
  ### With CI/CD
465
589
 
590
+ #### GitHub Actions (built-in action)
591
+
592
+ ```yaml
593
+ # .github/workflows/verify.yml
594
+ - name: Verify spec compliance
595
+ uses: Diego303/intake-cli/action@main
596
+ with:
597
+ spec-dir: ./specs/auth-system
598
+ project-dir: .
599
+ report-format: junit
600
+ report-output: intake-report.xml
601
+ ```
602
+
603
+ #### Manual setup
604
+
466
605
  ```yaml
467
- # GitHub Actions
468
606
  - name: Verify spec compliance
469
607
  run: |
470
608
  pip install intake-ai-cli
471
- intake verify specs/auth-system/ -p . --format junit
609
+ intake verify specs/auth-system/ -p . --format junit -o report.xml
472
610
  ```
473
611
 
474
612
  ---
@@ -492,7 +630,7 @@ ruff format src/ tests/
492
630
  mypy src/ --strict
493
631
  ```
494
632
 
495
- Current test suite: **673 tests**, **0 mypy --strict errors**, **0 ruff warnings**.
633
+ Current test suite: **775 tests**, **0 mypy --strict errors**, **0 ruff warnings**.
496
634
 
497
635
  ### Implementation Status
498
636
 
@@ -506,9 +644,11 @@ Current test suite: **673 tests**, **0 mypy --strict errors**, **0 ruff warnings
506
644
  | Plugins | `plugins/` (protocols + discovery + hooks) | Implemented |
507
645
  | Connectors | `connectors/` (Jira, Confluence, GitHub API connectors) | Implemented |
508
646
  | Feedback | `feedback/` (analyzer + suggestions + spec updater) | Implemented |
647
+ | MCP Server | `mcp/` (server + 7 tools + resources + prompts) | Implemented |
648
+ | Watch Mode | `watch/` (SpecWatcher with watchfiles) | Implemented |
509
649
  | Standalone | `doctor/`, `config/`, `llm/`, `utils/` | Implemented |
510
650
  | Standalone | `diff/` (spec differ) | Implemented |
511
- | CLI | 15 commands/subcommands wired end-to-end | Implemented |
651
+ | CLI | 19 commands/subcommands wired end-to-end | Implemented |
512
652
 
513
653
  ---
514
654
 
@@ -531,6 +671,40 @@ export OPENAI_API_KEY=sk-...
531
671
 
532
672
  ---
533
673
 
674
+ ## Plugin Development
675
+
676
+ intake supports custom parsers, exporters, and connectors via Python entry points (PEP 621). Any pip-installable package can extend intake.
677
+
678
+ ```python
679
+ # Example: custom parser plugin
680
+ from intake.plugins.protocols import ParserPlugin, PluginMeta
681
+ from intake.ingest.base import ParsedContent
682
+
683
+ class NotionParser:
684
+ @property
685
+ def meta(self) -> PluginMeta:
686
+ return PluginMeta(name="notion", version="0.1.0", description="Notion parser")
687
+
688
+ @property
689
+ def supported_extensions(self) -> list[str]:
690
+ return [".html"]
691
+
692
+ def can_parse(self, source: str) -> bool: ...
693
+ def confidence(self, source: str) -> float: ...
694
+ def parse(self, source: str) -> ParsedContent: ...
695
+ ```
696
+
697
+ Register in your package's `pyproject.toml`:
698
+
699
+ ```toml
700
+ [project.entry-points."intake.parsers"]
701
+ notion = "my_package:NotionParser"
702
+ ```
703
+
704
+ See [`examples/plugin-custom-parser/`](examples/plugin-custom-parser/) for a complete guide covering parsers, exporters, and connectors.
705
+
706
+ ---
707
+
534
708
  ## License
535
709
 
536
710
  MIT