specfact-cli 0.39.0__tar.gz → 0.40.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/PKG-INFO +60 -14
  2. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/README.md +59 -13
  3. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/pyproject.toml +8 -1
  4. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/__init__.py +1 -1
  5. specfact_cli-0.40.0/src/specfact_cli/__init__.py +47 -0
  6. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/ado.py +4 -4
  7. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/github.py +2 -2
  8. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/cli.py +64 -1
  9. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/commands/__init__.py +0 -23
  10. specfact_cli-0.40.0/src/specfact_cli/commands/_bundle_shim.py +14 -0
  11. specfact_cli-0.40.0/src/specfact_cli/commands/analyze.py +18 -0
  12. specfact_cli-0.40.0/src/specfact_cli/commands/backlog_commands.py +18 -0
  13. specfact_cli-0.40.0/src/specfact_cli/commands/contract_cmd.py +18 -0
  14. specfact_cli-0.40.0/src/specfact_cli/commands/drift.py +18 -0
  15. specfact_cli-0.40.0/src/specfact_cli/commands/enforce.py +18 -0
  16. specfact_cli-0.40.0/src/specfact_cli/commands/generate.py +18 -0
  17. specfact_cli-0.40.0/src/specfact_cli/commands/import_cmd.py +18 -0
  18. specfact_cli-0.40.0/src/specfact_cli/commands/init.py +17 -0
  19. specfact_cli-0.40.0/src/specfact_cli/commands/migrate.py +18 -0
  20. specfact_cli-0.40.0/src/specfact_cli/commands/plan.py +18 -0
  21. specfact_cli-0.40.0/src/specfact_cli/commands/project_cmd.py +18 -0
  22. specfact_cli-0.40.0/src/specfact_cli/commands/repro.py +18 -0
  23. specfact_cli-0.40.0/src/specfact_cli/commands/sdd.py +18 -0
  24. specfact_cli-0.40.0/src/specfact_cli/commands/spec.py +18 -0
  25. specfact_cli-0.40.0/src/specfact_cli/commands/sync.py +18 -0
  26. specfact_cli-0.40.0/src/specfact_cli/commands/update.py +17 -0
  27. specfact_cli-0.40.0/src/specfact_cli/commands/validate.py +18 -0
  28. specfact_cli-0.40.0/src/specfact_cli/common/bundle_factory.py +42 -0
  29. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/backlog_group.py +22 -3
  30. specfact_cli-0.40.0/src/specfact_cli/modules/_bundle_import.py +36 -0
  31. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/module-package.yaml +4 -4
  32. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/src/commands.py +54 -7
  33. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/module-package.yaml +4 -4
  34. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/commands.py +65 -2
  35. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/module-package.yaml +4 -4
  36. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/crypto_validator.py +62 -0
  37. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/custom_registries.py +23 -14
  38. specfact_cli-0.40.0/src/specfact_cli/registry/marketplace_client.py +296 -0
  39. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_grouping.py +14 -0
  40. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_installer.py +182 -3
  41. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_lifecycle.py +7 -2
  42. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_packages.py +190 -110
  43. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/runtime.py +4 -4
  44. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/persona_ownership.py +8 -6
  45. specfact_cli-0.39.0/src/specfact_cli/__init__.py +0 -13
  46. specfact_cli-0.39.0/src/specfact_cli/commands/analyze.py +0 -6
  47. specfact_cli-0.39.0/src/specfact_cli/commands/auth.py +0 -6
  48. specfact_cli-0.39.0/src/specfact_cli/commands/backlog_commands.py +0 -6
  49. specfact_cli-0.39.0/src/specfact_cli/commands/contract_cmd.py +0 -6
  50. specfact_cli-0.39.0/src/specfact_cli/commands/drift.py +0 -6
  51. specfact_cli-0.39.0/src/specfact_cli/commands/enforce.py +0 -6
  52. specfact_cli-0.39.0/src/specfact_cli/commands/generate.py +0 -6
  53. specfact_cli-0.39.0/src/specfact_cli/commands/import_cmd.py +0 -6
  54. specfact_cli-0.39.0/src/specfact_cli/commands/init.py +0 -6
  55. specfact_cli-0.39.0/src/specfact_cli/commands/migrate.py +0 -6
  56. specfact_cli-0.39.0/src/specfact_cli/commands/plan.py +0 -6
  57. specfact_cli-0.39.0/src/specfact_cli/commands/project_cmd.py +0 -6
  58. specfact_cli-0.39.0/src/specfact_cli/commands/repro.py +0 -6
  59. specfact_cli-0.39.0/src/specfact_cli/commands/sdd.py +0 -6
  60. specfact_cli-0.39.0/src/specfact_cli/commands/spec.py +0 -6
  61. specfact_cli-0.39.0/src/specfact_cli/commands/sync.py +0 -6
  62. specfact_cli-0.39.0/src/specfact_cli/commands/update.py +0 -6
  63. specfact_cli-0.39.0/src/specfact_cli/commands/validate.py +0 -6
  64. specfact_cli-0.39.0/src/specfact_cli/modules/analyze/module-package.yaml +0 -23
  65. specfact_cli-0.39.0/src/specfact_cli/modules/analyze/src/app.py +0 -6
  66. specfact_cli-0.39.0/src/specfact_cli/modules/analyze/src/commands.py +0 -368
  67. specfact_cli-0.39.0/src/specfact_cli/modules/auth/module-package.yaml +0 -21
  68. specfact_cli-0.39.0/src/specfact_cli/modules/auth/src/app.py +0 -6
  69. specfact_cli-0.39.0/src/specfact_cli/modules/auth/src/commands.py +0 -726
  70. specfact_cli-0.39.0/src/specfact_cli/modules/backlog/module-package.yaml +0 -36
  71. specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/__init__.py +0 -1
  72. specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/__init__.py +0 -9
  73. specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/ado.py +0 -20
  74. specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/base.py +0 -93
  75. specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/github.py +0 -20
  76. specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/jira.py +0 -20
  77. specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/linear.py +0 -20
  78. specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/app.py +0 -6
  79. specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/commands.py +0 -5546
  80. specfact_cli-0.39.0/src/specfact_cli/modules/contract/module-package.yaml +0 -23
  81. specfact_cli-0.39.0/src/specfact_cli/modules/contract/src/__init__.py +0 -1
  82. specfact_cli-0.39.0/src/specfact_cli/modules/contract/src/app.py +0 -6
  83. specfact_cli-0.39.0/src/specfact_cli/modules/contract/src/commands.py +0 -1251
  84. specfact_cli-0.39.0/src/specfact_cli/modules/drift/module-package.yaml +0 -23
  85. specfact_cli-0.39.0/src/specfact_cli/modules/drift/src/__init__.py +0 -1
  86. specfact_cli-0.39.0/src/specfact_cli/modules/drift/src/app.py +0 -6
  87. specfact_cli-0.39.0/src/specfact_cli/modules/drift/src/commands.py +0 -253
  88. specfact_cli-0.39.0/src/specfact_cli/modules/enforce/module-package.yaml +0 -24
  89. specfact_cli-0.39.0/src/specfact_cli/modules/enforce/src/__init__.py +0 -1
  90. specfact_cli-0.39.0/src/specfact_cli/modules/enforce/src/app.py +0 -6
  91. specfact_cli-0.39.0/src/specfact_cli/modules/enforce/src/commands.py +0 -677
  92. specfact_cli-0.39.0/src/specfact_cli/modules/generate/module-package.yaml +0 -24
  93. specfact_cli-0.39.0/src/specfact_cli/modules/generate/src/__init__.py +0 -1
  94. specfact_cli-0.39.0/src/specfact_cli/modules/generate/src/app.py +0 -6
  95. specfact_cli-0.39.0/src/specfact_cli/modules/generate/src/commands.py +0 -2188
  96. specfact_cli-0.39.0/src/specfact_cli/modules/import_cmd/module-package.yaml +0 -23
  97. specfact_cli-0.39.0/src/specfact_cli/modules/import_cmd/src/__init__.py +0 -1
  98. specfact_cli-0.39.0/src/specfact_cli/modules/import_cmd/src/app.py +0 -6
  99. specfact_cli-0.39.0/src/specfact_cli/modules/import_cmd/src/commands.py +0 -2924
  100. specfact_cli-0.39.0/src/specfact_cli/modules/init/src/__init__.py +0 -1
  101. specfact_cli-0.39.0/src/specfact_cli/modules/migrate/module-package.yaml +0 -23
  102. specfact_cli-0.39.0/src/specfact_cli/modules/migrate/src/__init__.py +0 -1
  103. specfact_cli-0.39.0/src/specfact_cli/modules/migrate/src/app.py +0 -6
  104. specfact_cli-0.39.0/src/specfact_cli/modules/migrate/src/commands.py +0 -935
  105. specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/module-package.yaml +0 -24
  106. specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/app.py +0 -6
  107. specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/commands.py +0 -58
  108. specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/__init__.py +0 -6
  109. specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/__init__.py +0 -1
  110. specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/apply.py +0 -80
  111. specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/__init__.py +0 -8
  112. specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/applier.py +0 -62
  113. specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/generator.py +0 -33
  114. specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/idempotency.py +0 -42
  115. specfact_cli-0.39.0/src/specfact_cli/modules/plan/module-package.yaml +0 -24
  116. specfact_cli-0.39.0/src/specfact_cli/modules/plan/src/__init__.py +0 -1
  117. specfact_cli-0.39.0/src/specfact_cli/modules/plan/src/app.py +0 -6
  118. specfact_cli-0.39.0/src/specfact_cli/modules/plan/src/commands.py +0 -5574
  119. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/module-package.yaml +0 -30
  120. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/app.py +0 -6
  121. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/commands.py +0 -22
  122. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/__init__.py +0 -6
  123. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/config/__init__.py +0 -13
  124. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/config/policy_config.py +0 -71
  125. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/config/templates.py +0 -56
  126. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/__init__.py +0 -7
  127. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/suggester.py +0 -35
  128. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/validator.py +0 -257
  129. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/main.py +0 -329
  130. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/models/__init__.py +0 -6
  131. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/models/policy_result.py +0 -35
  132. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/__init__.py +0 -8
  133. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/kanban.py +0 -65
  134. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/safe.py +0 -47
  135. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/scrum.py +0 -58
  136. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/__init__.py +0 -6
  137. specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/policy_registry.py +0 -37
  138. specfact_cli-0.39.0/src/specfact_cli/modules/project/module-package.yaml +0 -23
  139. specfact_cli-0.39.0/src/specfact_cli/modules/project/src/__init__.py +0 -1
  140. specfact_cli-0.39.0/src/specfact_cli/modules/project/src/app.py +0 -6
  141. specfact_cli-0.39.0/src/specfact_cli/modules/project/src/commands.py +0 -2498
  142. specfact_cli-0.39.0/src/specfact_cli/modules/repro/module-package.yaml +0 -23
  143. specfact_cli-0.39.0/src/specfact_cli/modules/repro/src/__init__.py +0 -1
  144. specfact_cli-0.39.0/src/specfact_cli/modules/repro/src/app.py +0 -6
  145. specfact_cli-0.39.0/src/specfact_cli/modules/repro/src/commands.py +0 -579
  146. specfact_cli-0.39.0/src/specfact_cli/modules/sdd/module-package.yaml +0 -23
  147. specfact_cli-0.39.0/src/specfact_cli/modules/sdd/src/__init__.py +0 -1
  148. specfact_cli-0.39.0/src/specfact_cli/modules/sdd/src/app.py +0 -6
  149. specfact_cli-0.39.0/src/specfact_cli/modules/sdd/src/commands.py +0 -415
  150. specfact_cli-0.39.0/src/specfact_cli/modules/spec/module-package.yaml +0 -23
  151. specfact_cli-0.39.0/src/specfact_cli/modules/spec/src/__init__.py +0 -1
  152. specfact_cli-0.39.0/src/specfact_cli/modules/spec/src/app.py +0 -6
  153. specfact_cli-0.39.0/src/specfact_cli/modules/spec/src/commands.py +0 -902
  154. specfact_cli-0.39.0/src/specfact_cli/modules/sync/module-package.yaml +0 -26
  155. specfact_cli-0.39.0/src/specfact_cli/modules/sync/src/__init__.py +0 -1
  156. specfact_cli-0.39.0/src/specfact_cli/modules/sync/src/app.py +0 -6
  157. specfact_cli-0.39.0/src/specfact_cli/modules/sync/src/commands.py +0 -2504
  158. specfact_cli-0.39.0/src/specfact_cli/modules/upgrade/src/__init__.py +0 -1
  159. specfact_cli-0.39.0/src/specfact_cli/modules/validate/module-package.yaml +0 -23
  160. specfact_cli-0.39.0/src/specfact_cli/modules/validate/src/__init__.py +0 -1
  161. specfact_cli-0.39.0/src/specfact_cli/modules/validate/src/app.py +0 -6
  162. specfact_cli-0.39.0/src/specfact_cli/modules/validate/src/commands.py +0 -321
  163. specfact_cli-0.39.0/src/specfact_cli/registry/marketplace_client.py +0 -136
  164. specfact_cli-0.39.0/src/specfact_cli/templates/bridge_templates.py +0 -243
  165. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/.gitignore +0 -0
  166. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/LICENSE +0 -0
  167. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/keys/README.md +0 -0
  168. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/keys/module-signing-public.pem +0 -0
  169. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/mappings/node-async.yaml +0 -0
  170. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/mappings/python-async.yaml +0 -0
  171. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/mappings/speckit-default.yaml +0 -0
  172. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/shared/cli-enforcement.md +0 -0
  173. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.01-import.md +0 -0
  174. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.02-plan.md +0 -0
  175. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.03-review.md +0 -0
  176. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.04-sdd.md +0 -0
  177. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.05-enforce.md +0 -0
  178. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.06-sync.md +0 -0
  179. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.07-contracts.md +0 -0
  180. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-add.md +0 -0
  181. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-daily.md +0 -0
  182. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-refine.md +0 -0
  183. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.compare.md +0 -0
  184. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.sync-backlog.md +0 -0
  185. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.validate.md +0 -0
  186. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/schemas/deviation.schema.json +0 -0
  187. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/schemas/plan.schema.json +0 -0
  188. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/schemas/protocol.schema.json +0 -0
  189. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/defect_v1.yaml +0 -0
  190. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/enabler_v1.yaml +0 -0
  191. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/spike_v1.yaml +0 -0
  192. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/user_story_v1.yaml +0 -0
  193. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_agile.yaml +0 -0
  194. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_default.yaml +0 -0
  195. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_kanban.yaml +0 -0
  196. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_safe.yaml +0 -0
  197. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_scrum.yaml +0 -0
  198. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/frameworks/safe/safe_feature_v1.yaml +0 -0
  199. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/frameworks/scrum/user_story_v1.yaml +0 -0
  200. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/personas/developer/developer_task_v1.yaml +0 -0
  201. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/personas/product-owner/user_story_v1.yaml +0 -0
  202. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/providers/ado/work_item_v1.yaml +0 -0
  203. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/github-action.yml.j2 +0 -0
  204. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/persona/architect.md.j2 +0 -0
  205. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/persona/developer.md.j2 +0 -0
  206. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/persona/product-owner.md.j2 +0 -0
  207. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
  208. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/policies/kanban.yaml +0 -0
  209. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/policies/mixed.yaml +0 -0
  210. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/policies/safe.yaml +0 -0
  211. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/policies/scrum.yaml +0 -0
  212. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/pr-template.md.j2 +0 -0
  213. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/protocol.yaml.j2 +0 -0
  214. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/telemetry.yaml.example +0 -0
  215. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/__main__.py +0 -0
  216. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/__init__.py +0 -0
  217. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
  218. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/base.py +0 -0
  219. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/openspec.py +0 -0
  220. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  221. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/registry.py +0 -0
  222. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/speckit.py +0 -0
  223. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/__init__.py +0 -0
  224. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/analyze_agent.py +0 -0
  225. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/base.py +0 -0
  226. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/plan_agent.py +0 -0
  227. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/registry.py +0 -0
  228. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/sync_agent.py +0 -0
  229. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/__init__.py +0 -0
  230. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  231. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  232. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  233. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  234. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  235. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  236. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  237. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  238. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  239. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/__init__.py +0 -0
  240. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  241. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
  242. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/local_yaml_adapter.py +0 -0
  243. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/ai_refiner.py +0 -0
  244. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/converter.py +0 -0
  245. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/filters.py +0 -0
  246. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/format_detector.py +0 -0
  247. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/__init__.py +0 -0
  248. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/base.py +0 -0
  249. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/markdown_format.py +0 -0
  250. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/structured_format.py +0 -0
  251. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  252. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  253. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
  254. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  255. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  256. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/template_detector.py +0 -0
  257. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/common/__init__.py +0 -0
  258. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/common/logger_setup.py +0 -0
  259. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/common/logging_utils.py +0 -0
  260. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/common/text_utils.py +0 -0
  261. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/common/utils.py +0 -0
  262. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/comparators/__init__.py +0 -0
  263. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  264. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/contracts/__init__.py +0 -0
  265. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  266. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/contracts/module_interface.py +0 -0
  267. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  268. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  269. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/__init__.py +0 -0
  270. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/contract_generator.py +0 -0
  271. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  272. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/persona_exporter.py +0 -0
  273. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/plan_generator.py +0 -0
  274. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
  275. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/report_generator.py +0 -0
  276. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/task_generator.py +0 -0
  277. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  278. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/workflow_generator.py +0 -0
  279. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/__init__.py +0 -0
  280. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/codebase_group.py +0 -0
  281. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/govern_group.py +0 -0
  282. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/project_group.py +0 -0
  283. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/spec_group.py +0 -0
  284. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/importers/__init__.py +0 -0
  285. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
  286. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  287. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/integrations/__init__.py +0 -0
  288. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/integrations/specmatic.py +0 -0
  289. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/merge/__init__.py +0 -0
  290. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/merge/resolver.py +0 -0
  291. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/migrations/__init__.py +0 -0
  292. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  293. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/__init__.py +0 -0
  294. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/backlog_item.py +0 -0
  295. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/bridge.py +0 -0
  296. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/capabilities.py +0 -0
  297. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/change.py +0 -0
  298. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/contract.py +0 -0
  299. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/deviation.py +0 -0
  300. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/dor_config.py +0 -0
  301. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/enforcement.py +0 -0
  302. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/module_package.py +0 -0
  303. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/persona_template.py +0 -0
  304. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/plan.py +0 -0
  305. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/project.py +0 -0
  306. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/protocol.py +0 -0
  307. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/quality.py +0 -0
  308. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/sdd.py +0 -0
  309. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/source_tracking.py +0 -0
  310. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/task.py +0 -0
  311. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/validation.py +0 -0
  312. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modes/__init__.py +0 -0
  313. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modes/detector.py +0 -0
  314. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modes/router.py +0 -0
  315. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/__init__.py +0 -0
  316. {specfact_cli-0.39.0/src/specfact_cli/modules/analyze → specfact_cli-0.40.0/src/specfact_cli/modules/init}/src/__init__.py +0 -0
  317. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/src/app.py +0 -0
  318. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
  319. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_io_shim.py +0 -0
  320. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
  321. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
  322. {specfact_cli-0.39.0/src/specfact_cli/modules/auth → specfact_cli-0.40.0/src/specfact_cli/modules/upgrade}/src/__init__.py +0 -0
  323. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
  324. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
  325. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/parsers/__init__.py +0 -0
  326. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/parsers/persona_importer.py +0 -0
  327. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/__init__.py +0 -0
  328. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/alias_manager.py +0 -0
  329. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/bootstrap.py +0 -0
  330. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/bridge_registry.py +0 -0
  331. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/dependency_resolver.py +0 -0
  332. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/extension_registry.py +0 -0
  333. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/help_cache.py +0 -0
  334. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/metadata.py +0 -0
  335. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_discovery.py +0 -0
  336. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_security.py +0 -0
  337. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_state.py +0 -0
  338. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/registry.py +0 -0
  339. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  340. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  341. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  342. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/__init__.py +0 -0
  343. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
  344. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_sync.py +0 -0
  345. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_watch.py +0 -0
  346. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/change_detector.py +0 -0
  347. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
  348. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/drift_detector.py +0 -0
  349. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/repository_sync.py +0 -0
  350. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/spec_to_code.py +0 -0
  351. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  352. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/watcher.py +0 -0
  353. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  354. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/telemetry.py +0 -0
  355. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/__init__.py +0 -0
  356. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  357. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  358. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  359. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  360. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  361. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  362. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  363. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/registry.py +0 -0
  364. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/specification_templates.py +0 -0
  365. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/__init__.py +0 -0
  366. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
  367. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
  368. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/bundle_converters.py +0 -0
  369. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
  370. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
  371. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/console.py +0 -0
  372. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  373. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/context_detection.py +0 -0
  374. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
  375. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/enrichment_parser.py +0 -0
  376. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/env_manager.py +0 -0
  377. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/feature_keys.py +0 -0
  378. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/git.py +0 -0
  379. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/github_annotations.py +0 -0
  380. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/ide_setup.py +0 -0
  381. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/incremental_check.py +0 -0
  382. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/metadata.py +0 -0
  383. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/optional_deps.py +0 -0
  384. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/performance.py +0 -0
  385. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/progress.py +0 -0
  386. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  387. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/prompts.py +0 -0
  388. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  389. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/source_scanner.py +0 -0
  390. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/startup_checks.py +0 -0
  391. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/structure.py +0 -0
  392. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/structured_io.py +0 -0
  393. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/suggestions.py +0 -0
  394. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/terminal.py +0 -0
  395. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
  396. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/__init__.py +0 -0
  397. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/agile_validation.py +0 -0
  398. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  399. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  400. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/contract_validator.py +0 -0
  401. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/fsm.py +0 -0
  402. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/repro_checker.py +0 -0
  403. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/schema.py +0 -0
  404. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  405. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  406. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  407. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  408. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
  409. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  410. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  411. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  412. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  413. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  414. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  415. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  416. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  417. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
  418. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
  419. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  420. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  421. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/versioning/__init__.py +0 -0
  422. {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/versioning/analyzer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specfact-cli
3
- Version: 0.39.0
3
+ Version: 0.40.0
4
4
  Summary: The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with validation and contract enforcement for new projects and long-lived codebases.
5
5
  Project-URL: Homepage, https://github.com/nold-ai/specfact-cli
6
6
  Project-URL: Repository, https://github.com/nold-ai/specfact-cli.git
@@ -313,8 +313,12 @@ pip install -U specfact-cli
313
313
  ### Bootstrap and IDE Setup
314
314
 
315
315
  ```bash
316
- # Bootstrap module registry and local config (~/.specfact)
317
- specfact init
316
+ # First run: install workflow bundles (required)
317
+ specfact init --profile solo-developer
318
+
319
+ # Other first-run options
320
+ specfact init --install backlog,codebase
321
+ specfact init --install all
318
322
 
319
323
  # First-run bundle selection (examples)
320
324
  specfact init --profile solo-developer
@@ -338,6 +342,14 @@ specfact code validate sidecar init my-project /path/to/repo
338
342
  specfact code validate sidecar run my-project /path/to/repo
339
343
  ```
340
344
 
345
+ ### Migration Note (Flat Commands Removed)
346
+
347
+ As of `0.40.0`, flat root commands are removed. Use grouped commands:
348
+
349
+ - `specfact validate ...` -> `specfact code validate ...`
350
+ - `specfact plan ...` -> `specfact project plan ...`
351
+ - `specfact policy ...` -> `specfact backlog policy ...`
352
+
341
353
  ### Backlog Bridge (60 seconds)
342
354
 
343
355
  SpecFact's USP is closing the drift gap between **backlog -> specs -> code**.
@@ -352,7 +364,7 @@ specfact backlog daily ado --ado-org <org> --ado-project "<project>" --state any
352
364
  specfact backlog refine ado --ado-org <org> --ado-project "<project>" --id <work-item-id> --preview
353
365
 
354
366
  # 3) Keep backlog + spec intent aligned (avoid silent drift)
355
- specfact policy validate --group-by-item
367
+ specfact backlog policy validate --group-by-item
356
368
  ```
357
369
 
358
370
  For GitHub, replace adapter/org/project with:
@@ -420,8 +432,8 @@ Most tools help **either** coders **or** agile teams. SpecFact does both:
420
432
  Recommended command entrypoints:
421
433
  - `specfact backlog ceremony standup ...`
422
434
  - `specfact backlog ceremony refinement ...`
423
- - `specfact policy validate ...`
424
- - `specfact policy suggest ...`
435
+ - `specfact backlog policy validate ...`
436
+ - `specfact backlog policy suggest ...`
425
437
 
426
438
  What the Policy Engine does in practice:
427
439
  - Turns team agreements (DoR, DoD, flow checks) into executable checks against your real backlog data.
@@ -429,9 +441,9 @@ What the Policy Engine does in practice:
429
441
  - Generates patch-ready suggestions so teams can fix policy gaps quickly without guessing.
430
442
 
431
443
  Start with:
432
- - `specfact policy init --template scrum`
433
- - `specfact policy validate --group-by-item`
434
- - `specfact policy suggest --group-by-item --limit 5`
444
+ - `specfact backlog policy init --template scrum`
445
+ - `specfact backlog policy validate --group-by-item`
446
+ - `specfact backlog policy suggest --group-by-item --limit 5`
435
447
 
436
448
  **Try it now**
437
449
 
@@ -442,13 +454,12 @@ Start with:
442
454
 
443
455
  ## Modules and Capabilities
444
456
 
445
- **Core modules**
457
+ **Core runtime**
446
458
 
447
- - **Analyze**: Extract specs and plans from existing code.
448
- - **Validate**: Enforce contracts, run reproducible checks, and block regressions.
449
- - **Report**: CI/CD summaries and evidence outputs.
459
+ - **Permanent commands**: `init`, `module`, `upgrade`
460
+ - **Core responsibilities**: lifecycle, registry, trust, contracts, orchestration, shared runtime utilities
450
461
 
451
- **Agile DevOps modules**
462
+ **Marketplace-installed bundles**
452
463
 
453
464
  - **Backlog**: Refinement, dependency analysis, sprint summaries, risk rollups.
454
465
  - **Ceremony**: Standup, refinement, and planning entry points.
@@ -467,6 +478,41 @@ For technical architecture details (module lifecycle, registry internals, adapte
467
478
  - [Architecture Docs Index](docs/architecture/README.md)
468
479
  - [Architecture Implementation Status](docs/architecture/implementation-status.md)
469
480
 
481
+ ### Official Marketplace Bundles
482
+
483
+ SpecFact ships official bundle packages via the dedicated marketplace registry repository
484
+ `nold-ai/specfact-cli-modules`.
485
+ Bundle-specific docs are still temporarily hosted in this docs set while the long-term
486
+ bundle docs home is prepared in the modules repository docs site:
487
+ `https://nold-ai.github.io/specfact-cli-modules/`.
488
+
489
+ Install examples:
490
+
491
+ ```bash
492
+ specfact module install nold-ai/specfact-project
493
+ specfact module install nold-ai/specfact-backlog
494
+ specfact module install nold-ai/specfact-codebase
495
+ specfact module install nold-ai/specfact-spec
496
+ specfact module install nold-ai/specfact-govern
497
+ ```
498
+
499
+ If startup warns that bundled modules are missing or outdated, run:
500
+
501
+ ```bash
502
+ specfact module init --scope project
503
+ specfact module init
504
+ ```
505
+
506
+ Official bundles are verified as `official` tier (`nold-ai` publisher). Some bundles
507
+ auto-install dependencies:
508
+
509
+ - `nold-ai/specfact-spec` pulls `nold-ai/specfact-project`
510
+ - `nold-ai/specfact-govern` pulls `nold-ai/specfact-project`
511
+
512
+ Use this repo's docs for the current CLI/runtime release branch. Module-specific guides
513
+ will move to `specfact-cli-modules` so future bundle-only changes do not require ongoing
514
+ docs maintenance in long-lived `specfact-cli` release branches.
515
+
470
516
  ---
471
517
 
472
518
  ## Where SpecFact Fits
@@ -34,8 +34,12 @@ pip install -U specfact-cli
34
34
  ### Bootstrap and IDE Setup
35
35
 
36
36
  ```bash
37
- # Bootstrap module registry and local config (~/.specfact)
38
- specfact init
37
+ # First run: install workflow bundles (required)
38
+ specfact init --profile solo-developer
39
+
40
+ # Other first-run options
41
+ specfact init --install backlog,codebase
42
+ specfact init --install all
39
43
 
40
44
  # First-run bundle selection (examples)
41
45
  specfact init --profile solo-developer
@@ -59,6 +63,14 @@ specfact code validate sidecar init my-project /path/to/repo
59
63
  specfact code validate sidecar run my-project /path/to/repo
60
64
  ```
61
65
 
66
+ ### Migration Note (Flat Commands Removed)
67
+
68
+ As of `0.40.0`, flat root commands are removed. Use grouped commands:
69
+
70
+ - `specfact validate ...` -> `specfact code validate ...`
71
+ - `specfact plan ...` -> `specfact project plan ...`
72
+ - `specfact policy ...` -> `specfact backlog policy ...`
73
+
62
74
  ### Backlog Bridge (60 seconds)
63
75
 
64
76
  SpecFact's USP is closing the drift gap between **backlog -> specs -> code**.
@@ -73,7 +85,7 @@ specfact backlog daily ado --ado-org <org> --ado-project "<project>" --state any
73
85
  specfact backlog refine ado --ado-org <org> --ado-project "<project>" --id <work-item-id> --preview
74
86
 
75
87
  # 3) Keep backlog + spec intent aligned (avoid silent drift)
76
- specfact policy validate --group-by-item
88
+ specfact backlog policy validate --group-by-item
77
89
  ```
78
90
 
79
91
  For GitHub, replace adapter/org/project with:
@@ -141,8 +153,8 @@ Most tools help **either** coders **or** agile teams. SpecFact does both:
141
153
  Recommended command entrypoints:
142
154
  - `specfact backlog ceremony standup ...`
143
155
  - `specfact backlog ceremony refinement ...`
144
- - `specfact policy validate ...`
145
- - `specfact policy suggest ...`
156
+ - `specfact backlog policy validate ...`
157
+ - `specfact backlog policy suggest ...`
146
158
 
147
159
  What the Policy Engine does in practice:
148
160
  - Turns team agreements (DoR, DoD, flow checks) into executable checks against your real backlog data.
@@ -150,9 +162,9 @@ What the Policy Engine does in practice:
150
162
  - Generates patch-ready suggestions so teams can fix policy gaps quickly without guessing.
151
163
 
152
164
  Start with:
153
- - `specfact policy init --template scrum`
154
- - `specfact policy validate --group-by-item`
155
- - `specfact policy suggest --group-by-item --limit 5`
165
+ - `specfact backlog policy init --template scrum`
166
+ - `specfact backlog policy validate --group-by-item`
167
+ - `specfact backlog policy suggest --group-by-item --limit 5`
156
168
 
157
169
  **Try it now**
158
170
 
@@ -163,13 +175,12 @@ Start with:
163
175
 
164
176
  ## Modules and Capabilities
165
177
 
166
- **Core modules**
178
+ **Core runtime**
167
179
 
168
- - **Analyze**: Extract specs and plans from existing code.
169
- - **Validate**: Enforce contracts, run reproducible checks, and block regressions.
170
- - **Report**: CI/CD summaries and evidence outputs.
180
+ - **Permanent commands**: `init`, `module`, `upgrade`
181
+ - **Core responsibilities**: lifecycle, registry, trust, contracts, orchestration, shared runtime utilities
171
182
 
172
- **Agile DevOps modules**
183
+ **Marketplace-installed bundles**
173
184
 
174
185
  - **Backlog**: Refinement, dependency analysis, sprint summaries, risk rollups.
175
186
  - **Ceremony**: Standup, refinement, and planning entry points.
@@ -188,6 +199,41 @@ For technical architecture details (module lifecycle, registry internals, adapte
188
199
  - [Architecture Docs Index](docs/architecture/README.md)
189
200
  - [Architecture Implementation Status](docs/architecture/implementation-status.md)
190
201
 
202
+ ### Official Marketplace Bundles
203
+
204
+ SpecFact ships official bundle packages via the dedicated marketplace registry repository
205
+ `nold-ai/specfact-cli-modules`.
206
+ Bundle-specific docs are still temporarily hosted in this docs set while the long-term
207
+ bundle docs home is prepared in the modules repository docs site:
208
+ `https://nold-ai.github.io/specfact-cli-modules/`.
209
+
210
+ Install examples:
211
+
212
+ ```bash
213
+ specfact module install nold-ai/specfact-project
214
+ specfact module install nold-ai/specfact-backlog
215
+ specfact module install nold-ai/specfact-codebase
216
+ specfact module install nold-ai/specfact-spec
217
+ specfact module install nold-ai/specfact-govern
218
+ ```
219
+
220
+ If startup warns that bundled modules are missing or outdated, run:
221
+
222
+ ```bash
223
+ specfact module init --scope project
224
+ specfact module init
225
+ ```
226
+
227
+ Official bundles are verified as `official` tier (`nold-ai` publisher). Some bundles
228
+ auto-install dependencies:
229
+
230
+ - `nold-ai/specfact-spec` pulls `nold-ai/specfact-project`
231
+ - `nold-ai/specfact-govern` pulls `nold-ai/specfact-project`
232
+
233
+ Use this repo's docs for the current CLI/runtime release branch. Module-specific guides
234
+ will move to `specfact-cli-modules` so future bundle-only changes do not require ongoing
235
+ docs maintenance in long-lived `specfact-cli` release branches.
236
+
191
237
  ---
192
238
 
193
239
  ## Where SpecFact Fits
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "specfact-cli"
7
- version = "0.39.0"
7
+ version = "0.40.0"
8
8
  description = "The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with validation and contract enforcement for new projects and long-lived codebases."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -234,6 +234,13 @@ smart-test-e2e = "python tools/smart_test_coverage.py run --level e2e {args}"
234
234
  smart-test-full = "python tools/smart_test_coverage.py run --level full {args}"
235
235
  smart-test-auto = "python tools/smart_test_coverage.py run --level auto {args}"
236
236
 
237
+ # Module migration pre-deletion gate
238
+ verify-removal-gate = [
239
+ "python scripts/verify-bundle-published.py --modules project,plan,import_cmd,sync,migrate,backlog,policy_engine,analyze,drift,validate,repro,contract,spec,sdd,generate,enforce,patch_mode",
240
+ "python scripts/verify-modules-signature.py --require-signature",
241
+ ]
242
+ export-change-github = "python scripts/export-change-to-github.py {args}"
243
+
237
244
  # Contract-First Smart Test System Scripts
238
245
  contract-test = "python tools/contract_first_smart_test.py run --level auto {args}"
239
246
  contract-test-contracts = "python tools/contract_first_smart_test.py contracts"
@@ -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.39.0"
6
+ __version__ = "0.40.0"
@@ -0,0 +1,47 @@
1
+ """
2
+ SpecFact CLI - The swiss knife CLI for agile DevOps teams.
3
+
4
+ This package provides command-line tools for:
5
+ - Turning code into clear specs and plans
6
+ - Keeping backlog, specs, tests, and code in sync
7
+ - Enforcing validation and contract checks before production
8
+ - Supporting agile ceremonies and team workflows
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import os
14
+ import sys
15
+ from pathlib import Path
16
+
17
+
18
+ def _candidate_modules_repo_roots() -> list[Path]:
19
+ configured = os.environ.get("SPECFACT_MODULES_REPO", "").strip()
20
+ roots: list[Path] = []
21
+ if configured:
22
+ roots.append(Path(configured).expanduser())
23
+
24
+ this_file = Path(__file__).resolve()
25
+ for base in (this_file.parent.parent.parent, *this_file.parents):
26
+ roots.append(base / "specfact-cli-modules")
27
+ roots.append(base.parent / "specfact-cli-modules")
28
+ return roots
29
+
30
+
31
+ def _bootstrap_bundle_paths() -> None:
32
+ for root in _candidate_modules_repo_roots():
33
+ packages_root = root / "packages"
34
+ if not packages_root.exists():
35
+ continue
36
+ for src_dir in packages_root.glob("*/src"):
37
+ src = str(src_dir.resolve())
38
+ if src not in sys.path:
39
+ sys.path.insert(0, src)
40
+ break
41
+
42
+
43
+ _bootstrap_bundle_paths()
44
+
45
+ __version__ = "0.40.0"
46
+
47
+ __all__ = ["__version__"]
@@ -174,8 +174,8 @@ class AdoAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
174
174
  "[dim]Options:[/dim]\n"
175
175
  " 1. Use a Personal Access Token (PAT) with longer expiration (up to 1 year):\n"
176
176
  " - Create PAT: https://dev.azure.com/{org}/_usersSettings/tokens\n"
177
- " - Store PAT: specfact auth azure-devops --pat your_pat_token\n"
178
- " 2. Re-authenticate: specfact auth azure-devops\n"
177
+ " - Store PAT: specfact backlog auth azure-devops --pat your_pat_token\n"
178
+ " 2. Re-authenticate: specfact backlog auth azure-devops\n"
179
179
  " 3. Use --ado-token option with a valid token"
180
180
  )
181
181
  self.api_token = None
@@ -792,7 +792,7 @@ class AdoAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
792
792
  "Azure DevOps API token required. Options:\n"
793
793
  " 1. Set AZURE_DEVOPS_TOKEN environment variable\n"
794
794
  " 2. Provide via --ado-token option\n"
795
- " 3. Run `specfact auth azure-devops` for device code authentication"
795
+ " 3. Run `specfact backlog auth azure-devops` for device code authentication"
796
796
  )
797
797
  raise ValueError(msg)
798
798
 
@@ -2898,7 +2898,7 @@ class AdoAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
2898
2898
  "Options:\n"
2899
2899
  " 1. Set AZURE_DEVOPS_TOKEN environment variable\n"
2900
2900
  " 2. Use --ado-token option\n"
2901
- " 3. Store token via specfact auth azure-devops"
2901
+ " 3. Store token via specfact backlog auth azure-devops"
2902
2902
  )
2903
2903
  raise ValueError(msg)
2904
2904
 
@@ -648,7 +648,7 @@ class GitHubAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
648
648
  " 2. Provide via --github-token option\n"
649
649
  " 3. Use GitHub CLI: `gh auth login` (auto-detected if available)\n"
650
650
  " 4. Use --use-gh-cli flag to explicitly use GitHub CLI token\n"
651
- " 5. Run `specfact auth github` for device code authentication"
651
+ " 5. Run `specfact backlog auth github` for device code authentication"
652
652
  )
653
653
  raise ValueError(msg)
654
654
 
@@ -1114,7 +1114,7 @@ class GitHubAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
1114
1114
  " 1. Set GITHUB_TOKEN environment variable\n"
1115
1115
  " 2. Use --github-token option\n"
1116
1116
  " 3. Use GitHub CLI authentication (gh auth login)\n"
1117
- " 4. Store token via specfact auth github"
1117
+ " 4. Store token via specfact backlog auth github"
1118
1118
  )
1119
1119
  raise ValueError(msg)
1120
1120
 
@@ -66,6 +66,66 @@ from specfact_cli.utils.progressive_disclosure import ProgressiveDisclosureGroup
66
66
  from specfact_cli.utils.structured_io import StructuredFormat
67
67
 
68
68
 
69
+ # Names of commands that come from installable bundles; when not registered, show actionable error.
70
+ KNOWN_BUNDLE_GROUP_OR_SHIM_NAMES: frozenset[str] = frozenset(
71
+ {
72
+ "backlog",
73
+ "code",
74
+ "project",
75
+ "spec",
76
+ "govern",
77
+ "plan",
78
+ "validate",
79
+ "contract",
80
+ "sdd",
81
+ "generate",
82
+ "enforce",
83
+ "patch",
84
+ "migrate",
85
+ "repro",
86
+ "drift",
87
+ "analyze",
88
+ "policy",
89
+ "import",
90
+ "sync",
91
+ }
92
+ )
93
+
94
+
95
+ class _RootCLIGroup(ProgressiveDisclosureGroup):
96
+ """Root group that shows actionable error when an unknown command is a known bundle group/shim."""
97
+
98
+ def resolve_command(
99
+ self, ctx: click.Context, args: list[str]
100
+ ) -> tuple[str | None, click.Command | None, list[str]]:
101
+ if not args:
102
+ return super().resolve_command(ctx, args)
103
+ invoked = args[0]
104
+ try:
105
+ result = super().resolve_command(ctx, args)
106
+ except click.UsageError:
107
+ if invoked in KNOWN_BUNDLE_GROUP_OR_SHIM_NAMES:
108
+ get_configured_console().print(
109
+ f"[bold red]Command '{invoked}' is not installed.[/bold red]\n"
110
+ "Install workflow bundles with [bold]specfact init --profile <profile>[/bold] "
111
+ "or [bold]specfact module install <bundle>[/bold]."
112
+ )
113
+ raise SystemExit(1) from None
114
+ raise
115
+ _name, cmd, remaining = result
116
+ if cmd is not None or not remaining:
117
+ return result
118
+ invoked = remaining[0]
119
+ if invoked not in KNOWN_BUNDLE_GROUP_OR_SHIM_NAMES:
120
+ return result
121
+ get_configured_console().print(
122
+ f"[bold red]Command '{invoked}' is not installed.[/bold red]\n"
123
+ "Install workflow bundles with [bold]specfact init --profile <profile>[/bold] "
124
+ "or [bold]specfact module install <bundle>[/bold]."
125
+ )
126
+ raise SystemExit(1)
127
+
128
+
69
129
  # Map shell names for completion support
70
130
  SHELL_MAP = {
71
131
  "sh": "bash", # sh is bash-compatible
@@ -112,7 +172,7 @@ app = typer.Typer(
112
172
  add_completion=True, # Enable Typer's built-in completion (works natively for bash/zsh/fish without extensions)
113
173
  rich_markup_mode="rich",
114
174
  context_settings={"help_option_names": ["-h", "--help", "--help-advanced", "-ha"]}, # Add aliases for help
115
- cls=ProgressiveDisclosureGroup, # Use custom group for progressive disclosure
175
+ cls=_RootCLIGroup, # Progressive disclosure + actionable error for unknown bundle commands
116
176
  )
117
177
 
118
178
  console = get_configured_console()
@@ -269,6 +329,9 @@ def main(
269
329
  Transform your development workflow with automated quality gates,
270
330
  runtime contract validation, and state machine workflows.
271
331
 
332
+ Run **specfact init** or **specfact module install** to add workflow bundles
333
+ (backlog, code, project, spec, govern).
334
+
272
335
  **Backlog Management**: Use `specfact backlog refine` for AI-assisted template-driven
273
336
  refinement of backlog items from GitHub Issues, Azure DevOps, and other tools.
274
337
 
@@ -4,30 +4,8 @@ SpecFact CLI commands package.
4
4
  This package contains all CLI command implementations.
5
5
  """
6
6
 
7
- from specfact_cli.commands import (
8
- analyze,
9
- auth,
10
- contract_cmd,
11
- drift,
12
- enforce,
13
- generate,
14
- import_cmd,
15
- init,
16
- migrate,
17
- plan,
18
- project_cmd,
19
- repro,
20
- sdd,
21
- spec,
22
- sync,
23
- update,
24
- validate,
25
- )
26
-
27
-
28
7
  __all__ = [
29
8
  "analyze",
30
- "auth",
31
9
  "contract_cmd",
32
10
  "drift",
33
11
  "enforce",
@@ -38,7 +16,6 @@ __all__ = [
38
16
  "plan",
39
17
  "project_cmd",
40
18
  "repro",
41
- "run",
42
19
  "sdd",
43
20
  "spec",
44
21
  "sync",
@@ -0,0 +1,14 @@
1
+ """Helpers for lazy-loading compatibility shims that point to bundle packages."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from importlib import import_module
6
+ from typing import Any
7
+
8
+ from ..modules._bundle_import import bootstrap_local_bundle_sources
9
+
10
+
11
+ def load_bundle_app(anchor_file: str, target_module: str) -> Any:
12
+ """Load and return the lazily imported `app` object from a bundle command module."""
13
+ bootstrap_local_bundle_sources(anchor_file)
14
+ return import_module(target_module).app
@@ -0,0 +1,18 @@
1
+ """Backward-compatible app shim for code analyze command."""
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from ._bundle_shim import load_bundle_app
6
+
7
+
8
+ if TYPE_CHECKING:
9
+ app: Any
10
+
11
+
12
+ def __getattr__(name: str) -> Any:
13
+ if name == "app":
14
+ return load_bundle_app(__file__, "specfact_codebase.analyze.commands")
15
+ raise AttributeError(name)
16
+
17
+
18
+ __all__ = ["app"]
@@ -0,0 +1,18 @@
1
+ """Backward-compatible app shim for backlog command."""
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from ._bundle_shim import load_bundle_app
6
+
7
+
8
+ if TYPE_CHECKING:
9
+ app: Any
10
+
11
+
12
+ def __getattr__(name: str) -> Any:
13
+ if name == "app":
14
+ return load_bundle_app(__file__, "specfact_backlog.backlog.commands")
15
+ raise AttributeError(name)
16
+
17
+
18
+ __all__ = ["app"]
@@ -0,0 +1,18 @@
1
+ """Backward-compatible app shim for spec contract command."""
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from ._bundle_shim import load_bundle_app
6
+
7
+
8
+ if TYPE_CHECKING:
9
+ app: Any
10
+
11
+
12
+ def __getattr__(name: str) -> Any:
13
+ if name == "app":
14
+ return load_bundle_app(__file__, "specfact_spec.contract.commands")
15
+ raise AttributeError(name)
16
+
17
+
18
+ __all__ = ["app"]
@@ -0,0 +1,18 @@
1
+ """Backward-compatible app shim for code drift command."""
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from ._bundle_shim import load_bundle_app
6
+
7
+
8
+ if TYPE_CHECKING:
9
+ app: Any
10
+
11
+
12
+ def __getattr__(name: str) -> Any:
13
+ if name == "app":
14
+ return load_bundle_app(__file__, "specfact_codebase.drift.commands")
15
+ raise AttributeError(name)
16
+
17
+
18
+ __all__ = ["app"]
@@ -0,0 +1,18 @@
1
+ """Backward-compatible app shim for govern enforce command."""
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from ._bundle_shim import load_bundle_app
6
+
7
+
8
+ if TYPE_CHECKING:
9
+ app: Any
10
+
11
+
12
+ def __getattr__(name: str) -> Any:
13
+ if name == "app":
14
+ return load_bundle_app(__file__, "specfact_govern.enforce.commands")
15
+ raise AttributeError(name)
16
+
17
+
18
+ __all__ = ["app"]
@@ -0,0 +1,18 @@
1
+ """Backward-compatible app shim for spec generate command."""
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from ._bundle_shim import load_bundle_app
6
+
7
+
8
+ if TYPE_CHECKING:
9
+ app: Any
10
+
11
+
12
+ def __getattr__(name: str) -> Any:
13
+ if name == "app":
14
+ return load_bundle_app(__file__, "specfact_spec.generate.commands")
15
+ raise AttributeError(name)
16
+
17
+
18
+ __all__ = ["app"]
@@ -0,0 +1,18 @@
1
+ """Backward-compatible app shim for project import command."""
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from ._bundle_shim import load_bundle_app
6
+
7
+
8
+ if TYPE_CHECKING:
9
+ app: Any
10
+
11
+
12
+ def __getattr__(name: str) -> Any:
13
+ if name == "app":
14
+ return load_bundle_app(__file__, "specfact_project.import_cmd.commands")
15
+ raise AttributeError(name)
16
+
17
+
18
+ __all__ = ["app"]
@@ -0,0 +1,17 @@
1
+ """Backward-compatible app shim. Implementation moved to modules/init/."""
2
+
3
+ from importlib import import_module
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+
7
+ if TYPE_CHECKING:
8
+ app: Any
9
+
10
+
11
+ def __getattr__(name: str) -> Any:
12
+ if name == "app":
13
+ return import_module("..modules.init.src.commands", __package__).app
14
+ raise AttributeError(name)
15
+
16
+
17
+ __all__ = ["app"]