intake-ai-cli 0.2.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.2.0 → intake_ai_cli-0.4.0}/CHANGELOG.md +136 -1
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/PKG-INFO +226 -17
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/README.md +220 -16
- intake_ai_cli-0.4.0/SECURITY.md +379 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/SEGUIMIENTO-V0.md +454 -1
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/README.md +49 -7
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/arquitectura.md +71 -15
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/buenas-practicas.md +49 -0
- intake_ai_cli-0.4.0/docs/conectores.md +278 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/configuracion.md +140 -23
- intake_ai_cli-0.4.0/docs/despliegue.md +306 -0
- intake_ai_cli-0.4.0/docs/exportacion.md +462 -0
- intake_ai_cli-0.4.0/docs/feedback.md +230 -0
- intake_ai_cli-0.4.0/docs/flujos-trabajo.md +445 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/formatos-entrada.md +75 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/github-notes/v0.1.0.md +9 -9
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/github-notes/v0.2.0.md +36 -54
- intake_ai_cli-0.4.0/docs/github-notes/v0.3.0.md +442 -0
- intake_ai_cli-0.4.0/docs/github-notes/v0.4.0.md +278 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/guia-cli.md +205 -7
- intake_ai_cli-0.4.0/docs/integracion-cicd.md +537 -0
- intake_ai_cli-0.4.0/docs/mcp-server.md +432 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/pipeline.md +122 -2
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/plugins.md +19 -7
- intake_ai_cli-0.4.0/docs/seguridad.md +366 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/docs/solucion-problemas.md +125 -9
- {intake_ai_cli-0.2.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.2.0 → intake_ai_cli-0.4.0}/pyproject.toml +14 -1
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/__init__.py +1 -1
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/cli.py +412 -18
- intake_ai_cli-0.4.0/src/intake/config/schema.py +196 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/connectors/__init__.py +6 -0
- intake_ai_cli-0.4.0/src/intake/connectors/confluence_api.py +254 -0
- intake_ai_cli-0.4.0/src/intake/connectors/github_api.py +271 -0
- intake_ai_cli-0.4.0/src/intake/connectors/jira_api.py +237 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/doctor/checks.py +115 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/export/__init__.py +10 -5
- intake_ai_cli-0.4.0/src/intake/export/_helpers.py +152 -0
- intake_ai_cli-0.4.0/src/intake/export/claude_code.py +326 -0
- intake_ai_cli-0.4.0/src/intake/export/copilot.py +157 -0
- intake_ai_cli-0.4.0/src/intake/export/cursor.py +158 -0
- intake_ai_cli-0.4.0/src/intake/export/kiro.py +271 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/export/registry.py +20 -6
- intake_ai_cli-0.4.0/src/intake/feedback/__init__.py +39 -0
- intake_ai_cli-0.4.0/src/intake/feedback/analyzer.py +309 -0
- intake_ai_cli-0.4.0/src/intake/feedback/prompts.py +60 -0
- intake_ai_cli-0.4.0/src/intake/feedback/spec_updater.py +324 -0
- intake_ai_cli-0.4.0/src/intake/feedback/suggestions.py +109 -0
- 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/templates/claude_md.j2 +38 -0
- intake_ai_cli-0.4.0/src/intake/templates/claude_task.md.j2 +22 -0
- intake_ai_cli-0.4.0/src/intake/templates/copilot_instructions.md.j2 +43 -0
- intake_ai_cli-0.4.0/src/intake/templates/cursor_rules.mdc.j2 +47 -0
- intake_ai_cli-0.4.0/src/intake/templates/feedback.md.j2 +47 -0
- intake_ai_cli-0.4.0/src/intake/templates/kiro_design.md.j2 +9 -0
- intake_ai_cli-0.4.0/src/intake/templates/kiro_requirements.md.j2 +19 -0
- intake_ai_cli-0.4.0/src/intake/templates/kiro_tasks.md.j2 +22 -0
- intake_ai_cli-0.4.0/src/intake/templates/verify_sh.j2 +39 -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.4.0/tests/fixtures/confluence_api_response.json +19 -0
- intake_ai_cli-0.4.0/tests/fixtures/jira_api_response.json +32 -0
- intake_ai_cli-0.4.0/tests/fixtures/verify_report_failed.json +44 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_cli.py +199 -1
- intake_ai_cli-0.4.0/tests/test_config/test_schema.py +206 -0
- intake_ai_cli-0.4.0/tests/test_connectors/test_confluence_api.py +181 -0
- intake_ai_cli-0.4.0/tests/test_connectors/test_github_api.py +206 -0
- intake_ai_cli-0.4.0/tests/test_connectors/test_jira_api.py +258 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_doctor/test_checks.py +105 -0
- intake_ai_cli-0.4.0/tests/test_export/test_claude_code.py +259 -0
- intake_ai_cli-0.4.0/tests/test_export/test_copilot.py +191 -0
- intake_ai_cli-0.4.0/tests/test_export/test_cursor.py +145 -0
- intake_ai_cli-0.4.0/tests/test_export/test_helpers.py +125 -0
- intake_ai_cli-0.4.0/tests/test_export/test_kiro.py +207 -0
- intake_ai_cli-0.4.0/tests/test_export/test_protocol_conformance.py +138 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_export/test_registry.py +8 -1
- intake_ai_cli-0.4.0/tests/test_feedback/__init__.py +1 -0
- intake_ai_cli-0.4.0/tests/test_feedback/test_analyzer.py +275 -0
- intake_ai_cli-0.4.0/tests/test_feedback/test_spec_updater.py +188 -0
- intake_ai_cli-0.4.0/tests/test_feedback/test_suggestions.py +116 -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.2.0/docs/exportacion.md +0 -236
- intake_ai_cli-0.2.0/src/intake/config/schema.py +0 -112
- intake_ai_cli-0.2.0/tests/test_config/test_schema.py +0 -66
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/.gitignore +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/.intake.yaml.example +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/LICENSE +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/examples/from-jira/README.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/examples/from-jira/jira-export.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/examples/from-markdown/README.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/examples/from-markdown/requirements.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/examples/from-scratch/README.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/examples/from-scratch/idea.txt +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/examples/multi-source/README.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/examples/multi-source/api-decisions.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/examples/multi-source/notes.txt +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/examples/multi-source/user-stories.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/__main__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/analyzer.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/complexity.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/conflicts.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/dedup.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/design.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/extraction.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/models.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/prompts.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/questions.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/analyze/risks.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/config/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/config/defaults.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/config/loader.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/config/presets.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/connectors/base.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/diff/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/diff/differ.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/doctor/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/export/architect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/export/base.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/export/generic.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/generate/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/generate/adaptive.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/generate/lock.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/generate/spec_builder.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/base.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/confluence.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/docx.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/github_issues.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/image.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/jira.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/markdown.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/pdf.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/plaintext.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/registry.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/slack.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/url.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/ingest/yaml_input.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/llm/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/llm/adapter.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/plugins/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/plugins/discovery.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/plugins/hooks.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/plugins/protocols.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/templates/acceptance.yaml.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/templates/context.md.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/templates/design.md.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/templates/requirements.md.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/templates/sources.md.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/templates/tasks.md.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/utils/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/utils/cost.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/utils/file_detect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/utils/logging.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/utils/project_detect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/utils/source_uri.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/utils/task_state.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/verify/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/verify/engine.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/src/intake/verify/reporter.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/conftest.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/fixtures/confluence_page.html +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/fixtures/github_issues.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/fixtures/jira_export.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/fixtures/jira_export_multi.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/fixtures/sample_webpage.html +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/fixtures/simple_spec.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/fixtures/slack_export.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/fixtures/slack_thread.txt +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/fixtures/structured_reqs.yaml +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/fixtures/wireframe.png +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_analyze/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_analyzer.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_complexity.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_conflicts.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_dedup.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_design.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_extraction.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_llm_adapter.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_analyze/test_risks.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_config/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_config/test_loader.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_config/test_presets.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_connectors/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_connectors/test_base.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_diff/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_diff/test_differ.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_doctor/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_export/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_export/test_architect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_export/test_generic.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_generate/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_generate/test_adaptive.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_generate/test_lock.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_generate/test_spec_builder.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_confluence.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_github_issues.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_hardening.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_image.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_jira.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_markdown.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_plaintext.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_registry.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_slack.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_url.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_ingest/test_yaml_input.py +0 -0
- {intake_ai_cli-0.2.0/tests/test_plugins → intake_ai_cli-0.4.0/tests/test_mcp}/__init__.py +0 -0
- {intake_ai_cli-0.2.0/tests/test_utils → intake_ai_cli-0.4.0/tests/test_plugins}/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_plugins/test_discovery.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_plugins/test_hooks.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_plugins/test_protocols.py +0 -0
- {intake_ai_cli-0.2.0/tests/test_verify → intake_ai_cli-0.4.0/tests/test_utils}/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_cost.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_file_detect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_project_detect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_source_uri.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_utils/test_task_state.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_verify/test_engine.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.4.0}/tests/test_verify/test_reporter.py +0 -0
|
@@ -5,7 +5,142 @@ 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.
|
|
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
|
+
|
|
77
|
+
## [0.3.0] - 2026-03-04
|
|
78
|
+
|
|
79
|
+
### Added
|
|
80
|
+
|
|
81
|
+
#### 3 API connectors (live data fetching)
|
|
82
|
+
|
|
83
|
+
- **Jira connector** (`connectors/jira_api.py`): Fetches issues from Jira via REST API. Supports single issue (`jira://PROJ-123`), multiple issues (`jira://PROJ-1,PROJ-2`), JQL queries (`jira://PROJ?jql=sprint=42`), and sprint-based fetching (`jira://PROJ/sprint/42`). Lazy import of `atlassian-python-api`. Saves as JSON temp files compatible with `JiraParser`.
|
|
84
|
+
- **Confluence connector** (`connectors/confluence_api.py`): Fetches pages from Confluence Cloud/Server. Supports page by ID (`confluence://page/123456`), by space and title (`confluence://SPACE/Page-Title`), and CQL search (`confluence://search?cql=...`). Saves as HTML temp files compatible with `ConfluenceParser`.
|
|
85
|
+
- **GitHub connector** (`connectors/github_api.py`): Fetches issues from GitHub repos via PyGithub. Supports single issue (`github://org/repo/issues/42`), multiple issues, and filtered queries (`github://org/repo/issues?labels=bug&state=open`). Max 50 issues, 10 comments per issue.
|
|
86
|
+
- **Doctor connector checks** (`doctor/checks.py`): `_check_connectors()` validates connector credentials when connectors are configured.
|
|
87
|
+
- **3 connector entry points** in `pyproject.toml`: `jira`, `confluence`, `github` under `[project.entry-points."intake.connectors"]`.
|
|
88
|
+
|
|
89
|
+
#### 4 new exporters (6 total)
|
|
90
|
+
|
|
91
|
+
- **Claude Code exporter** (`export/claude_code.py`): Generates `CLAUDE.md` (smart append/replace), `.intake/tasks/TASK-NNN.md`, `.intake/verify.sh`, `.intake/spec-summary.md`, and `.intake/spec/` copy.
|
|
92
|
+
- **Cursor exporter** (`export/cursor.py`): Generates `.cursor/rules/intake-spec.mdc` with YAML frontmatter.
|
|
93
|
+
- **Kiro exporter** (`export/kiro.py`): Generates `requirements.md`, `design.md`, `tasks.md` in Kiro's native format.
|
|
94
|
+
- **Copilot exporter** (`export/copilot.py`): Generates `.github/copilot-instructions.md`.
|
|
95
|
+
- All 4 exporters implement the **V2 ExporterPlugin protocol**: `meta`, `supported_agents`, `export() → ExportResult`.
|
|
96
|
+
- **Shared export helpers** (`export/_helpers.py`): `read_spec_file()`, `parse_tasks()`, `load_acceptance_checks()`, `summarize_content()`, `count_requirements()`.
|
|
97
|
+
- **9 new Jinja2 templates**: `claude_md.j2`, `claude_task.md.j2`, `verify_sh.j2`, `cursor_rules.mdc.j2`, `kiro_requirements.md.j2`, `kiro_design.md.j2`, `kiro_tasks.md.j2`, `copilot_instructions.md.j2`, `feedback.md.j2`.
|
|
98
|
+
|
|
99
|
+
#### Feedback loop (analyze verification failures)
|
|
100
|
+
|
|
101
|
+
- **Feedback analyzer** (`feedback/analyzer.py`): LLM-based failure analysis with root cause identification, severity classification, and spec amendments. Dataclasses: `SpecAmendment`, `FailureAnalysis`, `FeedbackResult`.
|
|
102
|
+
- **Feedback prompts** (`feedback/prompts.py`): Analysis prompt with `{language}` placeholder and structured JSON output schema.
|
|
103
|
+
- **Suggestion formatter** (`feedback/suggestions.py`): Terminal output (Rich) + agent-specific formatting (generic, claude-code, cursor).
|
|
104
|
+
- **Spec updater** (`feedback/spec_updater.py`): Preview and apply spec amendments with add/modify/remove actions.
|
|
105
|
+
- **`intake feedback` CLI command**: Options `--verify-report`, `--project-dir`, `--apply`, `--agent-format`, `--verbose`.
|
|
106
|
+
|
|
107
|
+
#### Configuration updates
|
|
108
|
+
|
|
109
|
+
- **`FeedbackConfig`** model: `auto_amend_spec`, `max_suggestions`, `include_code_snippets`.
|
|
110
|
+
- **Expanded connector configs**: `JiraConfig` (auth_type, fields, max_comments), `ConfluenceConfig` (include_child_pages, max_depth), `GithubConfig` (default_repo).
|
|
111
|
+
- **`ExportConfig`** expanded: `claude_code_task_dir`, `cursor_rules_dir`.
|
|
112
|
+
|
|
113
|
+
#### Enterprise documentation
|
|
114
|
+
|
|
115
|
+
- **`docs/seguridad.md`** (NEW): Threat model, data flow, secrets management, redaction patterns, offline/air-gapped mode, audit trail, compliance (SOC2/HIPAA/ISO 27001/GDPR).
|
|
116
|
+
- **`docs/despliegue.md`** (NEW): Docker multi-stage, docker-compose, pre-commit hooks, deployment patterns, env vars.
|
|
117
|
+
- **`docs/integracion-cicd.md`** (NEW): GitHub Actions, GitLab CI, Jenkins, Azure DevOps, JUnit/JSON reports, spec drift, notifications.
|
|
118
|
+
- **`docs/flujos-trabajo.md`** (NEW): Solo developer, small team, enterprise, monorepo, AI agent, regulated industries.
|
|
119
|
+
- **`docs/conectores.md`** (NEW): Jira, Confluence, GitHub API connectors documentation.
|
|
120
|
+
- **`docs/feedback.md`** (NEW): Feedback loop usage, severity levels, spec amendments, agent formats.
|
|
121
|
+
- **`SECURITY.md`** (NEW): English security policy at project root (GitHub Security tab).
|
|
122
|
+
- 10 existing documentation files updated with Phase 2 content.
|
|
123
|
+
|
|
124
|
+
#### Test suite
|
|
125
|
+
|
|
126
|
+
- **673 tests** (up from 492), **0 failures**. 181 new tests added.
|
|
127
|
+
- 14 new test files covering connectors, exporters, feedback, and protocol conformance.
|
|
128
|
+
- Protocol conformance tests: 20 parametrized tests for V2 exporters + 3 for connectors.
|
|
129
|
+
|
|
130
|
+
### Fixed
|
|
131
|
+
|
|
132
|
+
#### QA Audit (14 mypy errors, 7 ruff errors, 25 format issues)
|
|
133
|
+
|
|
134
|
+
- **ExporterRegistry type safety** (`export/registry.py`): Introduced `AnyExporter = Exporter | Any` union type for V1/V2 dual protocol support. Changed `_exporters`, `register()`, and `get()` types to accept both V1 and V2 exporters without `type: ignore`.
|
|
135
|
+
- **Connector `Returning Any`** (`connectors/jira_api.py`, `connectors/confluence_api.py`): Wrapped `data.get()` calls with `list()` and explicit `str` annotations to satisfy mypy --strict.
|
|
136
|
+
- **Unused `type: ignore` comments**: Removed 3 stale `# type: ignore[import-untyped]` from connectors after `atlassian-python-api` and `PyGithub` gained type stubs.
|
|
137
|
+
- **CLI report type** (`cli.py`): Changed `report_data: dict[str, object]` to `dict[str, Any]` for correct iterable access.
|
|
138
|
+
- **Connector registration guard** (`cli.py`): Added `isinstance(connector_obj, ConnectorPlugin)` check for type-safe connector registration.
|
|
139
|
+
- **Unused imports** (`tests/`): Removed `PropertyMock`, `pytest`, `json`, `yaml` unused imports in test files.
|
|
140
|
+
- **TYPE_CHECKING import** (`tests/test_feedback/test_analyzer.py`): Moved `Path` import to `TYPE_CHECKING` block (TC003).
|
|
141
|
+
- **25 files reformatted** with `ruff format` for consistent code style.
|
|
142
|
+
|
|
143
|
+
## [0.2.0] - 2026-03-04
|
|
9
144
|
|
|
10
145
|
### Added
|
|
11
146
|
|
|
@@ -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'
|
|
@@ -75,7 +80,7 @@ intake processes requirements through a 5-phase pipeline:
|
|
|
75
80
|
2. **Analyze** — LLM extracts structured requirements, detects conflicts, deduplicates
|
|
76
81
|
3. **Generate** — Produce 6 spec files + `spec.lock.yaml`
|
|
77
82
|
4. **Verify** — Run executable acceptance checks against the implementation
|
|
78
|
-
5. **Export** — Generate agent-ready output (
|
|
83
|
+
5. **Export** — Generate agent-ready output (Claude Code, Cursor, Kiro, Copilot, architect, generic)
|
|
79
84
|
|
|
80
85
|
### The 6 Spec Files
|
|
81
86
|
|
|
@@ -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`.
|
|
@@ -132,6 +143,29 @@ intake init "Fix login bug" -s notes.txt --mode quick
|
|
|
132
143
|
# Fetch requirements from a URL
|
|
133
144
|
intake init "API review" -s https://wiki.company.com/rfc/auth
|
|
134
145
|
|
|
146
|
+
# Fetch from live APIs (requires credentials)
|
|
147
|
+
intake init "Sprint planning" -s jira://PROJ/sprint/42
|
|
148
|
+
intake init "Wiki review" -s confluence://SPACE/Page-Title
|
|
149
|
+
intake init "Bug triage" -s github://org/repo/issues?labels=bug
|
|
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
|
+
|
|
159
|
+
# Export for specific agents
|
|
160
|
+
intake init "Payments" -s reqs.pdf --format claude-code
|
|
161
|
+
intake export ./specs/auth -f cursor -o .
|
|
162
|
+
intake export ./specs/auth -f kiro -o .
|
|
163
|
+
intake export ./specs/auth -f copilot -o .
|
|
164
|
+
|
|
165
|
+
# Analyze verification failures and get fix suggestions
|
|
166
|
+
intake feedback ./specs/auth-oauth2
|
|
167
|
+
intake feedback ./specs/auth -r report.json --apply --agent-format claude-code
|
|
168
|
+
|
|
135
169
|
# List discovered plugins
|
|
136
170
|
intake plugins list
|
|
137
171
|
|
|
@@ -157,9 +191,44 @@ intake task update ./specs/auth-oauth2 1 done --note "Implemented and tested"
|
|
|
157
191
|
| URLs | `http://`, `https://` | Fetches page, converts HTML → Markdown |
|
|
158
192
|
| Slack export | `.json` (auto-detected) | Messages, threads, decisions, action items |
|
|
159
193
|
| GitHub Issues | `.json` (auto-detected) | Issues, labels, comments, cross-references |
|
|
194
|
+
| **Jira API** | `jira://PROJ-123` | Live issue fetching via REST API |
|
|
195
|
+
| **Confluence API** | `confluence://SPACE/Title` | Live page fetching via REST API |
|
|
196
|
+
| **GitHub API** | `github://org/repo/issues/42` | Live issue fetching via PyGithub |
|
|
160
197
|
|
|
161
198
|
Format is auto-detected by file extension and content inspection. Jira, Slack, and GitHub Issues JSON exports are distinguished automatically from generic JSON files. Confluence HTML is distinguished from generic HTML.
|
|
162
199
|
|
|
200
|
+
### Live API Connectors
|
|
201
|
+
|
|
202
|
+
Connect directly to project management tools (requires credentials):
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
# Jira: single issue, multiple, JQL, sprint
|
|
206
|
+
intake init "Sprint" -s jira://PROJ-123
|
|
207
|
+
intake init "Sprint" -s "jira://PROJ?jql=sprint=42"
|
|
208
|
+
|
|
209
|
+
# Confluence: page by ID, by space/title, CQL search
|
|
210
|
+
intake init "Docs" -s confluence://page/123456
|
|
211
|
+
intake init "Docs" -s confluence://SPACE/Page-Title
|
|
212
|
+
|
|
213
|
+
# GitHub: single/multiple issues, filtered queries
|
|
214
|
+
intake init "Bugs" -s github://org/repo/issues/42
|
|
215
|
+
intake init "Bugs" -s "github://org/repo/issues?labels=bug&state=open"
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Configure credentials in `.intake.yaml`:
|
|
219
|
+
|
|
220
|
+
```yaml
|
|
221
|
+
connectors:
|
|
222
|
+
jira:
|
|
223
|
+
url: https://your-org.atlassian.net
|
|
224
|
+
# Set JIRA_API_TOKEN and JIRA_EMAIL env vars
|
|
225
|
+
confluence:
|
|
226
|
+
url: https://your-org.atlassian.net/wiki
|
|
227
|
+
# Set CONFLUENCE_API_TOKEN and CONFLUENCE_EMAIL env vars
|
|
228
|
+
github:
|
|
229
|
+
# Set GITHUB_TOKEN env var
|
|
230
|
+
```
|
|
231
|
+
|
|
163
232
|
---
|
|
164
233
|
|
|
165
234
|
## Commands
|
|
@@ -175,10 +244,14 @@ Format is auto-detected by file extension and content inspection. Jira, Slack, a
|
|
|
175
244
|
| `intake diff` | Compare two spec versions | **Available** |
|
|
176
245
|
| `intake doctor` | Check environment and configuration health | **Available** |
|
|
177
246
|
| `intake doctor --fix` | Auto-fix environment issues (install deps, create config) | **Available** |
|
|
178
|
-
| `intake
|
|
247
|
+
| `intake feedback` | Analyze verification failures and suggest fixes | **Available** |
|
|
248
|
+
| `intake feedback --apply` | Auto-apply suggested spec amendments | **Available** |
|
|
249
|
+
| `intake plugins list` | List all discovered plugins (parsers, exporters, connectors) | **Available** |
|
|
179
250
|
| `intake plugins check` | Validate plugin compatibility | **Available** |
|
|
180
251
|
| `intake task list` | List tasks from a spec with current status | **Available** |
|
|
181
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** |
|
|
182
255
|
|
|
183
256
|
---
|
|
184
257
|
|
|
@@ -205,7 +278,34 @@ spec:
|
|
|
205
278
|
auto_mode: true # auto-detect quick/standard/enterprise
|
|
206
279
|
|
|
207
280
|
export:
|
|
208
|
-
default_format: generic # architect | claude-code | cursor | kiro | generic
|
|
281
|
+
default_format: generic # architect | claude-code | cursor | kiro | copilot | generic
|
|
282
|
+
|
|
283
|
+
feedback:
|
|
284
|
+
auto_amend_spec: false # Auto-apply spec amendments from feedback
|
|
285
|
+
max_suggestions: 10 # Max suggestions per analysis
|
|
286
|
+
include_code_snippets: true # Include code examples in suggestions
|
|
287
|
+
|
|
288
|
+
connectors:
|
|
289
|
+
jira:
|
|
290
|
+
url: https://your-org.atlassian.net
|
|
291
|
+
confluence:
|
|
292
|
+
url: https://your-org.atlassian.net/wiki
|
|
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"
|
|
209
309
|
```
|
|
210
310
|
|
|
211
311
|
### Presets
|
|
@@ -245,7 +345,7 @@ See the [`examples/`](examples/) directory for ready-to-run scenarios:
|
|
|
245
345
|
src/intake/
|
|
246
346
|
├── cli.py # Click CLI — thin adapter, no logic
|
|
247
347
|
├── config/ # Pydantic v2 models, presets, layered loader
|
|
248
|
-
│ ├── schema.py #
|
|
348
|
+
│ ├── schema.py # 11 config models (LLM, Project, Spec, Verification, Export, Security, Connectors, Feedback, MCP, Watch)
|
|
249
349
|
│ ├── presets.py # minimal / standard / enterprise presets
|
|
250
350
|
│ ├── loader.py # Layered merge: defaults → preset → YAML → CLI
|
|
251
351
|
│ └── defaults.py # Centralized constants
|
|
@@ -253,8 +353,11 @@ src/intake/
|
|
|
253
353
|
│ ├── protocols.py # V2 protocols: ParserPlugin, ExporterPlugin, ConnectorPlugin
|
|
254
354
|
│ ├── discovery.py # Entry point scanning via importlib.metadata
|
|
255
355
|
│ └── hooks.py # Pipeline hook system (HookManager)
|
|
256
|
-
├── connectors/ #
|
|
257
|
-
│
|
|
356
|
+
├── connectors/ # Live API connectors
|
|
357
|
+
│ ├── base.py # ConnectorRegistry, ConnectorError
|
|
358
|
+
│ ├── jira_api.py # Jira REST API (single/multi/JQL/sprint)
|
|
359
|
+
│ ├── confluence_api.py # Confluence REST API (page/space/CQL)
|
|
360
|
+
│ └── github_api.py # GitHub API via PyGithub (issues/filters)
|
|
258
361
|
├── ingest/ # Phase 1 — 11 parsers, registry, auto-detection
|
|
259
362
|
│ ├── base.py # ParsedContent dataclass + Parser Protocol
|
|
260
363
|
│ ├── registry.py # Auto-detection + plugin discovery + parser dispatch
|
|
@@ -287,24 +390,50 @@ src/intake/
|
|
|
287
390
|
├── verify/ # Phase 4 — Acceptance check engine
|
|
288
391
|
│ ├── engine.py # 4 check types: command, files_exist, pattern_*
|
|
289
392
|
│ └── reporter.py # Terminal (Rich), JSON, JUnit XML reporters
|
|
290
|
-
├── export/ # Phase 5 — Agent-ready output
|
|
393
|
+
├── export/ # Phase 5 — Agent-ready output (6 exporters)
|
|
291
394
|
│ ├── base.py # Exporter Protocol
|
|
292
395
|
│ ├── registry.py # Plugin discovery + format-based dispatch
|
|
396
|
+
│ ├── _helpers.py # Shared utilities (parse_tasks, load_checks, etc.)
|
|
397
|
+
│ ├── claude_code.py # CLAUDE.md + tasks + verify.sh
|
|
398
|
+
│ ├── cursor.py # .cursor/rules/intake-spec.mdc
|
|
399
|
+
│ ├── kiro.py # Kiro-native requirements/design/tasks
|
|
400
|
+
│ ├── copilot.py # .github/copilot-instructions.md
|
|
293
401
|
│ ├── architect.py # pipeline.yaml generation
|
|
294
402
|
│ └── generic.py # SPEC.md + verify.sh generation
|
|
295
403
|
├── diff/ # Spec comparison
|
|
296
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
|
|
414
|
+
├── feedback/ # Feedback loop (analyze failures, suggest fixes)
|
|
415
|
+
│ ├── analyzer.py # LLM-based failure analysis
|
|
416
|
+
│ ├── prompts.py # Feedback analysis prompt
|
|
417
|
+
│ ├── suggestions.py # Multi-format suggestion formatter
|
|
418
|
+
│ └── spec_updater.py # Preview + apply spec amendments
|
|
297
419
|
├── doctor/ # Environment health checks
|
|
298
|
-
│ └── checks.py # Python, API keys, deps, config validation
|
|
420
|
+
│ └── checks.py # Python, API keys, deps, connectors, config validation
|
|
299
421
|
├── llm/ # LiteLLM wrapper (used by analyze/ only)
|
|
300
422
|
│ └── adapter.py # Async completion, retry, cost tracking, budget
|
|
301
|
-
├── templates/ # Jinja2 templates
|
|
423
|
+
├── templates/ # Jinja2 templates (15 total)
|
|
302
424
|
│ ├── requirements.md.j2 # FR, NFR, conflicts, open questions
|
|
303
425
|
│ ├── design.md.j2 # Components, files, tech decisions
|
|
304
426
|
│ ├── tasks.md.j2 # Task summary + status + detailed sections
|
|
305
427
|
│ ├── acceptance.yaml.j2 # Executable acceptance checks
|
|
306
428
|
│ ├── context.md.j2 # Project context for agents
|
|
307
|
-
│
|
|
429
|
+
│ ├── sources.md.j2 # Source traceability mapping
|
|
430
|
+
│ ├── claude_md.j2 # Claude Code CLAUDE.md spec section
|
|
431
|
+
│ ├── claude_task.md.j2 # Claude Code per-task file
|
|
432
|
+
│ ├── verify_sh.j2 # Claude Code verification script
|
|
433
|
+
│ ├── cursor_rules.mdc.j2 # Cursor rules file
|
|
434
|
+
│ ├── kiro_*.md.j2 # Kiro requirements/design/tasks (3 files)
|
|
435
|
+
│ ├── copilot_instructions.md.j2 # Copilot instructions
|
|
436
|
+
│ └── feedback.md.j2 # Feedback results template
|
|
308
437
|
└── utils/ # Shared utilities
|
|
309
438
|
├── file_detect.py # Extension-based format detection
|
|
310
439
|
├── project_detect.py # Auto-detect tech stack from project files
|
|
@@ -317,7 +446,7 @@ src/intake/
|
|
|
317
446
|
**Key design principles:**
|
|
318
447
|
|
|
319
448
|
- **Protocol over ABC** — All extension points use `typing.Protocol`
|
|
320
|
-
- **Plugin-first architecture** — Parsers and
|
|
449
|
+
- **Plugin-first architecture** — Parsers, exporters, and connectors discovered via entry points, manual fallback
|
|
321
450
|
- **Dataclasses for pipeline data, Pydantic for config** — Never mixed
|
|
322
451
|
- **Async only in analyze/** — Everything else is synchronous
|
|
323
452
|
- **Offline mode** — Parsing, verification, export, diff, doctor all work without LLM
|
|
@@ -340,7 +469,84 @@ architect pipeline specs/auth-system/pipeline.yaml
|
|
|
340
469
|
|
|
341
470
|
```bash
|
|
342
471
|
intake init "Payments" -s reqs.pdf --format claude-code
|
|
343
|
-
# Generates CLAUDE.md + tasks + verify.sh
|
|
472
|
+
# Generates CLAUDE.md + .intake/tasks/ + .intake/verify.sh + .intake/spec-summary.md
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
### With Cursor
|
|
476
|
+
|
|
477
|
+
```bash
|
|
478
|
+
intake export ./specs/auth -f cursor -o .
|
|
479
|
+
# Generates .cursor/rules/intake-spec.mdc (auto-loaded by Cursor)
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
### With Kiro
|
|
483
|
+
|
|
484
|
+
```bash
|
|
485
|
+
intake export ./specs/auth -f kiro -o .
|
|
486
|
+
# Generates requirements.md, design.md, tasks.md in Kiro native format
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### With GitHub Copilot
|
|
490
|
+
|
|
491
|
+
```bash
|
|
492
|
+
intake export ./specs/auth -f copilot -o .
|
|
493
|
+
# Generates .github/copilot-instructions.md (auto-loaded by Copilot)
|
|
494
|
+
```
|
|
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
|
+
|
|
539
|
+
### Feedback Loop
|
|
540
|
+
|
|
541
|
+
```bash
|
|
542
|
+
# Analyze why verification checks failed and get fix suggestions
|
|
543
|
+
intake feedback ./specs/auth-oauth2
|
|
544
|
+
|
|
545
|
+
# Use a previous report and auto-apply spec amendments
|
|
546
|
+
intake feedback ./specs/auth -r report.json --apply
|
|
547
|
+
|
|
548
|
+
# Get suggestions formatted for your agent
|
|
549
|
+
intake feedback ./specs/auth --agent-format claude-code
|
|
344
550
|
```
|
|
345
551
|
|
|
346
552
|
### With CI/CD
|
|
@@ -374,7 +580,7 @@ ruff format src/ tests/
|
|
|
374
580
|
mypy src/ --strict
|
|
375
581
|
```
|
|
376
582
|
|
|
377
|
-
Current test suite: **
|
|
583
|
+
Current test suite: **772 tests**, **0 mypy --strict errors**, **0 ruff warnings**.
|
|
378
584
|
|
|
379
585
|
### Implementation Status
|
|
380
586
|
|
|
@@ -384,12 +590,15 @@ Current test suite: **492 tests**, **86% coverage**, **0 mypy --strict errors**,
|
|
|
384
590
|
| Phase 2 — Analyze | `analyze/` (orchestrator + 7 sub-modules + complexity) | Implemented |
|
|
385
591
|
| Phase 3 — Generate | `generate/` (spec builder + adaptive builder + 6 templates + lock) | Implemented |
|
|
386
592
|
| Phase 4 — Verify | `verify/` (engine + 3 reporters) | Implemented |
|
|
387
|
-
| Phase 5 — Export | `export/` (
|
|
593
|
+
| Phase 5 — Export | `export/` (6 exporters: claude-code, cursor, kiro, copilot, architect, generic) | Implemented |
|
|
388
594
|
| Plugins | `plugins/` (protocols + discovery + hooks) | Implemented |
|
|
389
|
-
| Connectors | `connectors/` (
|
|
595
|
+
| Connectors | `connectors/` (Jira, Confluence, GitHub API connectors) | Implemented |
|
|
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 |
|
|
390
599
|
| Standalone | `doctor/`, `config/`, `llm/`, `utils/` | Implemented |
|
|
391
600
|
| Standalone | `diff/` (spec differ) | Implemented |
|
|
392
|
-
| CLI |
|
|
601
|
+
| CLI | 19 commands/subcommands wired end-to-end | Implemented |
|
|
393
602
|
|
|
394
603
|
---
|
|
395
604
|
|