specfact-cli 0.38.2__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 (423) hide show
  1. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/.gitignore +2 -0
  2. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/PKG-INFO +68 -17
  3. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/README.md +67 -16
  4. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/pyproject.toml +8 -1
  5. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/__init__.py +1 -1
  6. specfact_cli-0.40.0/src/specfact_cli/__init__.py +47 -0
  7. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/ado.py +4 -4
  8. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/github.py +2 -2
  9. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/cli.py +91 -4
  10. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/commands/__init__.py +0 -23
  11. specfact_cli-0.40.0/src/specfact_cli/commands/_bundle_shim.py +14 -0
  12. specfact_cli-0.40.0/src/specfact_cli/commands/analyze.py +18 -0
  13. specfact_cli-0.40.0/src/specfact_cli/commands/backlog_commands.py +18 -0
  14. specfact_cli-0.40.0/src/specfact_cli/commands/contract_cmd.py +18 -0
  15. specfact_cli-0.40.0/src/specfact_cli/commands/drift.py +18 -0
  16. specfact_cli-0.40.0/src/specfact_cli/commands/enforce.py +18 -0
  17. specfact_cli-0.40.0/src/specfact_cli/commands/generate.py +18 -0
  18. specfact_cli-0.40.0/src/specfact_cli/commands/import_cmd.py +18 -0
  19. specfact_cli-0.40.0/src/specfact_cli/commands/init.py +17 -0
  20. specfact_cli-0.40.0/src/specfact_cli/commands/migrate.py +18 -0
  21. specfact_cli-0.40.0/src/specfact_cli/commands/plan.py +18 -0
  22. specfact_cli-0.40.0/src/specfact_cli/commands/project_cmd.py +18 -0
  23. specfact_cli-0.40.0/src/specfact_cli/commands/repro.py +18 -0
  24. specfact_cli-0.40.0/src/specfact_cli/commands/sdd.py +18 -0
  25. specfact_cli-0.40.0/src/specfact_cli/commands/spec.py +18 -0
  26. specfact_cli-0.40.0/src/specfact_cli/commands/sync.py +18 -0
  27. specfact_cli-0.40.0/src/specfact_cli/commands/update.py +17 -0
  28. specfact_cli-0.40.0/src/specfact_cli/commands/validate.py +18 -0
  29. specfact_cli-0.40.0/src/specfact_cli/common/bundle_factory.py +42 -0
  30. specfact_cli-0.40.0/src/specfact_cli/groups/__init__.py +18 -0
  31. specfact_cli-0.40.0/src/specfact_cli/groups/backlog_group.py +63 -0
  32. specfact_cli-0.40.0/src/specfact_cli/groups/codebase_group.py +40 -0
  33. specfact_cli-0.40.0/src/specfact_cli/groups/govern_group.py +43 -0
  34. specfact_cli-0.40.0/src/specfact_cli/groups/project_group.py +47 -0
  35. specfact_cli-0.40.0/src/specfact_cli/groups/spec_group.py +45 -0
  36. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/module_package.py +13 -0
  37. specfact_cli-0.40.0/src/specfact_cli/modules/_bundle_import.py +36 -0
  38. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/module-package.yaml +7 -5
  39. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/src/commands.py +156 -0
  40. specfact_cli-0.40.0/src/specfact_cli/modules/init/src/first_run_selection.py +196 -0
  41. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/module-package.yaml +7 -5
  42. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/commands.py +65 -2
  43. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/module-package.yaml +7 -5
  44. specfact_cli-0.40.0/src/specfact_cli/registry/bootstrap.py +51 -0
  45. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/crypto_validator.py +62 -0
  46. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/custom_registries.py +23 -14
  47. specfact_cli-0.40.0/src/specfact_cli/registry/marketplace_client.py +296 -0
  48. specfact_cli-0.40.0/src/specfact_cli/registry/module_grouping.py +74 -0
  49. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_installer.py +270 -20
  50. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_lifecycle.py +7 -2
  51. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_packages.py +287 -49
  52. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/registry.py +49 -0
  53. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/runtime.py +4 -4
  54. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/persona_ownership.py +8 -6
  55. specfact_cli-0.38.2/src/specfact_cli/__init__.py +0 -13
  56. specfact_cli-0.38.2/src/specfact_cli/commands/analyze.py +0 -6
  57. specfact_cli-0.38.2/src/specfact_cli/commands/auth.py +0 -6
  58. specfact_cli-0.38.2/src/specfact_cli/commands/backlog_commands.py +0 -6
  59. specfact_cli-0.38.2/src/specfact_cli/commands/contract_cmd.py +0 -6
  60. specfact_cli-0.38.2/src/specfact_cli/commands/drift.py +0 -6
  61. specfact_cli-0.38.2/src/specfact_cli/commands/enforce.py +0 -6
  62. specfact_cli-0.38.2/src/specfact_cli/commands/generate.py +0 -6
  63. specfact_cli-0.38.2/src/specfact_cli/commands/import_cmd.py +0 -6
  64. specfact_cli-0.38.2/src/specfact_cli/commands/init.py +0 -6
  65. specfact_cli-0.38.2/src/specfact_cli/commands/migrate.py +0 -6
  66. specfact_cli-0.38.2/src/specfact_cli/commands/plan.py +0 -6
  67. specfact_cli-0.38.2/src/specfact_cli/commands/project_cmd.py +0 -6
  68. specfact_cli-0.38.2/src/specfact_cli/commands/repro.py +0 -6
  69. specfact_cli-0.38.2/src/specfact_cli/commands/sdd.py +0 -6
  70. specfact_cli-0.38.2/src/specfact_cli/commands/spec.py +0 -6
  71. specfact_cli-0.38.2/src/specfact_cli/commands/sync.py +0 -6
  72. specfact_cli-0.38.2/src/specfact_cli/commands/update.py +0 -6
  73. specfact_cli-0.38.2/src/specfact_cli/commands/validate.py +0 -6
  74. specfact_cli-0.38.2/src/specfact_cli/modules/analyze/module-package.yaml +0 -19
  75. specfact_cli-0.38.2/src/specfact_cli/modules/analyze/src/app.py +0 -6
  76. specfact_cli-0.38.2/src/specfact_cli/modules/analyze/src/commands.py +0 -368
  77. specfact_cli-0.38.2/src/specfact_cli/modules/auth/module-package.yaml +0 -19
  78. specfact_cli-0.38.2/src/specfact_cli/modules/auth/src/app.py +0 -6
  79. specfact_cli-0.38.2/src/specfact_cli/modules/auth/src/commands.py +0 -726
  80. specfact_cli-0.38.2/src/specfact_cli/modules/backlog/module-package.yaml +0 -32
  81. specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/__init__.py +0 -1
  82. specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/__init__.py +0 -9
  83. specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/ado.py +0 -20
  84. specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/base.py +0 -93
  85. specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/github.py +0 -20
  86. specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/jira.py +0 -20
  87. specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/linear.py +0 -20
  88. specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/app.py +0 -6
  89. specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/commands.py +0 -5546
  90. specfact_cli-0.38.2/src/specfact_cli/modules/contract/module-package.yaml +0 -19
  91. specfact_cli-0.38.2/src/specfact_cli/modules/contract/src/__init__.py +0 -1
  92. specfact_cli-0.38.2/src/specfact_cli/modules/contract/src/app.py +0 -6
  93. specfact_cli-0.38.2/src/specfact_cli/modules/contract/src/commands.py +0 -1251
  94. specfact_cli-0.38.2/src/specfact_cli/modules/drift/module-package.yaml +0 -19
  95. specfact_cli-0.38.2/src/specfact_cli/modules/drift/src/__init__.py +0 -1
  96. specfact_cli-0.38.2/src/specfact_cli/modules/drift/src/app.py +0 -6
  97. specfact_cli-0.38.2/src/specfact_cli/modules/drift/src/commands.py +0 -253
  98. specfact_cli-0.38.2/src/specfact_cli/modules/enforce/module-package.yaml +0 -20
  99. specfact_cli-0.38.2/src/specfact_cli/modules/enforce/src/__init__.py +0 -1
  100. specfact_cli-0.38.2/src/specfact_cli/modules/enforce/src/app.py +0 -6
  101. specfact_cli-0.38.2/src/specfact_cli/modules/enforce/src/commands.py +0 -677
  102. specfact_cli-0.38.2/src/specfact_cli/modules/generate/module-package.yaml +0 -20
  103. specfact_cli-0.38.2/src/specfact_cli/modules/generate/src/__init__.py +0 -1
  104. specfact_cli-0.38.2/src/specfact_cli/modules/generate/src/app.py +0 -6
  105. specfact_cli-0.38.2/src/specfact_cli/modules/generate/src/commands.py +0 -2188
  106. specfact_cli-0.38.2/src/specfact_cli/modules/import_cmd/module-package.yaml +0 -19
  107. specfact_cli-0.38.2/src/specfact_cli/modules/import_cmd/src/__init__.py +0 -1
  108. specfact_cli-0.38.2/src/specfact_cli/modules/import_cmd/src/app.py +0 -6
  109. specfact_cli-0.38.2/src/specfact_cli/modules/import_cmd/src/commands.py +0 -2924
  110. specfact_cli-0.38.2/src/specfact_cli/modules/init/src/__init__.py +0 -1
  111. specfact_cli-0.38.2/src/specfact_cli/modules/migrate/module-package.yaml +0 -19
  112. specfact_cli-0.38.2/src/specfact_cli/modules/migrate/src/__init__.py +0 -1
  113. specfact_cli-0.38.2/src/specfact_cli/modules/migrate/src/app.py +0 -6
  114. specfact_cli-0.38.2/src/specfact_cli/modules/migrate/src/commands.py +0 -935
  115. specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/module-package.yaml +0 -20
  116. specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/app.py +0 -6
  117. specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/commands.py +0 -58
  118. specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/__init__.py +0 -6
  119. specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/__init__.py +0 -1
  120. specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/apply.py +0 -80
  121. specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/__init__.py +0 -8
  122. specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/applier.py +0 -62
  123. specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/generator.py +0 -33
  124. specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/idempotency.py +0 -42
  125. specfact_cli-0.38.2/src/specfact_cli/modules/plan/module-package.yaml +0 -20
  126. specfact_cli-0.38.2/src/specfact_cli/modules/plan/src/__init__.py +0 -1
  127. specfact_cli-0.38.2/src/specfact_cli/modules/plan/src/app.py +0 -6
  128. specfact_cli-0.38.2/src/specfact_cli/modules/plan/src/commands.py +0 -5574
  129. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/module-package.yaml +0 -26
  130. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/app.py +0 -6
  131. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/commands.py +0 -22
  132. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/__init__.py +0 -6
  133. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/config/__init__.py +0 -13
  134. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/config/policy_config.py +0 -71
  135. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/config/templates.py +0 -56
  136. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/__init__.py +0 -7
  137. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/suggester.py +0 -35
  138. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/validator.py +0 -257
  139. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/main.py +0 -329
  140. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/models/__init__.py +0 -6
  141. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/models/policy_result.py +0 -35
  142. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/__init__.py +0 -8
  143. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/kanban.py +0 -65
  144. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/safe.py +0 -47
  145. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/scrum.py +0 -58
  146. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/__init__.py +0 -6
  147. specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/policy_registry.py +0 -37
  148. specfact_cli-0.38.2/src/specfact_cli/modules/project/module-package.yaml +0 -19
  149. specfact_cli-0.38.2/src/specfact_cli/modules/project/src/__init__.py +0 -1
  150. specfact_cli-0.38.2/src/specfact_cli/modules/project/src/app.py +0 -6
  151. specfact_cli-0.38.2/src/specfact_cli/modules/project/src/commands.py +0 -2498
  152. specfact_cli-0.38.2/src/specfact_cli/modules/repro/module-package.yaml +0 -19
  153. specfact_cli-0.38.2/src/specfact_cli/modules/repro/src/__init__.py +0 -1
  154. specfact_cli-0.38.2/src/specfact_cli/modules/repro/src/app.py +0 -6
  155. specfact_cli-0.38.2/src/specfact_cli/modules/repro/src/commands.py +0 -579
  156. specfact_cli-0.38.2/src/specfact_cli/modules/sdd/module-package.yaml +0 -19
  157. specfact_cli-0.38.2/src/specfact_cli/modules/sdd/src/__init__.py +0 -1
  158. specfact_cli-0.38.2/src/specfact_cli/modules/sdd/src/app.py +0 -6
  159. specfact_cli-0.38.2/src/specfact_cli/modules/sdd/src/commands.py +0 -415
  160. specfact_cli-0.38.2/src/specfact_cli/modules/spec/module-package.yaml +0 -19
  161. specfact_cli-0.38.2/src/specfact_cli/modules/spec/src/__init__.py +0 -1
  162. specfact_cli-0.38.2/src/specfact_cli/modules/spec/src/app.py +0 -6
  163. specfact_cli-0.38.2/src/specfact_cli/modules/spec/src/commands.py +0 -902
  164. specfact_cli-0.38.2/src/specfact_cli/modules/sync/module-package.yaml +0 -22
  165. specfact_cli-0.38.2/src/specfact_cli/modules/sync/src/__init__.py +0 -1
  166. specfact_cli-0.38.2/src/specfact_cli/modules/sync/src/app.py +0 -6
  167. specfact_cli-0.38.2/src/specfact_cli/modules/sync/src/commands.py +0 -2504
  168. specfact_cli-0.38.2/src/specfact_cli/modules/upgrade/src/__init__.py +0 -1
  169. specfact_cli-0.38.2/src/specfact_cli/modules/validate/module-package.yaml +0 -19
  170. specfact_cli-0.38.2/src/specfact_cli/modules/validate/src/__init__.py +0 -1
  171. specfact_cli-0.38.2/src/specfact_cli/modules/validate/src/app.py +0 -6
  172. specfact_cli-0.38.2/src/specfact_cli/modules/validate/src/commands.py +0 -321
  173. specfact_cli-0.38.2/src/specfact_cli/registry/bootstrap.py +0 -16
  174. specfact_cli-0.38.2/src/specfact_cli/registry/marketplace_client.py +0 -136
  175. specfact_cli-0.38.2/src/specfact_cli/templates/bridge_templates.py +0 -243
  176. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/LICENSE +0 -0
  177. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/keys/README.md +0 -0
  178. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/keys/module-signing-public.pem +0 -0
  179. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/mappings/node-async.yaml +0 -0
  180. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/mappings/python-async.yaml +0 -0
  181. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/mappings/speckit-default.yaml +0 -0
  182. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/shared/cli-enforcement.md +0 -0
  183. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.01-import.md +0 -0
  184. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.02-plan.md +0 -0
  185. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.03-review.md +0 -0
  186. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.04-sdd.md +0 -0
  187. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.05-enforce.md +0 -0
  188. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.06-sync.md +0 -0
  189. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.07-contracts.md +0 -0
  190. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-add.md +0 -0
  191. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-daily.md +0 -0
  192. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-refine.md +0 -0
  193. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.compare.md +0 -0
  194. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.sync-backlog.md +0 -0
  195. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.validate.md +0 -0
  196. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/schemas/deviation.schema.json +0 -0
  197. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/schemas/plan.schema.json +0 -0
  198. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/schemas/protocol.schema.json +0 -0
  199. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/defect_v1.yaml +0 -0
  200. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/enabler_v1.yaml +0 -0
  201. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/spike_v1.yaml +0 -0
  202. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/user_story_v1.yaml +0 -0
  203. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_agile.yaml +0 -0
  204. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_default.yaml +0 -0
  205. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_kanban.yaml +0 -0
  206. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_safe.yaml +0 -0
  207. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_scrum.yaml +0 -0
  208. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/frameworks/safe/safe_feature_v1.yaml +0 -0
  209. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/frameworks/scrum/user_story_v1.yaml +0 -0
  210. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/personas/developer/developer_task_v1.yaml +0 -0
  211. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/personas/product-owner/user_story_v1.yaml +0 -0
  212. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/providers/ado/work_item_v1.yaml +0 -0
  213. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/github-action.yml.j2 +0 -0
  214. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/persona/architect.md.j2 +0 -0
  215. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/persona/developer.md.j2 +0 -0
  216. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/persona/product-owner.md.j2 +0 -0
  217. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
  218. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/policies/kanban.yaml +0 -0
  219. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/policies/mixed.yaml +0 -0
  220. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/policies/safe.yaml +0 -0
  221. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/policies/scrum.yaml +0 -0
  222. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/pr-template.md.j2 +0 -0
  223. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/protocol.yaml.j2 +0 -0
  224. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/telemetry.yaml.example +0 -0
  225. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/__main__.py +0 -0
  226. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/__init__.py +0 -0
  227. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
  228. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/base.py +0 -0
  229. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/openspec.py +0 -0
  230. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  231. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/registry.py +0 -0
  232. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/speckit.py +0 -0
  233. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/__init__.py +0 -0
  234. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/analyze_agent.py +0 -0
  235. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/base.py +0 -0
  236. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/plan_agent.py +0 -0
  237. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/registry.py +0 -0
  238. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/sync_agent.py +0 -0
  239. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/__init__.py +0 -0
  240. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  241. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  242. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  243. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  244. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  245. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  246. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  247. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  248. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  249. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/__init__.py +0 -0
  250. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  251. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
  252. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/local_yaml_adapter.py +0 -0
  253. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/ai_refiner.py +0 -0
  254. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/converter.py +0 -0
  255. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/filters.py +0 -0
  256. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/format_detector.py +0 -0
  257. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/__init__.py +0 -0
  258. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/base.py +0 -0
  259. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/markdown_format.py +0 -0
  260. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/structured_format.py +0 -0
  261. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  262. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  263. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
  264. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  265. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  266. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/template_detector.py +0 -0
  267. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/common/__init__.py +0 -0
  268. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/common/logger_setup.py +0 -0
  269. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/common/logging_utils.py +0 -0
  270. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/common/text_utils.py +0 -0
  271. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/common/utils.py +0 -0
  272. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/comparators/__init__.py +0 -0
  273. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  274. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/contracts/__init__.py +0 -0
  275. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  276. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/contracts/module_interface.py +0 -0
  277. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  278. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  279. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/__init__.py +0 -0
  280. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/contract_generator.py +0 -0
  281. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  282. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/persona_exporter.py +0 -0
  283. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/plan_generator.py +0 -0
  284. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
  285. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/report_generator.py +0 -0
  286. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/task_generator.py +0 -0
  287. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  288. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/workflow_generator.py +0 -0
  289. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/importers/__init__.py +0 -0
  290. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
  291. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  292. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/integrations/__init__.py +0 -0
  293. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/integrations/specmatic.py +0 -0
  294. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/merge/__init__.py +0 -0
  295. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/merge/resolver.py +0 -0
  296. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/migrations/__init__.py +0 -0
  297. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  298. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/__init__.py +0 -0
  299. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/backlog_item.py +0 -0
  300. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/bridge.py +0 -0
  301. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/capabilities.py +0 -0
  302. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/change.py +0 -0
  303. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/contract.py +0 -0
  304. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/deviation.py +0 -0
  305. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/dor_config.py +0 -0
  306. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/enforcement.py +0 -0
  307. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/persona_template.py +0 -0
  308. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/plan.py +0 -0
  309. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/project.py +0 -0
  310. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/protocol.py +0 -0
  311. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/quality.py +0 -0
  312. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/sdd.py +0 -0
  313. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/source_tracking.py +0 -0
  314. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/task.py +0 -0
  315. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/validation.py +0 -0
  316. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modes/__init__.py +0 -0
  317. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modes/detector.py +0 -0
  318. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modes/router.py +0 -0
  319. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/__init__.py +0 -0
  320. {specfact_cli-0.38.2/src/specfact_cli/modules/analyze → specfact_cli-0.40.0/src/specfact_cli/modules/init}/src/__init__.py +0 -0
  321. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/src/app.py +0 -0
  322. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_io_shim.py +0 -0
  323. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
  324. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
  325. {specfact_cli-0.38.2/src/specfact_cli/modules/auth → specfact_cli-0.40.0/src/specfact_cli/modules/upgrade}/src/__init__.py +0 -0
  326. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
  327. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
  328. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/parsers/__init__.py +0 -0
  329. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/parsers/persona_importer.py +0 -0
  330. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/__init__.py +0 -0
  331. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/alias_manager.py +0 -0
  332. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/bridge_registry.py +0 -0
  333. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/dependency_resolver.py +0 -0
  334. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/extension_registry.py +0 -0
  335. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/help_cache.py +0 -0
  336. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/metadata.py +0 -0
  337. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_discovery.py +0 -0
  338. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_security.py +0 -0
  339. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_state.py +0 -0
  340. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  341. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  342. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  343. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/__init__.py +0 -0
  344. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
  345. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_sync.py +0 -0
  346. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_watch.py +0 -0
  347. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/change_detector.py +0 -0
  348. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
  349. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/drift_detector.py +0 -0
  350. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/repository_sync.py +0 -0
  351. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/spec_to_code.py +0 -0
  352. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  353. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/watcher.py +0 -0
  354. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  355. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/telemetry.py +0 -0
  356. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/__init__.py +0 -0
  357. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  358. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  359. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  360. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  361. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  362. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  363. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  364. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/registry.py +0 -0
  365. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/specification_templates.py +0 -0
  366. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/__init__.py +0 -0
  367. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
  368. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
  369. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/bundle_converters.py +0 -0
  370. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
  371. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
  372. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/console.py +0 -0
  373. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  374. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/context_detection.py +0 -0
  375. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
  376. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/enrichment_parser.py +0 -0
  377. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/env_manager.py +0 -0
  378. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/feature_keys.py +0 -0
  379. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/git.py +0 -0
  380. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/github_annotations.py +0 -0
  381. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/ide_setup.py +0 -0
  382. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/incremental_check.py +0 -0
  383. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/metadata.py +0 -0
  384. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/optional_deps.py +0 -0
  385. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/performance.py +0 -0
  386. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/progress.py +0 -0
  387. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  388. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/prompts.py +0 -0
  389. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  390. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/source_scanner.py +0 -0
  391. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/startup_checks.py +0 -0
  392. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/structure.py +0 -0
  393. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/structured_io.py +0 -0
  394. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/suggestions.py +0 -0
  395. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/terminal.py +0 -0
  396. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
  397. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/__init__.py +0 -0
  398. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/agile_validation.py +0 -0
  399. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  400. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  401. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/contract_validator.py +0 -0
  402. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/fsm.py +0 -0
  403. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/repro_checker.py +0 -0
  404. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/schema.py +0 -0
  405. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  406. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  407. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  408. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  409. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
  410. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  411. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  412. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  413. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  414. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  415. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  416. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  417. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  418. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
  419. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
  420. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  421. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  422. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/versioning/__init__.py +0 -0
  423. {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/versioning/analyzer.py +0 -0
@@ -106,6 +106,8 @@ docs/internal/
106
106
 
107
107
  .github/prompts/specfact.*.md
108
108
  .github/prompts/opsx-*.md
109
+ .github/skills/openspec-*/
110
+ !.github/skills/openspec-workflows/
109
111
 
110
112
  .claude/commands/opsx/
111
113
  .claude/commands/specfact.*.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specfact-cli
3
- Version: 0.38.2
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,17 @@ 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
322
+
323
+ # First-run bundle selection (examples)
324
+ specfact init --profile solo-developer
325
+ specfact init --install backlog,codebase
326
+ specfact init --install all
318
327
 
319
328
  # Configure IDE prompts/templates (interactive selector by default)
320
329
  specfact init ide
@@ -326,13 +335,21 @@ specfact init ide --ide vscode
326
335
 
327
336
  ```bash
328
337
  # Analyze an existing codebase
329
- specfact import from-code my-project --repo .
338
+ specfact project import from-code my-project --repo .
330
339
 
331
340
  # Validate external code without modifying source
332
- specfact validate sidecar init my-project /path/to/repo
333
- specfact validate sidecar run my-project /path/to/repo
341
+ specfact code validate sidecar init my-project /path/to/repo
342
+ specfact code validate sidecar run my-project /path/to/repo
334
343
  ```
335
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
+
336
353
  ### Backlog Bridge (60 seconds)
337
354
 
338
355
  SpecFact's USP is closing the drift gap between **backlog -> specs -> code**.
@@ -347,7 +364,7 @@ specfact backlog daily ado --ado-org <org> --ado-project "<project>" --state any
347
364
  specfact backlog refine ado --ado-org <org> --ado-project "<project>" --id <work-item-id> --preview
348
365
 
349
366
  # 3) Keep backlog + spec intent aligned (avoid silent drift)
350
- specfact policy validate --group-by-item
367
+ specfact backlog policy validate --group-by-item
351
368
  ```
352
369
 
353
370
  For GitHub, replace adapter/org/project with:
@@ -415,8 +432,8 @@ Most tools help **either** coders **or** agile teams. SpecFact does both:
415
432
  Recommended command entrypoints:
416
433
  - `specfact backlog ceremony standup ...`
417
434
  - `specfact backlog ceremony refinement ...`
418
- - `specfact policy validate ...`
419
- - `specfact policy suggest ...`
435
+ - `specfact backlog policy validate ...`
436
+ - `specfact backlog policy suggest ...`
420
437
 
421
438
  What the Policy Engine does in practice:
422
439
  - Turns team agreements (DoR, DoD, flow checks) into executable checks against your real backlog data.
@@ -424,9 +441,9 @@ What the Policy Engine does in practice:
424
441
  - Generates patch-ready suggestions so teams can fix policy gaps quickly without guessing.
425
442
 
426
443
  Start with:
427
- - `specfact policy init --template scrum`
428
- - `specfact policy validate --group-by-item`
429
- - `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`
430
447
 
431
448
  **Try it now**
432
449
 
@@ -437,13 +454,12 @@ Start with:
437
454
 
438
455
  ## Modules and Capabilities
439
456
 
440
- **Core modules**
457
+ **Core runtime**
441
458
 
442
- - **Analyze**: Extract specs and plans from existing code.
443
- - **Validate**: Enforce contracts, run reproducible checks, and block regressions.
444
- - **Report**: CI/CD summaries and evidence outputs.
459
+ - **Permanent commands**: `init`, `module`, `upgrade`
460
+ - **Core responsibilities**: lifecycle, registry, trust, contracts, orchestration, shared runtime utilities
445
461
 
446
- **Agile DevOps modules**
462
+ **Marketplace-installed bundles**
447
463
 
448
464
  - **Backlog**: Refinement, dependency analysis, sprint summaries, risk rollups.
449
465
  - **Ceremony**: Standup, refinement, and planning entry points.
@@ -462,6 +478,41 @@ For technical architecture details (module lifecycle, registry internals, adapte
462
478
  - [Architecture Docs Index](docs/architecture/README.md)
463
479
  - [Architecture Implementation Status](docs/architecture/implementation-status.md)
464
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
+
465
516
  ---
466
517
 
467
518
  ## Where SpecFact Fits
@@ -34,8 +34,17 @@ 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
43
+
44
+ # First-run bundle selection (examples)
45
+ specfact init --profile solo-developer
46
+ specfact init --install backlog,codebase
47
+ specfact init --install all
39
48
 
40
49
  # Configure IDE prompts/templates (interactive selector by default)
41
50
  specfact init ide
@@ -47,13 +56,21 @@ specfact init ide --ide vscode
47
56
 
48
57
  ```bash
49
58
  # Analyze an existing codebase
50
- specfact import from-code my-project --repo .
59
+ specfact project import from-code my-project --repo .
51
60
 
52
61
  # Validate external code without modifying source
53
- specfact validate sidecar init my-project /path/to/repo
54
- specfact validate sidecar run my-project /path/to/repo
62
+ specfact code validate sidecar init my-project /path/to/repo
63
+ specfact code validate sidecar run my-project /path/to/repo
55
64
  ```
56
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
+
57
74
  ### Backlog Bridge (60 seconds)
58
75
 
59
76
  SpecFact's USP is closing the drift gap between **backlog -> specs -> code**.
@@ -68,7 +85,7 @@ specfact backlog daily ado --ado-org <org> --ado-project "<project>" --state any
68
85
  specfact backlog refine ado --ado-org <org> --ado-project "<project>" --id <work-item-id> --preview
69
86
 
70
87
  # 3) Keep backlog + spec intent aligned (avoid silent drift)
71
- specfact policy validate --group-by-item
88
+ specfact backlog policy validate --group-by-item
72
89
  ```
73
90
 
74
91
  For GitHub, replace adapter/org/project with:
@@ -136,8 +153,8 @@ Most tools help **either** coders **or** agile teams. SpecFact does both:
136
153
  Recommended command entrypoints:
137
154
  - `specfact backlog ceremony standup ...`
138
155
  - `specfact backlog ceremony refinement ...`
139
- - `specfact policy validate ...`
140
- - `specfact policy suggest ...`
156
+ - `specfact backlog policy validate ...`
157
+ - `specfact backlog policy suggest ...`
141
158
 
142
159
  What the Policy Engine does in practice:
143
160
  - Turns team agreements (DoR, DoD, flow checks) into executable checks against your real backlog data.
@@ -145,9 +162,9 @@ What the Policy Engine does in practice:
145
162
  - Generates patch-ready suggestions so teams can fix policy gaps quickly without guessing.
146
163
 
147
164
  Start with:
148
- - `specfact policy init --template scrum`
149
- - `specfact policy validate --group-by-item`
150
- - `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`
151
168
 
152
169
  **Try it now**
153
170
 
@@ -158,13 +175,12 @@ Start with:
158
175
 
159
176
  ## Modules and Capabilities
160
177
 
161
- **Core modules**
178
+ **Core runtime**
162
179
 
163
- - **Analyze**: Extract specs and plans from existing code.
164
- - **Validate**: Enforce contracts, run reproducible checks, and block regressions.
165
- - **Report**: CI/CD summaries and evidence outputs.
180
+ - **Permanent commands**: `init`, `module`, `upgrade`
181
+ - **Core responsibilities**: lifecycle, registry, trust, contracts, orchestration, shared runtime utilities
166
182
 
167
- **Agile DevOps modules**
183
+ **Marketplace-installed bundles**
168
184
 
169
185
  - **Backlog**: Refinement, dependency analysis, sprint summaries, risk rollups.
170
186
  - **Ceremony**: Standup, refinement, and planning entry points.
@@ -183,6 +199,41 @@ For technical architecture details (module lifecycle, registry internals, adapte
183
199
  - [Architecture Docs Index](docs/architecture/README.md)
184
200
  - [Architecture Implementation Status](docs/architecture/implementation-status.md)
185
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
+
186
237
  ---
187
238
 
188
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.38.2"
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.38.2"
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
 
@@ -451,13 +514,26 @@ def _make_lazy_typer(cmd_name: str, help_str: str) -> typer.Typer:
451
514
 
452
515
 
453
516
  def _get_command(typer_instance: typer.Typer) -> click.Command:
454
- """Wrapper around typer.main.get_command that returns LazyDelegateGroup for our lazy typers."""
517
+ """Wrapper around typer.main.get_command that returns LazyDelegateGroup for our lazy typers,
518
+ and applies flatten-same-name for Typers with _specfact_flatten_same_name.
519
+ """
455
520
  if getattr(typer_instance, "_specfact_lazy_delegate", False):
456
521
  cmd_name = getattr(typer_instance, "_specfact_lazy_cmd_name", "")
457
522
  help_str = getattr(typer_instance, "_specfact_lazy_help_str", "")
458
523
  return _build_lazy_delegate_group(cmd_name, help_str)
459
524
  assert _typer_get_command_original is not None
460
- return _typer_get_command_original(typer_instance)
525
+ result = _typer_get_command_original(typer_instance)
526
+ flatten_name = getattr(typer_instance, "_specfact_flatten_same_name", None)
527
+ if isinstance(flatten_name, str) and isinstance(result, click.Group) and flatten_name in result.commands:
528
+ redundant = result.commands.pop(flatten_name)
529
+ if isinstance(redundant, click.Group):
530
+ for cmd_name, cmd in redundant.commands.items():
531
+ result.add_command(cmd, name=cmd_name)
532
+ if result.commands:
533
+ for cname in sorted(result.commands.keys()):
534
+ cmd = result.commands.pop(cname)
535
+ result.add_command(cmd, name=cname)
536
+ return result
461
537
 
462
538
 
463
539
  def _get_group_from_info_wrapper(
@@ -476,12 +552,23 @@ def _get_group_from_info_wrapper(
476
552
  help_str = getattr(typer_instance, "_specfact_lazy_help_str", "")
477
553
  return _build_lazy_delegate_group(cmd_name, help_str)
478
554
  assert _typer_get_group_from_info_original is not None
479
- return _typer_get_group_from_info_original(
555
+ result = _typer_get_group_from_info_original(
480
556
  group_info,
481
557
  pretty_exceptions_short=pretty_exceptions_short,
482
558
  suggest_commands=suggest_commands,
483
559
  rich_markup_mode=rich_markup_mode,
484
560
  )
561
+ flatten_name = getattr(typer_instance, "_specfact_flatten_same_name", None) if typer_instance else None
562
+ if isinstance(flatten_name, str) and flatten_name in result.commands:
563
+ redundant = result.commands.pop(flatten_name)
564
+ if isinstance(redundant, click.Group):
565
+ for cmd_name, cmd in redundant.commands.items():
566
+ result.add_command(cmd, name=cmd_name)
567
+ if result.commands:
568
+ for name in sorted(result.commands.keys()):
569
+ cmd = result.commands.pop(name)
570
+ result.add_command(cmd, name=name)
571
+ return result
485
572
 
486
573
 
487
574
  # Original Typer build functions (set once by _patch_typer_build so re-import of cli doesn't overwrite with our wrapper).
@@ -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"]