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.
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/CHANGELOG.md +69 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/PKG-INFO +94 -4
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/README.md +88 -3
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/SEGUIMIENTO-V0.md +204 -1
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/README.md +9 -1
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/arquitectura.md +19 -1
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/buenas-practicas.md +41 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/configuracion.md +41 -0
- intake_ai_cli-0.4.0/docs/github-notes/v0.4.0.md +278 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/guia-cli.md +125 -2
- intake_ai_cli-0.4.0/docs/mcp-server.md +432 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/pipeline.md +59 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/solucion-problemas.md +74 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/verificacion.md +40 -0
- intake_ai_cli-0.4.0/docs/watch-mode.md +316 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/pyproject.toml +7 -1
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/__init__.py +1 -1
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/cli.py +142 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/config/schema.py +36 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/claude_code.py +1 -1
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/copilot.py +1 -1
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/cursor.py +1 -1
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/kiro.py +1 -1
- intake_ai_cli-0.4.0/src/intake/mcp/__init__.py +68 -0
- intake_ai_cli-0.4.0/src/intake/mcp/prompts.py +167 -0
- intake_ai_cli-0.4.0/src/intake/mcp/resources.py +108 -0
- intake_ai_cli-0.4.0/src/intake/mcp/server.py +154 -0
- intake_ai_cli-0.4.0/src/intake/mcp/tools.py +427 -0
- intake_ai_cli-0.4.0/src/intake/watch/__init__.py +25 -0
- intake_ai_cli-0.4.0/src/intake/watch/watcher.py +237 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_cli.py +62 -1
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_config/test_schema.py +52 -0
- intake_ai_cli-0.4.0/tests/test_mcp/test_prompts.py +99 -0
- intake_ai_cli-0.4.0/tests/test_mcp/test_resources.py +143 -0
- intake_ai_cli-0.4.0/tests/test_mcp/test_server.py +91 -0
- intake_ai_cli-0.4.0/tests/test_mcp/test_tools.py +338 -0
- intake_ai_cli-0.4.0/tests/test_verify/__init__.py +0 -0
- intake_ai_cli-0.4.0/tests/test_watch/__init__.py +0 -0
- intake_ai_cli-0.4.0/tests/test_watch/test_watcher.py +505 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/.gitignore +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/.intake.yaml.example +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/LICENSE +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/SECURITY.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/conectores.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/despliegue.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/exportacion.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/feedback.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/flujos-trabajo.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/formatos-entrada.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/github-notes/v0.1.0.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/github-notes/v0.2.0.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/github-notes/v0.3.0.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/integracion-cicd.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/plugins.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/docs/seguridad.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-jira/README.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-jira/jira-export.json +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-markdown/README.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-markdown/requirements.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-scratch/README.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/from-scratch/idea.txt +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/multi-source/README.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/multi-source/api-decisions.json +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/multi-source/notes.txt +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/examples/multi-source/user-stories.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/__main__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/analyzer.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/complexity.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/conflicts.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/dedup.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/design.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/extraction.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/models.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/prompts.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/questions.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/analyze/risks.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/config/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/config/defaults.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/config/loader.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/config/presets.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/connectors/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/connectors/base.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/connectors/confluence_api.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/connectors/github_api.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/connectors/jira_api.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/diff/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/diff/differ.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/doctor/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/doctor/checks.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/_helpers.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/architect.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/base.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/generic.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/export/registry.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/feedback/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/feedback/analyzer.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/feedback/prompts.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/feedback/spec_updater.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/feedback/suggestions.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/generate/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/generate/adaptive.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/generate/lock.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/generate/spec_builder.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/base.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/confluence.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/docx.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/github_issues.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/image.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/jira.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/markdown.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/pdf.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/plaintext.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/registry.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/slack.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/url.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/ingest/yaml_input.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/llm/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/llm/adapter.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/plugins/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/plugins/discovery.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/plugins/hooks.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/plugins/protocols.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/acceptance.yaml.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/claude_md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/claude_task.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/context.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/copilot_instructions.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/cursor_rules.mdc.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/design.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/feedback.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/kiro_design.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/kiro_requirements.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/kiro_tasks.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/requirements.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/sources.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/tasks.md.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/templates/verify_sh.j2 +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/cost.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/file_detect.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/logging.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/project_detect.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/source_uri.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/utils/task_state.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/verify/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/verify/engine.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/src/intake/verify/reporter.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/conftest.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/confluence_api_response.json +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/confluence_page.html +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/github_issues.json +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/jira_api_response.json +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/jira_export.json +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/jira_export_multi.json +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/sample_webpage.html +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/simple_spec.md +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/slack_export.json +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/slack_thread.txt +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/structured_reqs.yaml +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/verify_report_failed.json +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/fixtures/wireframe.png +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_analyzer.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_complexity.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_conflicts.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_dedup.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_design.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_extraction.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_llm_adapter.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_risks.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_config/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_config/test_loader.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_config/test_presets.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_connectors/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_connectors/test_base.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_connectors/test_confluence_api.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_connectors/test_github_api.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_connectors/test_jira_api.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_diff/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_diff/test_differ.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_doctor/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_doctor/test_checks.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_architect.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_claude_code.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_copilot.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_cursor.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_generic.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_helpers.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_kiro.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_protocol_conformance.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_export/test_registry.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_feedback/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_feedback/test_analyzer.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_feedback/test_spec_updater.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_feedback/test_suggestions.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_generate/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_generate/test_adaptive.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_generate/test_lock.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_generate/test_spec_builder.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_confluence.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_github_issues.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_hardening.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_image.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_jira.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_markdown.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_plaintext.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_registry.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_slack.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_url.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_yaml_input.py +0 -0
- {intake_ai_cli-0.3.0/tests/test_plugins → intake_ai_cli-0.4.0/tests/test_mcp}/__init__.py +0 -0
- {intake_ai_cli-0.3.0/tests/test_utils → intake_ai_cli-0.4.0/tests/test_plugins}/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_plugins/test_discovery.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_plugins/test_hooks.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_plugins/test_protocols.py +0 -0
- {intake_ai_cli-0.3.0/tests/test_verify → intake_ai_cli-0.4.0/tests/test_utils}/__init__.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_cost.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_file_detect.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_project_detect.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_source_uri.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_task_state.py +0 -0
- {intake_ai_cli-0.3.0 → intake_ai_cli-0.4.0}/tests/test_verify/test_engine.py +0 -0
- {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
|
+
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 #
|
|
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: **
|
|
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 |
|
|
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 #
|
|
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: **
|
|
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 |
|
|
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-
|
|
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
|
|
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
|
---
|