specfact-cli 0.43.1__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.1 → specfact_cli-0.43.3}/PKG-INFO +135 -37
  2. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/README.md +134 -36
  3. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/pyproject.toml +11 -2
  4. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/__init__.py +1 -1
  5. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/__init__.py +4 -1
  6. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/acceptance_criteria.py +32 -5
  7. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/enrichment_parser.py +72 -25
  8. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/optional_deps.py +9 -1
  9. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/.gitignore +0 -0
  10. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/LICENSE +0 -0
  11. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/keys/README.md +0 -0
  12. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/keys/module-signing-public.pem +0 -0
  13. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/mappings/node-async.yaml +0 -0
  14. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/mappings/python-async.yaml +0 -0
  15. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/mappings/speckit-default.yaml +0 -0
  16. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/schemas/deviation.schema.json +0 -0
  17. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/schemas/plan.schema.json +0 -0
  18. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/schemas/protocol.schema.json +0 -0
  19. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/github-action.yml.j2 +0 -0
  20. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/persona/architect.md.j2 +0 -0
  21. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/persona/developer.md.j2 +0 -0
  22. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/persona/product-owner.md.j2 +0 -0
  23. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/plan.bundle.yaml.j2 +0 -0
  24. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/policies/kanban.yaml +0 -0
  25. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/policies/mixed.yaml +0 -0
  26. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/policies/safe.yaml +0 -0
  27. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/policies/scrum.yaml +0 -0
  28. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/pr-template.md.j2 +0 -0
  29. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/protocol.yaml.j2 +0 -0
  30. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/telemetry.yaml.example +0 -0
  31. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/__main__.py +0 -0
  32. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/__init__.py +0 -0
  33. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/ado.py +0 -0
  34. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/backlog_base.py +0 -0
  35. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/base.py +0 -0
  36. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/github.py +0 -0
  37. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/openspec.py +0 -0
  38. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  39. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/registry.py +0 -0
  40. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/speckit.py +0 -0
  41. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/__init__.py +0 -0
  42. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/analyze_agent.py +0 -0
  43. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/base.py +0 -0
  44. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/plan_agent.py +0 -0
  45. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/registry.py +0 -0
  46. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/sync_agent.py +0 -0
  47. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/__init__.py +0 -0
  48. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  49. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  50. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  51. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  52. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  53. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  54. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  55. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  56. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  57. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/__init__.py +0 -0
  58. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  59. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/adapters/base.py +0 -0
  60. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/converter.py +0 -0
  61. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/filters.py +0 -0
  62. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  63. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  64. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/base.py +0 -0
  65. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  66. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  67. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/cli.py +0 -0
  68. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/__init__.py +0 -0
  69. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/_bundle_shim.py +0 -0
  70. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/analyze.py +0 -0
  71. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/contract_cmd.py +0 -0
  72. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/drift.py +0 -0
  73. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/enforce.py +0 -0
  74. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/generate.py +0 -0
  75. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/import_cmd.py +0 -0
  76. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/init.py +0 -0
  77. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/migrate.py +0 -0
  78. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/plan.py +0 -0
  79. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/project_cmd.py +0 -0
  80. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/repro.py +0 -0
  81. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/sdd.py +0 -0
  82. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/spec.py +0 -0
  83. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/sync.py +0 -0
  84. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/update.py +0 -0
  85. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/validate.py +0 -0
  86. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/__init__.py +0 -0
  87. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/bundle_factory.py +0 -0
  88. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/logger_setup.py +0 -0
  89. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/logging_utils.py +0 -0
  90. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/text_utils.py +0 -0
  91. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/utils.py +0 -0
  92. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/comparators/__init__.py +0 -0
  93. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  94. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/contracts/__init__.py +0 -0
  95. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  96. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/contracts/module_interface.py +0 -0
  97. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  98. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  99. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/__init__.py +0 -0
  100. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/contract_generator.py +0 -0
  101. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  102. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/persona_exporter.py +0 -0
  103. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/plan_generator.py +0 -0
  104. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/protocol_generator.py +0 -0
  105. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/report_generator.py +0 -0
  106. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/task_generator.py +0 -0
  107. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  108. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/workflow_generator.py +0 -0
  109. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/__init__.py +0 -0
  110. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/codebase_group.py +0 -0
  111. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/govern_group.py +0 -0
  112. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/member_group.py +0 -0
  113. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/project_group.py +0 -0
  114. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/spec_group.py +0 -0
  115. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/importers/__init__.py +0 -0
  116. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/importers/speckit_converter.py +0 -0
  117. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  118. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/integrations/__init__.py +0 -0
  119. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/integrations/specmatic.py +0 -0
  120. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/merge/__init__.py +0 -0
  121. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/merge/resolver.py +0 -0
  122. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/migrations/__init__.py +0 -0
  123. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  124. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/__init__.py +0 -0
  125. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/backlog_item.py +0 -0
  126. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/bridge.py +0 -0
  127. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/capabilities.py +0 -0
  128. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/change.py +0 -0
  129. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/contract.py +0 -0
  130. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/deviation.py +0 -0
  131. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/dor_config.py +0 -0
  132. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/enforcement.py +0 -0
  133. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/module_package.py +0 -0
  134. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/persona_template.py +0 -0
  135. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/plan.py +0 -0
  136. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/project.py +0 -0
  137. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/protocol.py +0 -0
  138. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/quality.py +0 -0
  139. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/sdd.py +0 -0
  140. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/source_tracking.py +0 -0
  141. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/task.py +0 -0
  142. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/validation.py +0 -0
  143. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modes/__init__.py +0 -0
  144. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modes/detector.py +0 -0
  145. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modes/router.py +0 -0
  146. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/__init__.py +0 -0
  147. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/_bundle_import.py +0 -0
  148. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/module-package.yaml +0 -0
  149. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/__init__.py +0 -0
  150. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/app.py +0 -0
  151. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/commands.py +0 -0
  152. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
  153. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_io_shim.py +0 -0
  154. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/module-package.yaml +0 -0
  155. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
  156. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
  157. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/src/commands.py +0 -0
  158. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
  159. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
  160. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
  161. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
  162. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/parsers/__init__.py +0 -0
  163. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/parsers/persona_importer.py +0 -0
  164. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/__init__.py +0 -0
  165. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/alias_manager.py +0 -0
  166. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/bootstrap.py +0 -0
  167. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/bridge_registry.py +0 -0
  168. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/crypto_validator.py +0 -0
  169. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/custom_registries.py +0 -0
  170. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/dependency_resolver.py +0 -0
  171. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/extension_registry.py +0 -0
  172. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/help_cache.py +0 -0
  173. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/marketplace_client.py +0 -0
  174. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/metadata.py +0 -0
  175. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_discovery.py +0 -0
  176. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_grouping.py +0 -0
  177. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_installer.py +0 -0
  178. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_lifecycle.py +0 -0
  179. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_packages.py +0 -0
  180. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_security.py +0 -0
  181. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_state.py +0 -0
  182. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/registry.py +0 -0
  183. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  184. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  185. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  186. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/runtime.py +0 -0
  187. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/__init__.py +0 -0
  188. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_probe.py +0 -0
  189. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync.py +0 -0
  190. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_openspec_md_parse.py +0 -0
  191. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_requirement_from_proposal.py +0 -0
  192. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_requirement_helpers.py +0 -0
  193. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_tasks_from_proposal.py +0 -0
  194. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_what_changes_format.py +0 -0
  195. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_write_openspec_from_proposal.py +0 -0
  196. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_watch.py +0 -0
  197. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/change_detector.py +0 -0
  198. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/code_to_spec.py +0 -0
  199. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/drift_detector.py +0 -0
  200. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/repository_sync.py +0 -0
  201. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/spec_to_code.py +0 -0
  202. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  203. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/watcher.py +0 -0
  204. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  205. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/telemetry.py +0 -0
  206. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/__init__.py +0 -0
  207. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  208. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  209. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  210. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  211. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  212. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  213. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  214. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/registry.py +0 -0
  215. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/specification_templates.py +0 -0
  216. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/__init__.py +0 -0
  217. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/auth_tokens.py +0 -0
  218. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/bundle_converters.py +0 -0
  219. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/bundle_loader.py +0 -0
  220. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/code_change_detector.py +0 -0
  221. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/console.py +0 -0
  222. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  223. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/context_detection.py +0 -0
  224. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/contract_predicates.py +0 -0
  225. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/enrichment_context.py +0 -0
  226. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/env_manager.py +0 -0
  227. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/feature_keys.py +0 -0
  228. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/git.py +0 -0
  229. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/github_annotations.py +0 -0
  230. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/icontract_helpers.py +0 -0
  231. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/ide_setup.py +0 -0
  232. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/incremental_check.py +0 -0
  233. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/metadata.py +0 -0
  234. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/performance.py +0 -0
  235. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/persona_ownership.py +0 -0
  236. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/progress.py +0 -0
  237. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  238. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/prompts.py +0 -0
  239. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  240. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/source_scanner.py +0 -0
  241. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/startup_checks.py +0 -0
  242. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/structure.py +0 -0
  243. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/structured_io.py +0 -0
  244. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/suggestions.py +0 -0
  245. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/terminal.py +0 -0
  246. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/yaml_utils.py +0 -0
  247. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validation/__init__.py +0 -0
  248. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validation/command_audit.py +0 -0
  249. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/__init__.py +0 -0
  250. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/agile_validation.py +0 -0
  251. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  252. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  253. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/contract_validator.py +0 -0
  254. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/fsm.py +0 -0
  255. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/repro_checker.py +0 -0
  256. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/schema.py +0 -0
  257. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  258. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  259. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  260. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  261. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
  262. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  263. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  264. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  265. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  266. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  267. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  268. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  269. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  270. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/models.py +0 -0
  271. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
  272. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  273. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  274. {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/versioning/__init__.py +0 -0
  275. {specfact_cli-0.43.1 → 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.1
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,12 +281,17 @@ 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 AI-assisted changes 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
 
291
+ SpecFact CLI does **not** include built-in AI. It is a deterministic local CLI
292
+ that can be paired with IDE slash-command prompts so your chosen AI copilot can
293
+ invoke SpecFact as part of a command chain.
294
+
290
295
  [![PyPI version](https://img.shields.io/pypi/v/specfact-cli.svg?color=22c55e)](https://pypi.org/project/specfact-cli/)
291
296
  [![Python versions](https://img.shields.io/pypi/pyversions/specfact-cli.svg)](https://pypi.org/project/specfact-cli/)
292
297
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
@@ -300,21 +305,54 @@ Description-Content-Type: text/markdown
300
305
 
301
306
  ---
302
307
 
303
- ## Documentation Topology
308
+ ## What is SpecFact?
304
309
 
305
- `docs.specfact.io` is the canonical docs entry point for SpecFact.
310
+ SpecFact is the validation and alignment layer for software delivery.
306
311
 
307
- - Core CLI/runtime/platform documentation remains owned by `specfact-cli`.
308
- - Module-specific deep docs are canonically owned by `specfact-cli-modules`.
309
- - 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.
310
316
 
311
- Use this repository's docs for the overall SpecFact workflow, CLI runtime lifecycle, module registry, trust model, and command-group topology.
312
- Use the modules docs site for bundle-specific deep dives, adapter details, workflow tutorials, and module-authoring guidance.
313
- 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
314
322
 
315
- ---
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?
316
336
 
317
- ## Start Here (60 seconds)
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
343
+
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)
318
356
 
319
357
  ### Install
320
358
 
@@ -326,38 +364,104 @@ uvx specfact-cli@latest
326
364
  pip install -U specfact-cli
327
365
  ```
328
366
 
329
- ### Bootstrap and IDE Setup
367
+ ### Bootstrap
330
368
 
331
369
  ```bash
332
- # First run: install official bundles
370
+ # Recommended first run
333
371
  specfact init --profile solo-developer
334
-
335
- # Alternative bundle selection
336
- specfact init --install backlog,codebase
337
- specfact init --install all
338
-
339
- # IDE prompt/template setup
340
- specfact init ide
341
- specfact init ide --ide cursor
342
- specfact init ide --ide vscode
343
372
  ```
344
373
 
345
- `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.
346
-
347
- ### Run Your First Flow
374
+ ### Get First Value
348
375
 
349
376
  ```bash
350
- # Analyze an existing codebase
377
+ # Analyze a codebase you care about
351
378
  specfact code import my-project --repo .
352
379
 
353
- # Snapshot current project state
380
+ # Snapshot the project state for follow-up workflows
354
381
  specfact project snapshot --bundle my-project
355
382
 
356
- # Validate external code without modifying source
383
+ # Validate external code without modifying the target repo
357
384
  specfact code validate sidecar init my-project /path/to/repo
358
385
  specfact code validate sidecar run my-project /path/to/repo
359
386
  ```
360
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
+
361
465
  ### Migration Note (Flat Commands Removed)
362
466
 
363
467
  As of `0.40.0`, flat root commands are removed. Use grouped commands:
@@ -397,12 +501,6 @@ For GitHub, replace adapter/org/project with:
397
501
  /specfact.01-import my-project --repo .
398
502
  ```
399
503
 
400
- **Next steps**
401
-
402
- - **[Core CLI docs](docs/index.md)**
403
- - **[Reference: command topology](docs/reference/commands.md)**
404
- - **[Canonical modules docs site](https://modules.specfact.io/)**
405
-
406
504
  ---
407
505
 
408
506
  ## Who It Is For
@@ -1,11 +1,16 @@
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 AI-assisted changes 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
 
10
+ SpecFact CLI does **not** include built-in AI. It is a deterministic local CLI
11
+ that can be paired with IDE slash-command prompts so your chosen AI copilot can
12
+ invoke SpecFact as part of a command chain.
13
+
9
14
  [![PyPI version](https://img.shields.io/pypi/v/specfact-cli.svg?color=22c55e)](https://pypi.org/project/specfact-cli/)
10
15
  [![Python versions](https://img.shields.io/pypi/pyversions/specfact-cli.svg)](https://pypi.org/project/specfact-cli/)
11
16
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
@@ -19,21 +24,54 @@
19
24
 
20
25
  ---
21
26
 
22
- ## Documentation Topology
27
+ ## What is SpecFact?
23
28
 
24
- `docs.specfact.io` is the canonical docs entry point for SpecFact.
29
+ SpecFact is the validation and alignment layer for software delivery.
25
30
 
26
- - Core CLI/runtime/platform documentation remains owned by `specfact-cli`.
27
- - Module-specific deep docs are canonically owned by `specfact-cli-modules`.
28
- - 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.
29
35
 
30
- Use this repository's docs for the overall SpecFact workflow, CLI runtime lifecycle, module registry, trust model, and command-group topology.
31
- Use the modules docs site for bundle-specific deep dives, adapter details, workflow tutorials, and module-authoring guidance.
32
- 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
33
41
 
34
- ---
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?
35
55
 
36
- ## Start Here (60 seconds)
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
62
+
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)
37
75
 
38
76
  ### Install
39
77
 
@@ -45,38 +83,104 @@ uvx specfact-cli@latest
45
83
  pip install -U specfact-cli
46
84
  ```
47
85
 
48
- ### Bootstrap and IDE Setup
86
+ ### Bootstrap
49
87
 
50
88
  ```bash
51
- # First run: install official bundles
89
+ # Recommended first run
52
90
  specfact init --profile solo-developer
53
-
54
- # Alternative bundle selection
55
- specfact init --install backlog,codebase
56
- specfact init --install all
57
-
58
- # IDE prompt/template setup
59
- specfact init ide
60
- specfact init ide --ide cursor
61
- specfact init ide --ide vscode
62
91
  ```
63
92
 
64
- `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.
65
-
66
- ### Run Your First Flow
93
+ ### Get First Value
67
94
 
68
95
  ```bash
69
- # Analyze an existing codebase
96
+ # Analyze a codebase you care about
70
97
  specfact code import my-project --repo .
71
98
 
72
- # Snapshot current project state
99
+ # Snapshot the project state for follow-up workflows
73
100
  specfact project snapshot --bundle my-project
74
101
 
75
- # Validate external code without modifying source
102
+ # Validate external code without modifying the target repo
76
103
  specfact code validate sidecar init my-project /path/to/repo
77
104
  specfact code validate sidecar run my-project /path/to/repo
78
105
  ```
79
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
+
80
184
  ### Migration Note (Flat Commands Removed)
81
185
 
82
186
  As of `0.40.0`, flat root commands are removed. Use grouped commands:
@@ -116,12 +220,6 @@ For GitHub, replace adapter/org/project with:
116
220
  /specfact.01-import my-project --repo .
117
221
  ```
118
222
 
119
- **Next steps**
120
-
121
- - **[Core CLI docs](docs/index.md)**
122
- - **[Reference: command topology](docs/reference/commands.md)**
123
- - **[Canonical modules docs site](https://modules.specfact.io/)**
124
-
125
223
  ---
126
224
 
127
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.1"
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"
@@ -220,7 +220,8 @@ yaml-check-all = "bash scripts/yaml-tools.sh check-all {args}"
220
220
  # Docs validation (docs-12): command examples vs CLI; modules.specfact.io URLs in docs
221
221
  check-docs-commands = "python scripts/check-docs-commands.py"
222
222
  check-cross-site-links = "python scripts/check-cross-site-links.py"
223
- docs-validate = "python scripts/check-docs-commands.py && python scripts/check-cross-site-links.py --warn-only"
223
+ doc-frontmatter-check = "python scripts/check_doc_frontmatter.py"
224
+ docs-validate = "python scripts/check-docs-commands.py && python scripts/check-cross-site-links.py --warn-only && python scripts/check_doc_frontmatter.py"
224
225
 
225
226
  # Legacy entry (kept for compatibility); prefer `workflows-lint` above
226
227
  lint-workflows = "bash scripts/run_actionlint.sh {args}"
@@ -718,6 +719,14 @@ ignore = [
718
719
  "SLF001", # private member accessed
719
720
  ]
720
721
 
722
+ "tests/unit/tools/test_smart_test_coverage.py" = [
723
+ "E402", # imports after sys.path bootstrap for tool harness loading
724
+ ]
725
+
726
+ "tests/unit/tools/test_smart_test_coverage_enhanced.py" = [
727
+ "E402", # imports after sys.path bootstrap for tool harness loading
728
+ ]
729
+
721
730
  # Tools and scripts can be more lenient
722
731
  "tools/**/*" = [
723
732
  "T20", # print found
@@ -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.1"
6
+ __version__ = "0.43.3"
@@ -6,6 +6,9 @@ This package provides command-line tools for:
6
6
  - Keeping backlog, specs, tests, and code in sync
7
7
  - Enforcing validation and contract checks before production
8
8
  - Supporting agile ceremonies and team workflows
9
+
10
+ When a sibling ``specfact-cli-modules`` checkout exists, startup prepends each bundle's ``src``
11
+ to ``sys.path`` so local development can load marketplace packages without installing wheels.
9
12
  """
10
13
 
11
14
  from __future__ import annotations
@@ -42,6 +45,6 @@ def _bootstrap_bundle_paths() -> None:
42
45
 
43
46
  _bootstrap_bundle_paths()
44
47
 
45
- __version__ = "0.43.1"
48
+ __version__ = "0.43.3"
46
49
 
47
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