specfact-cli 0.46.28__tar.gz → 0.47.6__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.46.28 → specfact_cli-0.47.6}/.gitignore +2 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/PKG-INFO +30 -17
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/README.md +27 -14
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/pyproject.toml +12 -5
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/bundled-module-registry/index.json +6 -6
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/pr-template.md.j2 +1 -2
- specfact_cli-0.47.6/src/__init__.py +6 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/__init__.py +33 -2
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/cli.py +263 -69
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/init/module-package.yaml +3 -3
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/init/src/commands.py +3 -4
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/upgrade/module-package.yaml +3 -3
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/upgrade/src/commands.py +83 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/bundle_loader.py +1 -1
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/env_manager.py +18 -4
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/github_annotations.py +2 -2
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/ide_setup.py +159 -2
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/progressive_disclosure.py +144 -14
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/structure.py +4 -4
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/suggestions.py +9 -9
- specfact_cli-0.46.28/src/__init__.py +0 -6
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/LICENSE +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/keys/README.md +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/keys/module-signing-public.pem +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/persona/architect.md.j2 +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/persona/developer.md.j2 +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/persona/product-owner.md.j2 +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/policies/kanban.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/policies/mixed.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/policies/safe.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/policies/scrum.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/__main__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/adapters/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/adapters/ado.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/adapters/backlog_base.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/adapters/base.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/adapters/github.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/adapters/openspec.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/adapters/openspec_parser.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/adapters/registry.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/adapters/speckit.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/agents/analyze_agent.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/backlog/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/backlog/adapters/base.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/backlog/converter.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/backlog/filters.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/backlog/mappers/base.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/_bundle_shim.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/analyze.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/contract_cmd.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/drift.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/enforce.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/generate.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/import_cmd.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/init.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/migrate.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/plan.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/project_cmd.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/repro.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/sdd.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/spec.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/sync.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/update.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/commands/validate.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/common/bundle_factory.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/common/logger_setup.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/common/logging_utils.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/contracts/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/contracts/crosshair_props.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/contracts/module_interface.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/generators/contract_generator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/generators/openapi_extractor.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/generators/persona_exporter.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/generators/test_to_openapi.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/groups/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/groups/codebase_group.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/groups/govern_group.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/groups/member_group.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/groups/project_group.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/groups/spec_group.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/merge/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/merge/resolver.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/backlog_item.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/capabilities.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/change.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/contract.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/dor_config.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/module_package.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/persona_template.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/plan.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/project.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/models/validation.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/_bundle_import.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/init/src/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/init/src/app.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/module_io_shim.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/module_registry/module-package.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/module_registry/src/commands.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/upgrade/src/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/parsers/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/parsers/persona_importer.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/alias_manager.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/bootstrap.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/bridge_registry.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/crypto_validator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/custom_registries.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/dependency_resolver.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/extension_registry.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/help_cache.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/marketplace_client.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/metadata.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/module_availability.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/module_discovery.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/module_grouping.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/module_installer.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/module_lifecycle.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/module_packages.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/module_security.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/module_state.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/registry/registry.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/runtime.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/bridge_sync.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/bridge_sync_openspec_md_parse.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/bridge_sync_requirement_from_proposal.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/bridge_sync_requirement_helpers.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/bridge_sync_tasks_from_proposal.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/bridge_sync_what_changes_format.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/bridge_sync_write_openspec_from_proposal.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/bridge_watch.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/spec_to_code.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/templates/registry.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/auth_tokens.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/bundle_converters.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/code_change_detector.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/content_sanitizer.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/context_detection.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/contract_predicates.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/enrichment_parser.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/git.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/icontract_helpers.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/metadata.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/optional_deps.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/persona_ownership.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/progress.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/project_artifact_write.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/sdd_discovery.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/source_scanner.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/startup_checks.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/terminal.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validation/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validation/command_audit.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/agile_validation.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/cli_first_validator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/contract_validator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/schema.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/models.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/versioning/__init__.py +0 -0
- {specfact_cli-0.46.28 → specfact_cli-0.47.6}/src/specfact_cli/versioning/analyzer.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specfact-cli
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 0.47.6
|
|
4
|
+
Summary: AI-bloat defense CLI for Python teams. Run deterministic code review, cleanup forecasts, and spec/contract evidence for AI-assisted and brownfield delivery.
|
|
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
|
|
7
7
|
Project-URL: Documentation, https://github.com/nold-ai/specfact-cli#readme
|
|
@@ -210,7 +210,7 @@ License: Apache License
|
|
|
210
210
|
See the License for the specific language governing permissions and
|
|
211
211
|
limitations under the License.
|
|
212
212
|
License-File: LICENSE
|
|
213
|
-
Keywords: agile,backlog,beartype,ceremonies,cli,contract-driven-development,contracts,crosshair,devops,existing-code,icontract,kanban,legacy,modernization,policy-as-code,property-based-testing,safe,scrum,specfact,specs,tdd,validation
|
|
213
|
+
Keywords: agile,ai-bloat,backlog,beartype,ceremonies,clean-code,cli,code-review,contract-driven-development,contracts,crosshair,devops,existing-code,icontract,kanban,legacy,modernization,policy-as-code,property-based-testing,safe,scrum,specfact,specs,tdd,technical-debt,validation
|
|
214
214
|
Classifier: Development Status :: 4 - Beta
|
|
215
215
|
Classifier: Intended Audience :: Developers
|
|
216
216
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
@@ -283,8 +283,8 @@ Description-Content-Type: text/markdown
|
|
|
283
283
|
|
|
284
284
|
# SpecFact CLI
|
|
285
285
|
|
|
286
|
-
>
|
|
287
|
-
>
|
|
286
|
+
> Defend AI-assisted Python code from bloat before it reaches PR.
|
|
287
|
+
> Run deterministic review, cleanup forecasts, and spec/contract evidence locally.
|
|
288
288
|
|
|
289
289
|
[](https://pypi.org/project/specfact-cli/)
|
|
290
290
|
[](https://pypi.org/project/specfact-cli/)
|
|
@@ -299,6 +299,11 @@ Description-Content-Type: text/markdown
|
|
|
299
299
|
|
|
300
300
|
</div>
|
|
301
301
|
|
|
302
|
+
## Command Overview
|
|
303
|
+
|
|
304
|
+
- [Generated command overview for humans](docs/reference/commands.generated.md)
|
|
305
|
+
- [AI-agent command overview](llms.txt)
|
|
306
|
+
|
|
302
307
|
## Try it in 60 seconds
|
|
303
308
|
|
|
304
309
|
```bash
|
|
@@ -310,7 +315,7 @@ uvx specfact-cli code review run --path . --scope full
|
|
|
310
315
|
**Sample output:**
|
|
311
316
|
|
|
312
317
|
```text
|
|
313
|
-
SpecFact CLI - v0.
|
|
318
|
+
SpecFact CLI - v0.47.4
|
|
314
319
|
|
|
315
320
|
Running Ruff checks...
|
|
316
321
|
Running Radon complexity checks...
|
|
@@ -342,23 +347,30 @@ specfact code review run --path . --scope full
|
|
|
342
347
|
|
|
343
348
|
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/`.
|
|
344
349
|
|
|
345
|
-
|
|
350
|
+
## AI-bloat defense loop
|
|
351
|
+
|
|
352
|
+
SpecFact is the local AI-bloat defense CLI for Python-first teams using AI IDEs. The Code Review bundle reports `ai_bloat` advisories for code shapes that AI-assisted coding often amplifies: redundant wrappers, passthrough lambdas, identity `try`/`except` blocks, avoidable intermediate lists, and long low-branch functions.
|
|
353
|
+
|
|
354
|
+
For cleanup work, run a JSON review, inspect the cleanup forecast and AI-bloat index, hand remediation packets to your AI IDE, accept only safe changes, then re-run review for proof. The JSON report is the portable handoff artifact for Claude, Codex, Cursor, Copilot, or a headless agent.
|
|
355
|
+
|
|
356
|
+
These findings are bloat-shape detection and cleanup guidance, not AI-authorship detection. Exact simplify flags and report fields live in the [AI bloat quickstart](https://modules.specfact.io/quickstart-ai-bloat/) and [Code Review run guide](https://modules.specfact.io/bundles/code-review/run/) on the modules docs site.
|
|
346
357
|
|
|
347
358
|
## What SpecFact does
|
|
348
359
|
|
|
349
|
-
- **
|
|
360
|
+
- **Defends against AI bloat deterministically** — forecast cleanup impact and route remediation packets to your AI IDE
|
|
361
|
+
- **Reviews AI-assisted changes against evidence** — compare code against contracts, clean-code rules, and policy gates
|
|
350
362
|
- **Extracts structure from existing code** — reverse-engineer brownfield repos before you change them
|
|
351
363
|
- **Blocks drift before merge** — use the same checks locally, in pre-commit, and in CI
|
|
352
|
-
- **
|
|
364
|
+
- **Consumes upstream planning inputs** — treat Spec Kit, OpenSpec, backlog, specs, tests, and contracts as validation evidence
|
|
353
365
|
- **Stays local-first** — no cloud account, no vendor lock-in, no built-in model dependency
|
|
354
366
|
|
|
355
367
|
## What is SpecFact?
|
|
356
368
|
|
|
357
|
-
SpecFact is a local CLI for
|
|
369
|
+
SpecFact is a local CLI for AI-bloat defense, deterministic code review, and backlog/spec/code drift control. It gives solo developers, legacy maintainers, and teams a validation layer around AI-assisted delivery, brownfield reverse engineering, and contract-first reviews.
|
|
358
370
|
|
|
359
371
|
It exists because delivery drifts in predictable ways:
|
|
360
372
|
|
|
361
|
-
- AI-assisted code lands faster than validation
|
|
373
|
+
- AI-assisted code lands faster than cleanup and validation catch up
|
|
362
374
|
- brownfield systems rarely have trustworthy up-to-date specs
|
|
363
375
|
- backlog intent gets reinterpreted before it reaches code
|
|
364
376
|
- teams need the same review rules across IDEs, CI, and pull requests
|
|
@@ -379,7 +391,7 @@ For a **single-hook** setup in downstream repos, keep using the stable id and sc
|
|
|
379
391
|
|
|
380
392
|
```yaml
|
|
381
393
|
- repo: https://github.com/nold-ai/specfact-cli
|
|
382
|
-
rev: v0.
|
|
394
|
+
rev: v0.47.4
|
|
383
395
|
hooks:
|
|
384
396
|
- id: specfact-smart-checks
|
|
385
397
|
```
|
|
@@ -407,17 +419,18 @@ SpecFact uses the same discipline it asks you to trust:
|
|
|
407
419
|
|
|
408
420
|
## For teams and organizations
|
|
409
421
|
|
|
410
|
-
SpecFact still scales beyond the solo-developer entry path
|
|
422
|
+
SpecFact still scales beyond the solo-developer entry path, but validation stays
|
|
423
|
+
the center:
|
|
411
424
|
|
|
412
|
-
- **
|
|
425
|
+
- **Upstream context adapters** for GitHub, Azure DevOps, Jira, Linear, OpenSpec, and Spec Kit inputs
|
|
413
426
|
- **DoR/DoD and policy enforcement** for teams that need repeatable gates
|
|
414
427
|
- **Evidence-backed PR review** with the same checks used locally
|
|
415
428
|
- **CI/CD adoption path** that keeps validation deterministic instead of model-driven
|
|
416
429
|
|
|
417
|
-
|
|
430
|
+
Optional module-deep paths include:
|
|
418
431
|
|
|
419
|
-
- `specfact
|
|
420
|
-
- `specfact
|
|
432
|
+
- `specfact project import ...`
|
|
433
|
+
- `specfact spec validate ...`
|
|
421
434
|
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
422
435
|
- `specfact govern ...`
|
|
423
436
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# SpecFact CLI
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> Defend AI-assisted Python code from bloat before it reaches PR.
|
|
4
|
+
> Run deterministic review, cleanup forecasts, and spec/contract evidence locally.
|
|
5
5
|
|
|
6
6
|
[](https://pypi.org/project/specfact-cli/)
|
|
7
7
|
[](https://pypi.org/project/specfact-cli/)
|
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
|
|
17
17
|
</div>
|
|
18
18
|
|
|
19
|
+
## Command Overview
|
|
20
|
+
|
|
21
|
+
- [Generated command overview for humans](docs/reference/commands.generated.md)
|
|
22
|
+
- [AI-agent command overview](llms.txt)
|
|
23
|
+
|
|
19
24
|
## Try it in 60 seconds
|
|
20
25
|
|
|
21
26
|
```bash
|
|
@@ -27,7 +32,7 @@ uvx specfact-cli code review run --path . --scope full
|
|
|
27
32
|
**Sample output:**
|
|
28
33
|
|
|
29
34
|
```text
|
|
30
|
-
SpecFact CLI - v0.
|
|
35
|
+
SpecFact CLI - v0.47.4
|
|
31
36
|
|
|
32
37
|
Running Ruff checks...
|
|
33
38
|
Running Radon complexity checks...
|
|
@@ -59,23 +64,30 @@ specfact code review run --path . --scope full
|
|
|
59
64
|
|
|
60
65
|
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
66
|
|
|
62
|
-
|
|
67
|
+
## AI-bloat defense loop
|
|
68
|
+
|
|
69
|
+
SpecFact is the local AI-bloat defense CLI for Python-first teams using AI IDEs. The Code Review bundle reports `ai_bloat` advisories for code shapes that AI-assisted coding often amplifies: redundant wrappers, passthrough lambdas, identity `try`/`except` blocks, avoidable intermediate lists, and long low-branch functions.
|
|
70
|
+
|
|
71
|
+
For cleanup work, run a JSON review, inspect the cleanup forecast and AI-bloat index, hand remediation packets to your AI IDE, accept only safe changes, then re-run review for proof. The JSON report is the portable handoff artifact for Claude, Codex, Cursor, Copilot, or a headless agent.
|
|
72
|
+
|
|
73
|
+
These findings are bloat-shape detection and cleanup guidance, not AI-authorship detection. Exact simplify flags and report fields live in the [AI bloat quickstart](https://modules.specfact.io/quickstart-ai-bloat/) and [Code Review run guide](https://modules.specfact.io/bundles/code-review/run/) on the modules docs site.
|
|
63
74
|
|
|
64
75
|
## What SpecFact does
|
|
65
76
|
|
|
66
|
-
- **
|
|
77
|
+
- **Defends against AI bloat deterministically** — forecast cleanup impact and route remediation packets to your AI IDE
|
|
78
|
+
- **Reviews AI-assisted changes against evidence** — compare code against contracts, clean-code rules, and policy gates
|
|
67
79
|
- **Extracts structure from existing code** — reverse-engineer brownfield repos before you change them
|
|
68
80
|
- **Blocks drift before merge** — use the same checks locally, in pre-commit, and in CI
|
|
69
|
-
- **
|
|
81
|
+
- **Consumes upstream planning inputs** — treat Spec Kit, OpenSpec, backlog, specs, tests, and contracts as validation evidence
|
|
70
82
|
- **Stays local-first** — no cloud account, no vendor lock-in, no built-in model dependency
|
|
71
83
|
|
|
72
84
|
## What is SpecFact?
|
|
73
85
|
|
|
74
|
-
SpecFact is a local CLI for
|
|
86
|
+
SpecFact is a local CLI for AI-bloat defense, deterministic code review, and backlog/spec/code drift control. It gives solo developers, legacy maintainers, and teams a validation layer around AI-assisted delivery, brownfield reverse engineering, and contract-first reviews.
|
|
75
87
|
|
|
76
88
|
It exists because delivery drifts in predictable ways:
|
|
77
89
|
|
|
78
|
-
- AI-assisted code lands faster than validation
|
|
90
|
+
- AI-assisted code lands faster than cleanup and validation catch up
|
|
79
91
|
- brownfield systems rarely have trustworthy up-to-date specs
|
|
80
92
|
- backlog intent gets reinterpreted before it reaches code
|
|
81
93
|
- teams need the same review rules across IDEs, CI, and pull requests
|
|
@@ -96,7 +108,7 @@ For a **single-hook** setup in downstream repos, keep using the stable id and sc
|
|
|
96
108
|
|
|
97
109
|
```yaml
|
|
98
110
|
- repo: https://github.com/nold-ai/specfact-cli
|
|
99
|
-
rev: v0.
|
|
111
|
+
rev: v0.47.4
|
|
100
112
|
hooks:
|
|
101
113
|
- id: specfact-smart-checks
|
|
102
114
|
```
|
|
@@ -124,17 +136,18 @@ SpecFact uses the same discipline it asks you to trust:
|
|
|
124
136
|
|
|
125
137
|
## For teams and organizations
|
|
126
138
|
|
|
127
|
-
SpecFact still scales beyond the solo-developer entry path
|
|
139
|
+
SpecFact still scales beyond the solo-developer entry path, but validation stays
|
|
140
|
+
the center:
|
|
128
141
|
|
|
129
|
-
- **
|
|
142
|
+
- **Upstream context adapters** for GitHub, Azure DevOps, Jira, Linear, OpenSpec, and Spec Kit inputs
|
|
130
143
|
- **DoR/DoD and policy enforcement** for teams that need repeatable gates
|
|
131
144
|
- **Evidence-backed PR review** with the same checks used locally
|
|
132
145
|
- **CI/CD adoption path** that keeps validation deterministic instead of model-driven
|
|
133
146
|
|
|
134
|
-
|
|
147
|
+
Optional module-deep paths include:
|
|
135
148
|
|
|
136
|
-
- `specfact
|
|
137
|
-
- `specfact
|
|
149
|
+
- `specfact project import ...`
|
|
150
|
+
- `specfact spec validate ...`
|
|
138
151
|
- `specfact backlog verify-readiness --bundle <bundle-name>`
|
|
139
152
|
- `specfact govern ...`
|
|
140
153
|
|
|
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specfact-cli"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "
|
|
7
|
+
version = "0.47.6"
|
|
8
|
+
description = "AI-bloat defense CLI for Python teams. Run deterministic code review, cleanup forecasts, and spec/contract evidence for AI-assisted and brownfield delivery."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
license = { file = "LICENSE" } # Apache License 2.0
|
|
@@ -14,8 +14,12 @@ authors = [
|
|
|
14
14
|
]
|
|
15
15
|
keywords = [
|
|
16
16
|
"agile",
|
|
17
|
+
"ai-bloat",
|
|
17
18
|
"devops",
|
|
18
19
|
"backlog",
|
|
20
|
+
"code-review",
|
|
21
|
+
"clean-code",
|
|
22
|
+
"technical-debt",
|
|
19
23
|
"scrum",
|
|
20
24
|
"kanban",
|
|
21
25
|
"safe",
|
|
@@ -220,9 +224,9 @@ security-audit = "python scripts/security_audit_gate.py"
|
|
|
220
224
|
# Development scripts
|
|
221
225
|
test = "pytest {args}"
|
|
222
226
|
test-cov = "pytest --cov=src --cov-report=term-missing {args}"
|
|
223
|
-
type-check = "basedpyright --pythonpath $(python -c 'import sys; print(sys.executable)') {args}"
|
|
227
|
+
type-check = "basedpyright --pythonpath \"$(python -c 'import sys; print(sys.executable)')\" {args}"
|
|
224
228
|
# basedpyright --level error: suppress warning noise in pre-commit (Block 1 runs `hatch run lint`).
|
|
225
|
-
lint = "ruff format . --check && basedpyright --level error --pythonpath $(python -c 'import sys; print(sys.executable)') && ruff check . && pylint src tests tools && python scripts/verify_safe_project_writes.py"
|
|
229
|
+
lint = "ruff format . --check && basedpyright --level error --pythonpath \"$(python -c 'import sys; print(sys.executable)')\" && ruff check . && pylint src tests tools && python scripts/verify_safe_project_writes.py"
|
|
226
230
|
lint-changed = "python scripts/run_changed_lint.py {args}"
|
|
227
231
|
governance = "pylint src tests tools --reports=y --output-format=parseable"
|
|
228
232
|
format = "ruff check . --fix && ruff format ."
|
|
@@ -247,12 +251,15 @@ yaml-check-all = "bash scripts/yaml-tools.sh check-all {args}"
|
|
|
247
251
|
# Docs validation (docs-12): command examples vs CLI; modules.specfact.io URLs in docs
|
|
248
252
|
check-docs-commands = "python scripts/check-docs-commands.py"
|
|
249
253
|
check-cross-site-links = "python scripts/check-cross-site-links.py"
|
|
254
|
+
generate-command-overview = "python scripts/generate-command-overview.py --write"
|
|
255
|
+
check-command-overview = "python scripts/generate-command-overview.py --check"
|
|
256
|
+
check-command-contract = "python scripts/check-command-contract.py"
|
|
250
257
|
doc-frontmatter-check = "python scripts/check_doc_frontmatter.py"
|
|
251
258
|
validate-agent-rule-signals = "python scripts/validate_agent_rule_applies_when.py"
|
|
252
259
|
check-version-sources = "python scripts/check_version_sources.py"
|
|
253
260
|
check-pypi-ahead = "python scripts/check_local_version_ahead_of_pypi.py"
|
|
254
261
|
release = "python scripts/check_local_version_ahead_of_pypi.py && python scripts/check_version_sources.py"
|
|
255
|
-
docs-validate = "python scripts/check-docs-commands.py && python scripts/check-cross-site-links.py --warn-only && python scripts/check_doc_frontmatter.py && python scripts/validate_agent_rule_applies_when.py"
|
|
262
|
+
docs-validate = "python scripts/generate-command-overview.py --check && python scripts/check-command-contract.py && python scripts/check-docs-commands.py && python scripts/check-cross-site-links.py --warn-only && python scripts/check_doc_frontmatter.py && python scripts/validate_agent_rule_applies_when.py"
|
|
256
263
|
|
|
257
264
|
# Legacy entry (kept for compatibility); prefer `workflows-lint` above
|
|
258
265
|
lint-workflows = "bash scripts/run_actionlint.sh {args}"
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"modules": [
|
|
3
3
|
{
|
|
4
|
-
"checksum_sha256": "
|
|
5
|
-
"download_url": "https://github.com/nold-ai/specfact-cli/releases/download/init-0.1.
|
|
4
|
+
"checksum_sha256": "3a563335d7a5e16e6e9ec975d6e5c77ff550d8880474eca03713b43e97d39a4a",
|
|
5
|
+
"download_url": "https://github.com/nold-ai/specfact-cli/releases/download/init-0.1.37.tar.gz",
|
|
6
6
|
"id": "init",
|
|
7
|
-
"latest_version": "0.1.
|
|
7
|
+
"latest_version": "0.1.37"
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
|
-
"checksum_sha256": "
|
|
11
|
-
"download_url": "https://github.com/nold-ai/specfact-cli/releases/download/upgrade-0.1.
|
|
10
|
+
"checksum_sha256": "35c592374b209224af9a826c21efa66947cc16bf680b20ee0463f44bee4f9b59",
|
|
11
|
+
"download_url": "https://github.com/nold-ai/specfact-cli/releases/download/upgrade-0.1.21.tar.gz",
|
|
12
12
|
"id": "upgrade",
|
|
13
|
-
"latest_version": "0.1.
|
|
13
|
+
"latest_version": "0.1.21"
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"checksum_sha256": "79359da27cb1c734a928a453a786b626e7b06654f515f32ead0cf96fa8e70bc2",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
- **Non-interactive / CI** must bootstrap workflow bundles before `specfact code …` or `specfact project …`:
|
|
21
21
|
- `specfact init --profile solo-developer --repo .` (or another profile / `specfact init --install …`), **or**
|
|
22
22
|
- `specfact module install nold-ai/specfact-codebase` (and other bundles as needed).
|
|
23
|
-
- Contract repro in CI uses **`specfact code repro
|
|
23
|
+
- Contract repro in CI uses **`specfact code repro`**. Optional: `specfact code repro setup` for CrossHair config.
|
|
24
24
|
- Optional `specfact project version check` needs a project under `.specfact/projects/<bundle>/` and `--bundle <name>`.
|
|
25
25
|
|
|
26
26
|
**SpecFact CLI Validation Results:**
|
|
@@ -64,4 +64,3 @@
|
|
|
64
64
|
## 📝 Notes
|
|
65
65
|
|
|
66
66
|
{{ notes | default("Add any additional notes here") }}
|
|
67
|
-
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"""
|
|
2
|
-
SpecFact CLI -
|
|
2
|
+
SpecFact CLI - AI-bloat defense CLI for Python teams.
|
|
3
3
|
|
|
4
4
|
This package provides command-line tools for:
|
|
5
|
+
- Defending AI-assisted code against cleanup bloat
|
|
5
6
|
- Turning code into clear specs and plans
|
|
6
7
|
- Keeping backlog, specs, tests, and code in sync
|
|
7
8
|
- Enforcing validation and contract checks before production
|
|
@@ -13,6 +14,7 @@ to ``sys.path`` so local development can load marketplace packages without insta
|
|
|
13
14
|
|
|
14
15
|
from __future__ import annotations
|
|
15
16
|
|
|
17
|
+
import importlib.util
|
|
16
18
|
import os
|
|
17
19
|
import sys
|
|
18
20
|
from pathlib import Path
|
|
@@ -25,6 +27,12 @@ def _candidate_modules_repo_roots() -> list[Path]:
|
|
|
25
27
|
roots.append(Path(configured).expanduser())
|
|
26
28
|
|
|
27
29
|
this_file = Path(__file__).resolve()
|
|
30
|
+
parts = this_file.parts
|
|
31
|
+
if "specfact-cli-worktrees" in parts:
|
|
32
|
+
marker_index = parts.index("specfact-cli-worktrees")
|
|
33
|
+
base = Path(*parts[:marker_index])
|
|
34
|
+
suffix = Path(*parts[marker_index + 1 : -3])
|
|
35
|
+
roots.append(base / "specfact-cli-modules-worktrees" / suffix)
|
|
28
36
|
for base in (this_file.parent.parent.parent, *this_file.parents):
|
|
29
37
|
roots.append(base / "specfact-cli-modules")
|
|
30
38
|
roots.append(base.parent / "specfact-cli-modules")
|
|
@@ -45,6 +53,29 @@ def _bootstrap_bundle_paths() -> None:
|
|
|
45
53
|
|
|
46
54
|
_bootstrap_bundle_paths()
|
|
47
55
|
|
|
48
|
-
|
|
56
|
+
|
|
57
|
+
def _install_progressive_disclosure() -> None:
|
|
58
|
+
module_name = "_specfact_progressive_disclosure_bootstrap"
|
|
59
|
+
if module_name in sys.modules:
|
|
60
|
+
return
|
|
61
|
+
module_path = Path(__file__).resolve().parent / "utils" / "progressive_disclosure.py"
|
|
62
|
+
spec = importlib.util.spec_from_file_location(module_name, module_path)
|
|
63
|
+
if spec is None or spec.loader is None:
|
|
64
|
+
return
|
|
65
|
+
module = importlib.util.module_from_spec(spec)
|
|
66
|
+
sys.modules[module_name] = module
|
|
67
|
+
try:
|
|
68
|
+
spec.loader.exec_module(module)
|
|
69
|
+
except Exception:
|
|
70
|
+
sys.modules.pop(module_name, None)
|
|
71
|
+
raise
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
# Install the shared Click/Typer usage-error contract as soon as core is imported.
|
|
75
|
+
# Module packages import specfact_cli before constructing direct Typer apps, so this
|
|
76
|
+
# keeps missing-command and missing-parameter UX consistent outside the root CLI too.
|
|
77
|
+
_install_progressive_disclosure()
|
|
78
|
+
|
|
79
|
+
__version__ = "0.47.6"
|
|
49
80
|
|
|
50
81
|
__all__ = ["__version__"]
|