specfact-cli 0.43.1__tar.gz → 0.43.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/PKG-INFO +135 -37
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/README.md +134 -36
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/pyproject.toml +11 -2
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/__init__.py +1 -1
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/__init__.py +4 -1
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/acceptance_criteria.py +32 -5
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/enrichment_parser.py +72 -25
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/optional_deps.py +9 -1
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/.gitignore +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/LICENSE +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/keys/README.md +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/keys/module-signing-public.pem +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/persona/architect.md.j2 +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/persona/developer.md.j2 +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/persona/product-owner.md.j2 +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/policies/kanban.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/policies/mixed.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/policies/safe.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/policies/scrum.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/pr-template.md.j2 +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/__main__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/ado.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/backlog_base.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/base.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/github.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/openspec.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/openspec_parser.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/registry.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/adapters/speckit.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/analyze_agent.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/adapters/base.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/converter.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/filters.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/base.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/cli.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/_bundle_shim.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/analyze.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/contract_cmd.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/drift.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/enforce.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/generate.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/import_cmd.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/init.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/migrate.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/plan.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/project_cmd.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/repro.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/sdd.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/spec.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/sync.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/update.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/commands/validate.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/bundle_factory.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/logger_setup.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/logging_utils.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/contracts/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/contracts/crosshair_props.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/contracts/module_interface.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/contract_generator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/openapi_extractor.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/persona_exporter.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/test_to_openapi.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/codebase_group.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/govern_group.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/member_group.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/project_group.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/groups/spec_group.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/merge/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/merge/resolver.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/backlog_item.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/capabilities.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/change.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/contract.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/dor_config.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/module_package.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/persona_template.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/plan.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/project.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/models/validation.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/_bundle_import.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/module-package.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/app.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/commands.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_io_shim.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/module-package.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/module_registry/src/commands.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/parsers/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/parsers/persona_importer.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/alias_manager.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/bootstrap.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/bridge_registry.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/crypto_validator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/custom_registries.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/dependency_resolver.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/extension_registry.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/help_cache.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/marketplace_client.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/metadata.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_discovery.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_grouping.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_installer.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_lifecycle.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_packages.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_security.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/module_state.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/registry/registry.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/runtime.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_openspec_md_parse.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_requirement_from_proposal.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_requirement_helpers.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_tasks_from_proposal.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_what_changes_format.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_sync_write_openspec_from_proposal.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/bridge_watch.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/spec_to_code.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/registry.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/auth_tokens.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/bundle_converters.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/bundle_loader.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/code_change_detector.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/content_sanitizer.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/context_detection.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/contract_predicates.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/env_manager.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/git.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/icontract_helpers.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/ide_setup.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/metadata.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/persona_ownership.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/progress.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/sdd_discovery.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/source_scanner.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/startup_checks.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/structure.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/suggestions.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/terminal.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validation/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validation/command_audit.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/agile_validation.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/cli_first_validator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/contract_validator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/schema.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/models.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/versioning/__init__.py +0 -0
- {specfact_cli-0.43.1 → specfact_cli-0.43.3}/src/specfact_cli/versioning/analyzer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specfact-cli
|
|
3
|
-
Version: 0.43.
|
|
3
|
+
Version: 0.43.3
|
|
4
4
|
Summary: The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with validation and contract enforcement for new projects and long-lived codebases.
|
|
5
5
|
Project-URL: Homepage, https://github.com/nold-ai/specfact-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/nold-ai/specfact-cli.git
|
|
@@ -281,12 +281,17 @@ Description-Content-Type: text/markdown
|
|
|
281
281
|
|
|
282
282
|
# SpecFact CLI
|
|
283
283
|
|
|
284
|
-
> **
|
|
285
|
-
>
|
|
286
|
-
>
|
|
284
|
+
> **SpecFact is the validation and alignment layer for software delivery.**
|
|
285
|
+
> It adds the missing validation layer that keeps backlog intent, specifications, tests, and code
|
|
286
|
+
> from drifting apart across AI-assisted coding, brownfield systems, and governed delivery.
|
|
287
|
+
> Use it to move fast without losing rigor.
|
|
287
288
|
|
|
288
289
|
**No API keys required. Works offline. Zero vendor lock-in.**
|
|
289
290
|
|
|
291
|
+
SpecFact CLI does **not** include built-in AI. It is a deterministic local CLI
|
|
292
|
+
that can be paired with IDE slash-command prompts so your chosen AI copilot can
|
|
293
|
+
invoke SpecFact as part of a command chain.
|
|
294
|
+
|
|
290
295
|
[](https://pypi.org/project/specfact-cli/)
|
|
291
296
|
[](https://pypi.org/project/specfact-cli/)
|
|
292
297
|
[](LICENSE)
|
|
@@ -300,21 +305,54 @@ Description-Content-Type: text/markdown
|
|
|
300
305
|
|
|
301
306
|
---
|
|
302
307
|
|
|
303
|
-
##
|
|
308
|
+
## What is SpecFact?
|
|
304
309
|
|
|
305
|
-
|
|
310
|
+
SpecFact is the validation and alignment layer for software delivery.
|
|
306
311
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
312
|
+
It is a local CLI that helps you keep the intent behind a change aligned from
|
|
313
|
+
backlog or idea through specifications, implementation, and checks. The “Swiss-knife CLI” metaphor
|
|
314
|
+
fits because SpecFact gives you a set of focused tools for specific delivery problems, not a vague
|
|
315
|
+
bag of features.
|
|
310
316
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
317
|
+
In practice, SpecFact helps you:
|
|
318
|
+
- add guardrails to AI-assisted and fast-moving greenfield work
|
|
319
|
+
- reverse-engineer large brownfield codebases into trustworthy structured understanding
|
|
320
|
+
- reduce the “I wanted X but got Y” drift between backlog, spec, and implementation
|
|
321
|
+
- move from local rigor toward team and enterprise policy enforcement
|
|
314
322
|
|
|
315
|
-
|
|
323
|
+
## Why does it exist?
|
|
324
|
+
|
|
325
|
+
Modern delivery drifts in predictable ways:
|
|
326
|
+
- AI-generated quick wins often lack the validation layer needed for mid- and long-term reliability
|
|
327
|
+
- brownfield systems often have missing or drifted specs, so teams need to reverse-engineer reality
|
|
328
|
+
- backlog intent gets reinterpreted into something else before it reaches code
|
|
329
|
+
- teams working with different skill levels, opinions, and AI IDE setups need consistent review and
|
|
330
|
+
policy enforcement
|
|
331
|
+
|
|
332
|
+
SpecFact exists to reduce that drift. It helps teams understand what is really there, express what
|
|
333
|
+
should happen more accurately, and validate that the result still matches the original intent.
|
|
334
|
+
|
|
335
|
+
## Why should I use it?
|
|
316
336
|
|
|
317
|
-
|
|
337
|
+
Use SpecFact if you want one of these outcomes:
|
|
338
|
+
- ship AI-assisted changes faster without accepting fragile “looks fine to me” quality
|
|
339
|
+
- understand a legacy or unfamiliar codebase before changing it
|
|
340
|
+
- hand brownfield insight into OpenSpec, Spec-Kit, or other spec-first workflows
|
|
341
|
+
- keep backlog expectations, specifications, and implementation from silently diverging
|
|
342
|
+
- enforce shared rules consistently across developers and CI/CD
|
|
343
|
+
|
|
344
|
+
## What do I get?
|
|
345
|
+
|
|
346
|
+
With SpecFact, you get:
|
|
347
|
+
- a deterministic local CLI instead of another opaque SaaS dependency
|
|
348
|
+
- a validation layer around fast-moving implementation work
|
|
349
|
+
- codebase analysis and sidecar flows for brownfield understanding
|
|
350
|
+
- stronger backlog/spec/code alignment for real delivery workflows
|
|
351
|
+
- a path from individual rigor to organization-level policy enforcement
|
|
352
|
+
|
|
353
|
+
## How do I get started?
|
|
354
|
+
|
|
355
|
+
### Start Here (5 minutes)
|
|
318
356
|
|
|
319
357
|
### Install
|
|
320
358
|
|
|
@@ -326,38 +364,104 @@ uvx specfact-cli@latest
|
|
|
326
364
|
pip install -U specfact-cli
|
|
327
365
|
```
|
|
328
366
|
|
|
329
|
-
### Bootstrap
|
|
367
|
+
### Bootstrap
|
|
330
368
|
|
|
331
369
|
```bash
|
|
332
|
-
#
|
|
370
|
+
# Recommended first run
|
|
333
371
|
specfact init --profile solo-developer
|
|
334
|
-
|
|
335
|
-
# Alternative bundle selection
|
|
336
|
-
specfact init --install backlog,codebase
|
|
337
|
-
specfact init --install all
|
|
338
|
-
|
|
339
|
-
# IDE prompt/template setup
|
|
340
|
-
specfact init ide
|
|
341
|
-
specfact init ide --ide cursor
|
|
342
|
-
specfact init ide --ide vscode
|
|
343
372
|
```
|
|
344
373
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
### Run Your First Flow
|
|
374
|
+
### Get First Value
|
|
348
375
|
|
|
349
376
|
```bash
|
|
350
|
-
# Analyze
|
|
377
|
+
# Analyze a codebase you care about
|
|
351
378
|
specfact code import my-project --repo .
|
|
352
379
|
|
|
353
|
-
# Snapshot
|
|
380
|
+
# Snapshot the project state for follow-up workflows
|
|
354
381
|
specfact project snapshot --bundle my-project
|
|
355
382
|
|
|
356
|
-
# Validate external code without modifying
|
|
383
|
+
# Validate external code without modifying the target repo
|
|
357
384
|
specfact code validate sidecar init my-project /path/to/repo
|
|
358
385
|
specfact code validate sidecar run my-project /path/to/repo
|
|
359
386
|
```
|
|
360
387
|
|
|
388
|
+
That path gives you a concrete first win: SpecFact understands your project context and gives you a
|
|
389
|
+
validated starting point instead of jumping straight into blind change work.
|
|
390
|
+
|
|
391
|
+
### AI IDE Setup
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
specfact init ide
|
|
395
|
+
specfact init ide --ide cursor
|
|
396
|
+
specfact init ide --ide vscode
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
`specfact init ide` discovers prompt resources from installed workflow modules and exports them to
|
|
400
|
+
your IDE. If module prompt payloads are not installed yet, the CLI uses packaged fallback resources.
|
|
401
|
+
|
|
402
|
+
## Choose Your Path
|
|
403
|
+
|
|
404
|
+
### Greenfield and AI-assisted delivery
|
|
405
|
+
|
|
406
|
+
Use SpecFact as the validation layer around fast-moving implementation work.
|
|
407
|
+
|
|
408
|
+
Start with:
|
|
409
|
+
- `specfact init --profile solo-developer`
|
|
410
|
+
- `specfact code validate sidecar init <bundle> /path/to/repo`
|
|
411
|
+
- `specfact code validate sidecar run <bundle> /path/to/repo`
|
|
412
|
+
|
|
413
|
+
### Brownfield and reverse engineering
|
|
414
|
+
|
|
415
|
+
Use SpecFact to understand an existing system before you change it, then hand that understanding
|
|
416
|
+
into spec-first tools such as OpenSpec or Spec-Kit.
|
|
417
|
+
|
|
418
|
+
Start with:
|
|
419
|
+
- `specfact code import my-project --repo .`
|
|
420
|
+
- `specfact project snapshot --bundle my-project`
|
|
421
|
+
- `specfact code validate sidecar init my-project /path/to/repo`
|
|
422
|
+
- `specfact code validate sidecar run my-project /path/to/repo`
|
|
423
|
+
|
|
424
|
+
### Backlog to code alignment
|
|
425
|
+
|
|
426
|
+
Use SpecFact when the problem is not only code quality, but drift between expectations and delivery.
|
|
427
|
+
Backlog commands require a backlog-enabled profile or installed backlog bundle before the workflow
|
|
428
|
+
commands are available.
|
|
429
|
+
|
|
430
|
+
Start with:
|
|
431
|
+
- `specfact init --profile backlog-team`
|
|
432
|
+
- `specfact backlog ceremony standup ...`
|
|
433
|
+
- `specfact backlog ceremony refinement ...`
|
|
434
|
+
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
435
|
+
|
|
436
|
+
### Team and policy enforcement
|
|
437
|
+
|
|
438
|
+
Use SpecFact when multiple developers and AI IDEs need consistent checks and review behavior.
|
|
439
|
+
|
|
440
|
+
Start with:
|
|
441
|
+
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
442
|
+
- `specfact govern ...`
|
|
443
|
+
- CI validation flows that keep the same rules active outside local development
|
|
444
|
+
|
|
445
|
+
## How do I get started if I want more?
|
|
446
|
+
|
|
447
|
+
**Next steps**
|
|
448
|
+
|
|
449
|
+
- **[Core CLI docs](docs/index.md)** for the core runtime, bootstrap, validation, and command topology
|
|
450
|
+
- **[Reference: command topology](docs/reference/commands.md)** for grouped command surfaces
|
|
451
|
+
- **[Canonical modules docs site](https://modules.specfact.io/)** for bundle-deep workflows
|
|
452
|
+
|
|
453
|
+
## Documentation Topology
|
|
454
|
+
|
|
455
|
+
`docs.specfact.io` is the canonical starting point for SpecFact.
|
|
456
|
+
|
|
457
|
+
- Core CLI/runtime/platform documentation remains owned by `specfact-cli`.
|
|
458
|
+
- Module-specific deep docs are canonically owned by `specfact-cli-modules`.
|
|
459
|
+
- The live modules docs site is published at `https://modules.specfact.io/`.
|
|
460
|
+
|
|
461
|
+
Use this repository's docs for the overall product story, runtime lifecycle, command topology,
|
|
462
|
+
trust model, and getting-started flow. Use the modules docs site when you want deeper workflow,
|
|
463
|
+
adapter, and module-authoring guidance.
|
|
464
|
+
|
|
361
465
|
### Migration Note (Flat Commands Removed)
|
|
362
466
|
|
|
363
467
|
As of `0.40.0`, flat root commands are removed. Use grouped commands:
|
|
@@ -397,12 +501,6 @@ For GitHub, replace adapter/org/project with:
|
|
|
397
501
|
/specfact.01-import my-project --repo .
|
|
398
502
|
```
|
|
399
503
|
|
|
400
|
-
**Next steps**
|
|
401
|
-
|
|
402
|
-
- **[Core CLI docs](docs/index.md)**
|
|
403
|
-
- **[Reference: command topology](docs/reference/commands.md)**
|
|
404
|
-
- **[Canonical modules docs site](https://modules.specfact.io/)**
|
|
405
|
-
|
|
406
504
|
---
|
|
407
505
|
|
|
408
506
|
## Who It Is For
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
# SpecFact CLI
|
|
2
2
|
|
|
3
|
-
> **
|
|
4
|
-
>
|
|
5
|
-
>
|
|
3
|
+
> **SpecFact is the validation and alignment layer for software delivery.**
|
|
4
|
+
> It adds the missing validation layer that keeps backlog intent, specifications, tests, and code
|
|
5
|
+
> from drifting apart across AI-assisted coding, brownfield systems, and governed delivery.
|
|
6
|
+
> Use it to move fast without losing rigor.
|
|
6
7
|
|
|
7
8
|
**No API keys required. Works offline. Zero vendor lock-in.**
|
|
8
9
|
|
|
10
|
+
SpecFact CLI does **not** include built-in AI. It is a deterministic local CLI
|
|
11
|
+
that can be paired with IDE slash-command prompts so your chosen AI copilot can
|
|
12
|
+
invoke SpecFact as part of a command chain.
|
|
13
|
+
|
|
9
14
|
[](https://pypi.org/project/specfact-cli/)
|
|
10
15
|
[](https://pypi.org/project/specfact-cli/)
|
|
11
16
|
[](LICENSE)
|
|
@@ -19,21 +24,54 @@
|
|
|
19
24
|
|
|
20
25
|
---
|
|
21
26
|
|
|
22
|
-
##
|
|
27
|
+
## What is SpecFact?
|
|
23
28
|
|
|
24
|
-
|
|
29
|
+
SpecFact is the validation and alignment layer for software delivery.
|
|
25
30
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
It is a local CLI that helps you keep the intent behind a change aligned from
|
|
32
|
+
backlog or idea through specifications, implementation, and checks. The “Swiss-knife CLI” metaphor
|
|
33
|
+
fits because SpecFact gives you a set of focused tools for specific delivery problems, not a vague
|
|
34
|
+
bag of features.
|
|
29
35
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
In practice, SpecFact helps you:
|
|
37
|
+
- add guardrails to AI-assisted and fast-moving greenfield work
|
|
38
|
+
- reverse-engineer large brownfield codebases into trustworthy structured understanding
|
|
39
|
+
- reduce the “I wanted X but got Y” drift between backlog, spec, and implementation
|
|
40
|
+
- move from local rigor toward team and enterprise policy enforcement
|
|
33
41
|
|
|
34
|
-
|
|
42
|
+
## Why does it exist?
|
|
43
|
+
|
|
44
|
+
Modern delivery drifts in predictable ways:
|
|
45
|
+
- AI-generated quick wins often lack the validation layer needed for mid- and long-term reliability
|
|
46
|
+
- brownfield systems often have missing or drifted specs, so teams need to reverse-engineer reality
|
|
47
|
+
- backlog intent gets reinterpreted into something else before it reaches code
|
|
48
|
+
- teams working with different skill levels, opinions, and AI IDE setups need consistent review and
|
|
49
|
+
policy enforcement
|
|
50
|
+
|
|
51
|
+
SpecFact exists to reduce that drift. It helps teams understand what is really there, express what
|
|
52
|
+
should happen more accurately, and validate that the result still matches the original intent.
|
|
53
|
+
|
|
54
|
+
## Why should I use it?
|
|
35
55
|
|
|
36
|
-
|
|
56
|
+
Use SpecFact if you want one of these outcomes:
|
|
57
|
+
- ship AI-assisted changes faster without accepting fragile “looks fine to me” quality
|
|
58
|
+
- understand a legacy or unfamiliar codebase before changing it
|
|
59
|
+
- hand brownfield insight into OpenSpec, Spec-Kit, or other spec-first workflows
|
|
60
|
+
- keep backlog expectations, specifications, and implementation from silently diverging
|
|
61
|
+
- enforce shared rules consistently across developers and CI/CD
|
|
62
|
+
|
|
63
|
+
## What do I get?
|
|
64
|
+
|
|
65
|
+
With SpecFact, you get:
|
|
66
|
+
- a deterministic local CLI instead of another opaque SaaS dependency
|
|
67
|
+
- a validation layer around fast-moving implementation work
|
|
68
|
+
- codebase analysis and sidecar flows for brownfield understanding
|
|
69
|
+
- stronger backlog/spec/code alignment for real delivery workflows
|
|
70
|
+
- a path from individual rigor to organization-level policy enforcement
|
|
71
|
+
|
|
72
|
+
## How do I get started?
|
|
73
|
+
|
|
74
|
+
### Start Here (5 minutes)
|
|
37
75
|
|
|
38
76
|
### Install
|
|
39
77
|
|
|
@@ -45,38 +83,104 @@ uvx specfact-cli@latest
|
|
|
45
83
|
pip install -U specfact-cli
|
|
46
84
|
```
|
|
47
85
|
|
|
48
|
-
### Bootstrap
|
|
86
|
+
### Bootstrap
|
|
49
87
|
|
|
50
88
|
```bash
|
|
51
|
-
#
|
|
89
|
+
# Recommended first run
|
|
52
90
|
specfact init --profile solo-developer
|
|
53
|
-
|
|
54
|
-
# Alternative bundle selection
|
|
55
|
-
specfact init --install backlog,codebase
|
|
56
|
-
specfact init --install all
|
|
57
|
-
|
|
58
|
-
# IDE prompt/template setup
|
|
59
|
-
specfact init ide
|
|
60
|
-
specfact init ide --ide cursor
|
|
61
|
-
specfact init ide --ide vscode
|
|
62
91
|
```
|
|
63
92
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
### Run Your First Flow
|
|
93
|
+
### Get First Value
|
|
67
94
|
|
|
68
95
|
```bash
|
|
69
|
-
# Analyze
|
|
96
|
+
# Analyze a codebase you care about
|
|
70
97
|
specfact code import my-project --repo .
|
|
71
98
|
|
|
72
|
-
# Snapshot
|
|
99
|
+
# Snapshot the project state for follow-up workflows
|
|
73
100
|
specfact project snapshot --bundle my-project
|
|
74
101
|
|
|
75
|
-
# Validate external code without modifying
|
|
102
|
+
# Validate external code without modifying the target repo
|
|
76
103
|
specfact code validate sidecar init my-project /path/to/repo
|
|
77
104
|
specfact code validate sidecar run my-project /path/to/repo
|
|
78
105
|
```
|
|
79
106
|
|
|
107
|
+
That path gives you a concrete first win: SpecFact understands your project context and gives you a
|
|
108
|
+
validated starting point instead of jumping straight into blind change work.
|
|
109
|
+
|
|
110
|
+
### AI IDE Setup
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
specfact init ide
|
|
114
|
+
specfact init ide --ide cursor
|
|
115
|
+
specfact init ide --ide vscode
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`specfact init ide` discovers prompt resources from installed workflow modules and exports them to
|
|
119
|
+
your IDE. If module prompt payloads are not installed yet, the CLI uses packaged fallback resources.
|
|
120
|
+
|
|
121
|
+
## Choose Your Path
|
|
122
|
+
|
|
123
|
+
### Greenfield and AI-assisted delivery
|
|
124
|
+
|
|
125
|
+
Use SpecFact as the validation layer around fast-moving implementation work.
|
|
126
|
+
|
|
127
|
+
Start with:
|
|
128
|
+
- `specfact init --profile solo-developer`
|
|
129
|
+
- `specfact code validate sidecar init <bundle> /path/to/repo`
|
|
130
|
+
- `specfact code validate sidecar run <bundle> /path/to/repo`
|
|
131
|
+
|
|
132
|
+
### Brownfield and reverse engineering
|
|
133
|
+
|
|
134
|
+
Use SpecFact to understand an existing system before you change it, then hand that understanding
|
|
135
|
+
into spec-first tools such as OpenSpec or Spec-Kit.
|
|
136
|
+
|
|
137
|
+
Start with:
|
|
138
|
+
- `specfact code import my-project --repo .`
|
|
139
|
+
- `specfact project snapshot --bundle my-project`
|
|
140
|
+
- `specfact code validate sidecar init my-project /path/to/repo`
|
|
141
|
+
- `specfact code validate sidecar run my-project /path/to/repo`
|
|
142
|
+
|
|
143
|
+
### Backlog to code alignment
|
|
144
|
+
|
|
145
|
+
Use SpecFact when the problem is not only code quality, but drift between expectations and delivery.
|
|
146
|
+
Backlog commands require a backlog-enabled profile or installed backlog bundle before the workflow
|
|
147
|
+
commands are available.
|
|
148
|
+
|
|
149
|
+
Start with:
|
|
150
|
+
- `specfact init --profile backlog-team`
|
|
151
|
+
- `specfact backlog ceremony standup ...`
|
|
152
|
+
- `specfact backlog ceremony refinement ...`
|
|
153
|
+
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
154
|
+
|
|
155
|
+
### Team and policy enforcement
|
|
156
|
+
|
|
157
|
+
Use SpecFact when multiple developers and AI IDEs need consistent checks and review behavior.
|
|
158
|
+
|
|
159
|
+
Start with:
|
|
160
|
+
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
161
|
+
- `specfact govern ...`
|
|
162
|
+
- CI validation flows that keep the same rules active outside local development
|
|
163
|
+
|
|
164
|
+
## How do I get started if I want more?
|
|
165
|
+
|
|
166
|
+
**Next steps**
|
|
167
|
+
|
|
168
|
+
- **[Core CLI docs](docs/index.md)** for the core runtime, bootstrap, validation, and command topology
|
|
169
|
+
- **[Reference: command topology](docs/reference/commands.md)** for grouped command surfaces
|
|
170
|
+
- **[Canonical modules docs site](https://modules.specfact.io/)** for bundle-deep workflows
|
|
171
|
+
|
|
172
|
+
## Documentation Topology
|
|
173
|
+
|
|
174
|
+
`docs.specfact.io` is the canonical starting point for SpecFact.
|
|
175
|
+
|
|
176
|
+
- Core CLI/runtime/platform documentation remains owned by `specfact-cli`.
|
|
177
|
+
- Module-specific deep docs are canonically owned by `specfact-cli-modules`.
|
|
178
|
+
- The live modules docs site is published at `https://modules.specfact.io/`.
|
|
179
|
+
|
|
180
|
+
Use this repository's docs for the overall product story, runtime lifecycle, command topology,
|
|
181
|
+
trust model, and getting-started flow. Use the modules docs site when you want deeper workflow,
|
|
182
|
+
adapter, and module-authoring guidance.
|
|
183
|
+
|
|
80
184
|
### Migration Note (Flat Commands Removed)
|
|
81
185
|
|
|
82
186
|
As of `0.40.0`, flat root commands are removed. Use grouped commands:
|
|
@@ -116,12 +220,6 @@ For GitHub, replace adapter/org/project with:
|
|
|
116
220
|
/specfact.01-import my-project --repo .
|
|
117
221
|
```
|
|
118
222
|
|
|
119
|
-
**Next steps**
|
|
120
|
-
|
|
121
|
-
- **[Core CLI docs](docs/index.md)**
|
|
122
|
-
- **[Reference: command topology](docs/reference/commands.md)**
|
|
123
|
-
- **[Canonical modules docs site](https://modules.specfact.io/)**
|
|
124
|
-
|
|
125
223
|
---
|
|
126
224
|
|
|
127
225
|
## Who It Is For
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specfact-cli"
|
|
7
|
-
version = "0.43.
|
|
7
|
+
version = "0.43.3"
|
|
8
8
|
description = "The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with validation and contract enforcement for new projects and long-lived codebases."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -220,7 +220,8 @@ yaml-check-all = "bash scripts/yaml-tools.sh check-all {args}"
|
|
|
220
220
|
# Docs validation (docs-12): command examples vs CLI; modules.specfact.io URLs in docs
|
|
221
221
|
check-docs-commands = "python scripts/check-docs-commands.py"
|
|
222
222
|
check-cross-site-links = "python scripts/check-cross-site-links.py"
|
|
223
|
-
|
|
223
|
+
doc-frontmatter-check = "python scripts/check_doc_frontmatter.py"
|
|
224
|
+
docs-validate = "python scripts/check-docs-commands.py && python scripts/check-cross-site-links.py --warn-only && python scripts/check_doc_frontmatter.py"
|
|
224
225
|
|
|
225
226
|
# Legacy entry (kept for compatibility); prefer `workflows-lint` above
|
|
226
227
|
lint-workflows = "bash scripts/run_actionlint.sh {args}"
|
|
@@ -718,6 +719,14 @@ ignore = [
|
|
|
718
719
|
"SLF001", # private member accessed
|
|
719
720
|
]
|
|
720
721
|
|
|
722
|
+
"tests/unit/tools/test_smart_test_coverage.py" = [
|
|
723
|
+
"E402", # imports after sys.path bootstrap for tool harness loading
|
|
724
|
+
]
|
|
725
|
+
|
|
726
|
+
"tests/unit/tools/test_smart_test_coverage_enhanced.py" = [
|
|
727
|
+
"E402", # imports after sys.path bootstrap for tool harness loading
|
|
728
|
+
]
|
|
729
|
+
|
|
721
730
|
# Tools and scripts can be more lenient
|
|
722
731
|
"tools/**/*" = [
|
|
723
732
|
"T20", # print found
|
|
@@ -6,6 +6,9 @@ This package provides command-line tools for:
|
|
|
6
6
|
- Keeping backlog, specs, tests, and code in sync
|
|
7
7
|
- Enforcing validation and contract checks before production
|
|
8
8
|
- Supporting agile ceremonies and team workflows
|
|
9
|
+
|
|
10
|
+
When a sibling ``specfact-cli-modules`` checkout exists, startup prepends each bundle's ``src``
|
|
11
|
+
to ``sys.path`` so local development can load marketplace packages without installing wheels.
|
|
9
12
|
"""
|
|
10
13
|
|
|
11
14
|
from __future__ import annotations
|
|
@@ -42,6 +45,6 @@ def _bootstrap_bundle_paths() -> None:
|
|
|
42
45
|
|
|
43
46
|
_bootstrap_bundle_paths()
|
|
44
47
|
|
|
45
|
-
__version__ = "0.43.
|
|
48
|
+
__version__ = "0.43.3"
|
|
46
49
|
|
|
47
50
|
__all__ = ["__version__"]
|
|
@@ -30,9 +30,18 @@ _COMMON_WORD_TOKENS = frozenset(
|
|
|
30
30
|
)
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
def _contains_disallowed_control_chars(text: str) -> bool:
|
|
34
|
+
"""Return whether text contains control characters beyond normal whitespace."""
|
|
35
|
+
|
|
36
|
+
return any(ord(char) < 32 and char not in "\n\r\t" for char in text)
|
|
37
|
+
|
|
38
|
+
|
|
33
39
|
def _code_pattern_match_is_meaningful(pattern: str, acceptance: str) -> bool:
|
|
34
40
|
"""Return True if regex matches are not only common English words."""
|
|
35
|
-
|
|
41
|
+
try:
|
|
42
|
+
matches = re.findall(pattern, acceptance, re.IGNORECASE)
|
|
43
|
+
except re.error:
|
|
44
|
+
return False
|
|
36
45
|
if isinstance(matches, list):
|
|
37
46
|
actual = [m for m in matches if isinstance(m, str) and m.lower() not in _COMMON_WORD_TOKENS]
|
|
38
47
|
else:
|
|
@@ -61,6 +70,8 @@ def is_simplified_format_criteria(acceptance: str) -> bool:
|
|
|
61
70
|
Returns:
|
|
62
71
|
True if criteria use the simplified format, False otherwise
|
|
63
72
|
"""
|
|
73
|
+
if _contains_disallowed_control_chars(acceptance):
|
|
74
|
+
return False
|
|
64
75
|
acceptance_lower = acceptance.lower()
|
|
65
76
|
|
|
66
77
|
# Pattern: "Must verify ... works correctly (see contract examples)"
|
|
@@ -73,7 +84,13 @@ def is_simplified_format_criteria(acceptance: str) -> bool:
|
|
|
73
84
|
r"check.*works\s+correctly.*\(see\s+contract",
|
|
74
85
|
]
|
|
75
86
|
|
|
76
|
-
|
|
87
|
+
for pattern in simplified_patterns:
|
|
88
|
+
try:
|
|
89
|
+
if re.search(pattern, acceptance_lower):
|
|
90
|
+
return True
|
|
91
|
+
except re.error:
|
|
92
|
+
return False
|
|
93
|
+
return False
|
|
77
94
|
|
|
78
95
|
|
|
79
96
|
@beartype
|
|
@@ -97,6 +114,8 @@ def is_code_specific_criteria(acceptance: str) -> bool:
|
|
|
97
114
|
Returns:
|
|
98
115
|
True if criteria are code-specific, False if vague/generic
|
|
99
116
|
"""
|
|
117
|
+
if _contains_disallowed_control_chars(acceptance):
|
|
118
|
+
return False
|
|
100
119
|
acceptance_lower = acceptance.lower()
|
|
101
120
|
|
|
102
121
|
# FIRST: Check for generic placeholders that indicate non-code-specific
|
|
@@ -123,8 +142,12 @@ def is_code_specific_criteria(acceptance: str) -> bool:
|
|
|
123
142
|
r"\bis\s+complete\b",
|
|
124
143
|
r"\bis\s+ready\b",
|
|
125
144
|
]
|
|
126
|
-
|
|
127
|
-
|
|
145
|
+
for pattern in vague_patterns:
|
|
146
|
+
try:
|
|
147
|
+
if re.search(pattern, acceptance_lower):
|
|
148
|
+
return False # Not code-specific, should be enriched
|
|
149
|
+
except re.error:
|
|
150
|
+
return False
|
|
128
151
|
|
|
129
152
|
# THIRD: Check for code-specific indicators
|
|
130
153
|
code_specific_patterns = [
|
|
@@ -161,7 +184,11 @@ def is_code_specific_criteria(acceptance: str) -> bool:
|
|
|
161
184
|
]
|
|
162
185
|
|
|
163
186
|
for pattern in code_specific_patterns:
|
|
164
|
-
|
|
187
|
+
try:
|
|
188
|
+
matched = re.search(pattern, acceptance, re.IGNORECASE)
|
|
189
|
+
except re.error:
|
|
190
|
+
return False
|
|
191
|
+
if matched and _code_pattern_match_is_meaningful(pattern, acceptance):
|
|
165
192
|
return True
|
|
166
193
|
|
|
167
194
|
return False
|