intake-ai-cli 0.2.0__tar.gz → 0.3.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.3.0}/CHANGELOG.md +67 -1
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/PKG-INFO +136 -17
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/README.md +135 -16
- intake_ai_cli-0.3.0/SECURITY.md +379 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/SEGUIMIENTO-V0.md +251 -1
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/README.md +41 -7
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/arquitectura.md +53 -15
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/buenas-practicas.md +8 -0
- intake_ai_cli-0.3.0/docs/conectores.md +278 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/configuracion.md +99 -23
- intake_ai_cli-0.3.0/docs/despliegue.md +306 -0
- intake_ai_cli-0.3.0/docs/exportacion.md +462 -0
- intake_ai_cli-0.3.0/docs/feedback.md +230 -0
- intake_ai_cli-0.3.0/docs/flujos-trabajo.md +445 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/formatos-entrada.md +75 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/github-notes/v0.1.0.md +9 -9
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/github-notes/v0.2.0.md +36 -54
- intake_ai_cli-0.3.0/docs/github-notes/v0.3.0.md +442 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/guia-cli.md +82 -7
- intake_ai_cli-0.3.0/docs/integracion-cicd.md +537 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/pipeline.md +63 -2
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/plugins.md +19 -7
- intake_ai_cli-0.3.0/docs/seguridad.md +366 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/solucion-problemas.md +51 -9
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/pyproject.toml +8 -1
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/__init__.py +1 -1
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/cli.py +270 -18
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/config/schema.py +64 -16
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/connectors/__init__.py +6 -0
- intake_ai_cli-0.3.0/src/intake/connectors/confluence_api.py +254 -0
- intake_ai_cli-0.3.0/src/intake/connectors/github_api.py +271 -0
- intake_ai_cli-0.3.0/src/intake/connectors/jira_api.py +237 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/doctor/checks.py +115 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/export/__init__.py +10 -5
- intake_ai_cli-0.3.0/src/intake/export/_helpers.py +152 -0
- intake_ai_cli-0.3.0/src/intake/export/claude_code.py +326 -0
- intake_ai_cli-0.3.0/src/intake/export/copilot.py +157 -0
- intake_ai_cli-0.3.0/src/intake/export/cursor.py +158 -0
- intake_ai_cli-0.3.0/src/intake/export/kiro.py +271 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/export/registry.py +20 -6
- intake_ai_cli-0.3.0/src/intake/feedback/__init__.py +39 -0
- intake_ai_cli-0.3.0/src/intake/feedback/analyzer.py +309 -0
- intake_ai_cli-0.3.0/src/intake/feedback/prompts.py +60 -0
- intake_ai_cli-0.3.0/src/intake/feedback/spec_updater.py +324 -0
- intake_ai_cli-0.3.0/src/intake/feedback/suggestions.py +109 -0
- intake_ai_cli-0.3.0/src/intake/templates/claude_md.j2 +38 -0
- intake_ai_cli-0.3.0/src/intake/templates/claude_task.md.j2 +22 -0
- intake_ai_cli-0.3.0/src/intake/templates/copilot_instructions.md.j2 +43 -0
- intake_ai_cli-0.3.0/src/intake/templates/cursor_rules.mdc.j2 +47 -0
- intake_ai_cli-0.3.0/src/intake/templates/feedback.md.j2 +47 -0
- intake_ai_cli-0.3.0/src/intake/templates/kiro_design.md.j2 +9 -0
- intake_ai_cli-0.3.0/src/intake/templates/kiro_requirements.md.j2 +19 -0
- intake_ai_cli-0.3.0/src/intake/templates/kiro_tasks.md.j2 +22 -0
- intake_ai_cli-0.3.0/src/intake/templates/verify_sh.j2 +39 -0
- intake_ai_cli-0.3.0/tests/fixtures/confluence_api_response.json +19 -0
- intake_ai_cli-0.3.0/tests/fixtures/jira_api_response.json +32 -0
- intake_ai_cli-0.3.0/tests/fixtures/verify_report_failed.json +44 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_cli.py +138 -1
- intake_ai_cli-0.3.0/tests/test_config/test_schema.py +154 -0
- intake_ai_cli-0.3.0/tests/test_connectors/test_confluence_api.py +181 -0
- intake_ai_cli-0.3.0/tests/test_connectors/test_github_api.py +206 -0
- intake_ai_cli-0.3.0/tests/test_connectors/test_jira_api.py +258 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_doctor/test_checks.py +105 -0
- intake_ai_cli-0.3.0/tests/test_export/test_claude_code.py +259 -0
- intake_ai_cli-0.3.0/tests/test_export/test_copilot.py +191 -0
- intake_ai_cli-0.3.0/tests/test_export/test_cursor.py +145 -0
- intake_ai_cli-0.3.0/tests/test_export/test_helpers.py +125 -0
- intake_ai_cli-0.3.0/tests/test_export/test_kiro.py +207 -0
- intake_ai_cli-0.3.0/tests/test_export/test_protocol_conformance.py +138 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_export/test_registry.py +8 -1
- intake_ai_cli-0.3.0/tests/test_feedback/__init__.py +1 -0
- intake_ai_cli-0.3.0/tests/test_feedback/test_analyzer.py +275 -0
- intake_ai_cli-0.3.0/tests/test_feedback/test_spec_updater.py +188 -0
- intake_ai_cli-0.3.0/tests/test_feedback/test_suggestions.py +116 -0
- intake_ai_cli-0.2.0/docs/exportacion.md +0 -236
- intake_ai_cli-0.2.0/tests/test_config/test_schema.py +0 -66
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/.gitignore +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/.intake.yaml.example +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/LICENSE +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/docs/verificacion.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/examples/from-jira/README.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/examples/from-jira/jira-export.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/examples/from-markdown/README.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/examples/from-markdown/requirements.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/examples/from-scratch/README.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/examples/from-scratch/idea.txt +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/examples/multi-source/README.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/examples/multi-source/api-decisions.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/examples/multi-source/notes.txt +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/examples/multi-source/user-stories.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/__main__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/analyzer.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/complexity.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/conflicts.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/dedup.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/design.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/extraction.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/models.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/prompts.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/questions.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/analyze/risks.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/config/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/config/defaults.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/config/loader.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/config/presets.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/connectors/base.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/diff/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/diff/differ.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/doctor/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/export/architect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/export/base.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/export/generic.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/generate/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/generate/adaptive.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/generate/lock.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/generate/spec_builder.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/base.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/confluence.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/docx.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/github_issues.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/image.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/jira.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/markdown.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/pdf.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/plaintext.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/registry.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/slack.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/url.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/ingest/yaml_input.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/llm/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/llm/adapter.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/plugins/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/plugins/discovery.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/plugins/hooks.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/plugins/protocols.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/templates/acceptance.yaml.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/templates/context.md.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/templates/design.md.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/templates/requirements.md.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/templates/sources.md.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/templates/tasks.md.j2 +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/utils/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/utils/cost.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/utils/file_detect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/utils/logging.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/utils/project_detect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/utils/source_uri.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/utils/task_state.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/verify/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/verify/engine.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/src/intake/verify/reporter.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/conftest.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/fixtures/confluence_page.html +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/fixtures/github_issues.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/fixtures/jira_export.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/fixtures/jira_export_multi.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/fixtures/sample_webpage.html +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/fixtures/simple_spec.md +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/fixtures/slack_export.json +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/fixtures/slack_thread.txt +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/fixtures/structured_reqs.yaml +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/fixtures/wireframe.png +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_analyze/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_analyzer.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_complexity.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_conflicts.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_dedup.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_design.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_extraction.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_llm_adapter.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_risks.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_config/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_config/test_loader.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_config/test_presets.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_connectors/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_connectors/test_base.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_diff/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_diff/test_differ.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_doctor/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_export/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_export/test_architect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_export/test_generic.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_generate/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_generate/test_adaptive.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_generate/test_lock.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_generate/test_spec_builder.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_confluence.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_github_issues.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_hardening.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_image.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_jira.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_markdown.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_plaintext.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_registry.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_slack.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_url.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_yaml_input.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_plugins/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_plugins/test_discovery.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_plugins/test_hooks.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_plugins/test_protocols.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_utils/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_utils/test_cost.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_utils/test_file_detect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_utils/test_project_detect.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_utils/test_source_uri.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_utils/test_task_state.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_verify/__init__.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_verify/test_engine.py +0 -0
- {intake_ai_cli-0.2.0 → intake_ai_cli-0.3.0}/tests/test_verify/test_reporter.py +0 -0
|
@@ -5,7 +5,73 @@ 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.3.0] - 2026-03-04
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
#### 3 API connectors (live data fetching)
|
|
13
|
+
|
|
14
|
+
- **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`.
|
|
15
|
+
- **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`.
|
|
16
|
+
- **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.
|
|
17
|
+
- **Doctor connector checks** (`doctor/checks.py`): `_check_connectors()` validates connector credentials when connectors are configured.
|
|
18
|
+
- **3 connector entry points** in `pyproject.toml`: `jira`, `confluence`, `github` under `[project.entry-points."intake.connectors"]`.
|
|
19
|
+
|
|
20
|
+
#### 4 new exporters (6 total)
|
|
21
|
+
|
|
22
|
+
- **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.
|
|
23
|
+
- **Cursor exporter** (`export/cursor.py`): Generates `.cursor/rules/intake-spec.mdc` with YAML frontmatter.
|
|
24
|
+
- **Kiro exporter** (`export/kiro.py`): Generates `requirements.md`, `design.md`, `tasks.md` in Kiro's native format.
|
|
25
|
+
- **Copilot exporter** (`export/copilot.py`): Generates `.github/copilot-instructions.md`.
|
|
26
|
+
- All 4 exporters implement the **V2 ExporterPlugin protocol**: `meta`, `supported_agents`, `export() → ExportResult`.
|
|
27
|
+
- **Shared export helpers** (`export/_helpers.py`): `read_spec_file()`, `parse_tasks()`, `load_acceptance_checks()`, `summarize_content()`, `count_requirements()`.
|
|
28
|
+
- **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`.
|
|
29
|
+
|
|
30
|
+
#### Feedback loop (analyze verification failures)
|
|
31
|
+
|
|
32
|
+
- **Feedback analyzer** (`feedback/analyzer.py`): LLM-based failure analysis with root cause identification, severity classification, and spec amendments. Dataclasses: `SpecAmendment`, `FailureAnalysis`, `FeedbackResult`.
|
|
33
|
+
- **Feedback prompts** (`feedback/prompts.py`): Analysis prompt with `{language}` placeholder and structured JSON output schema.
|
|
34
|
+
- **Suggestion formatter** (`feedback/suggestions.py`): Terminal output (Rich) + agent-specific formatting (generic, claude-code, cursor).
|
|
35
|
+
- **Spec updater** (`feedback/spec_updater.py`): Preview and apply spec amendments with add/modify/remove actions.
|
|
36
|
+
- **`intake feedback` CLI command**: Options `--verify-report`, `--project-dir`, `--apply`, `--agent-format`, `--verbose`.
|
|
37
|
+
|
|
38
|
+
#### Configuration updates
|
|
39
|
+
|
|
40
|
+
- **`FeedbackConfig`** model: `auto_amend_spec`, `max_suggestions`, `include_code_snippets`.
|
|
41
|
+
- **Expanded connector configs**: `JiraConfig` (auth_type, fields, max_comments), `ConfluenceConfig` (include_child_pages, max_depth), `GithubConfig` (default_repo).
|
|
42
|
+
- **`ExportConfig`** expanded: `claude_code_task_dir`, `cursor_rules_dir`.
|
|
43
|
+
|
|
44
|
+
#### Enterprise documentation
|
|
45
|
+
|
|
46
|
+
- **`docs/seguridad.md`** (NEW): Threat model, data flow, secrets management, redaction patterns, offline/air-gapped mode, audit trail, compliance (SOC2/HIPAA/ISO 27001/GDPR).
|
|
47
|
+
- **`docs/despliegue.md`** (NEW): Docker multi-stage, docker-compose, pre-commit hooks, deployment patterns, env vars.
|
|
48
|
+
- **`docs/integracion-cicd.md`** (NEW): GitHub Actions, GitLab CI, Jenkins, Azure DevOps, JUnit/JSON reports, spec drift, notifications.
|
|
49
|
+
- **`docs/flujos-trabajo.md`** (NEW): Solo developer, small team, enterprise, monorepo, AI agent, regulated industries.
|
|
50
|
+
- **`docs/conectores.md`** (NEW): Jira, Confluence, GitHub API connectors documentation.
|
|
51
|
+
- **`docs/feedback.md`** (NEW): Feedback loop usage, severity levels, spec amendments, agent formats.
|
|
52
|
+
- **`SECURITY.md`** (NEW): English security policy at project root (GitHub Security tab).
|
|
53
|
+
- 10 existing documentation files updated with Phase 2 content.
|
|
54
|
+
|
|
55
|
+
#### Test suite
|
|
56
|
+
|
|
57
|
+
- **673 tests** (up from 492), **0 failures**. 181 new tests added.
|
|
58
|
+
- 14 new test files covering connectors, exporters, feedback, and protocol conformance.
|
|
59
|
+
- Protocol conformance tests: 20 parametrized tests for V2 exporters + 3 for connectors.
|
|
60
|
+
|
|
61
|
+
### Fixed
|
|
62
|
+
|
|
63
|
+
#### QA Audit (14 mypy errors, 7 ruff errors, 25 format issues)
|
|
64
|
+
|
|
65
|
+
- **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`.
|
|
66
|
+
- **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.
|
|
67
|
+
- **Unused `type: ignore` comments**: Removed 3 stale `# type: ignore[import-untyped]` from connectors after `atlassian-python-api` and `PyGithub` gained type stubs.
|
|
68
|
+
- **CLI report type** (`cli.py`): Changed `report_data: dict[str, object]` to `dict[str, Any]` for correct iterable access.
|
|
69
|
+
- **Connector registration guard** (`cli.py`): Added `isinstance(connector_obj, ConnectorPlugin)` check for type-safe connector registration.
|
|
70
|
+
- **Unused imports** (`tests/`): Removed `PropertyMock`, `pytest`, `json`, `yaml` unused imports in test files.
|
|
71
|
+
- **TYPE_CHECKING import** (`tests/test_feedback/test_analyzer.py`): Moved `Path` import to `TYPE_CHECKING` block (TC003).
|
|
72
|
+
- **25 files reformatted** with `ruff format` for consistent code style.
|
|
73
|
+
|
|
74
|
+
## [0.2.0] - 2026-03-04
|
|
9
75
|
|
|
10
76
|
### Added
|
|
11
77
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: intake-ai-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.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
|
|
@@ -75,7 +75,7 @@ intake processes requirements through a 5-phase pipeline:
|
|
|
75
75
|
2. **Analyze** — LLM extracts structured requirements, detects conflicts, deduplicates
|
|
76
76
|
3. **Generate** — Produce 6 spec files + `spec.lock.yaml`
|
|
77
77
|
4. **Verify** — Run executable acceptance checks against the implementation
|
|
78
|
-
5. **Export** — Generate agent-ready output (
|
|
78
|
+
5. **Export** — Generate agent-ready output (Claude Code, Cursor, Kiro, Copilot, architect, generic)
|
|
79
79
|
|
|
80
80
|
### The 6 Spec Files
|
|
81
81
|
|
|
@@ -132,6 +132,21 @@ intake init "Fix login bug" -s notes.txt --mode quick
|
|
|
132
132
|
# Fetch requirements from a URL
|
|
133
133
|
intake init "API review" -s https://wiki.company.com/rfc/auth
|
|
134
134
|
|
|
135
|
+
# Fetch from live APIs (requires credentials)
|
|
136
|
+
intake init "Sprint planning" -s jira://PROJ/sprint/42
|
|
137
|
+
intake init "Wiki review" -s confluence://SPACE/Page-Title
|
|
138
|
+
intake init "Bug triage" -s github://org/repo/issues?labels=bug
|
|
139
|
+
|
|
140
|
+
# Export for specific agents
|
|
141
|
+
intake init "Payments" -s reqs.pdf --format claude-code
|
|
142
|
+
intake export ./specs/auth -f cursor -o .
|
|
143
|
+
intake export ./specs/auth -f kiro -o .
|
|
144
|
+
intake export ./specs/auth -f copilot -o .
|
|
145
|
+
|
|
146
|
+
# Analyze verification failures and get fix suggestions
|
|
147
|
+
intake feedback ./specs/auth-oauth2
|
|
148
|
+
intake feedback ./specs/auth -r report.json --apply --agent-format claude-code
|
|
149
|
+
|
|
135
150
|
# List discovered plugins
|
|
136
151
|
intake plugins list
|
|
137
152
|
|
|
@@ -157,9 +172,44 @@ intake task update ./specs/auth-oauth2 1 done --note "Implemented and tested"
|
|
|
157
172
|
| URLs | `http://`, `https://` | Fetches page, converts HTML → Markdown |
|
|
158
173
|
| Slack export | `.json` (auto-detected) | Messages, threads, decisions, action items |
|
|
159
174
|
| GitHub Issues | `.json` (auto-detected) | Issues, labels, comments, cross-references |
|
|
175
|
+
| **Jira API** | `jira://PROJ-123` | Live issue fetching via REST API |
|
|
176
|
+
| **Confluence API** | `confluence://SPACE/Title` | Live page fetching via REST API |
|
|
177
|
+
| **GitHub API** | `github://org/repo/issues/42` | Live issue fetching via PyGithub |
|
|
160
178
|
|
|
161
179
|
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
180
|
|
|
181
|
+
### Live API Connectors
|
|
182
|
+
|
|
183
|
+
Connect directly to project management tools (requires credentials):
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# Jira: single issue, multiple, JQL, sprint
|
|
187
|
+
intake init "Sprint" -s jira://PROJ-123
|
|
188
|
+
intake init "Sprint" -s "jira://PROJ?jql=sprint=42"
|
|
189
|
+
|
|
190
|
+
# Confluence: page by ID, by space/title, CQL search
|
|
191
|
+
intake init "Docs" -s confluence://page/123456
|
|
192
|
+
intake init "Docs" -s confluence://SPACE/Page-Title
|
|
193
|
+
|
|
194
|
+
# GitHub: single/multiple issues, filtered queries
|
|
195
|
+
intake init "Bugs" -s github://org/repo/issues/42
|
|
196
|
+
intake init "Bugs" -s "github://org/repo/issues?labels=bug&state=open"
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Configure credentials in `.intake.yaml`:
|
|
200
|
+
|
|
201
|
+
```yaml
|
|
202
|
+
connectors:
|
|
203
|
+
jira:
|
|
204
|
+
url: https://your-org.atlassian.net
|
|
205
|
+
# Set JIRA_API_TOKEN and JIRA_EMAIL env vars
|
|
206
|
+
confluence:
|
|
207
|
+
url: https://your-org.atlassian.net/wiki
|
|
208
|
+
# Set CONFLUENCE_API_TOKEN and CONFLUENCE_EMAIL env vars
|
|
209
|
+
github:
|
|
210
|
+
# Set GITHUB_TOKEN env var
|
|
211
|
+
```
|
|
212
|
+
|
|
163
213
|
---
|
|
164
214
|
|
|
165
215
|
## Commands
|
|
@@ -175,7 +225,9 @@ Format is auto-detected by file extension and content inspection. Jira, Slack, a
|
|
|
175
225
|
| `intake diff` | Compare two spec versions | **Available** |
|
|
176
226
|
| `intake doctor` | Check environment and configuration health | **Available** |
|
|
177
227
|
| `intake doctor --fix` | Auto-fix environment issues (install deps, create config) | **Available** |
|
|
178
|
-
| `intake
|
|
228
|
+
| `intake feedback` | Analyze verification failures and suggest fixes | **Available** |
|
|
229
|
+
| `intake feedback --apply` | Auto-apply suggested spec amendments | **Available** |
|
|
230
|
+
| `intake plugins list` | List all discovered plugins (parsers, exporters, connectors) | **Available** |
|
|
179
231
|
| `intake plugins check` | Validate plugin compatibility | **Available** |
|
|
180
232
|
| `intake task list` | List tasks from a spec with current status | **Available** |
|
|
181
233
|
| `intake task update` | Update a task's status (pending/in_progress/done/blocked) | **Available** |
|
|
@@ -205,7 +257,19 @@ spec:
|
|
|
205
257
|
auto_mode: true # auto-detect quick/standard/enterprise
|
|
206
258
|
|
|
207
259
|
export:
|
|
208
|
-
default_format: generic # architect | claude-code | cursor | kiro | generic
|
|
260
|
+
default_format: generic # architect | claude-code | cursor | kiro | copilot | generic
|
|
261
|
+
|
|
262
|
+
feedback:
|
|
263
|
+
auto_amend_spec: false # Auto-apply spec amendments from feedback
|
|
264
|
+
max_suggestions: 10 # Max suggestions per analysis
|
|
265
|
+
include_code_snippets: true # Include code examples in suggestions
|
|
266
|
+
|
|
267
|
+
connectors:
|
|
268
|
+
jira:
|
|
269
|
+
url: https://your-org.atlassian.net
|
|
270
|
+
confluence:
|
|
271
|
+
url: https://your-org.atlassian.net/wiki
|
|
272
|
+
github: {} # Uses GITHUB_TOKEN env var
|
|
209
273
|
```
|
|
210
274
|
|
|
211
275
|
### Presets
|
|
@@ -245,7 +309,7 @@ See the [`examples/`](examples/) directory for ready-to-run scenarios:
|
|
|
245
309
|
src/intake/
|
|
246
310
|
├── cli.py # Click CLI — thin adapter, no logic
|
|
247
311
|
├── config/ # Pydantic v2 models, presets, layered loader
|
|
248
|
-
│ ├── schema.py #
|
|
312
|
+
│ ├── schema.py # 9 config models (LLM, Project, Spec, Verification, Export, Security, Connectors, Feedback)
|
|
249
313
|
│ ├── presets.py # minimal / standard / enterprise presets
|
|
250
314
|
│ ├── loader.py # Layered merge: defaults → preset → YAML → CLI
|
|
251
315
|
│ └── defaults.py # Centralized constants
|
|
@@ -253,8 +317,11 @@ src/intake/
|
|
|
253
317
|
│ ├── protocols.py # V2 protocols: ParserPlugin, ExporterPlugin, ConnectorPlugin
|
|
254
318
|
│ ├── discovery.py # Entry point scanning via importlib.metadata
|
|
255
319
|
│ └── hooks.py # Pipeline hook system (HookManager)
|
|
256
|
-
├── connectors/ #
|
|
257
|
-
│
|
|
320
|
+
├── connectors/ # Live API connectors
|
|
321
|
+
│ ├── base.py # ConnectorRegistry, ConnectorError
|
|
322
|
+
│ ├── jira_api.py # Jira REST API (single/multi/JQL/sprint)
|
|
323
|
+
│ ├── confluence_api.py # Confluence REST API (page/space/CQL)
|
|
324
|
+
│ └── github_api.py # GitHub API via PyGithub (issues/filters)
|
|
258
325
|
├── ingest/ # Phase 1 — 11 parsers, registry, auto-detection
|
|
259
326
|
│ ├── base.py # ParsedContent dataclass + Parser Protocol
|
|
260
327
|
│ ├── registry.py # Auto-detection + plugin discovery + parser dispatch
|
|
@@ -287,24 +354,41 @@ src/intake/
|
|
|
287
354
|
├── verify/ # Phase 4 — Acceptance check engine
|
|
288
355
|
│ ├── engine.py # 4 check types: command, files_exist, pattern_*
|
|
289
356
|
│ └── reporter.py # Terminal (Rich), JSON, JUnit XML reporters
|
|
290
|
-
├── export/ # Phase 5 — Agent-ready output
|
|
357
|
+
├── export/ # Phase 5 — Agent-ready output (6 exporters)
|
|
291
358
|
│ ├── base.py # Exporter Protocol
|
|
292
359
|
│ ├── registry.py # Plugin discovery + format-based dispatch
|
|
360
|
+
│ ├── _helpers.py # Shared utilities (parse_tasks, load_checks, etc.)
|
|
361
|
+
│ ├── claude_code.py # CLAUDE.md + tasks + verify.sh
|
|
362
|
+
│ ├── cursor.py # .cursor/rules/intake-spec.mdc
|
|
363
|
+
│ ├── kiro.py # Kiro-native requirements/design/tasks
|
|
364
|
+
│ ├── copilot.py # .github/copilot-instructions.md
|
|
293
365
|
│ ├── architect.py # pipeline.yaml generation
|
|
294
366
|
│ └── generic.py # SPEC.md + verify.sh generation
|
|
295
367
|
├── diff/ # Spec comparison
|
|
296
368
|
│ └── differ.py # Compare two specs by requirement/task IDs
|
|
369
|
+
├── feedback/ # Feedback loop (analyze failures, suggest fixes)
|
|
370
|
+
│ ├── analyzer.py # LLM-based failure analysis
|
|
371
|
+
│ ├── prompts.py # Feedback analysis prompt
|
|
372
|
+
│ ├── suggestions.py # Multi-format suggestion formatter
|
|
373
|
+
│ └── spec_updater.py # Preview + apply spec amendments
|
|
297
374
|
├── doctor/ # Environment health checks
|
|
298
|
-
│ └── checks.py # Python, API keys, deps, config validation
|
|
375
|
+
│ └── checks.py # Python, API keys, deps, connectors, config validation
|
|
299
376
|
├── llm/ # LiteLLM wrapper (used by analyze/ only)
|
|
300
377
|
│ └── adapter.py # Async completion, retry, cost tracking, budget
|
|
301
|
-
├── templates/ # Jinja2 templates
|
|
378
|
+
├── templates/ # Jinja2 templates (15 total)
|
|
302
379
|
│ ├── requirements.md.j2 # FR, NFR, conflicts, open questions
|
|
303
380
|
│ ├── design.md.j2 # Components, files, tech decisions
|
|
304
381
|
│ ├── tasks.md.j2 # Task summary + status + detailed sections
|
|
305
382
|
│ ├── acceptance.yaml.j2 # Executable acceptance checks
|
|
306
383
|
│ ├── context.md.j2 # Project context for agents
|
|
307
|
-
│
|
|
384
|
+
│ ├── sources.md.j2 # Source traceability mapping
|
|
385
|
+
│ ├── claude_md.j2 # Claude Code CLAUDE.md spec section
|
|
386
|
+
│ ├── claude_task.md.j2 # Claude Code per-task file
|
|
387
|
+
│ ├── verify_sh.j2 # Claude Code verification script
|
|
388
|
+
│ ├── cursor_rules.mdc.j2 # Cursor rules file
|
|
389
|
+
│ ├── kiro_*.md.j2 # Kiro requirements/design/tasks (3 files)
|
|
390
|
+
│ ├── copilot_instructions.md.j2 # Copilot instructions
|
|
391
|
+
│ └── feedback.md.j2 # Feedback results template
|
|
308
392
|
└── utils/ # Shared utilities
|
|
309
393
|
├── file_detect.py # Extension-based format detection
|
|
310
394
|
├── project_detect.py # Auto-detect tech stack from project files
|
|
@@ -317,7 +401,7 @@ src/intake/
|
|
|
317
401
|
**Key design principles:**
|
|
318
402
|
|
|
319
403
|
- **Protocol over ABC** — All extension points use `typing.Protocol`
|
|
320
|
-
- **Plugin-first architecture** — Parsers and
|
|
404
|
+
- **Plugin-first architecture** — Parsers, exporters, and connectors discovered via entry points, manual fallback
|
|
321
405
|
- **Dataclasses for pipeline data, Pydantic for config** — Never mixed
|
|
322
406
|
- **Async only in analyze/** — Everything else is synchronous
|
|
323
407
|
- **Offline mode** — Parsing, verification, export, diff, doctor all work without LLM
|
|
@@ -340,7 +424,41 @@ architect pipeline specs/auth-system/pipeline.yaml
|
|
|
340
424
|
|
|
341
425
|
```bash
|
|
342
426
|
intake init "Payments" -s reqs.pdf --format claude-code
|
|
343
|
-
# Generates CLAUDE.md + tasks + verify.sh
|
|
427
|
+
# Generates CLAUDE.md + .intake/tasks/ + .intake/verify.sh + .intake/spec-summary.md
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### With Cursor
|
|
431
|
+
|
|
432
|
+
```bash
|
|
433
|
+
intake export ./specs/auth -f cursor -o .
|
|
434
|
+
# Generates .cursor/rules/intake-spec.mdc (auto-loaded by Cursor)
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### With Kiro
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
intake export ./specs/auth -f kiro -o .
|
|
441
|
+
# Generates requirements.md, design.md, tasks.md in Kiro native format
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### With GitHub Copilot
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
intake export ./specs/auth -f copilot -o .
|
|
448
|
+
# Generates .github/copilot-instructions.md (auto-loaded by Copilot)
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Feedback Loop
|
|
452
|
+
|
|
453
|
+
```bash
|
|
454
|
+
# Analyze why verification checks failed and get fix suggestions
|
|
455
|
+
intake feedback ./specs/auth-oauth2
|
|
456
|
+
|
|
457
|
+
# Use a previous report and auto-apply spec amendments
|
|
458
|
+
intake feedback ./specs/auth -r report.json --apply
|
|
459
|
+
|
|
460
|
+
# Get suggestions formatted for your agent
|
|
461
|
+
intake feedback ./specs/auth --agent-format claude-code
|
|
344
462
|
```
|
|
345
463
|
|
|
346
464
|
### With CI/CD
|
|
@@ -374,7 +492,7 @@ ruff format src/ tests/
|
|
|
374
492
|
mypy src/ --strict
|
|
375
493
|
```
|
|
376
494
|
|
|
377
|
-
Current test suite: **
|
|
495
|
+
Current test suite: **673 tests**, **0 mypy --strict errors**, **0 ruff warnings**.
|
|
378
496
|
|
|
379
497
|
### Implementation Status
|
|
380
498
|
|
|
@@ -384,12 +502,13 @@ Current test suite: **492 tests**, **86% coverage**, **0 mypy --strict errors**,
|
|
|
384
502
|
| Phase 2 — Analyze | `analyze/` (orchestrator + 7 sub-modules + complexity) | Implemented |
|
|
385
503
|
| Phase 3 — Generate | `generate/` (spec builder + adaptive builder + 6 templates + lock) | Implemented |
|
|
386
504
|
| Phase 4 — Verify | `verify/` (engine + 3 reporters) | Implemented |
|
|
387
|
-
| Phase 5 — Export | `export/` (
|
|
505
|
+
| Phase 5 — Export | `export/` (6 exporters: claude-code, cursor, kiro, copilot, architect, generic) | Implemented |
|
|
388
506
|
| Plugins | `plugins/` (protocols + discovery + hooks) | Implemented |
|
|
389
|
-
| Connectors | `connectors/` (
|
|
507
|
+
| Connectors | `connectors/` (Jira, Confluence, GitHub API connectors) | Implemented |
|
|
508
|
+
| Feedback | `feedback/` (analyzer + suggestions + spec updater) | Implemented |
|
|
390
509
|
| Standalone | `doctor/`, `config/`, `llm/`, `utils/` | Implemented |
|
|
391
510
|
| Standalone | `diff/` (spec differ) | Implemented |
|
|
392
|
-
| CLI |
|
|
511
|
+
| CLI | 15 commands/subcommands wired end-to-end | Implemented |
|
|
393
512
|
|
|
394
513
|
---
|
|
395
514
|
|
|
@@ -27,7 +27,7 @@ intake processes requirements through a 5-phase pipeline:
|
|
|
27
27
|
2. **Analyze** — LLM extracts structured requirements, detects conflicts, deduplicates
|
|
28
28
|
3. **Generate** — Produce 6 spec files + `spec.lock.yaml`
|
|
29
29
|
4. **Verify** — Run executable acceptance checks against the implementation
|
|
30
|
-
5. **Export** — Generate agent-ready output (
|
|
30
|
+
5. **Export** — Generate agent-ready output (Claude Code, Cursor, Kiro, Copilot, architect, generic)
|
|
31
31
|
|
|
32
32
|
### The 6 Spec Files
|
|
33
33
|
|
|
@@ -84,6 +84,21 @@ intake init "Fix login bug" -s notes.txt --mode quick
|
|
|
84
84
|
# Fetch requirements from a URL
|
|
85
85
|
intake init "API review" -s https://wiki.company.com/rfc/auth
|
|
86
86
|
|
|
87
|
+
# Fetch from live APIs (requires credentials)
|
|
88
|
+
intake init "Sprint planning" -s jira://PROJ/sprint/42
|
|
89
|
+
intake init "Wiki review" -s confluence://SPACE/Page-Title
|
|
90
|
+
intake init "Bug triage" -s github://org/repo/issues?labels=bug
|
|
91
|
+
|
|
92
|
+
# Export for specific agents
|
|
93
|
+
intake init "Payments" -s reqs.pdf --format claude-code
|
|
94
|
+
intake export ./specs/auth -f cursor -o .
|
|
95
|
+
intake export ./specs/auth -f kiro -o .
|
|
96
|
+
intake export ./specs/auth -f copilot -o .
|
|
97
|
+
|
|
98
|
+
# Analyze verification failures and get fix suggestions
|
|
99
|
+
intake feedback ./specs/auth-oauth2
|
|
100
|
+
intake feedback ./specs/auth -r report.json --apply --agent-format claude-code
|
|
101
|
+
|
|
87
102
|
# List discovered plugins
|
|
88
103
|
intake plugins list
|
|
89
104
|
|
|
@@ -109,9 +124,44 @@ intake task update ./specs/auth-oauth2 1 done --note "Implemented and tested"
|
|
|
109
124
|
| URLs | `http://`, `https://` | Fetches page, converts HTML → Markdown |
|
|
110
125
|
| Slack export | `.json` (auto-detected) | Messages, threads, decisions, action items |
|
|
111
126
|
| GitHub Issues | `.json` (auto-detected) | Issues, labels, comments, cross-references |
|
|
127
|
+
| **Jira API** | `jira://PROJ-123` | Live issue fetching via REST API |
|
|
128
|
+
| **Confluence API** | `confluence://SPACE/Title` | Live page fetching via REST API |
|
|
129
|
+
| **GitHub API** | `github://org/repo/issues/42` | Live issue fetching via PyGithub |
|
|
112
130
|
|
|
113
131
|
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.
|
|
114
132
|
|
|
133
|
+
### Live API Connectors
|
|
134
|
+
|
|
135
|
+
Connect directly to project management tools (requires credentials):
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Jira: single issue, multiple, JQL, sprint
|
|
139
|
+
intake init "Sprint" -s jira://PROJ-123
|
|
140
|
+
intake init "Sprint" -s "jira://PROJ?jql=sprint=42"
|
|
141
|
+
|
|
142
|
+
# Confluence: page by ID, by space/title, CQL search
|
|
143
|
+
intake init "Docs" -s confluence://page/123456
|
|
144
|
+
intake init "Docs" -s confluence://SPACE/Page-Title
|
|
145
|
+
|
|
146
|
+
# GitHub: single/multiple issues, filtered queries
|
|
147
|
+
intake init "Bugs" -s github://org/repo/issues/42
|
|
148
|
+
intake init "Bugs" -s "github://org/repo/issues?labels=bug&state=open"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Configure credentials in `.intake.yaml`:
|
|
152
|
+
|
|
153
|
+
```yaml
|
|
154
|
+
connectors:
|
|
155
|
+
jira:
|
|
156
|
+
url: https://your-org.atlassian.net
|
|
157
|
+
# Set JIRA_API_TOKEN and JIRA_EMAIL env vars
|
|
158
|
+
confluence:
|
|
159
|
+
url: https://your-org.atlassian.net/wiki
|
|
160
|
+
# Set CONFLUENCE_API_TOKEN and CONFLUENCE_EMAIL env vars
|
|
161
|
+
github:
|
|
162
|
+
# Set GITHUB_TOKEN env var
|
|
163
|
+
```
|
|
164
|
+
|
|
115
165
|
---
|
|
116
166
|
|
|
117
167
|
## Commands
|
|
@@ -127,7 +177,9 @@ Format is auto-detected by file extension and content inspection. Jira, Slack, a
|
|
|
127
177
|
| `intake diff` | Compare two spec versions | **Available** |
|
|
128
178
|
| `intake doctor` | Check environment and configuration health | **Available** |
|
|
129
179
|
| `intake doctor --fix` | Auto-fix environment issues (install deps, create config) | **Available** |
|
|
130
|
-
| `intake
|
|
180
|
+
| `intake feedback` | Analyze verification failures and suggest fixes | **Available** |
|
|
181
|
+
| `intake feedback --apply` | Auto-apply suggested spec amendments | **Available** |
|
|
182
|
+
| `intake plugins list` | List all discovered plugins (parsers, exporters, connectors) | **Available** |
|
|
131
183
|
| `intake plugins check` | Validate plugin compatibility | **Available** |
|
|
132
184
|
| `intake task list` | List tasks from a spec with current status | **Available** |
|
|
133
185
|
| `intake task update` | Update a task's status (pending/in_progress/done/blocked) | **Available** |
|
|
@@ -157,7 +209,19 @@ spec:
|
|
|
157
209
|
auto_mode: true # auto-detect quick/standard/enterprise
|
|
158
210
|
|
|
159
211
|
export:
|
|
160
|
-
default_format: generic # architect | claude-code | cursor | kiro | generic
|
|
212
|
+
default_format: generic # architect | claude-code | cursor | kiro | copilot | generic
|
|
213
|
+
|
|
214
|
+
feedback:
|
|
215
|
+
auto_amend_spec: false # Auto-apply spec amendments from feedback
|
|
216
|
+
max_suggestions: 10 # Max suggestions per analysis
|
|
217
|
+
include_code_snippets: true # Include code examples in suggestions
|
|
218
|
+
|
|
219
|
+
connectors:
|
|
220
|
+
jira:
|
|
221
|
+
url: https://your-org.atlassian.net
|
|
222
|
+
confluence:
|
|
223
|
+
url: https://your-org.atlassian.net/wiki
|
|
224
|
+
github: {} # Uses GITHUB_TOKEN env var
|
|
161
225
|
```
|
|
162
226
|
|
|
163
227
|
### Presets
|
|
@@ -197,7 +261,7 @@ See the [`examples/`](examples/) directory for ready-to-run scenarios:
|
|
|
197
261
|
src/intake/
|
|
198
262
|
├── cli.py # Click CLI — thin adapter, no logic
|
|
199
263
|
├── config/ # Pydantic v2 models, presets, layered loader
|
|
200
|
-
│ ├── schema.py #
|
|
264
|
+
│ ├── schema.py # 9 config models (LLM, Project, Spec, Verification, Export, Security, Connectors, Feedback)
|
|
201
265
|
│ ├── presets.py # minimal / standard / enterprise presets
|
|
202
266
|
│ ├── loader.py # Layered merge: defaults → preset → YAML → CLI
|
|
203
267
|
│ └── defaults.py # Centralized constants
|
|
@@ -205,8 +269,11 @@ src/intake/
|
|
|
205
269
|
│ ├── protocols.py # V2 protocols: ParserPlugin, ExporterPlugin, ConnectorPlugin
|
|
206
270
|
│ ├── discovery.py # Entry point scanning via importlib.metadata
|
|
207
271
|
│ └── hooks.py # Pipeline hook system (HookManager)
|
|
208
|
-
├── connectors/ #
|
|
209
|
-
│
|
|
272
|
+
├── connectors/ # Live API connectors
|
|
273
|
+
│ ├── base.py # ConnectorRegistry, ConnectorError
|
|
274
|
+
│ ├── jira_api.py # Jira REST API (single/multi/JQL/sprint)
|
|
275
|
+
│ ├── confluence_api.py # Confluence REST API (page/space/CQL)
|
|
276
|
+
│ └── github_api.py # GitHub API via PyGithub (issues/filters)
|
|
210
277
|
├── ingest/ # Phase 1 — 11 parsers, registry, auto-detection
|
|
211
278
|
│ ├── base.py # ParsedContent dataclass + Parser Protocol
|
|
212
279
|
│ ├── registry.py # Auto-detection + plugin discovery + parser dispatch
|
|
@@ -239,24 +306,41 @@ src/intake/
|
|
|
239
306
|
├── verify/ # Phase 4 — Acceptance check engine
|
|
240
307
|
│ ├── engine.py # 4 check types: command, files_exist, pattern_*
|
|
241
308
|
│ └── reporter.py # Terminal (Rich), JSON, JUnit XML reporters
|
|
242
|
-
├── export/ # Phase 5 — Agent-ready output
|
|
309
|
+
├── export/ # Phase 5 — Agent-ready output (6 exporters)
|
|
243
310
|
│ ├── base.py # Exporter Protocol
|
|
244
311
|
│ ├── registry.py # Plugin discovery + format-based dispatch
|
|
312
|
+
│ ├── _helpers.py # Shared utilities (parse_tasks, load_checks, etc.)
|
|
313
|
+
│ ├── claude_code.py # CLAUDE.md + tasks + verify.sh
|
|
314
|
+
│ ├── cursor.py # .cursor/rules/intake-spec.mdc
|
|
315
|
+
│ ├── kiro.py # Kiro-native requirements/design/tasks
|
|
316
|
+
│ ├── copilot.py # .github/copilot-instructions.md
|
|
245
317
|
│ ├── architect.py # pipeline.yaml generation
|
|
246
318
|
│ └── generic.py # SPEC.md + verify.sh generation
|
|
247
319
|
├── diff/ # Spec comparison
|
|
248
320
|
│ └── differ.py # Compare two specs by requirement/task IDs
|
|
321
|
+
├── feedback/ # Feedback loop (analyze failures, suggest fixes)
|
|
322
|
+
│ ├── analyzer.py # LLM-based failure analysis
|
|
323
|
+
│ ├── prompts.py # Feedback analysis prompt
|
|
324
|
+
│ ├── suggestions.py # Multi-format suggestion formatter
|
|
325
|
+
│ └── spec_updater.py # Preview + apply spec amendments
|
|
249
326
|
├── doctor/ # Environment health checks
|
|
250
|
-
│ └── checks.py # Python, API keys, deps, config validation
|
|
327
|
+
│ └── checks.py # Python, API keys, deps, connectors, config validation
|
|
251
328
|
├── llm/ # LiteLLM wrapper (used by analyze/ only)
|
|
252
329
|
│ └── adapter.py # Async completion, retry, cost tracking, budget
|
|
253
|
-
├── templates/ # Jinja2 templates
|
|
330
|
+
├── templates/ # Jinja2 templates (15 total)
|
|
254
331
|
│ ├── requirements.md.j2 # FR, NFR, conflicts, open questions
|
|
255
332
|
│ ├── design.md.j2 # Components, files, tech decisions
|
|
256
333
|
│ ├── tasks.md.j2 # Task summary + status + detailed sections
|
|
257
334
|
│ ├── acceptance.yaml.j2 # Executable acceptance checks
|
|
258
335
|
│ ├── context.md.j2 # Project context for agents
|
|
259
|
-
│
|
|
336
|
+
│ ├── sources.md.j2 # Source traceability mapping
|
|
337
|
+
│ ├── claude_md.j2 # Claude Code CLAUDE.md spec section
|
|
338
|
+
│ ├── claude_task.md.j2 # Claude Code per-task file
|
|
339
|
+
│ ├── verify_sh.j2 # Claude Code verification script
|
|
340
|
+
│ ├── cursor_rules.mdc.j2 # Cursor rules file
|
|
341
|
+
│ ├── kiro_*.md.j2 # Kiro requirements/design/tasks (3 files)
|
|
342
|
+
│ ├── copilot_instructions.md.j2 # Copilot instructions
|
|
343
|
+
│ └── feedback.md.j2 # Feedback results template
|
|
260
344
|
└── utils/ # Shared utilities
|
|
261
345
|
├── file_detect.py # Extension-based format detection
|
|
262
346
|
├── project_detect.py # Auto-detect tech stack from project files
|
|
@@ -269,7 +353,7 @@ src/intake/
|
|
|
269
353
|
**Key design principles:**
|
|
270
354
|
|
|
271
355
|
- **Protocol over ABC** — All extension points use `typing.Protocol`
|
|
272
|
-
- **Plugin-first architecture** — Parsers and
|
|
356
|
+
- **Plugin-first architecture** — Parsers, exporters, and connectors discovered via entry points, manual fallback
|
|
273
357
|
- **Dataclasses for pipeline data, Pydantic for config** — Never mixed
|
|
274
358
|
- **Async only in analyze/** — Everything else is synchronous
|
|
275
359
|
- **Offline mode** — Parsing, verification, export, diff, doctor all work without LLM
|
|
@@ -292,7 +376,41 @@ architect pipeline specs/auth-system/pipeline.yaml
|
|
|
292
376
|
|
|
293
377
|
```bash
|
|
294
378
|
intake init "Payments" -s reqs.pdf --format claude-code
|
|
295
|
-
# Generates CLAUDE.md + tasks + verify.sh
|
|
379
|
+
# Generates CLAUDE.md + .intake/tasks/ + .intake/verify.sh + .intake/spec-summary.md
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### With Cursor
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
intake export ./specs/auth -f cursor -o .
|
|
386
|
+
# Generates .cursor/rules/intake-spec.mdc (auto-loaded by Cursor)
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### With Kiro
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
intake export ./specs/auth -f kiro -o .
|
|
393
|
+
# Generates requirements.md, design.md, tasks.md in Kiro native format
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### With GitHub Copilot
|
|
397
|
+
|
|
398
|
+
```bash
|
|
399
|
+
intake export ./specs/auth -f copilot -o .
|
|
400
|
+
# Generates .github/copilot-instructions.md (auto-loaded by Copilot)
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### Feedback Loop
|
|
404
|
+
|
|
405
|
+
```bash
|
|
406
|
+
# Analyze why verification checks failed and get fix suggestions
|
|
407
|
+
intake feedback ./specs/auth-oauth2
|
|
408
|
+
|
|
409
|
+
# Use a previous report and auto-apply spec amendments
|
|
410
|
+
intake feedback ./specs/auth -r report.json --apply
|
|
411
|
+
|
|
412
|
+
# Get suggestions formatted for your agent
|
|
413
|
+
intake feedback ./specs/auth --agent-format claude-code
|
|
296
414
|
```
|
|
297
415
|
|
|
298
416
|
### With CI/CD
|
|
@@ -326,7 +444,7 @@ ruff format src/ tests/
|
|
|
326
444
|
mypy src/ --strict
|
|
327
445
|
```
|
|
328
446
|
|
|
329
|
-
Current test suite: **
|
|
447
|
+
Current test suite: **673 tests**, **0 mypy --strict errors**, **0 ruff warnings**.
|
|
330
448
|
|
|
331
449
|
### Implementation Status
|
|
332
450
|
|
|
@@ -336,12 +454,13 @@ Current test suite: **492 tests**, **86% coverage**, **0 mypy --strict errors**,
|
|
|
336
454
|
| Phase 2 — Analyze | `analyze/` (orchestrator + 7 sub-modules + complexity) | Implemented |
|
|
337
455
|
| Phase 3 — Generate | `generate/` (spec builder + adaptive builder + 6 templates + lock) | Implemented |
|
|
338
456
|
| Phase 4 — Verify | `verify/` (engine + 3 reporters) | Implemented |
|
|
339
|
-
| Phase 5 — Export | `export/` (
|
|
457
|
+
| Phase 5 — Export | `export/` (6 exporters: claude-code, cursor, kiro, copilot, architect, generic) | Implemented |
|
|
340
458
|
| Plugins | `plugins/` (protocols + discovery + hooks) | Implemented |
|
|
341
|
-
| Connectors | `connectors/` (
|
|
459
|
+
| Connectors | `connectors/` (Jira, Confluence, GitHub API connectors) | Implemented |
|
|
460
|
+
| Feedback | `feedback/` (analyzer + suggestions + spec updater) | Implemented |
|
|
342
461
|
| Standalone | `doctor/`, `config/`, `llm/`, `utils/` | Implemented |
|
|
343
462
|
| Standalone | `diff/` (spec differ) | Implemented |
|
|
344
|
-
| CLI |
|
|
463
|
+
| CLI | 15 commands/subcommands wired end-to-end | Implemented |
|
|
345
464
|
|
|
346
465
|
---
|
|
347
466
|
|