specfact-cli 0.39.0__tar.gz → 0.40.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.39.0 → specfact_cli-0.40.0}/PKG-INFO +60 -14
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/README.md +59 -13
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/pyproject.toml +8 -1
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/__init__.py +1 -1
- specfact_cli-0.40.0/src/specfact_cli/__init__.py +47 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/ado.py +4 -4
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/github.py +2 -2
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/cli.py +64 -1
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/commands/__init__.py +0 -23
- specfact_cli-0.40.0/src/specfact_cli/commands/_bundle_shim.py +14 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/analyze.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/backlog_commands.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/contract_cmd.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/drift.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/enforce.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/generate.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/import_cmd.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/init.py +17 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/migrate.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/plan.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/project_cmd.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/repro.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/sdd.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/spec.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/sync.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/update.py +17 -0
- specfact_cli-0.40.0/src/specfact_cli/commands/validate.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/common/bundle_factory.py +42 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/backlog_group.py +22 -3
- specfact_cli-0.40.0/src/specfact_cli/modules/_bundle_import.py +36 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/module-package.yaml +4 -4
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/src/commands.py +54 -7
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/module-package.yaml +4 -4
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/commands.py +65 -2
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/module-package.yaml +4 -4
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/crypto_validator.py +62 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/custom_registries.py +23 -14
- specfact_cli-0.40.0/src/specfact_cli/registry/marketplace_client.py +296 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_grouping.py +14 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_installer.py +182 -3
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_lifecycle.py +7 -2
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_packages.py +190 -110
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/runtime.py +4 -4
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/persona_ownership.py +8 -6
- specfact_cli-0.39.0/src/specfact_cli/__init__.py +0 -13
- specfact_cli-0.39.0/src/specfact_cli/commands/analyze.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/auth.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/backlog_commands.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/contract_cmd.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/drift.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/enforce.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/generate.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/import_cmd.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/init.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/migrate.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/plan.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/project_cmd.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/repro.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/sdd.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/spec.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/sync.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/update.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/commands/validate.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/analyze/module-package.yaml +0 -23
- specfact_cli-0.39.0/src/specfact_cli/modules/analyze/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/analyze/src/commands.py +0 -368
- specfact_cli-0.39.0/src/specfact_cli/modules/auth/module-package.yaml +0 -21
- specfact_cli-0.39.0/src/specfact_cli/modules/auth/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/auth/src/commands.py +0 -726
- specfact_cli-0.39.0/src/specfact_cli/modules/backlog/module-package.yaml +0 -36
- specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/__init__.py +0 -9
- specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/ado.py +0 -20
- specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/base.py +0 -93
- specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/github.py +0 -20
- specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/jira.py +0 -20
- specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/adapters/linear.py +0 -20
- specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/backlog/src/commands.py +0 -5546
- specfact_cli-0.39.0/src/specfact_cli/modules/contract/module-package.yaml +0 -23
- specfact_cli-0.39.0/src/specfact_cli/modules/contract/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/contract/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/contract/src/commands.py +0 -1251
- specfact_cli-0.39.0/src/specfact_cli/modules/drift/module-package.yaml +0 -23
- specfact_cli-0.39.0/src/specfact_cli/modules/drift/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/drift/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/drift/src/commands.py +0 -253
- specfact_cli-0.39.0/src/specfact_cli/modules/enforce/module-package.yaml +0 -24
- specfact_cli-0.39.0/src/specfact_cli/modules/enforce/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/enforce/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/enforce/src/commands.py +0 -677
- specfact_cli-0.39.0/src/specfact_cli/modules/generate/module-package.yaml +0 -24
- specfact_cli-0.39.0/src/specfact_cli/modules/generate/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/generate/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/generate/src/commands.py +0 -2188
- specfact_cli-0.39.0/src/specfact_cli/modules/import_cmd/module-package.yaml +0 -23
- specfact_cli-0.39.0/src/specfact_cli/modules/import_cmd/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/import_cmd/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/import_cmd/src/commands.py +0 -2924
- specfact_cli-0.39.0/src/specfact_cli/modules/init/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/migrate/module-package.yaml +0 -23
- specfact_cli-0.39.0/src/specfact_cli/modules/migrate/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/migrate/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/migrate/src/commands.py +0 -935
- specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/module-package.yaml +0 -24
- specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/commands.py +0 -58
- specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/__init__.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/apply.py +0 -80
- specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/__init__.py +0 -8
- specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/applier.py +0 -62
- specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/generator.py +0 -33
- specfact_cli-0.39.0/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/idempotency.py +0 -42
- specfact_cli-0.39.0/src/specfact_cli/modules/plan/module-package.yaml +0 -24
- specfact_cli-0.39.0/src/specfact_cli/modules/plan/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/plan/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/plan/src/commands.py +0 -5574
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/module-package.yaml +0 -30
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/commands.py +0 -22
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/__init__.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/config/__init__.py +0 -13
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/config/policy_config.py +0 -71
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/config/templates.py +0 -56
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/__init__.py +0 -7
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/suggester.py +0 -35
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/validator.py +0 -257
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/main.py +0 -329
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/models/__init__.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/models/policy_result.py +0 -35
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/__init__.py +0 -8
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/kanban.py +0 -65
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/safe.py +0 -47
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/scrum.py +0 -58
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/__init__.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/policy_registry.py +0 -37
- specfact_cli-0.39.0/src/specfact_cli/modules/project/module-package.yaml +0 -23
- specfact_cli-0.39.0/src/specfact_cli/modules/project/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/project/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/project/src/commands.py +0 -2498
- specfact_cli-0.39.0/src/specfact_cli/modules/repro/module-package.yaml +0 -23
- specfact_cli-0.39.0/src/specfact_cli/modules/repro/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/repro/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/repro/src/commands.py +0 -579
- specfact_cli-0.39.0/src/specfact_cli/modules/sdd/module-package.yaml +0 -23
- specfact_cli-0.39.0/src/specfact_cli/modules/sdd/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/sdd/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/sdd/src/commands.py +0 -415
- specfact_cli-0.39.0/src/specfact_cli/modules/spec/module-package.yaml +0 -23
- specfact_cli-0.39.0/src/specfact_cli/modules/spec/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/spec/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/spec/src/commands.py +0 -902
- specfact_cli-0.39.0/src/specfact_cli/modules/sync/module-package.yaml +0 -26
- specfact_cli-0.39.0/src/specfact_cli/modules/sync/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/sync/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/sync/src/commands.py +0 -2504
- specfact_cli-0.39.0/src/specfact_cli/modules/upgrade/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/validate/module-package.yaml +0 -23
- specfact_cli-0.39.0/src/specfact_cli/modules/validate/src/__init__.py +0 -1
- specfact_cli-0.39.0/src/specfact_cli/modules/validate/src/app.py +0 -6
- specfact_cli-0.39.0/src/specfact_cli/modules/validate/src/commands.py +0 -321
- specfact_cli-0.39.0/src/specfact_cli/registry/marketplace_client.py +0 -136
- specfact_cli-0.39.0/src/specfact_cli/templates/bridge_templates.py +0 -243
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/.gitignore +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/LICENSE +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/keys/README.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/keys/module-signing-public.pem +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/shared/cli-enforcement.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.01-import.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.02-plan.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.03-review.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.04-sdd.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.05-enforce.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.06-sync.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.07-contracts.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-add.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-daily.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-refine.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.compare.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.sync-backlog.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/prompts/specfact.validate.md +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_agile.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_default.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_kanban.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_safe.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_scrum.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/frameworks/safe/safe_feature_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/personas/developer/developer_task_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/backlog/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/persona/architect.md.j2 +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/persona/developer.md.j2 +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/persona/product-owner.md.j2 +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/policies/kanban.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/policies/mixed.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/policies/safe.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/policies/scrum.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/pr-template.md.j2 +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/__main__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/base.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/openspec.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/openspec_parser.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/registry.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/adapters/speckit.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/analyze_agent.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/local_yaml_adapter.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/ai_refiner.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/converter.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/filters.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/format_detector.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/base.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/markdown_format.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/structured_format.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/backlog/template_detector.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/common/logger_setup.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/common/logging_utils.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/contracts/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/contracts/module_interface.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/contract_generator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/openapi_extractor.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/persona_exporter.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/test_to_openapi.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/codebase_group.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/govern_group.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/project_group.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/groups/spec_group.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/merge/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/merge/resolver.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/backlog_item.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/capabilities.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/change.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/contract.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/dor_config.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/module_package.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/persona_template.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/plan.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/project.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/models/validation.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/__init__.py +0 -0
- {specfact_cli-0.39.0/src/specfact_cli/modules/analyze → specfact_cli-0.40.0/src/specfact_cli/modules/init}/src/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/src/app.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/src/first_run_selection.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_io_shim.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
- {specfact_cli-0.39.0/src/specfact_cli/modules/auth → specfact_cli-0.40.0/src/specfact_cli/modules/upgrade}/src/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/parsers/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/parsers/persona_importer.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/alias_manager.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/bootstrap.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/bridge_registry.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/dependency_resolver.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/extension_registry.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/help_cache.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/metadata.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_discovery.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_security.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_state.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/registry/registry.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_sync.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_watch.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/spec_to_code.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/registry.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/bundle_converters.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/context_detection.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/enrichment_parser.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/env_manager.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/git.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/ide_setup.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/metadata.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/optional_deps.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/progress.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/source_scanner.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/startup_checks.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/structure.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/suggestions.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/terminal.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/agile_validation.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/cli_first_validator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/contract_validator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/schema.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/versioning/__init__.py +0 -0
- {specfact_cli-0.39.0 → specfact_cli-0.40.0}/src/specfact_cli/versioning/analyzer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specfact-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.40.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
|
|
@@ -313,8 +313,12 @@ pip install -U specfact-cli
|
|
|
313
313
|
### Bootstrap and IDE Setup
|
|
314
314
|
|
|
315
315
|
```bash
|
|
316
|
-
#
|
|
317
|
-
specfact init
|
|
316
|
+
# First run: install workflow bundles (required)
|
|
317
|
+
specfact init --profile solo-developer
|
|
318
|
+
|
|
319
|
+
# Other first-run options
|
|
320
|
+
specfact init --install backlog,codebase
|
|
321
|
+
specfact init --install all
|
|
318
322
|
|
|
319
323
|
# First-run bundle selection (examples)
|
|
320
324
|
specfact init --profile solo-developer
|
|
@@ -338,6 +342,14 @@ specfact code validate sidecar init my-project /path/to/repo
|
|
|
338
342
|
specfact code validate sidecar run my-project /path/to/repo
|
|
339
343
|
```
|
|
340
344
|
|
|
345
|
+
### Migration Note (Flat Commands Removed)
|
|
346
|
+
|
|
347
|
+
As of `0.40.0`, flat root commands are removed. Use grouped commands:
|
|
348
|
+
|
|
349
|
+
- `specfact validate ...` -> `specfact code validate ...`
|
|
350
|
+
- `specfact plan ...` -> `specfact project plan ...`
|
|
351
|
+
- `specfact policy ...` -> `specfact backlog policy ...`
|
|
352
|
+
|
|
341
353
|
### Backlog Bridge (60 seconds)
|
|
342
354
|
|
|
343
355
|
SpecFact's USP is closing the drift gap between **backlog -> specs -> code**.
|
|
@@ -352,7 +364,7 @@ specfact backlog daily ado --ado-org <org> --ado-project "<project>" --state any
|
|
|
352
364
|
specfact backlog refine ado --ado-org <org> --ado-project "<project>" --id <work-item-id> --preview
|
|
353
365
|
|
|
354
366
|
# 3) Keep backlog + spec intent aligned (avoid silent drift)
|
|
355
|
-
specfact policy validate --group-by-item
|
|
367
|
+
specfact backlog policy validate --group-by-item
|
|
356
368
|
```
|
|
357
369
|
|
|
358
370
|
For GitHub, replace adapter/org/project with:
|
|
@@ -420,8 +432,8 @@ Most tools help **either** coders **or** agile teams. SpecFact does both:
|
|
|
420
432
|
Recommended command entrypoints:
|
|
421
433
|
- `specfact backlog ceremony standup ...`
|
|
422
434
|
- `specfact backlog ceremony refinement ...`
|
|
423
|
-
- `specfact policy validate ...`
|
|
424
|
-
- `specfact policy suggest ...`
|
|
435
|
+
- `specfact backlog policy validate ...`
|
|
436
|
+
- `specfact backlog policy suggest ...`
|
|
425
437
|
|
|
426
438
|
What the Policy Engine does in practice:
|
|
427
439
|
- Turns team agreements (DoR, DoD, flow checks) into executable checks against your real backlog data.
|
|
@@ -429,9 +441,9 @@ What the Policy Engine does in practice:
|
|
|
429
441
|
- Generates patch-ready suggestions so teams can fix policy gaps quickly without guessing.
|
|
430
442
|
|
|
431
443
|
Start with:
|
|
432
|
-
- `specfact policy init --template scrum`
|
|
433
|
-
- `specfact policy validate --group-by-item`
|
|
434
|
-
- `specfact policy suggest --group-by-item --limit 5`
|
|
444
|
+
- `specfact backlog policy init --template scrum`
|
|
445
|
+
- `specfact backlog policy validate --group-by-item`
|
|
446
|
+
- `specfact backlog policy suggest --group-by-item --limit 5`
|
|
435
447
|
|
|
436
448
|
**Try it now**
|
|
437
449
|
|
|
@@ -442,13 +454,12 @@ Start with:
|
|
|
442
454
|
|
|
443
455
|
## Modules and Capabilities
|
|
444
456
|
|
|
445
|
-
**Core
|
|
457
|
+
**Core runtime**
|
|
446
458
|
|
|
447
|
-
- **
|
|
448
|
-
- **
|
|
449
|
-
- **Report**: CI/CD summaries and evidence outputs.
|
|
459
|
+
- **Permanent commands**: `init`, `module`, `upgrade`
|
|
460
|
+
- **Core responsibilities**: lifecycle, registry, trust, contracts, orchestration, shared runtime utilities
|
|
450
461
|
|
|
451
|
-
**
|
|
462
|
+
**Marketplace-installed bundles**
|
|
452
463
|
|
|
453
464
|
- **Backlog**: Refinement, dependency analysis, sprint summaries, risk rollups.
|
|
454
465
|
- **Ceremony**: Standup, refinement, and planning entry points.
|
|
@@ -467,6 +478,41 @@ For technical architecture details (module lifecycle, registry internals, adapte
|
|
|
467
478
|
- [Architecture Docs Index](docs/architecture/README.md)
|
|
468
479
|
- [Architecture Implementation Status](docs/architecture/implementation-status.md)
|
|
469
480
|
|
|
481
|
+
### Official Marketplace Bundles
|
|
482
|
+
|
|
483
|
+
SpecFact ships official bundle packages via the dedicated marketplace registry repository
|
|
484
|
+
`nold-ai/specfact-cli-modules`.
|
|
485
|
+
Bundle-specific docs are still temporarily hosted in this docs set while the long-term
|
|
486
|
+
bundle docs home is prepared in the modules repository docs site:
|
|
487
|
+
`https://nold-ai.github.io/specfact-cli-modules/`.
|
|
488
|
+
|
|
489
|
+
Install examples:
|
|
490
|
+
|
|
491
|
+
```bash
|
|
492
|
+
specfact module install nold-ai/specfact-project
|
|
493
|
+
specfact module install nold-ai/specfact-backlog
|
|
494
|
+
specfact module install nold-ai/specfact-codebase
|
|
495
|
+
specfact module install nold-ai/specfact-spec
|
|
496
|
+
specfact module install nold-ai/specfact-govern
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
If startup warns that bundled modules are missing or outdated, run:
|
|
500
|
+
|
|
501
|
+
```bash
|
|
502
|
+
specfact module init --scope project
|
|
503
|
+
specfact module init
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
Official bundles are verified as `official` tier (`nold-ai` publisher). Some bundles
|
|
507
|
+
auto-install dependencies:
|
|
508
|
+
|
|
509
|
+
- `nold-ai/specfact-spec` pulls `nold-ai/specfact-project`
|
|
510
|
+
- `nold-ai/specfact-govern` pulls `nold-ai/specfact-project`
|
|
511
|
+
|
|
512
|
+
Use this repo's docs for the current CLI/runtime release branch. Module-specific guides
|
|
513
|
+
will move to `specfact-cli-modules` so future bundle-only changes do not require ongoing
|
|
514
|
+
docs maintenance in long-lived `specfact-cli` release branches.
|
|
515
|
+
|
|
470
516
|
---
|
|
471
517
|
|
|
472
518
|
## Where SpecFact Fits
|
|
@@ -34,8 +34,12 @@ pip install -U specfact-cli
|
|
|
34
34
|
### Bootstrap and IDE Setup
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
#
|
|
38
|
-
specfact init
|
|
37
|
+
# First run: install workflow bundles (required)
|
|
38
|
+
specfact init --profile solo-developer
|
|
39
|
+
|
|
40
|
+
# Other first-run options
|
|
41
|
+
specfact init --install backlog,codebase
|
|
42
|
+
specfact init --install all
|
|
39
43
|
|
|
40
44
|
# First-run bundle selection (examples)
|
|
41
45
|
specfact init --profile solo-developer
|
|
@@ -59,6 +63,14 @@ specfact code validate sidecar init my-project /path/to/repo
|
|
|
59
63
|
specfact code validate sidecar run my-project /path/to/repo
|
|
60
64
|
```
|
|
61
65
|
|
|
66
|
+
### Migration Note (Flat Commands Removed)
|
|
67
|
+
|
|
68
|
+
As of `0.40.0`, flat root commands are removed. Use grouped commands:
|
|
69
|
+
|
|
70
|
+
- `specfact validate ...` -> `specfact code validate ...`
|
|
71
|
+
- `specfact plan ...` -> `specfact project plan ...`
|
|
72
|
+
- `specfact policy ...` -> `specfact backlog policy ...`
|
|
73
|
+
|
|
62
74
|
### Backlog Bridge (60 seconds)
|
|
63
75
|
|
|
64
76
|
SpecFact's USP is closing the drift gap between **backlog -> specs -> code**.
|
|
@@ -73,7 +85,7 @@ specfact backlog daily ado --ado-org <org> --ado-project "<project>" --state any
|
|
|
73
85
|
specfact backlog refine ado --ado-org <org> --ado-project "<project>" --id <work-item-id> --preview
|
|
74
86
|
|
|
75
87
|
# 3) Keep backlog + spec intent aligned (avoid silent drift)
|
|
76
|
-
specfact policy validate --group-by-item
|
|
88
|
+
specfact backlog policy validate --group-by-item
|
|
77
89
|
```
|
|
78
90
|
|
|
79
91
|
For GitHub, replace adapter/org/project with:
|
|
@@ -141,8 +153,8 @@ Most tools help **either** coders **or** agile teams. SpecFact does both:
|
|
|
141
153
|
Recommended command entrypoints:
|
|
142
154
|
- `specfact backlog ceremony standup ...`
|
|
143
155
|
- `specfact backlog ceremony refinement ...`
|
|
144
|
-
- `specfact policy validate ...`
|
|
145
|
-
- `specfact policy suggest ...`
|
|
156
|
+
- `specfact backlog policy validate ...`
|
|
157
|
+
- `specfact backlog policy suggest ...`
|
|
146
158
|
|
|
147
159
|
What the Policy Engine does in practice:
|
|
148
160
|
- Turns team agreements (DoR, DoD, flow checks) into executable checks against your real backlog data.
|
|
@@ -150,9 +162,9 @@ What the Policy Engine does in practice:
|
|
|
150
162
|
- Generates patch-ready suggestions so teams can fix policy gaps quickly without guessing.
|
|
151
163
|
|
|
152
164
|
Start with:
|
|
153
|
-
- `specfact policy init --template scrum`
|
|
154
|
-
- `specfact policy validate --group-by-item`
|
|
155
|
-
- `specfact policy suggest --group-by-item --limit 5`
|
|
165
|
+
- `specfact backlog policy init --template scrum`
|
|
166
|
+
- `specfact backlog policy validate --group-by-item`
|
|
167
|
+
- `specfact backlog policy suggest --group-by-item --limit 5`
|
|
156
168
|
|
|
157
169
|
**Try it now**
|
|
158
170
|
|
|
@@ -163,13 +175,12 @@ Start with:
|
|
|
163
175
|
|
|
164
176
|
## Modules and Capabilities
|
|
165
177
|
|
|
166
|
-
**Core
|
|
178
|
+
**Core runtime**
|
|
167
179
|
|
|
168
|
-
- **
|
|
169
|
-
- **
|
|
170
|
-
- **Report**: CI/CD summaries and evidence outputs.
|
|
180
|
+
- **Permanent commands**: `init`, `module`, `upgrade`
|
|
181
|
+
- **Core responsibilities**: lifecycle, registry, trust, contracts, orchestration, shared runtime utilities
|
|
171
182
|
|
|
172
|
-
**
|
|
183
|
+
**Marketplace-installed bundles**
|
|
173
184
|
|
|
174
185
|
- **Backlog**: Refinement, dependency analysis, sprint summaries, risk rollups.
|
|
175
186
|
- **Ceremony**: Standup, refinement, and planning entry points.
|
|
@@ -188,6 +199,41 @@ For technical architecture details (module lifecycle, registry internals, adapte
|
|
|
188
199
|
- [Architecture Docs Index](docs/architecture/README.md)
|
|
189
200
|
- [Architecture Implementation Status](docs/architecture/implementation-status.md)
|
|
190
201
|
|
|
202
|
+
### Official Marketplace Bundles
|
|
203
|
+
|
|
204
|
+
SpecFact ships official bundle packages via the dedicated marketplace registry repository
|
|
205
|
+
`nold-ai/specfact-cli-modules`.
|
|
206
|
+
Bundle-specific docs are still temporarily hosted in this docs set while the long-term
|
|
207
|
+
bundle docs home is prepared in the modules repository docs site:
|
|
208
|
+
`https://nold-ai.github.io/specfact-cli-modules/`.
|
|
209
|
+
|
|
210
|
+
Install examples:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
specfact module install nold-ai/specfact-project
|
|
214
|
+
specfact module install nold-ai/specfact-backlog
|
|
215
|
+
specfact module install nold-ai/specfact-codebase
|
|
216
|
+
specfact module install nold-ai/specfact-spec
|
|
217
|
+
specfact module install nold-ai/specfact-govern
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
If startup warns that bundled modules are missing or outdated, run:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
specfact module init --scope project
|
|
224
|
+
specfact module init
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Official bundles are verified as `official` tier (`nold-ai` publisher). Some bundles
|
|
228
|
+
auto-install dependencies:
|
|
229
|
+
|
|
230
|
+
- `nold-ai/specfact-spec` pulls `nold-ai/specfact-project`
|
|
231
|
+
- `nold-ai/specfact-govern` pulls `nold-ai/specfact-project`
|
|
232
|
+
|
|
233
|
+
Use this repo's docs for the current CLI/runtime release branch. Module-specific guides
|
|
234
|
+
will move to `specfact-cli-modules` so future bundle-only changes do not require ongoing
|
|
235
|
+
docs maintenance in long-lived `specfact-cli` release branches.
|
|
236
|
+
|
|
191
237
|
---
|
|
192
238
|
|
|
193
239
|
## Where SpecFact Fits
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specfact-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.40.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"
|
|
@@ -234,6 +234,13 @@ smart-test-e2e = "python tools/smart_test_coverage.py run --level e2e {args}"
|
|
|
234
234
|
smart-test-full = "python tools/smart_test_coverage.py run --level full {args}"
|
|
235
235
|
smart-test-auto = "python tools/smart_test_coverage.py run --level auto {args}"
|
|
236
236
|
|
|
237
|
+
# Module migration pre-deletion gate
|
|
238
|
+
verify-removal-gate = [
|
|
239
|
+
"python scripts/verify-bundle-published.py --modules project,plan,import_cmd,sync,migrate,backlog,policy_engine,analyze,drift,validate,repro,contract,spec,sdd,generate,enforce,patch_mode",
|
|
240
|
+
"python scripts/verify-modules-signature.py --require-signature",
|
|
241
|
+
]
|
|
242
|
+
export-change-github = "python scripts/export-change-to-github.py {args}"
|
|
243
|
+
|
|
237
244
|
# Contract-First Smart Test System Scripts
|
|
238
245
|
contract-test = "python tools/contract_first_smart_test.py run --level auto {args}"
|
|
239
246
|
contract-test-contracts = "python tools/contract_first_smart_test.py contracts"
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SpecFact CLI - The swiss knife CLI for agile DevOps teams.
|
|
3
|
+
|
|
4
|
+
This package provides command-line tools for:
|
|
5
|
+
- Turning code into clear specs and plans
|
|
6
|
+
- Keeping backlog, specs, tests, and code in sync
|
|
7
|
+
- Enforcing validation and contract checks before production
|
|
8
|
+
- Supporting agile ceremonies and team workflows
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import sys
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _candidate_modules_repo_roots() -> list[Path]:
|
|
19
|
+
configured = os.environ.get("SPECFACT_MODULES_REPO", "").strip()
|
|
20
|
+
roots: list[Path] = []
|
|
21
|
+
if configured:
|
|
22
|
+
roots.append(Path(configured).expanduser())
|
|
23
|
+
|
|
24
|
+
this_file = Path(__file__).resolve()
|
|
25
|
+
for base in (this_file.parent.parent.parent, *this_file.parents):
|
|
26
|
+
roots.append(base / "specfact-cli-modules")
|
|
27
|
+
roots.append(base.parent / "specfact-cli-modules")
|
|
28
|
+
return roots
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _bootstrap_bundle_paths() -> None:
|
|
32
|
+
for root in _candidate_modules_repo_roots():
|
|
33
|
+
packages_root = root / "packages"
|
|
34
|
+
if not packages_root.exists():
|
|
35
|
+
continue
|
|
36
|
+
for src_dir in packages_root.glob("*/src"):
|
|
37
|
+
src = str(src_dir.resolve())
|
|
38
|
+
if src not in sys.path:
|
|
39
|
+
sys.path.insert(0, src)
|
|
40
|
+
break
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
_bootstrap_bundle_paths()
|
|
44
|
+
|
|
45
|
+
__version__ = "0.40.0"
|
|
46
|
+
|
|
47
|
+
__all__ = ["__version__"]
|
|
@@ -174,8 +174,8 @@ class AdoAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
|
|
|
174
174
|
"[dim]Options:[/dim]\n"
|
|
175
175
|
" 1. Use a Personal Access Token (PAT) with longer expiration (up to 1 year):\n"
|
|
176
176
|
" - Create PAT: https://dev.azure.com/{org}/_usersSettings/tokens\n"
|
|
177
|
-
" - Store PAT: specfact auth azure-devops --pat your_pat_token\n"
|
|
178
|
-
" 2. Re-authenticate: specfact auth azure-devops\n"
|
|
177
|
+
" - Store PAT: specfact backlog auth azure-devops --pat your_pat_token\n"
|
|
178
|
+
" 2. Re-authenticate: specfact backlog auth azure-devops\n"
|
|
179
179
|
" 3. Use --ado-token option with a valid token"
|
|
180
180
|
)
|
|
181
181
|
self.api_token = None
|
|
@@ -792,7 +792,7 @@ class AdoAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
|
|
|
792
792
|
"Azure DevOps API token required. Options:\n"
|
|
793
793
|
" 1. Set AZURE_DEVOPS_TOKEN environment variable\n"
|
|
794
794
|
" 2. Provide via --ado-token option\n"
|
|
795
|
-
" 3. Run `specfact auth azure-devops` for device code authentication"
|
|
795
|
+
" 3. Run `specfact backlog auth azure-devops` for device code authentication"
|
|
796
796
|
)
|
|
797
797
|
raise ValueError(msg)
|
|
798
798
|
|
|
@@ -2898,7 +2898,7 @@ class AdoAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
|
|
|
2898
2898
|
"Options:\n"
|
|
2899
2899
|
" 1. Set AZURE_DEVOPS_TOKEN environment variable\n"
|
|
2900
2900
|
" 2. Use --ado-token option\n"
|
|
2901
|
-
" 3. Store token via specfact auth azure-devops"
|
|
2901
|
+
" 3. Store token via specfact backlog auth azure-devops"
|
|
2902
2902
|
)
|
|
2903
2903
|
raise ValueError(msg)
|
|
2904
2904
|
|
|
@@ -648,7 +648,7 @@ class GitHubAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
|
|
|
648
648
|
" 2. Provide via --github-token option\n"
|
|
649
649
|
" 3. Use GitHub CLI: `gh auth login` (auto-detected if available)\n"
|
|
650
650
|
" 4. Use --use-gh-cli flag to explicitly use GitHub CLI token\n"
|
|
651
|
-
" 5. Run `specfact auth github` for device code authentication"
|
|
651
|
+
" 5. Run `specfact backlog auth github` for device code authentication"
|
|
652
652
|
)
|
|
653
653
|
raise ValueError(msg)
|
|
654
654
|
|
|
@@ -1114,7 +1114,7 @@ class GitHubAdapter(BridgeAdapter, BacklogAdapterMixin, BacklogAdapter):
|
|
|
1114
1114
|
" 1. Set GITHUB_TOKEN environment variable\n"
|
|
1115
1115
|
" 2. Use --github-token option\n"
|
|
1116
1116
|
" 3. Use GitHub CLI authentication (gh auth login)\n"
|
|
1117
|
-
" 4. Store token via specfact auth github"
|
|
1117
|
+
" 4. Store token via specfact backlog auth github"
|
|
1118
1118
|
)
|
|
1119
1119
|
raise ValueError(msg)
|
|
1120
1120
|
|
|
@@ -66,6 +66,66 @@ from specfact_cli.utils.progressive_disclosure import ProgressiveDisclosureGroup
|
|
|
66
66
|
from specfact_cli.utils.structured_io import StructuredFormat
|
|
67
67
|
|
|
68
68
|
|
|
69
|
+
# Names of commands that come from installable bundles; when not registered, show actionable error.
|
|
70
|
+
KNOWN_BUNDLE_GROUP_OR_SHIM_NAMES: frozenset[str] = frozenset(
|
|
71
|
+
{
|
|
72
|
+
"backlog",
|
|
73
|
+
"code",
|
|
74
|
+
"project",
|
|
75
|
+
"spec",
|
|
76
|
+
"govern",
|
|
77
|
+
"plan",
|
|
78
|
+
"validate",
|
|
79
|
+
"contract",
|
|
80
|
+
"sdd",
|
|
81
|
+
"generate",
|
|
82
|
+
"enforce",
|
|
83
|
+
"patch",
|
|
84
|
+
"migrate",
|
|
85
|
+
"repro",
|
|
86
|
+
"drift",
|
|
87
|
+
"analyze",
|
|
88
|
+
"policy",
|
|
89
|
+
"import",
|
|
90
|
+
"sync",
|
|
91
|
+
}
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class _RootCLIGroup(ProgressiveDisclosureGroup):
|
|
96
|
+
"""Root group that shows actionable error when an unknown command is a known bundle group/shim."""
|
|
97
|
+
|
|
98
|
+
def resolve_command(
|
|
99
|
+
self, ctx: click.Context, args: list[str]
|
|
100
|
+
) -> tuple[str | None, click.Command | None, list[str]]:
|
|
101
|
+
if not args:
|
|
102
|
+
return super().resolve_command(ctx, args)
|
|
103
|
+
invoked = args[0]
|
|
104
|
+
try:
|
|
105
|
+
result = super().resolve_command(ctx, args)
|
|
106
|
+
except click.UsageError:
|
|
107
|
+
if invoked in KNOWN_BUNDLE_GROUP_OR_SHIM_NAMES:
|
|
108
|
+
get_configured_console().print(
|
|
109
|
+
f"[bold red]Command '{invoked}' is not installed.[/bold red]\n"
|
|
110
|
+
"Install workflow bundles with [bold]specfact init --profile <profile>[/bold] "
|
|
111
|
+
"or [bold]specfact module install <bundle>[/bold]."
|
|
112
|
+
)
|
|
113
|
+
raise SystemExit(1) from None
|
|
114
|
+
raise
|
|
115
|
+
_name, cmd, remaining = result
|
|
116
|
+
if cmd is not None or not remaining:
|
|
117
|
+
return result
|
|
118
|
+
invoked = remaining[0]
|
|
119
|
+
if invoked not in KNOWN_BUNDLE_GROUP_OR_SHIM_NAMES:
|
|
120
|
+
return result
|
|
121
|
+
get_configured_console().print(
|
|
122
|
+
f"[bold red]Command '{invoked}' is not installed.[/bold red]\n"
|
|
123
|
+
"Install workflow bundles with [bold]specfact init --profile <profile>[/bold] "
|
|
124
|
+
"or [bold]specfact module install <bundle>[/bold]."
|
|
125
|
+
)
|
|
126
|
+
raise SystemExit(1)
|
|
127
|
+
|
|
128
|
+
|
|
69
129
|
# Map shell names for completion support
|
|
70
130
|
SHELL_MAP = {
|
|
71
131
|
"sh": "bash", # sh is bash-compatible
|
|
@@ -112,7 +172,7 @@ app = typer.Typer(
|
|
|
112
172
|
add_completion=True, # Enable Typer's built-in completion (works natively for bash/zsh/fish without extensions)
|
|
113
173
|
rich_markup_mode="rich",
|
|
114
174
|
context_settings={"help_option_names": ["-h", "--help", "--help-advanced", "-ha"]}, # Add aliases for help
|
|
115
|
-
cls=
|
|
175
|
+
cls=_RootCLIGroup, # Progressive disclosure + actionable error for unknown bundle commands
|
|
116
176
|
)
|
|
117
177
|
|
|
118
178
|
console = get_configured_console()
|
|
@@ -269,6 +329,9 @@ def main(
|
|
|
269
329
|
Transform your development workflow with automated quality gates,
|
|
270
330
|
runtime contract validation, and state machine workflows.
|
|
271
331
|
|
|
332
|
+
Run **specfact init** or **specfact module install** to add workflow bundles
|
|
333
|
+
(backlog, code, project, spec, govern).
|
|
334
|
+
|
|
272
335
|
**Backlog Management**: Use `specfact backlog refine` for AI-assisted template-driven
|
|
273
336
|
refinement of backlog items from GitHub Issues, Azure DevOps, and other tools.
|
|
274
337
|
|
|
@@ -4,30 +4,8 @@ SpecFact CLI commands package.
|
|
|
4
4
|
This package contains all CLI command implementations.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
from specfact_cli.commands import (
|
|
8
|
-
analyze,
|
|
9
|
-
auth,
|
|
10
|
-
contract_cmd,
|
|
11
|
-
drift,
|
|
12
|
-
enforce,
|
|
13
|
-
generate,
|
|
14
|
-
import_cmd,
|
|
15
|
-
init,
|
|
16
|
-
migrate,
|
|
17
|
-
plan,
|
|
18
|
-
project_cmd,
|
|
19
|
-
repro,
|
|
20
|
-
sdd,
|
|
21
|
-
spec,
|
|
22
|
-
sync,
|
|
23
|
-
update,
|
|
24
|
-
validate,
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
|
|
28
7
|
__all__ = [
|
|
29
8
|
"analyze",
|
|
30
|
-
"auth",
|
|
31
9
|
"contract_cmd",
|
|
32
10
|
"drift",
|
|
33
11
|
"enforce",
|
|
@@ -38,7 +16,6 @@ __all__ = [
|
|
|
38
16
|
"plan",
|
|
39
17
|
"project_cmd",
|
|
40
18
|
"repro",
|
|
41
|
-
"run",
|
|
42
19
|
"sdd",
|
|
43
20
|
"spec",
|
|
44
21
|
"sync",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Helpers for lazy-loading compatibility shims that point to bundle packages."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from importlib import import_module
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from ..modules._bundle_import import bootstrap_local_bundle_sources
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def load_bundle_app(anchor_file: str, target_module: str) -> Any:
|
|
12
|
+
"""Load and return the lazily imported `app` object from a bundle command module."""
|
|
13
|
+
bootstrap_local_bundle_sources(anchor_file)
|
|
14
|
+
return import_module(target_module).app
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Backward-compatible app shim for code analyze command."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from ._bundle_shim import load_bundle_app
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
app: Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def __getattr__(name: str) -> Any:
|
|
13
|
+
if name == "app":
|
|
14
|
+
return load_bundle_app(__file__, "specfact_codebase.analyze.commands")
|
|
15
|
+
raise AttributeError(name)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["app"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Backward-compatible app shim for backlog command."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from ._bundle_shim import load_bundle_app
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
app: Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def __getattr__(name: str) -> Any:
|
|
13
|
+
if name == "app":
|
|
14
|
+
return load_bundle_app(__file__, "specfact_backlog.backlog.commands")
|
|
15
|
+
raise AttributeError(name)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["app"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Backward-compatible app shim for spec contract command."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from ._bundle_shim import load_bundle_app
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
app: Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def __getattr__(name: str) -> Any:
|
|
13
|
+
if name == "app":
|
|
14
|
+
return load_bundle_app(__file__, "specfact_spec.contract.commands")
|
|
15
|
+
raise AttributeError(name)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["app"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Backward-compatible app shim for code drift command."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from ._bundle_shim import load_bundle_app
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
app: Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def __getattr__(name: str) -> Any:
|
|
13
|
+
if name == "app":
|
|
14
|
+
return load_bundle_app(__file__, "specfact_codebase.drift.commands")
|
|
15
|
+
raise AttributeError(name)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["app"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Backward-compatible app shim for govern enforce command."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from ._bundle_shim import load_bundle_app
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
app: Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def __getattr__(name: str) -> Any:
|
|
13
|
+
if name == "app":
|
|
14
|
+
return load_bundle_app(__file__, "specfact_govern.enforce.commands")
|
|
15
|
+
raise AttributeError(name)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["app"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Backward-compatible app shim for spec generate command."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from ._bundle_shim import load_bundle_app
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
app: Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def __getattr__(name: str) -> Any:
|
|
13
|
+
if name == "app":
|
|
14
|
+
return load_bundle_app(__file__, "specfact_spec.generate.commands")
|
|
15
|
+
raise AttributeError(name)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["app"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Backward-compatible app shim for project import command."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from ._bundle_shim import load_bundle_app
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
app: Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def __getattr__(name: str) -> Any:
|
|
13
|
+
if name == "app":
|
|
14
|
+
return load_bundle_app(__file__, "specfact_project.import_cmd.commands")
|
|
15
|
+
raise AttributeError(name)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["app"]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Backward-compatible app shim. Implementation moved to modules/init/."""
|
|
2
|
+
|
|
3
|
+
from importlib import import_module
|
|
4
|
+
from typing import TYPE_CHECKING, Any
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
app: Any
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def __getattr__(name: str) -> Any:
|
|
12
|
+
if name == "app":
|
|
13
|
+
return import_module("..modules.init.src.commands", __package__).app
|
|
14
|
+
raise AttributeError(name)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
__all__ = ["app"]
|