intake-ai-cli 0.1.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.1.0 → intake_ai_cli-0.3.0}/.gitignore +1 -0
- intake_ai_cli-0.3.0/CHANGELOG.md +280 -0
- intake_ai_cli-0.3.0/LICENSE +21 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/PKG-INFO +194 -23
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/README.md +182 -22
- intake_ai_cli-0.3.0/SECURITY.md +379 -0
- intake_ai_cli-0.3.0/SEGUIMIENTO-V0.md +969 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/docs/README.md +55 -7
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/docs/arquitectura.md +143 -28
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/docs/buenas-practicas.md +90 -3
- intake_ai_cli-0.3.0/docs/conectores.md +278 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/docs/configuracion.md +120 -5
- 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.3.0/docs/formatos-entrada.md +507 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/docs/github-notes/v0.1.0.md +9 -9
- intake_ai_cli-0.3.0/docs/github-notes/v0.2.0.md +299 -0
- intake_ai_cli-0.3.0/docs/github-notes/v0.3.0.md +442 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/docs/guia-cli.md +239 -9
- intake_ai_cli-0.3.0/docs/integracion-cicd.md +537 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/docs/pipeline.md +134 -24
- intake_ai_cli-0.3.0/docs/plugins.md +309 -0
- intake_ai_cli-0.3.0/docs/seguridad.md +366 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/docs/solucion-problemas.md +151 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/pyproject.toml +42 -1
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/__init__.py +1 -1
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/analyze/analyzer.py +1 -4
- intake_ai_cli-0.3.0/src/intake/analyze/complexity.py +165 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/analyze/dedup.py +2 -6
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/analyze/extraction.py +1 -3
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/analyze/models.py +1 -0
- intake_ai_cli-0.3.0/src/intake/cli.py +1306 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/config/loader.py +1 -3
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/config/presets.py +1 -3
- intake_ai_cli-0.3.0/src/intake/config/schema.py +160 -0
- intake_ai_cli-0.3.0/src/intake/connectors/__init__.py +17 -0
- intake_ai_cli-0.3.0/src/intake/connectors/base.py +129 -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.1.0 → intake_ai_cli-0.3.0}/src/intake/diff/differ.py +56 -48
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/doctor/checks.py +132 -13
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/export/__init__.py +10 -0
- intake_ai_cli-0.3.0/src/intake/export/_helpers.py +152 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/export/architect.py +13 -8
- 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.3.0/src/intake/export/registry.py +154 -0
- 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/generate/adaptive.py +206 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/generate/spec_builder.py +1 -3
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/__init__.py +4 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/base.py +1 -4
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/confluence.py +8 -8
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/docx.py +15 -11
- intake_ai_cli-0.3.0/src/intake/ingest/github_issues.py +319 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/image.py +1 -3
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/jira.py +22 -19
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/markdown.py +8 -5
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/pdf.py +7 -5
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/plaintext.py +6 -4
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/registry.py +117 -12
- intake_ai_cli-0.3.0/src/intake/ingest/slack.py +258 -0
- intake_ai_cli-0.3.0/src/intake/ingest/url.py +233 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/ingest/yaml_input.py +7 -7
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/llm/adapter.py +3 -9
- intake_ai_cli-0.3.0/src/intake/plugins/__init__.py +32 -0
- intake_ai_cli-0.3.0/src/intake/plugins/discovery.py +304 -0
- intake_ai_cli-0.3.0/src/intake/plugins/hooks.py +87 -0
- intake_ai_cli-0.3.0/src/intake/plugins/protocols.py +256 -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.1.0 → intake_ai_cli-0.3.0}/src/intake/templates/tasks.md.j2 +4 -3
- intake_ai_cli-0.3.0/src/intake/templates/verify_sh.j2 +39 -0
- intake_ai_cli-0.3.0/src/intake/utils/source_uri.py +162 -0
- intake_ai_cli-0.3.0/src/intake/utils/task_state.py +333 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/verify/engine.py +2 -3
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/verify/reporter.py +7 -3
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/conftest.py +18 -0
- intake_ai_cli-0.3.0/tests/fixtures/confluence_api_response.json +19 -0
- intake_ai_cli-0.3.0/tests/fixtures/github_issues.json +82 -0
- intake_ai_cli-0.3.0/tests/fixtures/jira_api_response.json +32 -0
- intake_ai_cli-0.3.0/tests/fixtures/sample_webpage.html +62 -0
- intake_ai_cli-0.3.0/tests/fixtures/slack_export.json +65 -0
- intake_ai_cli-0.3.0/tests/fixtures/verify_report_failed.json +44 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_analyzer.py +1 -2
- intake_ai_cli-0.3.0/tests/test_analyze/test_complexity.py +169 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_extraction.py +1 -2
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_llm_adapter.py +2 -1
- intake_ai_cli-0.3.0/tests/test_cli.py +619 -0
- intake_ai_cli-0.3.0/tests/test_config/test_schema.py +154 -0
- intake_ai_cli-0.3.0/tests/test_connectors/test_base.py +139 -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.1.0 → intake_ai_cli-0.3.0}/tests/test_diff/test_differ.py +26 -15
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_doctor/test_checks.py +108 -2
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_export/test_architect.py +23 -25
- 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.1.0 → intake_ai_cli-0.3.0}/tests/test_export/test_generic.py +22 -20
- 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.1.0 → intake_ai_cli-0.3.0}/tests/test_export/test_registry.py +27 -0
- 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.3.0/tests/test_generate/test_adaptive.py +369 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_generate/test_lock.py +2 -6
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_confluence.py +2 -6
- intake_ai_cli-0.3.0/tests/test_ingest/test_github_issues.py +135 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_hardening.py +13 -7
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_image.py +1 -3
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_jira.py +9 -27
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_markdown.py +1 -3
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_plaintext.py +3 -6
- intake_ai_cli-0.3.0/tests/test_ingest/test_registry.py +222 -0
- intake_ai_cli-0.3.0/tests/test_ingest/test_slack.py +96 -0
- intake_ai_cli-0.3.0/tests/test_ingest/test_url.py +145 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_ingest/test_yaml_input.py +4 -12
- intake_ai_cli-0.3.0/tests/test_plugins/test_discovery.py +118 -0
- intake_ai_cli-0.3.0/tests/test_plugins/test_hooks.py +68 -0
- intake_ai_cli-0.3.0/tests/test_plugins/test_protocols.py +183 -0
- intake_ai_cli-0.3.0/tests/test_utils/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_utils/test_file_detect.py +16 -2
- intake_ai_cli-0.3.0/tests/test_utils/test_source_uri.py +109 -0
- intake_ai_cli-0.3.0/tests/test_utils/test_task_state.py +247 -0
- intake_ai_cli-0.3.0/tests/test_verify/__init__.py +0 -0
- intake_ai_cli-0.1.0/CHANGELOG.md +0 -120
- intake_ai_cli-0.1.0/SEGUIMIENTO-V0.md +0 -423
- intake_ai_cli-0.1.0/docs/exportacion.md +0 -224
- intake_ai_cli-0.1.0/docs/formatos-entrada.md +0 -293
- intake_ai_cli-0.1.0/src/intake/cli.py +0 -670
- intake_ai_cli-0.1.0/src/intake/config/schema.py +0 -84
- intake_ai_cli-0.1.0/src/intake/export/registry.py +0 -70
- intake_ai_cli-0.1.0/tests/test_cli.py +0 -256
- intake_ai_cli-0.1.0/tests/test_config/test_schema.py +0 -66
- intake_ai_cli-0.1.0/tests/test_ingest/test_registry.py +0 -107
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/.intake.yaml.example +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/docs/verificacion.md +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/examples/from-jira/README.md +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/examples/from-jira/jira-export.json +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/examples/from-markdown/README.md +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/examples/from-markdown/requirements.md +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/examples/from-scratch/README.md +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/examples/from-scratch/idea.txt +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/examples/multi-source/README.md +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/examples/multi-source/api-decisions.json +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/examples/multi-source/notes.txt +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/examples/multi-source/user-stories.md +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/__main__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/analyze/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/analyze/conflicts.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/analyze/design.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/analyze/prompts.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/analyze/questions.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/analyze/risks.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/config/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/config/defaults.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/diff/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/doctor/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/export/base.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/export/generic.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/generate/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/generate/lock.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/llm/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/templates/acceptance.yaml.j2 +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/templates/context.md.j2 +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/templates/design.md.j2 +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/templates/requirements.md.j2 +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/templates/sources.md.j2 +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/utils/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/utils/cost.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/utils/file_detect.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/utils/logging.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/utils/project_detect.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/src/intake/verify/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/fixtures/confluence_page.html +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/fixtures/jira_export.json +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/fixtures/jira_export_multi.json +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/fixtures/simple_spec.md +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/fixtures/slack_thread.txt +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/fixtures/structured_reqs.yaml +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/fixtures/wireframe.png +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_analyze/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_conflicts.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_dedup.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_design.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_analyze/test_risks.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_config/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_config/test_loader.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_config/test_presets.py +0 -0
- {intake_ai_cli-0.1.0/tests/test_diff → intake_ai_cli-0.3.0/tests/test_connectors}/__init__.py +0 -0
- {intake_ai_cli-0.1.0/tests/test_doctor → intake_ai_cli-0.3.0/tests/test_diff}/__init__.py +0 -0
- {intake_ai_cli-0.1.0/tests/test_export → intake_ai_cli-0.3.0/tests/test_doctor}/__init__.py +0 -0
- {intake_ai_cli-0.1.0/tests/test_generate → intake_ai_cli-0.3.0/tests/test_export}/__init__.py +0 -0
- {intake_ai_cli-0.1.0/tests/test_ingest → intake_ai_cli-0.3.0/tests/test_generate}/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_generate/test_spec_builder.py +0 -0
- {intake_ai_cli-0.1.0/tests/test_utils → intake_ai_cli-0.3.0/tests/test_ingest}/__init__.py +0 -0
- {intake_ai_cli-0.1.0/tests/test_verify → intake_ai_cli-0.3.0/tests/test_plugins}/__init__.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_utils/test_cost.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_utils/test_project_detect.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_verify/test_engine.py +0 -0
- {intake_ai_cli-0.1.0 → intake_ai_cli-0.3.0}/tests/test_verify/test_reporter.py +0 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
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
|
|
75
|
+
|
|
76
|
+
### Added
|
|
77
|
+
|
|
78
|
+
#### Plugin system (extensible architecture)
|
|
79
|
+
|
|
80
|
+
- **Plugin protocols** (`plugins/protocols.py`): V2 extension contracts — `ParserPlugin`, `ExporterPlugin`, `ConnectorPlugin` protocols with `@runtime_checkable`. Supporting dataclasses: `PluginMeta`, `ExportResult`, `FetchedSource`. Exceptions: `PluginError`, `PluginLoadError`.
|
|
81
|
+
- **Plugin discovery** (`plugins/discovery.py`): Automatic plugin loading via `importlib.metadata.entry_points()` (PEP 621). `PluginRegistry` with `discover_all()`, `discover_group()`, `get_parsers()`, `get_exporters()`, `get_connectors()`, `list_plugins()`, `check_compatibility()`. Three entry point groups: `intake.parsers`, `intake.exporters`, `intake.connectors`.
|
|
82
|
+
- **Pipeline hooks** (`plugins/hooks.py`): `HookManager` with `register()`, `emit()`, `registered_events`. Callbacks are called in order; exceptions are caught and logged without blocking other callbacks. Ready for Phase 2 event wiring.
|
|
83
|
+
- **Entry points in `pyproject.toml`**: 11 parsers + 2 exporters registered as `[project.entry-points]`. All discoverable via `intake plugins list`.
|
|
84
|
+
|
|
85
|
+
#### Registry refactoring
|
|
86
|
+
|
|
87
|
+
- **Parser registry** (`ingest/registry.py`): `ParserRegistry` now accepts an optional `PluginRegistry` and attempts plugin-based discovery before falling back to manual registration. New `discover_parsers()` method. JSON subtype detection expanded: Jira → GitHub Issues → Slack → generic YAML.
|
|
88
|
+
- **Exporter registry** (`export/registry.py`): Same plugin-first pattern. `ExporterRegistry` with optional `PluginRegistry`, `discover_exporters()` method, plugin-first `create_default_registry()`.
|
|
89
|
+
|
|
90
|
+
#### 3 new parsers (11 total)
|
|
91
|
+
|
|
92
|
+
- **UrlParser** (`ingest/url.py`): Fetches HTTP/HTTPS URLs via `httpx` (sync), converts HTML to Markdown via BeautifulSoup4 + markdownify. Extracts page title, heading-based sections. Auto-detects source type (confluence, jira, github) from URL patterns. Handles connection errors, timeouts, and HTTP errors with user-friendly `ParseError`.
|
|
93
|
+
- **SlackParser** (`ingest/slack.py`): Parses Slack workspace export JSON format (array of message objects with `type`, `user`, `text`, `ts`, `thread_ts`, `reactions`). Groups messages by thread. Detects decisions via reactions (thumbsup, white_check_mark) and keywords. Detects action items via keywords (TODO, action item, etc.). Metadata: message_count, thread_count, decision_count, action_item_count.
|
|
94
|
+
- **GithubIssuesParser** (`ingest/github_issues.py`): Parses GitHub Issues JSON (single object or array). Extracts labels, assignees, milestones, state, html_url, comments. Detects `#NNN` cross-references as relations. Supports both array and single-issue formats.
|
|
95
|
+
|
|
96
|
+
#### Source URI parsing
|
|
97
|
+
|
|
98
|
+
- **Source URI parser** (`utils/source_uri.py`): `SourceURI` dataclass and `parse_source()` function. Detection order: stdin (`-`) → scheme URIs (`jira://`, `confluence://`, `github://`) → HTTP(S) URLs → existing files → file extensions → free text fallback. `SCHEME_PATTERNS` dict with compiled regexes.
|
|
99
|
+
|
|
100
|
+
#### Connector infrastructure
|
|
101
|
+
|
|
102
|
+
- **Connector base** (`connectors/base.py`): `ConnectorRegistry` with `register()`, `find_for_uri()`, async `fetch()`, `validate_all()`, `available_schemes`. Exceptions: `ConnectorError`, `ConnectorNotFoundError`. No concrete connectors yet (Phase 2).
|
|
103
|
+
|
|
104
|
+
#### Complexity classification and adaptive generation
|
|
105
|
+
|
|
106
|
+
- **Complexity classifier** (`analyze/complexity.py`): `ComplexityAssessment` dataclass and `classify_complexity()` function. Three modes: quick (<500 words, 1 source, no structure), standard (default), enterprise (4+ sources OR >5000 words). Heuristic-based, no LLM dependency.
|
|
107
|
+
- **Adaptive spec builder** (`generate/adaptive.py`): `GenerationPlan` dataclass and `AdaptiveSpecBuilder` class. Wraps standard `SpecBuilder` and filters files by mode: quick generates only `context.md` + `tasks.md`, standard generates all 6, enterprise generates all 6 with detailed risks. `create_generation_plan()` respects user config overrides.
|
|
108
|
+
|
|
109
|
+
#### Task state tracking
|
|
110
|
+
|
|
111
|
+
- **TaskStateManager** (`utils/task_state.py`): Reads and updates `tasks.md` in a spec directory. `list_tasks()` with optional status filter, `get_task()`, `update_task()` with persistence. Supports statuses: pending, in_progress, done, blocked. `TaskStatus` dataclass, `TaskStateError` exception.
|
|
112
|
+
- **TaskItem.status field** added to `analyze/models.py` (default: `"pending"`).
|
|
113
|
+
- **tasks.md.j2 template** updated with Status column in summary table and `**Status:**` field in detail sections.
|
|
114
|
+
|
|
115
|
+
#### New CLI commands
|
|
116
|
+
|
|
117
|
+
- **`intake plugins list`**: Shows table of all discovered plugins with name, group, version, V2 status, built-in status. Verbose mode (`-v`) adds module and error columns.
|
|
118
|
+
- **`intake plugins check`**: Validates compatibility of all discovered plugins. Reports OK or FAIL per plugin.
|
|
119
|
+
- **`intake task list <spec_dir>`**: Lists tasks from a spec with current status. Supports `--status` filter (repeatable). Shows progress summary.
|
|
120
|
+
- **`intake task update <spec_dir> <task_id> <status>`**: Updates task status in tasks.md. Supports `--note` for annotations.
|
|
121
|
+
- **`intake init --mode`**: New `--mode quick|standard|enterprise` option. When omitted and `spec.auto_mode` is True, auto-classifies complexity from sources.
|
|
122
|
+
|
|
123
|
+
#### init command enhancements
|
|
124
|
+
|
|
125
|
+
- Source URI resolution via `parse_source()` — detects file, URL, stdin, and scheme URIs.
|
|
126
|
+
- Scheme URIs (`jira://`, `confluence://`, `github://`) display "connector not available yet" warning.
|
|
127
|
+
- HTTP/HTTPS URLs routed to UrlParser automatically.
|
|
128
|
+
- Complexity classification + adaptive generation when `--mode` not specified.
|
|
129
|
+
- `AdaptiveSpecBuilder` replaces `SpecBuilder` for mode-aware file selection.
|
|
130
|
+
|
|
131
|
+
#### Configuration schema updates
|
|
132
|
+
|
|
133
|
+
- `SpecConfig.auto_mode: bool = True` — enables automatic complexity classification.
|
|
134
|
+
- `ConnectorsConfig` with `JiraConnectorConfig`, `ConfluenceConnectorConfig`, `GithubConnectorConfig` sub-models (Phase 2 preparation).
|
|
135
|
+
- `IntakeConfig.connectors` field added.
|
|
136
|
+
|
|
137
|
+
#### Optional dependencies in pyproject.toml
|
|
138
|
+
|
|
139
|
+
- `connectors = ["atlassian-python-api>=3.40", "PyGithub>=2.0"]`
|
|
140
|
+
- `watch = ["watchfiles>=0.21"]`
|
|
141
|
+
- `mcp = ["mcp>=1.0"]`
|
|
142
|
+
- `respx>=0.21` added to dev dependencies.
|
|
143
|
+
|
|
144
|
+
#### Test suite
|
|
145
|
+
|
|
146
|
+
- **492 tests** (up from 313), **0 failures**. 179 new tests added.
|
|
147
|
+
- 13 new test files: test_protocols, test_discovery, test_hooks, test_base (connectors), test_source_uri, test_task_state, test_url, test_slack, test_github_issues, test_complexity, test_adaptive.
|
|
148
|
+
- 3 new fixture files: `sample_webpage.html`, `slack_export.json`, `github_issues.json`.
|
|
149
|
+
- Plugin discovery tests added to `test_ingest/test_registry.py` and `test_export/test_registry.py`.
|
|
150
|
+
- CLI tests for plugins, task, and init --mode commands added to `test_cli.py`.
|
|
151
|
+
|
|
152
|
+
## [0.1.0] - 2026-03-02
|
|
153
|
+
|
|
154
|
+
### Added
|
|
155
|
+
|
|
156
|
+
#### Phase 1 — Ingest (8 parsers + registry)
|
|
157
|
+
|
|
158
|
+
- **Project scaffolding**: `pyproject.toml` with hatchling build system, `src/intake/` package layout with 10 subpackages.
|
|
159
|
+
- **CLI framework**: Click-based CLI with 8 commands (`init`, `add`, `verify`, `export`, `show`, `list`, `diff`, `doctor`).
|
|
160
|
+
- **`intake doctor` command**: Full environment health check — validates Python version (3.12+), LLM API keys, optional dependencies (pdfplumber, python-docx, bs4, markdownify, litellm, jinja2), and `.intake.yaml` config validity. Outputs a Rich table with PASS/FAIL status and fix hints.
|
|
161
|
+
- **Configuration system**: Pydantic v2 models for all config (`LLMConfig`, `ProjectConfig`, `SpecConfig`, `VerificationConfig`, `ExportConfig`, `SecurityConfig`). Layered merge: defaults → preset → `.intake.yaml` → CLI flags.
|
|
162
|
+
- **Configuration presets**: `--preset minimal|standard|enterprise` for quick setup. Minimal is cheap/fast for prototyping, standard is balanced, enterprise is detailed with full traceability.
|
|
163
|
+
- **8 input parsers** — all producing normalized `ParsedContent`:
|
|
164
|
+
- `MarkdownParser` — `.md` files with YAML front matter support and heading-based section extraction.
|
|
165
|
+
- `PlaintextParser` — `.txt` files, stdin (`-`), Slack thread dumps. Paragraph-level sections.
|
|
166
|
+
- `YamlInputParser` — `.yaml`/`.yml`/`.json` structured requirements. Section extraction from top-level keys.
|
|
167
|
+
- `PdfParser` — `.pdf` files via pdfplumber. Text + table extraction (tables converted to Markdown).
|
|
168
|
+
- `DocxParser` — `.docx` files via python-docx. Text, tables, heading-based sections, document metadata (author, title, date).
|
|
169
|
+
- `JiraParser` — Jira JSON exports (both `{"issues":[...]}` API format and `[{"key":...}]` list format). Extracts issues with summary, description, comments (last 5), labels, priority, status, and inter-issue links.
|
|
170
|
+
- `ConfluenceParser` — Confluence HTML exports via BeautifulSoup4 + markdownify. Detects Confluence markers, extracts main content, converts to clean Markdown.
|
|
171
|
+
- `ImageParser` — `.png`/`.jpg`/`.jpeg`/`.webp`/`.gif` via injectable LLM vision callable. Ships with a stub; real vision analysis enabled when LLM adapter is configured.
|
|
172
|
+
- **Parser registry**: `ParserRegistry` with automatic format detection by file extension and content inspection. JSON subtype detection (Jira vs generic), HTML subtype detection (Confluence vs generic). Factory function `create_default_registry()` registers all 8 parsers.
|
|
173
|
+
- **Utilities**:
|
|
174
|
+
- `file_detect.py` — Extension-based format detection with `EXTENSION_MAP`.
|
|
175
|
+
- `project_detect.py` — Auto-detects project tech stack from 20+ marker files (pyproject.toml, package.json, Dockerfile, etc.) and content patterns (fastapi, django, react, etc.).
|
|
176
|
+
- `cost.py` — `CostTracker` for LLM cost accumulation with per-phase breakdown.
|
|
177
|
+
- `logging.py` — structlog configuration with console/JSON rendering.
|
|
178
|
+
|
|
179
|
+
#### Phase 2 — Analyze (LLM orchestration)
|
|
180
|
+
|
|
181
|
+
- **LLM Adapter** (`llm/adapter.py`): LiteLLM wrapper with async completion, retry with exponential backoff, cost tracking per call, budget enforcement (`CostLimitError`), JSON response parsing with markdown fence stripping, API key validation. Custom exceptions: `LLMError`, `CostLimitError`, `APIKeyMissingError`.
|
|
182
|
+
- **Analysis pipeline** (`analyze/`):
|
|
183
|
+
- `analyzer.py` — Orchestrator: coordinates extraction → deduplication → conflict validation → risk assessment → design phases. Supports multi-source analysis with automatic text combining.
|
|
184
|
+
- `prompts.py` — Three system prompts: `EXTRACTION_PROMPT` (requirements, conflicts, questions), `RISK_ASSESSMENT_PROMPT` (risk analysis per requirement), `DESIGN_PROMPT` (architecture, tasks, acceptance checks).
|
|
185
|
+
- `extraction.py` — Parses LLM JSON output into typed `AnalysisResult` with requirements, conflicts, and open questions.
|
|
186
|
+
- `dedup.py` — Jaccard word similarity deduplication across sources (threshold: 0.75).
|
|
187
|
+
- `conflicts.py` — Validates extracted conflicts, filters incomplete entries.
|
|
188
|
+
- `questions.py` — Validates extracted open questions, filters incomplete entries.
|
|
189
|
+
- `risks.py` — Parses LLM risk assessment into typed `RiskItem` list.
|
|
190
|
+
- `design.py` — Parses LLM design output into `DesignResult` with components, file actions, tasks, and acceptance checks.
|
|
191
|
+
- `models.py` — 10 dataclasses: `Requirement`, `Conflict`, `OpenQuestion`, `RiskItem`, `TechDecision`, `TaskItem`, `FileAction`, `AcceptanceCheck`, `DesignResult`, `AnalysisResult`.
|
|
192
|
+
|
|
193
|
+
#### Phase 3 — Generate (spec files + lock)
|
|
194
|
+
|
|
195
|
+
- **Generation module** (`generate/`):
|
|
196
|
+
- `spec_builder.py` — Orchestrates rendering of 6 spec files via Jinja2 templates + optional `spec.lock.yaml`.
|
|
197
|
+
- `lock.py` — `SpecLock` dataclass with SHA-256 source/spec hashing, staleness detection, YAML serialization. `create_lock()` factory function.
|
|
198
|
+
- **6 Jinja2 templates** (`templates/`): `requirements.md.j2`, `design.md.j2`, `tasks.md.j2`, `acceptance.yaml.j2`, `context.md.j2`, `sources.md.j2`.
|
|
199
|
+
|
|
200
|
+
#### Phase 4 — Verify (acceptance check engine)
|
|
201
|
+
|
|
202
|
+
- **Verification engine** (`verify/engine.py`): Runs acceptance.yaml checks against a project directory. Four check types: `command` (shell exit code), `files_exist` (path checks), `pattern_present` (regex in files), `pattern_absent` (forbidden patterns). Tag-based filtering, fail-fast mode, configurable timeout per check. `VerifyError` exception with reason + suggestion.
|
|
203
|
+
- **Report formatters** (`verify/reporter.py`):
|
|
204
|
+
- `TerminalReporter` — Rich table with colors, pass/fail status, duration, details.
|
|
205
|
+
- `JsonReporter` — Machine-readable JSON output.
|
|
206
|
+
- `JunitReporter` — JUnit XML for CI integration (GitHub Actions, Jenkins, etc.).
|
|
207
|
+
- `Reporter` Protocol with `@runtime_checkable` for extensibility.
|
|
208
|
+
|
|
209
|
+
#### Phase 5 — Export (agent-ready output)
|
|
210
|
+
|
|
211
|
+
- **Exporter framework** (`export/`):
|
|
212
|
+
- `base.py` — `Exporter` Protocol with `@runtime_checkable` for structural subtyping.
|
|
213
|
+
- `registry.py` — `ExporterRegistry` with format-based dispatch. Factory function `create_default_registry()` registers both built-in exporters.
|
|
214
|
+
- **Architect exporter** (`export/architect.py`): Generates `pipeline.yaml` with one step per task, checkpoint flags, project context injection, final verification step with required command checks. Copies all spec files to `output/spec/`.
|
|
215
|
+
- **Generic exporter** (`export/generic.py`): Generates `SPEC.md` (consolidated Markdown with all spec sections), `verify.sh` (executable bash script with `check()` helper, `set -euo pipefail`, exit code reporting). Copies all spec files to `output/spec/`.
|
|
216
|
+
|
|
217
|
+
#### Spec differ
|
|
218
|
+
|
|
219
|
+
- **Diff module** (`diff/differ.py`): Compares two spec versions by extracting sections from Markdown headings (FR/NFR IDs, task numbers) and acceptance check IDs. Reports added, removed, and modified items per section. `SpecDiff` dataclass with `added`, `removed`, `modified`, `has_changes` properties. `DiffError` exception.
|
|
220
|
+
|
|
221
|
+
#### CLI — Full pipeline wiring
|
|
222
|
+
|
|
223
|
+
- **`intake init`**: End-to-end pipeline: ingest → analyze → generate → (optional) export. Auto-detects tech stack, slugifies description for directory name, `--dry-run` support.
|
|
224
|
+
- **`intake add`**: Incremental source addition to existing spec. Parses new sources, re-analyzes, regenerates spec files.
|
|
225
|
+
- **`intake verify`**: Loads `acceptance.yaml`, runs checks via `VerificationEngine`, displays report in chosen format (terminal/json/junit), exits with semantic code (0/1/2).
|
|
226
|
+
- **`intake export`**: Exports spec to chosen format via `ExporterRegistry`.
|
|
227
|
+
- **`intake show`**: Displays spec summary from `spec.lock.yaml` (model, cost, counts) and file listing.
|
|
228
|
+
- **`intake list`**: Scans specs directory for valid spec subdirectories, shows table with metadata from lock files.
|
|
229
|
+
- **`intake diff`**: Compares two spec directories, shows Rich table with added/removed/modified items.
|
|
230
|
+
|
|
231
|
+
#### Test suite
|
|
232
|
+
|
|
233
|
+
- **313 tests**, **83% overall coverage**. 7 realistic fixture files (Markdown, plaintext, YAML, Jira JSON x2, Confluence HTML, PNG image).
|
|
234
|
+
|
|
235
|
+
#### Documentation and examples
|
|
236
|
+
|
|
237
|
+
- **`.intake.yaml.example`**: Fully documented configuration example with all options and defaults.
|
|
238
|
+
- **4 example projects** in `examples/`: `from-markdown`, `from-jira`, `from-scratch`, `multi-source` — each with README and realistic source files.
|
|
239
|
+
|
|
240
|
+
#### Error hardening
|
|
241
|
+
|
|
242
|
+
- **`EmptySourceError`** and **`FileTooLargeError`** exceptions for better error messages on edge cases.
|
|
243
|
+
- **`validate_file_readable()`** and **`read_text_safe()`** utilities — centralized file validation with UTF-8 → latin-1 encoding fallback, size limits (50MB), and empty file detection.
|
|
244
|
+
- All 8 parsers updated to use hardened file validation utilities.
|
|
245
|
+
- 16 new hardening tests covering empty files, encoding fallback, size limits, and directory rejection.
|
|
246
|
+
|
|
247
|
+
#### Doctor --fix
|
|
248
|
+
|
|
249
|
+
- **`intake doctor --fix`** command: auto-installs missing Python packages and creates default `.intake.yaml` configuration.
|
|
250
|
+
- `FixResult` dataclass for structured fix result reporting.
|
|
251
|
+
- `_find_pip()` detects `pip3.12`, `pip3`, or `pip` for package installation.
|
|
252
|
+
- `IMPORT_TO_PIP` mapping for correct PyPI package names (e.g., `bs4` → `beautifulsoup4`, `docx` → `python-docx`).
|
|
253
|
+
|
|
254
|
+
#### Code quality
|
|
255
|
+
|
|
256
|
+
- **0 ruff errors**: Fixed 88 lint issues (TC001/TC003, F401, I001, SIM103, RUF022, E501, SIM117, RUF043).
|
|
257
|
+
- **0 mypy --strict errors**: Fixed 26 type errors across 12 files. Proper isinstance narrowing, type-safe dict extraction, correct bool return types.
|
|
258
|
+
|
|
259
|
+
#### Documentation
|
|
260
|
+
|
|
261
|
+
- **`docs/` directory** fully updated with v0.2.0 content: architecture, pipeline, formats, CLI guide, configuration, best practices, troubleshooting.
|
|
262
|
+
- **`docs/plugins.md`** (NEW): Complete plugin system documentation — discovery mechanism, built-in plugins table, V1 vs V2 protocols, how to create external plugins, HookManager, PluginRegistry API.
|
|
263
|
+
- **`docs/github-notes/v0.2.0.md`** (NEW): Full release notes with highlights, migration guide, quality metrics.
|
|
264
|
+
|
|
265
|
+
### Fixed
|
|
266
|
+
|
|
267
|
+
- **structlog test isolation**: Replaced `StringIO` sink with persistent `_NullWriter` class and yield-based autouse fixture. Fixed `cache_logger_on_first_use=True` in `setup_logging()` that caused "I/O operation on closed file" errors when CLI tests ran before module tests.
|
|
268
|
+
- **`_get_list` type safety**: Split into `_get_list` (for dict lists) and `_get_str_list` (for string lists) to fix mypy --strict without breaking acceptance criteria extraction.
|
|
269
|
+
- **bs4 `find()` kwargs**: Changed `**selector` to `attrs=selector` in Confluence parser for correct BeautifulSoup4 type narrowing.
|
|
270
|
+
|
|
271
|
+
### QA Audit
|
|
272
|
+
|
|
273
|
+
Full QA audit completed with 105 issues found and resolved:
|
|
274
|
+
|
|
275
|
+
- **51 ruff lint errors** fixed: TC001 (8), RUF002 (2), N817 (2), E501 (4), F841 (2), TC003 (2), F401/I001 (30 auto-fixed), RUF100 (1).
|
|
276
|
+
- **54 ruff format issues** fixed: Auto-formatted with `ruff format`.
|
|
277
|
+
- **4 mypy --strict errors** fixed: `Returning Any` in `github_issues.py`, unused `type: ignore` in `discovery.py`, `list[object]` vs `list[ParsedContent]` in `cli.py`.
|
|
278
|
+
- **0 security issues**: No hardcoded credentials, no sensitive data in logs.
|
|
279
|
+
- **Coverage**: 86% overall (target: 65%). All modules above their individual targets.
|
|
280
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Diego303
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|