specfact-cli 0.43.2__tar.gz → 0.44.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.43.2 → specfact_cli-0.44.0}/PKG-INFO +131 -37
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/README.md +130 -36
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/pyproject.toml +1 -1
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/__init__.py +1 -1
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/__init__.py +1 -1
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/speckit.py +1 -1
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/analyze_agent.py +1 -1
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +3 -3
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/code_analyzer.py +2 -2
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/contract_extractor.py +3 -3
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/graph_analyzer.py +2 -2
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/relationship_mapper.py +2 -2
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/logger_setup.py +2 -2
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/enrichers/constitution_enricher.py +5 -5
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/persona_exporter.py +2 -2
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/_bundle_import.py +7 -3
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/init/module-package.yaml +3 -3
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/init/src/commands.py +0 -50
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/module_io_shim.py +0 -4
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/bootstrap.py +1 -1
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_packages.py +0 -19
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync.py +4 -4
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/spec_to_code.py +1 -1
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/acceptance_criteria.py +32 -5
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/context_detection.py +2 -2
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/enrichment_parser.py +72 -25
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/optional_deps.py +9 -1
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/progress.py +3 -3
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -16
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/source_scanner.py +2 -2
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/structure.py +2 -2
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +1 -1
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/orchestrator.py +1 -1
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/.gitignore +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/LICENSE +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/keys/README.md +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/keys/module-signing-public.pem +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/persona/architect.md.j2 +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/persona/developer.md.j2 +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/persona/product-owner.md.j2 +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/policies/kanban.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/policies/mixed.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/policies/safe.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/policies/scrum.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/pr-template.md.j2 +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/__main__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/ado.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/base.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/github.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/openspec.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/openspec_parser.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/adapters/registry.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/converter.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/filters.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/cli.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/_bundle_shim.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/analyze.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/contract_cmd.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/drift.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/enforce.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/generate.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/import_cmd.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/init.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/migrate.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/plan.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/project_cmd.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/repro.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/sdd.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/spec.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/sync.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/update.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/commands/validate.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/bundle_factory.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/logging_utils.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/contracts/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/contracts/module_interface.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/contract_generator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/openapi_extractor.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/test_to_openapi.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/codebase_group.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/govern_group.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/member_group.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/project_group.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/groups/spec_group.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/merge/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/merge/resolver.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/backlog_item.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/capabilities.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/change.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/contract.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/dor_config.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/module_package.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/persona_template.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/plan.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/project.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/models/validation.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/init/src/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/init/src/app.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/module_registry/module-package.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/module_registry/src/commands.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/parsers/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/parsers/persona_importer.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/alias_manager.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/bridge_registry.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/crypto_validator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/custom_registries.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/dependency_resolver.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/extension_registry.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/help_cache.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/marketplace_client.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/metadata.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_discovery.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_grouping.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_installer.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_lifecycle.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_security.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/module_state.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/registry/registry.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/runtime.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_openspec_md_parse.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_requirement_from_proposal.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_requirement_helpers.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_tasks_from_proposal.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_what_changes_format.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_sync_write_openspec_from_proposal.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/bridge_watch.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/registry.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/bundle_converters.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/contract_predicates.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/env_manager.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/git.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/icontract_helpers.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/ide_setup.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/metadata.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/persona_ownership.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/startup_checks.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/suggestions.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/terminal.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validation/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validation/command_audit.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/agile_validation.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/cli_first_validator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/contract_validator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/schema.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/versioning/__init__.py +0 -0
- {specfact_cli-0.43.2 → specfact_cli-0.44.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.44.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
|
|
@@ -281,9 +281,10 @@ 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
|
|
|
@@ -304,21 +305,54 @@ invoke SpecFact as part of a command chain.
|
|
|
304
305
|
|
|
305
306
|
---
|
|
306
307
|
|
|
307
|
-
##
|
|
308
|
+
## What is SpecFact?
|
|
308
309
|
|
|
309
|
-
|
|
310
|
+
SpecFact is the validation and alignment layer for software delivery.
|
|
310
311
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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.
|
|
314
316
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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
|
|
318
322
|
|
|
319
|
-
|
|
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?
|
|
336
|
+
|
|
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
|
|
320
343
|
|
|
321
|
-
##
|
|
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)
|
|
322
356
|
|
|
323
357
|
### Install
|
|
324
358
|
|
|
@@ -330,38 +364,104 @@ uvx specfact-cli@latest
|
|
|
330
364
|
pip install -U specfact-cli
|
|
331
365
|
```
|
|
332
366
|
|
|
333
|
-
### Bootstrap
|
|
367
|
+
### Bootstrap
|
|
334
368
|
|
|
335
369
|
```bash
|
|
336
|
-
#
|
|
370
|
+
# Recommended first run
|
|
337
371
|
specfact init --profile solo-developer
|
|
338
|
-
|
|
339
|
-
# Alternative bundle selection
|
|
340
|
-
specfact init --install backlog,codebase
|
|
341
|
-
specfact init --install all
|
|
342
|
-
|
|
343
|
-
# IDE prompt/template setup
|
|
344
|
-
specfact init ide
|
|
345
|
-
specfact init ide --ide cursor
|
|
346
|
-
specfact init ide --ide vscode
|
|
347
372
|
```
|
|
348
373
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
### Run Your First Flow
|
|
374
|
+
### Get First Value
|
|
352
375
|
|
|
353
376
|
```bash
|
|
354
|
-
# Analyze
|
|
377
|
+
# Analyze a codebase you care about
|
|
355
378
|
specfact code import my-project --repo .
|
|
356
379
|
|
|
357
|
-
# Snapshot
|
|
380
|
+
# Snapshot the project state for follow-up workflows
|
|
358
381
|
specfact project snapshot --bundle my-project
|
|
359
382
|
|
|
360
|
-
# Validate external code without modifying
|
|
383
|
+
# Validate external code without modifying the target repo
|
|
361
384
|
specfact code validate sidecar init my-project /path/to/repo
|
|
362
385
|
specfact code validate sidecar run my-project /path/to/repo
|
|
363
386
|
```
|
|
364
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
|
+
|
|
365
465
|
### Migration Note (Flat Commands Removed)
|
|
366
466
|
|
|
367
467
|
As of `0.40.0`, flat root commands are removed. Use grouped commands:
|
|
@@ -401,12 +501,6 @@ For GitHub, replace adapter/org/project with:
|
|
|
401
501
|
/specfact.01-import my-project --repo .
|
|
402
502
|
```
|
|
403
503
|
|
|
404
|
-
**Next steps**
|
|
405
|
-
|
|
406
|
-
- **[Core CLI docs](docs/index.md)**
|
|
407
|
-
- **[Reference: command topology](docs/reference/commands.md)**
|
|
408
|
-
- **[Canonical modules docs site](https://modules.specfact.io/)**
|
|
409
|
-
|
|
410
504
|
---
|
|
411
505
|
|
|
412
506
|
## Who It Is For
|
|
@@ -1,8 +1,9 @@
|
|
|
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
|
|
|
@@ -23,21 +24,54 @@ invoke SpecFact as part of a command chain.
|
|
|
23
24
|
|
|
24
25
|
---
|
|
25
26
|
|
|
26
|
-
##
|
|
27
|
+
## What is SpecFact?
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
SpecFact is the validation and alignment layer for software delivery.
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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.
|
|
33
35
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
37
41
|
|
|
38
|
-
|
|
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?
|
|
55
|
+
|
|
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
|
|
39
62
|
|
|
40
|
-
##
|
|
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)
|
|
41
75
|
|
|
42
76
|
### Install
|
|
43
77
|
|
|
@@ -49,38 +83,104 @@ uvx specfact-cli@latest
|
|
|
49
83
|
pip install -U specfact-cli
|
|
50
84
|
```
|
|
51
85
|
|
|
52
|
-
### Bootstrap
|
|
86
|
+
### Bootstrap
|
|
53
87
|
|
|
54
88
|
```bash
|
|
55
|
-
#
|
|
89
|
+
# Recommended first run
|
|
56
90
|
specfact init --profile solo-developer
|
|
57
|
-
|
|
58
|
-
# Alternative bundle selection
|
|
59
|
-
specfact init --install backlog,codebase
|
|
60
|
-
specfact init --install all
|
|
61
|
-
|
|
62
|
-
# IDE prompt/template setup
|
|
63
|
-
specfact init ide
|
|
64
|
-
specfact init ide --ide cursor
|
|
65
|
-
specfact init ide --ide vscode
|
|
66
91
|
```
|
|
67
92
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
### Run Your First Flow
|
|
93
|
+
### Get First Value
|
|
71
94
|
|
|
72
95
|
```bash
|
|
73
|
-
# Analyze
|
|
96
|
+
# Analyze a codebase you care about
|
|
74
97
|
specfact code import my-project --repo .
|
|
75
98
|
|
|
76
|
-
# Snapshot
|
|
99
|
+
# Snapshot the project state for follow-up workflows
|
|
77
100
|
specfact project snapshot --bundle my-project
|
|
78
101
|
|
|
79
|
-
# Validate external code without modifying
|
|
102
|
+
# Validate external code without modifying the target repo
|
|
80
103
|
specfact code validate sidecar init my-project /path/to/repo
|
|
81
104
|
specfact code validate sidecar run my-project /path/to/repo
|
|
82
105
|
```
|
|
83
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
|
+
|
|
84
184
|
### Migration Note (Flat Commands Removed)
|
|
85
185
|
|
|
86
186
|
As of `0.40.0`, flat root commands are removed. Use grouped commands:
|
|
@@ -120,12 +220,6 @@ For GitHub, replace adapter/org/project with:
|
|
|
120
220
|
/specfact.01-import my-project --repo .
|
|
121
221
|
```
|
|
122
222
|
|
|
123
|
-
**Next steps**
|
|
124
|
-
|
|
125
|
-
- **[Core CLI docs](docs/index.md)**
|
|
126
|
-
- **[Reference: command topology](docs/reference/commands.md)**
|
|
127
|
-
- **[Canonical modules docs site](https://modules.specfact.io/)**
|
|
128
|
-
|
|
129
223
|
---
|
|
130
224
|
|
|
131
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.
|
|
7
|
+
version = "0.44.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"
|
|
@@ -426,7 +426,7 @@ class SpecKitAdapter(BridgeAdapter):
|
|
|
426
426
|
)
|
|
427
427
|
if title_match:
|
|
428
428
|
feature_title = title_match.group(1).strip()
|
|
429
|
-
except
|
|
429
|
+
except (OSError, UnicodeDecodeError):
|
|
430
430
|
pass
|
|
431
431
|
if not feature_title or feature_title.strip() == "":
|
|
432
432
|
return "Unknown Feature"
|
|
@@ -262,7 +262,7 @@ Focus on semantic understanding, not just structural parsing. Generate the plan
|
|
|
262
262
|
try:
|
|
263
263
|
content = dep_file.read_text(encoding="utf-8")[:500]
|
|
264
264
|
dependencies.append(f"{dep_file.name}: {content[:100]}...")
|
|
265
|
-
except
|
|
265
|
+
except (OSError, UnicodeDecodeError):
|
|
266
266
|
pass
|
|
267
267
|
return dependencies
|
|
268
268
|
|
|
@@ -772,7 +772,7 @@ class AmbiguityScanner:
|
|
|
772
772
|
continue
|
|
773
773
|
if user_clean and len(user_clean) > 2 and user_lower not in excluded and len(user_clean.split()) <= 3:
|
|
774
774
|
result.add(user_clean.title())
|
|
775
|
-
except
|
|
775
|
+
except (OSError, UnicodeDecodeError, re.error):
|
|
776
776
|
pass
|
|
777
777
|
return result
|
|
778
778
|
|
|
@@ -898,9 +898,9 @@ class AmbiguityScanner:
|
|
|
898
898
|
continue
|
|
899
899
|
try:
|
|
900
900
|
self._personas_from_py_file(py_file, result, excluded)
|
|
901
|
-
except
|
|
901
|
+
except (OSError, UnicodeDecodeError, re.error):
|
|
902
902
|
continue
|
|
903
|
-
except
|
|
903
|
+
except (OSError, UnicodeDecodeError, re.error):
|
|
904
904
|
pass
|
|
905
905
|
return result
|
|
906
906
|
|
|
@@ -1794,14 +1794,14 @@ class CodeAnalyzer:
|
|
|
1794
1794
|
for commit in commits:
|
|
1795
1795
|
try:
|
|
1796
1796
|
self._process_commit_for_feature_bounds(commit)
|
|
1797
|
-
except
|
|
1797
|
+
except (OSError, ValueError):
|
|
1798
1798
|
# Skip individual commits that fail (corrupted, etc.)
|
|
1799
1799
|
continue
|
|
1800
1800
|
|
|
1801
1801
|
except ImportError:
|
|
1802
1802
|
# GitPython not available, skip
|
|
1803
1803
|
pass
|
|
1804
|
-
except
|
|
1804
|
+
except OSError:
|
|
1805
1805
|
# Git operations failed, skip gracefully
|
|
1806
1806
|
pass
|
|
1807
1807
|
|
{specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/contract_extractor.py
RENAMED
|
@@ -240,7 +240,7 @@ class ContractExtractor:
|
|
|
240
240
|
if hasattr(ast, "unparse"):
|
|
241
241
|
try:
|
|
242
242
|
return ast.unparse(node)
|
|
243
|
-
except
|
|
243
|
+
except (ValueError, TypeError):
|
|
244
244
|
pass
|
|
245
245
|
|
|
246
246
|
# Fallback: manual conversion
|
|
@@ -282,7 +282,7 @@ class ContractExtractor:
|
|
|
282
282
|
if hasattr(ast, "unparse"):
|
|
283
283
|
try:
|
|
284
284
|
return ast.unparse(node)
|
|
285
|
-
except
|
|
285
|
+
except (ValueError, TypeError):
|
|
286
286
|
pass
|
|
287
287
|
|
|
288
288
|
return "..."
|
|
@@ -295,7 +295,7 @@ class ContractExtractor:
|
|
|
295
295
|
if hasattr(ast, "unparse"):
|
|
296
296
|
try:
|
|
297
297
|
return ast.unparse(node)
|
|
298
|
-
except
|
|
298
|
+
except (ValueError, TypeError):
|
|
299
299
|
pass
|
|
300
300
|
|
|
301
301
|
# Fallback: basic conversion
|
|
@@ -178,7 +178,7 @@ class GraphAnalyzer:
|
|
|
178
178
|
edges = future.result()
|
|
179
179
|
for module_name, matching_module in edges:
|
|
180
180
|
graph.add_edge(module_name, matching_module)
|
|
181
|
-
except
|
|
181
|
+
except (OSError, RuntimeError):
|
|
182
182
|
pass
|
|
183
183
|
completed += 1
|
|
184
184
|
if progress_callback:
|
|
@@ -211,7 +211,7 @@ class GraphAnalyzer:
|
|
|
211
211
|
callee_module = self._resolve_module_from_function(callee, python_files)
|
|
212
212
|
if callee_module and callee_module in graph:
|
|
213
213
|
graph.add_edge(module_name, callee_module)
|
|
214
|
-
except
|
|
214
|
+
except (OSError, RuntimeError):
|
|
215
215
|
pass
|
|
216
216
|
completed += 1
|
|
217
217
|
if progress_callback:
|
{specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/analyzers/relationship_mapper.py
RENAMED
|
@@ -306,7 +306,7 @@ class RelationshipMapper:
|
|
|
306
306
|
if file_hash:
|
|
307
307
|
self.analysis_cache[file_hash] = empty_result
|
|
308
308
|
return (file_key, empty_result)
|
|
309
|
-
except
|
|
309
|
+
except (OSError, PermissionError):
|
|
310
310
|
pass
|
|
311
311
|
|
|
312
312
|
try:
|
|
@@ -354,7 +354,7 @@ class RelationshipMapper:
|
|
|
354
354
|
if not f.done():
|
|
355
355
|
f.cancel()
|
|
356
356
|
raise
|
|
357
|
-
except
|
|
357
|
+
except (OSError, ValueError):
|
|
358
358
|
pass
|
|
359
359
|
completed_count += 1
|
|
360
360
|
if progress_callback:
|
|
@@ -426,11 +426,11 @@ class LoggerSetup:
|
|
|
426
426
|
log_file_path = os.path.join(logs_dir, log_file)
|
|
427
427
|
|
|
428
428
|
log_file_dir = os.path.dirname(log_file_path)
|
|
429
|
-
os.makedirs(log_file_dir, mode=
|
|
429
|
+
os.makedirs(log_file_dir, mode=0o755, exist_ok=True)
|
|
430
430
|
try:
|
|
431
431
|
with open(log_file_path, "a", encoding="utf-8"):
|
|
432
432
|
pass
|
|
433
|
-
except
|
|
433
|
+
except OSError:
|
|
434
434
|
pass
|
|
435
435
|
|
|
436
436
|
try:
|
{specfact_cli-0.43.2 → specfact_cli-0.44.0}/src/specfact_cli/enrichers/constitution_enricher.py
RENAMED
|
@@ -145,7 +145,7 @@ class ConstitutionEnricher:
|
|
|
145
145
|
# Simple dependency name without version constraints
|
|
146
146
|
result["technology_stack"].append(dep)
|
|
147
147
|
|
|
148
|
-
except
|
|
148
|
+
except (OSError, UnicodeDecodeError, ValueError):
|
|
149
149
|
pass # If parsing fails, return empty result
|
|
150
150
|
|
|
151
151
|
return result
|
|
@@ -190,7 +190,7 @@ class ConstitutionEnricher:
|
|
|
190
190
|
else:
|
|
191
191
|
result["technology_stack"].append(dep)
|
|
192
192
|
|
|
193
|
-
except
|
|
193
|
+
except (OSError, UnicodeDecodeError, ValueError):
|
|
194
194
|
pass
|
|
195
195
|
|
|
196
196
|
return result
|
|
@@ -235,7 +235,7 @@ class ConstitutionEnricher:
|
|
|
235
235
|
users = [u.strip() for u in re.split(r"[,;]", users_text)]
|
|
236
236
|
result["target_users"] = users[:5]
|
|
237
237
|
|
|
238
|
-
except
|
|
238
|
+
except (OSError, UnicodeDecodeError, ValueError):
|
|
239
239
|
pass
|
|
240
240
|
|
|
241
241
|
return result
|
|
@@ -265,7 +265,7 @@ class ConstitutionEnricher:
|
|
|
265
265
|
# Extract principles from headings and key sections
|
|
266
266
|
extracted = self._extract_principles_from_markdown(content, rule_file)
|
|
267
267
|
principles.extend(extracted)
|
|
268
|
-
except
|
|
268
|
+
except (OSError, UnicodeDecodeError, ValueError):
|
|
269
269
|
pass
|
|
270
270
|
|
|
271
271
|
return principles
|
|
@@ -293,7 +293,7 @@ class ConstitutionEnricher:
|
|
|
293
293
|
# Extract quality standards
|
|
294
294
|
extracted = self._extract_quality_standards(content)
|
|
295
295
|
standards.extend(extracted)
|
|
296
|
-
except
|
|
296
|
+
except (OSError, UnicodeDecodeError, ValueError):
|
|
297
297
|
pass
|
|
298
298
|
|
|
299
299
|
return standards
|
|
@@ -242,7 +242,7 @@ class PersonaExporter:
|
|
|
242
242
|
protocol_data = load_structured_file(protocol_file)
|
|
243
243
|
protocol_name = protocol_file.stem.replace(".protocol", "")
|
|
244
244
|
protocols[protocol_name] = protocol_data
|
|
245
|
-
except
|
|
245
|
+
except (OSError, ValueError):
|
|
246
246
|
pass
|
|
247
247
|
return protocols
|
|
248
248
|
|
|
@@ -267,7 +267,7 @@ class PersonaExporter:
|
|
|
267
267
|
contract_data = load_structured_file(contract_file)
|
|
268
268
|
contract_name = contract_file.stem.replace(".openapi", "").replace(".asyncapi", "")
|
|
269
269
|
contracts[contract_name] = contract_data
|
|
270
|
-
except
|
|
270
|
+
except (OSError, ValueError):
|
|
271
271
|
pass
|
|
272
272
|
return contracts
|
|
273
273
|
|