specfact-cli 0.43.2__tar.gz → 0.44.0__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 (275) hide show
  1. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/PKG-INFO +131 -37
  2. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/README.md +130 -36
  3. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/pyproject.toml +1 -1
  4. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/__init__.py +1 -1
  5. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/__init__.py +1 -1
  6. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/speckit.py +1 -1
  7. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/analyze_agent.py +1 -1
  8. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +3 -3
  9. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/code_analyzer.py +2 -2
  10. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/contract_extractor.py +3 -3
  11. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/graph_analyzer.py +2 -2
  12. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/relationship_mapper.py +2 -2
  13. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/logger_setup.py +2 -2
  14. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/enrichers/constitution_enricher.py +5 -5
  15. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/persona_exporter.py +2 -2
  16. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/_bundle_import.py +7 -3
  17. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/init/module-package.yaml +3 -3
  18. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/init/src/commands.py +0 -50
  19. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/module_io_shim.py +0 -4
  20. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/bootstrap.py +1 -1
  21. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_packages.py +0 -19
  22. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync.py +4 -4
  23. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/spec_to_code.py +1 -1
  24. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/acceptance_criteria.py +32 -5
  25. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/context_detection.py +2 -2
  26. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/enrichment_parser.py +72 -25
  27. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/optional_deps.py +9 -1
  28. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/progress.py +3 -3
  29. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -16
  30. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/source_scanner.py +2 -2
  31. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/structure.py +2 -2
  32. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +1 -1
  33. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/orchestrator.py +1 -1
  34. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/.gitignore +0 -0
  35. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/LICENSE +0 -0
  36. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/keys/README.md +0 -0
  37. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/keys/module-signing-public.pem +0 -0
  38. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/mappings/node-async.yaml +0 -0
  39. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/mappings/python-async.yaml +0 -0
  40. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/mappings/speckit-default.yaml +0 -0
  41. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/schemas/deviation.schema.json +0 -0
  42. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/schemas/plan.schema.json +0 -0
  43. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/schemas/protocol.schema.json +0 -0
  44. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/github-action.yml.j2 +0 -0
  45. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/persona/architect.md.j2 +0 -0
  46. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/persona/developer.md.j2 +0 -0
  47. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/persona/product-owner.md.j2 +0 -0
  48. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
  49. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/policies/kanban.yaml +0 -0
  50. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/policies/mixed.yaml +0 -0
  51. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/policies/safe.yaml +0 -0
  52. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/policies/scrum.yaml +0 -0
  53. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/pr-template.md.j2 +0 -0
  54. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/protocol.yaml.j2 +0 -0
  55. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/telemetry.yaml.example +0 -0
  56. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/__main__.py +0 -0
  57. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/__init__.py +0 -0
  58. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/ado.py +0 -0
  59. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
  60. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/base.py +0 -0
  61. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/github.py +0 -0
  62. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/openspec.py +0 -0
  63. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  64. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/registry.py +0 -0
  65. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/__init__.py +0 -0
  66. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/base.py +0 -0
  67. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/plan_agent.py +0 -0
  68. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/registry.py +0 -0
  69. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/sync_agent.py +0 -0
  70. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/__init__.py +0 -0
  71. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  72. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  73. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  74. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  75. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/__init__.py +0 -0
  76. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  77. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
  78. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/converter.py +0 -0
  79. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/filters.py +0 -0
  80. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  81. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  82. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
  83. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  84. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  85. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/cli.py +0 -0
  86. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/__init__.py +0 -0
  87. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/_bundle_shim.py +0 -0
  88. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/analyze.py +0 -0
  89. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/contract_cmd.py +0 -0
  90. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/drift.py +0 -0
  91. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/enforce.py +0 -0
  92. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/generate.py +0 -0
  93. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/import_cmd.py +0 -0
  94. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/init.py +0 -0
  95. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/migrate.py +0 -0
  96. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/plan.py +0 -0
  97. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/project_cmd.py +0 -0
  98. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/repro.py +0 -0
  99. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/sdd.py +0 -0
  100. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/spec.py +0 -0
  101. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/sync.py +0 -0
  102. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/update.py +0 -0
  103. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/validate.py +0 -0
  104. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/__init__.py +0 -0
  105. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/bundle_factory.py +0 -0
  106. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/logging_utils.py +0 -0
  107. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/text_utils.py +0 -0
  108. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/utils.py +0 -0
  109. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/comparators/__init__.py +0 -0
  110. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  111. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/contracts/__init__.py +0 -0
  112. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  113. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/contracts/module_interface.py +0 -0
  114. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  115. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/__init__.py +0 -0
  116. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/contract_generator.py +0 -0
  117. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  118. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/plan_generator.py +0 -0
  119. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
  120. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/report_generator.py +0 -0
  121. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/task_generator.py +0 -0
  122. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  123. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/workflow_generator.py +0 -0
  124. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/__init__.py +0 -0
  125. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/codebase_group.py +0 -0
  126. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/govern_group.py +0 -0
  127. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/member_group.py +0 -0
  128. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/project_group.py +0 -0
  129. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/spec_group.py +0 -0
  130. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/importers/__init__.py +0 -0
  131. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
  132. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  133. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/integrations/__init__.py +0 -0
  134. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/integrations/specmatic.py +0 -0
  135. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/merge/__init__.py +0 -0
  136. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/merge/resolver.py +0 -0
  137. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/migrations/__init__.py +0 -0
  138. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  139. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/__init__.py +0 -0
  140. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/backlog_item.py +0 -0
  141. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/bridge.py +0 -0
  142. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/capabilities.py +0 -0
  143. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/change.py +0 -0
  144. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/contract.py +0 -0
  145. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/deviation.py +0 -0
  146. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/dor_config.py +0 -0
  147. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/enforcement.py +0 -0
  148. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/module_package.py +0 -0
  149. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/persona_template.py +0 -0
  150. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/plan.py +0 -0
  151. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/project.py +0 -0
  152. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/protocol.py +0 -0
  153. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/quality.py +0 -0
  154. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/sdd.py +0 -0
  155. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/source_tracking.py +0 -0
  156. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/task.py +0 -0
  157. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/validation.py +0 -0
  158. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modes/__init__.py +0 -0
  159. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modes/detector.py +0 -0
  160. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modes/router.py +0 -0
  161. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/__init__.py +0 -0
  162. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/init/src/__init__.py +0 -0
  163. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/init/src/app.py +0 -0
  164. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
  165. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/module_registry/module-package.yaml +0 -0
  166. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
  167. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
  168. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/module_registry/src/commands.py +0 -0
  169. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
  170. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
  171. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
  172. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
  173. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/parsers/__init__.py +0 -0
  174. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/parsers/persona_importer.py +0 -0
  175. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/__init__.py +0 -0
  176. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/alias_manager.py +0 -0
  177. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/bridge_registry.py +0 -0
  178. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/crypto_validator.py +0 -0
  179. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/custom_registries.py +0 -0
  180. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/dependency_resolver.py +0 -0
  181. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/extension_registry.py +0 -0
  182. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/help_cache.py +0 -0
  183. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/marketplace_client.py +0 -0
  184. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/metadata.py +0 -0
  185. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_discovery.py +0 -0
  186. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_grouping.py +0 -0
  187. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_installer.py +0 -0
  188. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_lifecycle.py +0 -0
  189. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_security.py +0 -0
  190. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_state.py +0 -0
  191. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/registry.py +0 -0
  192. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  193. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  194. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  195. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/runtime.py +0 -0
  196. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/__init__.py +0 -0
  197. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
  198. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_openspec_md_parse.py +0 -0
  199. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_requirement_from_proposal.py +0 -0
  200. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_requirement_helpers.py +0 -0
  201. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_tasks_from_proposal.py +0 -0
  202. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_what_changes_format.py +0 -0
  203. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_write_openspec_from_proposal.py +0 -0
  204. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_watch.py +0 -0
  205. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/change_detector.py +0 -0
  206. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
  207. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/drift_detector.py +0 -0
  208. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/repository_sync.py +0 -0
  209. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  210. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/watcher.py +0 -0
  211. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  212. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/telemetry.py +0 -0
  213. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/__init__.py +0 -0
  214. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  215. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  216. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  217. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  218. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  219. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  220. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  221. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/registry.py +0 -0
  222. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/specification_templates.py +0 -0
  223. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/__init__.py +0 -0
  224. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
  225. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/bundle_converters.py +0 -0
  226. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
  227. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
  228. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/console.py +0 -0
  229. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  230. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/contract_predicates.py +0 -0
  231. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
  232. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/env_manager.py +0 -0
  233. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/feature_keys.py +0 -0
  234. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/git.py +0 -0
  235. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/github_annotations.py +0 -0
  236. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/icontract_helpers.py +0 -0
  237. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/ide_setup.py +0 -0
  238. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/incremental_check.py +0 -0
  239. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/metadata.py +0 -0
  240. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/performance.py +0 -0
  241. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/persona_ownership.py +0 -0
  242. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/prompts.py +0 -0
  243. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  244. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/startup_checks.py +0 -0
  245. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/structured_io.py +0 -0
  246. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/suggestions.py +0 -0
  247. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/terminal.py +0 -0
  248. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
  249. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validation/__init__.py +0 -0
  250. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validation/command_audit.py +0 -0
  251. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/__init__.py +0 -0
  252. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/agile_validation.py +0 -0
  253. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  254. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  255. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/contract_validator.py +0 -0
  256. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/fsm.py +0 -0
  257. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/repro_checker.py +0 -0
  258. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/schema.py +0 -0
  259. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  260. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  261. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  262. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  263. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  264. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  265. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  266. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  267. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  268. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  269. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  270. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  271. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
  272. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  273. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  274. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/versioning/__init__.py +0 -0
  275. {specfact_cli-0.43.2 → specfact_cli-0.44.0}/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.43.2
3
+ Version: 0.44.0
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
@@ -281,9 +281,10 @@ Description-Content-Type: text/markdown
281
281
 
282
282
  # SpecFact CLI
283
283
 
284
- > **The "swiss knife" CLI that turns any codebase into a clear, safe, and shippable workflow.**
285
- > Keep backlog, specs, tests, and code in sync so changes made by people or AI copilots do not break production.
286
- > Works for brand-new projects and long-lived codebases - even if you are new to coding.
284
+ > **SpecFact is the validation and alignment layer for software delivery.**
285
+ > It adds the missing validation layer that keeps backlog intent, specifications, tests, and code
286
+ > from drifting apart across AI-assisted coding, brownfield systems, and governed delivery.
287
+ > Use it to move fast without losing rigor.
287
288
 
288
289
  **No API keys required. Works offline. Zero vendor lock-in.**
289
290
 
@@ -304,21 +305,54 @@ invoke SpecFact as part of a command chain.
304
305
 
305
306
  ---
306
307
 
307
- ## Documentation Topology
308
+ ## What is SpecFact?
308
309
 
309
- `docs.specfact.io` is the canonical docs entry point for SpecFact.
310
+ SpecFact is the validation and alignment layer for software delivery.
310
311
 
311
- - Core CLI/runtime/platform documentation remains owned by `specfact-cli`.
312
- - Module-specific deep docs are canonically owned by `specfact-cli-modules`.
313
- - The live modules docs site is currently published at `https://modules.specfact.io/`.
312
+ It is a local CLI that helps you keep the intent behind a change aligned from
313
+ backlog or idea through specifications, implementation, and checks. The “Swiss-knife CLI” metaphor
314
+ fits because SpecFact gives you a set of focused tools for specific delivery problems, not a vague
315
+ bag of features.
314
316
 
315
- Use this repository's docs for the overall SpecFact workflow, CLI runtime lifecycle, module registry, trust model, and command-group topology.
316
- Use the modules docs site for bundle-specific deep dives, adapter details, workflow tutorials, and module-authoring guidance.
317
- In short, module-specific deep docs are canonically owned by `specfact-cli-modules`.
317
+ In practice, SpecFact helps you:
318
+ - add guardrails to AI-assisted and fast-moving greenfield work
319
+ - reverse-engineer large brownfield codebases into trustworthy structured understanding
320
+ - reduce the “I wanted X but got Y” drift between backlog, spec, and implementation
321
+ - move from local rigor toward team and enterprise policy enforcement
318
322
 
319
- ---
323
+ ## Why does it exist?
324
+
325
+ Modern delivery drifts in predictable ways:
326
+ - AI-generated quick wins often lack the validation layer needed for mid- and long-term reliability
327
+ - brownfield systems often have missing or drifted specs, so teams need to reverse-engineer reality
328
+ - backlog intent gets reinterpreted into something else before it reaches code
329
+ - teams working with different skill levels, opinions, and AI IDE setups need consistent review and
330
+ policy enforcement
331
+
332
+ SpecFact exists to reduce that drift. It helps teams understand what is really there, express what
333
+ should happen more accurately, and validate that the result still matches the original intent.
334
+
335
+ ## Why should I use it?
336
+
337
+ Use SpecFact if you want one of these outcomes:
338
+ - ship AI-assisted changes faster without accepting fragile “looks fine to me” quality
339
+ - understand a legacy or unfamiliar codebase before changing it
340
+ - hand brownfield insight into OpenSpec, Spec-Kit, or other spec-first workflows
341
+ - keep backlog expectations, specifications, and implementation from silently diverging
342
+ - enforce shared rules consistently across developers and CI/CD
320
343
 
321
- ## Start Here (60 seconds)
344
+ ## What do I get?
345
+
346
+ With SpecFact, you get:
347
+ - a deterministic local CLI instead of another opaque SaaS dependency
348
+ - a validation layer around fast-moving implementation work
349
+ - codebase analysis and sidecar flows for brownfield understanding
350
+ - stronger backlog/spec/code alignment for real delivery workflows
351
+ - a path from individual rigor to organization-level policy enforcement
352
+
353
+ ## How do I get started?
354
+
355
+ ### Start Here (5 minutes)
322
356
 
323
357
  ### Install
324
358
 
@@ -330,38 +364,104 @@ uvx specfact-cli@latest
330
364
  pip install -U specfact-cli
331
365
  ```
332
366
 
333
- ### Bootstrap and IDE Setup
367
+ ### Bootstrap
334
368
 
335
369
  ```bash
336
- # First run: install official bundles
370
+ # Recommended first run
337
371
  specfact init --profile solo-developer
338
-
339
- # Alternative bundle selection
340
- specfact init --install backlog,codebase
341
- specfact init --install all
342
-
343
- # IDE prompt/template setup
344
- specfact init ide
345
- specfact init ide --ide cursor
346
- specfact init ide --ide vscode
347
372
  ```
348
373
 
349
- `specfact init ide` discovers prompt resources from installed workflow modules and exports them to your IDE. If module prompt payloads are not installed yet, the CLI uses packaged fallback resources.
350
-
351
- ### Run Your First Flow
374
+ ### Get First Value
352
375
 
353
376
  ```bash
354
- # Analyze an existing codebase
377
+ # Analyze a codebase you care about
355
378
  specfact code import my-project --repo .
356
379
 
357
- # Snapshot current project state
380
+ # Snapshot the project state for follow-up workflows
358
381
  specfact project snapshot --bundle my-project
359
382
 
360
- # Validate external code without modifying source
383
+ # Validate external code without modifying the target repo
361
384
  specfact code validate sidecar init my-project /path/to/repo
362
385
  specfact code validate sidecar run my-project /path/to/repo
363
386
  ```
364
387
 
388
+ That path gives you a concrete first win: SpecFact understands your project context and gives you a
389
+ validated starting point instead of jumping straight into blind change work.
390
+
391
+ ### AI IDE Setup
392
+
393
+ ```bash
394
+ specfact init ide
395
+ specfact init ide --ide cursor
396
+ specfact init ide --ide vscode
397
+ ```
398
+
399
+ `specfact init ide` discovers prompt resources from installed workflow modules and exports them to
400
+ your IDE. If module prompt payloads are not installed yet, the CLI uses packaged fallback resources.
401
+
402
+ ## Choose Your Path
403
+
404
+ ### Greenfield and AI-assisted delivery
405
+
406
+ Use SpecFact as the validation layer around fast-moving implementation work.
407
+
408
+ Start with:
409
+ - `specfact init --profile solo-developer`
410
+ - `specfact code validate sidecar init <bundle> /path/to/repo`
411
+ - `specfact code validate sidecar run <bundle> /path/to/repo`
412
+
413
+ ### Brownfield and reverse engineering
414
+
415
+ Use SpecFact to understand an existing system before you change it, then hand that understanding
416
+ into spec-first tools such as OpenSpec or Spec-Kit.
417
+
418
+ Start with:
419
+ - `specfact code import my-project --repo .`
420
+ - `specfact project snapshot --bundle my-project`
421
+ - `specfact code validate sidecar init my-project /path/to/repo`
422
+ - `specfact code validate sidecar run my-project /path/to/repo`
423
+
424
+ ### Backlog to code alignment
425
+
426
+ Use SpecFact when the problem is not only code quality, but drift between expectations and delivery.
427
+ Backlog commands require a backlog-enabled profile or installed backlog bundle before the workflow
428
+ commands are available.
429
+
430
+ Start with:
431
+ - `specfact init --profile backlog-team`
432
+ - `specfact backlog ceremony standup ...`
433
+ - `specfact backlog ceremony refinement ...`
434
+ - `specfact backlog verify-readiness --bundle <bundle-name>`
435
+
436
+ ### Team and policy enforcement
437
+
438
+ Use SpecFact when multiple developers and AI IDEs need consistent checks and review behavior.
439
+
440
+ Start with:
441
+ - `specfact backlog verify-readiness --bundle <bundle-name>`
442
+ - `specfact govern ...`
443
+ - CI validation flows that keep the same rules active outside local development
444
+
445
+ ## How do I get started if I want more?
446
+
447
+ **Next steps**
448
+
449
+ - **[Core CLI docs](docs/index.md)** for the core runtime, bootstrap, validation, and command topology
450
+ - **[Reference: command topology](docs/reference/commands.md)** for grouped command surfaces
451
+ - **[Canonical modules docs site](https://modules.specfact.io/)** for bundle-deep workflows
452
+
453
+ ## Documentation Topology
454
+
455
+ `docs.specfact.io` is the canonical starting point for SpecFact.
456
+
457
+ - Core CLI/runtime/platform documentation remains owned by `specfact-cli`.
458
+ - Module-specific deep docs are canonically owned by `specfact-cli-modules`.
459
+ - The live modules docs site is published at `https://modules.specfact.io/`.
460
+
461
+ Use this repository's docs for the overall product story, runtime lifecycle, command topology,
462
+ trust model, and getting-started flow. Use the modules docs site when you want deeper workflow,
463
+ adapter, and module-authoring guidance.
464
+
365
465
  ### Migration Note (Flat Commands Removed)
366
466
 
367
467
  As of `0.40.0`, flat root commands are removed. Use grouped commands:
@@ -401,12 +501,6 @@ For GitHub, replace adapter/org/project with:
401
501
  /specfact.01-import my-project --repo .
402
502
  ```
403
503
 
404
- **Next steps**
405
-
406
- - **[Core CLI docs](docs/index.md)**
407
- - **[Reference: command topology](docs/reference/commands.md)**
408
- - **[Canonical modules docs site](https://modules.specfact.io/)**
409
-
410
504
  ---
411
505
 
412
506
  ## Who It Is For
@@ -1,8 +1,9 @@
1
1
  # SpecFact CLI
2
2
 
3
- > **The "swiss knife" CLI that turns any codebase into a clear, safe, and shippable workflow.**
4
- > Keep backlog, specs, tests, and code in sync so changes made by people or AI copilots do not break production.
5
- > Works for brand-new projects and long-lived codebases - even if you are new to coding.
3
+ > **SpecFact is the validation and alignment layer for software delivery.**
4
+ > It adds the missing validation layer that keeps backlog intent, specifications, tests, and code
5
+ > from drifting apart across AI-assisted coding, brownfield systems, and governed delivery.
6
+ > Use it to move fast without losing rigor.
6
7
 
7
8
  **No API keys required. Works offline. Zero vendor lock-in.**
8
9
 
@@ -23,21 +24,54 @@ invoke SpecFact as part of a command chain.
23
24
 
24
25
  ---
25
26
 
26
- ## Documentation Topology
27
+ ## What is SpecFact?
27
28
 
28
- `docs.specfact.io` is the canonical docs entry point for SpecFact.
29
+ SpecFact is the validation and alignment layer for software delivery.
29
30
 
30
- - Core CLI/runtime/platform documentation remains owned by `specfact-cli`.
31
- - Module-specific deep docs are canonically owned by `specfact-cli-modules`.
32
- - The live modules docs site is currently published at `https://modules.specfact.io/`.
31
+ It is a local CLI that helps you keep the intent behind a change aligned from
32
+ backlog or idea through specifications, implementation, and checks. The “Swiss-knife CLI” metaphor
33
+ fits because SpecFact gives you a set of focused tools for specific delivery problems, not a vague
34
+ bag of features.
33
35
 
34
- Use this repository's docs for the overall SpecFact workflow, CLI runtime lifecycle, module registry, trust model, and command-group topology.
35
- Use the modules docs site for bundle-specific deep dives, adapter details, workflow tutorials, and module-authoring guidance.
36
- In short, module-specific deep docs are canonically owned by `specfact-cli-modules`.
36
+ In practice, SpecFact helps you:
37
+ - add guardrails to AI-assisted and fast-moving greenfield work
38
+ - reverse-engineer large brownfield codebases into trustworthy structured understanding
39
+ - reduce the “I wanted X but got Y” drift between backlog, spec, and implementation
40
+ - move from local rigor toward team and enterprise policy enforcement
37
41
 
38
- ---
42
+ ## Why does it exist?
43
+
44
+ Modern delivery drifts in predictable ways:
45
+ - AI-generated quick wins often lack the validation layer needed for mid- and long-term reliability
46
+ - brownfield systems often have missing or drifted specs, so teams need to reverse-engineer reality
47
+ - backlog intent gets reinterpreted into something else before it reaches code
48
+ - teams working with different skill levels, opinions, and AI IDE setups need consistent review and
49
+ policy enforcement
50
+
51
+ SpecFact exists to reduce that drift. It helps teams understand what is really there, express what
52
+ should happen more accurately, and validate that the result still matches the original intent.
53
+
54
+ ## Why should I use it?
55
+
56
+ Use SpecFact if you want one of these outcomes:
57
+ - ship AI-assisted changes faster without accepting fragile “looks fine to me” quality
58
+ - understand a legacy or unfamiliar codebase before changing it
59
+ - hand brownfield insight into OpenSpec, Spec-Kit, or other spec-first workflows
60
+ - keep backlog expectations, specifications, and implementation from silently diverging
61
+ - enforce shared rules consistently across developers and CI/CD
39
62
 
40
- ## Start Here (60 seconds)
63
+ ## What do I get?
64
+
65
+ With SpecFact, you get:
66
+ - a deterministic local CLI instead of another opaque SaaS dependency
67
+ - a validation layer around fast-moving implementation work
68
+ - codebase analysis and sidecar flows for brownfield understanding
69
+ - stronger backlog/spec/code alignment for real delivery workflows
70
+ - a path from individual rigor to organization-level policy enforcement
71
+
72
+ ## How do I get started?
73
+
74
+ ### Start Here (5 minutes)
41
75
 
42
76
  ### Install
43
77
 
@@ -49,38 +83,104 @@ uvx specfact-cli@latest
49
83
  pip install -U specfact-cli
50
84
  ```
51
85
 
52
- ### Bootstrap and IDE Setup
86
+ ### Bootstrap
53
87
 
54
88
  ```bash
55
- # First run: install official bundles
89
+ # Recommended first run
56
90
  specfact init --profile solo-developer
57
-
58
- # Alternative bundle selection
59
- specfact init --install backlog,codebase
60
- specfact init --install all
61
-
62
- # IDE prompt/template setup
63
- specfact init ide
64
- specfact init ide --ide cursor
65
- specfact init ide --ide vscode
66
91
  ```
67
92
 
68
- `specfact init ide` discovers prompt resources from installed workflow modules and exports them to your IDE. If module prompt payloads are not installed yet, the CLI uses packaged fallback resources.
69
-
70
- ### Run Your First Flow
93
+ ### Get First Value
71
94
 
72
95
  ```bash
73
- # Analyze an existing codebase
96
+ # Analyze a codebase you care about
74
97
  specfact code import my-project --repo .
75
98
 
76
- # Snapshot current project state
99
+ # Snapshot the project state for follow-up workflows
77
100
  specfact project snapshot --bundle my-project
78
101
 
79
- # Validate external code without modifying source
102
+ # Validate external code without modifying the target repo
80
103
  specfact code validate sidecar init my-project /path/to/repo
81
104
  specfact code validate sidecar run my-project /path/to/repo
82
105
  ```
83
106
 
107
+ That path gives you a concrete first win: SpecFact understands your project context and gives you a
108
+ validated starting point instead of jumping straight into blind change work.
109
+
110
+ ### AI IDE Setup
111
+
112
+ ```bash
113
+ specfact init ide
114
+ specfact init ide --ide cursor
115
+ specfact init ide --ide vscode
116
+ ```
117
+
118
+ `specfact init ide` discovers prompt resources from installed workflow modules and exports them to
119
+ your IDE. If module prompt payloads are not installed yet, the CLI uses packaged fallback resources.
120
+
121
+ ## Choose Your Path
122
+
123
+ ### Greenfield and AI-assisted delivery
124
+
125
+ Use SpecFact as the validation layer around fast-moving implementation work.
126
+
127
+ Start with:
128
+ - `specfact init --profile solo-developer`
129
+ - `specfact code validate sidecar init <bundle> /path/to/repo`
130
+ - `specfact code validate sidecar run <bundle> /path/to/repo`
131
+
132
+ ### Brownfield and reverse engineering
133
+
134
+ Use SpecFact to understand an existing system before you change it, then hand that understanding
135
+ into spec-first tools such as OpenSpec or Spec-Kit.
136
+
137
+ Start with:
138
+ - `specfact code import my-project --repo .`
139
+ - `specfact project snapshot --bundle my-project`
140
+ - `specfact code validate sidecar init my-project /path/to/repo`
141
+ - `specfact code validate sidecar run my-project /path/to/repo`
142
+
143
+ ### Backlog to code alignment
144
+
145
+ Use SpecFact when the problem is not only code quality, but drift between expectations and delivery.
146
+ Backlog commands require a backlog-enabled profile or installed backlog bundle before the workflow
147
+ commands are available.
148
+
149
+ Start with:
150
+ - `specfact init --profile backlog-team`
151
+ - `specfact backlog ceremony standup ...`
152
+ - `specfact backlog ceremony refinement ...`
153
+ - `specfact backlog verify-readiness --bundle <bundle-name>`
154
+
155
+ ### Team and policy enforcement
156
+
157
+ Use SpecFact when multiple developers and AI IDEs need consistent checks and review behavior.
158
+
159
+ Start with:
160
+ - `specfact backlog verify-readiness --bundle <bundle-name>`
161
+ - `specfact govern ...`
162
+ - CI validation flows that keep the same rules active outside local development
163
+
164
+ ## How do I get started if I want more?
165
+
166
+ **Next steps**
167
+
168
+ - **[Core CLI docs](docs/index.md)** for the core runtime, bootstrap, validation, and command topology
169
+ - **[Reference: command topology](docs/reference/commands.md)** for grouped command surfaces
170
+ - **[Canonical modules docs site](https://modules.specfact.io/)** for bundle-deep workflows
171
+
172
+ ## Documentation Topology
173
+
174
+ `docs.specfact.io` is the canonical starting point for SpecFact.
175
+
176
+ - Core CLI/runtime/platform documentation remains owned by `specfact-cli`.
177
+ - Module-specific deep docs are canonically owned by `specfact-cli-modules`.
178
+ - The live modules docs site is published at `https://modules.specfact.io/`.
179
+
180
+ Use this repository's docs for the overall product story, runtime lifecycle, command topology,
181
+ trust model, and getting-started flow. Use the modules docs site when you want deeper workflow,
182
+ adapter, and module-authoring guidance.
183
+
84
184
  ### Migration Note (Flat Commands Removed)
85
185
 
86
186
  As of `0.40.0`, flat root commands are removed. Use grouped commands:
@@ -120,12 +220,6 @@ For GitHub, replace adapter/org/project with:
120
220
  /specfact.01-import my-project --repo .
121
221
  ```
122
222
 
123
- **Next steps**
124
-
125
- - **[Core CLI docs](docs/index.md)**
126
- - **[Reference: command topology](docs/reference/commands.md)**
127
- - **[Canonical modules docs site](https://modules.specfact.io/)**
128
-
129
223
  ---
130
224
 
131
225
  ## Who It Is For
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "specfact-cli"
7
- version = "0.43.2"
7
+ version = "0.44.0"
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.43.2"
6
+ __version__ = "0.43.3"
@@ -45,6 +45,6 @@ def _bootstrap_bundle_paths() -> None:
45
45
 
46
46
  _bootstrap_bundle_paths()
47
47
 
48
- __version__ = "0.43.2"
48
+ __version__ = "0.44.0"
49
49
 
50
50
  __all__ = ["__version__"]
@@ -426,7 +426,7 @@ class SpecKitAdapter(BridgeAdapter):
426
426
  )
427
427
  if title_match:
428
428
  feature_title = title_match.group(1).strip()
429
- except Exception:
429
+ except (OSError, UnicodeDecodeError):
430
430
  pass
431
431
  if not feature_title or feature_title.strip() == "":
432
432
  return "Unknown Feature"
@@ -262,7 +262,7 @@ Focus on semantic understanding, not just structural parsing. Generate the plan
262
262
  try:
263
263
  content = dep_file.read_text(encoding="utf-8")[:500]
264
264
  dependencies.append(f"{dep_file.name}: {content[:100]}...")
265
- except Exception:
265
+ except (OSError, UnicodeDecodeError):
266
266
  pass
267
267
  return dependencies
268
268
 
@@ -772,7 +772,7 @@ class AmbiguityScanner:
772
772
  continue
773
773
  if user_clean and len(user_clean) > 2 and user_lower not in excluded and len(user_clean.split()) <= 3:
774
774
  result.add(user_clean.title())
775
- except Exception:
775
+ except (OSError, UnicodeDecodeError, re.error):
776
776
  pass
777
777
  return result
778
778
 
@@ -898,9 +898,9 @@ class AmbiguityScanner:
898
898
  continue
899
899
  try:
900
900
  self._personas_from_py_file(py_file, result, excluded)
901
- except Exception:
901
+ except (OSError, UnicodeDecodeError, re.error):
902
902
  continue
903
- except Exception:
903
+ except (OSError, UnicodeDecodeError, re.error):
904
904
  pass
905
905
  return result
906
906
 
@@ -1794,14 +1794,14 @@ class CodeAnalyzer:
1794
1794
  for commit in commits:
1795
1795
  try:
1796
1796
  self._process_commit_for_feature_bounds(commit)
1797
- except Exception:
1797
+ except (OSError, ValueError):
1798
1798
  # Skip individual commits that fail (corrupted, etc.)
1799
1799
  continue
1800
1800
 
1801
1801
  except ImportError:
1802
1802
  # GitPython not available, skip
1803
1803
  pass
1804
- except Exception:
1804
+ except OSError:
1805
1805
  # Git operations failed, skip gracefully
1806
1806
  pass
1807
1807
 
@@ -240,7 +240,7 @@ class ContractExtractor:
240
240
  if hasattr(ast, "unparse"):
241
241
  try:
242
242
  return ast.unparse(node)
243
- except Exception:
243
+ except (ValueError, TypeError):
244
244
  pass
245
245
 
246
246
  # Fallback: manual conversion
@@ -282,7 +282,7 @@ class ContractExtractor:
282
282
  if hasattr(ast, "unparse"):
283
283
  try:
284
284
  return ast.unparse(node)
285
- except Exception:
285
+ except (ValueError, TypeError):
286
286
  pass
287
287
 
288
288
  return "..."
@@ -295,7 +295,7 @@ class ContractExtractor:
295
295
  if hasattr(ast, "unparse"):
296
296
  try:
297
297
  return ast.unparse(node)
298
- except Exception:
298
+ except (ValueError, TypeError):
299
299
  pass
300
300
 
301
301
  # Fallback: basic conversion
@@ -178,7 +178,7 @@ class GraphAnalyzer:
178
178
  edges = future.result()
179
179
  for module_name, matching_module in edges:
180
180
  graph.add_edge(module_name, matching_module)
181
- except Exception:
181
+ except (OSError, RuntimeError):
182
182
  pass
183
183
  completed += 1
184
184
  if progress_callback:
@@ -211,7 +211,7 @@ class GraphAnalyzer:
211
211
  callee_module = self._resolve_module_from_function(callee, python_files)
212
212
  if callee_module and callee_module in graph:
213
213
  graph.add_edge(module_name, callee_module)
214
- except Exception:
214
+ except (OSError, RuntimeError):
215
215
  pass
216
216
  completed += 1
217
217
  if progress_callback:
@@ -306,7 +306,7 @@ class RelationshipMapper:
306
306
  if file_hash:
307
307
  self.analysis_cache[file_hash] = empty_result
308
308
  return (file_key, empty_result)
309
- except Exception:
309
+ except (OSError, PermissionError):
310
310
  pass
311
311
 
312
312
  try:
@@ -354,7 +354,7 @@ class RelationshipMapper:
354
354
  if not f.done():
355
355
  f.cancel()
356
356
  raise
357
- except Exception:
357
+ except (OSError, ValueError):
358
358
  pass
359
359
  completed_count += 1
360
360
  if progress_callback:
@@ -426,11 +426,11 @@ class LoggerSetup:
426
426
  log_file_path = os.path.join(logs_dir, log_file)
427
427
 
428
428
  log_file_dir = os.path.dirname(log_file_path)
429
- os.makedirs(log_file_dir, mode=0o777, exist_ok=True)
429
+ os.makedirs(log_file_dir, mode=0o755, exist_ok=True)
430
430
  try:
431
431
  with open(log_file_path, "a", encoding="utf-8"):
432
432
  pass
433
- except Exception:
433
+ except OSError:
434
434
  pass
435
435
 
436
436
  try:
@@ -145,7 +145,7 @@ class ConstitutionEnricher:
145
145
  # Simple dependency name without version constraints
146
146
  result["technology_stack"].append(dep)
147
147
 
148
- except Exception:
148
+ except (OSError, UnicodeDecodeError, ValueError):
149
149
  pass # If parsing fails, return empty result
150
150
 
151
151
  return result
@@ -190,7 +190,7 @@ class ConstitutionEnricher:
190
190
  else:
191
191
  result["technology_stack"].append(dep)
192
192
 
193
- except Exception:
193
+ except (OSError, UnicodeDecodeError, ValueError):
194
194
  pass
195
195
 
196
196
  return result
@@ -235,7 +235,7 @@ class ConstitutionEnricher:
235
235
  users = [u.strip() for u in re.split(r"[,;]", users_text)]
236
236
  result["target_users"] = users[:5]
237
237
 
238
- except Exception:
238
+ except (OSError, UnicodeDecodeError, ValueError):
239
239
  pass
240
240
 
241
241
  return result
@@ -265,7 +265,7 @@ class ConstitutionEnricher:
265
265
  # Extract principles from headings and key sections
266
266
  extracted = self._extract_principles_from_markdown(content, rule_file)
267
267
  principles.extend(extracted)
268
- except Exception:
268
+ except (OSError, UnicodeDecodeError, ValueError):
269
269
  pass
270
270
 
271
271
  return principles
@@ -293,7 +293,7 @@ class ConstitutionEnricher:
293
293
  # Extract quality standards
294
294
  extracted = self._extract_quality_standards(content)
295
295
  standards.extend(extracted)
296
- except Exception:
296
+ except (OSError, UnicodeDecodeError, ValueError):
297
297
  pass
298
298
 
299
299
  return standards
@@ -242,7 +242,7 @@ class PersonaExporter:
242
242
  protocol_data = load_structured_file(protocol_file)
243
243
  protocol_name = protocol_file.stem.replace(".protocol", "")
244
244
  protocols[protocol_name] = protocol_data
245
- except Exception:
245
+ except (OSError, ValueError):
246
246
  pass
247
247
  return protocols
248
248
 
@@ -267,7 +267,7 @@ class PersonaExporter:
267
267
  contract_data = load_structured_file(contract_file)
268
268
  contract_name = contract_file.stem.replace(".openapi", "").replace(".asyncapi", "")
269
269
  contracts[contract_name] = contract_data
270
- except Exception:
270
+ except (OSError, ValueError):
271
271
  pass
272
272
  return contracts
273
273