specfact-cli 0.26.10__tar.gz → 0.26.11__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.
Files changed (247) hide show
  1. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/PKG-INFO +1 -1
  2. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/pyproject.toml +1 -1
  3. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/__init__.py +1 -1
  4. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/__init__.py +1 -1
  5. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/backlog_commands.py +152 -4
  6. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/.gitignore +0 -0
  7. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/LICENSE.md +0 -0
  8. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/README.md +0 -0
  9. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/mappings/node-async.yaml +0 -0
  10. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/mappings/python-async.yaml +0 -0
  11. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/mappings/speckit-default.yaml +0 -0
  12. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/shared/cli-enforcement.md +0 -0
  13. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.01-import.md +0 -0
  14. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.02-plan.md +0 -0
  15. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.03-review.md +0 -0
  16. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.04-sdd.md +0 -0
  17. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.05-enforce.md +0 -0
  18. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.06-sync.md +0 -0
  19. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.07-contracts.md +0 -0
  20. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.backlog-refine.md +0 -0
  21. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.compare.md +0 -0
  22. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.sync-backlog.md +0 -0
  23. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/prompts/specfact.validate.md +0 -0
  24. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/schemas/deviation.schema.json +0 -0
  25. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/schemas/plan.schema.json +0 -0
  26. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/schemas/protocol.schema.json +0 -0
  27. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/defaults/defect_v1.yaml +0 -0
  28. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/defaults/enabler_v1.yaml +0 -0
  29. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/defaults/spike_v1.yaml +0 -0
  30. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/defaults/user_story_v1.yaml +0 -0
  31. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/field_mappings/ado_agile.yaml +0 -0
  32. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/field_mappings/ado_default.yaml +0 -0
  33. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/field_mappings/ado_kanban.yaml +0 -0
  34. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/field_mappings/ado_safe.yaml +0 -0
  35. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/field_mappings/ado_scrum.yaml +0 -0
  36. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/frameworks/safe/safe_feature_v1.yaml +0 -0
  37. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/frameworks/scrum/user_story_v1.yaml +0 -0
  38. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/personas/developer/developer_task_v1.yaml +0 -0
  39. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/personas/product-owner/user_story_v1.yaml +0 -0
  40. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/backlog/providers/ado/work_item_v1.yaml +0 -0
  41. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/github-action.yml.j2 +0 -0
  42. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/persona/architect.md.j2 +0 -0
  43. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/persona/developer.md.j2 +0 -0
  44. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/persona/product-owner.md.j2 +0 -0
  45. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/plan.bundle.yaml.j2 +0 -0
  46. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/pr-template.md.j2 +0 -0
  47. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/protocol.yaml.j2 +0 -0
  48. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/resources/templates/telemetry.yaml.example +0 -0
  49. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/adapters/__init__.py +0 -0
  50. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/adapters/ado.py +0 -0
  51. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/adapters/backlog_base.py +0 -0
  52. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/adapters/base.py +0 -0
  53. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/adapters/github.py +0 -0
  54. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/adapters/openspec.py +0 -0
  55. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  56. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/adapters/registry.py +0 -0
  57. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/adapters/speckit.py +0 -0
  58. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/agents/__init__.py +0 -0
  59. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/agents/analyze_agent.py +0 -0
  60. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/agents/base.py +0 -0
  61. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/agents/plan_agent.py +0 -0
  62. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/agents/registry.py +0 -0
  63. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/agents/sync_agent.py +0 -0
  64. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/analyzers/__init__.py +0 -0
  65. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  66. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  67. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  68. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  69. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  70. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  71. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  72. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  73. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  74. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/__init__.py +0 -0
  75. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  76. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/adapters/base.py +0 -0
  77. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/adapters/local_yaml_adapter.py +0 -0
  78. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/ai_refiner.py +0 -0
  79. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/converter.py +0 -0
  80. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/filters.py +0 -0
  81. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/format_detector.py +0 -0
  82. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/formats/__init__.py +0 -0
  83. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/formats/base.py +0 -0
  84. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/formats/markdown_format.py +0 -0
  85. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/formats/structured_format.py +0 -0
  86. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  87. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  88. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/mappers/base.py +0 -0
  89. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  90. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  91. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/backlog/template_detector.py +0 -0
  92. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/cli.py +0 -0
  93. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/__init__.py +0 -0
  94. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/analyze.py +0 -0
  95. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/auth.py +0 -0
  96. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/contract_cmd.py +0 -0
  97. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/drift.py +0 -0
  98. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/enforce.py +0 -0
  99. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/generate.py +0 -0
  100. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/import_cmd.py +0 -0
  101. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/init.py +0 -0
  102. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/migrate.py +0 -0
  103. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/plan.py +0 -0
  104. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/project_cmd.py +0 -0
  105. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/repro.py +0 -0
  106. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/sdd.py +0 -0
  107. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/spec.py +0 -0
  108. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/sync.py +0 -0
  109. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/update.py +0 -0
  110. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/commands/validate.py +0 -0
  111. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/common/__init__.py +0 -0
  112. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/common/logger_setup.py +0 -0
  113. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/common/logging_utils.py +0 -0
  114. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/common/text_utils.py +0 -0
  115. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/common/utils.py +0 -0
  116. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/comparators/__init__.py +0 -0
  117. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  118. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/contracts/__init__.py +0 -0
  119. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  120. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  121. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  122. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/generators/__init__.py +0 -0
  123. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/generators/contract_generator.py +0 -0
  124. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  125. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/generators/persona_exporter.py +0 -0
  126. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/generators/plan_generator.py +0 -0
  127. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/generators/protocol_generator.py +0 -0
  128. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/generators/report_generator.py +0 -0
  129. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/generators/task_generator.py +0 -0
  130. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  131. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/generators/workflow_generator.py +0 -0
  132. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/importers/__init__.py +0 -0
  133. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/importers/speckit_converter.py +0 -0
  134. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  135. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/integrations/__init__.py +0 -0
  136. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/integrations/specmatic.py +0 -0
  137. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/merge/__init__.py +0 -0
  138. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/merge/resolver.py +0 -0
  139. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/migrations/__init__.py +0 -0
  140. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  141. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/__init__.py +0 -0
  142. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/backlog_item.py +0 -0
  143. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/bridge.py +0 -0
  144. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/capabilities.py +0 -0
  145. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/change.py +0 -0
  146. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/contract.py +0 -0
  147. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/deviation.py +0 -0
  148. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/dor_config.py +0 -0
  149. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/enforcement.py +0 -0
  150. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/persona_template.py +0 -0
  151. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/plan.py +0 -0
  152. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/project.py +0 -0
  153. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/protocol.py +0 -0
  154. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/quality.py +0 -0
  155. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/sdd.py +0 -0
  156. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/source_tracking.py +0 -0
  157. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/models/task.py +0 -0
  158. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/modes/__init__.py +0 -0
  159. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/modes/detector.py +0 -0
  160. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/modes/router.py +0 -0
  161. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/parsers/__init__.py +0 -0
  162. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/parsers/persona_importer.py +0 -0
  163. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  164. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  165. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  166. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/runtime.py +0 -0
  167. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/__init__.py +0 -0
  168. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/bridge_probe.py +0 -0
  169. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/bridge_sync.py +0 -0
  170. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/bridge_watch.py +0 -0
  171. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/change_detector.py +0 -0
  172. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/code_to_spec.py +0 -0
  173. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/drift_detector.py +0 -0
  174. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/repository_sync.py +0 -0
  175. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/spec_to_code.py +0 -0
  176. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  177. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/watcher.py +0 -0
  178. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  179. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/telemetry.py +0 -0
  180. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/__init__.py +0 -0
  181. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/bridge_templates.py +0 -0
  182. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  183. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  184. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  185. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  186. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  187. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  188. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  189. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/registry.py +0 -0
  190. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/templates/specification_templates.py +0 -0
  191. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/__init__.py +0 -0
  192. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
  193. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/auth_tokens.py +0 -0
  194. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/bundle_loader.py +0 -0
  195. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/code_change_detector.py +0 -0
  196. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/console.py +0 -0
  197. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  198. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/context_detection.py +0 -0
  199. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/enrichment_context.py +0 -0
  200. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/enrichment_parser.py +0 -0
  201. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/env_manager.py +0 -0
  202. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/feature_keys.py +0 -0
  203. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/git.py +0 -0
  204. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/github_annotations.py +0 -0
  205. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/ide_setup.py +0 -0
  206. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/incremental_check.py +0 -0
  207. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/metadata.py +0 -0
  208. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/optional_deps.py +0 -0
  209. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/performance.py +0 -0
  210. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/progress.py +0 -0
  211. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  212. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/prompts.py +0 -0
  213. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  214. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/source_scanner.py +0 -0
  215. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/startup_checks.py +0 -0
  216. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/structure.py +0 -0
  217. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/structured_io.py +0 -0
  218. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/suggestions.py +0 -0
  219. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/terminal.py +0 -0
  220. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/utils/yaml_utils.py +0 -0
  221. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/__init__.py +0 -0
  222. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/agile_validation.py +0 -0
  223. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  224. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  225. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/contract_validator.py +0 -0
  226. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/fsm.py +0 -0
  227. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/repro_checker.py +0 -0
  228. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/schema.py +0 -0
  229. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  230. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  231. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  232. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  233. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
  234. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  235. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  236. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  237. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  238. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  239. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  240. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  241. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  242. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/models.py +0 -0
  243. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
  244. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  245. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  246. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/versioning/__init__.py +0 -0
  247. {specfact_cli-0.26.10 → specfact_cli-0.26.11}/src/specfact_cli/versioning/analyzer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specfact-cli
3
- Version: 0.26.10
3
+ Version: 0.26.11
4
4
  Summary: Brownfield-first CLI: Reverse engineer legacy Python → specs → enforced contracts. Automate legacy code documentation and prevent modernization regressions.
5
5
  Project-URL: Homepage, https://github.com/nold-ai/specfact-cli
6
6
  Project-URL: Repository, https://github.com/nold-ai/specfact-cli.git
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "specfact-cli"
7
- version = "0.26.10"
7
+ version = "0.26.11"
8
8
  description = "Brownfield-first CLI: Reverse engineer legacy Python → specs → enforced contracts. Automate legacy code documentation and prevent modernization regressions."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -3,4 +3,4 @@ SpecFact CLI - Spec→Contract→Sentinel tool for contract-driven development.
3
3
  """
4
4
 
5
5
  # Package version: keep in sync with pyproject.toml, setup.py, src/specfact_cli/__init__.py
6
- __version__ = "0.26.10"
6
+ __version__ = "0.26.11"
@@ -9,6 +9,6 @@ This package provides command-line tools for:
9
9
  - Validating reproducibility
10
10
  """
11
11
 
12
- __version__ = "0.26.10"
12
+ __version__ = "0.26.11"
13
13
 
14
14
  __all__ = ["__version__"]
@@ -14,6 +14,7 @@ SpecFact CLI Architecture:
14
14
  from __future__ import annotations
15
15
 
16
16
  import os
17
+ import re
17
18
  import sys
18
19
  from datetime import datetime
19
20
  from pathlib import Path
@@ -202,6 +203,97 @@ def _build_adapter_kwargs(
202
203
  return kwargs
203
204
 
204
205
 
206
+ def _extract_body_from_block(block: str) -> str:
207
+ """
208
+ Extract **Body** content from a refined export block, handling nested fenced code.
209
+
210
+ The body is wrapped in ```markdown ... ```. If the body itself contains fenced
211
+ code blocks (e.g. ```python ... ```), the closing fence is matched by tracking
212
+ depth: a line that is exactly ``` closes the current fence (body or inner).
213
+ """
214
+ start_marker = "**Body**:"
215
+ fence_open = "```markdown"
216
+ if start_marker not in block or fence_open not in block:
217
+ return ""
218
+ idx = block.find(start_marker)
219
+ rest = block[idx + len(start_marker) :].lstrip()
220
+ if not rest.startswith("```"):
221
+ return ""
222
+ if not rest.startswith(fence_open + "\n") and not rest.startswith(fence_open + "\r\n"):
223
+ return ""
224
+ after_open = rest[len(fence_open) :].lstrip("\n\r")
225
+ if not after_open:
226
+ return ""
227
+ lines = after_open.split("\n")
228
+ body_lines: list[str] = []
229
+ depth = 1
230
+ for line in lines:
231
+ stripped = line.rstrip()
232
+ if stripped == "```":
233
+ if depth == 1:
234
+ break
235
+ depth -= 1
236
+ body_lines.append(line)
237
+ elif stripped.startswith("```") and stripped != "```":
238
+ depth += 1
239
+ body_lines.append(line)
240
+ else:
241
+ body_lines.append(line)
242
+ return "\n".join(body_lines).strip()
243
+
244
+
245
+ def _parse_refined_export_markdown(content: str) -> dict[str, dict[str, Any]]:
246
+ """
247
+ Parse refined export markdown (same format as --export-to-tmp) into id -> fields.
248
+
249
+ Splits by ## Item blocks, extracts **ID**, **Body** (from ```markdown ... ```),
250
+ **Acceptance Criteria**, and optionally title and **Metrics** (story_points,
251
+ business_value, priority). Body extraction is fence-aware so bodies containing
252
+ nested code blocks are parsed correctly. Returns a dict mapping item id to
253
+ parsed fields (body_markdown, acceptance_criteria, title?, story_points?,
254
+ business_value?, priority?).
255
+ """
256
+ result: dict[str, dict[str, Any]] = {}
257
+ blocks = re.split(r"\n## Item \d+:", content)
258
+ for block in blocks:
259
+ block = block.strip()
260
+ if not block or block.startswith("# SpecFact") or "**ID**:" not in block:
261
+ continue
262
+ id_match = re.search(r"\*\*ID\*\*:\s*(.+?)(?:\n|$)", block)
263
+ if not id_match:
264
+ continue
265
+ item_id = id_match.group(1).strip()
266
+ fields: dict[str, Any] = {}
267
+
268
+ fields["body_markdown"] = _extract_body_from_block(block)
269
+
270
+ ac_match = re.search(r"\*\*Acceptance Criteria\*\*:\s*\n(.*?)(?=\n\*\*|\n---|\Z)", block, re.DOTALL)
271
+ if ac_match:
272
+ fields["acceptance_criteria"] = ac_match.group(1).strip() or None
273
+ else:
274
+ fields["acceptance_criteria"] = None
275
+
276
+ first_line = block.split("\n")[0].strip() if block else ""
277
+ if first_line and not first_line.startswith("**"):
278
+ fields["title"] = first_line
279
+
280
+ if "Story Points:" in block:
281
+ sp_match = re.search(r"Story Points:\s*(\d+)", block)
282
+ if sp_match:
283
+ fields["story_points"] = int(sp_match.group(1))
284
+ if "Business Value:" in block:
285
+ bv_match = re.search(r"Business Value:\s*(\d+)", block)
286
+ if bv_match:
287
+ fields["business_value"] = int(bv_match.group(1))
288
+ if "Priority:" in block:
289
+ pri_match = re.search(r"Priority:\s*(\d+)", block)
290
+ if pri_match:
291
+ fields["priority"] = int(pri_match.group(1))
292
+
293
+ result[item_id] = fields
294
+ return result
295
+
296
+
205
297
  def _fetch_backlog_items(
206
298
  adapter_name: str,
207
299
  search_query: str | None = None,
@@ -680,9 +772,65 @@ def refine(
680
772
  raise typer.Exit(1)
681
773
 
682
774
  console.print(f"[bold cyan]Importing refined content from: {import_file}[/bold cyan]")
683
- # TODO: Implement import logic to parse refined content and apply to items
684
- console.print("[yellow]⚠ Import functionality pending implementation[/yellow]")
685
- console.print("[dim]For now, use interactive refinement with --write flag[/dim]")
775
+ raw = import_file.read_text(encoding="utf-8")
776
+ parsed_by_id = _parse_refined_export_markdown(raw)
777
+ if not parsed_by_id:
778
+ console.print(
779
+ "[yellow]No valid item blocks found in import file (expected ## Item N: and **ID**:)[/yellow]"
780
+ )
781
+ raise typer.Exit(1)
782
+
783
+ updated_items: list[BacklogItem] = []
784
+ for item in items:
785
+ if item.id not in parsed_by_id:
786
+ continue
787
+ data = parsed_by_id[item.id]
788
+ item.body_markdown = data.get("body_markdown", item.body_markdown or "")
789
+ if "acceptance_criteria" in data:
790
+ item.acceptance_criteria = data["acceptance_criteria"]
791
+ if data.get("title"):
792
+ item.title = data["title"]
793
+ if "story_points" in data:
794
+ item.story_points = data["story_points"]
795
+ if "business_value" in data:
796
+ item.business_value = data["business_value"]
797
+ if "priority" in data:
798
+ item.priority = data["priority"]
799
+ updated_items.append(item)
800
+
801
+ if not write:
802
+ console.print(f"[green]Would update {len(updated_items)} item(s)[/green]")
803
+ console.print("[dim]Run with --write to apply changes to the backlog[/dim]")
804
+ return
805
+
806
+ writeback_kwargs = _build_adapter_kwargs(
807
+ adapter,
808
+ repo_owner=repo_owner,
809
+ repo_name=repo_name,
810
+ github_token=github_token,
811
+ ado_org=ado_org,
812
+ ado_project=ado_project,
813
+ ado_team=ado_team,
814
+ ado_token=ado_token,
815
+ )
816
+ adapter_instance = adapter_registry.get_adapter(adapter, **writeback_kwargs)
817
+ if not isinstance(adapter_instance, BacklogAdapter):
818
+ console.print("[bold red]✗[/bold red] Adapter does not support backlog updates")
819
+ raise typer.Exit(1)
820
+
821
+ for item in updated_items:
822
+ update_fields_list = ["title", "body_markdown"]
823
+ if item.acceptance_criteria:
824
+ update_fields_list.append("acceptance_criteria")
825
+ if item.story_points is not None:
826
+ update_fields_list.append("story_points")
827
+ if item.business_value is not None:
828
+ update_fields_list.append("business_value")
829
+ if item.priority is not None:
830
+ update_fields_list.append("priority")
831
+ adapter_instance.update_backlog_item(item, update_fields=update_fields_list)
832
+ console.print(f"[green]✓ Updated backlog item: {item.url}[/green]")
833
+ console.print(f"[green]✓ Updated {len(updated_items)} backlog item(s)[/green]")
686
834
  return
687
835
 
688
836
  # Apply limit if specified
@@ -1231,7 +1379,7 @@ def map_fields(
1231
1379
  import re
1232
1380
  import sys
1233
1381
 
1234
- import questionary
1382
+ import questionary # type: ignore[reportMissingImports]
1235
1383
  import requests
1236
1384
 
1237
1385
  from specfact_cli.backlog.mappers.template_config import FieldMappingConfig
File without changes