sddflow 2.7.52__tar.gz → 2.7.54__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.
- {sddflow-2.7.52 → sddflow-2.7.54}/PKG-INFO +39 -1
- {sddflow-2.7.52 → sddflow-2.7.54}/README.md +38 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/pyproject.toml +1 -1
- sddflow-2.7.54/sdd/__init__.py +1 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/commands/review.py +376 -7
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/commands/upgrade.py +91 -0
- {sddflow-2.7.52/sdd/packs/sdd-fullstack → sddflow-2.7.54/sdd/packs/sdd-backend-service}/.github/prompts/specify-brd.prompt.md +10 -3
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/specify-doc.prompt.md +7 -3
- {sddflow-2.7.52/sdd/packs/sdd-fullstack → sddflow-2.7.54/sdd/packs/sdd-backend-service}/.github/prompts/specify-srd.prompt.md +7 -3
- {sddflow-2.7.52/sdd/packs/sdd-fullstack → sddflow-2.7.54/sdd/packs/sdd-backend-service}/.github/prompts/specify-uc.prompt.md +8 -3
- {sddflow-2.7.52/sdd/packs/sdd-universal → sddflow-2.7.54/sdd/packs/sdd-backend-service}/.github/prompts/validate.prompt.md +36 -7
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/manifest.yml +1 -1
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/CLAUDE.md +11 -0
- {sddflow-2.7.52/sdd/packs/sdd-mobile → sddflow-2.7.54/sdd/packs/sdd-frontend-spa}/.github/prompts/specify-brd.prompt.md +10 -3
- {sddflow-2.7.52/sdd/packs/sdd-fullstack → sddflow-2.7.54/sdd/packs/sdd-frontend-spa}/.github/prompts/specify-doc.prompt.md +7 -3
- {sddflow-2.7.52/sdd/packs/sdd-backend-service → sddflow-2.7.54/sdd/packs/sdd-frontend-spa}/.github/prompts/specify-srd.prompt.md +7 -3
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/specify-uc.prompt.md +8 -3
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/validate.prompt.md +36 -7
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/manifest.yml +1 -1
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/CLAUDE.md +11 -0
- {sddflow-2.7.52/sdd/packs/sdd-frontend-spa → sddflow-2.7.54/sdd/packs/sdd-fullstack}/.github/prompts/specify-brd.prompt.md +10 -3
- {sddflow-2.7.52/sdd/packs/sdd-frontend-spa → sddflow-2.7.54/sdd/packs/sdd-fullstack}/.github/prompts/specify-doc.prompt.md +7 -3
- {sddflow-2.7.52/sdd/packs/sdd-frontend-spa → sddflow-2.7.54/sdd/packs/sdd-fullstack}/.github/prompts/specify-srd.prompt.md +7 -3
- {sddflow-2.7.52/sdd/packs/sdd-backend-service → sddflow-2.7.54/sdd/packs/sdd-fullstack}/.github/prompts/specify-uc.prompt.md +8 -3
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/validate.prompt.md +36 -7
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/manifest.yml +1 -1
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/CLAUDE.md +11 -0
- {sddflow-2.7.52/sdd/packs/sdd-backend-service → sddflow-2.7.54/sdd/packs/sdd-mobile}/.github/prompts/specify-brd.prompt.md +10 -3
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/specify-doc.prompt.md +7 -3
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/specify-srd.prompt.md +7 -3
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/specify-uc.prompt.md +8 -3
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/validate.prompt.md +36 -7
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/manifest.yml +1 -1
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/CLAUDE.md +11 -0
- sddflow-2.7.54/sdd/packs/sdd-universal/.github/prompts/specify-brd.prompt.md +227 -0
- sddflow-2.7.54/sdd/packs/sdd-universal/.github/prompts/specify-doc.prompt.md +313 -0
- sddflow-2.7.54/sdd/packs/sdd-universal/.github/prompts/specify-srd.prompt.md +240 -0
- sddflow-2.7.54/sdd/packs/sdd-universal/.github/prompts/specify-uc.prompt.md +259 -0
- {sddflow-2.7.52/sdd/packs/sdd-backend-service → sddflow-2.7.54/sdd/packs/sdd-universal}/.github/prompts/validate.prompt.md +36 -7
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/manifest.yml +1 -1
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/CLAUDE.md +11 -0
- sddflow-2.7.52/sdd/__init__.py +0 -1
- sddflow-2.7.52/sdd/packs/sdd-universal/.github/prompts/specify-brd.prompt.md +0 -220
- sddflow-2.7.52/sdd/packs/sdd-universal/.github/prompts/specify-doc.prompt.md +0 -309
- sddflow-2.7.52/sdd/packs/sdd-universal/.github/prompts/specify-srd.prompt.md +0 -236
- sddflow-2.7.52/sdd/packs/sdd-universal/.github/prompts/specify-uc.prompt.md +0 -254
- {sddflow-2.7.52 → sddflow-2.7.54}/.gitignore +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/__main__.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/commands/__init__.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/commands/config.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/commands/confluence.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/commands/cr.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/commands/dashboard.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/commands/init.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/commands/jira.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/commands/pr.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/address-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/analyze.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/ava.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/bug-assess.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/bug-fix.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/change.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/check-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/checklist.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/clarify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/create-context.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/implement.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/jira-push.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/kai.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/leo.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/maya.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/morgan.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/orchestrate.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/plan-adr.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/plan-arch.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/plan-design.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/plan-hld.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/plan-lld.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/pre-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/quinn.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/release.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/rex.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/riley.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/specify-brd.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/specify-doc.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/specify-srd.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/specify-uc.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/specify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/start.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/submit-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/task.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/taskstoissues.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.claude/commands/validate.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.cursor/rules/sdd-framework.mdc +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/copilot-instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/instructions/api.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/instructions/domain.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/instructions/java.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/instructions/tests.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/address-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/analyze.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/ava.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/bug-assess.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/bug-fix.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/change.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/check-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/checklist.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/clarify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/create-context.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/implement.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/jira-push.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/kai.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/leo.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/maya.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/morgan.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/orchestrate.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/plan-adr.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/plan-arch.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/plan-design.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/plan-hld.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/plan-lld.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/pre-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/quinn.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/release.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/rex.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/riley.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/specify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/submit-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/task.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/prompts/taskstoissues.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.github/workflows/quality-gate.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.gitignore +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.gitlab-ci.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/contexts/CONTEXT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/integrations.yml.example +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/memory/change-rules.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/memory/constitution.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/memory/roles.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/memory/summary-rules.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/memory/token-pricing.yml.example +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/adr-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/analyze-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/api-spec-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/arch-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/brd-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/changeset-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/checklist-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/clarify-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/constitution-amendment-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/context-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/data-model-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/design-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/docker-config-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/feature-story-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/hld-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/investigation-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/jira-export-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/k8s-manifest-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/lld-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/openapi-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/plan-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/qa-testcases-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/release-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/resilience-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/runbook-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/security-design-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/srd-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/tasks-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/token-usage-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/use-cases-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.specify/templates/validate-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.vscode/extensions.json +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/.windsurfrules +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/CHANGE-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/CLAUDE.local.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/FLOW-ROLES-GATES.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/HOW-TO-USE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/IMPROVEMENT-BACKLOG.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/PROMPT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/QUICKSTART.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/README.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/SDLC-COMPLETE-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/WHY-SDD.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/azure-pipelines.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/bitbucket-pipelines.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/docs/SUMMARY-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/setup.ps1 +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-backend-service/setup.sh +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/address-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/analyze.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/ava.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/bug-assess.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/bug-fix.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/change.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/check-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/checklist.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/clarify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/create-context.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/implement.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/jira-push.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/kai.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/leo.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/maya.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/morgan.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/orchestrate.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/plan-adr.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/plan-arch.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/plan-design.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/plan-hld.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/plan-lld.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/pre-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/quinn.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/release.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/rex.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/riley.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/specify-brd.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/specify-doc.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/specify-srd.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/specify-uc.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/specify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/start.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/submit-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/task.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/taskstoissues.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.claude/commands/validate.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.cursor/rules/sdd-framework.mdc +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/copilot-instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/instructions/components.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/instructions/services.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/instructions/tests.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/address-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/analyze.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/ava.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/bug-assess.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/bug-fix.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/change.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/check-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/checklist.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/clarify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/create-context.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/implement.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/jira-push.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/kai.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/leo.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/maya.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/morgan.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/orchestrate.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/plan-adr.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/plan-arch.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/plan-design.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/plan-hld.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/plan-lld.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/pre-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/quinn.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/release.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/rex.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/riley.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/specify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/submit-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/task.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/prompts/taskstoissues.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.github/workflows/quality-gate.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.gitignore +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.gitlab-ci.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/contexts/CONTEXT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/integrations.yml.example +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/memory/change-rules.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/memory/constitution.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/memory/roles.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/memory/summary-rules.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/memory/token-pricing.yml.example +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/adr-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/analyze-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/api-spec-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/arch-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/brd-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/changeset-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/checklist-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/clarify-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/component-library-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/component-spec-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/constitution-amendment-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/context-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/data-model-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/design-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/docker-config-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/feature-story-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/hld-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/investigation-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/jira-export-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/lld-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/plan-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/qa-testcases-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/release-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/resilience-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/runbook-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/security-design-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/srd-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/tasks-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/token-usage-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/use-cases-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/ux-flow-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.specify/templates/validate-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.vscode/extensions.json +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/.windsurfrules +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/CHANGE-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/CLAUDE.local.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/FLOW-ROLES-GATES.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/HOW-TO-USE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/IMPROVEMENT-BACKLOG.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/PROMPT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/QUICKSTART.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/README.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/SDLC-COMPLETE-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/WHY-SDD.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/azure-pipelines.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/bitbucket-pipelines.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/docs/SUMMARY-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/setup.ps1 +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-frontend-spa/setup.sh +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/address-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/analyze.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/ava.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/bug-assess.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/bug-fix.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/change.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/check-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/checklist.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/clarify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/create-context.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/implement.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/jira-push.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/kai.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/leo.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/maya.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/morgan.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/orchestrate.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/plan-adr.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/plan-arch.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/plan-design.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/plan-hld.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/plan-lld.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/pre-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/quinn.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/release.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/rex.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/riley.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/specify-brd.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/specify-doc.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/specify-srd.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/specify-uc.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/specify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/start.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/submit-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/task.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/taskstoissues.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.claude/commands/validate.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.cursor/rules/sdd-framework.mdc +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/copilot-instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/instructions/backend-tests.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/instructions/components.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/instructions/domain.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/instructions/frontend-services.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/instructions/java.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/address-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/analyze.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/ava.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/bug-assess.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/bug-fix.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/change.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/check-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/checklist.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/clarify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/create-context.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/implement.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/jira-push.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/kai.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/leo.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/maya.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/morgan.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/orchestrate.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/plan-adr.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/plan-arch.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/plan-design.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/plan-hld.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/plan-lld.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/pre-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/quinn.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/release.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/rex.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/riley.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/specify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/submit-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/task.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/prompts/taskstoissues.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.github/workflows/quality-gate.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.gitignore +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.gitlab-ci.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/contexts/CONTEXT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/integrations.yml.example +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/memory/change-rules.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/memory/constitution.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/memory/roles.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/memory/summary-rules.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/memory/token-pricing.yml.example +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/adr-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/analyze-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/api-spec-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/arch-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/brd-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/changeset-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/checklist-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/clarify-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/component-library-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/component-spec-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/constitution-amendment-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/context-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/data-model-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/design-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/docker-config-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/feature-story-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/hld-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/investigation-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/jira-export-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/lld-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/openapi-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/plan-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/qa-testcases-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/release-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/resilience-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/runbook-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/screen-spec-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/security-design-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/srd-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/tasks-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/token-usage-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/use-cases-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/ux-flow-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.specify/templates/validate-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.vscode/extensions.json +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/.windsurfrules +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/CHANGE-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/CLAUDE.local.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/FLOW-ROLES-GATES.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/HOW-TO-USE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/PROMPT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/QUICKSTART.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/README.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/SDLC-COMPLETE-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/WHY-SDD.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/azure-pipelines.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/bitbucket-pipelines.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/docs/SUMMARY-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/setup.ps1 +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-fullstack/setup.sh +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.claude/commands/create-context.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.claude/commands/implement.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.claude/commands/specify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.claude/commands/start.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.claude/commands/task.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.cursor/rules/sdd-framework.mdc +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.github/copilot-instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.github/prompts/create-context.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.github/prompts/implement.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.github/prompts/specify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.github/prompts/task.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.specify/contexts/CONTEXT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.specify/manifest.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.specify/memory/constitution.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.specify/templates/context-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.specify/templates/tasks-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/.windsurfrules +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/CLAUDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/QUICKSTART.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/README.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/WHY-SDD.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/setup.ps1 +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-micro/setup.sh +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/address-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/analyze.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/ava.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/bug-assess.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/bug-fix.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/change.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/check-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/checklist.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/clarify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/create-context.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/implement.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/jira-push.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/kai.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/leo.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/maya.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/morgan.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/orchestrate.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/plan-adr.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/plan-arch.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/plan-design.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/plan-hld.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/plan-lld.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/pre-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/quinn.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/release.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/rex.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/riley.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/specify-brd.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/specify-doc.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/specify-srd.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/specify-uc.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/specify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/start.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/submit-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/task.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/taskstoissues.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.claude/commands/validate.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.cursor/rules/sdd-framework.mdc +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/copilot-instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/instructions/screens.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/instructions/services.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/instructions/tests.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/address-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/analyze.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/ava.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/bug-assess.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/bug-fix.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/change.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/check-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/checklist.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/clarify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/create-context.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/implement.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/jira-push.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/kai.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/leo.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/maya.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/morgan.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/orchestrate.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/plan-adr.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/plan-arch.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/plan-design.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/plan-hld.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/plan-lld.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/pre-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/quinn.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/release.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/rex.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/riley.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/specify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/submit-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/task.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/prompts/taskstoissues.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.github/workflows/quality-gate.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.gitignore +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.gitlab-ci.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/contexts/CONTEXT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/integrations.yml.example +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/memory/change-rules.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/memory/constitution.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/memory/roles.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/memory/summary-rules.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/memory/token-pricing.yml.example +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/adr-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/analyze-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/api-spec-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/arch-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/brd-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/changeset-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/checklist-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/clarify-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/constitution-amendment-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/context-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/data-model-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/design-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/docker-config-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/feature-story-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/hld-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/investigation-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/jira-export-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/lld-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/plan-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/qa-testcases-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/release-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/resilience-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/runbook-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/screen-spec-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/security-design-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/srd-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/tasks-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/token-usage-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/use-cases-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/ux-flow-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.specify/templates/validate-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.vscode/extensions.json +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/.windsurfrules +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/CHANGE-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/CLAUDE.local.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/FLOW-ROLES-GATES.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/HOW-TO-USE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/IMPROVEMENT-BACKLOG.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/PROMPT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/QUICKSTART.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/README.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/SDLC-COMPLETE-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/WHY-SDD.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/azure-pipelines.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/bitbucket-pipelines.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/docs/SUMMARY-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/setup.ps1 +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-mobile/setup.sh +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/address-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/analyze.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/ava.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/bug-assess.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/bug-fix.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/change.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/check-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/checklist.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/clarify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/create-context.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/implement.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/jira-push.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/kai.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/leo.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/maya.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/morgan.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/orchestrate.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/plan-adr.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/plan-arch.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/plan-design.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/plan-hld.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/plan-lld.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/pre-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/quinn.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/release.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/rex.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/riley.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/specify-brd.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/specify-doc.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/specify-srd.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/specify-uc.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/specify.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/start.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/submit-review.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/task.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/taskstoissues.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.claude/commands/validate.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.cursor/rules/sdd-framework.mdc +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/copilot-instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/instructions/domain.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/instructions/entrypoints.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/instructions/tests.instructions.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/address-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/analyze.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/ava.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/bug-assess.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/bug-fix.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/change.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/check-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/checklist.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/clarify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/create-context.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/implement.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/jira-push.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/kai.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/leo.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/maya.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/morgan.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/orchestrate.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/plan-adr.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/plan-arch.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/plan-design.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/plan-hld.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/plan-lld.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/pre-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/quinn.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/release.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/rex.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/riley.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/specify.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/submit-review.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/task.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/prompts/taskstoissues.prompt.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.github/workflows/quality-gate.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.gitignore +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.gitlab-ci.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/contexts/CONTEXT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/integrations.yml.example +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/memory/change-rules.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/memory/constitution.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/memory/roles.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/memory/summary-rules.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/memory/token-pricing.yml.example +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/adr-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/analyze-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/api-spec-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/arch-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/brd-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/changeset-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/checklist-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/clarify-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/constitution-amendment-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/context-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/data-model-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/design-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/docker-config-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/feature-story-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/hld-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/investigation-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/jira-export-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/k8s-manifest-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/lld-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/openapi-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/plan-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/qa-testcases-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/release-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/resilience-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/runbook-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/security-design-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/srd-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/tasks-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/token-usage-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/use-cases-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.specify/templates/validate-template.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.vscode/extensions.json +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/.windsurfrules +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/CHANGE-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/CLAUDE.local.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/FLOW-ROLES-GATES.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/HOW-TO-USE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/IMPROVEMENT-BACKLOG.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/PROMPT-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/QUICKSTART.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/README.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/SDLC-COMPLETE-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/WHY-SDD.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/azure-pipelines.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/bitbucket-pipelines.yml +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/docs/SUMMARY-GUIDE.md +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/setup.ps1 +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/packs/sdd-universal/setup.sh +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/__init__.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/atlassian_auth.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/cf_to_md.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/confluence_client.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/dashboard_comments.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/detect.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/git_host.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/integrations.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/jira_client.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/manifest.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/md_to_cf.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/mermaid_render.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/scaffold.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/sdd_parser.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/status.py +0 -0
- {sddflow-2.7.52 → sddflow-2.7.54}/sdd/utils/validate.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sddflow
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.54
|
|
4
4
|
Summary: SDD Framework CLI — initialize and upgrade Spec-Driven Development packs
|
|
5
5
|
Project-URL: Homepage, https://github.com/sunil1983us/universalguide
|
|
6
6
|
Project-URL: Repository, https://github.com/sunil1983us/universalguide
|
|
@@ -413,6 +413,44 @@ sdd review check --doc brd # poll again after reviewer re-reviews
|
|
|
413
413
|
|
|
414
414
|
---
|
|
415
415
|
|
|
416
|
+
### `sdd review push-questions` / `sdd review pull-answers`
|
|
417
|
+
|
|
418
|
+
A document can be blocked before it's ever submitted for review — e.g.
|
|
419
|
+
`validate.md`'s §3a scans `brd.md`/`use-cases.md`/`srd.md` for unresolved
|
|
420
|
+
`[NEEDS CLARIFICATION-NNN: {question}]` markers (numbered locally per
|
|
421
|
+
document, the same discipline `[ASSUMPTION-NNN]` already uses) and refuses
|
|
422
|
+
to proceed while any remain. These two commands let a reviewer answer
|
|
423
|
+
those markers via Jira/Confluence instead of only through direct chat/doc
|
|
424
|
+
edits:
|
|
425
|
+
|
|
426
|
+
```bash
|
|
427
|
+
sdd review push-questions --doc validate # push open questions to Jira + Confluence
|
|
428
|
+
# reviewer replies as a comment, one line per item:
|
|
429
|
+
# brd:NC-002: 90 days, per data retention policy DR-014
|
|
430
|
+
sdd review pull-answers --doc validate # pull replies, patch the answered markers
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
`push-questions` reads the blocked document's `| ID | Locations | Question |`
|
|
434
|
+
table (see the doc's own gate for the exact format) and creates/updates
|
|
435
|
+
**one** Jira ticket — reusing `document_reviews.validate`'s
|
|
436
|
+
`reviewer_jira_user`/`reviewer_role`, no separate config needed. It uses
|
|
437
|
+
the *same* idempotency label `sdd review submit` looks for, so once every
|
|
438
|
+
question is answered and the document unblocks, `sdd review submit --doc
|
|
439
|
+
validate` finds and evolves this same ticket in place (a comment marks the
|
|
440
|
+
transition) instead of creating a second one.
|
|
441
|
+
|
|
442
|
+
`pull-answers` fetches every comment on that ticket, matches lines like
|
|
443
|
+
`brd:NC-002: <answer>` against the open items, and replaces each answered
|
|
444
|
+
`[NEEDS CLARIFICATION-NNN]` marker directly in its source document —
|
|
445
|
+
bumping that document's `Version:` header and appending a `## Version
|
|
446
|
+
History` row. A question asked in more than one document (the table's
|
|
447
|
+
`Locations` column lists more than one ID, e.g. `brd:NC-003, srd:NC-001`)
|
|
448
|
+
gets the same answer applied everywhere at once. Safe to call
|
|
449
|
+
unconditionally (e.g. at the top of every `/validate` run) — it exits
|
|
450
|
+
quietly whenever there's nothing to do.
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
416
454
|
### `sdd review comments`
|
|
417
455
|
|
|
418
456
|
Read or acknowledge dashboard-left comments directly, without going through
|
|
@@ -378,6 +378,44 @@ sdd review check --doc brd # poll again after reviewer re-reviews
|
|
|
378
378
|
|
|
379
379
|
---
|
|
380
380
|
|
|
381
|
+
### `sdd review push-questions` / `sdd review pull-answers`
|
|
382
|
+
|
|
383
|
+
A document can be blocked before it's ever submitted for review — e.g.
|
|
384
|
+
`validate.md`'s §3a scans `brd.md`/`use-cases.md`/`srd.md` for unresolved
|
|
385
|
+
`[NEEDS CLARIFICATION-NNN: {question}]` markers (numbered locally per
|
|
386
|
+
document, the same discipline `[ASSUMPTION-NNN]` already uses) and refuses
|
|
387
|
+
to proceed while any remain. These two commands let a reviewer answer
|
|
388
|
+
those markers via Jira/Confluence instead of only through direct chat/doc
|
|
389
|
+
edits:
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
sdd review push-questions --doc validate # push open questions to Jira + Confluence
|
|
393
|
+
# reviewer replies as a comment, one line per item:
|
|
394
|
+
# brd:NC-002: 90 days, per data retention policy DR-014
|
|
395
|
+
sdd review pull-answers --doc validate # pull replies, patch the answered markers
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
`push-questions` reads the blocked document's `| ID | Locations | Question |`
|
|
399
|
+
table (see the doc's own gate for the exact format) and creates/updates
|
|
400
|
+
**one** Jira ticket — reusing `document_reviews.validate`'s
|
|
401
|
+
`reviewer_jira_user`/`reviewer_role`, no separate config needed. It uses
|
|
402
|
+
the *same* idempotency label `sdd review submit` looks for, so once every
|
|
403
|
+
question is answered and the document unblocks, `sdd review submit --doc
|
|
404
|
+
validate` finds and evolves this same ticket in place (a comment marks the
|
|
405
|
+
transition) instead of creating a second one.
|
|
406
|
+
|
|
407
|
+
`pull-answers` fetches every comment on that ticket, matches lines like
|
|
408
|
+
`brd:NC-002: <answer>` against the open items, and replaces each answered
|
|
409
|
+
`[NEEDS CLARIFICATION-NNN]` marker directly in its source document —
|
|
410
|
+
bumping that document's `Version:` header and appending a `## Version
|
|
411
|
+
History` row. A question asked in more than one document (the table's
|
|
412
|
+
`Locations` column lists more than one ID, e.g. `brd:NC-003, srd:NC-001`)
|
|
413
|
+
gets the same answer applied everywhere at once. Safe to call
|
|
414
|
+
unconditionally (e.g. at the top of every `/validate` run) — it exits
|
|
415
|
+
quietly whenever there's nothing to do.
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
381
419
|
### `sdd review comments`
|
|
382
420
|
|
|
383
421
|
Read or acknowledge dashboard-left comments directly, without going through
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.7.54"
|
|
@@ -161,21 +161,43 @@ def _push_doc_page(doc: str, md_path: Path, feature_name: str) -> str | None:
|
|
|
161
161
|
|
|
162
162
|
# ── Text extraction ────────────────────────────────────────────────────────────
|
|
163
163
|
|
|
164
|
+
_ADF_BLOCK_TYPES = {"paragraph", "heading", "codeBlock", "blockquote", "listItem"}
|
|
165
|
+
|
|
166
|
+
|
|
164
167
|
def _extract_text(body) -> str:
|
|
165
|
-
"""Extract plain text from Jira ADF (Cloud) or string (Server/DC) comment
|
|
168
|
+
"""Extract plain text from Jira ADF (Cloud) or string (Server/DC) comment
|
|
169
|
+
body, preserving line boundaries between block-level nodes as newlines.
|
|
170
|
+
|
|
171
|
+
Jira's rich-text comment editor stores each line a user types as a
|
|
172
|
+
SEPARATE paragraph node in the ADF tree, not one paragraph with embedded
|
|
173
|
+
newlines -- joining every text run in the whole document with a single
|
|
174
|
+
space (the previous behavior) collapsed a multi-line reply like
|
|
175
|
+
pull-answers' "{doc}:NC-{NNN}: {answer}" format (one item per line) into
|
|
176
|
+
one run-on line, breaking _ANSWER_LINE_RE's per-line matching entirely."""
|
|
166
177
|
if isinstance(body, str):
|
|
167
178
|
return body
|
|
168
179
|
if isinstance(body, dict):
|
|
169
|
-
|
|
180
|
+
lines: list[str] = []
|
|
170
181
|
|
|
171
|
-
def
|
|
182
|
+
def walk_inline(node: dict, buf: list[str]) -> None:
|
|
172
183
|
if node.get("type") == "text":
|
|
173
|
-
|
|
184
|
+
buf.append(node.get("text", ""))
|
|
185
|
+
elif node.get("type") == "hardBreak":
|
|
186
|
+
buf.append("\n")
|
|
174
187
|
for child in node.get("content", []):
|
|
175
|
-
|
|
188
|
+
walk_inline(child, buf)
|
|
176
189
|
|
|
177
|
-
|
|
178
|
-
|
|
190
|
+
def walk_block(node: dict) -> None:
|
|
191
|
+
if node.get("type") in _ADF_BLOCK_TYPES:
|
|
192
|
+
buf: list[str] = []
|
|
193
|
+
walk_inline(node, buf)
|
|
194
|
+
lines.append("".join(buf))
|
|
195
|
+
else:
|
|
196
|
+
for child in node.get("content", []):
|
|
197
|
+
walk_block(child)
|
|
198
|
+
|
|
199
|
+
walk_block(body)
|
|
200
|
+
return "\n".join(lines)
|
|
179
201
|
return ""
|
|
180
202
|
|
|
181
203
|
|
|
@@ -298,6 +320,100 @@ def _record_review_link(doc: str, issue_key: str) -> None:
|
|
|
298
320
|
_save_review_links(links)
|
|
299
321
|
|
|
300
322
|
|
|
323
|
+
# ── Open-questions push/pull (blocked-doc Jira Q&A) ────────────────────────────
|
|
324
|
+
# When a document like validate.md is blocked on [NEEDS CLARIFICATION-NNN]
|
|
325
|
+
# markers in its source docs, `sdd review push-questions` lets a reviewer
|
|
326
|
+
# answer them via Jira/Confluence comments instead of waiting for direct
|
|
327
|
+
# chat/doc edits -- `sdd review pull-answers` reads those comments back and
|
|
328
|
+
# patches the answered markers directly into brd.md/use-cases.md/srd.md.
|
|
329
|
+
|
|
330
|
+
_OPEN_QUESTION_ROW_RE = re.compile(
|
|
331
|
+
r'^\|\s*([a-zA-Z0-9_.-]+:NC-\d+)\s*\|\s*([^|]+?)\s*\|\s*([^|]+?)\s*\|\s*$',
|
|
332
|
+
re.MULTILINE,
|
|
333
|
+
)
|
|
334
|
+
_ANSWER_LINE_RE = re.compile(
|
|
335
|
+
r'^\s*([a-zA-Z0-9_.-]+):NC-(\d+)\s*:\s*(.+?)\s*$',
|
|
336
|
+
re.MULTILINE | re.IGNORECASE,
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def _parse_open_questions(doc_text: str) -> list[dict]:
|
|
341
|
+
"""Parse a blocked document's `| ID | Locations | Question |` table
|
|
342
|
+
(see validate.prompt.md's §3a-BLOCKING format) into structured items.
|
|
343
|
+
Tolerant of table-formatting drift across LLM runs -- anchors on the
|
|
344
|
+
`{doc}:NC-{NNN}` ID pattern itself, not exact column headers.
|
|
345
|
+
|
|
346
|
+
Each item's "locations" is every doc-qualified ID (e.g. "brd:NC-003")
|
|
347
|
+
that a single answer should be applied to -- almost always just its
|
|
348
|
+
own ID, but more than one when the same question was asked in more
|
|
349
|
+
than one document."""
|
|
350
|
+
items: list[dict] = []
|
|
351
|
+
for m in _OPEN_QUESTION_ROW_RE.finditer(doc_text):
|
|
352
|
+
primary_id, locations_raw, question = m.group(1).strip(), m.group(2).strip(), m.group(3).strip()
|
|
353
|
+
locations = [loc.strip() for loc in locations_raw.split(",") if loc.strip()]
|
|
354
|
+
if primary_id not in locations:
|
|
355
|
+
locations.append(primary_id)
|
|
356
|
+
items.append({"id": primary_id, "locations": locations, "question": question})
|
|
357
|
+
return items
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def _parse_answers(comments: list[dict]) -> dict[str, str]:
|
|
361
|
+
"""Parse every Jira comment for lines like 'brd:NC-002: <answer>'.
|
|
362
|
+
A later comment's answer for the same ID overrides an earlier one
|
|
363
|
+
(a reviewer correcting themselves)."""
|
|
364
|
+
answers: dict[str, str] = {}
|
|
365
|
+
for c in comments:
|
|
366
|
+
text = _extract_text(c.get("body", ""))
|
|
367
|
+
for m in _ANSWER_LINE_RE.finditer(text):
|
|
368
|
+
doc_key, nnn, answer = m.group(1).lower(), m.group(2), m.group(3)
|
|
369
|
+
answers[f"{doc_key}:NC-{nnn}"] = answer
|
|
370
|
+
return answers
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def _bump_version_and_log(text: str, note: str) -> str:
|
|
374
|
+
"""Bump the `Version: X.Y` header to X.(Y+1) and append a row to
|
|
375
|
+
`## Version History`, matching the same discipline every review-driven
|
|
376
|
+
edit in this codebase uses (see specify-brd.prompt.md's Revision
|
|
377
|
+
Logging). Best-effort: if either the Version header or a recognizable
|
|
378
|
+
`## Version History` table isn't found, the text is returned unchanged
|
|
379
|
+
rather than raising -- the marker replacement itself is what matters;
|
|
380
|
+
this bookkeeping is a bonus that shouldn't block on template drift."""
|
|
381
|
+
version_match = re.search(r'Version:\s*(\d+)\.(\d+)', text)
|
|
382
|
+
if not version_match:
|
|
383
|
+
return text
|
|
384
|
+
major, minor = version_match.group(1), int(version_match.group(2)) + 1
|
|
385
|
+
new_version = f"{major}.{minor}"
|
|
386
|
+
text = text[:version_match.start()] + f"Version: {new_version}" + text[version_match.end():]
|
|
387
|
+
|
|
388
|
+
heading = re.search(r'^## Version History\s*$', text, flags=re.IGNORECASE | re.MULTILINE)
|
|
389
|
+
if not heading:
|
|
390
|
+
return text
|
|
391
|
+
after = text[heading.end():]
|
|
392
|
+
sep_match = re.search(r'\n\|[-| ]+\|\s*\n', after)
|
|
393
|
+
if not sep_match:
|
|
394
|
+
return text
|
|
395
|
+
insert_at = heading.end() + sep_match.end()
|
|
396
|
+
row = f"| {new_version} | {date.today()} | Jira/Confluence | {note} | — |\n"
|
|
397
|
+
return text[:insert_at] + row + text[insert_at:]
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def _patch_marker(md_path: Path, nnn: str, answer: str) -> bool:
|
|
401
|
+
"""Replace `[NEEDS CLARIFICATION-{nnn}: ...]` with the answer text in
|
|
402
|
+
md_path, bumping its version + Version History. Returns True if a
|
|
403
|
+
matching marker was found and patched, False otherwise (already
|
|
404
|
+
resolved, or nnn doesn't exist in this file)."""
|
|
405
|
+
if not md_path.exists():
|
|
406
|
+
return False
|
|
407
|
+
text = md_path.read_text()
|
|
408
|
+
pattern = re.compile(r'\[NEEDS CLARIFICATION-' + re.escape(nnn) + r':\s*[^\]]*\]')
|
|
409
|
+
if not pattern.search(text):
|
|
410
|
+
return False
|
|
411
|
+
new_text = pattern.sub(lambda _m: answer, text, count=1)
|
|
412
|
+
new_text = _bump_version_and_log(new_text, f"NC-{nnn} resolved via Jira/Confluence comment")
|
|
413
|
+
md_path.write_text(new_text)
|
|
414
|
+
return True
|
|
415
|
+
|
|
416
|
+
|
|
301
417
|
def _ensure_epic(jira_client: JiraClient, jira_cfg, feature_name: str) -> str | None:
|
|
302
418
|
"""Create the Feature/Epic container if it doesn't already exist yet,
|
|
303
419
|
using the same content and idempotency label `sdd jira push` uses — so a
|
|
@@ -486,9 +602,27 @@ def review_submit(doc, profile, feature):
|
|
|
486
602
|
_apply_team_field(fields, cfg.jira, "review")
|
|
487
603
|
|
|
488
604
|
if existing:
|
|
605
|
+
# If this ticket started life as an `sdd review push-questions`
|
|
606
|
+
# "open questions" ticket (same idempotency label -- see that
|
|
607
|
+
# command), the fields update above already retitles/redescribes
|
|
608
|
+
# it into a normal review request. Post a comment marking the
|
|
609
|
+
# transition explicitly so the reviewer's ticket history shows
|
|
610
|
+
# why the ticket suddenly changed shape, rather than reusing it
|
|
611
|
+
# silently -- the "same ticket evolves in place" behavior a user
|
|
612
|
+
# asked for, without ever creating a second ticket for one doc.
|
|
613
|
+
was_open_questions = "sdd-open-questions" in (existing.get("fields", {}).get("labels") or [])
|
|
489
614
|
jira_client.update_issue(existing["key"], fields)
|
|
490
615
|
story_key = existing["key"]
|
|
491
616
|
console.print(f" [dim]·[/dim] Jira review story updated: [cyan]{story_key}[/cyan]")
|
|
617
|
+
if was_open_questions:
|
|
618
|
+
try:
|
|
619
|
+
jira_client.add_comment(
|
|
620
|
+
story_key,
|
|
621
|
+
f"All open questions resolved — {doc.upper()} has been updated "
|
|
622
|
+
f"and is now ready for full review.",
|
|
623
|
+
)
|
|
624
|
+
except Exception:
|
|
625
|
+
pass # best-effort notification only; the ticket update above already succeeded
|
|
492
626
|
else:
|
|
493
627
|
result = jira_client.create_issue(fields)
|
|
494
628
|
story_key = result["key"]
|
|
@@ -511,6 +645,241 @@ def review_submit(doc, profile, feature):
|
|
|
511
645
|
console.print()
|
|
512
646
|
|
|
513
647
|
|
|
648
|
+
# ── sdd review push-questions ───────────────────────────────────────────────────
|
|
649
|
+
|
|
650
|
+
@review_command.command("push-questions")
|
|
651
|
+
@click.option("--doc", required=True,
|
|
652
|
+
help="Document key whose blocking gate produced open questions, e.g. validate")
|
|
653
|
+
@click.option("--profile", default=None)
|
|
654
|
+
@click.option("--feature", default=None)
|
|
655
|
+
def review_push_questions(doc, profile, feature):
|
|
656
|
+
"""Push a blocked document's open [NEEDS CLARIFICATION-NNN] questions to
|
|
657
|
+
Jira + Confluence, so a reviewer can answer them without waiting for
|
|
658
|
+
the doc's own gate to clear first. Uses the same idempotency label
|
|
659
|
+
`sdd review submit` looks for -- once every question is answered and
|
|
660
|
+
the doc unblocks, `sdd review submit --doc {doc}` finds and evolves
|
|
661
|
+
this same ticket in place instead of creating a second one."""
|
|
662
|
+
console.print()
|
|
663
|
+
console.print("[bold]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/bold]")
|
|
664
|
+
console.print(f" [bold cyan]Push Open Questions[/bold cyan] — {doc.upper()}")
|
|
665
|
+
console.print("[bold]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[/bold]")
|
|
666
|
+
console.print()
|
|
667
|
+
|
|
668
|
+
try:
|
|
669
|
+
cfg = load_integrations()
|
|
670
|
+
except FileNotFoundError as e:
|
|
671
|
+
console.print(f" [red]✗ {e}[/red]")
|
|
672
|
+
raise SystemExit(1)
|
|
673
|
+
|
|
674
|
+
if doc not in cfg.document_reviews:
|
|
675
|
+
console.print(
|
|
676
|
+
f" [red]✗ '{doc}' not in document_reviews in integrations.yml[/red]\n"
|
|
677
|
+
f" Available: {', '.join(cfg.document_reviews)}"
|
|
678
|
+
)
|
|
679
|
+
raise SystemExit(1)
|
|
680
|
+
if not cfg.jira:
|
|
681
|
+
console.print(" [red]✗ jira: section required in integrations.yml[/red]")
|
|
682
|
+
raise SystemExit(1)
|
|
683
|
+
|
|
684
|
+
manifest = read_manifest() or {}
|
|
685
|
+
proj = manifest.get("project") or {}
|
|
686
|
+
project_name = proj.get("name", "Project")
|
|
687
|
+
feature_name = feature or proj.get("feature", "")
|
|
688
|
+
|
|
689
|
+
try:
|
|
690
|
+
md_path = resolve_doc_path(doc, feature_name)
|
|
691
|
+
except ValueError as e:
|
|
692
|
+
console.print(f" [red]✗ {e}[/red]")
|
|
693
|
+
raise SystemExit(1)
|
|
694
|
+
if not md_path.exists():
|
|
695
|
+
console.print(f" [red]✗ {md_path} not found[/red]")
|
|
696
|
+
raise SystemExit(1)
|
|
697
|
+
|
|
698
|
+
items = _parse_open_questions(md_path.read_text())
|
|
699
|
+
if not items:
|
|
700
|
+
console.print(
|
|
701
|
+
f" [dim]No open [NEEDS CLARIFICATION-NNN] items found in {md_path.name} — nothing to push.[/dim]"
|
|
702
|
+
)
|
|
703
|
+
raise SystemExit(0)
|
|
704
|
+
|
|
705
|
+
try:
|
|
706
|
+
prof = load_profile(profile or cfg.profile)
|
|
707
|
+
session = build_session(prof)
|
|
708
|
+
except Exception as e:
|
|
709
|
+
console.print(f" [red]✗ Auth error: {e}[/red]")
|
|
710
|
+
raise SystemExit(1)
|
|
711
|
+
|
|
712
|
+
jira_client = JiraClient(session, prof.base_url)
|
|
713
|
+
doc_cfg = cfg.document_reviews[doc]
|
|
714
|
+
|
|
715
|
+
# ── Also push the (blocked) doc to Confluence, so reviewers can comment there too ──
|
|
716
|
+
page_title = None
|
|
717
|
+
if cfg.confluence:
|
|
718
|
+
try:
|
|
719
|
+
page_title = _push_doc_page(doc, md_path, feature_name)
|
|
720
|
+
except Exception as e:
|
|
721
|
+
console.print(f" [yellow]! Confluence push failed: {e}[/yellow]")
|
|
722
|
+
|
|
723
|
+
# ── Ensure a Feature/Epic exists (same as review_submit) ──────────────────
|
|
724
|
+
epic_key = _ensure_epic(jira_client, cfg.jira, feature_name)
|
|
725
|
+
|
|
726
|
+
# ── Create / update the SAME ticket review_submit will later find ─────────
|
|
727
|
+
# Same idempotency_label as review_submit uses for --doc {doc} -- this
|
|
728
|
+
# is what makes the ticket "evolve in place" later, with zero extra
|
|
729
|
+
# bookkeeping: review_submit's own find-by-label lookup will discover
|
|
730
|
+
# this ticket and update its fields, rather than creating a second one.
|
|
731
|
+
idempotency_label = f"sdd-doc:{feature_name}:{doc}"
|
|
732
|
+
review_project_key = cfg.jira.key_for("review")
|
|
733
|
+
existing = jira_client.find_by_label(review_project_key, idempotency_label)
|
|
734
|
+
|
|
735
|
+
table_lines = "\n".join(f"{it['id']}: {it['question']}" for it in items)
|
|
736
|
+
desc_text = (
|
|
737
|
+
f"{doc.upper()} is blocked on {len(items)} open question(s) before it can "
|
|
738
|
+
f"go to full review.\n\n"
|
|
739
|
+
f"Answer each item as a comment on THIS ticket, one line per item, "
|
|
740
|
+
f"starting with its ID:\n\n{table_lines}\n\n"
|
|
741
|
+
f"Example: \"{items[0]['id']}: <your answer>\"\n\n"
|
|
742
|
+
f"Once every item is answered, re-run /validate — it pulls the answers "
|
|
743
|
+
f"automatically, updates the spec, and re-checks."
|
|
744
|
+
)
|
|
745
|
+
fields: dict = {
|
|
746
|
+
"project": {"key": review_project_key},
|
|
747
|
+
"issuetype": {"name": cfg.jira.issue_hierarchy.get("story", "Story")},
|
|
748
|
+
"summary": f"Open Questions: {project_name} — {doc.upper()}",
|
|
749
|
+
"labels": cfg.jira.labels + ["sdd-review", "sdd-open-questions", idempotency_label],
|
|
750
|
+
"description": {
|
|
751
|
+
"type": "doc", "version": 1,
|
|
752
|
+
"content": [{"type": "paragraph", "content": [
|
|
753
|
+
{"type": "text", "text": desc_text}
|
|
754
|
+
]}],
|
|
755
|
+
},
|
|
756
|
+
}
|
|
757
|
+
if doc_cfg.reviewer_jira_user:
|
|
758
|
+
fields["assignee"] = {"accountId": doc_cfg.reviewer_jira_user}
|
|
759
|
+
from sdd.commands.jira import _apply_team_field
|
|
760
|
+
_apply_team_field(fields, cfg.jira, "review")
|
|
761
|
+
|
|
762
|
+
if existing:
|
|
763
|
+
jira_client.update_issue(existing["key"], fields)
|
|
764
|
+
issue_key = existing["key"]
|
|
765
|
+
console.print(f" [dim]·[/dim] Jira ticket updated: [cyan]{issue_key}[/cyan]")
|
|
766
|
+
else:
|
|
767
|
+
result = jira_client.create_issue(fields)
|
|
768
|
+
issue_key = result["key"]
|
|
769
|
+
console.print(f" [green]✓[/green] Jira ticket created: [cyan]{issue_key}[/cyan]")
|
|
770
|
+
|
|
771
|
+
_record_review_link(doc, issue_key)
|
|
772
|
+
if epic_key:
|
|
773
|
+
_link_review_story_to_epic(jira_client, issue_key, epic_key, cfg.jira)
|
|
774
|
+
|
|
775
|
+
issue_url = f"{prof.base_url}/browse/{issue_key}"
|
|
776
|
+
console.print(f" {issue_url}")
|
|
777
|
+
if page_title:
|
|
778
|
+
console.print(f" Also on Confluence: [cyan]{page_title}[/cyan]")
|
|
779
|
+
console.print(
|
|
780
|
+
f" Assigned to: [cyan]{doc_cfg.reviewer_role}[/cyan]"
|
|
781
|
+
f" [dim]({doc_cfg.reviewer_jira_user})[/dim]"
|
|
782
|
+
)
|
|
783
|
+
console.print()
|
|
784
|
+
console.print(f" [bold]{len(items)} open question(s)[/bold] pushed. Reviewer replies as a comment")
|
|
785
|
+
console.print(f" starting with the item's ID, e.g. \"{items[0]['id']}: <answer>\".")
|
|
786
|
+
console.print(f" Run [cyan]sdd review pull-answers --doc {doc}[/cyan] (or just re-run /validate) once answered.")
|
|
787
|
+
console.print()
|
|
788
|
+
|
|
789
|
+
|
|
790
|
+
# ── sdd review pull-answers ──────────────────────────────────────────────────────
|
|
791
|
+
|
|
792
|
+
@review_command.command("pull-answers")
|
|
793
|
+
@click.option("--doc", required=True)
|
|
794
|
+
@click.option("--profile", default=None)
|
|
795
|
+
@click.option("--feature", default=None)
|
|
796
|
+
def review_pull_answers(doc, profile, feature):
|
|
797
|
+
"""Pull Jira comments answering a blocked document's open
|
|
798
|
+
[NEEDS CLARIFICATION-NNN] questions and patch them directly into the
|
|
799
|
+
source docs (e.g. brd.md/use-cases.md/srd.md for --doc validate).
|
|
800
|
+
Safe to call unconditionally before re-scanning -- exits 0 quietly
|
|
801
|
+
whenever there's nothing to do (not configured, no ticket yet, no new
|
|
802
|
+
answers)."""
|
|
803
|
+
console.print()
|
|
804
|
+
|
|
805
|
+
try:
|
|
806
|
+
cfg = load_integrations()
|
|
807
|
+
except FileNotFoundError:
|
|
808
|
+
raise SystemExit(0)
|
|
809
|
+
|
|
810
|
+
if doc not in cfg.document_reviews or not cfg.jira:
|
|
811
|
+
raise SystemExit(0)
|
|
812
|
+
|
|
813
|
+
manifest = read_manifest() or {}
|
|
814
|
+
proj = manifest.get("project") or {}
|
|
815
|
+
feature_name = feature or proj.get("feature", "")
|
|
816
|
+
|
|
817
|
+
try:
|
|
818
|
+
md_path = resolve_doc_path(doc, feature_name)
|
|
819
|
+
except ValueError:
|
|
820
|
+
raise SystemExit(0)
|
|
821
|
+
if not md_path.exists():
|
|
822
|
+
raise SystemExit(0)
|
|
823
|
+
|
|
824
|
+
items = _parse_open_questions(md_path.read_text())
|
|
825
|
+
if not items:
|
|
826
|
+
raise SystemExit(0)
|
|
827
|
+
|
|
828
|
+
links = _load_review_links()
|
|
829
|
+
issue_key = (links.get(doc) or {}).get("key")
|
|
830
|
+
if not issue_key:
|
|
831
|
+
console.print(
|
|
832
|
+
f" [dim]· No Jira ticket recorded for {doc} yet — "
|
|
833
|
+
f"run `sdd review push-questions --doc {doc}` first.[/dim]"
|
|
834
|
+
)
|
|
835
|
+
raise SystemExit(0)
|
|
836
|
+
|
|
837
|
+
try:
|
|
838
|
+
prof = load_profile(profile or cfg.profile)
|
|
839
|
+
session = build_session(prof)
|
|
840
|
+
except Exception:
|
|
841
|
+
raise SystemExit(0)
|
|
842
|
+
|
|
843
|
+
jira_client = JiraClient(session, prof.base_url)
|
|
844
|
+
try:
|
|
845
|
+
comments = jira_client.get_comments(issue_key)
|
|
846
|
+
except Exception as e:
|
|
847
|
+
console.print(f" [yellow]! Could not fetch comments from {issue_key}: {e}[/yellow]")
|
|
848
|
+
raise SystemExit(0)
|
|
849
|
+
|
|
850
|
+
answers = _parse_answers(comments)
|
|
851
|
+
if not answers:
|
|
852
|
+
raise SystemExit(0)
|
|
853
|
+
|
|
854
|
+
patched_docs: dict[str, int] = {}
|
|
855
|
+
for item in items:
|
|
856
|
+
# The reviewer only ever cites the row's primary ID (item["id"]) --
|
|
857
|
+
# that single answer must propagate to every location listed for
|
|
858
|
+
# this question, not just the one the reviewer happened to name
|
|
859
|
+
# (a multi-location row exists specifically so one answer can
|
|
860
|
+
# resolve a question duplicated across several docs at once).
|
|
861
|
+
if item["id"] not in answers:
|
|
862
|
+
continue
|
|
863
|
+
answer_text = answers[item["id"]]
|
|
864
|
+
for loc_id in item["locations"]:
|
|
865
|
+
doc_key, nnn = loc_id.split(":NC-")
|
|
866
|
+
try:
|
|
867
|
+
loc_path = resolve_doc_path(doc_key, feature_name)
|
|
868
|
+
except ValueError:
|
|
869
|
+
continue
|
|
870
|
+
if _patch_marker(loc_path, nnn, answer_text):
|
|
871
|
+
patched_docs[doc_key] = patched_docs.get(doc_key, 0) + 1
|
|
872
|
+
console.print(f" [green]✓[/green] {loc_id} resolved in {loc_path.name}")
|
|
873
|
+
|
|
874
|
+
if patched_docs:
|
|
875
|
+
total = sum(patched_docs.values())
|
|
876
|
+
console.print(
|
|
877
|
+
f" [bold]{total} item(s) resolved[/bold] across "
|
|
878
|
+
f"{len(patched_docs)} document(s): {', '.join(patched_docs)}"
|
|
879
|
+
)
|
|
880
|
+
console.print()
|
|
881
|
+
|
|
882
|
+
|
|
514
883
|
# ── sdd review check ───────────────────────────────────────────────────────────
|
|
515
884
|
|
|
516
885
|
@review_command.command("check")
|
|
@@ -2064,6 +2064,97 @@ MIGRATIONS = [
|
|
|
2064
2064
|
],
|
|
2065
2065
|
"migrate": lambda m: {**m, "sdd_version": "2.7.52"},
|
|
2066
2066
|
},
|
|
2067
|
+
{
|
|
2068
|
+
"from": "2.7.52",
|
|
2069
|
+
"to": "2.7.53",
|
|
2070
|
+
"description": "Feature: blocked documents (e.g. validate.md, on unresolved [NEEDS CLARIFICATION-NNN] markers) can now collect reviewer answers via Jira/Confluence instead of only direct chat/doc edits -- no manifest schema changes",
|
|
2071
|
+
"notes": [
|
|
2072
|
+
"User-requested: a document like validate.md can be blocked "
|
|
2073
|
+
"before it's ever submitted for formal review (brd.md/"
|
|
2074
|
+
"use-cases.md/srd.md still have unresolved [NEEDS "
|
|
2075
|
+
"CLARIFICATION] markers) -- previously there was no way to "
|
|
2076
|
+
"route those specific open questions through Jira/Confluence "
|
|
2077
|
+
"the way an already-submitted document's reviewer comments "
|
|
2078
|
+
"already could",
|
|
2079
|
+
"[NEEDS CLARIFICATION] markers are now numbered locally per "
|
|
2080
|
+
"document -- [NEEDS CLARIFICATION-NNN: {question}] -- "
|
|
2081
|
+
"matching the [ASSUMPTION-NNN] convention already in use. "
|
|
2082
|
+
"This gives every marker a stable, doc-qualified ID "
|
|
2083
|
+
"({doc}:NC-{NNN}, e.g. brd:NC-002) that a reviewer's answer "
|
|
2084
|
+
"can cite exactly, instead of matching by paraphrased "
|
|
2085
|
+
"question text",
|
|
2086
|
+
"New sdd review push-questions --doc {doc}: parses a blocked "
|
|
2087
|
+
"document's | ID | Locations | Question | table (see "
|
|
2088
|
+
"validate.prompt.md's §3a-BLOCKING) and creates/updates one "
|
|
2089
|
+
"Jira ticket + Confluence page. Uses the SAME idempotency "
|
|
2090
|
+
"label sdd review submit looks for, so once every question "
|
|
2091
|
+
"is answered and the document unblocks, sdd review submit "
|
|
2092
|
+
"finds and evolves this same ticket in place (posting a "
|
|
2093
|
+
"transition comment) instead of creating a second one",
|
|
2094
|
+
"New sdd review pull-answers --doc {doc}: fetches comments "
|
|
2095
|
+
"from that ticket, matches lines like 'brd:NC-002: <answer>' "
|
|
2096
|
+
"against the open items, and patches each answered "
|
|
2097
|
+
"[NEEDS CLARIFICATION-NNN] marker directly into its source "
|
|
2098
|
+
"document -- bumping that document's Version header and "
|
|
2099
|
+
"appending a Version History row. A question asked in more "
|
|
2100
|
+
"than one document (a Locations column listing more than one "
|
|
2101
|
+
"ID) gets the same answer applied to every one of them from "
|
|
2102
|
+
"a single reviewer reply",
|
|
2103
|
+
"validate.prompt.md (all 5 packs, not a shared file) updated: "
|
|
2104
|
+
"§3a-BLOCKING now calls pull-answers before re-scanning and "
|
|
2105
|
+
"push-questions after detecting a block, and its table cites "
|
|
2106
|
+
"doc-qualified marker IDs instead of an ad-hoc Q1..Q7 scheme",
|
|
2107
|
+
"specify-brd/specify-uc/specify-srd/specify-doc.prompt.md "
|
|
2108
|
+
"(shared) and the submit-for-review-step block updated for "
|
|
2109
|
+
"the new marker numbering and ID-based comment matching",
|
|
2110
|
+
"23 new tests in test_review_helpers.py: table/answer "
|
|
2111
|
+
"parsing, marker patching (version bump + Version History, "
|
|
2112
|
+
"multi-location propagation, legacy/missing-marker "
|
|
2113
|
+
"tolerance), and the push-questions -> submit same-ticket "
|
|
2114
|
+
"transition end-to-end",
|
|
2115
|
+
"This migration only bumps sdd_version -- no manifest.yml "
|
|
2116
|
+
"field changes for any pack",
|
|
2117
|
+
],
|
|
2118
|
+
"migrate": lambda m: {**m, "sdd_version": "2.7.53"},
|
|
2119
|
+
},
|
|
2120
|
+
{
|
|
2121
|
+
"from": "2.7.53",
|
|
2122
|
+
"to": "2.7.54",
|
|
2123
|
+
"description": "Fix: multi-line sdd review pull-answers replies (one 'brd:NC-NNN: answer' per line, e.g. a real 7-item Jira comment) were silently collapsed into a single garbled line, so only the first item ever got parsed -- no manifest schema changes",
|
|
2124
|
+
"notes": [
|
|
2125
|
+
"User-reported: a reviewer answered all 7 open questions on a "
|
|
2126
|
+
"push-questions ticket, one per line as instructed, but "
|
|
2127
|
+
"pull-answers reported 'no new replies' every time",
|
|
2128
|
+
"Root cause: _extract_text() joined every text run in the "
|
|
2129
|
+
"whole ADF comment body with a single space, with no regard "
|
|
2130
|
+
"for paragraph boundaries. Jira's rich-text comment editor "
|
|
2131
|
+
"stores each line a user types as a SEPARATE paragraph node "
|
|
2132
|
+
"in the ADF tree, not one paragraph with embedded newlines -- "
|
|
2133
|
+
"so a real multi-line reply collapsed into one run-on line, "
|
|
2134
|
+
"and _ANSWER_LINE_RE's per-line ^...$ matching (anchored on "
|
|
2135
|
+
"actual \\n characters) then only ever found the first item, "
|
|
2136
|
+
"with the rest of the comment swallowed into its answer",
|
|
2137
|
+
"_extract_text() rewritten to walk ADF block-level nodes "
|
|
2138
|
+
"(paragraph, heading, codeBlock, blockquote, listItem) and "
|
|
2139
|
+
"join THOSE with newlines, while text runs within a single "
|
|
2140
|
+
"block are concatenated directly (also fixes a smaller "
|
|
2141
|
+
"pre-existing issue: formatting-split text runs within one "
|
|
2142
|
+
"sentence previously got a spurious extra space inserted "
|
|
2143
|
+
"between them). hardBreak nodes (shift+enter within one "
|
|
2144
|
+
"paragraph) also now produce a newline",
|
|
2145
|
+
"Also used by review_check's printed reviewer-comment display "
|
|
2146
|
+
"and the dashboard's Jira-comment surfacing -- both benefit "
|
|
2147
|
+
"from the same fix, previously showing run-on multi-line "
|
|
2148
|
+
"Jira comments as one wrapped line",
|
|
2149
|
+
"5 new tests: separate-paragraphs-become-separate-lines, "
|
|
2150
|
+
"plain-string-body unchanged, hardBreak handling, and an "
|
|
2151
|
+
"end-to-end reproduction of the exact reported bug (7 "
|
|
2152
|
+
"distinct paragraph answers, all 7 must parse)",
|
|
2153
|
+
"This migration only bumps sdd_version -- no manifest.yml "
|
|
2154
|
+
"field changes for any pack",
|
|
2155
|
+
],
|
|
2156
|
+
"migrate": lambda m: {**m, "sdd_version": "2.7.54"},
|
|
2157
|
+
},
|
|
2067
2158
|
]
|
|
2068
2159
|
|
|
2069
2160
|
|
|
@@ -34,7 +34,11 @@ Generate `brd.md` for the current feature:
|
|
|
34
34
|
- Every non-functional requirement: **NFR-NNN** — must include a measurable target (e.g. "< 200ms p99", "99.9% uptime")
|
|
35
35
|
- Marker discipline:
|
|
36
36
|
- `[ASSUMPTION-NNN: {what}]` — safe default applied; needs sign-off
|
|
37
|
-
- `[NEEDS CLARIFICATION: {question}]` — no safe default; human decision
|
|
37
|
+
- `[NEEDS CLARIFICATION-NNN: {question}]` — no safe default; human decision
|
|
38
|
+
required before /validate. NNN is numbered locally within this document
|
|
39
|
+
(NC-001, NC-002, ... — continue the count on a later re-run/amendment,
|
|
40
|
+
never reuse a resolved ID) so a reviewer's answer (in Jira, Confluence,
|
|
41
|
+
or chat) can cite the exact marker unambiguously, e.g. "NC-002: 90 days".
|
|
38
42
|
- Never leave a gap silently — always use one of the two markers
|
|
39
43
|
- Save to: `.specify/features/{manifest.project.feature}/brd.md`
|
|
40
44
|
- Write `.specify/features/{manifest.project.feature}/brd.summary.md` (max SUMMARY_MAX_LINES lines)
|
|
@@ -93,8 +97,11 @@ sdd confluence draft --doc {doc_key}
|
|
|
93
97
|
|
|
94
98
|
When the user says **"done"**: run `sdd confluence pull --doc {doc_key}`
|
|
95
99
|
automatically. If the pulled file contains a `## Confluence Comments`
|
|
96
|
-
section,
|
|
97
|
-
|
|
100
|
+
section, match each comment against the marker ID it cites (e.g. a comment
|
|
101
|
+
starting "NC-002: ..." answers `[NEEDS CLARIFICATION-002: ...]`; older
|
|
102
|
+
comments with no cited ID fall back to matching by nearest question text),
|
|
103
|
+
resolve the corresponding `[NEEDS CLARIFICATION-NNN]`/`[ASSUMPTION-NNN]`
|
|
104
|
+
marker, update the document, remove the comments section, and re-save
|
|
98
105
|
the document and its `.summary.md`. Then present it and ask for
|
|
99
106
|
**'approved'**.
|
|
100
107
|
|