specfact-cli 0.43.2__tar.gz → 0.43.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/PKG-INFO +131 -37
  2. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/README.md +130 -36
  3. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/pyproject.toml +1 -1
  4. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/__init__.py +1 -1
  5. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/__init__.py +1 -1
  6. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/acceptance_criteria.py +32 -5
  7. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/enrichment_parser.py +72 -25
  8. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/optional_deps.py +9 -1
  9. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/.gitignore +0 -0
  10. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/LICENSE +0 -0
  11. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/keys/README.md +0 -0
  12. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/keys/module-signing-public.pem +0 -0
  13. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/mappings/node-async.yaml +0 -0
  14. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/mappings/python-async.yaml +0 -0
  15. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/mappings/speckit-default.yaml +0 -0
  16. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/schemas/deviation.schema.json +0 -0
  17. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/schemas/plan.schema.json +0 -0
  18. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/schemas/protocol.schema.json +0 -0
  19. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/github-action.yml.j2 +0 -0
  20. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/persona/architect.md.j2 +0 -0
  21. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/persona/developer.md.j2 +0 -0
  22. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/persona/product-owner.md.j2 +0 -0
  23. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/plan.bundle.yaml.j2 +0 -0
  24. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/policies/kanban.yaml +0 -0
  25. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/policies/mixed.yaml +0 -0
  26. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/policies/safe.yaml +0 -0
  27. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/policies/scrum.yaml +0 -0
  28. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/pr-template.md.j2 +0 -0
  29. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/protocol.yaml.j2 +0 -0
  30. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/resources/templates/telemetry.yaml.example +0 -0
  31. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/__main__.py +0 -0
  32. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/adapters/__init__.py +0 -0
  33. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/adapters/ado.py +0 -0
  34. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/adapters/backlog_base.py +0 -0
  35. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/adapters/base.py +0 -0
  36. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/adapters/github.py +0 -0
  37. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/adapters/openspec.py +0 -0
  38. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  39. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/adapters/registry.py +0 -0
  40. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/adapters/speckit.py +0 -0
  41. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/agents/__init__.py +0 -0
  42. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/agents/analyze_agent.py +0 -0
  43. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/agents/base.py +0 -0
  44. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/agents/plan_agent.py +0 -0
  45. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/agents/registry.py +0 -0
  46. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/agents/sync_agent.py +0 -0
  47. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/__init__.py +0 -0
  48. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  49. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  50. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  51. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  52. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  53. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  54. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  55. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  56. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  57. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/backlog/__init__.py +0 -0
  58. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  59. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/backlog/adapters/base.py +0 -0
  60. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/backlog/converter.py +0 -0
  61. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/backlog/filters.py +0 -0
  62. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  63. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  64. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/base.py +0 -0
  65. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  66. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  67. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/cli.py +0 -0
  68. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/__init__.py +0 -0
  69. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/_bundle_shim.py +0 -0
  70. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/analyze.py +0 -0
  71. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/contract_cmd.py +0 -0
  72. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/drift.py +0 -0
  73. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/enforce.py +0 -0
  74. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/generate.py +0 -0
  75. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/import_cmd.py +0 -0
  76. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/init.py +0 -0
  77. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/migrate.py +0 -0
  78. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/plan.py +0 -0
  79. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/project_cmd.py +0 -0
  80. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/repro.py +0 -0
  81. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/sdd.py +0 -0
  82. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/spec.py +0 -0
  83. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/sync.py +0 -0
  84. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/update.py +0 -0
  85. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/commands/validate.py +0 -0
  86. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/common/__init__.py +0 -0
  87. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/common/bundle_factory.py +0 -0
  88. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/common/logger_setup.py +0 -0
  89. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/common/logging_utils.py +0 -0
  90. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/common/text_utils.py +0 -0
  91. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/common/utils.py +0 -0
  92. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/comparators/__init__.py +0 -0
  93. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  94. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/contracts/__init__.py +0 -0
  95. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  96. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/contracts/module_interface.py +0 -0
  97. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  98. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  99. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/generators/__init__.py +0 -0
  100. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/generators/contract_generator.py +0 -0
  101. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  102. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/generators/persona_exporter.py +0 -0
  103. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/generators/plan_generator.py +0 -0
  104. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/generators/protocol_generator.py +0 -0
  105. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/generators/report_generator.py +0 -0
  106. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/generators/task_generator.py +0 -0
  107. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  108. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/generators/workflow_generator.py +0 -0
  109. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/groups/__init__.py +0 -0
  110. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/groups/codebase_group.py +0 -0
  111. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/groups/govern_group.py +0 -0
  112. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/groups/member_group.py +0 -0
  113. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/groups/project_group.py +0 -0
  114. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/groups/spec_group.py +0 -0
  115. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/importers/__init__.py +0 -0
  116. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/importers/speckit_converter.py +0 -0
  117. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  118. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/integrations/__init__.py +0 -0
  119. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/integrations/specmatic.py +0 -0
  120. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/merge/__init__.py +0 -0
  121. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/merge/resolver.py +0 -0
  122. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/migrations/__init__.py +0 -0
  123. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  124. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/__init__.py +0 -0
  125. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/backlog_item.py +0 -0
  126. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/bridge.py +0 -0
  127. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/capabilities.py +0 -0
  128. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/change.py +0 -0
  129. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/contract.py +0 -0
  130. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/deviation.py +0 -0
  131. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/dor_config.py +0 -0
  132. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/enforcement.py +0 -0
  133. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/module_package.py +0 -0
  134. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/persona_template.py +0 -0
  135. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/plan.py +0 -0
  136. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/project.py +0 -0
  137. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/protocol.py +0 -0
  138. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/quality.py +0 -0
  139. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/sdd.py +0 -0
  140. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/source_tracking.py +0 -0
  141. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/task.py +0 -0
  142. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/models/validation.py +0 -0
  143. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modes/__init__.py +0 -0
  144. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modes/detector.py +0 -0
  145. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modes/router.py +0 -0
  146. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/__init__.py +0 -0
  147. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/_bundle_import.py +0 -0
  148. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/module-package.yaml +0 -0
  149. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/__init__.py +0 -0
  150. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/app.py +0 -0
  151. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/commands.py +0 -0
  152. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
  153. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_io_shim.py +0 -0
  154. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/module-package.yaml +0 -0
  155. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
  156. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
  157. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/src/commands.py +0 -0
  158. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
  159. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
  160. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
  161. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
  162. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/parsers/__init__.py +0 -0
  163. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/parsers/persona_importer.py +0 -0
  164. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/__init__.py +0 -0
  165. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/alias_manager.py +0 -0
  166. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/bootstrap.py +0 -0
  167. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/bridge_registry.py +0 -0
  168. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/crypto_validator.py +0 -0
  169. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/custom_registries.py +0 -0
  170. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/dependency_resolver.py +0 -0
  171. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/extension_registry.py +0 -0
  172. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/help_cache.py +0 -0
  173. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/marketplace_client.py +0 -0
  174. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/metadata.py +0 -0
  175. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_discovery.py +0 -0
  176. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_grouping.py +0 -0
  177. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_installer.py +0 -0
  178. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_lifecycle.py +0 -0
  179. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_packages.py +0 -0
  180. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_security.py +0 -0
  181. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_state.py +0 -0
  182. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/registry/registry.py +0 -0
  183. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  184. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  185. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  186. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/runtime.py +0 -0
  187. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/__init__.py +0 -0
  188. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_probe.py +0 -0
  189. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync.py +0 -0
  190. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_openspec_md_parse.py +0 -0
  191. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_requirement_from_proposal.py +0 -0
  192. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_requirement_helpers.py +0 -0
  193. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_tasks_from_proposal.py +0 -0
  194. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_what_changes_format.py +0 -0
  195. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_write_openspec_from_proposal.py +0 -0
  196. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_watch.py +0 -0
  197. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/change_detector.py +0 -0
  198. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/code_to_spec.py +0 -0
  199. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/drift_detector.py +0 -0
  200. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/repository_sync.py +0 -0
  201. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/spec_to_code.py +0 -0
  202. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  203. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/watcher.py +0 -0
  204. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  205. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/telemetry.py +0 -0
  206. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/templates/__init__.py +0 -0
  207. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  208. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  209. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  210. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  211. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  212. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  213. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  214. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/templates/registry.py +0 -0
  215. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/templates/specification_templates.py +0 -0
  216. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/__init__.py +0 -0
  217. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/auth_tokens.py +0 -0
  218. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/bundle_converters.py +0 -0
  219. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/bundle_loader.py +0 -0
  220. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/code_change_detector.py +0 -0
  221. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/console.py +0 -0
  222. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  223. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/context_detection.py +0 -0
  224. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/contract_predicates.py +0 -0
  225. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/enrichment_context.py +0 -0
  226. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/env_manager.py +0 -0
  227. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/feature_keys.py +0 -0
  228. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/git.py +0 -0
  229. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/github_annotations.py +0 -0
  230. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/icontract_helpers.py +0 -0
  231. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/ide_setup.py +0 -0
  232. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/incremental_check.py +0 -0
  233. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/metadata.py +0 -0
  234. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/performance.py +0 -0
  235. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/persona_ownership.py +0 -0
  236. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/progress.py +0 -0
  237. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  238. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/prompts.py +0 -0
  239. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  240. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/source_scanner.py +0 -0
  241. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/startup_checks.py +0 -0
  242. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/structure.py +0 -0
  243. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/structured_io.py +0 -0
  244. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/suggestions.py +0 -0
  245. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/terminal.py +0 -0
  246. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/utils/yaml_utils.py +0 -0
  247. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validation/__init__.py +0 -0
  248. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validation/command_audit.py +0 -0
  249. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/__init__.py +0 -0
  250. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/agile_validation.py +0 -0
  251. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  252. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  253. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/contract_validator.py +0 -0
  254. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/fsm.py +0 -0
  255. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/repro_checker.py +0 -0
  256. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/schema.py +0 -0
  257. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  258. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  259. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  260. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  261. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
  262. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  263. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  264. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  265. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  266. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  267. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  268. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  269. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  270. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/models.py +0 -0
  271. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
  272. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  273. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  274. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/versioning/__init__.py +0 -0
  275. {specfact_cli-0.43.2 → specfact_cli-0.43.3}/src/specfact_cli/versioning/analyzer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specfact-cli
3
- Version: 0.43.2
3
+ Version: 0.43.3
4
4
  Summary: The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with validation and contract enforcement for new projects and long-lived codebases.
5
5
  Project-URL: Homepage, https://github.com/nold-ai/specfact-cli
6
6
  Project-URL: Repository, https://github.com/nold-ai/specfact-cli.git
@@ -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.43.3"
8
8
  description = "The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with validation and contract enforcement for new projects and long-lived codebases."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -3,4 +3,4 @@ SpecFact CLI - Spec→Contract→Sentinel tool for contract-driven development.
3
3
  """
4
4
 
5
5
  # Package version: keep in sync with pyproject.toml, setup.py, src/specfact_cli/__init__.py
6
- __version__ = "0.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.43.3"
49
49
 
50
50
  __all__ = ["__version__"]
@@ -30,9 +30,18 @@ _COMMON_WORD_TOKENS = frozenset(
30
30
  )
31
31
 
32
32
 
33
+ def _contains_disallowed_control_chars(text: str) -> bool:
34
+ """Return whether text contains control characters beyond normal whitespace."""
35
+
36
+ return any(ord(char) < 32 and char not in "\n\r\t" for char in text)
37
+
38
+
33
39
  def _code_pattern_match_is_meaningful(pattern: str, acceptance: str) -> bool:
34
40
  """Return True if regex matches are not only common English words."""
35
- matches = re.findall(pattern, acceptance, re.IGNORECASE)
41
+ try:
42
+ matches = re.findall(pattern, acceptance, re.IGNORECASE)
43
+ except re.error:
44
+ return False
36
45
  if isinstance(matches, list):
37
46
  actual = [m for m in matches if isinstance(m, str) and m.lower() not in _COMMON_WORD_TOKENS]
38
47
  else:
@@ -61,6 +70,8 @@ def is_simplified_format_criteria(acceptance: str) -> bool:
61
70
  Returns:
62
71
  True if criteria use the simplified format, False otherwise
63
72
  """
73
+ if _contains_disallowed_control_chars(acceptance):
74
+ return False
64
75
  acceptance_lower = acceptance.lower()
65
76
 
66
77
  # Pattern: "Must verify ... works correctly (see contract examples)"
@@ -73,7 +84,13 @@ def is_simplified_format_criteria(acceptance: str) -> bool:
73
84
  r"check.*works\s+correctly.*\(see\s+contract",
74
85
  ]
75
86
 
76
- return any(re.search(pattern, acceptance_lower) for pattern in simplified_patterns)
87
+ for pattern in simplified_patterns:
88
+ try:
89
+ if re.search(pattern, acceptance_lower):
90
+ return True
91
+ except re.error:
92
+ return False
93
+ return False
77
94
 
78
95
 
79
96
  @beartype
@@ -97,6 +114,8 @@ def is_code_specific_criteria(acceptance: str) -> bool:
97
114
  Returns:
98
115
  True if criteria are code-specific, False if vague/generic
99
116
  """
117
+ if _contains_disallowed_control_chars(acceptance):
118
+ return False
100
119
  acceptance_lower = acceptance.lower()
101
120
 
102
121
  # FIRST: Check for generic placeholders that indicate non-code-specific
@@ -123,8 +142,12 @@ def is_code_specific_criteria(acceptance: str) -> bool:
123
142
  r"\bis\s+complete\b",
124
143
  r"\bis\s+ready\b",
125
144
  ]
126
- if any(re.search(pattern, acceptance_lower) for pattern in vague_patterns):
127
- return False # Not code-specific, should be enriched
145
+ for pattern in vague_patterns:
146
+ try:
147
+ if re.search(pattern, acceptance_lower):
148
+ return False # Not code-specific, should be enriched
149
+ except re.error:
150
+ return False
128
151
 
129
152
  # THIRD: Check for code-specific indicators
130
153
  code_specific_patterns = [
@@ -161,7 +184,11 @@ def is_code_specific_criteria(acceptance: str) -> bool:
161
184
  ]
162
185
 
163
186
  for pattern in code_specific_patterns:
164
- if re.search(pattern, acceptance, re.IGNORECASE) and _code_pattern_match_is_meaningful(pattern, acceptance):
187
+ try:
188
+ matched = re.search(pattern, acceptance, re.IGNORECASE)
189
+ except re.error:
190
+ return False
191
+ if matched and _code_pattern_match_is_meaningful(pattern, acceptance):
165
192
  return True
166
193
 
167
194
  return False