specfact-cli 0.40.3__tar.gz → 0.41.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 (277) hide show
  1. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/PKG-INFO +2 -2
  2. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/README.md +1 -1
  3. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/pyproject.toml +1 -1
  4. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/prompts/shared/cli-enforcement.md +1 -1
  5. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/prompts/specfact.03-review.md +1 -1
  6. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/__init__.py +1 -1
  7. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/__init__.py +1 -1
  8. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/adapters/ado.py +3 -3
  9. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/agents/analyze_agent.py +3 -3
  10. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/import_cmd.py +2 -2
  11. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/groups/codebase_group.py +3 -3
  12. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/groups/project_group.py +1 -2
  13. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/structure.py +1 -1
  14. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/suggestions.py +5 -5
  15. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validation/command_audit.py +30 -1
  16. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/.gitignore +0 -0
  17. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/LICENSE +0 -0
  18. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/keys/README.md +0 -0
  19. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/keys/module-signing-public.pem +0 -0
  20. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/mappings/node-async.yaml +0 -0
  21. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/mappings/python-async.yaml +0 -0
  22. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/mappings/speckit-default.yaml +0 -0
  23. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/prompts/specfact.01-import.md +0 -0
  24. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/prompts/specfact.02-plan.md +0 -0
  25. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/prompts/specfact.04-sdd.md +0 -0
  26. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/prompts/specfact.05-enforce.md +0 -0
  27. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/prompts/specfact.06-sync.md +0 -0
  28. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/prompts/specfact.07-contracts.md +0 -0
  29. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/prompts/specfact.compare.md +0 -0
  30. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/prompts/specfact.validate.md +0 -0
  31. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/schemas/deviation.schema.json +0 -0
  32. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/schemas/plan.schema.json +0 -0
  33. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/schemas/protocol.schema.json +0 -0
  34. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/github-action.yml.j2 +0 -0
  35. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/persona/architect.md.j2 +0 -0
  36. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/persona/developer.md.j2 +0 -0
  37. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/persona/product-owner.md.j2 +0 -0
  38. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
  39. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/policies/kanban.yaml +0 -0
  40. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/policies/mixed.yaml +0 -0
  41. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/policies/safe.yaml +0 -0
  42. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/policies/scrum.yaml +0 -0
  43. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/pr-template.md.j2 +0 -0
  44. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/protocol.yaml.j2 +0 -0
  45. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/resources/templates/telemetry.yaml.example +0 -0
  46. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/__main__.py +0 -0
  47. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/adapters/__init__.py +0 -0
  48. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
  49. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/adapters/base.py +0 -0
  50. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/adapters/github.py +0 -0
  51. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/adapters/openspec.py +0 -0
  52. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/adapters/openspec_parser.py +0 -0
  53. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/adapters/registry.py +0 -0
  54. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/adapters/speckit.py +0 -0
  55. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/agents/__init__.py +0 -0
  56. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/agents/base.py +0 -0
  57. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/agents/plan_agent.py +0 -0
  58. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/agents/registry.py +0 -0
  59. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/agents/sync_agent.py +0 -0
  60. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/__init__.py +0 -0
  61. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  62. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  63. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  64. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  65. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  66. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  67. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  68. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  69. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  70. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/backlog/__init__.py +0 -0
  71. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
  72. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
  73. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/backlog/converter.py +0 -0
  74. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/backlog/filters.py +0 -0
  75. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
  76. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
  77. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
  78. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
  79. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
  80. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/cli.py +0 -0
  81. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/__init__.py +0 -0
  82. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/_bundle_shim.py +0 -0
  83. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/analyze.py +0 -0
  84. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/contract_cmd.py +0 -0
  85. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/drift.py +0 -0
  86. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/enforce.py +0 -0
  87. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/generate.py +0 -0
  88. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/init.py +0 -0
  89. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/migrate.py +0 -0
  90. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/plan.py +0 -0
  91. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/project_cmd.py +0 -0
  92. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/repro.py +0 -0
  93. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/sdd.py +0 -0
  94. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/spec.py +0 -0
  95. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/sync.py +0 -0
  96. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/update.py +0 -0
  97. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/commands/validate.py +0 -0
  98. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/common/__init__.py +0 -0
  99. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/common/bundle_factory.py +0 -0
  100. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/common/logger_setup.py +0 -0
  101. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/common/logging_utils.py +0 -0
  102. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/common/text_utils.py +0 -0
  103. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/common/utils.py +0 -0
  104. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/comparators/__init__.py +0 -0
  105. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  106. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/contracts/__init__.py +0 -0
  107. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
  108. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/contracts/module_interface.py +0 -0
  109. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  110. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  111. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/generators/__init__.py +0 -0
  112. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/generators/contract_generator.py +0 -0
  113. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  114. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/generators/persona_exporter.py +0 -0
  115. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/generators/plan_generator.py +0 -0
  116. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
  117. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/generators/report_generator.py +0 -0
  118. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/generators/task_generator.py +0 -0
  119. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  120. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/generators/workflow_generator.py +0 -0
  121. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/groups/__init__.py +0 -0
  122. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/groups/govern_group.py +0 -0
  123. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/groups/member_group.py +0 -0
  124. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/groups/spec_group.py +0 -0
  125. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/importers/__init__.py +0 -0
  126. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
  127. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  128. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/integrations/__init__.py +0 -0
  129. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/integrations/specmatic.py +0 -0
  130. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/merge/__init__.py +0 -0
  131. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/merge/resolver.py +0 -0
  132. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/migrations/__init__.py +0 -0
  133. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  134. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/__init__.py +0 -0
  135. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/backlog_item.py +0 -0
  136. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/bridge.py +0 -0
  137. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/capabilities.py +0 -0
  138. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/change.py +0 -0
  139. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/contract.py +0 -0
  140. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/deviation.py +0 -0
  141. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/dor_config.py +0 -0
  142. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/enforcement.py +0 -0
  143. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/module_package.py +0 -0
  144. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/persona_template.py +0 -0
  145. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/plan.py +0 -0
  146. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/project.py +0 -0
  147. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/protocol.py +0 -0
  148. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/quality.py +0 -0
  149. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/sdd.py +0 -0
  150. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/source_tracking.py +0 -0
  151. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/task.py +0 -0
  152. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/models/validation.py +0 -0
  153. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modes/__init__.py +0 -0
  154. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modes/detector.py +0 -0
  155. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modes/router.py +0 -0
  156. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/__init__.py +0 -0
  157. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/_bundle_import.py +0 -0
  158. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/init/module-package.yaml +0 -0
  159. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/init/src/__init__.py +0 -0
  160. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/init/src/app.py +0 -0
  161. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/init/src/commands.py +0 -0
  162. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
  163. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/module_io_shim.py +0 -0
  164. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/module_registry/module-package.yaml +0 -0
  165. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
  166. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
  167. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/module_registry/src/commands.py +0 -0
  168. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
  169. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
  170. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
  171. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
  172. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/parsers/__init__.py +0 -0
  173. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/parsers/persona_importer.py +0 -0
  174. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/__init__.py +0 -0
  175. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/alias_manager.py +0 -0
  176. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/bootstrap.py +0 -0
  177. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/bridge_registry.py +0 -0
  178. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/crypto_validator.py +0 -0
  179. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/custom_registries.py +0 -0
  180. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/dependency_resolver.py +0 -0
  181. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/extension_registry.py +0 -0
  182. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/help_cache.py +0 -0
  183. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/marketplace_client.py +0 -0
  184. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/metadata.py +0 -0
  185. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_discovery.py +0 -0
  186. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_grouping.py +0 -0
  187. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_installer.py +0 -0
  188. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_lifecycle.py +0 -0
  189. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_packages.py +0 -0
  190. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_security.py +0 -0
  191. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_state.py +0 -0
  192. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/registry/registry.py +0 -0
  193. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  194. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  195. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  196. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/runtime.py +0 -0
  197. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/__init__.py +0 -0
  198. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
  199. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/bridge_sync.py +0 -0
  200. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/bridge_watch.py +0 -0
  201. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/change_detector.py +0 -0
  202. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
  203. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/drift_detector.py +0 -0
  204. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/repository_sync.py +0 -0
  205. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/spec_to_code.py +0 -0
  206. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  207. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/watcher.py +0 -0
  208. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  209. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/telemetry.py +0 -0
  210. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/templates/__init__.py +0 -0
  211. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
  212. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
  213. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
  214. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
  215. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
  216. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
  217. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
  218. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/templates/registry.py +0 -0
  219. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/templates/specification_templates.py +0 -0
  220. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/__init__.py +0 -0
  221. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
  222. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
  223. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/bundle_converters.py +0 -0
  224. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
  225. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
  226. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/console.py +0 -0
  227. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
  228. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/context_detection.py +0 -0
  229. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
  230. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/enrichment_parser.py +0 -0
  231. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/env_manager.py +0 -0
  232. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/feature_keys.py +0 -0
  233. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/git.py +0 -0
  234. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/github_annotations.py +0 -0
  235. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/ide_setup.py +0 -0
  236. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/incremental_check.py +0 -0
  237. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/metadata.py +0 -0
  238. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/optional_deps.py +0 -0
  239. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/performance.py +0 -0
  240. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/persona_ownership.py +0 -0
  241. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/progress.py +0 -0
  242. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  243. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/prompts.py +0 -0
  244. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
  245. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/source_scanner.py +0 -0
  246. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/startup_checks.py +0 -0
  247. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/structured_io.py +0 -0
  248. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/terminal.py +0 -0
  249. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
  250. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validation/__init__.py +0 -0
  251. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/__init__.py +0 -0
  252. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/agile_validation.py +0 -0
  253. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
  254. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  255. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/contract_validator.py +0 -0
  256. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/fsm.py +0 -0
  257. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/repro_checker.py +0 -0
  258. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/schema.py +0 -0
  259. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
  260. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
  261. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
  262. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
  263. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
  264. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
  265. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
  266. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
  267. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
  268. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
  269. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
  270. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
  271. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
  272. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
  273. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
  274. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
  275. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
  276. {specfact_cli-0.40.3 → specfact_cli-0.41.0}/src/specfact_cli/versioning/__init__.py +0 -0
  277. {specfact_cli-0.40.3 → specfact_cli-0.41.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.40.3
3
+ Version: 0.41.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
@@ -335,7 +335,7 @@ specfact init ide --ide vscode
335
335
 
336
336
  ```bash
337
337
  # Analyze an existing codebase
338
- specfact project import from-code my-project --repo .
338
+ specfact code import my-project --repo .
339
339
 
340
340
  # Validate external code without modifying source
341
341
  specfact code validate sidecar init my-project /path/to/repo
@@ -56,7 +56,7 @@ specfact init ide --ide vscode
56
56
 
57
57
  ```bash
58
58
  # Analyze an existing codebase
59
- specfact project import from-code my-project --repo .
59
+ specfact code import my-project --repo .
60
60
 
61
61
  # Validate external code without modifying source
62
62
  specfact code validate sidecar init my-project /path/to/repo
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "specfact-cli"
7
- version = "0.40.3"
7
+ version = "0.41.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"
@@ -109,7 +109,7 @@ When generating or enhancing code via LLM, **ALWAYS** follow this pattern:
109
109
 
110
110
  - `specfact plan init <bundle-name>` - Initialize project bundle
111
111
  - `specfact plan select <bundle-name>` - Set active plan (used as default for other commands)
112
- - `specfact import from-code [<bundle-name>] --repo <path>` - Import from codebase (uses active plan if bundle not specified)
112
+ - `specfact code import [<bundle-name>] --repo <path>` - Import from codebase (uses active plan if bundle not specified)
113
113
  - `specfact plan review [<bundle-name>]` - Review plan (uses active plan if bundle not specified)
114
114
  - `specfact plan harden [<bundle-name>]` - Create SDD manifest (uses active plan if bundle not specified)
115
115
  - `specfact enforce sdd [<bundle-name>]` - Validate SDD (uses active plan if bundle not specified)
@@ -318,7 +318,7 @@ specfact plan update-idea --bundle [<bundle-name>] --value-hypothesis "..." --na
318
318
  #### Option C: Apply enrichment via import (only if bundle needs regeneration)
319
319
 
320
320
  ```bash
321
- specfact import from-code [<bundle-name>] --repo . --enrichment enrichment-report.md
321
+ specfact code import [<bundle-name>] --repo . --enrichment enrichment-report.md
322
322
  ```
323
323
 
324
324
  **Note:**
@@ -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.40.3"
6
+ __version__ = "0.41.0"
@@ -42,6 +42,6 @@ def _bootstrap_bundle_paths() -> None:
42
42
 
43
43
  _bootstrap_bundle_paths()
44
44
 
45
- __version__ = "0.40.3"
45
+ __version__ = "0.41.0"
46
46
 
47
47
  __all__ = ["__version__"]
@@ -1759,12 +1759,12 @@ class AdoAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
1759
1759
 
1760
1760
  try:
1761
1761
  response = self._request_with_retry(
1762
- lambda: requests.patch(url, json=patch_document, headers=headers, timeout=30),
1762
+ lambda: requests.post(url, json=patch_document, headers=headers, timeout=30),
1763
1763
  retry_on_ambiguous_transport=False,
1764
1764
  )
1765
1765
  if is_debug_mode():
1766
1766
  debug_log_operation(
1767
- "ado_patch",
1767
+ "ado_create",
1768
1768
  url,
1769
1769
  str(response.status_code),
1770
1770
  error=None if response.ok else (response.text[:200] if response.text else None),
@@ -3456,7 +3456,7 @@ class AdoAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
3456
3456
  **self._auth_headers(),
3457
3457
  }
3458
3458
  response = self._request_with_retry(
3459
- lambda: requests.patch(url, json=patch_document, headers=headers, timeout=30),
3459
+ lambda: requests.post(url, json=patch_document, headers=headers, timeout=30),
3460
3460
  retry_on_ambiguous_transport=False,
3461
3461
  )
3462
3462
  created = response.json()
@@ -57,7 +57,7 @@ class AnalyzeAgent(AgentMode):
57
57
  Examples:
58
58
  >>> agent = AnalyzeAgent()
59
59
  >>> prompt = agent.generate_prompt("import from-code", {"current_file": "src/main.py"})
60
- >>> "specfact import from-code" in prompt.lower()
60
+ >>> "specfact code import" in prompt.lower()
61
61
  True
62
62
  """
63
63
  if context is None:
@@ -316,7 +316,7 @@ Dependencies: {len(dependencies)} dependency files found
316
316
  **Pragmatic Approach**: This method is designed for AI IDE integration (Cursor, CoPilot, etc.).
317
317
  The AI IDE's native LLM will:
318
318
  1. Understand the codebase semantically (using the prompt from `generate_prompt()`)
319
- 2. Call the SpecFact CLI (`specfact import from-code`) for structured analysis
319
+ 2. Call the SpecFact CLI (`specfact code import`) for structured analysis
320
320
  3. Enhance results with semantic understanding
321
321
 
322
322
  This avoids the need for:
@@ -356,7 +356,7 @@ Dependencies: {len(dependencies)} dependency files found
356
356
 
357
357
  # In AI IDE mode, the AI will:
358
358
  # 1. Use the prompt to understand the codebase semantically
359
- # 2. Call `specfact import from-code` with appropriate arguments
359
+ # 2. Call `specfact code import` with appropriate arguments
360
360
  # 3. Parse the CLI output and enhance with semantic understanding
361
361
  # 4. Present results to the user
362
362
 
@@ -1,4 +1,4 @@
1
- """Backward-compatible app shim for project import command."""
1
+ """Backward-compatible app shim for code-owned import command."""
2
2
 
3
3
  from typing import TYPE_CHECKING, Any
4
4
 
@@ -11,7 +11,7 @@ if TYPE_CHECKING:
11
11
 
12
12
  def __getattr__(name: str) -> Any:
13
13
  if name == "app":
14
- return load_bundle_app(__file__, "specfact_project.import_cmd.commands")
14
+ return load_bundle_app(__file__, "specfact_codebase.import_cmd.commands")
15
15
  raise AttributeError(name)
16
16
 
17
17
 
@@ -1,4 +1,4 @@
1
- """Codebase quality category group (analyze, drift, validate, repro)."""
1
+ """Codebase category group (import, analyze, drift, validate, repro)."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -9,7 +9,7 @@ from icontract import ensure, require
9
9
  from specfact_cli.registry.registry import CommandRegistry
10
10
 
11
11
 
12
- _MEMBERS = ("analyze", "drift", "validate", "repro")
12
+ _MEMBERS = ("import", "analyze", "drift", "validate", "repro")
13
13
 
14
14
 
15
15
  @require(lambda app: app is not None)
@@ -30,7 +30,7 @@ def build_app() -> typer.Typer:
30
30
  """Build the code group Typer with members (lazy; registry must be populated)."""
31
31
  app = typer.Typer(
32
32
  name="code",
33
- help="Codebase quality commands: analyze, drift, validate, repro.",
33
+ help="Codebase commands: import, analyze, drift, validate, repro.",
34
34
  no_args_is_help=True,
35
35
  )
36
36
  _register_members(app)
@@ -1,4 +1,4 @@
1
- """Project lifecycle category group (project, plan, import, sync, migrate)."""
1
+ """Project lifecycle category group (project, plan, sync, migrate)."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -12,7 +12,6 @@ from specfact_cli.registry.registry import CommandRegistry
12
12
  _MEMBERS = [
13
13
  ("project", "project"),
14
14
  ("plan", "plan"),
15
- ("import", "import"),
16
15
  ("sync", "sync"),
17
16
  ("migrate", "migrate"),
18
17
  ]
@@ -945,7 +945,7 @@ See `docs/directory-structure.md` for complete documentation.
945
945
  specfact plan init --interactive
946
946
 
947
947
  # Analyze existing code
948
- specfact import from-code --repo .
948
+ specfact code import <bundle-name> --repo .
949
949
 
950
950
  # Compare plans
951
951
  specfact plan compare --manual .specfact/plans/main.bundle.yaml --auto .specfact/plans/auto-derived-<timestamp>.bundle.yaml
@@ -38,14 +38,14 @@ def suggest_next_steps(repo_path: Path, context: ProjectContext | None = None) -
38
38
 
39
39
  # First-time setup suggestions
40
40
  if not context.has_plan and not context.has_config:
41
- suggestions.append("specfact import from-code --bundle <name> # Import your codebase")
41
+ suggestions.append("specfact code import <name> --repo . # Import your codebase")
42
42
  suggestions.append("specfact init # Initialize SpecFact configuration")
43
43
  return suggestions
44
44
 
45
45
  # Analysis suggestions
46
46
  if context.has_plan and context.contract_coverage < 0.5:
47
47
  suggestions.append("specfact analyze --bundle <name> # Analyze contract coverage")
48
- suggestions.append("specfact import from-code --bundle <name> # Update plan from code")
48
+ suggestions.append("specfact code import <name> --repo . # Update the project bundle from code")
49
49
 
50
50
  # Specmatic integration suggestions
51
51
  if context.has_specmatic_config and not context.openapi_specs:
@@ -81,7 +81,7 @@ def suggest_fixes(error_message: str, context: ProjectContext | None = None) ->
81
81
  # Bundle not found
82
82
  if "bundle" in error_lower and ("not found" in error_lower or "does not exist" in error_lower):
83
83
  suggestions.append("specfact plan select # Select an active plan bundle")
84
- suggestions.append("specfact import from-code --bundle <name> # Create a new bundle")
84
+ suggestions.append("specfact code import <name> --repo . # Create a new bundle from code")
85
85
 
86
86
  # Contract validation errors
87
87
  if "contract" in error_lower and ("violation" in error_lower or "invalid" in error_lower):
@@ -95,7 +95,7 @@ def suggest_fixes(error_message: str, context: ProjectContext | None = None) ->
95
95
 
96
96
  # Import errors
97
97
  if "import" in error_lower and "failed" in error_lower:
98
- suggestions.append("specfact import from-code --bundle <name> --repo . # Retry import")
98
+ suggestions.append("specfact code import <name> --repo . # Retry import")
99
99
 
100
100
  return suggestions
101
101
 
@@ -116,7 +116,7 @@ def suggest_improvements(context: ProjectContext) -> list[str]:
116
116
  # Low contract coverage
117
117
  if context.contract_coverage < 0.3:
118
118
  suggestions.append("specfact analyze --bundle <name> # Identify missing contracts")
119
- suggestions.append("specfact import from-code --bundle <name> # Extract contracts from code")
119
+ suggestions.append("specfact code import <name> --repo . # Extract contracts from code")
120
120
 
121
121
  # Missing OpenAPI specs
122
122
  if context.has_plan and not context.openapi_specs:
@@ -32,6 +32,15 @@ def _resolve_modules_repo_root() -> Path | None:
32
32
  return candidate
33
33
 
34
34
  current = Path(__file__).resolve()
35
+ current_parts = current.parts
36
+ if "specfact-cli-worktrees" in current_parts:
37
+ idx = current_parts.index("specfact-cli-worktrees")
38
+ worktree_root = Path(*current_parts[:idx], "specfact-cli-modules-worktrees")
39
+ relative_tail = current.relative_to(Path(*current_parts[: idx + 1]))
40
+ candidate = worktree_root / relative_tail.parts[0] / relative_tail.parts[1]
41
+ if candidate.exists():
42
+ return candidate.resolve()
43
+
35
44
  for parent in current.parents:
36
45
  sibling = parent.parent / "specfact-cli-modules"
37
46
  if sibling.exists():
@@ -89,6 +98,19 @@ def _collect_typer_paths(app: object, prefix: str) -> set[str]:
89
98
  return paths
90
99
 
91
100
 
101
+ def _auditable_paths_for_prefix(app: object, prefix: str) -> set[str]:
102
+ """Return help-safe command paths for audit cases.
103
+
104
+ `code import` is implemented as a callback-driven command surface with optional
105
+ positional bundle input plus compatibility subcommands. The canonical audited
106
+ public path is `code import` itself, not nested help cases under that prefix.
107
+ """
108
+ paths = _collect_typer_paths(app, prefix)
109
+ if prefix == "code":
110
+ paths = {path for path in paths if not path.startswith("code import ")}
111
+ return paths
112
+
113
+
92
114
  def _import_typer(module_path: str, attr_name: str = "app") -> object:
93
115
  module = importlib.import_module(module_path)
94
116
  return getattr(module, attr_name)
@@ -111,6 +133,13 @@ def _explicit_cases() -> list[CommandAuditCase]:
111
133
  CommandAuditCase("project", ("project", "--help"), "project", "help-only", "nold-ai/specfact-project"),
112
134
  CommandAuditCase("spec", ("spec", "--help"), "spec", "help-only", "nold-ai/specfact-spec"),
113
135
  CommandAuditCase("code", ("code", "--help"), "code", "help-only", "nold-ai/specfact-codebase"),
136
+ CommandAuditCase(
137
+ "code import",
138
+ ("code", "import", "--help"),
139
+ "code",
140
+ "help-only",
141
+ "nold-ai/specfact-codebase",
142
+ ),
114
143
  CommandAuditCase("backlog", ("backlog", "--help"), "backlog", "help-only", "nold-ai/specfact-backlog"),
115
144
  CommandAuditCase("govern", ("govern", "--help"), "govern", "help-only", "nold-ai/specfact-govern"),
116
145
  CommandAuditCase(
@@ -149,7 +178,7 @@ def build_command_audit_cases() -> list[CommandAuditCase]:
149
178
  prefix,
150
179
  CommandAuditCase(prefix, (*tuple(prefix.split()), "--help"), phase, "help-only", owner),
151
180
  )
152
- for command_path in sorted(_collect_typer_paths(app, prefix)):
181
+ for command_path in sorted(_auditable_paths_for_prefix(app, prefix)):
153
182
  cases.setdefault(
154
183
  command_path,
155
184
  CommandAuditCase(
File without changes
File without changes