specfact-cli 0.38.2__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.38.2 → specfact_cli-0.40.0}/.gitignore +2 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/PKG-INFO +68 -17
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/README.md +67 -16
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/pyproject.toml +8 -1
- {specfact_cli-0.38.2 → 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.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/ado.py +4 -4
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/github.py +2 -2
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/cli.py +91 -4
- {specfact_cli-0.38.2 → 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.40.0/src/specfact_cli/groups/__init__.py +18 -0
- specfact_cli-0.40.0/src/specfact_cli/groups/backlog_group.py +63 -0
- specfact_cli-0.40.0/src/specfact_cli/groups/codebase_group.py +40 -0
- specfact_cli-0.40.0/src/specfact_cli/groups/govern_group.py +43 -0
- specfact_cli-0.40.0/src/specfact_cli/groups/project_group.py +47 -0
- specfact_cli-0.40.0/src/specfact_cli/groups/spec_group.py +45 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/module_package.py +13 -0
- specfact_cli-0.40.0/src/specfact_cli/modules/_bundle_import.py +36 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/module-package.yaml +7 -5
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/src/commands.py +156 -0
- specfact_cli-0.40.0/src/specfact_cli/modules/init/src/first_run_selection.py +196 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/module-package.yaml +7 -5
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/commands.py +65 -2
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/module-package.yaml +7 -5
- specfact_cli-0.40.0/src/specfact_cli/registry/bootstrap.py +51 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/crypto_validator.py +62 -0
- {specfact_cli-0.38.2 → 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.40.0/src/specfact_cli/registry/module_grouping.py +74 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_installer.py +270 -20
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_lifecycle.py +7 -2
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_packages.py +287 -49
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/registry.py +49 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/runtime.py +4 -4
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/persona_ownership.py +8 -6
- specfact_cli-0.38.2/src/specfact_cli/__init__.py +0 -13
- specfact_cli-0.38.2/src/specfact_cli/commands/analyze.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/auth.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/backlog_commands.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/contract_cmd.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/drift.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/enforce.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/generate.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/import_cmd.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/init.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/migrate.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/plan.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/project_cmd.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/repro.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/sdd.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/spec.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/sync.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/update.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/commands/validate.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/analyze/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/analyze/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/analyze/src/commands.py +0 -368
- specfact_cli-0.38.2/src/specfact_cli/modules/auth/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/auth/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/auth/src/commands.py +0 -726
- specfact_cli-0.38.2/src/specfact_cli/modules/backlog/module-package.yaml +0 -32
- specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/__init__.py +0 -9
- specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/ado.py +0 -20
- specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/base.py +0 -93
- specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/github.py +0 -20
- specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/jira.py +0 -20
- specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/adapters/linear.py +0 -20
- specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/backlog/src/commands.py +0 -5546
- specfact_cli-0.38.2/src/specfact_cli/modules/contract/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/contract/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/contract/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/contract/src/commands.py +0 -1251
- specfact_cli-0.38.2/src/specfact_cli/modules/drift/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/drift/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/drift/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/drift/src/commands.py +0 -253
- specfact_cli-0.38.2/src/specfact_cli/modules/enforce/module-package.yaml +0 -20
- specfact_cli-0.38.2/src/specfact_cli/modules/enforce/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/enforce/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/enforce/src/commands.py +0 -677
- specfact_cli-0.38.2/src/specfact_cli/modules/generate/module-package.yaml +0 -20
- specfact_cli-0.38.2/src/specfact_cli/modules/generate/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/generate/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/generate/src/commands.py +0 -2188
- specfact_cli-0.38.2/src/specfact_cli/modules/import_cmd/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/import_cmd/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/import_cmd/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/import_cmd/src/commands.py +0 -2924
- specfact_cli-0.38.2/src/specfact_cli/modules/init/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/migrate/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/migrate/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/migrate/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/migrate/src/commands.py +0 -935
- specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/module-package.yaml +0 -20
- specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/commands.py +0 -58
- specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/__init__.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/commands/apply.py +0 -80
- specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/__init__.py +0 -8
- specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/applier.py +0 -62
- specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/generator.py +0 -33
- specfact_cli-0.38.2/src/specfact_cli/modules/patch_mode/src/patch_mode/pipeline/idempotency.py +0 -42
- specfact_cli-0.38.2/src/specfact_cli/modules/plan/module-package.yaml +0 -20
- specfact_cli-0.38.2/src/specfact_cli/modules/plan/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/plan/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/plan/src/commands.py +0 -5574
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/module-package.yaml +0 -26
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/commands.py +0 -22
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/__init__.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/config/__init__.py +0 -13
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/config/policy_config.py +0 -71
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/config/templates.py +0 -56
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/__init__.py +0 -7
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/suggester.py +0 -35
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/engine/validator.py +0 -257
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/main.py +0 -329
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/models/__init__.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/models/policy_result.py +0 -35
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/__init__.py +0 -8
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/kanban.py +0 -65
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/safe.py +0 -47
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/policies/scrum.py +0 -58
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/__init__.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/policy_engine/src/policy_engine/registry/policy_registry.py +0 -37
- specfact_cli-0.38.2/src/specfact_cli/modules/project/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/project/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/project/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/project/src/commands.py +0 -2498
- specfact_cli-0.38.2/src/specfact_cli/modules/repro/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/repro/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/repro/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/repro/src/commands.py +0 -579
- specfact_cli-0.38.2/src/specfact_cli/modules/sdd/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/sdd/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/sdd/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/sdd/src/commands.py +0 -415
- specfact_cli-0.38.2/src/specfact_cli/modules/spec/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/spec/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/spec/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/spec/src/commands.py +0 -902
- specfact_cli-0.38.2/src/specfact_cli/modules/sync/module-package.yaml +0 -22
- specfact_cli-0.38.2/src/specfact_cli/modules/sync/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/sync/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/sync/src/commands.py +0 -2504
- specfact_cli-0.38.2/src/specfact_cli/modules/upgrade/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/validate/module-package.yaml +0 -19
- specfact_cli-0.38.2/src/specfact_cli/modules/validate/src/__init__.py +0 -1
- specfact_cli-0.38.2/src/specfact_cli/modules/validate/src/app.py +0 -6
- specfact_cli-0.38.2/src/specfact_cli/modules/validate/src/commands.py +0 -321
- specfact_cli-0.38.2/src/specfact_cli/registry/bootstrap.py +0 -16
- specfact_cli-0.38.2/src/specfact_cli/registry/marketplace_client.py +0 -136
- specfact_cli-0.38.2/src/specfact_cli/templates/bridge_templates.py +0 -243
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/LICENSE +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/keys/README.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/keys/module-signing-public.pem +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/shared/cli-enforcement.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.01-import.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.02-plan.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.03-review.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.04-sdd.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.05-enforce.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.06-sync.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.07-contracts.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-add.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-daily.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.backlog-refine.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.compare.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.sync-backlog.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/prompts/specfact.validate.md +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_agile.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_default.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_kanban.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_safe.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/field_mappings/ado_scrum.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/frameworks/safe/safe_feature_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/personas/developer/developer_task_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/backlog/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/persona/architect.md.j2 +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/persona/developer.md.j2 +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/persona/product-owner.md.j2 +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/policies/kanban.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/policies/mixed.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/policies/safe.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/policies/scrum.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/pr-template.md.j2 +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/__main__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/backlog_base.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/base.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/openspec.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/openspec_parser.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/registry.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/adapters/speckit.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/analyze_agent.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/base.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/adapters/local_yaml_adapter.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/ai_refiner.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/converter.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/filters.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/format_detector.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/base.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/markdown_format.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/formats/structured_format.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/ado_mapper.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/base.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/github_mapper.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/mappers/template_config.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/backlog/template_detector.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/common/logger_setup.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/common/logging_utils.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/contracts/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/contracts/crosshair_props.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/contracts/module_interface.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/contract_generator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/openapi_extractor.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/persona_exporter.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/test_to_openapi.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/merge/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/merge/resolver.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/backlog_item.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/capabilities.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/change.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/contract.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/dor_config.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/persona_template.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/plan.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/project.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/models/validation.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/__init__.py +0 -0
- {specfact_cli-0.38.2/src/specfact_cli/modules/analyze → specfact_cli-0.40.0/src/specfact_cli/modules/init}/src/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/init/src/app.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_io_shim.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/module_registry/src/app.py +0 -0
- {specfact_cli-0.38.2/src/specfact_cli/modules/auth → specfact_cli-0.40.0/src/specfact_cli/modules/upgrade}/src/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/src/app.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/modules/upgrade/src/commands.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/parsers/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/parsers/persona_importer.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/alias_manager.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/bridge_registry.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/dependency_resolver.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/extension_registry.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/help_cache.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/metadata.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_discovery.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_security.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/registry/module_state.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_sync.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/bridge_watch.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/spec_to_code.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/defect_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/enabler_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/spike_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/defaults/user_story_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/frameworks/scrum/user_story_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/personas/product-owner/user_story_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/providers/ado/work_item_v1.yaml +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/registry.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/auth_tokens.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/bundle_converters.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/bundle_loader.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/code_change_detector.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/content_sanitizer.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/context_detection.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/enrichment_parser.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/env_manager.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/git.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/ide_setup.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/metadata.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/optional_deps.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/progress.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/sdd_discovery.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/source_scanner.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/startup_checks.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/structure.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/suggestions.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/terminal.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/agile_validation.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/change_proposal_integration.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/cli_first_validator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/contract_validator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/schema.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/contract_populator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/crosshair_runner.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/crosshair_summary.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/dependency_installer.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/framework_detector.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/__init__.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/base.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/django.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/drf.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/fastapi.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/frameworks/flask.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/harness_generator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/models.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/orchestrator.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/specmatic_runner.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/validators/sidecar/unannotated_detector.py +0 -0
- {specfact_cli-0.38.2 → specfact_cli-0.40.0}/src/specfact_cli/versioning/__init__.py +0 -0
- {specfact_cli-0.38.2 → 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,17 @@ 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
|
|
322
|
+
|
|
323
|
+
# First-run bundle selection (examples)
|
|
324
|
+
specfact init --profile solo-developer
|
|
325
|
+
specfact init --install backlog,codebase
|
|
326
|
+
specfact init --install all
|
|
318
327
|
|
|
319
328
|
# Configure IDE prompts/templates (interactive selector by default)
|
|
320
329
|
specfact init ide
|
|
@@ -326,13 +335,21 @@ specfact init ide --ide vscode
|
|
|
326
335
|
|
|
327
336
|
```bash
|
|
328
337
|
# Analyze an existing codebase
|
|
329
|
-
specfact import from-code my-project --repo .
|
|
338
|
+
specfact project import from-code my-project --repo .
|
|
330
339
|
|
|
331
340
|
# Validate external code without modifying source
|
|
332
|
-
specfact validate sidecar init my-project /path/to/repo
|
|
333
|
-
specfact validate sidecar run my-project /path/to/repo
|
|
341
|
+
specfact code validate sidecar init my-project /path/to/repo
|
|
342
|
+
specfact code validate sidecar run my-project /path/to/repo
|
|
334
343
|
```
|
|
335
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
|
+
|
|
336
353
|
### Backlog Bridge (60 seconds)
|
|
337
354
|
|
|
338
355
|
SpecFact's USP is closing the drift gap between **backlog -> specs -> code**.
|
|
@@ -347,7 +364,7 @@ specfact backlog daily ado --ado-org <org> --ado-project "<project>" --state any
|
|
|
347
364
|
specfact backlog refine ado --ado-org <org> --ado-project "<project>" --id <work-item-id> --preview
|
|
348
365
|
|
|
349
366
|
# 3) Keep backlog + spec intent aligned (avoid silent drift)
|
|
350
|
-
specfact policy validate --group-by-item
|
|
367
|
+
specfact backlog policy validate --group-by-item
|
|
351
368
|
```
|
|
352
369
|
|
|
353
370
|
For GitHub, replace adapter/org/project with:
|
|
@@ -415,8 +432,8 @@ Most tools help **either** coders **or** agile teams. SpecFact does both:
|
|
|
415
432
|
Recommended command entrypoints:
|
|
416
433
|
- `specfact backlog ceremony standup ...`
|
|
417
434
|
- `specfact backlog ceremony refinement ...`
|
|
418
|
-
- `specfact policy validate ...`
|
|
419
|
-
- `specfact policy suggest ...`
|
|
435
|
+
- `specfact backlog policy validate ...`
|
|
436
|
+
- `specfact backlog policy suggest ...`
|
|
420
437
|
|
|
421
438
|
What the Policy Engine does in practice:
|
|
422
439
|
- Turns team agreements (DoR, DoD, flow checks) into executable checks against your real backlog data.
|
|
@@ -424,9 +441,9 @@ What the Policy Engine does in practice:
|
|
|
424
441
|
- Generates patch-ready suggestions so teams can fix policy gaps quickly without guessing.
|
|
425
442
|
|
|
426
443
|
Start with:
|
|
427
|
-
- `specfact policy init --template scrum`
|
|
428
|
-
- `specfact policy validate --group-by-item`
|
|
429
|
-
- `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`
|
|
430
447
|
|
|
431
448
|
**Try it now**
|
|
432
449
|
|
|
@@ -437,13 +454,12 @@ Start with:
|
|
|
437
454
|
|
|
438
455
|
## Modules and Capabilities
|
|
439
456
|
|
|
440
|
-
**Core
|
|
457
|
+
**Core runtime**
|
|
441
458
|
|
|
442
|
-
- **
|
|
443
|
-
- **
|
|
444
|
-
- **Report**: CI/CD summaries and evidence outputs.
|
|
459
|
+
- **Permanent commands**: `init`, `module`, `upgrade`
|
|
460
|
+
- **Core responsibilities**: lifecycle, registry, trust, contracts, orchestration, shared runtime utilities
|
|
445
461
|
|
|
446
|
-
**
|
|
462
|
+
**Marketplace-installed bundles**
|
|
447
463
|
|
|
448
464
|
- **Backlog**: Refinement, dependency analysis, sprint summaries, risk rollups.
|
|
449
465
|
- **Ceremony**: Standup, refinement, and planning entry points.
|
|
@@ -462,6 +478,41 @@ For technical architecture details (module lifecycle, registry internals, adapte
|
|
|
462
478
|
- [Architecture Docs Index](docs/architecture/README.md)
|
|
463
479
|
- [Architecture Implementation Status](docs/architecture/implementation-status.md)
|
|
464
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
|
+
|
|
465
516
|
---
|
|
466
517
|
|
|
467
518
|
## Where SpecFact Fits
|
|
@@ -34,8 +34,17 @@ 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
|
|
43
|
+
|
|
44
|
+
# First-run bundle selection (examples)
|
|
45
|
+
specfact init --profile solo-developer
|
|
46
|
+
specfact init --install backlog,codebase
|
|
47
|
+
specfact init --install all
|
|
39
48
|
|
|
40
49
|
# Configure IDE prompts/templates (interactive selector by default)
|
|
41
50
|
specfact init ide
|
|
@@ -47,13 +56,21 @@ specfact init ide --ide vscode
|
|
|
47
56
|
|
|
48
57
|
```bash
|
|
49
58
|
# Analyze an existing codebase
|
|
50
|
-
specfact import from-code my-project --repo .
|
|
59
|
+
specfact project import from-code my-project --repo .
|
|
51
60
|
|
|
52
61
|
# Validate external code without modifying source
|
|
53
|
-
specfact validate sidecar init my-project /path/to/repo
|
|
54
|
-
specfact validate sidecar run my-project /path/to/repo
|
|
62
|
+
specfact code validate sidecar init my-project /path/to/repo
|
|
63
|
+
specfact code validate sidecar run my-project /path/to/repo
|
|
55
64
|
```
|
|
56
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
|
+
|
|
57
74
|
### Backlog Bridge (60 seconds)
|
|
58
75
|
|
|
59
76
|
SpecFact's USP is closing the drift gap between **backlog -> specs -> code**.
|
|
@@ -68,7 +85,7 @@ specfact backlog daily ado --ado-org <org> --ado-project "<project>" --state any
|
|
|
68
85
|
specfact backlog refine ado --ado-org <org> --ado-project "<project>" --id <work-item-id> --preview
|
|
69
86
|
|
|
70
87
|
# 3) Keep backlog + spec intent aligned (avoid silent drift)
|
|
71
|
-
specfact policy validate --group-by-item
|
|
88
|
+
specfact backlog policy validate --group-by-item
|
|
72
89
|
```
|
|
73
90
|
|
|
74
91
|
For GitHub, replace adapter/org/project with:
|
|
@@ -136,8 +153,8 @@ Most tools help **either** coders **or** agile teams. SpecFact does both:
|
|
|
136
153
|
Recommended command entrypoints:
|
|
137
154
|
- `specfact backlog ceremony standup ...`
|
|
138
155
|
- `specfact backlog ceremony refinement ...`
|
|
139
|
-
- `specfact policy validate ...`
|
|
140
|
-
- `specfact policy suggest ...`
|
|
156
|
+
- `specfact backlog policy validate ...`
|
|
157
|
+
- `specfact backlog policy suggest ...`
|
|
141
158
|
|
|
142
159
|
What the Policy Engine does in practice:
|
|
143
160
|
- Turns team agreements (DoR, DoD, flow checks) into executable checks against your real backlog data.
|
|
@@ -145,9 +162,9 @@ What the Policy Engine does in practice:
|
|
|
145
162
|
- Generates patch-ready suggestions so teams can fix policy gaps quickly without guessing.
|
|
146
163
|
|
|
147
164
|
Start with:
|
|
148
|
-
- `specfact policy init --template scrum`
|
|
149
|
-
- `specfact policy validate --group-by-item`
|
|
150
|
-
- `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`
|
|
151
168
|
|
|
152
169
|
**Try it now**
|
|
153
170
|
|
|
@@ -158,13 +175,12 @@ Start with:
|
|
|
158
175
|
|
|
159
176
|
## Modules and Capabilities
|
|
160
177
|
|
|
161
|
-
**Core
|
|
178
|
+
**Core runtime**
|
|
162
179
|
|
|
163
|
-
- **
|
|
164
|
-
- **
|
|
165
|
-
- **Report**: CI/CD summaries and evidence outputs.
|
|
180
|
+
- **Permanent commands**: `init`, `module`, `upgrade`
|
|
181
|
+
- **Core responsibilities**: lifecycle, registry, trust, contracts, orchestration, shared runtime utilities
|
|
166
182
|
|
|
167
|
-
**
|
|
183
|
+
**Marketplace-installed bundles**
|
|
168
184
|
|
|
169
185
|
- **Backlog**: Refinement, dependency analysis, sprint summaries, risk rollups.
|
|
170
186
|
- **Ceremony**: Standup, refinement, and planning entry points.
|
|
@@ -183,6 +199,41 @@ For technical architecture details (module lifecycle, registry internals, adapte
|
|
|
183
199
|
- [Architecture Docs Index](docs/architecture/README.md)
|
|
184
200
|
- [Architecture Implementation Status](docs/architecture/implementation-status.md)
|
|
185
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
|
+
|
|
186
237
|
---
|
|
187
238
|
|
|
188
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
|
|
|
@@ -451,13 +514,26 @@ def _make_lazy_typer(cmd_name: str, help_str: str) -> typer.Typer:
|
|
|
451
514
|
|
|
452
515
|
|
|
453
516
|
def _get_command(typer_instance: typer.Typer) -> click.Command:
|
|
454
|
-
"""Wrapper around typer.main.get_command that returns LazyDelegateGroup for our lazy typers
|
|
517
|
+
"""Wrapper around typer.main.get_command that returns LazyDelegateGroup for our lazy typers,
|
|
518
|
+
and applies flatten-same-name for Typers with _specfact_flatten_same_name.
|
|
519
|
+
"""
|
|
455
520
|
if getattr(typer_instance, "_specfact_lazy_delegate", False):
|
|
456
521
|
cmd_name = getattr(typer_instance, "_specfact_lazy_cmd_name", "")
|
|
457
522
|
help_str = getattr(typer_instance, "_specfact_lazy_help_str", "")
|
|
458
523
|
return _build_lazy_delegate_group(cmd_name, help_str)
|
|
459
524
|
assert _typer_get_command_original is not None
|
|
460
|
-
|
|
525
|
+
result = _typer_get_command_original(typer_instance)
|
|
526
|
+
flatten_name = getattr(typer_instance, "_specfact_flatten_same_name", None)
|
|
527
|
+
if isinstance(flatten_name, str) and isinstance(result, click.Group) and flatten_name in result.commands:
|
|
528
|
+
redundant = result.commands.pop(flatten_name)
|
|
529
|
+
if isinstance(redundant, click.Group):
|
|
530
|
+
for cmd_name, cmd in redundant.commands.items():
|
|
531
|
+
result.add_command(cmd, name=cmd_name)
|
|
532
|
+
if result.commands:
|
|
533
|
+
for cname in sorted(result.commands.keys()):
|
|
534
|
+
cmd = result.commands.pop(cname)
|
|
535
|
+
result.add_command(cmd, name=cname)
|
|
536
|
+
return result
|
|
461
537
|
|
|
462
538
|
|
|
463
539
|
def _get_group_from_info_wrapper(
|
|
@@ -476,12 +552,23 @@ def _get_group_from_info_wrapper(
|
|
|
476
552
|
help_str = getattr(typer_instance, "_specfact_lazy_help_str", "")
|
|
477
553
|
return _build_lazy_delegate_group(cmd_name, help_str)
|
|
478
554
|
assert _typer_get_group_from_info_original is not None
|
|
479
|
-
|
|
555
|
+
result = _typer_get_group_from_info_original(
|
|
480
556
|
group_info,
|
|
481
557
|
pretty_exceptions_short=pretty_exceptions_short,
|
|
482
558
|
suggest_commands=suggest_commands,
|
|
483
559
|
rich_markup_mode=rich_markup_mode,
|
|
484
560
|
)
|
|
561
|
+
flatten_name = getattr(typer_instance, "_specfact_flatten_same_name", None) if typer_instance else None
|
|
562
|
+
if isinstance(flatten_name, str) and flatten_name in result.commands:
|
|
563
|
+
redundant = result.commands.pop(flatten_name)
|
|
564
|
+
if isinstance(redundant, click.Group):
|
|
565
|
+
for cmd_name, cmd in redundant.commands.items():
|
|
566
|
+
result.add_command(cmd, name=cmd_name)
|
|
567
|
+
if result.commands:
|
|
568
|
+
for name in sorted(result.commands.keys()):
|
|
569
|
+
cmd = result.commands.pop(name)
|
|
570
|
+
result.add_command(cmd, name=name)
|
|
571
|
+
return result
|
|
485
572
|
|
|
486
573
|
|
|
487
574
|
# Original Typer build functions (set once by _patch_typer_build so re-import of cli doesn't overwrite with our wrapper).
|
|
@@ -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"]
|