specfact-cli 0.37.3__tar.gz → 0.37.4__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 (389) hide show
  1. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/PKG-INFO +1 -1
  2. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/pyproject.toml +1 -1
  3. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/__init__.py +1 -1
  4. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/module-package.yaml +3 -3
  5. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/commands.py +33 -6
  6. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/module_registry/module-package.yaml +3 -3
  7. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/module_registry/src/commands.py +3 -2
  8. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/marketplace_client.py +1 -1
  9. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_discovery.py +30 -11
  10. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_installer.py +3 -3
  11. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_lifecycle.py +21 -18
  12. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_packages.py +3 -3
  13. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/.gitignore +0 -0
  14. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/LICENSE +0 -0
  15. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/README.md +0 -0
  16. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/keys/README.md +0 -0
  17. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/keys/module-signing-public.pem +0 -0
  18. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/mappings/node-async.yaml +0 -0
  19. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/mappings/python-async.yaml +0 -0
  20. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/mappings/speckit-default.yaml +0 -0
  21. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/shared/cli-enforcement.md +0 -0
  22. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.01-import.md +0 -0
  23. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.02-plan.md +0 -0
  24. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.03-review.md +0 -0
  25. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.04-sdd.md +0 -0
  26. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.05-enforce.md +0 -0
  27. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.06-sync.md +0 -0
  28. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.07-contracts.md +0 -0
  29. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.backlog-add.md +0 -0
  30. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.backlog-daily.md +0 -0
  31. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.backlog-refine.md +0 -0
  32. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.compare.md +0 -0
  33. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.sync-backlog.md +0 -0
  34. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/prompts/specfact.validate.md +0 -0
  35. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/schemas/deviation.schema.json +0 -0
  36. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/schemas/plan.schema.json +0 -0
  37. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/schemas/protocol.schema.json +0 -0
  38. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/defaults/defect_v1.yaml +0 -0
  39. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/defaults/enabler_v1.yaml +0 -0
  40. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/defaults/spike_v1.yaml +0 -0
  41. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/defaults/user_story_v1.yaml +0 -0
  42. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/field_mappings/ado_agile.yaml +0 -0
  43. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/field_mappings/ado_default.yaml +0 -0
  44. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/field_mappings/ado_kanban.yaml +0 -0
  45. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/field_mappings/ado_safe.yaml +0 -0
  46. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/field_mappings/ado_scrum.yaml +0 -0
  47. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/frameworks/safe/safe_feature_v1.yaml +0 -0
  48. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/frameworks/scrum/user_story_v1.yaml +0 -0
  49. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/personas/developer/developer_task_v1.yaml +0 -0
  50. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/personas/product-owner/user_story_v1.yaml +0 -0
  51. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/backlog/providers/ado/work_item_v1.yaml +0 -0
  52. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/github-action.yml.j2 +0 -0
  53. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/persona/architect.md.j2 +0 -0
  54. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/persona/developer.md.j2 +0 -0
  55. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/persona/product-owner.md.j2 +0 -0
  56. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/plan.bundle.yaml.j2 +0 -0
  57. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/policies/kanban.yaml +0 -0
  58. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/policies/mixed.yaml +0 -0
  59. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/policies/safe.yaml +0 -0
  60. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/policies/scrum.yaml +0 -0
  61. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/pr-template.md.j2 +0 -0
  62. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/protocol.yaml.j2 +0 -0
  63. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/resources/templates/telemetry.yaml.example +0 -0
  64. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/__init__.py +0 -0
  65. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/__main__.py +0 -0
  66. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/adapters/__init__.py +0 -0
  67. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/adapters/ado.py +0 -0
  68. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/adapters/backlog_base.py +0 -0
  69. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/adapters/base.py +0 -0
  70. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/adapters/github.py +0 -0
  71. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/adapters/openspec.py +0 -0
  72. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  73. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/adapters/registry.py +0 -0
  74. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/adapters/speckit.py +0 -0
  75. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/agents/__init__.py +0 -0
  76. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/agents/analyze_agent.py +0 -0
  77. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/agents/base.py +0 -0
  78. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/agents/plan_agent.py +0 -0
  79. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/agents/registry.py +0 -0
  80. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/agents/sync_agent.py +0 -0
  81. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/__init__.py +0 -0
  82. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  83. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  84. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  85. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  86. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  87. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  88. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  89. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  90. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  91. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/__init__.py +0 -0
  92. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  93. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/adapters/base.py +0 -0
  94. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/adapters/local_yaml_adapter.py +0 -0
  95. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/ai_refiner.py +0 -0
  96. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/converter.py +0 -0
  97. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/filters.py +0 -0
  98. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/format_detector.py +0 -0
  99. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/formats/__init__.py +0 -0
  100. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/formats/base.py +0 -0
  101. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/formats/markdown_format.py +0 -0
  102. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/formats/structured_format.py +0 -0
  103. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  104. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  105. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/mappers/base.py +0 -0
  106. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  107. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  108. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/backlog/template_detector.py +0 -0
  109. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/cli.py +0 -0
  110. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/__init__.py +0 -0
  111. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/analyze.py +0 -0
  112. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/auth.py +0 -0
  113. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/backlog_commands.py +0 -0
  114. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/contract_cmd.py +0 -0
  115. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/drift.py +0 -0
  116. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/enforce.py +0 -0
  117. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/generate.py +0 -0
  118. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/import_cmd.py +0 -0
  119. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/init.py +0 -0
  120. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/migrate.py +0 -0
  121. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/plan.py +0 -0
  122. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/project_cmd.py +0 -0
  123. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/repro.py +0 -0
  124. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/sdd.py +0 -0
  125. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/spec.py +0 -0
  126. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/sync.py +0 -0
  127. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/update.py +0 -0
  128. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/commands/validate.py +0 -0
  129. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/common/__init__.py +0 -0
  130. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/common/logger_setup.py +0 -0
  131. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/common/logging_utils.py +0 -0
  132. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/common/text_utils.py +0 -0
  133. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/common/utils.py +0 -0
  134. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/comparators/__init__.py +0 -0
  135. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  136. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/contracts/__init__.py +0 -0
  137. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  138. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/contracts/module_interface.py +0 -0
  139. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  140. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  141. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/generators/__init__.py +0 -0
  142. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/generators/contract_generator.py +0 -0
  143. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  144. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/generators/persona_exporter.py +0 -0
  145. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/generators/plan_generator.py +0 -0
  146. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/generators/protocol_generator.py +0 -0
  147. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/generators/report_generator.py +0 -0
  148. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/generators/task_generator.py +0 -0
  149. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  150. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/generators/workflow_generator.py +0 -0
  151. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/importers/__init__.py +0 -0
  152. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/importers/speckit_converter.py +0 -0
  153. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  154. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/integrations/__init__.py +0 -0
  155. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/integrations/specmatic.py +0 -0
  156. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/merge/__init__.py +0 -0
  157. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/merge/resolver.py +0 -0
  158. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/migrations/__init__.py +0 -0
  159. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  160. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/__init__.py +0 -0
  161. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/backlog_item.py +0 -0
  162. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/bridge.py +0 -0
  163. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/capabilities.py +0 -0
  164. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/change.py +0 -0
  165. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/contract.py +0 -0
  166. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/deviation.py +0 -0
  167. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/dor_config.py +0 -0
  168. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/enforcement.py +0 -0
  169. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/module_package.py +0 -0
  170. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/persona_template.py +0 -0
  171. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/plan.py +0 -0
  172. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/project.py +0 -0
  173. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/protocol.py +0 -0
  174. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/quality.py +0 -0
  175. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/sdd.py +0 -0
  176. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/source_tracking.py +0 -0
  177. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/task.py +0 -0
  178. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/models/validation.py +0 -0
  179. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modes/__init__.py +0 -0
  180. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modes/detector.py +0 -0
  181. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modes/router.py +0 -0
  182. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/__init__.py +0 -0
  183. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/analyze/module-package.yaml +0 -0
  184. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/analyze/src/__init__.py +0 -0
  185. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/analyze/src/app.py +0 -0
  186. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/analyze/src/commands.py +0 -0
  187. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/auth/module-package.yaml +0 -0
  188. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/auth/src/__init__.py +0 -0
  189. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/auth/src/app.py +0 -0
  190. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/auth/src/commands.py +0 -0
  191. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/__init__.py +0 -0
  192. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/__init__.py +0 -0
  193. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/ado.py +0 -0
  194. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/base.py +0 -0
  195. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/github.py +0 -0
  196. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/jira.py +0 -0
  197. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/linear.py +0 -0
  198. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/app.py +0 -0
  199. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/contract/module-package.yaml +0 -0
  200. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/contract/src/__init__.py +0 -0
  201. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/contract/src/app.py +0 -0
  202. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/contract/src/commands.py +0 -0
  203. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/drift/module-package.yaml +0 -0
  204. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/drift/src/__init__.py +0 -0
  205. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/drift/src/app.py +0 -0
  206. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/drift/src/commands.py +0 -0
  207. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/enforce/module-package.yaml +0 -0
  208. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/enforce/src/__init__.py +0 -0
  209. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/enforce/src/app.py +0 -0
  210. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/enforce/src/commands.py +0 -0
  211. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/generate/module-package.yaml +0 -0
  212. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/generate/src/__init__.py +0 -0
  213. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/generate/src/app.py +0 -0
  214. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/generate/src/commands.py +0 -0
  215. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/import_cmd/module-package.yaml +0 -0
  216. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/import_cmd/src/__init__.py +0 -0
  217. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/import_cmd/src/app.py +0 -0
  218. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/import_cmd/src/commands.py +0 -0
  219. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/init/module-package.yaml +0 -0
  220. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/init/src/__init__.py +0 -0
  221. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/init/src/app.py +0 -0
  222. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/init/src/commands.py +0 -0
  223. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/migrate/module-package.yaml +0 -0
  224. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/migrate/src/__init__.py +0 -0
  225. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/migrate/src/app.py +0 -0
  226. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/migrate/src/commands.py +0 -0
  227. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/module_io_shim.py +0 -0
  228. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
  229. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
  230. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/module-package.yaml +0 -0
  231. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/app.py +0 -0
  232. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/commands.py +0 -0
  233. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/__init__.py +0 -0
  234. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/__init__.py +0 -0
  235. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/apply.py +0 -0
  236. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/__init__.py +0 -0
  237. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/applier.py +0 -0
  238. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/generator.py +0 -0
  239. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/idempotency.py +0 -0
  240. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/plan/module-package.yaml +0 -0
  241. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/plan/src/__init__.py +0 -0
  242. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/plan/src/app.py +0 -0
  243. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/plan/src/commands.py +0 -0
  244. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/module-package.yaml +0 -0
  245. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/app.py +0 -0
  246. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/commands.py +0 -0
  247. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/__init__.py +0 -0
  248. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/config/__init__.py +0 -0
  249. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/config/policy_config.py +0 -0
  250. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/config/templates.py +0 -0
  251. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/__init__.py +0 -0
  252. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/suggester.py +0 -0
  253. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/validator.py +0 -0
  254. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/main.py +0 -0
  255. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/models/__init__.py +0 -0
  256. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/models/policy_result.py +0 -0
  257. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/__init__.py +0 -0
  258. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/kanban.py +0 -0
  259. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/safe.py +0 -0
  260. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/scrum.py +0 -0
  261. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/__init__.py +0 -0
  262. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/policy_registry.py +0 -0
  263. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/project/module-package.yaml +0 -0
  264. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/project/src/__init__.py +0 -0
  265. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/project/src/app.py +0 -0
  266. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/project/src/commands.py +0 -0
  267. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/repro/module-package.yaml +0 -0
  268. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/repro/src/__init__.py +0 -0
  269. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/repro/src/app.py +0 -0
  270. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/repro/src/commands.py +0 -0
  271. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/sdd/module-package.yaml +0 -0
  272. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/sdd/src/__init__.py +0 -0
  273. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/sdd/src/app.py +0 -0
  274. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/sdd/src/commands.py +0 -0
  275. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/spec/module-package.yaml +0 -0
  276. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/spec/src/__init__.py +0 -0
  277. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/spec/src/app.py +0 -0
  278. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/spec/src/commands.py +0 -0
  279. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/sync/module-package.yaml +0 -0
  280. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/sync/src/__init__.py +0 -0
  281. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/sync/src/app.py +0 -0
  282. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/sync/src/commands.py +0 -0
  283. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
  284. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
  285. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
  286. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
  287. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/validate/module-package.yaml +0 -0
  288. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/validate/src/__init__.py +0 -0
  289. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/validate/src/app.py +0 -0
  290. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/modules/validate/src/commands.py +0 -0
  291. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/parsers/__init__.py +0 -0
  292. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/parsers/persona_importer.py +0 -0
  293. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/__init__.py +0 -0
  294. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/bootstrap.py +0 -0
  295. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/bridge_registry.py +0 -0
  296. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/crypto_validator.py +0 -0
  297. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/extension_registry.py +0 -0
  298. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/help_cache.py +0 -0
  299. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/metadata.py +0 -0
  300. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_security.py +0 -0
  301. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_state.py +0 -0
  302. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/registry/registry.py +0 -0
  303. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  304. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  305. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  306. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/runtime.py +0 -0
  307. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/__init__.py +0 -0
  308. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/bridge_probe.py +0 -0
  309. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/bridge_sync.py +0 -0
  310. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/bridge_watch.py +0 -0
  311. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/change_detector.py +0 -0
  312. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/code_to_spec.py +0 -0
  313. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/drift_detector.py +0 -0
  314. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/repository_sync.py +0 -0
  315. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/spec_to_code.py +0 -0
  316. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  317. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/watcher.py +0 -0
  318. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  319. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/telemetry.py +0 -0
  320. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/__init__.py +0 -0
  321. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/bridge_templates.py +0 -0
  322. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  323. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  324. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  325. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  326. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  327. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  328. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  329. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/registry.py +0 -0
  330. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/templates/specification_templates.py +0 -0
  331. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/__init__.py +0 -0
  332. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
  333. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/auth_tokens.py +0 -0
  334. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/bundle_converters.py +0 -0
  335. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/bundle_loader.py +0 -0
  336. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/code_change_detector.py +0 -0
  337. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/console.py +0 -0
  338. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  339. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/context_detection.py +0 -0
  340. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/enrichment_context.py +0 -0
  341. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/enrichment_parser.py +0 -0
  342. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/env_manager.py +0 -0
  343. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/feature_keys.py +0 -0
  344. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/git.py +0 -0
  345. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/github_annotations.py +0 -0
  346. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/ide_setup.py +0 -0
  347. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/incremental_check.py +0 -0
  348. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/metadata.py +0 -0
  349. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/optional_deps.py +0 -0
  350. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/performance.py +0 -0
  351. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/persona_ownership.py +0 -0
  352. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/progress.py +0 -0
  353. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  354. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/prompts.py +0 -0
  355. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  356. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/source_scanner.py +0 -0
  357. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/startup_checks.py +0 -0
  358. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/structure.py +0 -0
  359. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/structured_io.py +0 -0
  360. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/suggestions.py +0 -0
  361. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/terminal.py +0 -0
  362. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/utils/yaml_utils.py +0 -0
  363. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/__init__.py +0 -0
  364. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/agile_validation.py +0 -0
  365. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  366. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  367. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/contract_validator.py +0 -0
  368. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/fsm.py +0 -0
  369. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/repro_checker.py +0 -0
  370. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/schema.py +0 -0
  371. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  372. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  373. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  374. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  375. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
  376. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  377. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  378. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  379. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  380. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  381. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  382. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  383. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  384. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/models.py +0 -0
  385. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
  386. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  387. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  388. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/src/specfact_cli/versioning/__init__.py +0 -0
  389. {specfact_cli-0.37.3 → specfact_cli-0.37.4}/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.37.3
3
+ Version: 0.37.4
4
4
  Summary: The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with validation and contract enforcement for new projects and long-lived codebases.
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.37.3"
7
+ version = "0.37.4"
8
8
  description = "The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with validation and contract enforcement for new projects and long-lived codebases."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -8,6 +8,6 @@ This package provides command-line tools for:
8
8
  - Supporting agile ceremonies and team workflows
9
9
  """
10
10
 
11
- __version__ = "0.37.3"
11
+ __version__ = "0.37.4"
12
12
 
13
13
  __all__ = ["__version__"]
@@ -1,5 +1,5 @@
1
1
  name: backlog
2
- version: 0.1.0
2
+ version: 0.1.2
3
3
  commands:
4
4
  - backlog
5
5
  command_help:
@@ -28,5 +28,5 @@ publisher:
28
28
  description: Manage backlog ceremonies, refinement, and dependency insights.
29
29
  license: Apache-2.0
30
30
  integrity:
31
- checksum: sha256:1ab19fd9dd206ea5bb12af2f785fda4b56c5e3324902154f31ca24cc88334b4f
32
- signature: UDxeFiE6DafWglCWREHuSZz4ezApHwygKI4wqkHiFIcHFk5CRqnH9KPUdTVyB+Agiys4k3kKNfGb/0Ljit//DA==
31
+ checksum: sha256:ef3febe90c62fa24b3da6b6b2f8a7b605c5b544db01aac10e5cfacc807bcca26
32
+ signature: 2b/UNbFlgRQiwJ+LrEQKyoYUi8lxeLGc4hrcTUdCinU9yXa1h6GvYpRkAkzRW8kxNNNsetphuf7hLZ3II3bNDQ==
@@ -4224,6 +4224,12 @@ def map_fields(
4224
4224
  if key and value:
4225
4225
  cli_option_map[key] = value
4226
4226
 
4227
+ issue_type_id_map = {
4228
+ issue_type: repo_issue_types.get(issue_type, "")
4229
+ for issue_type in ["epic", "feature", "story", "task", "bug"]
4230
+ if repo_issue_types.get(issue_type)
4231
+ }
4232
+
4227
4233
  # Fast-path for fully specified non-interactive invocations.
4228
4234
  if project_ref and (github_type_field_id or "").strip() and cli_option_map:
4229
4235
  github_custom_mapping_file = _persist_github_custom_mapping_file(repo_issue_types)
@@ -4247,6 +4253,33 @@ def map_fields(
4247
4253
  console.print(f"[green]Custom mapping:[/green] {github_custom_mapping_file}")
4248
4254
  return
4249
4255
 
4256
+ if not project_ref:
4257
+ if cli_option_map or (github_type_field_id or "").strip():
4258
+ console.print(
4259
+ "[yellow]⚠[/yellow] GitHub ProjectV2 Type options/field-id were provided, but no ProjectV2 "
4260
+ "number/ID was set. Skipping ProjectV2 mapping."
4261
+ )
4262
+ github_custom_mapping_file = _persist_github_custom_mapping_file(repo_issue_types)
4263
+ initial_settings_update: dict[str, Any] = {
4264
+ "github_issue_types": {"type_ids": issue_type_id_map},
4265
+ # Clear stale ProjectV2 mapping when user explicitly skips ProjectV2 input.
4266
+ "provider_fields": {"github_project_v2": None},
4267
+ "field_mapping_file": ".specfact/templates/backlog/field_mappings/github_custom.yaml",
4268
+ }
4269
+ config_path = _upsert_backlog_provider_settings(
4270
+ "github",
4271
+ initial_settings_update,
4272
+ project_id=project_context,
4273
+ adapter="github",
4274
+ )
4275
+ console.print(f"[green]✓[/green] GitHub mapping saved to {config_path}")
4276
+ console.print(f"[green]Custom mapping:[/green] {github_custom_mapping_file}")
4277
+ console.print(
4278
+ "[dim]ProjectV2 Type field mapping skipped; repository issue types were captured "
4279
+ "(ProjectV2 is optional).[/dim]"
4280
+ )
4281
+ return
4282
+
4250
4283
  project_id = ""
4251
4284
  project_title = ""
4252
4285
  fields_nodes: list[dict[str, Any]] = []
@@ -4445,12 +4478,6 @@ def map_fields(
4445
4478
  if option_name and option_name in option_name_to_id:
4446
4479
  option_map[issue_type] = option_name_to_id[option_name]
4447
4480
 
4448
- issue_type_id_map = {
4449
- issue_type: repo_issue_types.get(issue_type, "")
4450
- for issue_type in ["epic", "feature", "story", "task", "bug"]
4451
- if repo_issue_types.get(issue_type)
4452
- }
4453
-
4454
4481
  settings_update: dict[str, Any] = {}
4455
4482
  if issue_type_id_map:
4456
4483
  settings_update["github_issue_types"] = {"type_ids": issue_type_id_map}
@@ -1,5 +1,5 @@
1
1
  name: module-registry
2
- version: 0.1.0
2
+ version: 0.1.3
3
3
  commands:
4
4
  - module
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: 'Manage modules: search, list, show, install, and upgrade.'
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:933aeb8adb353565167a3a63dfda9dd62c15ce4f5574a85198c8007e992780e3
19
- signature: 8bn3S2Unl2sLaGIF7f0MlLkH4AoplU5h2VY/uDoJBwmO3rl3xweYXuoJftPKmFASBUWcVxxoK+YoGvOzY6fpDA==
18
+ checksum: sha256:92a3673edb39974791afcc357a1e931b6e4152d1ad7af0e4a4d722c29431b90d
19
+ signature: eynkV+88hx9PPGlOnB5rwWHkiEtgFe8wNIU+5I0C8PZR+WWoRIcTcvTe5TYYAyiHi6JmJZZLvrDsTIpe3K3VDQ==
@@ -509,13 +509,14 @@ def list_modules(
509
509
  ),
510
510
  ) -> None:
511
511
  """List installed modules with trust labels and optional origin details."""
512
- modules = get_modules_with_state()
512
+ all_modules = get_modules_with_state()
513
+ modules = all_modules
513
514
  if source:
514
515
  modules = [m for m in modules if str(m.get("source", "")) == source]
515
516
  render_modules_table(console, modules, show_origin=show_origin)
516
517
 
517
518
  bundled = get_bundled_module_metadata()
518
- installed_ids = {str(module.get("id", "")).strip() for module in get_modules_with_state()}
519
+ installed_ids = {str(module.get("id", "")).strip() for module in all_modules}
519
520
  available = [meta for name, meta in bundled.items() if name not in installed_ids]
520
521
  if not show_bundled_available:
521
522
  if available:
@@ -96,5 +96,5 @@ def download_module(
96
96
  file_name = Path(parsed.path).name or f"{module_id.replace('/', '-')}.tar.gz"
97
97
  target_path = target_dir / file_name
98
98
  target_path.write_bytes(content)
99
- logger.info("Downloaded module '%s' to '%s'", module_id, target_path)
99
+ logger.debug("Downloaded module '%s' to '%s'", module_id, target_path)
100
100
  return target_path
@@ -10,11 +10,13 @@ from icontract import ensure
10
10
 
11
11
  from specfact_cli.common import get_bridge_logger
12
12
  from specfact_cli.models.module_package import ModulePackageMetadata
13
+ from specfact_cli.utils.prompts import print_warning
13
14
 
14
15
 
15
16
  USER_MODULES_ROOT = Path.home() / ".specfact" / "modules"
16
17
  MARKETPLACE_MODULES_ROOT = Path.home() / ".specfact" / "marketplace-modules"
17
18
  CUSTOM_MODULES_ROOT = Path.home() / ".specfact" / "custom-modules"
19
+ _SHADOW_HINT_KEYS: set[tuple[str, str, str, str]] = set()
18
20
 
19
21
 
20
22
  @dataclass(frozen=True)
@@ -45,7 +47,7 @@ def discover_all_modules(
45
47
 
46
48
  logger = get_bridge_logger(__name__)
47
49
  discovered: list[DiscoveredModule] = []
48
- seen_names: set[str] = set()
50
+ seen_by_name: dict[str, DiscoveredModule] = {}
49
51
 
50
52
  effective_builtin_root = builtin_root or get_modules_root()
51
53
  effective_project_root = get_workspace_modules_root()
@@ -87,23 +89,40 @@ def discover_all_modules(
87
89
  entries = discover_package_metadata(root, source=source)
88
90
  for package_dir, metadata in entries:
89
91
  module_name = metadata.name
90
- if module_name in seen_names:
92
+ if module_name in seen_by_name:
93
+ existing = seen_by_name[module_name]
94
+ if source == "user" and existing.source == "project":
95
+ warning_key = (
96
+ module_name,
97
+ existing.source,
98
+ source,
99
+ str(existing.package_dir.resolve()),
100
+ )
101
+ if warning_key not in _SHADOW_HINT_KEYS:
102
+ _SHADOW_HINT_KEYS.add(warning_key)
103
+ print_warning(
104
+ f"Module '{module_name}' from project scope ({existing.package_dir}) takes precedence over "
105
+ f"user-scoped module ({package_dir}) in this workspace. The user copy is ignored here. "
106
+ f"Inspect origins with `specfact module list --show-origin`; if stale, clean user scope "
107
+ f"with `specfact module uninstall {module_name} --scope user`."
108
+ )
91
109
  if source in {"user", "marketplace", "custom"}:
92
- logger.warning(
93
- "Module '%s' from %s at '%s' is shadowed by higher-priority source.",
110
+ logger.debug(
111
+ "Module '%s' from %s at '%s' is shadowed by higher-priority source %s at '%s'.",
94
112
  module_name,
95
113
  source,
96
114
  package_dir,
115
+ existing.source,
116
+ existing.package_dir,
97
117
  )
98
118
  continue
99
119
 
100
- seen_names.add(module_name)
101
- discovered.append(
102
- DiscoveredModule(
103
- package_dir=package_dir,
104
- metadata=metadata,
105
- source=source,
106
- )
120
+ entry = DiscoveredModule(
121
+ package_dir=package_dir,
122
+ metadata=metadata,
123
+ source=source,
107
124
  )
125
+ seen_by_name[module_name] = entry
126
+ discovered.append(entry)
108
127
 
109
128
  return discovered
@@ -409,7 +409,7 @@ def install_module(
409
409
  manifest_path = final_path / "module-package.yaml"
410
410
 
411
411
  if manifest_path.exists() and not reinstall:
412
- logger.info("Module already installed (%s)", module_name)
412
+ logger.debug("Module already installed (%s)", module_name)
413
413
  return final_path
414
414
 
415
415
  archive_path = download_module(module_id, version=version)
@@ -481,7 +481,7 @@ def install_module(
481
481
  shutil.rmtree(staged_path)
482
482
  raise
483
483
 
484
- logger.info("Installed marketplace module '%s' to '%s'", module_id, final_path)
484
+ logger.debug("Installed marketplace module '%s' to '%s'", module_id, final_path)
485
485
  return final_path
486
486
 
487
487
 
@@ -519,7 +519,7 @@ def uninstall_module(
519
519
  if not module_path.exists():
520
520
  continue
521
521
  shutil.rmtree(module_path)
522
- logger.info("Uninstalled module '%s' from '%s'", module_name, root)
522
+ logger.debug("Uninstalled module '%s' from '%s'", module_name, root)
523
523
  return
524
524
 
525
525
  roots_str = ", ".join(str(root) for root in candidate_roots)
@@ -15,7 +15,6 @@ from specfact_cli.registry.module_packages import (
15
15
  discover_all_package_metadata,
16
16
  expand_disable_with_dependents,
17
17
  expand_enable_with_dependencies,
18
- get_discovered_modules_for_state,
19
18
  merge_module_state,
20
19
  validate_disable_safe,
21
20
  validate_enable_safe,
@@ -34,24 +33,24 @@ def get_modules_with_state(
34
33
  disable_ids: list[str] | None = None,
35
34
  ) -> list[dict[str, Any]]:
36
35
  """Return discovered modules with version, enabled state, source, and trust metadata."""
37
- modules_list = get_discovered_modules_for_state(enable_ids=enable_ids or [], disable_ids=disable_ids or [])
38
36
  discovered = discover_all_modules()
39
- source_map = {entry.metadata.name: entry.source for entry in discovered}
40
- official_map = {
41
- entry.metadata.name: bool(
42
- entry.metadata.publisher and entry.metadata.publisher.name.strip().lower() == "nold-ai"
37
+ discovered_list: list[tuple[str, str]] = [(entry.metadata.name, entry.metadata.version) for entry in discovered]
38
+ state = read_modules_state()
39
+ enabled_map = merge_module_state(discovered_list, state, enable_ids or [], disable_ids or [])
40
+
41
+ modules_list: list[dict[str, Any]] = []
42
+ for entry in discovered:
43
+ publisher_name = entry.metadata.publisher.name if entry.metadata.publisher else "unknown"
44
+ modules_list.append(
45
+ {
46
+ "id": entry.metadata.name,
47
+ "version": entry.metadata.version,
48
+ "enabled": enabled_map.get(entry.metadata.name, True),
49
+ "source": entry.source,
50
+ "official": bool(publisher_name.strip().lower() == "nold-ai"),
51
+ "publisher": publisher_name,
52
+ }
43
53
  )
44
- for entry in discovered
45
- }
46
- publisher_map = {
47
- entry.metadata.name: entry.metadata.publisher.name if entry.metadata.publisher else "unknown"
48
- for entry in discovered
49
- }
50
- for item in modules_list:
51
- module_id = str(item.get("id", ""))
52
- item["source"] = source_map.get(module_id, "unknown")
53
- item["official"] = official_map.get(module_id, False)
54
- item["publisher"] = publisher_map.get(module_id, "unknown")
55
54
  return modules_list
56
55
 
57
56
 
@@ -80,7 +79,11 @@ def apply_module_state_update(*, enable_ids: list[str], disable_ids: list[str],
80
79
  for module_id, dependents in blocked_disable.items():
81
80
  lines.append(f"Cannot disable '{module_id}': required by enabled modules: {', '.join(dependents)}")
82
81
  raise ValueError("\n".join(lines))
83
- modules_list = get_discovered_modules_for_state(enable_ids=enable_ids, disable_ids=disable_ids)
82
+ final_enabled_map = merge_module_state(discovered_list, state, enable_ids, disable_ids)
83
+ modules_list = [
84
+ {"id": meta.name, "version": meta.version, "enabled": final_enabled_map.get(meta.name, True)}
85
+ for _package_dir, meta in packages
86
+ ]
84
87
  write_modules_state(modules_list)
85
88
  run_discovery_and_write_cache(__version__)
86
89
  return get_modules_with_state()
@@ -831,7 +831,7 @@ def register_module_package_commands(
831
831
  f"schema version {meta.schema_version} required, current is {CURRENT_PROJECT_SCHEMA_VERSION}",
832
832
  )
833
833
  )
834
- logger.warning(
834
+ logger.debug(
835
835
  "Module %s: Schema version %s required, but current is %s (skipped)",
836
836
  meta.name,
837
837
  meta.schema_version,
@@ -841,7 +841,7 @@ def register_module_package_commands(
841
841
  if meta.schema_version is None:
842
842
  logger.debug("Module %s: No schema version declared (assuming current)", meta.name)
843
843
  else:
844
- logger.info("Module %s: Schema version %s (compatible)", meta.name, meta.schema_version)
844
+ logger.debug("Module %s: Schema version %s (compatible)", meta.name, meta.schema_version)
845
845
 
846
846
  if meta.schema_extensions:
847
847
  try:
@@ -892,7 +892,7 @@ def register_module_package_commands(
892
892
  elif operations:
893
893
  partial_modules.append((meta.name, operations))
894
894
  if is_debug_mode():
895
- logger.warning("Module %s: ModuleIOContract partial (%s)", meta.name, ", ".join(operations))
895
+ logger.info("Module %s: ModuleIOContract partial (%s)", meta.name, ", ".join(operations))
896
896
  protocol_partial += 1
897
897
  else:
898
898
  legacy_modules.append(meta.name)
File without changes
File without changes
File without changes