specfact-cli 0.40.2__tar.gz → 0.40.3__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 (277) hide show
  1. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/PKG-INFO +1 -1
  2. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/pyproject.toml +1 -1
  3. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/__init__.py +1 -1
  4. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/__init__.py +1 -1
  5. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/common/logger_setup.py +11 -5
  6. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/common/logging_utils.py +7 -1
  7. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/module_registry/module-package.yaml +3 -3
  8. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/module_registry/src/commands.py +22 -4
  9. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/module_installer.py +1 -1
  10. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/.gitignore +0 -0
  11. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/LICENSE +0 -0
  12. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/README.md +0 -0
  13. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/keys/README.md +0 -0
  14. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/keys/module-signing-public.pem +0 -0
  15. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/mappings/node-async.yaml +0 -0
  16. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/mappings/python-async.yaml +0 -0
  17. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/mappings/speckit-default.yaml +0 -0
  18. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/prompts/shared/cli-enforcement.md +0 -0
  19. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/prompts/specfact.01-import.md +0 -0
  20. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/prompts/specfact.02-plan.md +0 -0
  21. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/prompts/specfact.03-review.md +0 -0
  22. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/prompts/specfact.04-sdd.md +0 -0
  23. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/prompts/specfact.05-enforce.md +0 -0
  24. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/prompts/specfact.06-sync.md +0 -0
  25. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/prompts/specfact.07-contracts.md +0 -0
  26. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/prompts/specfact.compare.md +0 -0
  27. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/prompts/specfact.validate.md +0 -0
  28. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/schemas/deviation.schema.json +0 -0
  29. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/schemas/plan.schema.json +0 -0
  30. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/schemas/protocol.schema.json +0 -0
  31. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/github-action.yml.j2 +0 -0
  32. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/persona/architect.md.j2 +0 -0
  33. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/persona/developer.md.j2 +0 -0
  34. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/persona/product-owner.md.j2 +0 -0
  35. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/plan.bundle.yaml.j2 +0 -0
  36. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/policies/kanban.yaml +0 -0
  37. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/policies/mixed.yaml +0 -0
  38. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/policies/safe.yaml +0 -0
  39. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/policies/scrum.yaml +0 -0
  40. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/pr-template.md.j2 +0 -0
  41. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/protocol.yaml.j2 +0 -0
  42. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/resources/templates/telemetry.yaml.example +0 -0
  43. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/__main__.py +0 -0
  44. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/adapters/__init__.py +0 -0
  45. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/adapters/ado.py +0 -0
  46. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/adapters/backlog_base.py +0 -0
  47. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/adapters/base.py +0 -0
  48. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/adapters/github.py +0 -0
  49. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/adapters/openspec.py +0 -0
  50. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  51. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/adapters/registry.py +0 -0
  52. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/adapters/speckit.py +0 -0
  53. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/agents/__init__.py +0 -0
  54. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/agents/analyze_agent.py +0 -0
  55. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/agents/base.py +0 -0
  56. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/agents/plan_agent.py +0 -0
  57. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/agents/registry.py +0 -0
  58. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/agents/sync_agent.py +0 -0
  59. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/analyzers/__init__.py +0 -0
  60. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  61. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  62. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  63. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  64. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  65. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  66. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  67. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  68. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  69. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/backlog/__init__.py +0 -0
  70. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  71. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/backlog/adapters/base.py +0 -0
  72. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/backlog/converter.py +0 -0
  73. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/backlog/filters.py +0 -0
  74. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  75. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  76. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/backlog/mappers/base.py +0 -0
  77. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  78. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  79. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/cli.py +0 -0
  80. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/__init__.py +0 -0
  81. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/_bundle_shim.py +0 -0
  82. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/analyze.py +0 -0
  83. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/contract_cmd.py +0 -0
  84. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/drift.py +0 -0
  85. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/enforce.py +0 -0
  86. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/generate.py +0 -0
  87. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/import_cmd.py +0 -0
  88. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/init.py +0 -0
  89. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/migrate.py +0 -0
  90. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/plan.py +0 -0
  91. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/project_cmd.py +0 -0
  92. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/repro.py +0 -0
  93. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/sdd.py +0 -0
  94. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/spec.py +0 -0
  95. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/sync.py +0 -0
  96. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/update.py +0 -0
  97. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/commands/validate.py +0 -0
  98. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/common/__init__.py +0 -0
  99. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/common/bundle_factory.py +0 -0
  100. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/common/text_utils.py +0 -0
  101. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/common/utils.py +0 -0
  102. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/comparators/__init__.py +0 -0
  103. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  104. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/contracts/__init__.py +0 -0
  105. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  106. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/contracts/module_interface.py +0 -0
  107. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  108. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  109. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/generators/__init__.py +0 -0
  110. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/generators/contract_generator.py +0 -0
  111. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  112. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/generators/persona_exporter.py +0 -0
  113. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/generators/plan_generator.py +0 -0
  114. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/generators/protocol_generator.py +0 -0
  115. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/generators/report_generator.py +0 -0
  116. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/generators/task_generator.py +0 -0
  117. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  118. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/generators/workflow_generator.py +0 -0
  119. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/groups/__init__.py +0 -0
  120. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/groups/codebase_group.py +0 -0
  121. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/groups/govern_group.py +0 -0
  122. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/groups/member_group.py +0 -0
  123. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/groups/project_group.py +0 -0
  124. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/groups/spec_group.py +0 -0
  125. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/importers/__init__.py +0 -0
  126. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/importers/speckit_converter.py +0 -0
  127. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  128. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/integrations/__init__.py +0 -0
  129. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/integrations/specmatic.py +0 -0
  130. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/merge/__init__.py +0 -0
  131. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/merge/resolver.py +0 -0
  132. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/migrations/__init__.py +0 -0
  133. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  134. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/__init__.py +0 -0
  135. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/backlog_item.py +0 -0
  136. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/bridge.py +0 -0
  137. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/capabilities.py +0 -0
  138. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/change.py +0 -0
  139. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/contract.py +0 -0
  140. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/deviation.py +0 -0
  141. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/dor_config.py +0 -0
  142. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/enforcement.py +0 -0
  143. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/module_package.py +0 -0
  144. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/persona_template.py +0 -0
  145. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/plan.py +0 -0
  146. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/project.py +0 -0
  147. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/protocol.py +0 -0
  148. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/quality.py +0 -0
  149. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/sdd.py +0 -0
  150. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/source_tracking.py +0 -0
  151. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/task.py +0 -0
  152. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/models/validation.py +0 -0
  153. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modes/__init__.py +0 -0
  154. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modes/detector.py +0 -0
  155. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modes/router.py +0 -0
  156. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/__init__.py +0 -0
  157. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/_bundle_import.py +0 -0
  158. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/init/module-package.yaml +0 -0
  159. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/init/src/__init__.py +0 -0
  160. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/init/src/app.py +0 -0
  161. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/init/src/commands.py +0 -0
  162. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
  163. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/module_io_shim.py +0 -0
  164. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
  165. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
  166. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
  167. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
  168. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
  169. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
  170. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/parsers/__init__.py +0 -0
  171. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/parsers/persona_importer.py +0 -0
  172. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/__init__.py +0 -0
  173. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/alias_manager.py +0 -0
  174. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/bootstrap.py +0 -0
  175. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/bridge_registry.py +0 -0
  176. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/crypto_validator.py +0 -0
  177. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/custom_registries.py +0 -0
  178. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/dependency_resolver.py +0 -0
  179. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/extension_registry.py +0 -0
  180. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/help_cache.py +0 -0
  181. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/marketplace_client.py +0 -0
  182. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/metadata.py +0 -0
  183. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/module_discovery.py +0 -0
  184. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/module_grouping.py +0 -0
  185. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/module_lifecycle.py +0 -0
  186. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/module_packages.py +0 -0
  187. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/module_security.py +0 -0
  188. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/module_state.py +0 -0
  189. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/registry/registry.py +0 -0
  190. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  191. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  192. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  193. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/runtime.py +0 -0
  194. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/__init__.py +0 -0
  195. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/bridge_probe.py +0 -0
  196. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/bridge_sync.py +0 -0
  197. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/bridge_watch.py +0 -0
  198. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/change_detector.py +0 -0
  199. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/code_to_spec.py +0 -0
  200. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/drift_detector.py +0 -0
  201. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/repository_sync.py +0 -0
  202. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/spec_to_code.py +0 -0
  203. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  204. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/watcher.py +0 -0
  205. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  206. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/telemetry.py +0 -0
  207. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/templates/__init__.py +0 -0
  208. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  209. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  210. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  211. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  212. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  213. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  214. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  215. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/templates/registry.py +0 -0
  216. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/templates/specification_templates.py +0 -0
  217. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/__init__.py +0 -0
  218. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
  219. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/auth_tokens.py +0 -0
  220. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/bundle_converters.py +0 -0
  221. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/bundle_loader.py +0 -0
  222. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/code_change_detector.py +0 -0
  223. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/console.py +0 -0
  224. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  225. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/context_detection.py +0 -0
  226. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/enrichment_context.py +0 -0
  227. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/enrichment_parser.py +0 -0
  228. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/env_manager.py +0 -0
  229. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/feature_keys.py +0 -0
  230. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/git.py +0 -0
  231. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/github_annotations.py +0 -0
  232. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/ide_setup.py +0 -0
  233. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/incremental_check.py +0 -0
  234. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/metadata.py +0 -0
  235. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/optional_deps.py +0 -0
  236. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/performance.py +0 -0
  237. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/persona_ownership.py +0 -0
  238. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/progress.py +0 -0
  239. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  240. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/prompts.py +0 -0
  241. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  242. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/source_scanner.py +0 -0
  243. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/startup_checks.py +0 -0
  244. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/structure.py +0 -0
  245. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/structured_io.py +0 -0
  246. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/suggestions.py +0 -0
  247. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/terminal.py +0 -0
  248. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/utils/yaml_utils.py +0 -0
  249. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validation/__init__.py +0 -0
  250. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validation/command_audit.py +0 -0
  251. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/__init__.py +0 -0
  252. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/agile_validation.py +0 -0
  253. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  254. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  255. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/contract_validator.py +0 -0
  256. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/fsm.py +0 -0
  257. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/repro_checker.py +0 -0
  258. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/schema.py +0 -0
  259. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  260. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  261. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  262. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  263. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
  264. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  265. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  266. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  267. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  268. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  269. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  270. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  271. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  272. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/models.py +0 -0
  273. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
  274. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  275. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  276. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/src/specfact_cli/versioning/__init__.py +0 -0
  277. {specfact_cli-0.40.2 → specfact_cli-0.40.3}/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.40.2
3
+ Version: 0.40.3
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.40.2"
7
+ version = "0.40.3"
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"
@@ -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.40.2"
6
+ __version__ = "0.40.3"
@@ -42,6 +42,6 @@ def _bootstrap_bundle_paths() -> None:
42
42
 
43
43
  _bootstrap_bundle_paths()
44
44
 
45
- __version__ = "0.40.2"
45
+ __version__ = "0.40.3"
46
46
 
47
47
  __all__ = ["__version__"]
@@ -396,6 +396,7 @@ class LoggerSetup:
396
396
  use_rotating_file: bool = True,
397
397
  append_mode: bool = True,
398
398
  preserve_test_format: bool = False,
399
+ emit_to_console: bool = True,
399
400
  ) -> logging.Logger:
400
401
  """
401
402
  Creates a new logger or returns an existing one with the specified configuration.
@@ -513,15 +514,20 @@ class LoggerSetup:
513
514
  with contextlib.suppress(Exception):
514
515
  logger.info("[LoggerSetup] File logger initialized: %s", log_file_path)
515
516
  else:
516
- # If no log file is specified, set up a listener with a console handler
517
+ # If no log file is specified, stream to console only when explicitly requested.
517
518
  log_queue = Queue(-1)
518
519
  cls._log_queues[logger_name] = log_queue
519
520
 
520
- console_handler = logging.StreamHandler(_safe_console_stream())
521
- console_handler.setFormatter(log_format)
522
- console_handler.setLevel(level)
521
+ sink_handler: logging.Handler
522
+ if emit_to_console:
523
+ sink_handler = logging.StreamHandler(_safe_console_stream())
524
+ sink_handler.setFormatter(log_format)
525
+ sink_handler.setLevel(level)
526
+ else:
527
+ sink_handler = logging.NullHandler()
528
+ sink_handler.setLevel(level)
523
529
 
524
- listener = QueueListener(log_queue, console_handler, respect_handler_level=True)
530
+ listener = QueueListener(log_queue, sink_handler, respect_handler_level=True)
525
531
  listener.start()
526
532
  cls._log_listeners[logger_name] = listener
527
533
 
@@ -38,4 +38,10 @@ def _try_common_logger(name: str, level: str) -> logging.Logger | None:
38
38
  from specfact_cli.common.logger_setup import LoggerSetup # type: ignore[import]
39
39
  except ImportError:
40
40
  return None
41
- return LoggerSetup.create_logger(name, log_level=level)
41
+ try:
42
+ from specfact_cli.runtime import is_debug_mode # type: ignore[import]
43
+
44
+ emit_to_console = is_debug_mode()
45
+ except ImportError:
46
+ emit_to_console = False
47
+ return LoggerSetup.create_logger(name, log_level=level, emit_to_console=emit_to_console)
@@ -1,5 +1,5 @@
1
1
  name: module-registry
2
- version: 0.1.9
2
+ version: 0.1.10
3
3
  commands:
4
4
  - module
5
5
  category: core
@@ -17,5 +17,5 @@ publisher:
17
17
  description: 'Manage modules: search, list, show, install, and upgrade.'
18
18
  license: Apache-2.0
19
19
  integrity:
20
- checksum: sha256:d8d4103bfe44bc638fd5affa2734bbb063f9c86f2873055f745beca9ee0a9db3
21
- signature: OJtCXdfZfnLZhB543+ODtFRXgyYamZk6xrvLfHubE+kwU+jCPWaZDJ83YqheuR7kQlqMlRue5UZb3DbOu4pwBQ==
20
+ checksum: sha256:85e40c4c083982f0bab2bde2a27a08a4e6832fe6d93ae3d62c4659c138fd6295
21
+ signature: INFP+nx7iPCqZPnGIwB39L6GpckB16+EqPwaPW/kwwBtlLBX9RaZ1DcMbhu5f6tPqjA9sETRMBtrQ5GiBbVfCQ==
@@ -7,6 +7,7 @@ import shutil
7
7
  from pathlib import Path
8
8
 
9
9
  import typer
10
+ import yaml
10
11
  from beartype import beartype
11
12
  from rich.console import Console
12
13
  from rich.table import Table
@@ -39,6 +40,20 @@ app = typer.Typer(help="Manage marketplace modules")
39
40
  console = Console()
40
41
 
41
42
 
43
+ def _read_installed_module_version(module_dir: Path) -> str:
44
+ """Read installed module version from its manifest, if available."""
45
+ manifest_path = module_dir / "module-package.yaml"
46
+ if not manifest_path.exists():
47
+ return "unknown"
48
+ try:
49
+ loaded = yaml.safe_load(manifest_path.read_text(encoding="utf-8"))
50
+ except Exception:
51
+ return "unknown"
52
+ if not isinstance(loaded, dict):
53
+ return "unknown"
54
+ return str(loaded.get("version", "unknown"))
55
+
56
+
42
57
  def _publisher_from_module_id(module_id: str) -> str:
43
58
  """Extract normalized publisher namespace from module id."""
44
59
  return module_id.split("/", 1)[0].strip().lower() if "/" in module_id else ""
@@ -803,19 +818,22 @@ def upgrade(
803
818
  # If module isn't discovered locally, still attempt marketplace install/upgrade by ID.
804
819
  target_ids = [prefixed]
805
820
 
806
- upgraded: list[str] = []
821
+ upgraded: list[tuple[str, str, str]] = []
807
822
  failed: list[str] = []
808
823
  for target in target_ids:
809
824
  try:
810
825
  module_id = target if "/" in target else f"specfact/{target}"
811
- install_module(module_id, reinstall=True)
812
- upgraded.append(module_id)
826
+ previous_version = str(by_id.get(target, {}).get("version", "unknown"))
827
+ installed_path = install_module(module_id, reinstall=True)
828
+ upgraded.append((module_id, previous_version, _read_installed_module_version(installed_path)))
813
829
  except Exception as exc:
814
830
  console.print(f"[red]Failed upgrading {target}: {exc}[/red]")
815
831
  failed.append(target)
816
832
 
817
833
  if upgraded:
818
- console.print(f"[green]Upgraded[/green] {', '.join(upgraded)}")
834
+ console.print("[green]Upgraded:[/green]")
835
+ for module_id, previous_version, new_version in upgraded:
836
+ console.print(f" {module_id}: {previous_version} -> {new_version}")
819
837
  if failed:
820
838
  raise typer.Exit(1)
821
839
 
@@ -730,7 +730,7 @@ def install_module(
730
730
  dependency_manifest = target_root / dependency_name / "module-package.yaml"
731
731
  if dependency_manifest.exists():
732
732
  dependency_version = _installed_dependency_version(dependency_manifest)
733
- logger.warning(
733
+ logger.info(
734
734
  "Dependency %s already satisfied (version %s)", dependency_module_id, dependency_version
735
735
  )
736
736
  continue
File without changes
File without changes
File without changes