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