specfact-cli 0.27.0__tar.gz → 0.28.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.27.0 → specfact_cli-0.28.0}/.gitignore +4 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/PKG-INFO +14 -1
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/README.md +13 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/pyproject.toml +6 -3
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/__init__.py +1 -1
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/__init__.py +1 -1
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/analyzers/graph_analyzer.py +6 -6
- specfact_cli-0.28.0/src/specfact_cli/commands/analyze.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/auth.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/backlog_commands.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/contract_cmd.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/drift.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/enforce.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/generate.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/import_cmd.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/init.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/migrate.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/plan.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/project_cmd.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/repro.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/sdd.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/spec.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/sync.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/update.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/commands/validate.py +6 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/generators/persona_exporter.py +1 -1
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/merge/resolver.py +1 -1
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/plan.py +4 -1
- specfact_cli-0.28.0/src/specfact_cli/modules/analyze/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/analyze/src/app.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/auth/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/auth/src/app.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/backlog/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/backlog/src/app.py +6 -0
- specfact_cli-0.27.0/src/specfact_cli/commands/backlog_commands.py → specfact_cli-0.28.0/src/specfact_cli/modules/backlog/src/commands.py +4 -2
- specfact_cli-0.28.0/src/specfact_cli/modules/contract/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/contract/src/app.py +6 -0
- specfact_cli-0.27.0/src/specfact_cli/commands/contract_cmd.py → specfact_cli-0.28.0/src/specfact_cli/modules/contract/src/commands.py +6 -3
- specfact_cli-0.28.0/src/specfact_cli/modules/drift/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/drift/src/app.py +6 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/enforce/module-package.yaml +2 -1
- specfact_cli-0.28.0/src/specfact_cli/modules/enforce/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/enforce/src/app.py +6 -0
- specfact_cli-0.27.0/src/specfact_cli/commands/enforce.py → specfact_cli-0.28.0/src/specfact_cli/modules/enforce/src/commands.py +1 -1
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/generate/module-package.yaml +2 -1
- specfact_cli-0.28.0/src/specfact_cli/modules/generate/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/generate/src/app.py +6 -0
- specfact_cli-0.27.0/src/specfact_cli/commands/generate.py → specfact_cli-0.28.0/src/specfact_cli/modules/generate/src/commands.py +1 -1
- specfact_cli-0.28.0/src/specfact_cli/modules/import_cmd/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/import_cmd/src/app.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/init/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/init/src/app.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/migrate/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/migrate/src/app.py +6 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/plan/module-package.yaml +2 -1
- specfact_cli-0.28.0/src/specfact_cli/modules/plan/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/plan/src/app.py +6 -0
- specfact_cli-0.27.0/src/specfact_cli/commands/plan.py → specfact_cli-0.28.0/src/specfact_cli/modules/plan/src/commands.py +29 -16
- specfact_cli-0.28.0/src/specfact_cli/modules/project/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/project/src/app.py +6 -0
- specfact_cli-0.27.0/src/specfact_cli/commands/project_cmd.py → specfact_cli-0.28.0/src/specfact_cli/modules/project/src/commands.py +6 -9
- specfact_cli-0.28.0/src/specfact_cli/modules/repro/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/repro/src/app.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/sdd/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/sdd/src/app.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/spec/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/spec/src/app.py +6 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/sync/module-package.yaml +3 -1
- specfact_cli-0.28.0/src/specfact_cli/modules/sync/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/sync/src/app.py +6 -0
- specfact_cli-0.27.0/src/specfact_cli/commands/sync.py → specfact_cli-0.28.0/src/specfact_cli/modules/sync/src/commands.py +87 -9
- specfact_cli-0.28.0/src/specfact_cli/modules/upgrade/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/upgrade/src/app.py +6 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/validate/src/__init__.py +1 -0
- specfact_cli-0.28.0/src/specfact_cli/modules/validate/src/app.py +6 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/parsers/persona_importer.py +2 -2
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/registry/registry.py +17 -3
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/git.py +3 -3
- specfact_cli-0.28.0/src/specfact_cli/utils/persona_ownership.py +34 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/source_scanner.py +14 -11
- specfact_cli-0.27.0/src/specfact_cli/modules/analyze/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/auth/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/backlog/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/contract/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/drift/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/enforce/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/generate/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/import_cmd/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/init/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/migrate/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/plan/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/project/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/repro/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/sdd/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/spec/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/sync/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/upgrade/src/app.py +0 -6
- specfact_cli-0.27.0/src/specfact_cli/modules/validate/src/app.py +0 -6
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/LICENSE.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/shared/cli-enforcement.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.01-import.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.02-plan.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.03-review.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.04-sdd.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.05-enforce.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.06-sync.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.07-contracts.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.backlog-daily.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.backlog-refine.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.compare.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.sync-backlog.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/prompts/specfact.validate.md +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/field_mappings/ado_agile.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/field_mappings/ado_default.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/field_mappings/ado_kanban.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/field_mappings/ado_safe.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/field_mappings/ado_scrum.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/frameworks/safe/safe_feature_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/personas/developer/developer_task_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/backlog/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/persona/architect.md.j2 +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/persona/developer.md.j2 +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/persona/product-owner.md.j2 +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/pr-template.md.j2 +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/__main__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/adapters/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/adapters/ado.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/adapters/base.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/adapters/github.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/adapters/openspec.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/adapters/openspec_parser.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/adapters/registry.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/adapters/speckit.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/agents/analyze_agent.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/adapters/local_yaml_adapter.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/ai_refiner.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/converter.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/filters.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/format_detector.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/formats/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/formats/base.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/formats/markdown_format.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/formats/structured_format.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/backlog/template_detector.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/cli.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/commands/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/common/logger_setup.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/common/logging_utils.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/contracts/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/generators/contract_generator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/generators/openapi_extractor.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/generators/test_to_openapi.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/merge/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/backlog_item.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/capabilities.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/change.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/contract.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/dor_config.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/persona_template.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/project.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/analyze/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/analyze.py → /specfact_cli-0.28.0/src/specfact_cli/modules/analyze/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/auth/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/auth.py → /specfact_cli-0.28.0/src/specfact_cli/modules/auth/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/backlog/module-package.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/contract/module-package.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/drift/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/drift.py → /specfact_cli-0.28.0/src/specfact_cli/modules/drift/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/import_cmd/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/import_cmd.py → /specfact_cli-0.28.0/src/specfact_cli/modules/import_cmd/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/init/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/init.py → /specfact_cli-0.28.0/src/specfact_cli/modules/init/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/migrate/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/migrate.py → /specfact_cli-0.28.0/src/specfact_cli/modules/migrate/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/project/module-package.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/repro/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/repro.py → /specfact_cli-0.28.0/src/specfact_cli/modules/repro/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/sdd/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/sdd.py → /specfact_cli-0.28.0/src/specfact_cli/modules/sdd/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/spec/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/spec.py → /specfact_cli-0.28.0/src/specfact_cli/modules/spec/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/upgrade/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/update.py → /specfact_cli-0.28.0/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/modules/validate/module-package.yaml +0 -0
- /specfact_cli-0.27.0/src/specfact_cli/commands/validate.py → /specfact_cli-0.28.0/src/specfact_cli/modules/validate/src/commands.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/parsers/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/registry/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/registry/bootstrap.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/registry/help_cache.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/registry/metadata.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/registry/module_packages.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/registry/module_state.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/runtime.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/bridge_sync.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/bridge_watch.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/spec_to_code.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/bridge_templates.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/registry.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/context_detection.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/enrichment_parser.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/env_manager.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/ide_setup.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/metadata.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/optional_deps.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/progress.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/startup_checks.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/structure.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/suggestions.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/terminal.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/agile_validation.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/cli_first_validator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/contract_validator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/schema.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/versioning/__init__.py +0 -0
- {specfact_cli-0.27.0 → specfact_cli-0.28.0}/src/specfact_cli/versioning/analyzer.py +0 -0
|
@@ -107,6 +107,10 @@ docs/internal/
|
|
|
107
107
|
.github/prompts/specfact.*.md
|
|
108
108
|
.github/prompts/opsx-*.md
|
|
109
109
|
|
|
110
|
+
.claude/commands/opsx/
|
|
111
|
+
.claude/skills/openspec-*/
|
|
112
|
+
!.claude/skills/openspec-workflows/
|
|
113
|
+
|
|
110
114
|
# Semgrep rules (generated from tools/semgrep/ - source rules are versioned)
|
|
111
115
|
.semgrep/
|
|
112
116
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specfact-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.28.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
|
|
@@ -414,6 +414,19 @@ Most tools help **either** coders **or** agile teams. SpecFact does both:
|
|
|
414
414
|
|
|
415
415
|
---
|
|
416
416
|
|
|
417
|
+
## Developer Note: Command Layout
|
|
418
|
+
|
|
419
|
+
- Primary command implementations live in `src/specfact_cli/modules/<module>/src/commands.py`.
|
|
420
|
+
- Legacy imports from `src/specfact_cli/commands/*.py` are compatibility shims and only guarantee `app` re-exports.
|
|
421
|
+
- Preferred imports for module code:
|
|
422
|
+
- `from specfact_cli.modules.<module>.src.commands import app`
|
|
423
|
+
- `from specfact_cli.modules.<module>.src.commands import <symbol>`
|
|
424
|
+
- Shim deprecation timeline:
|
|
425
|
+
- Legacy shim usage is deprecated for non-`app` symbols now.
|
|
426
|
+
- Shim removal is planned no earlier than `v0.30` (or the next major migration window).
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
417
430
|
## Where SpecFact Fits
|
|
418
431
|
|
|
419
432
|
SpecFact complements your stack rather than replacing it.
|
|
@@ -136,6 +136,19 @@ Most tools help **either** coders **or** agile teams. SpecFact does both:
|
|
|
136
136
|
|
|
137
137
|
---
|
|
138
138
|
|
|
139
|
+
## Developer Note: Command Layout
|
|
140
|
+
|
|
141
|
+
- Primary command implementations live in `src/specfact_cli/modules/<module>/src/commands.py`.
|
|
142
|
+
- Legacy imports from `src/specfact_cli/commands/*.py` are compatibility shims and only guarantee `app` re-exports.
|
|
143
|
+
- Preferred imports for module code:
|
|
144
|
+
- `from specfact_cli.modules.<module>.src.commands import app`
|
|
145
|
+
- `from specfact_cli.modules.<module>.src.commands import <symbol>`
|
|
146
|
+
- Shim deprecation timeline:
|
|
147
|
+
- Legacy shim usage is deprecated for non-`app` symbols now.
|
|
148
|
+
- Shim removal is planned no earlier than `v0.30` (or the next major migration window).
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
139
152
|
## Where SpecFact Fits
|
|
140
153
|
|
|
141
154
|
SpecFact complements your stack rather than replacing it.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specfact-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.28.0"
|
|
8
8
|
description = "The swiss knife CLI for agile DevOps teams. Keep backlog, specs, tests, and code in sync with validation and contract enforcement for new projects and long-lived codebases."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -193,8 +193,8 @@ validate-prompts = "python tools/validate_prompts.py"
|
|
|
193
193
|
# Development scripts
|
|
194
194
|
test = "pytest {args}"
|
|
195
195
|
test-cov = "pytest --cov=src --cov-report=term-missing {args}"
|
|
196
|
-
type-check = "basedpyright {args}"
|
|
197
|
-
lint = "ruff format . --check && basedpyright && ruff check . && pylint src tests tools"
|
|
196
|
+
type-check = "basedpyright --pythonpath $(python -c 'import sys; print(sys.executable)') {args}"
|
|
197
|
+
lint = "ruff format . --check && basedpyright --pythonpath $(python -c 'import sys; print(sys.executable)') && ruff check . && pylint src tests tools"
|
|
198
198
|
governance = "pylint src tests tools --reports=y --output-format=parseable"
|
|
199
199
|
format = "ruff check . --fix && ruff format ."
|
|
200
200
|
|
|
@@ -705,6 +705,9 @@ ignore = [
|
|
|
705
705
|
"src/specfact_cli/commands/**/*" = [
|
|
706
706
|
"B008", # typer.Option/Argument in defaults (common Typer pattern)
|
|
707
707
|
]
|
|
708
|
+
"src/specfact_cli/modules/**/src/commands.py" = [
|
|
709
|
+
"B008", # typer.Option/Argument in defaults (common Typer pattern)
|
|
710
|
+
]
|
|
708
711
|
|
|
709
712
|
[tool.ruff.lint.isort]
|
|
710
713
|
# Match isort ruff profile configuration
|
|
@@ -370,11 +370,11 @@ class GraphAnalyzer:
|
|
|
370
370
|
|
|
371
371
|
Tries multiple strategies:
|
|
372
372
|
1. Exact match
|
|
373
|
-
2. Last part match (e.g., "import_cmd" matches "src.specfact_cli.
|
|
374
|
-
3. Partial path match (e.g., "specfact_cli.commands" matches "src.specfact_cli.
|
|
373
|
+
2. Last part match (e.g., "import_cmd" matches "src.specfact_cli.modules.import_cmd.src.commands")
|
|
374
|
+
3. Partial path match (e.g., "specfact_cli.commands" matches "src.specfact_cli.modules.import_cmd.src.commands")
|
|
375
375
|
|
|
376
376
|
Args:
|
|
377
|
-
imported: Imported module name (e.g., "specfact_cli.
|
|
377
|
+
imported: Imported module name (e.g., "specfact_cli.modules.import_cmd.src.commands")
|
|
378
378
|
known_modules: List of known module names in the graph
|
|
379
379
|
|
|
380
380
|
Returns:
|
|
@@ -385,14 +385,14 @@ class GraphAnalyzer:
|
|
|
385
385
|
return imported
|
|
386
386
|
|
|
387
387
|
# Strategy 2: Last part match
|
|
388
|
-
# e.g., "import_cmd" matches "src.specfact_cli.
|
|
388
|
+
# e.g., "import_cmd" matches "src.specfact_cli.modules.import_cmd.src.commands"
|
|
389
389
|
imported_last = imported.split(".")[-1]
|
|
390
390
|
for module in known_modules:
|
|
391
391
|
if module.endswith(f".{imported_last}") or module == imported_last:
|
|
392
392
|
return module
|
|
393
393
|
|
|
394
394
|
# Strategy 3: Partial path match
|
|
395
|
-
# e.g., "specfact_cli.commands" matches "src.specfact_cli.
|
|
395
|
+
# e.g., "specfact_cli.commands" matches "src.specfact_cli.modules.import_cmd.src.commands"
|
|
396
396
|
for module in known_modules:
|
|
397
397
|
# Check if imported is a prefix of module
|
|
398
398
|
if module.startswith(imported + ".") or module == imported:
|
|
@@ -406,7 +406,7 @@ class GraphAnalyzer:
|
|
|
406
406
|
for module in known_modules:
|
|
407
407
|
module_parts = module.split(".")
|
|
408
408
|
# Check if there's overlap in the path
|
|
409
|
-
# e.g., "commands.import_cmd" might match "src.specfact_cli.
|
|
409
|
+
# e.g., "commands.import_cmd" might match "src.specfact_cli.modules.import_cmd.src.commands"
|
|
410
410
|
if len(imported_parts) >= 2 and len(module_parts) >= 2 and imported_parts[-2:] == module_parts[-2:]:
|
|
411
411
|
return module
|
|
412
412
|
|
|
@@ -108,7 +108,7 @@ class PersonaExporter:
|
|
|
108
108
|
Returns:
|
|
109
109
|
Template context dictionary
|
|
110
110
|
"""
|
|
111
|
-
from specfact_cli.
|
|
111
|
+
from specfact_cli.utils.persona_ownership import match_section_pattern
|
|
112
112
|
|
|
113
113
|
context: dict[str, Any] = {
|
|
114
114
|
"bundle_name": bundle.bundle_name,
|
|
@@ -355,7 +355,7 @@ class PersonaMergeResolver:
|
|
|
355
355
|
Returns:
|
|
356
356
|
Persona name if persona owns section, None otherwise
|
|
357
357
|
"""
|
|
358
|
-
from specfact_cli.
|
|
358
|
+
from specfact_cli.utils.persona_ownership import check_persona_ownership
|
|
359
359
|
|
|
360
360
|
if check_persona_ownership(persona, manifest, section_path):
|
|
361
361
|
return persona
|
|
@@ -290,4 +290,7 @@ class PlanBundle(BaseModel):
|
|
|
290
290
|
external_dependencies=[],
|
|
291
291
|
summary=None,
|
|
292
292
|
)
|
|
293
|
-
|
|
293
|
+
metadata = self.metadata
|
|
294
|
+
if metadata is None:
|
|
295
|
+
return
|
|
296
|
+
metadata.summary = self.compute_summary(include_hash=include_hash)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|
|
@@ -1538,14 +1538,16 @@ def refine(
|
|
|
1538
1538
|
built_in_loaded = True
|
|
1539
1539
|
else:
|
|
1540
1540
|
# Fallback: Try relative to repo root (development mode)
|
|
1541
|
-
|
|
1541
|
+
# __file__ = src/specfact_cli/modules/backlog/src/commands.py → 6 parents to repo root
|
|
1542
|
+
repo_root = Path(__file__).parent.parent.parent.parent.parent.parent
|
|
1542
1543
|
resources_templates_dir = repo_root / "resources" / "templates" / "backlog"
|
|
1543
1544
|
if resources_templates_dir.exists():
|
|
1544
1545
|
registry.load_templates_from_directory(resources_templates_dir)
|
|
1545
1546
|
built_in_loaded = True
|
|
1546
1547
|
else:
|
|
1547
1548
|
# 2. Fallback to src/specfact_cli/templates/ for backward compatibility
|
|
1548
|
-
|
|
1549
|
+
# __file__ → 4 parents to reach src/specfact_cli/
|
|
1550
|
+
src_templates_dir = Path(__file__).parent.parent.parent.parent / "templates"
|
|
1549
1551
|
if src_templates_dir.exists():
|
|
1550
1552
|
registry.load_templates_from_directory(src_templates_dir)
|
|
1551
1553
|
built_in_loaded = True
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|
|
@@ -113,7 +113,7 @@ def init_contract(
|
|
|
113
113
|
if not bundle_names:
|
|
114
114
|
print_error("No valid bundle names found")
|
|
115
115
|
raise typer.Exit(1)
|
|
116
|
-
|
|
116
|
+
bundle = Prompt.ask("Select bundle", choices=bundle_names)
|
|
117
117
|
elif bundle is None:
|
|
118
118
|
print_error("Bundle not specified and no active bundle found")
|
|
119
119
|
raise typer.Exit(1)
|
|
@@ -278,7 +278,7 @@ def _update_contract_index(bundle: ProjectBundle, feature_key: str, contract_pat
|
|
|
278
278
|
endpoints_count = count_endpoints(contract_data)
|
|
279
279
|
checksum = hashlib.sha256(contract_file.read_bytes()).hexdigest()
|
|
280
280
|
except Exception:
|
|
281
|
-
|
|
281
|
+
print_warning(f"Failed to load or analyze contract file '{contract_file}'. Using default metadata.")
|
|
282
282
|
|
|
283
283
|
contract_index = ContractIndex(
|
|
284
284
|
feature_key=feature_key,
|
|
@@ -718,7 +718,10 @@ def serve_contract(
|
|
|
718
718
|
|
|
719
719
|
feature_choices = [f"{key}: {obj.title}" for key, obj in features_with_contracts]
|
|
720
720
|
selected = Prompt.ask("Select feature contract", choices=feature_choices)
|
|
721
|
-
feature = selected.split(":")[0]
|
|
721
|
+
feature = selected.split(":", 1)[0].strip()
|
|
722
|
+
if feature not in bundle_obj.features:
|
|
723
|
+
print_error(f"Selected feature '{feature}' not found in bundle")
|
|
724
|
+
raise typer.Exit(1)
|
|
722
725
|
feature_obj = bundle_obj.features[feature]
|
|
723
726
|
if not feature_obj.contract:
|
|
724
727
|
print_error(f"Feature '{feature}' has no contract")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|
|
@@ -296,7 +296,7 @@ def enforce_sdd(
|
|
|
296
296
|
raise typer.Exit(1)
|
|
297
297
|
|
|
298
298
|
# Convert to PlanBundle for compatibility with validation functions
|
|
299
|
-
from specfact_cli.
|
|
299
|
+
from specfact_cli.modules.plan.src.commands import _convert_project_bundle_to_plan_bundle
|
|
300
300
|
|
|
301
301
|
plan_bundle = _convert_project_bundle_to_plan_bundle(project_bundle)
|
|
302
302
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|
|
@@ -241,7 +241,7 @@ def generate_contracts(
|
|
|
241
241
|
plan_hash = None
|
|
242
242
|
if format_type == BundleFormat.MODULAR or bundle:
|
|
243
243
|
# Load modular ProjectBundle and convert to PlanBundle for compatibility
|
|
244
|
-
from specfact_cli.
|
|
244
|
+
from specfact_cli.modules.plan.src.commands import _convert_project_bundle_to_plan_bundle
|
|
245
245
|
|
|
246
246
|
project_bundle = load_bundle_with_progress(plan_path, validate_hashes=False, console_instance=console)
|
|
247
247
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module package source namespace."""
|