specfact-cli 0.46.25__tar.gz → 0.46.28__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 (279) hide show
  1. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/PKG-INFO +3 -1
  2. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/README.md +2 -0
  3. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/pyproject.toml +1 -1
  4. specfact_cli-0.46.28/resources/bundled-module-registry/index.json +26 -0
  5. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/__init__.py +1 -1
  6. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/__init__.py +1 -1
  7. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/upgrade/module-package.yaml +3 -3
  8. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/upgrade/src/commands.py +56 -2
  9. specfact_cli-0.46.25/resources/bundled-module-registry/index.json +0 -20
  10. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/.gitignore +0 -0
  11. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/LICENSE +0 -0
  12. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/keys/README.md +0 -0
  13. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/keys/module-signing-public.pem +0 -0
  14. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/mappings/node-async.yaml +0 -0
  15. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/mappings/python-async.yaml +0 -0
  16. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/mappings/speckit-default.yaml +0 -0
  17. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/schemas/deviation.schema.json +0 -0
  18. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/schemas/plan.schema.json +0 -0
  19. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/schemas/protocol.schema.json +0 -0
  20. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/github-action.yml.j2 +0 -0
  21. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/persona/architect.md.j2 +0 -0
  22. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/persona/developer.md.j2 +0 -0
  23. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/persona/product-owner.md.j2 +0 -0
  24. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/plan.bundle.yaml.j2 +0 -0
  25. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/policies/kanban.yaml +0 -0
  26. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/policies/mixed.yaml +0 -0
  27. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/policies/safe.yaml +0 -0
  28. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/policies/scrum.yaml +0 -0
  29. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/pr-template.md.j2 +0 -0
  30. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/protocol.yaml.j2 +0 -0
  31. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/resources/templates/telemetry.yaml.example +0 -0
  32. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/__main__.py +0 -0
  33. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/adapters/__init__.py +0 -0
  34. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/adapters/ado.py +0 -0
  35. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/adapters/backlog_base.py +0 -0
  36. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/adapters/base.py +0 -0
  37. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/adapters/github.py +0 -0
  38. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/adapters/openspec.py +0 -0
  39. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  40. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/adapters/registry.py +0 -0
  41. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/adapters/speckit.py +0 -0
  42. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/agents/__init__.py +0 -0
  43. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/agents/analyze_agent.py +0 -0
  44. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/agents/base.py +0 -0
  45. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/agents/plan_agent.py +0 -0
  46. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/agents/registry.py +0 -0
  47. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/agents/sync_agent.py +0 -0
  48. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/analyzers/__init__.py +0 -0
  49. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  50. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  51. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  52. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  53. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  54. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  55. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  56. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  57. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  58. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/backlog/__init__.py +0 -0
  59. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  60. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/backlog/adapters/base.py +0 -0
  61. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/backlog/converter.py +0 -0
  62. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/backlog/filters.py +0 -0
  63. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  64. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  65. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/backlog/mappers/base.py +0 -0
  66. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  67. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  68. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/cli.py +0 -0
  69. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/__init__.py +0 -0
  70. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/_bundle_shim.py +0 -0
  71. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/analyze.py +0 -0
  72. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/contract_cmd.py +0 -0
  73. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/drift.py +0 -0
  74. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/enforce.py +0 -0
  75. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/generate.py +0 -0
  76. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/import_cmd.py +0 -0
  77. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/init.py +0 -0
  78. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/migrate.py +0 -0
  79. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/plan.py +0 -0
  80. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/project_cmd.py +0 -0
  81. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/repro.py +0 -0
  82. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/sdd.py +0 -0
  83. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/spec.py +0 -0
  84. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/sync.py +0 -0
  85. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/update.py +0 -0
  86. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/commands/validate.py +0 -0
  87. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/common/__init__.py +0 -0
  88. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/common/bundle_factory.py +0 -0
  89. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/common/logger_setup.py +0 -0
  90. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/common/logging_utils.py +0 -0
  91. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/common/text_utils.py +0 -0
  92. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/common/utils.py +0 -0
  93. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/comparators/__init__.py +0 -0
  94. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  95. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/contracts/__init__.py +0 -0
  96. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  97. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/contracts/module_interface.py +0 -0
  98. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  99. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  100. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/generators/__init__.py +0 -0
  101. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/generators/contract_generator.py +0 -0
  102. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  103. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/generators/persona_exporter.py +0 -0
  104. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/generators/plan_generator.py +0 -0
  105. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/generators/protocol_generator.py +0 -0
  106. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/generators/report_generator.py +0 -0
  107. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/generators/task_generator.py +0 -0
  108. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  109. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/generators/workflow_generator.py +0 -0
  110. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/groups/__init__.py +0 -0
  111. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/groups/codebase_group.py +0 -0
  112. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/groups/govern_group.py +0 -0
  113. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/groups/member_group.py +0 -0
  114. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/groups/project_group.py +0 -0
  115. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/groups/spec_group.py +0 -0
  116. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/importers/__init__.py +0 -0
  117. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/importers/speckit_converter.py +0 -0
  118. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  119. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/integrations/__init__.py +0 -0
  120. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/integrations/specmatic.py +0 -0
  121. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/merge/__init__.py +0 -0
  122. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/merge/resolver.py +0 -0
  123. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/migrations/__init__.py +0 -0
  124. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  125. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/__init__.py +0 -0
  126. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/backlog_item.py +0 -0
  127. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/bridge.py +0 -0
  128. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/capabilities.py +0 -0
  129. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/change.py +0 -0
  130. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/contract.py +0 -0
  131. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/deviation.py +0 -0
  132. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/dor_config.py +0 -0
  133. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/enforcement.py +0 -0
  134. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/module_package.py +0 -0
  135. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/persona_template.py +0 -0
  136. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/plan.py +0 -0
  137. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/project.py +0 -0
  138. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/protocol.py +0 -0
  139. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/quality.py +0 -0
  140. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/sdd.py +0 -0
  141. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/source_tracking.py +0 -0
  142. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/task.py +0 -0
  143. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/models/validation.py +0 -0
  144. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modes/__init__.py +0 -0
  145. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modes/detector.py +0 -0
  146. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modes/router.py +0 -0
  147. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/__init__.py +0 -0
  148. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/_bundle_import.py +0 -0
  149. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/init/module-package.yaml +0 -0
  150. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/init/src/__init__.py +0 -0
  151. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/init/src/app.py +0 -0
  152. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/init/src/commands.py +0 -0
  153. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
  154. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/module_io_shim.py +0 -0
  155. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/module_registry/module-package.yaml +0 -0
  156. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
  157. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
  158. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/module_registry/src/commands.py +0 -0
  159. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
  160. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
  161. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/parsers/__init__.py +0 -0
  162. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/parsers/persona_importer.py +0 -0
  163. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/__init__.py +0 -0
  164. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/alias_manager.py +0 -0
  165. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/bootstrap.py +0 -0
  166. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/bridge_registry.py +0 -0
  167. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/crypto_validator.py +0 -0
  168. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/custom_registries.py +0 -0
  169. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/dependency_resolver.py +0 -0
  170. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/extension_registry.py +0 -0
  171. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/help_cache.py +0 -0
  172. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/marketplace_client.py +0 -0
  173. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/metadata.py +0 -0
  174. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/module_availability.py +0 -0
  175. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/module_discovery.py +0 -0
  176. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/module_grouping.py +0 -0
  177. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/module_installer.py +0 -0
  178. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/module_lifecycle.py +0 -0
  179. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/module_packages.py +0 -0
  180. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/module_security.py +0 -0
  181. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/module_state.py +0 -0
  182. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/registry/registry.py +0 -0
  183. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  184. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  185. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  186. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/runtime.py +0 -0
  187. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/__init__.py +0 -0
  188. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/bridge_probe.py +0 -0
  189. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/bridge_sync.py +0 -0
  190. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/bridge_sync_openspec_md_parse.py +0 -0
  191. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/bridge_sync_requirement_from_proposal.py +0 -0
  192. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/bridge_sync_requirement_helpers.py +0 -0
  193. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/bridge_sync_tasks_from_proposal.py +0 -0
  194. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/bridge_sync_what_changes_format.py +0 -0
  195. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/bridge_sync_write_openspec_from_proposal.py +0 -0
  196. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/bridge_watch.py +0 -0
  197. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/change_detector.py +0 -0
  198. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/code_to_spec.py +0 -0
  199. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/drift_detector.py +0 -0
  200. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/repository_sync.py +0 -0
  201. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/spec_to_code.py +0 -0
  202. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  203. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/watcher.py +0 -0
  204. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  205. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/telemetry.py +0 -0
  206. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/templates/__init__.py +0 -0
  207. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  208. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  209. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  210. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  211. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  212. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  213. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  214. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/templates/registry.py +0 -0
  215. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/templates/specification_templates.py +0 -0
  216. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/__init__.py +0 -0
  217. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
  218. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/auth_tokens.py +0 -0
  219. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/bundle_converters.py +0 -0
  220. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/bundle_loader.py +0 -0
  221. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/code_change_detector.py +0 -0
  222. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/console.py +0 -0
  223. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  224. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/context_detection.py +0 -0
  225. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/contract_predicates.py +0 -0
  226. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/enrichment_context.py +0 -0
  227. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/enrichment_parser.py +0 -0
  228. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/env_manager.py +0 -0
  229. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/feature_keys.py +0 -0
  230. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/git.py +0 -0
  231. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/github_annotations.py +0 -0
  232. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/icontract_helpers.py +0 -0
  233. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/ide_setup.py +0 -0
  234. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/incremental_check.py +0 -0
  235. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/metadata.py +0 -0
  236. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/optional_deps.py +0 -0
  237. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/performance.py +0 -0
  238. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/persona_ownership.py +0 -0
  239. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/progress.py +0 -0
  240. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  241. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/project_artifact_write.py +0 -0
  242. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/prompts.py +0 -0
  243. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  244. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/source_scanner.py +0 -0
  245. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/startup_checks.py +0 -0
  246. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/structure.py +0 -0
  247. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/structured_io.py +0 -0
  248. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/suggestions.py +0 -0
  249. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/terminal.py +0 -0
  250. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/utils/yaml_utils.py +0 -0
  251. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validation/__init__.py +0 -0
  252. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validation/command_audit.py +0 -0
  253. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/__init__.py +0 -0
  254. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/agile_validation.py +0 -0
  255. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  256. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  257. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/contract_validator.py +0 -0
  258. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/fsm.py +0 -0
  259. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/repro_checker.py +0 -0
  260. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/schema.py +0 -0
  261. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  262. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  263. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  264. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  265. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
  266. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  267. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  268. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  269. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  270. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  271. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  272. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  273. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  274. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/models.py +0 -0
  275. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
  276. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  277. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  278. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/src/specfact_cli/versioning/__init__.py +0 -0
  279. {specfact_cli-0.46.25 → specfact_cli-0.46.28}/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.46.25
3
+ Version: 0.46.28
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
@@ -342,6 +342,8 @@ specfact code review run --path . --scope full
342
342
 
343
343
  The sample output comes from a pinned capture against `nold-ai/specfact-demo-repo`. Reproduce it with `docs/_support/readme-first-contact/capture-readme-output.sh`; capture metadata lives alongside the raw logs in `docs/_support/readme-first-contact/sample-output/`.
344
344
 
345
+ The Code Review bundle also reports `ai_bloat` advisories for code shapes that AI-assisted coding often amplifies, such as redundant wrappers, passthrough lambdas, identity `try`/`except` blocks, and avoidable intermediate lists. These findings are advisory, score-neutral, and not AI-authorship detection. Use the generated `.specfact/code-review.json` report with the Project bundle's `/specfact.08-simplify` IDE prompt to review each cleanup before accepting it. See the [AI bloat quickstart](https://modules.specfact.io/quickstart-ai-bloat/) on the modules docs site.
346
+
345
347
  ## What SpecFact does
346
348
 
347
349
  - **Reviews AI-assisted changes deterministically** — compare code against contracts, clean-code rules, and policy gates
@@ -59,6 +59,8 @@ specfact code review run --path . --scope full
59
59
 
60
60
  The sample output comes from a pinned capture against `nold-ai/specfact-demo-repo`. Reproduce it with `docs/_support/readme-first-contact/capture-readme-output.sh`; capture metadata lives alongside the raw logs in `docs/_support/readme-first-contact/sample-output/`.
61
61
 
62
+ The Code Review bundle also reports `ai_bloat` advisories for code shapes that AI-assisted coding often amplifies, such as redundant wrappers, passthrough lambdas, identity `try`/`except` blocks, and avoidable intermediate lists. These findings are advisory, score-neutral, and not AI-authorship detection. Use the generated `.specfact/code-review.json` report with the Project bundle's `/specfact.08-simplify` IDE prompt to review each cleanup before accepting it. See the [AI bloat quickstart](https://modules.specfact.io/quickstart-ai-bloat/) on the modules docs site.
63
+
62
64
  ## What SpecFact does
63
65
 
64
66
  - **Reviews AI-assisted changes deterministically** — compare code against contracts, clean-code rules, and policy gates
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "specfact-cli"
7
- version = "0.46.25"
7
+ version = "0.46.28"
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"
@@ -0,0 +1,26 @@
1
+ {
2
+ "modules": [
3
+ {
4
+ "checksum_sha256": "ce82ea7d2a48dfa8b16ad48599ec6daa922d6aa1a61c242da1143366d5d53ec4",
5
+ "download_url": "https://github.com/nold-ai/specfact-cli/releases/download/init-0.1.33.tar.gz",
6
+ "id": "init",
7
+ "latest_version": "0.1.33"
8
+ },
9
+ {
10
+ "checksum_sha256": "49c5bcbef6ce4aba3302b8209d3641cc34430f3fe4754423d61428557f8c641d",
11
+ "download_url": "https://github.com/nold-ai/specfact-cli/releases/download/upgrade-0.1.19.tar.gz",
12
+ "id": "upgrade",
13
+ "latest_version": "0.1.19"
14
+ },
15
+ {
16
+ "checksum_sha256": "79359da27cb1c734a928a453a786b626e7b06654f515f32ead0cf96fa8e70bc2",
17
+ "download_url": "https://github.com/nold-ai/specfact-cli/releases/download/module-registry-0.1.26.tar.gz",
18
+ "id": "module-registry",
19
+ "latest_version": "0.1.26"
20
+ },
21
+ {
22
+ "id": "bundle-mapper",
23
+ "latest_version": "0.1.9"
24
+ }
25
+ ]
26
+ }
@@ -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.46.25"
6
+ __version__ = "0.46.28"
@@ -45,6 +45,6 @@ def _bootstrap_bundle_paths() -> None:
45
45
 
46
46
  _bootstrap_bundle_paths()
47
47
 
48
- __version__ = "0.46.25"
48
+ __version__ = "0.46.28"
49
49
 
50
50
  __all__ = ["__version__"]
@@ -1,5 +1,5 @@
1
1
  name: upgrade
2
- version: 0.1.15
2
+ version: 0.1.19
3
3
  commands:
4
4
  - upgrade
5
5
  category: core
@@ -17,5 +17,5 @@ publisher:
17
17
  description: Check and apply SpecFact CLI version upgrades.
18
18
  license: Apache-2.0
19
19
  integrity:
20
- checksum: sha256:134da8c48f8be96e9a4337a7cc2076bbf8b19e0d3f69161636bcec050f97e4c1
21
- signature: CK8Gq+/d0zWlU1Lo1I6EcgPiT3FzVsXj+CXFn7+zUnpXRdpYZxccLLZqh1Hvl2IPv3Y4yecVlOEcWZKtn0tJBg==
20
+ checksum: sha256:fda269f874f7b61ad5ec8217ba1550e49b1e2e17b23aafd08b39df1a98d66ee1
21
+ signature: yx89WfwC8DQUkAw2WD1EdHp08Ug0dFw3gNbIXbwgcdoxUBa9qA/0TaHHNBbyhVIxgL6wb+H4XCbYjdwb6XU1Bg==
@@ -23,6 +23,7 @@ from icontract import ensure
23
23
  from rich.console import Console
24
24
  from rich.panel import Panel
25
25
  from rich.prompt import Confirm
26
+ from rich.text import Text
26
27
 
27
28
  from specfact_cli import __version__
28
29
  from specfact_cli.contracts.module_interface import ModuleIOContract
@@ -223,16 +224,27 @@ def _build_upgrade_command(method: InstallationMethod) -> list[str] | None:
223
224
  def _execute_upgrade_command(command: list[str]) -> bool:
224
225
  try:
225
226
  console.print("[cyan]Updating SpecFact CLI...[/cyan]")
226
- result = subprocess.run(command, check=False, timeout=300)
227
- except subprocess.TimeoutExpired:
227
+ result = subprocess.run(command, check=False, timeout=300, capture_output=True)
228
+ except subprocess.TimeoutExpired as exc:
229
+ _replay_upgrade_output(_coerce_subprocess_output(exc.stdout))
230
+ _replay_upgrade_output(_coerce_subprocess_output(exc.stderr))
228
231
  console.print("[red]✗ Update timed out (exceeded 5 minutes)[/red]")
229
232
  return False
230
233
  except OSError as e:
231
234
  console.print(f"[red]✗ Update failed: {e}[/red]")
232
235
  return False
236
+ stdout = _coerce_subprocess_output(result.stdout)
237
+ stderr = _coerce_subprocess_output(result.stderr)
233
238
  if result.returncode != 0:
239
+ _replay_upgrade_output(stdout)
240
+ _replay_upgrade_output(stderr)
234
241
  console.print(f"[red]✗ Update failed with exit code {result.returncode}[/red]")
235
242
  return False
243
+ if _is_pipx_upgrade_command(command):
244
+ stdout = _filter_pipx_spaced_home_warning(stdout)
245
+ stderr = _filter_pipx_spaced_home_warning(stderr)
246
+ _replay_upgrade_output(stdout)
247
+ _replay_upgrade_output(stderr)
236
248
  console.print("[green]✓ Update successful![/green]")
237
249
  from datetime import datetime
238
250
 
@@ -243,6 +255,48 @@ def _execute_upgrade_command(command: list[str]) -> bool:
243
255
  return True
244
256
 
245
257
 
258
+ def _coerce_subprocess_output(output: object) -> str:
259
+ """Return subprocess output as displayable text."""
260
+ if isinstance(output, str):
261
+ return output
262
+ if isinstance(output, bytes):
263
+ return output.decode(errors="replace")
264
+ return ""
265
+
266
+
267
+ def _is_pipx_upgrade_command(command: list[str]) -> bool:
268
+ """Return whether command is the supported pipx upgrade invocation."""
269
+ return len(command) >= 3 and command[:3] == ["pipx", "upgrade", "specfact-cli"]
270
+
271
+
272
+ def _replay_upgrade_output(output: str) -> None:
273
+ """Replay captured child-process output without Rich markup parsing."""
274
+ if output:
275
+ console.print(Text(output), end="")
276
+
277
+
278
+ def _filter_pipx_spaced_home_warning(output: str) -> str:
279
+ """Remove only pipx's known spaced-home warning block from successful output."""
280
+ if not output:
281
+ return output
282
+ warning_markers = (
283
+ "Found a space in the pipx home path",
284
+ "To see your PIPX_HOME dir",
285
+ "Most likely fix on macOS",
286
+ )
287
+ filtered_lines: list[str] = []
288
+ skipping_wrapped_warning = False
289
+ for line in output.splitlines(keepends=True):
290
+ if any(marker in line for marker in warning_markers):
291
+ skipping_wrapped_warning = "Found a space in the pipx home path" in line
292
+ continue
293
+ if skipping_wrapped_warning and line[:1].isspace():
294
+ continue
295
+ skipping_wrapped_warning = False
296
+ filtered_lines.append(line)
297
+ return "".join(filtered_lines)
298
+
299
+
246
300
  def _upgrade_log_started(check_only: bool, yes: bool) -> None:
247
301
  if is_debug_mode():
248
302
  debug_log_operation(
@@ -1,20 +0,0 @@
1
- {
2
- "modules": [
3
- {
4
- "id": "init",
5
- "latest_version": "0.1.30"
6
- },
7
- {
8
- "id": "upgrade",
9
- "latest_version": "0.1.4"
10
- },
11
- {
12
- "id": "module-registry",
13
- "latest_version": "0.1.19"
14
- },
15
- {
16
- "id": "bundle-mapper",
17
- "latest_version": "0.1.9"
18
- }
19
- ]
20
- }
File without changes