specfact-cli 0.45.1__tar.gz → 0.46.2__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.2}/PKG-INFO +98 -249
- specfact_cli-0.46.2/README.md +177 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/pyproject.toml +13 -7
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/__init__.py +1 -1
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/__init__.py +1 -1
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/adapters/ado.py +124 -143
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/adapters/github.py +137 -79
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/adapters/openspec_parser.py +13 -15
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/adapters/speckit.py +79 -38
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/analyzers/ambiguity_scanner.py +17 -24
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/analyzers/code_analyzer.py +132 -94
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/analyzers/graph_analyzer.py +35 -17
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/common/logger_setup.py +63 -34
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/common/logging_utils.py +3 -2
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/generators/contract_generator.py +23 -25
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/generators/openapi_extractor.py +57 -54
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/generators/persona_exporter.py +30 -17
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/generators/test_to_openapi.py +47 -33
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/project.py +33 -27
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/init/module-package.yaml +3 -3
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/init/src/first_run_selection.py +6 -3
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/module_registry/module-package.yaml +3 -3
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/module_registry/src/commands.py +12 -9
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/module_installer.py +61 -43
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/__init__.py +2 -1
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/bridge_sync.py +816 -765
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/bridge_watch.py +23 -23
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/contract_predicates.py +21 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/ide_setup.py +53 -58
- specfact_cli-0.46.2/src/specfact_cli/utils/project_artifact_write.py +254 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/source_scanner.py +70 -124
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/cli_first_validator.py +24 -14
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/contract_validator.py +13 -37
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/crosshair_runner.py +32 -20
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/crosshair_summary.py +21 -8
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +26 -16
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/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.2}/.gitignore +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/LICENSE +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/keys/README.md +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/keys/module-signing-public.pem +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/persona/architect.md.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/persona/developer.md.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/persona/product-owner.md.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/policies/kanban.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/policies/mixed.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/policies/safe.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/policies/scrum.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/pr-template.md.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/__main__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/adapters/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/adapters/backlog_base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/adapters/base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/adapters/openspec.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/adapters/registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/agents/analyze_agent.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/backlog/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/backlog/adapters/base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/backlog/converter.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/backlog/filters.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/backlog/mappers/base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/cli.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/_bundle_shim.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/analyze.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/contract_cmd.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/drift.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/enforce.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/generate.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/import_cmd.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/init.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/migrate.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/plan.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/project_cmd.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/repro.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/sdd.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/spec.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/sync.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/update.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/commands/validate.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/common/bundle_factory.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/contracts/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/contracts/crosshair_props.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/contracts/module_interface.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/groups/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/groups/codebase_group.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/groups/govern_group.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/groups/member_group.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/groups/project_group.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/groups/spec_group.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/merge/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/merge/resolver.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/backlog_item.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/capabilities.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/change.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/contract.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/dor_config.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/module_package.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/persona_template.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/plan.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/models/validation.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/_bundle_import.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/init/src/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/init/src/app.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/init/src/commands.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/module_io_shim.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/parsers/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/parsers/persona_importer.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/alias_manager.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/bootstrap.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/bridge_registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/crypto_validator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/custom_registries.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/dependency_resolver.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/extension_registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/help_cache.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/marketplace_client.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/metadata.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/module_discovery.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/module_grouping.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/module_lifecycle.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/module_packages.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/module_security.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/module_state.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/registry/registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/runtime.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/bridge_sync_openspec_md_parse.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/bridge_sync_requirement_from_proposal.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/bridge_sync_requirement_helpers.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/bridge_sync_tasks_from_proposal.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/bridge_sync_what_changes_format.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/bridge_sync_write_openspec_from_proposal.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/spec_to_code.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/templates/registry.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/auth_tokens.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/bundle_converters.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/bundle_loader.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/code_change_detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/content_sanitizer.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/context_detection.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/enrichment_parser.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/env_manager.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/git.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/icontract_helpers.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/metadata.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/optional_deps.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/persona_ownership.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/progress.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/sdd_discovery.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/startup_checks.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/structure.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/suggestions.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/terminal.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validation/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validation/command_audit.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/agile_validation.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/schema.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/models.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/src/specfact_cli/versioning/__init__.py +0 -0
- {specfact_cli-0.45.1 → specfact_cli-0.46.2}/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.2
|
|
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,144 @@ 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.1
|
|
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
|
-
|
|
384
|
-
|
|
385
|
-
### After the wow path: deeper workflows
|
|
386
|
-
|
|
387
|
-
When you want analysis, snapshots, or sidecar validation on top of the review layer:
|
|
388
|
-
|
|
389
|
-
```bash
|
|
390
|
-
# Analyze a codebase you care about
|
|
391
|
-
specfact code import my-project --repo .
|
|
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
|
-
```
|
|
332
|
+
⭐ **Star this repo if the output is useful.** Open an issue if you want the workflow adapted for your stack.
|
|
400
333
|
|
|
401
|
-
|
|
334
|
+
**Already installed the CLI?** Use:
|
|
402
335
|
|
|
403
336
|
```bash
|
|
404
|
-
specfact init
|
|
405
|
-
specfact
|
|
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`
|
|
422
|
-
|
|
423
|
-
### Brownfield and reverse engineering
|
|
424
|
-
|
|
425
|
-
Use SpecFact to understand an existing system before you change it, then hand that understanding
|
|
426
|
-
into spec-first tools such as OpenSpec or Spec-Kit.
|
|
427
|
-
|
|
428
|
-
Start with:
|
|
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**
|
|
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/`.
|
|
458
342
|
|
|
459
|
-
|
|
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.
|
|
343
|
+
## What SpecFact does
|
|
466
344
|
|
|
467
|
-
-
|
|
468
|
-
-
|
|
469
|
-
-
|
|
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
|
|
470
350
|
|
|
471
|
-
|
|
472
|
-
trust model, and getting-started flow. Use the modules docs site when you want deeper workflow,
|
|
473
|
-
adapter, and module-authoring guidance.
|
|
351
|
+
## What is SpecFact?
|
|
474
352
|
|
|
475
|
-
|
|
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.
|
|
476
354
|
|
|
477
|
-
|
|
355
|
+
It exists because delivery drifts in predictable ways:
|
|
478
356
|
|
|
479
|
-
-
|
|
480
|
-
-
|
|
481
|
-
-
|
|
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
|
|
482
361
|
|
|
483
|
-
|
|
362
|
+
## Add SpecFact to your workflow
|
|
484
363
|
|
|
485
|
-
|
|
486
|
-
These commands require the backlog bundle to be installed first, for example via
|
|
487
|
-
`specfact init --profile backlog-team` or `specfact init --install backlog`.
|
|
364
|
+
### Pre-commit hook
|
|
488
365
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
366
|
+
This repository uses a **modular** local hook layout (parity with `specfact-cli-modules`: `fail_fast`,
|
|
367
|
+
separate verify / format / YAML / Markdown / workflow / lint / Block 2 hooks). If you copy
|
|
368
|
+
[`.pre-commit-config.yaml`](.pre-commit-config.yaml) into another repo, you must also vendor the
|
|
369
|
+
referenced `scripts/*.sh` entrypoints (at minimum `scripts/pre-commit-quality-checks.sh`,
|
|
370
|
+
`scripts/pre-commit-verify-modules.sh`, and `scripts/git-branch-module-signature-flag.sh`) so hook
|
|
371
|
+
`entry:` paths resolve. Alternatively, skip vendoring the modular file and use the remote hook below.
|
|
493
372
|
|
|
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
|
|
373
|
+
For a **single-hook** setup in downstream repos, keep using the stable id and script shim:
|
|
497
374
|
|
|
498
|
-
|
|
499
|
-
|
|
375
|
+
```yaml
|
|
376
|
+
- repo: https://github.com/nold-ai/specfact-cli
|
|
377
|
+
rev: v0.46.1
|
|
378
|
+
hooks:
|
|
379
|
+
- id: specfact-smart-checks
|
|
500
380
|
```
|
|
501
381
|
|
|
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`
|
|
382
|
+
The shim runs `scripts/pre-commit-quality-checks.sh all` (full pipeline including module verify).
|
|
506
383
|
|
|
507
|
-
|
|
384
|
+
### GitHub Actions
|
|
508
385
|
|
|
509
|
-
```
|
|
510
|
-
|
|
511
|
-
|
|
386
|
+
```yaml
|
|
387
|
+
- name: SpecFact Gate
|
|
388
|
+
run: uvx specfact-cli@latest govern enforce stage --preset minimal
|
|
512
389
|
```
|
|
513
390
|
|
|
514
|
-
|
|
391
|
+
## How SpecFact is built
|
|
515
392
|
|
|
516
|
-
|
|
393
|
+
SpecFact uses the same discipline it asks you to trust:
|
|
517
394
|
|
|
518
|
-
-
|
|
519
|
-
|
|
520
|
-
|
|
395
|
+
1. Outside-in research on the workflow or drift problem
|
|
396
|
+
2. Public **OpenSpec** proposal and spec deltas
|
|
397
|
+
3. TDD evidence before implementation
|
|
398
|
+
4. Dogfooding with `specfact code review`
|
|
399
|
+
5. Format, type-check, contract-test, and docs quality gates
|
|
400
|
+
6. PR review with evidence artifacts
|
|
401
|
+
7. Release through the same reproducible CLI paths
|
|
521
402
|
|
|
522
|
-
|
|
403
|
+
## For teams and organizations
|
|
523
404
|
|
|
524
|
-
|
|
405
|
+
SpecFact still scales beyond the solo-developer entry path:
|
|
525
406
|
|
|
526
|
-
|
|
407
|
+
- **Backlog + ceremony workflows** for GitHub, Azure DevOps, Jira, and Linear
|
|
408
|
+
- **DoR/DoD and policy enforcement** for teams that need repeatable gates
|
|
409
|
+
- **Evidence-backed PR review** with the same checks used locally
|
|
410
|
+
- **CI/CD adoption path** that keeps validation deterministic instead of model-driven
|
|
527
411
|
|
|
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.
|
|
412
|
+
Start with:
|
|
531
413
|
|
|
532
|
-
Recommended command entrypoints:
|
|
533
414
|
- `specfact backlog ceremony standup ...`
|
|
534
415
|
- `specfact backlog ceremony refinement ...`
|
|
535
416
|
- `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
|
|
561
|
-
|
|
562
|
-
Official workflow behavior now ships from `nold-ai/specfact-cli-modules`.
|
|
563
|
-
The core CLI discovers those bundle packages, mounts their command groups, and enforces compatibility, trust, and lifecycle rules.
|
|
417
|
+
- `specfact govern ...`
|
|
564
418
|
|
|
565
|
-
|
|
419
|
+
## Module system
|
|
566
420
|
|
|
567
|
-
|
|
568
|
-
- `specfact backlog ...`
|
|
569
|
-
- `specfact code ...`
|
|
570
|
-
- `specfact spec ...`
|
|
571
|
-
- `specfact govern ...`
|
|
421
|
+
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
422
|
|
|
573
423
|
Install examples:
|
|
574
424
|
|
|
@@ -576,34 +426,33 @@ Install examples:
|
|
|
576
426
|
specfact module install nold-ai/specfact-project
|
|
577
427
|
specfact module install nold-ai/specfact-backlog
|
|
578
428
|
specfact module install nold-ai/specfact-codebase
|
|
579
|
-
specfact module install nold-ai/specfact-
|
|
429
|
+
specfact module install nold-ai/specfact-code-review
|
|
580
430
|
specfact module install nold-ai/specfact-govern
|
|
581
431
|
```
|
|
582
432
|
|
|
583
|
-
If startup warns that
|
|
433
|
+
If startup warns that modules are missing or outdated, run:
|
|
584
434
|
|
|
585
435
|
```bash
|
|
586
436
|
specfact module init --scope project
|
|
587
437
|
specfact module init
|
|
588
438
|
```
|
|
589
439
|
|
|
590
|
-
|
|
591
|
-
Use `https://modules.specfact.io/` for the in-depth backlog, project, spec, govern, adapter, and module-authoring guides.
|
|
440
|
+
## Documentation topology
|
|
592
441
|
|
|
593
|
-
|
|
442
|
+
`docs.specfact.io` is the canonical starting point for SpecFact.
|
|
594
443
|
|
|
595
|
-
|
|
444
|
+
- Core CLI/runtime/platform documentation remains owned by `specfact-cli`
|
|
445
|
+
- Module-specific deep docs are canonically owned by `specfact-cli-modules`
|
|
446
|
+
- The live modules docs site is published at `https://modules.specfact.io/`
|
|
596
447
|
|
|
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.
|
|
448
|
+
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
449
|
|
|
603
|
-
##
|
|
450
|
+
## How do I get started if I want more?
|
|
604
451
|
|
|
605
|
-
|
|
452
|
+
Next steps:
|
|
606
453
|
|
|
607
|
-
- **
|
|
608
|
-
- **
|
|
609
|
-
- **
|
|
454
|
+
- **[Core CLI docs](docs/index.md)** for the core runtime, bootstrap, and validation flow
|
|
455
|
+
- **[Installation guide](https://docs.specfact.io/getting-started/installation/)** for uvx-first and persistent CLI setup
|
|
456
|
+
- **[Quickstart](https://docs.specfact.io/getting-started/quickstart/)** for the first repo review path
|
|
457
|
+
- **[Reference: command topology](docs/reference/commands.md)** for grouped command surfaces
|
|
458
|
+
- **[Canonical modules docs site](https://modules.specfact.io/)** for bundle-deep workflows
|
|
@@ -0,0 +1,177 @@
|
|
|
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.1
|
|
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
|
+
This repository uses a **modular** local hook layout (parity with `specfact-cli-modules`: `fail_fast`,
|
|
86
|
+
separate verify / format / YAML / Markdown / workflow / lint / Block 2 hooks). If you copy
|
|
87
|
+
[`.pre-commit-config.yaml`](.pre-commit-config.yaml) into another repo, you must also vendor the
|
|
88
|
+
referenced `scripts/*.sh` entrypoints (at minimum `scripts/pre-commit-quality-checks.sh`,
|
|
89
|
+
`scripts/pre-commit-verify-modules.sh`, and `scripts/git-branch-module-signature-flag.sh`) so hook
|
|
90
|
+
`entry:` paths resolve. Alternatively, skip vendoring the modular file and use the remote hook below.
|
|
91
|
+
|
|
92
|
+
For a **single-hook** setup in downstream repos, keep using the stable id and script shim:
|
|
93
|
+
|
|
94
|
+
```yaml
|
|
95
|
+
- repo: https://github.com/nold-ai/specfact-cli
|
|
96
|
+
rev: v0.46.1
|
|
97
|
+
hooks:
|
|
98
|
+
- id: specfact-smart-checks
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The shim runs `scripts/pre-commit-quality-checks.sh all` (full pipeline including module verify).
|
|
102
|
+
|
|
103
|
+
### GitHub Actions
|
|
104
|
+
|
|
105
|
+
```yaml
|
|
106
|
+
- name: SpecFact Gate
|
|
107
|
+
run: uvx specfact-cli@latest govern enforce stage --preset minimal
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## How SpecFact is built
|
|
111
|
+
|
|
112
|
+
SpecFact uses the same discipline it asks you to trust:
|
|
113
|
+
|
|
114
|
+
1. Outside-in research on the workflow or drift problem
|
|
115
|
+
2. Public **OpenSpec** proposal and spec deltas
|
|
116
|
+
3. TDD evidence before implementation
|
|
117
|
+
4. Dogfooding with `specfact code review`
|
|
118
|
+
5. Format, type-check, contract-test, and docs quality gates
|
|
119
|
+
6. PR review with evidence artifacts
|
|
120
|
+
7. Release through the same reproducible CLI paths
|
|
121
|
+
|
|
122
|
+
## For teams and organizations
|
|
123
|
+
|
|
124
|
+
SpecFact still scales beyond the solo-developer entry path:
|
|
125
|
+
|
|
126
|
+
- **Backlog + ceremony workflows** for GitHub, Azure DevOps, Jira, and Linear
|
|
127
|
+
- **DoR/DoD and policy enforcement** for teams that need repeatable gates
|
|
128
|
+
- **Evidence-backed PR review** with the same checks used locally
|
|
129
|
+
- **CI/CD adoption path** that keeps validation deterministic instead of model-driven
|
|
130
|
+
|
|
131
|
+
Start with:
|
|
132
|
+
|
|
133
|
+
- `specfact backlog ceremony standup ...`
|
|
134
|
+
- `specfact backlog ceremony refinement ...`
|
|
135
|
+
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
136
|
+
- `specfact govern ...`
|
|
137
|
+
|
|
138
|
+
## Module system
|
|
139
|
+
|
|
140
|
+
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`.
|
|
141
|
+
|
|
142
|
+
Install examples:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
specfact module install nold-ai/specfact-project
|
|
146
|
+
specfact module install nold-ai/specfact-backlog
|
|
147
|
+
specfact module install nold-ai/specfact-codebase
|
|
148
|
+
specfact module install nold-ai/specfact-code-review
|
|
149
|
+
specfact module install nold-ai/specfact-govern
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
If startup warns that modules are missing or outdated, run:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
specfact module init --scope project
|
|
156
|
+
specfact module init
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Documentation topology
|
|
160
|
+
|
|
161
|
+
`docs.specfact.io` is the canonical starting point for SpecFact.
|
|
162
|
+
|
|
163
|
+
- Core CLI/runtime/platform documentation remains owned by `specfact-cli`
|
|
164
|
+
- Module-specific deep docs are canonically owned by `specfact-cli-modules`
|
|
165
|
+
- The live modules docs site is published at `https://modules.specfact.io/`
|
|
166
|
+
|
|
167
|
+
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.
|
|
168
|
+
|
|
169
|
+
## How do I get started if I want more?
|
|
170
|
+
|
|
171
|
+
Next steps:
|
|
172
|
+
|
|
173
|
+
- **[Core CLI docs](docs/index.md)** for the core runtime, bootstrap, and validation flow
|
|
174
|
+
- **[Installation guide](https://docs.specfact.io/getting-started/installation/)** for uvx-first and persistent CLI setup
|
|
175
|
+
- **[Quickstart](https://docs.specfact.io/getting-started/quickstart/)** for the first repo review path
|
|
176
|
+
- **[Reference: command topology](docs/reference/commands.md)** for grouped command surfaces
|
|
177
|
+
- **[Canonical modules docs site](https://modules.specfact.io/)** for bundle-deep workflows
|