specfact-cli 0.40.4__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.
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/PKG-INFO +2 -2
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/README.md +1 -1
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/pyproject.toml +1 -1
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/prompts/shared/cli-enforcement.md +1 -1
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/prompts/specfact.03-review.md +1 -1
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/__init__.py +1 -1
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/__init__.py +1 -1
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/agents/analyze_agent.py +3 -3
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/import_cmd.py +2 -2
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/groups/codebase_group.py +3 -3
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/groups/project_group.py +1 -2
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/structure.py +1 -1
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/suggestions.py +5 -5
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validation/command_audit.py +30 -1
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/.gitignore +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/LICENSE +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/keys/README.md +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/keys/module-signing-public.pem +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/prompts/specfact.01-import.md +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/prompts/specfact.02-plan.md +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/prompts/specfact.04-sdd.md +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/prompts/specfact.05-enforce.md +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/prompts/specfact.06-sync.md +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/prompts/specfact.07-contracts.md +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/prompts/specfact.compare.md +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/prompts/specfact.validate.md +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/persona/architect.md.j2 +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/persona/developer.md.j2 +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/persona/product-owner.md.j2 +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/policies/kanban.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/policies/mixed.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/policies/safe.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/policies/scrum.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/pr-template.md.j2 +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/__main__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/adapters/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/adapters/ado.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/adapters/base.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/adapters/github.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/adapters/openspec.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/adapters/openspec_parser.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/adapters/registry.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/adapters/speckit.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/converter.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/filters.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/cli.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/_bundle_shim.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/analyze.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/contract_cmd.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/drift.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/enforce.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/generate.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/init.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/migrate.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/plan.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/project_cmd.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/repro.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/sdd.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/spec.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/sync.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/update.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/commands/validate.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/common/bundle_factory.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/common/logger_setup.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/common/logging_utils.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/contracts/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/contracts/module_interface.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/contract_generator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/openapi_extractor.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/persona_exporter.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/test_to_openapi.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/groups/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/groups/govern_group.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/groups/member_group.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/groups/spec_group.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/merge/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/merge/resolver.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/backlog_item.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/capabilities.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/change.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/contract.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/dor_config.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/module_package.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/persona_template.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/plan.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/project.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/models/validation.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/_bundle_import.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/init/module-package.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/init/src/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/init/src/app.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/init/src/commands.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/module_io_shim.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/module_registry/module-package.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/module_registry/src/commands.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/parsers/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/parsers/persona_importer.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/alias_manager.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/bootstrap.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/bridge_registry.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/crypto_validator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/custom_registries.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/dependency_resolver.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/extension_registry.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/help_cache.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/marketplace_client.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/metadata.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_discovery.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_grouping.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_installer.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_lifecycle.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_packages.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_security.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/module_state.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/registry/registry.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/runtime.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/bridge_sync.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/bridge_watch.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/spec_to_code.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/templates/registry.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/bundle_converters.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/context_detection.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/enrichment_parser.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/env_manager.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/git.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/ide_setup.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/metadata.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/optional_deps.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/persona_ownership.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/progress.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/source_scanner.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/startup_checks.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/terminal.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validation/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/agile_validation.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/cli_first_validator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/contract_validator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/schema.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
- {specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/versioning/__init__.py +0 -0
- {specfact_cli-0.40.4 → 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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
321
|
+
specfact code import [<bundle-name>] --repo . --enrichment enrichment-report.md
|
|
322
322
|
```
|
|
323
323
|
|
|
324
324
|
**Note:**
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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__, "
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/contract_extractor.py
RENAMED
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/control_flow_analyzer.py
RENAMED
|
File without changes
|
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/relationship_mapper.py
RENAMED
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/requirement_extractor.py
RENAMED
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/analyzers/test_pattern_extractor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/github_mapper.py
RENAMED
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/backlog/mappers/template_config.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/enrichers/constitution_enricher.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/contract_generator.py
RENAMED
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/openapi_extractor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/protocol_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfact_cli-0.40.4 → specfact_cli-0.41.0}/src/specfact_cli/generators/workflow_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|