specfact-cli 0.44.0__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.44.0 → specfact_cli-0.46.0}/PKG-INFO +97 -248
- specfact_cli-0.46.0/README.md +166 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/pyproject.toml +36 -20
- specfact_cli-0.46.0/resources/templates/github-action.yml.j2 +200 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/pr-template.md.j2 +9 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/__init__.py +1 -1
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/__init__.py +1 -1
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/adapters/ado.py +122 -141
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/adapters/github.py +118 -79
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/adapters/openspec_parser.py +13 -15
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/adapters/speckit.py +76 -38
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +17 -24
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/code_analyzer.py +113 -100
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/graph_analyzer.py +26 -5
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/cli.py +200 -74
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/common/logger_setup.py +62 -34
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/common/logging_utils.py +3 -2
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/generators/contract_generator.py +23 -25
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/generators/openapi_extractor.py +57 -54
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/generators/persona_exporter.py +29 -16
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/generators/plan_generator.py +4 -2
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/generators/test_to_openapi.py +34 -26
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/generators/workflow_generator.py +7 -2
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/project.py +33 -27
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/init/module-package.yaml +3 -3
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/init/src/commands.py +15 -0
- specfact_cli-0.46.0/src/specfact_cli/modules/init/src/first_run_selection.py +357 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/module_registry/module-package.yaml +3 -3
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/module_registry/src/commands.py +508 -105
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/bootstrap.py +12 -2
- specfact_cli-0.46.0/src/specfact_cli/registry/dependency_resolver.py +186 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_installer.py +99 -51
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_packages.py +147 -182
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/__init__.py +2 -1
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync.py +816 -765
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_watch.py +19 -23
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/contract_predicates.py +21 -0
- {specfact_cli-0.44.0 → 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.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/source_scanner.py +74 -124
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/cli_first_validator.py +16 -14
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/contract_validator.py +13 -37
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +28 -20
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +21 -8
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +21 -16
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/orchestrator.py +11 -9
- specfact_cli-0.44.0/README.md +0 -317
- specfact_cli-0.44.0/resources/templates/github-action.yml.j2 +0 -172
- specfact_cli-0.44.0/src/specfact_cli/modules/init/src/first_run_selection.py +0 -198
- specfact_cli-0.44.0/src/specfact_cli/registry/dependency_resolver.py +0 -109
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/.gitignore +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/LICENSE +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/keys/README.md +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/keys/module-signing-public.pem +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/persona/architect.md.j2 +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/persona/developer.md.j2 +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/persona/product-owner.md.j2 +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/policies/kanban.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/policies/mixed.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/policies/safe.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/policies/scrum.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/__main__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/adapters/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/adapters/base.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/adapters/openspec.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/adapters/registry.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/agents/analyze_agent.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/backlog/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/backlog/converter.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/backlog/filters.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/_bundle_shim.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/analyze.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/contract_cmd.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/drift.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/enforce.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/generate.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/import_cmd.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/init.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/migrate.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/plan.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/project_cmd.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/repro.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/sdd.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/spec.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/sync.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/update.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/commands/validate.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/common/bundle_factory.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/contracts/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/contracts/module_interface.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/groups/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/groups/codebase_group.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/groups/govern_group.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/groups/member_group.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/groups/project_group.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/groups/spec_group.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/merge/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/merge/resolver.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/backlog_item.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/capabilities.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/change.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/contract.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/dor_config.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/module_package.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/persona_template.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/plan.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/models/validation.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/_bundle_import.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/init/src/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/init/src/app.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/module_io_shim.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/parsers/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/parsers/persona_importer.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/alias_manager.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/bridge_registry.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/crypto_validator.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/custom_registries.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/extension_registry.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/help_cache.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/marketplace_client.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/metadata.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_discovery.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_grouping.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_lifecycle.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_security.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/module_state.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/registry/registry.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/runtime.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_openspec_md_parse.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_requirement_from_proposal.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_requirement_helpers.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_tasks_from_proposal.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_what_changes_format.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/bridge_sync_write_openspec_from_proposal.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/spec_to_code.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/templates/registry.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/bundle_converters.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/context_detection.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/enrichment_parser.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/env_manager.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/git.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/icontract_helpers.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/metadata.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/optional_deps.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/persona_ownership.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/progress.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/startup_checks.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/structure.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/suggestions.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/terminal.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validation/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validation/command_audit.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/agile_validation.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/schema.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
- {specfact_cli-0.44.0 → specfact_cli-0.46.0}/src/specfact_cli/versioning/__init__.py +0 -0
- {specfact_cli-0.44.0 → 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
|
|
@@ -224,30 +224,29 @@ Classifier: Topic :: Software Development :: Testing
|
|
|
224
224
|
Requires-Python: >=3.11
|
|
225
225
|
Requires-Dist: azure-identity>=1.17.1
|
|
226
226
|
Requires-Dist: beartype>=0.22.4
|
|
227
|
-
Requires-Dist: cffi>=1.17.1
|
|
228
|
-
Requires-Dist: crosshair-tool>=0.0.97
|
|
229
227
|
Requires-Dist: cryptography>=43.0.0
|
|
230
228
|
Requires-Dist: gitpython>=3.1.45
|
|
231
229
|
Requires-Dist: graphviz>=0.20.1
|
|
232
|
-
Requires-Dist: hypothesis>=6.142.4
|
|
233
230
|
Requires-Dist: icontract>=2.7.1
|
|
234
231
|
Requires-Dist: jinja2>=3.1.6
|
|
232
|
+
Requires-Dist: json5>=0.9.28
|
|
235
233
|
Requires-Dist: jsonschema>=4.23.0
|
|
236
234
|
Requires-Dist: networkx>=3.4.2
|
|
237
235
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.27.0
|
|
238
236
|
Requires-Dist: opentelemetry-sdk>=1.27.0
|
|
237
|
+
Requires-Dist: packaging>=24.0
|
|
239
238
|
Requires-Dist: pydantic>=2.12.3
|
|
240
|
-
Requires-Dist: python-dotenv>=1.2.1
|
|
241
239
|
Requires-Dist: pyyaml>=6.0.3
|
|
242
240
|
Requires-Dist: questionary>=2.0.1
|
|
243
|
-
Requires-Dist: radon>=6.0.1
|
|
244
241
|
Requires-Dist: requests>=2.32.3
|
|
245
242
|
Requires-Dist: rich<13.6.0,>=13.5.2
|
|
246
243
|
Requires-Dist: ruamel-yaml>=0.18.16
|
|
247
|
-
Requires-Dist:
|
|
248
|
-
Requires-Dist: typer>=0.20.0
|
|
244
|
+
Requires-Dist: typer<0.24,>=0.20.0
|
|
249
245
|
Requires-Dist: typing-extensions>=4.15.0
|
|
250
246
|
Requires-Dist: watchdog>=6.0.0
|
|
247
|
+
Provides-Extra: contracts
|
|
248
|
+
Requires-Dist: crosshair-tool>=0.0.97; extra == 'contracts'
|
|
249
|
+
Requires-Dist: hypothesis>=6.142.4; extra == 'contracts'
|
|
251
250
|
Provides-Extra: dev
|
|
252
251
|
Requires-Dist: basedpyright>=1.32.1; extra == 'dev'
|
|
253
252
|
Requires-Dist: bearer>=3.1.0; extra == 'dev'
|
|
@@ -268,6 +267,7 @@ Requires-Dist: pytest>=8.4.2; extra == 'dev'
|
|
|
268
267
|
Requires-Dist: radon>=6.0.1; extra == 'dev'
|
|
269
268
|
Requires-Dist: ruff>=0.14.2; extra == 'dev'
|
|
270
269
|
Requires-Dist: semgrep>=1.144.0; extra == 'dev'
|
|
270
|
+
Requires-Dist: setuptools<82,>=69.0.0; extra == 'dev'
|
|
271
271
|
Requires-Dist: tomlkit>=0.13.3; extra == 'dev'
|
|
272
272
|
Requires-Dist: types-pyyaml>=6.0.12.20250516; extra == 'dev'
|
|
273
273
|
Provides-Extra: enhanced-analysis
|
|
@@ -281,284 +281,133 @@ Description-Content-Type: text/markdown
|
|
|
281
281
|
|
|
282
282
|
# SpecFact CLI
|
|
283
283
|
|
|
284
|
-
>
|
|
285
|
-
>
|
|
286
|
-
> from drifting apart across AI-assisted coding, brownfield systems, and governed delivery.
|
|
287
|
-
> Use it to move fast without losing rigor.
|
|
288
|
-
|
|
289
|
-
**No API keys required. Works offline. Zero vendor lock-in.**
|
|
290
|
-
|
|
291
|
-
SpecFact CLI does **not** include built-in AI. It is a deterministic local CLI
|
|
292
|
-
that can be paired with IDE slash-command prompts so your chosen AI copilot can
|
|
293
|
-
invoke SpecFact as part of a command chain.
|
|
284
|
+
> Review AI-assisted code against your own contracts.
|
|
285
|
+
> Catch drift before it reaches PR or main.
|
|
294
286
|
|
|
295
287
|
[](https://pypi.org/project/specfact-cli/)
|
|
296
288
|
[](https://pypi.org/project/specfact-cli/)
|
|
297
289
|
[](LICENSE)
|
|
298
290
|
[](https://github.com/nold-ai/specfact-cli)
|
|
299
291
|
|
|
292
|
+
**No API keys required. Works offline. Zero vendor lock-in.**
|
|
293
|
+
|
|
300
294
|
<div align="center">
|
|
301
295
|
|
|
302
|
-
**[
|
|
296
|
+
**[Documentation](https://docs.specfact.io/)** • **[Modules](https://modules.specfact.io/)** • **[Support](mailto:hello@noldai.com)**
|
|
303
297
|
|
|
304
298
|
</div>
|
|
305
299
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
## What is SpecFact?
|
|
309
|
-
|
|
310
|
-
SpecFact is the validation and alignment layer for software delivery.
|
|
311
|
-
|
|
312
|
-
It is a local CLI that helps you keep the intent behind a change aligned from
|
|
313
|
-
backlog or idea through specifications, implementation, and checks. The “Swiss-knife CLI” metaphor
|
|
314
|
-
fits because SpecFact gives you a set of focused tools for specific delivery problems, not a vague
|
|
315
|
-
bag of features.
|
|
316
|
-
|
|
317
|
-
In practice, SpecFact helps you:
|
|
318
|
-
- add guardrails to AI-assisted and fast-moving greenfield work
|
|
319
|
-
- reverse-engineer large brownfield codebases into trustworthy structured understanding
|
|
320
|
-
- reduce the “I wanted X but got Y” drift between backlog, spec, and implementation
|
|
321
|
-
- move from local rigor toward team and enterprise policy enforcement
|
|
322
|
-
|
|
323
|
-
## Why does it exist?
|
|
324
|
-
|
|
325
|
-
Modern delivery drifts in predictable ways:
|
|
326
|
-
- AI-generated quick wins often lack the validation layer needed for mid- and long-term reliability
|
|
327
|
-
- brownfield systems often have missing or drifted specs, so teams need to reverse-engineer reality
|
|
328
|
-
- backlog intent gets reinterpreted into something else before it reaches code
|
|
329
|
-
- teams working with different skill levels, opinions, and AI IDE setups need consistent review and
|
|
330
|
-
policy enforcement
|
|
331
|
-
|
|
332
|
-
SpecFact exists to reduce that drift. It helps teams understand what is really there, express what
|
|
333
|
-
should happen more accurately, and validate that the result still matches the original intent.
|
|
334
|
-
|
|
335
|
-
## Why should I use it?
|
|
336
|
-
|
|
337
|
-
Use SpecFact if you want one of these outcomes:
|
|
338
|
-
- ship AI-assisted changes faster without accepting fragile “looks fine to me” quality
|
|
339
|
-
- understand a legacy or unfamiliar codebase before changing it
|
|
340
|
-
- hand brownfield insight into OpenSpec, Spec-Kit, or other spec-first workflows
|
|
341
|
-
- keep backlog expectations, specifications, and implementation from silently diverging
|
|
342
|
-
- enforce shared rules consistently across developers and CI/CD
|
|
343
|
-
|
|
344
|
-
## What do I get?
|
|
345
|
-
|
|
346
|
-
With SpecFact, you get:
|
|
347
|
-
- a deterministic local CLI instead of another opaque SaaS dependency
|
|
348
|
-
- a validation layer around fast-moving implementation work
|
|
349
|
-
- codebase analysis and sidecar flows for brownfield understanding
|
|
350
|
-
- stronger backlog/spec/code alignment for real delivery workflows
|
|
351
|
-
- a path from individual rigor to organization-level policy enforcement
|
|
352
|
-
|
|
353
|
-
## How do I get started?
|
|
354
|
-
|
|
355
|
-
### Start Here (5 minutes)
|
|
356
|
-
|
|
357
|
-
### Install
|
|
300
|
+
## Try it in 60 seconds
|
|
358
301
|
|
|
359
302
|
```bash
|
|
360
|
-
# Zero-install
|
|
361
|
-
uvx specfact-cli
|
|
362
|
-
|
|
363
|
-
# Or install globally
|
|
364
|
-
pip install -U specfact-cli
|
|
303
|
+
# Zero-install, no API key, works offline
|
|
304
|
+
uvx specfact-cli init --profile solo-developer
|
|
305
|
+
uvx specfact-cli code review run --path . --scope full
|
|
365
306
|
```
|
|
366
307
|
|
|
367
|
-
|
|
308
|
+
**Sample output:**
|
|
368
309
|
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
specfact init --profile solo-developer
|
|
372
|
-
```
|
|
310
|
+
```text
|
|
311
|
+
SpecFact CLI - v0.46.0
|
|
373
312
|
|
|
374
|
-
|
|
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...
|
|
375
321
|
|
|
376
|
-
|
|
377
|
-
# Analyze a codebase you care about
|
|
378
|
-
specfact code import my-project --repo .
|
|
322
|
+
Verdict: FAIL | CI exit: 1 | Score: 0 | Reward delta: -80
|
|
379
323
|
|
|
380
|
-
|
|
381
|
-
|
|
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.
|
|
382
328
|
|
|
383
|
-
|
|
384
|
-
specfact code validate sidecar init my-project /path/to/repo
|
|
385
|
-
specfact code validate sidecar run my-project /path/to/repo
|
|
329
|
+
Evidence bundle: docs/_support/readme-first-contact/sample-output/
|
|
386
330
|
```
|
|
387
331
|
|
|
388
|
-
|
|
389
|
-
validated starting point instead of jumping straight into blind change work.
|
|
332
|
+
⭐ **Star this repo if the output is useful.** Open an issue if you want the workflow adapted for your stack.
|
|
390
333
|
|
|
391
|
-
|
|
334
|
+
**Already installed the CLI?** Use:
|
|
392
335
|
|
|
393
336
|
```bash
|
|
394
|
-
specfact init
|
|
395
|
-
specfact
|
|
396
|
-
specfact init ide --ide vscode
|
|
337
|
+
specfact init --profile solo-developer
|
|
338
|
+
specfact code review run --path . --scope full
|
|
397
339
|
```
|
|
398
340
|
|
|
399
|
-
`specfact
|
|
400
|
-
your IDE. If module prompt payloads are not installed yet, the CLI uses packaged fallback resources.
|
|
401
|
-
|
|
402
|
-
## Choose Your Path
|
|
403
|
-
|
|
404
|
-
### Greenfield and AI-assisted delivery
|
|
405
|
-
|
|
406
|
-
Use SpecFact as the validation layer around fast-moving implementation work.
|
|
407
|
-
|
|
408
|
-
Start with:
|
|
409
|
-
- `specfact init --profile solo-developer`
|
|
410
|
-
- `specfact code validate sidecar init <bundle> /path/to/repo`
|
|
411
|
-
- `specfact code validate sidecar run <bundle> /path/to/repo`
|
|
412
|
-
|
|
413
|
-
### Brownfield and reverse engineering
|
|
414
|
-
|
|
415
|
-
Use SpecFact to understand an existing system before you change it, then hand that understanding
|
|
416
|
-
into spec-first tools such as OpenSpec or Spec-Kit.
|
|
417
|
-
|
|
418
|
-
Start with:
|
|
419
|
-
- `specfact code import my-project --repo .`
|
|
420
|
-
- `specfact project snapshot --bundle my-project`
|
|
421
|
-
- `specfact code validate sidecar init my-project /path/to/repo`
|
|
422
|
-
- `specfact code validate sidecar run my-project /path/to/repo`
|
|
423
|
-
|
|
424
|
-
### Backlog to code alignment
|
|
425
|
-
|
|
426
|
-
Use SpecFact when the problem is not only code quality, but drift between expectations and delivery.
|
|
427
|
-
Backlog commands require a backlog-enabled profile or installed backlog bundle before the workflow
|
|
428
|
-
commands are available.
|
|
429
|
-
|
|
430
|
-
Start with:
|
|
431
|
-
- `specfact init --profile backlog-team`
|
|
432
|
-
- `specfact backlog ceremony standup ...`
|
|
433
|
-
- `specfact backlog ceremony refinement ...`
|
|
434
|
-
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
435
|
-
|
|
436
|
-
### Team and policy enforcement
|
|
437
|
-
|
|
438
|
-
Use SpecFact when multiple developers and AI IDEs need consistent checks and review behavior.
|
|
439
|
-
|
|
440
|
-
Start with:
|
|
441
|
-
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
442
|
-
- `specfact govern ...`
|
|
443
|
-
- CI validation flows that keep the same rules active outside local development
|
|
444
|
-
|
|
445
|
-
## How do I get started if I want more?
|
|
446
|
-
|
|
447
|
-
**Next steps**
|
|
448
|
-
|
|
449
|
-
- **[Core CLI docs](docs/index.md)** for the core runtime, bootstrap, validation, and command topology
|
|
450
|
-
- **[Reference: command topology](docs/reference/commands.md)** for grouped command surfaces
|
|
451
|
-
- **[Canonical modules docs site](https://modules.specfact.io/)** for bundle-deep workflows
|
|
452
|
-
|
|
453
|
-
## Documentation Topology
|
|
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/`.
|
|
454
342
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
- Core CLI/runtime/platform documentation remains owned by `specfact-cli`.
|
|
458
|
-
- Module-specific deep docs are canonically owned by `specfact-cli-modules`.
|
|
459
|
-
- The live modules docs site is published at `https://modules.specfact.io/`.
|
|
460
|
-
|
|
461
|
-
Use this repository's docs for the overall product story, runtime lifecycle, command topology,
|
|
462
|
-
trust model, and getting-started flow. Use the modules docs site when you want deeper workflow,
|
|
463
|
-
adapter, and module-authoring guidance.
|
|
343
|
+
## What SpecFact does
|
|
464
344
|
|
|
465
|
-
|
|
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
|
|
466
350
|
|
|
467
|
-
|
|
351
|
+
## What is SpecFact?
|
|
468
352
|
|
|
469
|
-
|
|
470
|
-
- `specfact plan ...` -> removed; use `specfact project devops-flow` or `specfact project snapshot`
|
|
471
|
-
- `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.
|
|
472
354
|
|
|
473
|
-
|
|
355
|
+
It exists because delivery drifts in predictable ways:
|
|
474
356
|
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
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
|
|
478
361
|
|
|
479
|
-
|
|
480
|
-
# 1) Initialize backlog config + field mapping
|
|
481
|
-
specfact backlog init-config --force
|
|
482
|
-
specfact backlog map-fields --provider ado --ado-org <org> --ado-project "<project>"
|
|
362
|
+
## Add SpecFact to your workflow
|
|
483
363
|
|
|
484
|
-
|
|
485
|
-
specfact backlog ceremony standup ado --ado-org <org> --ado-project "<project>" --state any --assignee any --limit 5
|
|
486
|
-
specfact backlog ceremony refinement ado --ado-org <org> --ado-project "<project>" --id <work-item-id> --preview
|
|
364
|
+
**Pre-commit hook**
|
|
487
365
|
|
|
488
|
-
|
|
489
|
-
|
|
366
|
+
```yaml
|
|
367
|
+
- repo: https://github.com/nold-ai/specfact-cli
|
|
368
|
+
rev: v0.46.0
|
|
369
|
+
hooks:
|
|
370
|
+
- id: specfact-smart-checks
|
|
490
371
|
```
|
|
491
372
|
|
|
492
|
-
|
|
373
|
+
**GitHub Actions**
|
|
493
374
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
**AI IDE quick start**
|
|
498
|
-
|
|
499
|
-
```bash
|
|
500
|
-
# In your IDE chat (Cursor, VS Code, Copilot, etc.)
|
|
501
|
-
/specfact.01-import my-project --repo .
|
|
375
|
+
```yaml
|
|
376
|
+
- name: SpecFact Gate
|
|
377
|
+
run: uvx specfact-cli@latest govern enforce stage --preset minimal
|
|
502
378
|
```
|
|
503
379
|
|
|
504
|
-
|
|
380
|
+
## How SpecFact is built
|
|
505
381
|
|
|
506
|
-
|
|
382
|
+
SpecFact uses the same discipline it asks you to trust:
|
|
507
383
|
|
|
508
|
-
-
|
|
509
|
-
|
|
510
|
-
|
|
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
|
|
511
391
|
|
|
512
|
-
|
|
392
|
+
## For teams and organizations
|
|
513
393
|
|
|
514
|
-
|
|
394
|
+
SpecFact still scales beyond the solo-developer entry path:
|
|
515
395
|
|
|
516
|
-
|
|
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
|
|
517
400
|
|
|
518
|
-
|
|
519
|
-
- **Ceremony support teams can run**: standup, refinement, sprint planning, flow metrics (Scrum/Kanban/SAFe).
|
|
520
|
-
- **Policy + validation**: DoR/DoD/flow checks plus contract enforcement for production-grade stability.
|
|
401
|
+
Start with:
|
|
521
402
|
|
|
522
|
-
Recommended command entrypoints:
|
|
523
403
|
- `specfact backlog ceremony standup ...`
|
|
524
404
|
- `specfact backlog ceremony refinement ...`
|
|
525
405
|
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
526
|
-
- `specfact
|
|
527
|
-
|
|
528
|
-
What the backlog readiness and ceremony commands do in practice:
|
|
529
|
-
- Turns team agreements (DoR, DoD, flow checks) into executable checks against your real backlog data.
|
|
530
|
-
- Shows exactly what is missing per item (for example missing acceptance criteria or definition of done).
|
|
531
|
-
- Runs structured ceremony workflows directly from the CLI.
|
|
532
|
-
|
|
533
|
-
Start with:
|
|
534
|
-
- `specfact backlog ceremony standup --help`
|
|
535
|
-
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
536
|
-
- `specfact backlog refine --help`
|
|
537
|
-
|
|
538
|
-
---
|
|
539
|
-
|
|
540
|
-
## Core CLI Features
|
|
541
|
-
|
|
542
|
-
The `specfact-cli` repository owns the platform-level features that every workflow bundle depends on:
|
|
543
|
-
|
|
544
|
-
- `specfact init` for first-run bootstrap and IDE setup.
|
|
545
|
-
- `specfact module` for install/list/show/search/enable/disable/uninstall/upgrade lifecycle flows.
|
|
546
|
-
- `specfact upgrade` for CLI upgrades.
|
|
547
|
-
- Runtime contracts, registry bootstrapping, trust checks, logging, and shared orchestration.
|
|
548
|
-
- The grouped command surface that mounts installed bundle families under `project`, `backlog`, `code`, `spec`, and `govern`.
|
|
549
|
-
|
|
550
|
-
## Official Modules Integration
|
|
551
|
-
|
|
552
|
-
Official workflow behavior now ships from `nold-ai/specfact-cli-modules`.
|
|
553
|
-
The core CLI discovers those bundle packages, mounts their command groups, and enforces compatibility, trust, and lifecycle rules.
|
|
406
|
+
- `specfact govern ...`
|
|
554
407
|
|
|
555
|
-
|
|
408
|
+
## Module system
|
|
556
409
|
|
|
557
|
-
|
|
558
|
-
- `specfact backlog ...`
|
|
559
|
-
- `specfact code ...`
|
|
560
|
-
- `specfact spec ...`
|
|
561
|
-
- `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`.
|
|
562
411
|
|
|
563
412
|
Install examples:
|
|
564
413
|
|
|
@@ -566,33 +415,33 @@ Install examples:
|
|
|
566
415
|
specfact module install nold-ai/specfact-project
|
|
567
416
|
specfact module install nold-ai/specfact-backlog
|
|
568
417
|
specfact module install nold-ai/specfact-codebase
|
|
569
|
-
specfact module install nold-ai/specfact-
|
|
418
|
+
specfact module install nold-ai/specfact-code-review
|
|
570
419
|
specfact module install nold-ai/specfact-govern
|
|
571
420
|
```
|
|
572
421
|
|
|
573
|
-
If startup warns that
|
|
422
|
+
If startup warns that modules are missing or outdated, run:
|
|
574
423
|
|
|
575
424
|
```bash
|
|
576
425
|
specfact module init --scope project
|
|
577
426
|
specfact module init
|
|
578
427
|
```
|
|
579
428
|
|
|
580
|
-
|
|
581
|
-
Use `https://modules.specfact.io/` for the in-depth backlog, project, spec, govern, adapter, and module-authoring guides.
|
|
429
|
+
## Documentation topology
|
|
582
430
|
|
|
583
|
-
|
|
431
|
+
`docs.specfact.io` is the canonical starting point for SpecFact.
|
|
584
432
|
|
|
585
|
-
|
|
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/`
|
|
586
436
|
|
|
587
|
-
|
|
588
|
-
2. **Analyze or sync**: import code, connect backlog systems, or sync external artifacts into project bundles.
|
|
589
|
-
3. **Validate**: run spec, governance, and sidecar validation flows before implementation or release.
|
|
590
|
-
4. **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.
|
|
591
438
|
|
|
592
|
-
##
|
|
439
|
+
## How do I get started if I want more?
|
|
593
440
|
|
|
594
|
-
|
|
441
|
+
Next steps:
|
|
595
442
|
|
|
596
|
-
- **
|
|
597
|
-
- **
|
|
598
|
-
- **
|
|
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
|