specfact-cli 0.15.3__tar.gz → 0.16.1__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.15.3 → specfact_cli-0.16.1}/.gitignore +7 -1
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/PKG-INFO +56 -1
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/README.md +55 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/pyproject.toml +1 -1
- specfact_cli-0.16.1/resources/templates/persona/architect.md.j2 +211 -0
- specfact_cli-0.16.1/resources/templates/persona/developer.md.j2 +240 -0
- specfact_cli-0.16.1/resources/templates/persona/product-owner.md.j2 +233 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/__init__.py +1 -1
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/__init__.py +1 -1
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/cli.py +8 -0
- specfact_cli-0.16.1/src/specfact_cli/commands/__init__.py +46 -0
- specfact_cli-0.16.1/src/specfact_cli/commands/contract_cmd.py +477 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/enforce.py +14 -5
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/generate.py +81 -35
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/import_cmd.py +38 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/plan.py +349 -89
- specfact_cli-0.16.1/src/specfact_cli/commands/project_cmd.py +1518 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/sdd.py +17 -10
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/sync.py +140 -69
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/__init__.py +3 -1
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/contract_generator.py +29 -0
- specfact_cli-0.16.1/src/specfact_cli/generators/persona_exporter.py +338 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/importers/speckit_converter.py +26 -7
- specfact_cli-0.16.1/src/specfact_cli/merge/__init__.py +11 -0
- specfact_cli-0.16.1/src/specfact_cli/merge/resolver.py +429 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/__init__.py +5 -0
- specfact_cli-0.16.1/src/specfact_cli/models/contract.py +151 -0
- specfact_cli-0.16.1/src/specfact_cli/models/persona_template.py +86 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/plan.py +62 -3
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/project.py +12 -1
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/sdd.py +24 -4
- specfact_cli-0.16.1/src/specfact_cli/parsers/__init__.py +9 -0
- specfact_cli-0.16.1/src/specfact_cli/parsers/persona_importer.py +465 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/acceptance_criteria.py +7 -11
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/git.py +15 -6
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/sdd_discovery.py +31 -30
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/structure.py +35 -74
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/structured_io.py +3 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/__init__.py +3 -0
- specfact_cli-0.16.1/src/specfact_cli/validators/agile_validation.py +329 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/contract_validator.py +34 -3
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/schema.py +11 -0
- specfact_cli-0.15.3/src/specfact_cli/commands/__init__.py +0 -22
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/LICENSE.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/shared/cli-enforcement.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.01-import.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.02-plan.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.03-review.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.04-sdd.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.05-enforce.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.06-sync.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.07-contracts.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.compare.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.validate.md +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/templates/pr-template.md.j2 +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/analyze_agent.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/analyze.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/bridge.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/drift.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/implement.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/init.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/migrate.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/repro.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/run.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/spec.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/common/logger_setup.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/common/logging_utils.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/openapi_extractor.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/task_generator.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/test_to_openapi.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/integrations/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/integrations/specmatic.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/bridge.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/quality.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/source_tracking.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/task.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/runtime.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/bridge_probe.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/bridge_sync.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/bridge_watch.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/change_detector.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/code_to_spec.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/drift_detector.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/spec_to_code.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/spec_to_tests.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/speckit_sync.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/templates/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/templates/bridge_templates.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/templates/specification_templates.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/bundle_loader.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/context_detection.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/enrichment_context.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/enrichment_parser.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/ide_setup.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/incremental_check.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/optional_deps.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/performance.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/progress.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/source_scanner.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/suggestions.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/cli_first_validator.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/repro_checker.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specfact-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.1
|
|
4
4
|
Summary: Brownfield-first CLI: Reverse engineer legacy Python → specs → enforced contracts. Automate legacy code documentation and prevent modernization regressions.
|
|
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
|
|
@@ -332,6 +332,16 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
|
|
|
332
332
|
|
|
333
333
|
**For teams that can't afford production bugs during migration.**
|
|
334
334
|
|
|
335
|
+
### 🎯 Built for Real-World Agile Teams
|
|
336
|
+
|
|
337
|
+
SpecFact isn't just a technical tool—it's designed for **real-world agile/scrum teams** with role-based workflows:
|
|
338
|
+
|
|
339
|
+
- 👤 **Product Owners** → Export backlog with DoR checklists, prioritization, dependencies, and sprint planning
|
|
340
|
+
- 🏗️ **Architects** → Export technical constraints, protocols, contracts, architectural decisions, and risk assessments
|
|
341
|
+
- 💻 **Developers** → Export implementation tasks, code mappings, test scenarios, and Definition of Done criteria
|
|
342
|
+
|
|
343
|
+
**Each role works in their own Markdown files** (no YAML editing), and SpecFact syncs everything together automatically. Perfect for teams using agile/scrum practices with clear role separation.
|
|
344
|
+
|
|
335
345
|
---
|
|
336
346
|
|
|
337
347
|
## Why SpecFact?
|
|
@@ -360,6 +370,8 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
|
|
|
360
370
|
|
|
361
371
|
## 💡 Key Capabilities
|
|
362
372
|
|
|
373
|
+
### Technical Capabilities
|
|
374
|
+
|
|
363
375
|
- ✅ **Reverse engineer legacy code** → Extract specs automatically from existing code
|
|
364
376
|
- ✅ **Runtime contract enforcement** → Prevent regressions during modernization
|
|
365
377
|
- ✅ **Symbolic execution** → Discover hidden edge cases with CrossHair
|
|
@@ -367,6 +379,47 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
|
|
|
367
379
|
- ✅ **Works offline** → No cloud required, fully local
|
|
368
380
|
- ✅ **CLI integrations** → Works seamlessly with VS Code, Cursor, GitHub Actions, and any agentic workflow
|
|
369
381
|
|
|
382
|
+
### Team Collaboration Capabilities
|
|
383
|
+
|
|
384
|
+
- ✅ **Persona-based workflows** → Product Owners, Architects, and Developers work in parallel on their own sections
|
|
385
|
+
- ✅ **Agile/scrum alignment** → Definition of Ready (DoR), story points, dependencies, prioritization, sprint planning
|
|
386
|
+
- ✅ **Role-specific exports** → Each persona gets a tailored Markdown view with only what they need
|
|
387
|
+
- ✅ **Git-native collaboration** → Conflicts resolved in human-readable Markdown, not brittle YAML
|
|
388
|
+
- ✅ **Real-world templates** → Templates designed by agile coaches to match actual team expectations
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## 👥 Team Collaboration: Persona-Based Workflows
|
|
393
|
+
|
|
394
|
+
SpecFact enables **real-world agile/scrum teams** to work together seamlessly with role-based workflows:
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
# Product Owner: Export backlog for sprint planning
|
|
398
|
+
specfact project export --bundle legacy-api --persona product-owner
|
|
399
|
+
# → Exports: DoR checklists, prioritization, dependencies, business value, sprint planning
|
|
400
|
+
|
|
401
|
+
# Architect: Export technical design
|
|
402
|
+
specfact project export --bundle legacy-api --persona architect
|
|
403
|
+
# → Exports: Technical constraints, protocols, contracts, architectural decisions, NFRs
|
|
404
|
+
|
|
405
|
+
# Developer: Export implementation details
|
|
406
|
+
specfact project export --bundle legacy-api --persona developer
|
|
407
|
+
# → Exports: Tasks, code mappings, test scenarios, Definition of Done
|
|
408
|
+
|
|
409
|
+
# Each role edits their Markdown, then imports back
|
|
410
|
+
specfact project import --bundle legacy-api --persona product-owner --source backlog.md
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
**Why this matters:**
|
|
414
|
+
|
|
415
|
+
- ✅ **No YAML editing** → Everyone works in familiar Markdown
|
|
416
|
+
- ✅ **Parallel workflows** → Product Owners, Architects, and Developers work simultaneously
|
|
417
|
+
- ✅ **Git-native** → Conflicts resolved in Markdown (human-readable), not YAML
|
|
418
|
+
- ✅ **Agile/scrum ready** → Built-in DoR validation, dependency tracking, sprint planning
|
|
419
|
+
- ✅ **Real-world templates** → Designed by agile coaches to match actual team expectations
|
|
420
|
+
|
|
421
|
+
👉 **[Agile/Scrum Workflows Guide](docs/guides/agile-scrum-workflows.md)** - Complete guide to persona-based team collaboration
|
|
422
|
+
|
|
370
423
|
---
|
|
371
424
|
|
|
372
425
|
## 🔌 CLI Integrations
|
|
@@ -403,6 +456,8 @@ We ran SpecFact CLI **on itself** to prove it works with legacy code:
|
|
|
403
456
|
|
|
404
457
|
**New to SpecFact?** Start with the [Getting Started Guide](docs/getting-started/README.md)
|
|
405
458
|
|
|
459
|
+
**Working with a team?** See [Agile/Scrum Workflows](docs/guides/agile-scrum-workflows.md) - Persona-based team collaboration with Product Owners, Architects, and Developers
|
|
460
|
+
|
|
406
461
|
**Want to see integrations?** Check out [Integration Showcases](docs/examples/integration-showcases/) - Real bugs fixed via VS Code, Cursor, GitHub Actions
|
|
407
462
|
|
|
408
463
|
**Tried Spec-Kit?** See [How SpecFact Compares to Spec-Kit](docs/guides/speckit-comparison.md) and [The Journey: From Spec-Kit to SpecFact](docs/guides/speckit-journey.md)
|
|
@@ -57,6 +57,16 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
|
|
|
57
57
|
|
|
58
58
|
**For teams that can't afford production bugs during migration.**
|
|
59
59
|
|
|
60
|
+
### 🎯 Built for Real-World Agile Teams
|
|
61
|
+
|
|
62
|
+
SpecFact isn't just a technical tool—it's designed for **real-world agile/scrum teams** with role-based workflows:
|
|
63
|
+
|
|
64
|
+
- 👤 **Product Owners** → Export backlog with DoR checklists, prioritization, dependencies, and sprint planning
|
|
65
|
+
- 🏗️ **Architects** → Export technical constraints, protocols, contracts, architectural decisions, and risk assessments
|
|
66
|
+
- 💻 **Developers** → Export implementation tasks, code mappings, test scenarios, and Definition of Done criteria
|
|
67
|
+
|
|
68
|
+
**Each role works in their own Markdown files** (no YAML editing), and SpecFact syncs everything together automatically. Perfect for teams using agile/scrum practices with clear role separation.
|
|
69
|
+
|
|
60
70
|
---
|
|
61
71
|
|
|
62
72
|
## Why SpecFact?
|
|
@@ -85,6 +95,8 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
|
|
|
85
95
|
|
|
86
96
|
## 💡 Key Capabilities
|
|
87
97
|
|
|
98
|
+
### Technical Capabilities
|
|
99
|
+
|
|
88
100
|
- ✅ **Reverse engineer legacy code** → Extract specs automatically from existing code
|
|
89
101
|
- ✅ **Runtime contract enforcement** → Prevent regressions during modernization
|
|
90
102
|
- ✅ **Symbolic execution** → Discover hidden edge cases with CrossHair
|
|
@@ -92,6 +104,47 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
|
|
|
92
104
|
- ✅ **Works offline** → No cloud required, fully local
|
|
93
105
|
- ✅ **CLI integrations** → Works seamlessly with VS Code, Cursor, GitHub Actions, and any agentic workflow
|
|
94
106
|
|
|
107
|
+
### Team Collaboration Capabilities
|
|
108
|
+
|
|
109
|
+
- ✅ **Persona-based workflows** → Product Owners, Architects, and Developers work in parallel on their own sections
|
|
110
|
+
- ✅ **Agile/scrum alignment** → Definition of Ready (DoR), story points, dependencies, prioritization, sprint planning
|
|
111
|
+
- ✅ **Role-specific exports** → Each persona gets a tailored Markdown view with only what they need
|
|
112
|
+
- ✅ **Git-native collaboration** → Conflicts resolved in human-readable Markdown, not brittle YAML
|
|
113
|
+
- ✅ **Real-world templates** → Templates designed by agile coaches to match actual team expectations
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 👥 Team Collaboration: Persona-Based Workflows
|
|
118
|
+
|
|
119
|
+
SpecFact enables **real-world agile/scrum teams** to work together seamlessly with role-based workflows:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Product Owner: Export backlog for sprint planning
|
|
123
|
+
specfact project export --bundle legacy-api --persona product-owner
|
|
124
|
+
# → Exports: DoR checklists, prioritization, dependencies, business value, sprint planning
|
|
125
|
+
|
|
126
|
+
# Architect: Export technical design
|
|
127
|
+
specfact project export --bundle legacy-api --persona architect
|
|
128
|
+
# → Exports: Technical constraints, protocols, contracts, architectural decisions, NFRs
|
|
129
|
+
|
|
130
|
+
# Developer: Export implementation details
|
|
131
|
+
specfact project export --bundle legacy-api --persona developer
|
|
132
|
+
# → Exports: Tasks, code mappings, test scenarios, Definition of Done
|
|
133
|
+
|
|
134
|
+
# Each role edits their Markdown, then imports back
|
|
135
|
+
specfact project import --bundle legacy-api --persona product-owner --source backlog.md
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Why this matters:**
|
|
139
|
+
|
|
140
|
+
- ✅ **No YAML editing** → Everyone works in familiar Markdown
|
|
141
|
+
- ✅ **Parallel workflows** → Product Owners, Architects, and Developers work simultaneously
|
|
142
|
+
- ✅ **Git-native** → Conflicts resolved in Markdown (human-readable), not YAML
|
|
143
|
+
- ✅ **Agile/scrum ready** → Built-in DoR validation, dependency tracking, sprint planning
|
|
144
|
+
- ✅ **Real-world templates** → Designed by agile coaches to match actual team expectations
|
|
145
|
+
|
|
146
|
+
👉 **[Agile/Scrum Workflows Guide](docs/guides/agile-scrum-workflows.md)** - Complete guide to persona-based team collaboration
|
|
147
|
+
|
|
95
148
|
---
|
|
96
149
|
|
|
97
150
|
## 🔌 CLI Integrations
|
|
@@ -128,6 +181,8 @@ We ran SpecFact CLI **on itself** to prove it works with legacy code:
|
|
|
128
181
|
|
|
129
182
|
**New to SpecFact?** Start with the [Getting Started Guide](docs/getting-started/README.md)
|
|
130
183
|
|
|
184
|
+
**Working with a team?** See [Agile/Scrum Workflows](docs/guides/agile-scrum-workflows.md) - Persona-based team collaboration with Product Owners, Architects, and Developers
|
|
185
|
+
|
|
131
186
|
**Want to see integrations?** Check out [Integration Showcases](docs/examples/integration-showcases/) - Real bugs fixed via VS Code, Cursor, GitHub Actions
|
|
132
187
|
|
|
133
188
|
**Tried Spec-Kit?** See [How SpecFact Compares to Spec-Kit](docs/guides/speckit-comparison.md) and [The Journey: From Spec-Kit to SpecFact](docs/guides/speckit-journey.md)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specfact-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.16.1"
|
|
8
8
|
description = "Brownfield-first CLI: Reverse engineer legacy Python → specs → enforced contracts. Automate legacy code documentation and prevent modernization regressions."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Project Plan: {{ bundle_name }} - Architect View
|
|
2
|
+
|
|
3
|
+
**Persona**: Architect
|
|
4
|
+
**Bundle**: `{{ bundle_name }}`
|
|
5
|
+
**Created**: {{ created_at }}
|
|
6
|
+
**Status**: {{ status }}
|
|
7
|
+
**Last Updated**: {{ updated_at }}
|
|
8
|
+
|
|
9
|
+
{% if features %}
|
|
10
|
+
## Technical Constraints & Requirements *(mandatory)*
|
|
11
|
+
|
|
12
|
+
{% for feature_key, feature in features.items() %}
|
|
13
|
+
### {{ feature.key }}: {{ feature.title }}
|
|
14
|
+
|
|
15
|
+
{% if feature.constraints %}
|
|
16
|
+
#### Technical Constraints - {{ feature.key }}
|
|
17
|
+
|
|
18
|
+
{% for constraint in feature.constraints %}
|
|
19
|
+
- {{ constraint }}
|
|
20
|
+
{% endfor %}
|
|
21
|
+
{% else %}
|
|
22
|
+
*[ACTION REQUIRED: Define technical constraints for this feature]*
|
|
23
|
+
{%- endif %}
|
|
24
|
+
{% if feature.contract %}
|
|
25
|
+
#### API Contract
|
|
26
|
+
|
|
27
|
+
**Contract Path**: `{{ feature.contract }}`
|
|
28
|
+
|
|
29
|
+
{% if contracts and feature.key in contracts %}
|
|
30
|
+
**Contract Details**: See Contracts section below.
|
|
31
|
+
{%- endif %}
|
|
32
|
+
{%- endif %}
|
|
33
|
+
{% if feature.protocol %}
|
|
34
|
+
#### State Machine Protocol
|
|
35
|
+
|
|
36
|
+
**Protocol Path**: `{{ feature.protocol }}`
|
|
37
|
+
|
|
38
|
+
{% if protocols and feature.key in protocols %}
|
|
39
|
+
**Protocol Details**: See Protocols & State Machines section below.
|
|
40
|
+
{%- endif %}
|
|
41
|
+
{%- endif %}
|
|
42
|
+
{% if feature.priority or feature.rank or feature.business_value_score %}
|
|
43
|
+
#### Feature Prioritization
|
|
44
|
+
|
|
45
|
+
{% if feature.priority %}
|
|
46
|
+
- **Priority**: {{ feature.priority }}
|
|
47
|
+
{% endif %}
|
|
48
|
+
{% if feature.rank %}
|
|
49
|
+
- **Backlog Rank**: {{ feature.rank }} (1 = highest priority)
|
|
50
|
+
{% endif %}
|
|
51
|
+
{% if feature.business_value_score %}
|
|
52
|
+
- **Business Value Score**: {{ feature.business_value_score }}/100
|
|
53
|
+
{% endif %}
|
|
54
|
+
{% if feature.target_release %}
|
|
55
|
+
- **Target Release**: {{ feature.target_release }}
|
|
56
|
+
{%- endif %}
|
|
57
|
+
{%- endif %}
|
|
58
|
+
{% if feature.depends_on_features or feature.blocks_features %}
|
|
59
|
+
#### Feature Dependencies
|
|
60
|
+
|
|
61
|
+
{% if feature.depends_on_features %}
|
|
62
|
+
- **Depends On**: {{ feature.depends_on_features | join(', ') }}
|
|
63
|
+
{% endif %}
|
|
64
|
+
{% if feature.blocks_features %}
|
|
65
|
+
- **Blocks**: {{ feature.blocks_features | join(', ') }}
|
|
66
|
+
{%- endif %}
|
|
67
|
+
{%- endif %}
|
|
68
|
+
{% if feature.estimated_story_points %}
|
|
69
|
+
#### Story Point Estimation
|
|
70
|
+
|
|
71
|
+
- **Total Estimated Story Points**: {{ feature.estimated_story_points }}
|
|
72
|
+
{%- endif %}
|
|
73
|
+
|
|
74
|
+
{%- endfor %}
|
|
75
|
+
{% else %}
|
|
76
|
+
## Technical Constraints & Requirements *(mandatory)*
|
|
77
|
+
|
|
78
|
+
*[ACTION REQUIRED: Define technical constraints and requirements for features]*
|
|
79
|
+
{%- endif %}
|
|
80
|
+
|
|
81
|
+
{% if protocols %}
|
|
82
|
+
## Protocols & State Machines *(mandatory)*
|
|
83
|
+
|
|
84
|
+
{% for protocol_name, protocol_data in protocols.items() %}
|
|
85
|
+
### {{ protocol_name }}
|
|
86
|
+
|
|
87
|
+
{% if protocol_data.states %}
|
|
88
|
+
**States**: {{ protocol_data.states | join(', ') }}
|
|
89
|
+
{%- endif %}
|
|
90
|
+
|
|
91
|
+
{%- if protocol_data.transitions %}
|
|
92
|
+
**Transitions**:
|
|
93
|
+
|
|
94
|
+
{% for transition in protocol_data.transitions %}
|
|
95
|
+
- `{{ transition.from_state }}` → `{{ transition.to_state }}`{% if transition.event %} (on: `{{ transition.event }}`){% endif %}
|
|
96
|
+
{% endfor %}
|
|
97
|
+
{%- endif %}
|
|
98
|
+
|
|
99
|
+
{%- if protocol_data.initial_state %}
|
|
100
|
+
**Initial State**: `{{ protocol_data.initial_state }}`
|
|
101
|
+
{%- endif %}
|
|
102
|
+
|
|
103
|
+
{%- if protocol_data.final_states %}
|
|
104
|
+
**Final States**: {{ protocol_data.final_states | join(', ') }}
|
|
105
|
+
{%- endif %}
|
|
106
|
+
|
|
107
|
+
{%- if protocol_data.validation_rules %}
|
|
108
|
+
**Validation Rules**:
|
|
109
|
+
|
|
110
|
+
{% for rule in protocol_data.validation_rules %}
|
|
111
|
+
- {{ rule }}
|
|
112
|
+
{% endfor %}
|
|
113
|
+
{%- endif %}
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
{% endfor %}
|
|
118
|
+
{% else %}
|
|
119
|
+
## Protocols & State Machines *(mandatory)*
|
|
120
|
+
|
|
121
|
+
*[ACTION REQUIRED: Define protocols and state machines]*
|
|
122
|
+
|
|
123
|
+
**Note**: Protocols should be defined in `.specfact/projects/{{ bundle_name }}/protocols/*.protocol.yaml` files.
|
|
124
|
+
{% endif %}
|
|
125
|
+
|
|
126
|
+
{% if contracts %}
|
|
127
|
+
## Contracts *(mandatory)*
|
|
128
|
+
|
|
129
|
+
{% for contract_name, contract_data in contracts.items() %}
|
|
130
|
+
### {{ contract_name }}
|
|
131
|
+
|
|
132
|
+
{% if contract_data.info %}
|
|
133
|
+
**Info**:
|
|
134
|
+
|
|
135
|
+
- **Title**: {{ contract_data.info.title if contract_data.info.title else 'N/A' }}
|
|
136
|
+
- **Version**: {{ contract_data.info.version if contract_data.info.version else 'N/A' }}
|
|
137
|
+
- **Description**: {{ contract_data.info.description if contract_data.info.description else 'N/A' }}
|
|
138
|
+
{%- endif %}
|
|
139
|
+
|
|
140
|
+
{%- if contract_data.openapi %}
|
|
141
|
+
**OpenAPI Version**: {{ contract_data.openapi }}
|
|
142
|
+
{%- endif %}
|
|
143
|
+
|
|
144
|
+
{%- if contract_data.asyncapi %}
|
|
145
|
+
**AsyncAPI Version**: {{ contract_data.asyncapi }}
|
|
146
|
+
{%- endif %}
|
|
147
|
+
|
|
148
|
+
{%- if contract_data.servers %}
|
|
149
|
+
**Servers**:
|
|
150
|
+
|
|
151
|
+
{% for server in contract_data.servers %}
|
|
152
|
+
- {{ server.url }}{% if server.description %} - {{ server.description }}{% endif %}
|
|
153
|
+
{% endfor %}
|
|
154
|
+
{%- endif %}
|
|
155
|
+
|
|
156
|
+
{%- if contract_data.paths %}
|
|
157
|
+
**Endpoints**:
|
|
158
|
+
|
|
159
|
+
{% for path, methods in contract_data.paths.items() %}
|
|
160
|
+
- `{{ path }}`:
|
|
161
|
+
{% for method, details in methods.items() %}
|
|
162
|
+
- `{{ method.upper() }}`: {{ details.summary if details.summary else 'N/A' }}
|
|
163
|
+
{% endfor %}
|
|
164
|
+
{% endfor %}
|
|
165
|
+
{%- endif %}
|
|
166
|
+
|
|
167
|
+
{%- if contract_data.components and contract_data.components.schemas %}
|
|
168
|
+
**Schemas**:
|
|
169
|
+
|
|
170
|
+
{% for schema_name, schema_def in contract_data.components.schemas.items() %}
|
|
171
|
+
- `{{ schema_name }}`: {{ schema_def.type if schema_def.type else 'object' }}
|
|
172
|
+
{% endfor %}
|
|
173
|
+
{%- endif %}
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
{%- endfor %}
|
|
178
|
+
{% else %}
|
|
179
|
+
## Contracts *(mandatory)*
|
|
180
|
+
|
|
181
|
+
*[ACTION REQUIRED: Define contracts (OpenAPI, AsyncAPI, etc.)]*
|
|
182
|
+
|
|
183
|
+
**Note**: Contracts should be defined in `.specfact/projects/{{ bundle_name }}/contracts/*.openapi.yaml` or `*.asyncapi.yaml` files.
|
|
184
|
+
{%- endif %}
|
|
185
|
+
|
|
186
|
+
## Ownership & Locks
|
|
187
|
+
|
|
188
|
+
{% if locks %}
|
|
189
|
+
**Locked Sections**:
|
|
190
|
+
|
|
191
|
+
{% for lock in locks %}
|
|
192
|
+
- `{{ lock.section }}` - Locked by {{ lock.owner }} ({{ lock.locked_at }})
|
|
193
|
+
{% endfor %}
|
|
194
|
+
{% else %}
|
|
195
|
+
No sections currently locked
|
|
196
|
+
{% endif %}
|
|
197
|
+
|
|
198
|
+
## Validation Checklist
|
|
199
|
+
|
|
200
|
+
- [ ] All features have technical constraints defined
|
|
201
|
+
- [ ] Protocols/state machines are documented
|
|
202
|
+
- [ ] Contracts are defined and validated
|
|
203
|
+
- [ ] Architecture decisions are documented
|
|
204
|
+
- [ ] Non-functional requirements are specified
|
|
205
|
+
- [ ] Risk assessment is complete
|
|
206
|
+
- [ ] Deployment architecture is documented
|
|
207
|
+
|
|
208
|
+
## Notes
|
|
209
|
+
|
|
210
|
+
*Use this section for architectural decisions, trade-offs, or technical clarifications.*
|
|
211
|
+
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# Project Plan: {{ bundle_name }} - Developer View
|
|
2
|
+
|
|
3
|
+
**Persona**: Developer
|
|
4
|
+
**Bundle**: `{{ bundle_name }}`
|
|
5
|
+
**Created**: {{ created_at }}
|
|
6
|
+
**Status**: {{ status }}
|
|
7
|
+
**Last Updated**: {{ updated_at }}
|
|
8
|
+
|
|
9
|
+
{% if features %}
|
|
10
|
+
## Acceptance Criteria & Implementation Details *(mandatory)*
|
|
11
|
+
|
|
12
|
+
{%- for feature_key, feature in features.items() -%}
|
|
13
|
+
### {{ feature.key }}: {{ feature.title }}
|
|
14
|
+
|
|
15
|
+
{% if feature.acceptance %}
|
|
16
|
+
#### Acceptance Criteria - {{ feature.key }}
|
|
17
|
+
|
|
18
|
+
{%- for criterion in feature.acceptance %}
|
|
19
|
+
{% set criterion_clean = criterion.replace('\r\n', '\n').replace('\r', '\n').strip() %}
|
|
20
|
+
{% if '\n' in criterion_clean %}
|
|
21
|
+
{% set criterion_lines = criterion_clean.split('\n') %}
|
|
22
|
+
{% for line in criterion_lines %}
|
|
23
|
+
{% if line.strip() %}
|
|
24
|
+
- [ ] {{ line.strip() }}
|
|
25
|
+
{% endif %}
|
|
26
|
+
{% endfor %}
|
|
27
|
+
{% else %}
|
|
28
|
+
- [ ] {{ criterion_clean }}
|
|
29
|
+
{%- endif -%}
|
|
30
|
+
{%- endfor -%}
|
|
31
|
+
{% else %}
|
|
32
|
+
*[ACTION REQUIRED: Define acceptance criteria for this feature]*
|
|
33
|
+
{%- endif %}
|
|
34
|
+
{% if feature.stories %}
|
|
35
|
+
#### User Stories
|
|
36
|
+
|
|
37
|
+
{% for story in feature.stories %}
|
|
38
|
+
**{{ story.key }}**: {{ story.title }}
|
|
39
|
+
|
|
40
|
+
{% if story.story_points or story.value_points or story.priority or story.target_sprint or story.target_release or story.depends_on_stories or story.blocks_stories %}
|
|
41
|
+
**Sprint Context**:
|
|
42
|
+
|
|
43
|
+
{% if story.story_points %}
|
|
44
|
+
- **Story Points**: {{ story.story_points }} (complexity)
|
|
45
|
+
{% endif %}
|
|
46
|
+
{% if story.value_points %}
|
|
47
|
+
- **Value Points**: {{ story.value_points }} (business value)
|
|
48
|
+
{% endif %}
|
|
49
|
+
{% if story.priority %}
|
|
50
|
+
- **Priority**: {{ story.priority }}
|
|
51
|
+
{% endif %}
|
|
52
|
+
{% if story.rank %}
|
|
53
|
+
- **Backlog Rank**: {{ story.rank }} (1 = highest priority)
|
|
54
|
+
{% endif %}
|
|
55
|
+
{% if story.target_sprint %}
|
|
56
|
+
- **Target Sprint**: {{ story.target_sprint }}
|
|
57
|
+
{% endif %}
|
|
58
|
+
{% if story.target_release %}
|
|
59
|
+
- **Target Release**: {{ story.target_release }}
|
|
60
|
+
{% endif %}
|
|
61
|
+
{% if story.due_date %}
|
|
62
|
+
- **Due Date**: {{ story.due_date }}
|
|
63
|
+
{% endif %}
|
|
64
|
+
{% if story.depends_on_stories %}
|
|
65
|
+
- **Depends On**: {{ story.depends_on_stories | join(', ') }}
|
|
66
|
+
{% endif %}
|
|
67
|
+
{% if story.blocks_stories %}
|
|
68
|
+
- **Blocks**: {{ story.blocks_stories | join(', ') }}
|
|
69
|
+
{%- endif %}
|
|
70
|
+
{%- endif %}
|
|
71
|
+
{% if story.acceptance %}
|
|
72
|
+
**Acceptance Criteria**:
|
|
73
|
+
|
|
74
|
+
{% for criterion in story.acceptance %}
|
|
75
|
+
{% set criterion_clean = criterion.replace('\r\n', '\n').replace('\r', '\n').strip() %}
|
|
76
|
+
{% if '\n' in criterion_clean %}
|
|
77
|
+
{% set criterion_lines = criterion_clean.split('\n') %}
|
|
78
|
+
{% for line in criterion_lines %}
|
|
79
|
+
{% if line.strip() %}
|
|
80
|
+
- [ ] {{ line.strip() }}
|
|
81
|
+
{% endif %}
|
|
82
|
+
{% endfor %}
|
|
83
|
+
{% else %}
|
|
84
|
+
- [ ] {{ criterion_clean }}
|
|
85
|
+
{% endif %}
|
|
86
|
+
{% endfor %}
|
|
87
|
+
{%- endif %}
|
|
88
|
+
{% if story.tasks %}
|
|
89
|
+
**Implementation Tasks**:
|
|
90
|
+
|
|
91
|
+
{% for task in story.tasks %}
|
|
92
|
+
- [ ] {{ task }}
|
|
93
|
+
{% endfor %}
|
|
94
|
+
{%- endif %}
|
|
95
|
+
{% if story.contracts %}
|
|
96
|
+
**API Contracts**:
|
|
97
|
+
|
|
98
|
+
{% for contract_type, contract_data in story.contracts.items() %}
|
|
99
|
+
**{{ contract_type }}**:
|
|
100
|
+
|
|
101
|
+
{% if contract_data is mapping %}
|
|
102
|
+
{% if contract_data.parameters %}
|
|
103
|
+
**Parameters**:
|
|
104
|
+
{% for param_name, param_info in contract_data.parameters.items() %}
|
|
105
|
+
- `{{ param_name }}`: {{ param_info.type if param_info.type else 'Any' }}{% if param_info.description %} - {{ param_info.description }}{% endif %}
|
|
106
|
+
{% endfor %}
|
|
107
|
+
{% endif %}
|
|
108
|
+
{% if contract_data.return_type %}
|
|
109
|
+
**Return Type**: `{{ contract_data.return_type }}`
|
|
110
|
+
{% endif %}
|
|
111
|
+
{% if contract_data.preconditions %}
|
|
112
|
+
**Preconditions**:
|
|
113
|
+
{% for precondition in contract_data.preconditions %}
|
|
114
|
+
- {{ precondition }}
|
|
115
|
+
{% endfor %}
|
|
116
|
+
{% endif %}
|
|
117
|
+
{% if contract_data.postconditions %}
|
|
118
|
+
**Postconditions**:
|
|
119
|
+
{% for postcondition in contract_data.postconditions %}
|
|
120
|
+
- {{ postcondition }}
|
|
121
|
+
{% endfor %}
|
|
122
|
+
{% endif %}
|
|
123
|
+
{% if contract_data.error_contracts %}
|
|
124
|
+
**Error Contracts**:
|
|
125
|
+
{% for error_type, error_info in contract_data.error_contracts.items() %}
|
|
126
|
+
- `{{ error_type }}`: {{ error_info.description if error_info.description else error_info }}
|
|
127
|
+
{% endfor %}
|
|
128
|
+
{% endif %}
|
|
129
|
+
{% else %}
|
|
130
|
+
```python
|
|
131
|
+
{{ contract_data }}
|
|
132
|
+
```
|
|
133
|
+
{% endif %}
|
|
134
|
+
{% endfor %}
|
|
135
|
+
{%- endif %}
|
|
136
|
+
{% if story.scenarios %}
|
|
137
|
+
**Test Scenarios**:
|
|
138
|
+
|
|
139
|
+
{% if story.scenarios.primary %}
|
|
140
|
+
**Primary**:
|
|
141
|
+
{% for scenario in story.scenarios.primary %}
|
|
142
|
+
- {{ scenario }}
|
|
143
|
+
{% endfor %}
|
|
144
|
+
{% endif %}
|
|
145
|
+
{% if story.scenarios.alternate %}
|
|
146
|
+
**Alternate**:
|
|
147
|
+
{% for scenario in story.scenarios.alternate %}
|
|
148
|
+
- {{ scenario }}
|
|
149
|
+
{% endfor %}
|
|
150
|
+
{% endif %}
|
|
151
|
+
{% if story.scenarios.exception %}
|
|
152
|
+
**Exception**:
|
|
153
|
+
{% for scenario in story.scenarios.exception %}
|
|
154
|
+
- {{ scenario }}
|
|
155
|
+
{% endfor %}
|
|
156
|
+
{% endif %}
|
|
157
|
+
{% if story.scenarios.recovery %}
|
|
158
|
+
**Recovery**:
|
|
159
|
+
{% for scenario in story.scenarios.recovery %}
|
|
160
|
+
- {{ scenario }}
|
|
161
|
+
{% endfor %}
|
|
162
|
+
{%- endif %}
|
|
163
|
+
{%- endif %}
|
|
164
|
+
{% if story.source_functions or story.test_functions %}
|
|
165
|
+
**Code Mappings**:
|
|
166
|
+
|
|
167
|
+
{% if story.source_functions %}
|
|
168
|
+
**Source Functions**:
|
|
169
|
+
{% for func in story.source_functions %}
|
|
170
|
+
- `{{ func }}`
|
|
171
|
+
{% endfor %}
|
|
172
|
+
{% endif %}
|
|
173
|
+
{% if story.test_functions %}
|
|
174
|
+
**Test Functions**:
|
|
175
|
+
{% for func in story.test_functions %}
|
|
176
|
+
- `{{ func }}`
|
|
177
|
+
{% endfor %}
|
|
178
|
+
{%- endif %}
|
|
179
|
+
{%- endif %}
|
|
180
|
+
{% if story.definition_of_ready %}
|
|
181
|
+
**Definition of Ready Status**:
|
|
182
|
+
|
|
183
|
+
{% for item, status in story.definition_of_ready.items() %}
|
|
184
|
+
- [{% if status %}x{% else %} {% endif %}] {{ item.replace('_', ' ').title() }}
|
|
185
|
+
{% endfor %}
|
|
186
|
+
{%- endif %}
|
|
187
|
+
|
|
188
|
+
**Definition of Done**:
|
|
189
|
+
|
|
190
|
+
- [ ] Code implemented and reviewed
|
|
191
|
+
- [ ] Unit tests written (100% coverage for critical paths)
|
|
192
|
+
- [ ] Integration tests passing
|
|
193
|
+
- [ ] API documentation updated
|
|
194
|
+
- [ ] Performance requirements met
|
|
195
|
+
- [ ] Security requirements met
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
{% endfor %}
|
|
200
|
+
{%- endif %}
|
|
201
|
+
{% if feature.implementation %}
|
|
202
|
+
#### Implementation Notes
|
|
203
|
+
|
|
204
|
+
{{ feature.implementation }}
|
|
205
|
+
{%- endif -%}
|
|
206
|
+
{%- endfor -%}
|
|
207
|
+
{% else %}
|
|
208
|
+
## Acceptance Criteria & Implementation Details *(mandatory)*
|
|
209
|
+
|
|
210
|
+
*[ACTION REQUIRED: Define acceptance criteria and implementation details for features]*
|
|
211
|
+
{%- endif -%}
|
|
212
|
+
|
|
213
|
+
## Ownership & Locks
|
|
214
|
+
|
|
215
|
+
{% if locks %}
|
|
216
|
+
**Locked Sections**:
|
|
217
|
+
|
|
218
|
+
{% for lock in locks %}
|
|
219
|
+
- `{{ lock.section }}` - Locked by {{ lock.owner }} ({{ lock.locked_at }})
|
|
220
|
+
{% endfor %}
|
|
221
|
+
{% else %}
|
|
222
|
+
No sections currently locked
|
|
223
|
+
{% endif %}
|
|
224
|
+
|
|
225
|
+
## Validation Checklist
|
|
226
|
+
|
|
227
|
+
- [ ] All features have acceptance criteria defined
|
|
228
|
+
- [ ] Acceptance criteria are testable
|
|
229
|
+
- [ ] Implementation tasks are documented
|
|
230
|
+
- [ ] API contracts are defined
|
|
231
|
+
- [ ] Test scenarios are documented
|
|
232
|
+
- [ ] Code mappings are complete
|
|
233
|
+
- [ ] Edge cases are considered
|
|
234
|
+
- [ ] Testing strategy is defined
|
|
235
|
+
- [ ] Definition of Done criteria are met
|
|
236
|
+
|
|
237
|
+
## Notes
|
|
238
|
+
|
|
239
|
+
*Use this section for implementation questions, technical notes, or development clarifications.*
|
|
240
|
+
|