specfact-cli 0.45.1__tar.gz → 0.46.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.45.1 → specfact_cli-0.46.0}/PKG-INFO +90 -252
- specfact_cli-0.46.0/README.md +166 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/pyproject.toml +11 -6
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/__init__.py +1 -1
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/__init__.py +1 -1
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/adapters/ado.py +122 -141
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/adapters/github.py +118 -79
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/adapters/openspec_parser.py +13 -15
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/adapters/speckit.py +76 -38
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +17 -24
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/code_analyzer.py +113 -100
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/graph_analyzer.py +26 -5
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/common/logger_setup.py +62 -34
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/common/logging_utils.py +3 -2
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/generators/contract_generator.py +23 -25
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/generators/openapi_extractor.py +57 -54
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/generators/persona_exporter.py +29 -16
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/generators/test_to_openapi.py +34 -26
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/project.py +33 -27
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/init/module-package.yaml +3 -3
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/init/src/first_run_selection.py +6 -3
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/module_registry/module-package.yaml +3 -3
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/module_registry/src/commands.py +12 -9
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_installer.py +59 -43
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/__init__.py +2 -1
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync.py +816 -765
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_watch.py +19 -23
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/contract_predicates.py +21 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/ide_setup.py +53 -58
- specfact_cli-0.46.0/src/specfact_cli/utils/project_artifact_write.py +254 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/source_scanner.py +74 -124
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/cli_first_validator.py +16 -14
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/contract_validator.py +13 -37
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +28 -20
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +21 -8
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +21 -16
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/orchestrator.py +11 -9
- specfact_cli-0.45.1/README.md +0 -329
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/.gitignore +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/LICENSE +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/keys/README.md +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/keys/module-signing-public.pem +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/persona/architect.md.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/persona/developer.md.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/persona/product-owner.md.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/policies/kanban.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/policies/mixed.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/policies/safe.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/policies/scrum.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/pr-template.md.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/__main__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/adapters/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/adapters/base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/adapters/openspec.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/adapters/registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/agents/analyze_agent.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/backlog/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/backlog/converter.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/backlog/filters.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/cli.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/_bundle_shim.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/analyze.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/contract_cmd.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/drift.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/enforce.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/generate.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/import_cmd.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/init.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/migrate.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/plan.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/project_cmd.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/repro.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/sdd.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/spec.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/sync.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/update.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/commands/validate.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/common/bundle_factory.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/contracts/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/contracts/module_interface.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/groups/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/groups/codebase_group.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/groups/govern_group.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/groups/member_group.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/groups/project_group.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/groups/spec_group.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/merge/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/merge/resolver.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/backlog_item.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/capabilities.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/change.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/contract.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/dor_config.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/module_package.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/persona_template.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/plan.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/models/validation.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/_bundle_import.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/init/src/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/init/src/app.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/init/src/commands.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/module_io_shim.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/parsers/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/parsers/persona_importer.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/alias_manager.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/bootstrap.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/bridge_registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/crypto_validator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/custom_registries.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/dependency_resolver.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/extension_registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/help_cache.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/marketplace_client.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/metadata.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_discovery.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_grouping.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_lifecycle.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_packages.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_security.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_state.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/registry/registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/runtime.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_openspec_md_parse.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_requirement_from_proposal.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_requirement_helpers.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_tasks_from_proposal.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_what_changes_format.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_write_openspec_from_proposal.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/spec_to_code.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/templates/registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/bundle_converters.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/context_detection.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/enrichment_parser.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/env_manager.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/git.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/icontract_helpers.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/metadata.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/optional_deps.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/persona_ownership.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/progress.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/startup_checks.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/structure.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/suggestions.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/terminal.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validation/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validation/command_audit.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/agile_validation.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/schema.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.0}/src/specfact_cli/versioning/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.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.46.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
|
|
@@ -229,6 +229,7 @@ Requires-Dist: gitpython>=3.1.45
|
|
|
229
229
|
Requires-Dist: graphviz>=0.20.1
|
|
230
230
|
Requires-Dist: icontract>=2.7.1
|
|
231
231
|
Requires-Dist: jinja2>=3.1.6
|
|
232
|
+
Requires-Dist: json5>=0.9.28
|
|
232
233
|
Requires-Dist: jsonschema>=4.23.0
|
|
233
234
|
Requires-Dist: networkx>=3.4.2
|
|
234
235
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27.0
|
|
@@ -266,7 +267,7 @@ Requires-Dist: pytest>=8.4.2; extra == 'dev'
|
|
|
266
267
|
Requires-Dist: radon>=6.0.1; extra == 'dev'
|
|
267
268
|
Requires-Dist: ruff>=0.14.2; extra == 'dev'
|
|
268
269
|
Requires-Dist: semgrep>=1.144.0; extra == 'dev'
|
|
269
|
-
Requires-Dist: setuptools
|
|
270
|
+
Requires-Dist: setuptools<82,>=69.0.0; extra == 'dev'
|
|
270
271
|
Requires-Dist: tomlkit>=0.13.3; extra == 'dev'
|
|
271
272
|
Requires-Dist: types-pyyaml>=6.0.12.20250516; extra == 'dev'
|
|
272
273
|
Provides-Extra: enhanced-analysis
|
|
@@ -280,295 +281,133 @@ Description-Content-Type: text/markdown
|
|
|
280
281
|
|
|
281
282
|
# SpecFact CLI
|
|
282
283
|
|
|
283
|
-
>
|
|
284
|
-
>
|
|
285
|
-
> from drifting apart across AI-assisted coding, brownfield systems, and governed delivery.
|
|
286
|
-
> Use it to move fast without losing rigor.
|
|
287
|
-
|
|
288
|
-
**No API keys required. Works offline. Zero vendor lock-in.**
|
|
289
|
-
|
|
290
|
-
SpecFact CLI does **not** include built-in AI. It is a deterministic local CLI
|
|
291
|
-
that can be paired with IDE slash-command prompts so your chosen AI copilot can
|
|
292
|
-
invoke SpecFact as part of a command chain.
|
|
284
|
+
> Review AI-assisted code against your own contracts.
|
|
285
|
+
> Catch drift before it reaches PR or main.
|
|
293
286
|
|
|
294
287
|
[](https://pypi.org/project/specfact-cli/)
|
|
295
288
|
[](https://pypi.org/project/specfact-cli/)
|
|
296
289
|
[](LICENSE)
|
|
297
290
|
[](https://github.com/nold-ai/specfact-cli)
|
|
298
291
|
|
|
292
|
+
**No API keys required. Works offline. Zero vendor lock-in.**
|
|
293
|
+
|
|
299
294
|
<div align="center">
|
|
300
295
|
|
|
301
|
-
**[
|
|
296
|
+
**[Documentation](https://docs.specfact.io/)** • **[Modules](https://modules.specfact.io/)** • **[Support](mailto:hello@noldai.com)**
|
|
302
297
|
|
|
303
298
|
</div>
|
|
304
299
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
## What is SpecFact?
|
|
308
|
-
|
|
309
|
-
SpecFact is the validation and alignment layer for software delivery.
|
|
310
|
-
|
|
311
|
-
It is a local CLI that helps you keep the intent behind a change aligned from
|
|
312
|
-
backlog or idea through specifications, implementation, and checks. The “Swiss-knife CLI” metaphor
|
|
313
|
-
fits because SpecFact gives you a set of focused tools for specific delivery problems, not a vague
|
|
314
|
-
bag of features.
|
|
315
|
-
|
|
316
|
-
In practice, SpecFact helps you:
|
|
317
|
-
- add guardrails to AI-assisted and fast-moving greenfield work
|
|
318
|
-
- reverse-engineer large brownfield codebases into trustworthy structured understanding
|
|
319
|
-
- reduce the “I wanted X but got Y” drift between backlog, spec, and implementation
|
|
320
|
-
- move from local rigor toward team and enterprise policy enforcement
|
|
321
|
-
|
|
322
|
-
## Why does it exist?
|
|
323
|
-
|
|
324
|
-
Modern delivery drifts in predictable ways:
|
|
325
|
-
- AI-generated quick wins often lack the validation layer needed for mid- and long-term reliability
|
|
326
|
-
- brownfield systems often have missing or drifted specs, so teams need to reverse-engineer reality
|
|
327
|
-
- backlog intent gets reinterpreted into something else before it reaches code
|
|
328
|
-
- teams working with different skill levels, opinions, and AI IDE setups need consistent review and
|
|
329
|
-
policy enforcement
|
|
330
|
-
|
|
331
|
-
SpecFact exists to reduce that drift. It helps teams understand what is really there, express what
|
|
332
|
-
should happen more accurately, and validate that the result still matches the original intent.
|
|
333
|
-
|
|
334
|
-
## Why should I use it?
|
|
335
|
-
|
|
336
|
-
Use SpecFact if you want one of these outcomes:
|
|
337
|
-
- ship AI-assisted changes faster without accepting fragile “looks fine to me” quality
|
|
338
|
-
- understand a legacy or unfamiliar codebase before changing it
|
|
339
|
-
- hand brownfield insight into OpenSpec, Spec-Kit, or other spec-first workflows
|
|
340
|
-
- keep backlog expectations, specifications, and implementation from silently diverging
|
|
341
|
-
- enforce shared rules consistently across developers and CI/CD
|
|
342
|
-
|
|
343
|
-
## What do I get?
|
|
344
|
-
|
|
345
|
-
With SpecFact, you get:
|
|
346
|
-
- a deterministic local CLI instead of another opaque SaaS dependency
|
|
347
|
-
- a validation layer around fast-moving implementation work
|
|
348
|
-
- codebase analysis and sidecar flows for brownfield understanding
|
|
349
|
-
- stronger backlog/spec/code alignment for real delivery workflows
|
|
350
|
-
- a path from individual rigor to organization-level policy enforcement
|
|
351
|
-
|
|
352
|
-
## How do I get started?
|
|
353
|
-
|
|
354
|
-
### Start Here (about 2 minutes): scored code review — no `pip install`
|
|
355
|
-
|
|
356
|
-
**Point SpecFact at your code.** From a **git repository** (any branch), run two commands:
|
|
300
|
+
## Try it in 60 seconds
|
|
357
301
|
|
|
358
302
|
```bash
|
|
303
|
+
# Zero-install, no API key, works offline
|
|
359
304
|
uvx specfact-cli init --profile solo-developer
|
|
360
305
|
uvx specfact-cli code review run --path . --scope full
|
|
361
306
|
```
|
|
362
307
|
|
|
363
|
-
|
|
308
|
+
**Sample output:**
|
|
364
309
|
|
|
365
|
-
|
|
366
|
-
|
|
310
|
+
```text
|
|
311
|
+
SpecFact CLI - v0.46.0
|
|
367
312
|
|
|
368
|
-
|
|
313
|
+
Running Ruff checks...
|
|
314
|
+
Running Radon complexity checks...
|
|
315
|
+
Running Semgrep rules...
|
|
316
|
+
Running AST clean-code checks...
|
|
317
|
+
Running basedpyright type checks...
|
|
318
|
+
Running pylint checks...
|
|
319
|
+
Running contract checks...
|
|
320
|
+
Running targeted tests and coverage...
|
|
369
321
|
|
|
370
|
-
|
|
371
|
-
specfact init --profile solo-developer
|
|
372
|
-
specfact code review run --path . --scope full
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
**Read the canonical walkthrough:** **[Documentation — Quickstart](https://docs.specfact.io/getting-started/quickstart/)** · **[Installation](https://docs.specfact.io/getting-started/installation/)** (uvx-first, then persistent install).
|
|
322
|
+
Verdict: FAIL | CI exit: 1 | Score: 0 | Reward delta: -80
|
|
376
323
|
|
|
377
|
-
|
|
324
|
+
Findings:
|
|
325
|
+
- specfact_demo/enforcement.py:96 Cyclomatic complexity for run_enforcement is 16.
|
|
326
|
+
- specfact_demo/main.py:81 Avoid print() in source files; use structured logging instead.
|
|
327
|
+
- examples/buggy_math.py:4 Public function divide is missing @require/@ensure decorators.
|
|
378
328
|
|
|
379
|
-
|
|
380
|
-
pip install -U specfact-cli
|
|
329
|
+
Evidence bundle: docs/_support/readme-first-contact/sample-output/
|
|
381
330
|
```
|
|
382
331
|
|
|
383
|
-
|
|
332
|
+
⭐ **Star this repo if the output is useful.** Open an issue if you want the workflow adapted for your stack.
|
|
384
333
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
When you want analysis, snapshots, or sidecar validation on top of the review layer:
|
|
334
|
+
**Already installed the CLI?** Use:
|
|
388
335
|
|
|
389
336
|
```bash
|
|
390
|
-
|
|
391
|
-
specfact code
|
|
392
|
-
|
|
393
|
-
# Snapshot the project state for follow-up workflows
|
|
394
|
-
specfact project snapshot --bundle my-project
|
|
395
|
-
|
|
396
|
-
# Validate external code without modifying the target repo
|
|
397
|
-
specfact code validate sidecar init my-project /path/to/repo
|
|
398
|
-
specfact code validate sidecar run my-project /path/to/repo
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
### AI IDE setup
|
|
402
|
-
|
|
403
|
-
```bash
|
|
404
|
-
specfact init ide
|
|
405
|
-
specfact init ide --ide cursor
|
|
406
|
-
specfact init ide --ide vscode
|
|
337
|
+
specfact init --profile solo-developer
|
|
338
|
+
specfact code review run --path . --scope full
|
|
407
339
|
```
|
|
408
340
|
|
|
409
|
-
`specfact
|
|
410
|
-
your IDE. If module prompt payloads are not installed yet, the CLI uses packaged fallback resources.
|
|
411
|
-
|
|
412
|
-
## Choose Your Path
|
|
413
|
-
|
|
414
|
-
### Greenfield and AI-assisted delivery
|
|
415
|
-
|
|
416
|
-
Use SpecFact as the validation layer around fast-moving implementation work.
|
|
417
|
-
|
|
418
|
-
Start with:
|
|
419
|
-
- `uvx specfact-cli init --profile solo-developer` then `uvx specfact-cli code review run --path . --scope full` (see **Start Here** above)
|
|
420
|
-
- `specfact code validate sidecar init <bundle> /path/to/repo`
|
|
421
|
-
- `specfact code validate sidecar run <bundle> /path/to/repo`
|
|
341
|
+
The sample output comes from a pinned capture against `nold-ai/specfact-demo-repo`. Reproduce it with `docs/_support/readme-first-contact/capture-readme-output.sh`; capture metadata lives alongside the raw logs in `docs/_support/readme-first-contact/sample-output/`.
|
|
422
342
|
|
|
423
|
-
|
|
343
|
+
## What SpecFact does
|
|
424
344
|
|
|
425
|
-
|
|
426
|
-
|
|
345
|
+
- **Reviews AI-assisted changes deterministically** — compare code against contracts, clean-code rules, and policy gates
|
|
346
|
+
- **Extracts structure from existing code** — reverse-engineer brownfield repos before you change them
|
|
347
|
+
- **Blocks drift before merge** — use the same checks locally, in pre-commit, and in CI
|
|
348
|
+
- **Links backlog intent to code reality** — connect backlog, specs, validation, and implementation
|
|
349
|
+
- **Stays local-first** — no cloud account, no vendor lock-in, no built-in model dependency
|
|
427
350
|
|
|
428
|
-
|
|
429
|
-
- `specfact code import my-project --repo .`
|
|
430
|
-
- `specfact project snapshot --bundle my-project`
|
|
431
|
-
- `specfact code validate sidecar init my-project /path/to/repo`
|
|
432
|
-
- `specfact code validate sidecar run my-project /path/to/repo`
|
|
433
|
-
|
|
434
|
-
### Backlog to code alignment
|
|
435
|
-
|
|
436
|
-
Use SpecFact when the problem is not only code quality, but drift between expectations and delivery.
|
|
437
|
-
Backlog commands require a backlog-enabled profile or installed backlog bundle before the workflow
|
|
438
|
-
commands are available.
|
|
439
|
-
|
|
440
|
-
Start with:
|
|
441
|
-
- `specfact init --profile backlog-team`
|
|
442
|
-
- `specfact backlog ceremony standup ...`
|
|
443
|
-
- `specfact backlog ceremony refinement ...`
|
|
444
|
-
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
445
|
-
|
|
446
|
-
### Team and policy enforcement
|
|
447
|
-
|
|
448
|
-
Use SpecFact when multiple developers and AI IDEs need consistent checks and review behavior.
|
|
449
|
-
|
|
450
|
-
Start with:
|
|
451
|
-
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
452
|
-
- `specfact govern ...`
|
|
453
|
-
- CI validation flows that keep the same rules active outside local development
|
|
454
|
-
|
|
455
|
-
## How do I get started if I want more?
|
|
456
|
-
|
|
457
|
-
**Next steps**
|
|
458
|
-
|
|
459
|
-
- **[Core CLI docs](docs/index.md)** for the core runtime, bootstrap, validation, and command topology
|
|
460
|
-
- **[Reference: command topology](docs/reference/commands.md)** for grouped command surfaces
|
|
461
|
-
- **[Canonical modules docs site](https://modules.specfact.io/)** for bundle-deep workflows
|
|
462
|
-
|
|
463
|
-
## Documentation Topology
|
|
464
|
-
|
|
465
|
-
`docs.specfact.io` is the canonical starting point for SpecFact.
|
|
466
|
-
|
|
467
|
-
- Core CLI/runtime/platform documentation remains owned by `specfact-cli`.
|
|
468
|
-
- Module-specific deep docs are canonically owned by `specfact-cli-modules`.
|
|
469
|
-
- The live modules docs site is published at `https://modules.specfact.io/`.
|
|
470
|
-
|
|
471
|
-
Use this repository's docs for the overall product story, runtime lifecycle, command topology,
|
|
472
|
-
trust model, and getting-started flow. Use the modules docs site when you want deeper workflow,
|
|
473
|
-
adapter, and module-authoring guidance.
|
|
474
|
-
|
|
475
|
-
### Migration Note (Flat Commands Removed)
|
|
476
|
-
|
|
477
|
-
As of `0.40.0`, flat root commands are removed. Use grouped commands:
|
|
351
|
+
## What is SpecFact?
|
|
478
352
|
|
|
479
|
-
|
|
480
|
-
- `specfact plan ...` -> removed; use `specfact project devops-flow` or `specfact project snapshot`
|
|
481
|
-
- `specfact policy ...` -> removed; use `specfact backlog verify-readiness`
|
|
353
|
+
SpecFact is a local CLI for catching backlog/spec/code drift before it becomes expensive. It gives solo developers, legacy maintainers, and teams a validation layer around AI-assisted delivery, brownfield reverse engineering, and contract-first reviews.
|
|
482
354
|
|
|
483
|
-
|
|
355
|
+
It exists because delivery drifts in predictable ways:
|
|
484
356
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
357
|
+
- AI-assisted code lands faster than validation catches up
|
|
358
|
+
- brownfield systems rarely have trustworthy up-to-date specs
|
|
359
|
+
- backlog intent gets reinterpreted before it reaches code
|
|
360
|
+
- teams need the same review rules across IDEs, CI, and pull requests
|
|
488
361
|
|
|
489
|
-
|
|
490
|
-
# 1) Initialize backlog config + field mapping
|
|
491
|
-
specfact backlog init-config --force
|
|
492
|
-
specfact backlog map-fields --provider ado --ado-org <org> --ado-project "<project>"
|
|
362
|
+
## Add SpecFact to your workflow
|
|
493
363
|
|
|
494
|
-
|
|
495
|
-
specfact backlog ceremony standup ado --ado-org <org> --ado-project "<project>" --state any --assignee any --limit 5
|
|
496
|
-
specfact backlog ceremony refinement ado --ado-org <org> --ado-project "<project>" --id <work-item-id> --preview
|
|
364
|
+
**Pre-commit hook**
|
|
497
365
|
|
|
498
|
-
|
|
499
|
-
|
|
366
|
+
```yaml
|
|
367
|
+
- repo: https://github.com/nold-ai/specfact-cli
|
|
368
|
+
rev: v0.46.0
|
|
369
|
+
hooks:
|
|
370
|
+
- id: specfact-smart-checks
|
|
500
371
|
```
|
|
501
372
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
For GitHub, replace adapter/org/project with:
|
|
505
|
-
`specfact backlog ceremony standup github --repo-owner <owner> --repo-name <repo> --state any --assignee any --limit 5`
|
|
373
|
+
**GitHub Actions**
|
|
506
374
|
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
# In your IDE chat (Cursor, VS Code, Copilot, etc.)
|
|
511
|
-
/specfact.01-import my-project --repo .
|
|
375
|
+
```yaml
|
|
376
|
+
- name: SpecFact Gate
|
|
377
|
+
run: uvx specfact-cli@latest govern enforce stage --preset minimal
|
|
512
378
|
```
|
|
513
379
|
|
|
514
|
-
|
|
380
|
+
## How SpecFact is built
|
|
515
381
|
|
|
516
|
-
|
|
382
|
+
SpecFact uses the same discipline it asks you to trust:
|
|
517
383
|
|
|
518
|
-
-
|
|
519
|
-
|
|
520
|
-
|
|
384
|
+
1. Outside-in research on the workflow or drift problem
|
|
385
|
+
2. Public **OpenSpec** proposal and spec deltas
|
|
386
|
+
3. TDD evidence before implementation
|
|
387
|
+
4. Dogfooding with `specfact code review`
|
|
388
|
+
5. Format, type-check, contract-test, and docs quality gates
|
|
389
|
+
6. PR review with evidence artifacts
|
|
390
|
+
7. Release through the same reproducible CLI paths
|
|
521
391
|
|
|
522
|
-
|
|
392
|
+
## For teams and organizations
|
|
523
393
|
|
|
524
|
-
|
|
394
|
+
SpecFact still scales beyond the solo-developer entry path:
|
|
525
395
|
|
|
526
|
-
|
|
396
|
+
- **Backlog + ceremony workflows** for GitHub, Azure DevOps, Jira, and Linear
|
|
397
|
+
- **DoR/DoD and policy enforcement** for teams that need repeatable gates
|
|
398
|
+
- **Evidence-backed PR review** with the same checks used locally
|
|
399
|
+
- **CI/CD adoption path** that keeps validation deterministic instead of model-driven
|
|
527
400
|
|
|
528
|
-
|
|
529
|
-
- **Ceremony support teams can run**: standup, refinement, sprint planning, flow metrics (Scrum/Kanban/SAFe).
|
|
530
|
-
- **Policy + validation**: DoR/DoD/flow checks plus contract enforcement for production-grade stability.
|
|
401
|
+
Start with:
|
|
531
402
|
|
|
532
|
-
Recommended command entrypoints:
|
|
533
403
|
- `specfact backlog ceremony standup ...`
|
|
534
404
|
- `specfact backlog ceremony refinement ...`
|
|
535
405
|
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
536
|
-
- `specfact
|
|
537
|
-
|
|
538
|
-
What the backlog readiness and ceremony commands do in practice:
|
|
539
|
-
- Turns team agreements (DoR, DoD, flow checks) into executable checks against your real backlog data.
|
|
540
|
-
- Shows exactly what is missing per item (for example missing acceptance criteria or definition of done).
|
|
541
|
-
- Runs structured ceremony workflows directly from the CLI.
|
|
542
|
-
|
|
543
|
-
Start with:
|
|
544
|
-
- `specfact backlog ceremony standup --help`
|
|
545
|
-
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
546
|
-
- `specfact backlog refine --help`
|
|
547
|
-
|
|
548
|
-
---
|
|
549
|
-
|
|
550
|
-
## Core CLI Features
|
|
551
|
-
|
|
552
|
-
The `specfact-cli` repository owns the platform-level features that every workflow bundle depends on:
|
|
553
|
-
|
|
554
|
-
- `specfact init` for first-run bootstrap and IDE setup.
|
|
555
|
-
- `specfact module` for install/list/show/search/enable/disable/uninstall/upgrade lifecycle flows.
|
|
556
|
-
- `specfact upgrade` for CLI upgrades.
|
|
557
|
-
- Runtime contracts, registry bootstrapping, trust checks, logging, and shared orchestration.
|
|
558
|
-
- The grouped command surface that mounts installed bundle families under `project`, `backlog`, `code`, `spec`, and `govern`.
|
|
559
|
-
|
|
560
|
-
## Official Modules Integration
|
|
406
|
+
- `specfact govern ...`
|
|
561
407
|
|
|
562
|
-
|
|
563
|
-
The core CLI discovers those bundle packages, mounts their command groups, and enforces compatibility, trust, and lifecycle rules.
|
|
408
|
+
## Module system
|
|
564
409
|
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
- `specfact project ...`
|
|
568
|
-
- `specfact backlog ...`
|
|
569
|
-
- `specfact code ...`
|
|
570
|
-
- `specfact spec ...`
|
|
571
|
-
- `specfact govern ...`
|
|
410
|
+
Official workflow behavior ships from `nold-ai/specfact-cli-modules`. The core CLI owns bootstrap, runtime contracts, trust checks, logging, and the grouped command surface. Installed modules add families such as `project`, `backlog`, `code`, `spec`, and `govern`.
|
|
572
411
|
|
|
573
412
|
Install examples:
|
|
574
413
|
|
|
@@ -576,34 +415,33 @@ Install examples:
|
|
|
576
415
|
specfact module install nold-ai/specfact-project
|
|
577
416
|
specfact module install nold-ai/specfact-backlog
|
|
578
417
|
specfact module install nold-ai/specfact-codebase
|
|
579
|
-
specfact module install nold-ai/specfact-
|
|
418
|
+
specfact module install nold-ai/specfact-code-review
|
|
580
419
|
specfact module install nold-ai/specfact-govern
|
|
581
420
|
```
|
|
582
421
|
|
|
583
|
-
If startup warns that
|
|
422
|
+
If startup warns that modules are missing or outdated, run:
|
|
584
423
|
|
|
585
424
|
```bash
|
|
586
425
|
specfact module init --scope project
|
|
587
426
|
specfact module init
|
|
588
427
|
```
|
|
589
428
|
|
|
590
|
-
|
|
591
|
-
Use `https://modules.specfact.io/` for the in-depth backlog, project, spec, govern, adapter, and module-authoring guides.
|
|
429
|
+
## Documentation topology
|
|
592
430
|
|
|
593
|
-
|
|
431
|
+
`docs.specfact.io` is the canonical starting point for SpecFact.
|
|
594
432
|
|
|
595
|
-
|
|
433
|
+
- Core CLI/runtime/platform documentation remains owned by `specfact-cli`
|
|
434
|
+
- Module-specific deep docs are canonically owned by `specfact-cli-modules`
|
|
435
|
+
- The live modules docs site is published at `https://modules.specfact.io/`
|
|
596
436
|
|
|
597
|
-
|
|
598
|
-
2. **Review or analyze**: run **`code review run`** on a repo, or import code and snapshot state for deeper workflows.
|
|
599
|
-
3. **Sync**: connect backlog systems or sync external artifacts into project bundles when you are ready.
|
|
600
|
-
4. **Validate**: run spec, governance, and sidecar validation flows before implementation or release.
|
|
601
|
-
5. **Iterate safely**: use module-provided workflows while the core runtime keeps command mounting, trust, and lifecycle consistent.
|
|
437
|
+
Use this repository's docs for the product story, runtime lifecycle, command topology, trust model, and getting-started flow. Use the modules docs site when you want deeper workflow, adapter, and module-authoring guidance.
|
|
602
438
|
|
|
603
|
-
##
|
|
439
|
+
## How do I get started if I want more?
|
|
604
440
|
|
|
605
|
-
|
|
441
|
+
Next steps:
|
|
606
442
|
|
|
607
|
-
- **
|
|
608
|
-
- **
|
|
609
|
-
- **
|
|
443
|
+
- **[Core CLI docs](docs/index.md)** for the core runtime, bootstrap, and validation flow
|
|
444
|
+
- **[Installation guide](https://docs.specfact.io/getting-started/installation/)** for uvx-first and persistent CLI setup
|
|
445
|
+
- **[Quickstart](https://docs.specfact.io/getting-started/quickstart/)** for the first repo review path
|
|
446
|
+
- **[Reference: command topology](docs/reference/commands.md)** for grouped command surfaces
|
|
447
|
+
- **[Canonical modules docs site](https://modules.specfact.io/)** for bundle-deep workflows
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# SpecFact CLI
|
|
2
|
+
|
|
3
|
+
> Review AI-assisted code against your own contracts.
|
|
4
|
+
> Catch drift before it reaches PR or main.
|
|
5
|
+
|
|
6
|
+
[](https://pypi.org/project/specfact-cli/)
|
|
7
|
+
[](https://pypi.org/project/specfact-cli/)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
[](https://github.com/nold-ai/specfact-cli)
|
|
10
|
+
|
|
11
|
+
**No API keys required. Works offline. Zero vendor lock-in.**
|
|
12
|
+
|
|
13
|
+
<div align="center">
|
|
14
|
+
|
|
15
|
+
**[Documentation](https://docs.specfact.io/)** • **[Modules](https://modules.specfact.io/)** • **[Support](mailto:hello@noldai.com)**
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
## Try it in 60 seconds
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Zero-install, no API key, works offline
|
|
23
|
+
uvx specfact-cli init --profile solo-developer
|
|
24
|
+
uvx specfact-cli code review run --path . --scope full
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Sample output:**
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
SpecFact CLI - v0.46.0
|
|
31
|
+
|
|
32
|
+
Running Ruff checks...
|
|
33
|
+
Running Radon complexity checks...
|
|
34
|
+
Running Semgrep rules...
|
|
35
|
+
Running AST clean-code checks...
|
|
36
|
+
Running basedpyright type checks...
|
|
37
|
+
Running pylint checks...
|
|
38
|
+
Running contract checks...
|
|
39
|
+
Running targeted tests and coverage...
|
|
40
|
+
|
|
41
|
+
Verdict: FAIL | CI exit: 1 | Score: 0 | Reward delta: -80
|
|
42
|
+
|
|
43
|
+
Findings:
|
|
44
|
+
- specfact_demo/enforcement.py:96 Cyclomatic complexity for run_enforcement is 16.
|
|
45
|
+
- specfact_demo/main.py:81 Avoid print() in source files; use structured logging instead.
|
|
46
|
+
- examples/buggy_math.py:4 Public function divide is missing @require/@ensure decorators.
|
|
47
|
+
|
|
48
|
+
Evidence bundle: docs/_support/readme-first-contact/sample-output/
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
⭐ **Star this repo if the output is useful.** Open an issue if you want the workflow adapted for your stack.
|
|
52
|
+
|
|
53
|
+
**Already installed the CLI?** Use:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
specfact init --profile solo-developer
|
|
57
|
+
specfact code review run --path . --scope full
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The sample output comes from a pinned capture against `nold-ai/specfact-demo-repo`. Reproduce it with `docs/_support/readme-first-contact/capture-readme-output.sh`; capture metadata lives alongside the raw logs in `docs/_support/readme-first-contact/sample-output/`.
|
|
61
|
+
|
|
62
|
+
## What SpecFact does
|
|
63
|
+
|
|
64
|
+
- **Reviews AI-assisted changes deterministically** — compare code against contracts, clean-code rules, and policy gates
|
|
65
|
+
- **Extracts structure from existing code** — reverse-engineer brownfield repos before you change them
|
|
66
|
+
- **Blocks drift before merge** — use the same checks locally, in pre-commit, and in CI
|
|
67
|
+
- **Links backlog intent to code reality** — connect backlog, specs, validation, and implementation
|
|
68
|
+
- **Stays local-first** — no cloud account, no vendor lock-in, no built-in model dependency
|
|
69
|
+
|
|
70
|
+
## What is SpecFact?
|
|
71
|
+
|
|
72
|
+
SpecFact is a local CLI for catching backlog/spec/code drift before it becomes expensive. It gives solo developers, legacy maintainers, and teams a validation layer around AI-assisted delivery, brownfield reverse engineering, and contract-first reviews.
|
|
73
|
+
|
|
74
|
+
It exists because delivery drifts in predictable ways:
|
|
75
|
+
|
|
76
|
+
- AI-assisted code lands faster than validation catches up
|
|
77
|
+
- brownfield systems rarely have trustworthy up-to-date specs
|
|
78
|
+
- backlog intent gets reinterpreted before it reaches code
|
|
79
|
+
- teams need the same review rules across IDEs, CI, and pull requests
|
|
80
|
+
|
|
81
|
+
## Add SpecFact to your workflow
|
|
82
|
+
|
|
83
|
+
**Pre-commit hook**
|
|
84
|
+
|
|
85
|
+
```yaml
|
|
86
|
+
- repo: https://github.com/nold-ai/specfact-cli
|
|
87
|
+
rev: v0.46.0
|
|
88
|
+
hooks:
|
|
89
|
+
- id: specfact-smart-checks
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**GitHub Actions**
|
|
93
|
+
|
|
94
|
+
```yaml
|
|
95
|
+
- name: SpecFact Gate
|
|
96
|
+
run: uvx specfact-cli@latest govern enforce stage --preset minimal
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## How SpecFact is built
|
|
100
|
+
|
|
101
|
+
SpecFact uses the same discipline it asks you to trust:
|
|
102
|
+
|
|
103
|
+
1. Outside-in research on the workflow or drift problem
|
|
104
|
+
2. Public **OpenSpec** proposal and spec deltas
|
|
105
|
+
3. TDD evidence before implementation
|
|
106
|
+
4. Dogfooding with `specfact code review`
|
|
107
|
+
5. Format, type-check, contract-test, and docs quality gates
|
|
108
|
+
6. PR review with evidence artifacts
|
|
109
|
+
7. Release through the same reproducible CLI paths
|
|
110
|
+
|
|
111
|
+
## For teams and organizations
|
|
112
|
+
|
|
113
|
+
SpecFact still scales beyond the solo-developer entry path:
|
|
114
|
+
|
|
115
|
+
- **Backlog + ceremony workflows** for GitHub, Azure DevOps, Jira, and Linear
|
|
116
|
+
- **DoR/DoD and policy enforcement** for teams that need repeatable gates
|
|
117
|
+
- **Evidence-backed PR review** with the same checks used locally
|
|
118
|
+
- **CI/CD adoption path** that keeps validation deterministic instead of model-driven
|
|
119
|
+
|
|
120
|
+
Start with:
|
|
121
|
+
|
|
122
|
+
- `specfact backlog ceremony standup ...`
|
|
123
|
+
- `specfact backlog ceremony refinement ...`
|
|
124
|
+
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
125
|
+
- `specfact govern ...`
|
|
126
|
+
|
|
127
|
+
## Module system
|
|
128
|
+
|
|
129
|
+
Official workflow behavior ships from `nold-ai/specfact-cli-modules`. The core CLI owns bootstrap, runtime contracts, trust checks, logging, and the grouped command surface. Installed modules add families such as `project`, `backlog`, `code`, `spec`, and `govern`.
|
|
130
|
+
|
|
131
|
+
Install examples:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
specfact module install nold-ai/specfact-project
|
|
135
|
+
specfact module install nold-ai/specfact-backlog
|
|
136
|
+
specfact module install nold-ai/specfact-codebase
|
|
137
|
+
specfact module install nold-ai/specfact-code-review
|
|
138
|
+
specfact module install nold-ai/specfact-govern
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
If startup warns that modules are missing or outdated, run:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
specfact module init --scope project
|
|
145
|
+
specfact module init
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Documentation topology
|
|
149
|
+
|
|
150
|
+
`docs.specfact.io` is the canonical starting point for SpecFact.
|
|
151
|
+
|
|
152
|
+
- Core CLI/runtime/platform documentation remains owned by `specfact-cli`
|
|
153
|
+
- Module-specific deep docs are canonically owned by `specfact-cli-modules`
|
|
154
|
+
- The live modules docs site is published at `https://modules.specfact.io/`
|
|
155
|
+
|
|
156
|
+
Use this repository's docs for the product story, runtime lifecycle, command topology, trust model, and getting-started flow. Use the modules docs site when you want deeper workflow, adapter, and module-authoring guidance.
|
|
157
|
+
|
|
158
|
+
## How do I get started if I want more?
|
|
159
|
+
|
|
160
|
+
Next steps:
|
|
161
|
+
|
|
162
|
+
- **[Core CLI docs](docs/index.md)** for the core runtime, bootstrap, and validation flow
|
|
163
|
+
- **[Installation guide](https://docs.specfact.io/getting-started/installation/)** for uvx-first and persistent CLI setup
|
|
164
|
+
- **[Quickstart](https://docs.specfact.io/getting-started/quickstart/)** for the first repo review path
|
|
165
|
+
- **[Reference: command topology](docs/reference/commands.md)** for grouped command surfaces
|
|
166
|
+
- **[Canonical modules docs site](https://modules.specfact.io/)** for bundle-deep workflows
|