specfact-cli 0.37.2__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.2 → specfact_cli-0.37.4}/PKG-INFO +1 -1
  2. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/pyproject.toml +1 -1
  3. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/__init__.py +1 -1
  4. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/__init__.py +1 -1
  5. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/analyze/module-package.yaml +3 -3
  6. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/auth/module-package.yaml +3 -3
  7. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/module-package.yaml +3 -3
  8. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/commands.py +48 -8
  9. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/contract/module-package.yaml +3 -3
  10. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/drift/module-package.yaml +3 -3
  11. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/enforce/module-package.yaml +3 -3
  12. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/generate/module-package.yaml +3 -3
  13. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/import_cmd/module-package.yaml +3 -3
  14. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/init/module-package.yaml +3 -3
  15. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/migrate/module-package.yaml +3 -3
  16. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/module_registry/module-package.yaml +3 -3
  17. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/module_registry/src/commands.py +3 -2
  18. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/module-package.yaml +3 -3
  19. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/plan/module-package.yaml +3 -3
  20. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/module-package.yaml +3 -3
  21. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/project/module-package.yaml +3 -3
  22. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/repro/module-package.yaml +3 -3
  23. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/sdd/module-package.yaml +3 -3
  24. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/spec/module-package.yaml +3 -3
  25. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/sync/module-package.yaml +3 -3
  26. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/upgrade/module-package.yaml +3 -3
  27. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/validate/module-package.yaml +3 -3
  28. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/marketplace_client.py +1 -1
  29. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_discovery.py +30 -11
  30. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_installer.py +22 -8
  31. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_lifecycle.py +21 -18
  32. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_packages.py +8 -3
  33. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/.gitignore +0 -0
  34. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/LICENSE +0 -0
  35. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/README.md +0 -0
  36. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/keys/README.md +0 -0
  37. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/keys/module-signing-public.pem +0 -0
  38. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/mappings/node-async.yaml +0 -0
  39. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/mappings/python-async.yaml +0 -0
  40. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/mappings/speckit-default.yaml +0 -0
  41. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/shared/cli-enforcement.md +0 -0
  42. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.01-import.md +0 -0
  43. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.02-plan.md +0 -0
  44. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.03-review.md +0 -0
  45. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.04-sdd.md +0 -0
  46. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.05-enforce.md +0 -0
  47. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.06-sync.md +0 -0
  48. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.07-contracts.md +0 -0
  49. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.backlog-add.md +0 -0
  50. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.backlog-daily.md +0 -0
  51. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.backlog-refine.md +0 -0
  52. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.compare.md +0 -0
  53. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.sync-backlog.md +0 -0
  54. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/prompts/specfact.validate.md +0 -0
  55. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/schemas/deviation.schema.json +0 -0
  56. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/schemas/plan.schema.json +0 -0
  57. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/schemas/protocol.schema.json +0 -0
  58. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/defaults/defect_v1.yaml +0 -0
  59. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/defaults/enabler_v1.yaml +0 -0
  60. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/defaults/spike_v1.yaml +0 -0
  61. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/defaults/user_story_v1.yaml +0 -0
  62. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/field_mappings/ado_agile.yaml +0 -0
  63. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/field_mappings/ado_default.yaml +0 -0
  64. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/field_mappings/ado_kanban.yaml +0 -0
  65. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/field_mappings/ado_safe.yaml +0 -0
  66. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/field_mappings/ado_scrum.yaml +0 -0
  67. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/frameworks/safe/safe_feature_v1.yaml +0 -0
  68. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/frameworks/scrum/user_story_v1.yaml +0 -0
  69. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/personas/developer/developer_task_v1.yaml +0 -0
  70. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/personas/product-owner/user_story_v1.yaml +0 -0
  71. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/backlog/providers/ado/work_item_v1.yaml +0 -0
  72. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/github-action.yml.j2 +0 -0
  73. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/persona/architect.md.j2 +0 -0
  74. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/persona/developer.md.j2 +0 -0
  75. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/persona/product-owner.md.j2 +0 -0
  76. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/plan.bundle.yaml.j2 +0 -0
  77. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/policies/kanban.yaml +0 -0
  78. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/policies/mixed.yaml +0 -0
  79. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/policies/safe.yaml +0 -0
  80. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/policies/scrum.yaml +0 -0
  81. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/pr-template.md.j2 +0 -0
  82. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/protocol.yaml.j2 +0 -0
  83. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/resources/templates/telemetry.yaml.example +0 -0
  84. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/__main__.py +0 -0
  85. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/adapters/__init__.py +0 -0
  86. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/adapters/ado.py +0 -0
  87. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/adapters/backlog_base.py +0 -0
  88. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/adapters/base.py +0 -0
  89. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/adapters/github.py +0 -0
  90. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/adapters/openspec.py +0 -0
  91. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  92. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/adapters/registry.py +0 -0
  93. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/adapters/speckit.py +0 -0
  94. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/agents/__init__.py +0 -0
  95. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/agents/analyze_agent.py +0 -0
  96. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/agents/base.py +0 -0
  97. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/agents/plan_agent.py +0 -0
  98. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/agents/registry.py +0 -0
  99. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/agents/sync_agent.py +0 -0
  100. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/__init__.py +0 -0
  101. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  102. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  103. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  104. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  105. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  106. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  107. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  108. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  109. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  110. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/__init__.py +0 -0
  111. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  112. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/adapters/base.py +0 -0
  113. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/adapters/local_yaml_adapter.py +0 -0
  114. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/ai_refiner.py +0 -0
  115. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/converter.py +0 -0
  116. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/filters.py +0 -0
  117. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/format_detector.py +0 -0
  118. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/formats/__init__.py +0 -0
  119. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/formats/base.py +0 -0
  120. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/formats/markdown_format.py +0 -0
  121. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/formats/structured_format.py +0 -0
  122. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  123. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  124. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/mappers/base.py +0 -0
  125. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  126. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  127. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/backlog/template_detector.py +0 -0
  128. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/cli.py +0 -0
  129. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/__init__.py +0 -0
  130. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/analyze.py +0 -0
  131. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/auth.py +0 -0
  132. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/backlog_commands.py +0 -0
  133. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/contract_cmd.py +0 -0
  134. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/drift.py +0 -0
  135. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/enforce.py +0 -0
  136. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/generate.py +0 -0
  137. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/import_cmd.py +0 -0
  138. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/init.py +0 -0
  139. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/migrate.py +0 -0
  140. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/plan.py +0 -0
  141. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/project_cmd.py +0 -0
  142. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/repro.py +0 -0
  143. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/sdd.py +0 -0
  144. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/spec.py +0 -0
  145. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/sync.py +0 -0
  146. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/update.py +0 -0
  147. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/commands/validate.py +0 -0
  148. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/common/__init__.py +0 -0
  149. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/common/logger_setup.py +0 -0
  150. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/common/logging_utils.py +0 -0
  151. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/common/text_utils.py +0 -0
  152. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/common/utils.py +0 -0
  153. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/comparators/__init__.py +0 -0
  154. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  155. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/contracts/__init__.py +0 -0
  156. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  157. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/contracts/module_interface.py +0 -0
  158. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  159. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  160. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/generators/__init__.py +0 -0
  161. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/generators/contract_generator.py +0 -0
  162. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  163. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/generators/persona_exporter.py +0 -0
  164. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/generators/plan_generator.py +0 -0
  165. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/generators/protocol_generator.py +0 -0
  166. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/generators/report_generator.py +0 -0
  167. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/generators/task_generator.py +0 -0
  168. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  169. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/generators/workflow_generator.py +0 -0
  170. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/importers/__init__.py +0 -0
  171. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/importers/speckit_converter.py +0 -0
  172. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  173. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/integrations/__init__.py +0 -0
  174. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/integrations/specmatic.py +0 -0
  175. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/merge/__init__.py +0 -0
  176. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/merge/resolver.py +0 -0
  177. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/migrations/__init__.py +0 -0
  178. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  179. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/__init__.py +0 -0
  180. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/backlog_item.py +0 -0
  181. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/bridge.py +0 -0
  182. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/capabilities.py +0 -0
  183. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/change.py +0 -0
  184. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/contract.py +0 -0
  185. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/deviation.py +0 -0
  186. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/dor_config.py +0 -0
  187. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/enforcement.py +0 -0
  188. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/module_package.py +0 -0
  189. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/persona_template.py +0 -0
  190. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/plan.py +0 -0
  191. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/project.py +0 -0
  192. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/protocol.py +0 -0
  193. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/quality.py +0 -0
  194. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/sdd.py +0 -0
  195. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/source_tracking.py +0 -0
  196. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/task.py +0 -0
  197. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/models/validation.py +0 -0
  198. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modes/__init__.py +0 -0
  199. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modes/detector.py +0 -0
  200. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modes/router.py +0 -0
  201. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/__init__.py +0 -0
  202. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/analyze/src/__init__.py +0 -0
  203. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/analyze/src/app.py +0 -0
  204. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/analyze/src/commands.py +0 -0
  205. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/auth/src/__init__.py +0 -0
  206. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/auth/src/app.py +0 -0
  207. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/auth/src/commands.py +0 -0
  208. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/__init__.py +0 -0
  209. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/__init__.py +0 -0
  210. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/ado.py +0 -0
  211. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/base.py +0 -0
  212. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/github.py +0 -0
  213. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/jira.py +0 -0
  214. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/adapters/linear.py +0 -0
  215. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/backlog/src/app.py +0 -0
  216. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/contract/src/__init__.py +0 -0
  217. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/contract/src/app.py +0 -0
  218. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/contract/src/commands.py +0 -0
  219. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/drift/src/__init__.py +0 -0
  220. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/drift/src/app.py +0 -0
  221. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/drift/src/commands.py +0 -0
  222. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/enforce/src/__init__.py +0 -0
  223. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/enforce/src/app.py +0 -0
  224. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/enforce/src/commands.py +0 -0
  225. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/generate/src/__init__.py +0 -0
  226. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/generate/src/app.py +0 -0
  227. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/generate/src/commands.py +0 -0
  228. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/import_cmd/src/__init__.py +0 -0
  229. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/import_cmd/src/app.py +0 -0
  230. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/import_cmd/src/commands.py +0 -0
  231. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/init/src/__init__.py +0 -0
  232. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/init/src/app.py +0 -0
  233. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/init/src/commands.py +0 -0
  234. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/migrate/src/__init__.py +0 -0
  235. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/migrate/src/app.py +0 -0
  236. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/migrate/src/commands.py +0 -0
  237. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/module_io_shim.py +0 -0
  238. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
  239. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
  240. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/app.py +0 -0
  241. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/commands.py +0 -0
  242. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/__init__.py +0 -0
  243. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/__init__.py +0 -0
  244. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/apply.py +0 -0
  245. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/__init__.py +0 -0
  246. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/applier.py +0 -0
  247. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/generator.py +0 -0
  248. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/idempotency.py +0 -0
  249. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/plan/src/__init__.py +0 -0
  250. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/plan/src/app.py +0 -0
  251. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/plan/src/commands.py +0 -0
  252. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/app.py +0 -0
  253. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/commands.py +0 -0
  254. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/__init__.py +0 -0
  255. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/config/__init__.py +0 -0
  256. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/config/policy_config.py +0 -0
  257. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/config/templates.py +0 -0
  258. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/__init__.py +0 -0
  259. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/suggester.py +0 -0
  260. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/validator.py +0 -0
  261. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/main.py +0 -0
  262. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/models/__init__.py +0 -0
  263. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/models/policy_result.py +0 -0
  264. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/__init__.py +0 -0
  265. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/kanban.py +0 -0
  266. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/safe.py +0 -0
  267. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/scrum.py +0 -0
  268. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/__init__.py +0 -0
  269. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/policy_registry.py +0 -0
  270. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/project/src/__init__.py +0 -0
  271. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/project/src/app.py +0 -0
  272. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/project/src/commands.py +0 -0
  273. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/repro/src/__init__.py +0 -0
  274. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/repro/src/app.py +0 -0
  275. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/repro/src/commands.py +0 -0
  276. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/sdd/src/__init__.py +0 -0
  277. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/sdd/src/app.py +0 -0
  278. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/sdd/src/commands.py +0 -0
  279. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/spec/src/__init__.py +0 -0
  280. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/spec/src/app.py +0 -0
  281. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/spec/src/commands.py +0 -0
  282. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/sync/src/__init__.py +0 -0
  283. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/sync/src/app.py +0 -0
  284. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/sync/src/commands.py +0 -0
  285. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
  286. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
  287. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
  288. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/validate/src/__init__.py +0 -0
  289. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/validate/src/app.py +0 -0
  290. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/modules/validate/src/commands.py +0 -0
  291. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/parsers/__init__.py +0 -0
  292. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/parsers/persona_importer.py +0 -0
  293. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/__init__.py +0 -0
  294. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/bootstrap.py +0 -0
  295. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/bridge_registry.py +0 -0
  296. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/crypto_validator.py +0 -0
  297. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/extension_registry.py +0 -0
  298. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/help_cache.py +0 -0
  299. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/metadata.py +0 -0
  300. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_security.py +0 -0
  301. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/module_state.py +0 -0
  302. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/registry/registry.py +0 -0
  303. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  304. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  305. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  306. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/runtime.py +0 -0
  307. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/__init__.py +0 -0
  308. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/bridge_probe.py +0 -0
  309. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/bridge_sync.py +0 -0
  310. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/bridge_watch.py +0 -0
  311. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/change_detector.py +0 -0
  312. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/code_to_spec.py +0 -0
  313. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/drift_detector.py +0 -0
  314. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/repository_sync.py +0 -0
  315. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/spec_to_code.py +0 -0
  316. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  317. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/watcher.py +0 -0
  318. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  319. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/telemetry.py +0 -0
  320. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/__init__.py +0 -0
  321. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/bridge_templates.py +0 -0
  322. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  323. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  324. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  325. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  326. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  327. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  328. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  329. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/registry.py +0 -0
  330. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/templates/specification_templates.py +0 -0
  331. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/__init__.py +0 -0
  332. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
  333. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/auth_tokens.py +0 -0
  334. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/bundle_converters.py +0 -0
  335. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/bundle_loader.py +0 -0
  336. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/code_change_detector.py +0 -0
  337. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/console.py +0 -0
  338. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  339. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/context_detection.py +0 -0
  340. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/enrichment_context.py +0 -0
  341. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/enrichment_parser.py +0 -0
  342. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/env_manager.py +0 -0
  343. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/feature_keys.py +0 -0
  344. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/git.py +0 -0
  345. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/github_annotations.py +0 -0
  346. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/ide_setup.py +0 -0
  347. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/incremental_check.py +0 -0
  348. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/metadata.py +0 -0
  349. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/optional_deps.py +0 -0
  350. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/performance.py +0 -0
  351. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/persona_ownership.py +0 -0
  352. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/progress.py +0 -0
  353. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  354. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/prompts.py +0 -0
  355. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  356. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/source_scanner.py +0 -0
  357. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/startup_checks.py +0 -0
  358. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/structure.py +0 -0
  359. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/structured_io.py +0 -0
  360. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/suggestions.py +0 -0
  361. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/terminal.py +0 -0
  362. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/utils/yaml_utils.py +0 -0
  363. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/__init__.py +0 -0
  364. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/agile_validation.py +0 -0
  365. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  366. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  367. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/contract_validator.py +0 -0
  368. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/fsm.py +0 -0
  369. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/repro_checker.py +0 -0
  370. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/schema.py +0 -0
  371. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  372. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  373. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  374. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  375. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
  376. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  377. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  378. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  379. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  380. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  381. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  382. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  383. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  384. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/models.py +0 -0
  385. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
  386. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  387. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  388. {specfact_cli-0.37.2 → specfact_cli-0.37.4}/src/specfact_cli/versioning/__init__.py +0 -0
  389. {specfact_cli-0.37.2 → 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.2
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.2"
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"
@@ -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.37.2"
6
+ __version__ = "0.37.3"
@@ -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.2"
11
+ __version__ = "0.37.4"
12
12
 
13
13
  __all__ = ["__version__"]
@@ -1,5 +1,5 @@
1
1
  name: analyze
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - analyze
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Analyze codebase quality, contracts, and architecture signals.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:8f0919570eb25f9643f3f4557f40d8137c4754e4422ff71bdbb7ed2aa04e4bff
19
- signature: 6sTJRGUeApach2vdwQJubd3bHaJm2bu7b46DnUFJGAZ95X6dLMCyuCWVdxTRA6kX3YHblYZD8SfFwAPPsl1KAg==
18
+ checksum: sha256:49d908578ab91e142cff50a27d9b15fff3a30cf790597eecbea1910e38a754b6
19
+ signature: CqsLSUUx3DYa0a8F56/OW4QFt6TDhx1OueAwI0tYC892S7RlvaF5JEwKcUXujKD2IQRoOKUQ7d0Gdqs8Kwh2Cw==
@@ -1,5 +1,5 @@
1
1
  name: auth
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - auth
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Authenticate SpecFact with supported DevOps providers.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:fd0c9ff643c73a25c229e5925b58446ff25af7ec5ab4412d3eff9704b4cc10c1
19
- signature: 4KKwmf58+3boa+2jMF9m2NvjGcXB6Jdjfu0C6MV5Io+XjF6FUPyOmf7iz2xH9afgTTeVLVdc7X5EjJJGm5tMAQ==
18
+ checksum: sha256:561fc420c18f9702b1cbb396cb1c0443909646ad8857f508d532d648fe812a9d
19
+ signature: IUFyErHdSMMRtdGCUjDZhkU6hujDv1J5IHQXKYelK4RGqeekYUFer13IeG7S1xZZ5ckmvsgF1592UsTCSV2BAA==
@@ -1,5 +1,5 @@
1
1
  name: backlog
2
- version: 0.37.2
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:6d31c481c40241a744ffa255d29bcf834e5715de310f58f7ebc74e19f1e4fd8d
32
- signature: 20mO8sayOcVV992iqYROkQL/Q7jxjJE3re1fWYbTLIW7HPskNg1CROpCnaeUv9dr629qPMs/YVlzadMl317VDw==
31
+ checksum: sha256:ef3febe90c62fa24b3da6b6b2f8a7b605c5b544db01aac10e5cfacc807bcca26
32
+ signature: 2b/UNbFlgRQiwJ+LrEQKyoYUi8lxeLGc4hrcTUdCinU9yXa1h6GvYpRkAkzRW8kxNNNsetphuf7hLZ3II3bNDQ==
@@ -4176,6 +4176,7 @@ def map_fields(
4176
4176
  "}"
4177
4177
  )
4178
4178
  repo_issue_types: dict[str, str] = {}
4179
+ repo_issue_types_error: str | None = None
4179
4180
  try:
4180
4181
  issue_types_data = _github_graphql(issue_types_query, {"owner": owner, "repo": repo_name})
4181
4182
  repository = (
@@ -4191,13 +4192,25 @@ def map_fields(
4191
4192
  type_id = str(node.get("id") or "").strip()
4192
4193
  if type_name and type_id:
4193
4194
  repo_issue_types[type_name] = type_id
4194
- except (requests.RequestException, ValueError):
4195
- # Keep flow resilient; ProjectV2 mapping can still be configured without repository issue type ids.
4195
+ except (requests.RequestException, ValueError) as error:
4196
+ repo_issue_types_error = str(error)
4196
4197
  repo_issue_types = {}
4197
4198
 
4198
4199
  if repo_issue_types:
4199
4200
  discovered = ", ".join(sorted(repo_issue_types.keys()))
4200
4201
  console.print(f"[cyan]Discovered repository issue types:[/cyan] {discovered}")
4202
+ else:
4203
+ console.print(
4204
+ "[red]Error:[/red] Could not discover repository issue types for this GitHub repository. "
4205
+ "Automatic issue Type updates require `github_issue_types.type_ids`."
4206
+ )
4207
+ if repo_issue_types_error:
4208
+ console.print(f"[dim]Details:[/dim] {repo_issue_types_error}")
4209
+ console.print(
4210
+ "[yellow]Hint:[/yellow] Re-authenticate with required scopes and rerun mapping: "
4211
+ "`specfact auth github --scopes repo,read:project,project`."
4212
+ )
4213
+ raise typer.Exit(1)
4201
4214
 
4202
4215
  cli_option_map: dict[str, str] = {}
4203
4216
  for entry in github_type_option:
@@ -4211,6 +4224,12 @@ def map_fields(
4211
4224
  if key and value:
4212
4225
  cli_option_map[key] = value
4213
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
+
4214
4233
  # Fast-path for fully specified non-interactive invocations.
4215
4234
  if project_ref and (github_type_field_id or "").strip() and cli_option_map:
4216
4235
  github_custom_mapping_file = _persist_github_custom_mapping_file(repo_issue_types)
@@ -4234,6 +4253,33 @@ def map_fields(
4234
4253
  console.print(f"[green]Custom mapping:[/green] {github_custom_mapping_file}")
4235
4254
  return
4236
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
+
4237
4283
  project_id = ""
4238
4284
  project_title = ""
4239
4285
  fields_nodes: list[dict[str, Any]] = []
@@ -4432,12 +4478,6 @@ def map_fields(
4432
4478
  if option_name and option_name in option_name_to_id:
4433
4479
  option_map[issue_type] = option_name_to_id[option_name]
4434
4480
 
4435
- issue_type_id_map = {
4436
- issue_type: repo_issue_types.get(issue_type, "")
4437
- for issue_type in ["epic", "feature", "story", "task", "bug"]
4438
- if repo_issue_types.get(issue_type)
4439
- }
4440
-
4441
4481
  settings_update: dict[str, Any] = {}
4442
4482
  if issue_type_id_map:
4443
4483
  settings_update["github_issue_types"] = {"type_ids": issue_type_id_map}
@@ -1,5 +1,5 @@
1
1
  name: contract
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - contract
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Validate and manage API contracts for project bundles.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:5cc204c3bab58765f19862a6fe2127ddb0b6f0b56422bfc078d69beb91398f0d
19
- signature: URMN7NMTIsPqZmtcDW4onpaH1Up4kpZaE49iyb3jaqN4x2KuEGDyU4uudhzu/4Pu1DObWu20c+aVfwtj26LbCQ==
18
+ checksum: sha256:ea7526559317a65684db0ecc8eaccd06a60dcb94361c95389e7a35cfd31279d3
19
+ signature: iJC2irFaSiWa9fdFjJYGpHlsyWKRNpoFmQSB+PY0ORS6y+gVHAPNGJL7iP5TFYB3I83szCWfmF+2hLeTyc1XDg==
@@ -1,5 +1,5 @@
1
1
  name: drift
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - drift
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Detect and report drift between code, plans, and specs.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:368d6beaf1b4356741c1dbdd8125800e466abb47d8a18e14e2c0f9c66c94397b
19
- signature: +gU8OTtpxWqIKTk2xoL4Msed1alxTk4soy/HYG4wJuOcwQgaxG7tM/WEWTRMCXHTN4kCiN+3Wqp975FUtW0UDw==
18
+ checksum: sha256:0bf406486ada20fa82273f62a46567a63231be00bca1aa0da335405081d868ee
19
+ signature: 22k+r94pdCPh7lP4UYZfvlNRlTQaSasXwzDJWE33I1Pzeq1hPRnyXBylx9x7IvdDqACLTnCIz5j6R8XKCu1WAQ==
@@ -1,5 +1,5 @@
1
1
  name: enforce
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - enforce
5
5
  command_help:
@@ -16,5 +16,5 @@ publisher:
16
16
  description: Apply governance policies and quality gates to bundles.
17
17
  license: Apache-2.0
18
18
  integrity:
19
- checksum: sha256:e93b26c59b548af9cc3230b18eb37aff8c3dc85132fed7457f19bdaaaef1e8a0
20
- signature: TcjUHtOLqZ3TNlUB8cq1gwUJY1qjzQ1z6mh8nokMLp+svvaGVJc6zlkcYTN8InmiCnrUoevfUutuDZvN2gGSDg==
19
+ checksum: sha256:444896a5ac47c50cac848e649bb509893ba8c62b382100ccbe2b65660dca6587
20
+ signature: Htf9gy0P5UmGmrDky3oLyl4GgVQoVJ6514f31O1v1Butyns4o49CF6mVZMqbOBh68ToloPUxG96E/1GEzM3QDg==
@@ -1,5 +1,5 @@
1
1
  name: generate
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - generate
5
5
  command_help:
@@ -16,5 +16,5 @@ publisher:
16
16
  description: Generate implementation artifacts from plans and SDD.
17
17
  license: Apache-2.0
18
18
  integrity:
19
- checksum: sha256:16e7312d299e4c1c4ceedea2fdcead13ffd81e795e810fbd6ffabb5d0352d744
20
- signature: mkgqkfF8n6gix2oAlV62FJEwIJfZ0ruiiMLcV5KmiH5v9OmuuHFK4NPZxC7nBbRXWoTz2jPD0uEnsU+DIakbCg==
19
+ checksum: sha256:c1b01eea7f1de8e71fd61ac02caae27b10e133131683804356f01c9c6171a955
20
+ signature: dKokcDKA0v/xJ4SDWDvFEtCdVFScgyygdoJZlD7LgSQeucpi8csKLMW97XOaOUZCtNUsVm194EWBnIzLf70+CA==
@@ -1,5 +1,5 @@
1
1
  name: import_cmd
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - import
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Import projects and requirements from code and external tools.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:ed7387b3bc4de4fc6e320b976f180befe49961669c337257851de7da385d9ca4
19
- signature: j2HV/fWLN7nzmTzWseUIPNv+E0gw5Pif4+a8c6Qe8eHimUxnx6OAauLV9HgawdW9GG52YkDIwpTOkAZ6BBLCBg==
18
+ checksum: sha256:246f8402200e57947a50f61102ef8057dd75a6ad2768d359774600557daead8b
19
+ signature: sCgBiKEtN5r2br/6ZAYmII7XjjZ9Ru8WqqPfXXaE2shn0eQBiDxKKH/ATNBZphtYJbTfXEpQFZg3oVja4jITCg==
@@ -1,5 +1,5 @@
1
1
  name: init
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - init
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Initialize SpecFact workspace and bootstrap local configuration.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:38a3261dd947f5827b1a67b34970c0ab81c13de6d2657d7cf5af694da6da8436
19
- signature: khTbNy9iE3eXBNWo0+/Cb2B533U1PrLLNKtPnRiJPKNCQTrlfxhWvG+GEcnnFUinSTnfsjY9Of5GJYOuhJyACA==
18
+ checksum: sha256:ebd53092241acd0bf53db40a001529b98ee001244b04223cfe855d7fdcbc607d
19
+ signature: NrPV9fl6k7W47hi4hkbNhsS8EX0CfB8zlAFucesUwbMYHgGZl9TvfsBwObeHWh+R1eqskTUf+sxivl6lv/1mAg==
@@ -1,5 +1,5 @@
1
1
  name: migrate
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - migrate
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Migrate project bundles across supported structure versions.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:365f469ff6b6fe9f80cb1cf078adf4da7acceed04c5d18b3a0b37b8c1e58547b
19
- signature: APKTWd9UPlnBk4ypohLr3qernnOqIWO0sn7ABgozdD62tTqWnZe5lYRk1xJzXFRxCqO+aL+6/Xdcl8M72OfABw==
18
+ checksum: sha256:0173eddfed089e7979d608f44d7e3e5505567d0e32b722a56d87a59ea0a5699f
19
+ signature: Hoo1BBhAN24s8YpEPsWEyMPv6eL6apeBiX8VCALst5b/77ZpOCCcsSSGFUrNQMWD/L7pxDphTzKhGPP8W1t7DQ==
@@ -1,5 +1,5 @@
1
1
  name: module-registry
2
- version: 0.37.2
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:ce1d40c3c62dcd8d15181ff263811a6c28a88070dd672fba74e09eea64a830e6
19
- signature: TIK6aQt7hyoxM11M8XYByKP7s9DlK7+F1h0mVxCRuQyznTV0Pq8c56XD7if+GhBFptqPB94NwQ36rPdjqOCSDw==
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:
@@ -1,5 +1,5 @@
1
1
  name: patch-mode
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - patch
5
5
  command_help:
@@ -16,5 +16,5 @@ publisher:
16
16
  description: Prepare, review, and apply structured repository patches safely.
17
17
  license: Apache-2.0
18
18
  integrity:
19
- checksum: sha256:afc1985b0a9385055acf7efdf20d314198429bfdbf33a68bfbe8f8add0476456
20
- signature: qcy6s/cQQ2WKo1wGB+PmAKyTcuWl+JmfHs4afP06420raW9mKV5fuuSTABcYH8V9hblyeloHV+I9YuwieDZhBg==
19
+ checksum: sha256:9f6ceb4ea1a9539cd900d63065bcd36b8681d56d58dfca6835687ba5c58d5272
20
+ signature: 2f8u+wSUKnC5KTIvHt/Qcor0r1J7Pv3FDhdts2OsIEHPCeXtIwoN2XU3CyRlpr+Zyg3+T++OO4Rv7akiWPK1Bw==
@@ -1,5 +1,5 @@
1
1
  name: plan
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - plan
5
5
  command_help:
@@ -16,5 +16,5 @@ publisher:
16
16
  description: Create and manage implementation plans for project execution.
17
17
  license: Apache-2.0
18
18
  integrity:
19
- checksum: sha256:60f6ea69f2178bb8395ab19743318849b2caea1aad9a880d230da5c87236fd3e
20
- signature: luy557R50WTq4gvm3Equ5SV1RMDJOs+szawTwEpgl8eGTuuDd24Nxakb9erW7qzbV5Cn0COsZffUfKvNzH4jBw==
19
+ checksum: sha256:f7d992a44b0bcee0a6cc3cb4857dbe9c57a3bbe314398893f1337c8c5e4070b6
20
+ signature: MI5BELFxfgZNusPlP6lLKSEdRZR5MdjyOE+IsVutMJHWESmCoO9SmlzycZbHYKBdz9v2BI04kcXsy/AI4+fjDQ==
@@ -1,5 +1,5 @@
1
1
  name: policy-engine
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - policy
5
5
  command_help:
@@ -19,8 +19,8 @@ publisher:
19
19
  url: https://github.com/nold-ai/specfact-cli-modules
20
20
  email: oss@nold.ai
21
21
  integrity:
22
- checksum: sha256:a239acb53ba59ca7d1f1063c90d60037a2501813d074aae0a4c4590b70a34648
23
- signature: lG2M7QVkbaomLebkqLH3rRi64YCDGiABkaZfxl8082TSGfIcZ9K0gPXgNeEQZIKVZcVM9UnJe7NZ/fiQXr/JAw==
22
+ checksum: sha256:45d56fe74e32db9713d42ea622143da1c9b4403c7b22d148ada1fda0060226cf
23
+ signature: q0kWPGTaqZTTnFglm8OuHqJyngGLtXnAYeKJp69R/gzzX6QIVZ11bo6mtByG4NKX9KmjXKxOI3JVXWCu3sDOAw==
24
24
  dependencies: []
25
25
  description: Run policy evaluations with recommendation and compliance outputs.
26
26
  license: Apache-2.0
@@ -1,5 +1,5 @@
1
1
  name: project
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - project
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Manage project bundles, contexts, and lifecycle workflows.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:80789cfb916a67bbbcd2c9416ebae21fe79affb60596d0bc218777c6652cf5d7
19
- signature: RI2XsxN5BBurAWYlAAYm4amcCWsJ/McnJUqSua/2mDGx/KW7WoXVaMD4xccCatjTDqL6Lr7ctkVh4iQ6wTqoDg==
18
+ checksum: sha256:bb6a1c0004d242fa6829975d307470f6f9b895690d4052ae6a9d7a64ec9c7a25
19
+ signature: HIX5WUIWEpjcIZ/lYD9bTk0HqmUXaJ68EZmiS3+IIjx3/GiQ0VcW+QtMxOpRZxYA/MnHZvIB5PdQGjOeahA/Bg==
@@ -1,5 +1,5 @@
1
1
  name: repro
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - repro
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Run reproducible validation and diagnostics workflows end-to-end.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:c319deb6f08acc010d14202ed0d643309b24aaa5399f1c235dd44a388df16ca1
19
- signature: rk3tPivhE4DLpxNZ7pSodnehc9VwmDBoVp5+7RYcNFQ/vNXeTJ++fiXU1lI6rHHIEf2MZEPqMcZ2UpCkOKBwAg==
18
+ checksum: sha256:b7082bc1c0ed330a20b97ce52baf93f9686854babe28d412063e05821f3fbc62
19
+ signature: pY7zG/pOURam2csn6HH92scnRY553QMhPnNPEkcfiau8L3pfIauaXtdgt8L27Cq3ARteT6hUK8xkUffQujYBDg==
@@ -1,5 +1,5 @@
1
1
  name: sdd
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - sdd
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Create and validate Spec-Driven Development manifests and mappings.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:13fba474517e8c1d74e4972b0d232b074a0b20a2f1860cb2b935f3cf000a682f
19
- signature: NCuP7ytnX9XbWdlqFCaerqOsRzOiv7atY/w/ibIngAJGpFCelBwLnbf4qGHqMP10oJCAQh2oWV/13mAm6IYpCw==
18
+ checksum: sha256:1d5e11925f8e578dc3186baad6cf6e6beed9af2824d21967ae56440d65f36222
19
+ signature: rJtZAsUXpIeBkLx8Oe0LgMPKs4pSof52r0FhHAOCDaR/Y2559XAKOUcNYdBkyO1BwosCbZqvmEEf1gZzZKwLAQ==
@@ -1,5 +1,5 @@
1
1
  name: spec
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - spec
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Integrate and run API specification and contract checks.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:9f94350b959ab97fbb309ecdd0aaaf52137ae7cbae16b66078fde7d38406f39c
19
- signature: +UoWzNOY5pHJzrff3Rt85xnXhae/Tbsxhv4e5oH+siIIcdTjp+8qK9ZESAsT44YgqufcjiRoTi/Ld6z8s675CQ==
18
+ checksum: sha256:f14970c58bed5647cfcdc76933f4c7af22c186ef89f74d63bb97df3a5e4a09c4
19
+ signature: /V0wm4tU6gKoXZ29AX9FiICdF0loq/N9OVvQyQ5ICtVarJFBQLUPeYZJup5/PJgIrhjZxDr6Ih+wLG6gZBtLAg==
@@ -1,5 +1,5 @@
1
1
  name: sync
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - sync
5
5
  command_help:
@@ -18,5 +18,5 @@ publisher:
18
18
  description: Synchronize repository state with connected external systems.
19
19
  license: Apache-2.0
20
20
  integrity:
21
- checksum: sha256:6fcd7b3d1276c318b6ca94f61df056ebff42ec5d4c6770e5b5c7c396dccdf156
22
- signature: 6/DQ1LgbzysUep7niPIK9iW/AYd0g4/152yEu0qksuLhPMtC88ghMTgcho1ooBQZjvYuA/T2wOVUcv5Y+UsLBw==
21
+ checksum: sha256:05023a72241101dd19a9c402fcb4882e40a925d0958b95b4b13217032ad8e31b
22
+ signature: rovvEszsr1+/kq2yy9R1g01fjhlG38R2eIwg/aXZy789SKq9ttBkBqJ6d1U+ysXYzOUBqgc6WwcfCI1X2Il7Dg==
@@ -1,5 +1,5 @@
1
1
  name: upgrade
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - upgrade
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Check and apply SpecFact CLI version upgrades.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:c4dd29c7289f946a56e00a9dc408a0d56708fc39a89cd8fd5fddaadb1a56dec5
19
- signature: 4aNspYwRcNWBnwn3p8tJUfG2BA4ZaXvRNczvjDQXTR/U/SChgMQ0e8B72ujYh0XCLFZLWCW+/kj/w2Y+N8vjCw==
18
+ checksum: sha256:441c8d1d5bb5b57b809150e58911966cd1b2aec20ff88dba9985114a65a3aead
19
+ signature: mr1FGw1rrBbFEH812TGAxoykpSfP+VzyEMwW5Q5UGNzJgqXwXQxa5bOsVYHwTfToIttGGoFv1jDjJ4NE6b+EBg==
@@ -1,5 +1,5 @@
1
1
  name: validate
2
- version: 0.37.2
2
+ version: 0.1.0
3
3
  commands:
4
4
  - validate
5
5
  command_help:
@@ -15,5 +15,5 @@ publisher:
15
15
  description: Run schema, contract, and workflow validation suites.
16
16
  license: Apache-2.0
17
17
  integrity:
18
- checksum: sha256:b1f954e5fef7f8b964299aec54f75b3b24ebc50c24b90db8598fc4b3d8532ee1
19
- signature: +1azi81aZmGaQxiu4i9gcemRTPyBthDiwP+VWEeK9AGTcTPHjz/meuY3GsO8c33SBVsNltZ3PEggQpw7h8kDCw==
18
+ checksum: sha256:01252349bfc86e36138b2acb4e82e60bcaaa84b0f60dc1bfcf4ca554a02bad67
19
+ signature: rU1JJUw057QUVp6YaEEM0vcx+/hrciNsh2A3SlD4xhZwbPyzf9O+RvaAh99q/iAns9EzmsqMDW9IYafLXmEYDQ==
@@ -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
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import hashlib
6
6
  import os
7
7
  import shutil
8
+ import sys
8
9
  import tarfile
9
10
  import tempfile
10
11
  from functools import lru_cache
@@ -22,6 +23,7 @@ from specfact_cli.models.module_package import ModulePackageMetadata
22
23
  from specfact_cli.registry.crypto_validator import verify_checksum, verify_signature
23
24
  from specfact_cli.registry.marketplace_client import download_module
24
25
  from specfact_cli.registry.module_security import assert_module_allowed, ensure_publisher_trusted
26
+ from specfact_cli.runtime import is_debug_mode
25
27
 
26
28
 
27
29
  USER_MODULES_ROOT = Path.home() / ".specfact" / "modules"
@@ -30,6 +32,14 @@ _IGNORED_MODULE_DIR_NAMES = {"__pycache__", ".pytest_cache", ".mypy_cache", ".ru
30
32
  _IGNORED_MODULE_FILE_SUFFIXES = {".pyc", ".pyo"}
31
33
 
32
34
 
35
+ @beartype
36
+ def _integrity_debug_details_enabled() -> bool:
37
+ """Return True when verbose integrity diagnostics should be shown."""
38
+ if is_debug_mode():
39
+ return True
40
+ return "--debug" in sys.argv[1:]
41
+
42
+
33
43
  @beartype
34
44
  def _bundled_public_key_path() -> Path:
35
45
  """Resolve default bundled public key path for module signature verification.
@@ -336,13 +346,17 @@ def verify_module_artifact(
336
346
  try:
337
347
  stable_payload = _module_artifact_payload_stable(package_dir)
338
348
  verify_checksum(stable_payload, meta.integrity.checksum)
339
- logger.info(
340
- "Module %s: checksum matched with generated-file exclusions (cache/transient files ignored)",
341
- meta.name,
342
- )
349
+ if _integrity_debug_details_enabled():
350
+ logger.debug(
351
+ "Module %s: checksum matched with generated-file exclusions (cache/transient files ignored)",
352
+ meta.name,
353
+ )
343
354
  verification_payload = stable_payload
344
355
  except ValueError:
345
- logger.warning("Module %s: Integrity check failed: %s", meta.name, exc)
356
+ if _integrity_debug_details_enabled():
357
+ logger.warning("Module %s: Integrity check failed: %s", meta.name, exc)
358
+ else:
359
+ logger.debug("Module %s: Integrity check failed: %s", meta.name, exc)
346
360
  return False
347
361
 
348
362
  if meta.integrity.signature:
@@ -395,7 +409,7 @@ def install_module(
395
409
  manifest_path = final_path / "module-package.yaml"
396
410
 
397
411
  if manifest_path.exists() and not reinstall:
398
- logger.info("Module already installed (%s)", module_name)
412
+ logger.debug("Module already installed (%s)", module_name)
399
413
  return final_path
400
414
 
401
415
  archive_path = download_module(module_id, version=version)
@@ -467,7 +481,7 @@ def install_module(
467
481
  shutil.rmtree(staged_path)
468
482
  raise
469
483
 
470
- 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)
471
485
  return final_path
472
486
 
473
487
 
@@ -505,7 +519,7 @@ def uninstall_module(
505
519
  if not module_path.exists():
506
520
  continue
507
521
  shutil.rmtree(module_path)
508
- logger.info("Uninstalled module '%s' from '%s'", module_name, root)
522
+ logger.debug("Uninstalled module '%s' from '%s'", module_name, root)
509
523
  return
510
524
 
511
525
  roots_str = ", ".join(str(root) for root in candidate_roots)