baldart 3.6.2
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.
- package/CHANGELOG.md +599 -0
- package/README.md +566 -0
- package/VERSION +1 -0
- package/bin/baldart.js +143 -0
- package/framework/.claude/agents/REGISTRY.md +169 -0
- package/framework/.claude/agents/api-perf-cost-auditor.md +291 -0
- package/framework/.claude/agents/code-reviewer.md +350 -0
- package/framework/.claude/agents/codebase-architect.md +391 -0
- package/framework/.claude/agents/coder.md +291 -0
- package/framework/.claude/agents/deep-human-insight.md +198 -0
- package/framework/.claude/agents/doc-reviewer.md +440 -0
- package/framework/.claude/agents/email-deliverability-architect.md +193 -0
- package/framework/.claude/agents/hybrid-ml-architect.md +285 -0
- package/framework/.claude/agents/hyper-gamification-designer.md +149 -0
- package/framework/.claude/agents/legal-counsel-gdpr.md +179 -0
- package/framework/.claude/agents/marketing-conversion-strategist.md +162 -0
- package/framework/.claude/agents/motion-expert.md +108 -0
- package/framework/.claude/agents/onboarding-architect-lead.md +230 -0
- package/framework/.claude/agents/plan-auditor.md +546 -0
- package/framework/.claude/agents/prd-card-writer.md +372 -0
- package/framework/.claude/agents/prd.md +744 -0
- package/framework/.claude/agents/qa-sentinel.md +305 -0
- package/framework/.claude/agents/remotion-animator-orchestrator.md +218 -0
- package/framework/.claude/agents/security-reviewer.md +276 -0
- package/framework/.claude/agents/senior-researcher.md +175 -0
- package/framework/.claude/agents/seo-analytics-strategist.md +156 -0
- package/framework/.claude/agents/skill-improver.md +61 -0
- package/framework/.claude/agents/ui-expert.md +191 -0
- package/framework/.claude/agents/visual-designer.md +190 -0
- package/framework/.claude/agents/website-orchestrator.md +118 -0
- package/framework/.claude/agents/wiki-curator.md +145 -0
- package/framework/.claude/commands/baldart-push.md +15 -0
- package/framework/.claude/commands/check.md +237 -0
- package/framework/.claude/commands/codexreview.md +203 -0
- package/framework/.claude/commands/design-review.md +11 -0
- package/framework/.claude/commands/issue-review.md +34 -0
- package/framework/.claude/commands/new.md +331 -0
- package/framework/.claude/commands/qa.md +257 -0
- package/framework/.claude/hooks/framework-edit-gate.js +208 -0
- package/framework/.claude/hooks/lint-before-commit.sh.template +66 -0
- package/framework/.claude/settings.local.json.example +32 -0
- package/framework/.claude/skills/api-design-principles/SKILL.md +567 -0
- package/framework/.claude/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/framework/.claude/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/framework/.claude/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/framework/.claude/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/framework/.claude/skills/baldart-push/SKILL.md +222 -0
- package/framework/.claude/skills/bug/SKILL.md +200 -0
- package/framework/.claude/skills/bug/references/logging-patterns.md +174 -0
- package/framework/.claude/skills/capture/SKILL.md +125 -0
- package/framework/.claude/skills/capture/references/synthesis-template.md +42 -0
- package/framework/.claude/skills/context-primer/SKILL.md +189 -0
- package/framework/.claude/skills/copywriting/SKILL.md +273 -0
- package/framework/.claude/skills/copywriting/references/copy-frameworks.md +338 -0
- package/framework/.claude/skills/copywriting/references/natural-transitions.md +252 -0
- package/framework/.claude/skills/doc-writing-for-rag/SKILL.md +119 -0
- package/framework/.claude/skills/doc-writing-for-rag/references/before-after-examples.md +291 -0
- package/framework/.claude/skills/doc-writing-for-rag/references/compact-templates.md +183 -0
- package/framework/.claude/skills/doc-writing-for-rag/references/frontmatter-minimal.md +112 -0
- package/framework/.claude/skills/doc-writing-for-rag/references/line-count-targets.md +110 -0
- package/framework/.claude/skills/doc-writing-for-rag/references/schemas-and-errors.md +129 -0
- package/framework/.claude/skills/find-skills/SKILL.md +133 -0
- package/framework/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/framework/.claude/skills/frontend-design/SKILL.md +84 -0
- package/framework/.claude/skills/gamification-design/SKILL.md +130 -0
- package/framework/.claude/skills/issue-review/SKILL.md +45 -0
- package/framework/.claude/skills/kie-ai/SKILL.md +262 -0
- package/framework/.claude/skills/kie-ai/references/models-catalog.md +272 -0
- package/framework/.claude/skills/kie-ai/scripts/kie_api.sh +209 -0
- package/framework/.claude/skills/kie-ai/scripts/remove_greenscreen.py +69 -0
- package/framework/.claude/skills/kie-ai/scripts/setup_api_key.sh +77 -0
- package/framework/.claude/skills/motion-design/LICENSE +21 -0
- package/framework/.claude/skills/motion-design/README.md +82 -0
- package/framework/.claude/skills/motion-design/SKILL.md +336 -0
- package/framework/.claude/skills/motion-design/director/choreography.md +93 -0
- package/framework/.claude/skills/motion-design/director/context-adaptation.md +83 -0
- package/framework/.claude/skills/motion-design/director/core-philosophy.md +53 -0
- package/framework/.claude/skills/motion-design/director/decision-framework.md +91 -0
- package/framework/.claude/skills/motion-design/director/disney-principles.md +102 -0
- package/framework/.claude/skills/motion-design/director/emotion-mapping.md +71 -0
- package/framework/.claude/skills/motion-design/director/motion-personality.md +89 -0
- package/framework/.claude/skills/motion-design/director/narrative-structure.md +62 -0
- package/framework/.claude/skills/motion-design/patterns/ambient-continuous.md +81 -0
- package/framework/.claude/skills/motion-design/patterns/entrance-exit.md +82 -0
- package/framework/.claude/skills/motion-design/patterns/multi-element.md +69 -0
- package/framework/.claude/skills/motion-design/patterns/state-feedback.md +96 -0
- package/framework/.claude/skills/motion-design/reference/property-selection.md +95 -0
- package/framework/.claude/skills/motion-design/reference/quality-checklist.md +67 -0
- package/framework/.claude/skills/motion-design/reference/timing-easing-tables.md +106 -0
- package/framework/.claude/skills/motion-design/reference/troubleshooting.md +73 -0
- package/framework/.claude/skills/new/SKILL.md +1687 -0
- package/framework/.claude/skills/playwright-skill/API_REFERENCE.md +652 -0
- package/framework/.claude/skills/playwright-skill/SKILL.md +157 -0
- package/framework/.claude/skills/playwright-skill/package.json +26 -0
- package/framework/.claude/skills/prd/SKILL.md +228 -0
- package/framework/.claude/skills/prd/assets/card-template.yml +232 -0
- package/framework/.claude/skills/prd/assets/epic-template.yml +190 -0
- package/framework/.claude/skills/prd/assets/prd-template.md +230 -0
- package/framework/.claude/skills/prd/assets/state-template.md +78 -0
- package/framework/.claude/skills/prd/references/api-perf-gate.md +152 -0
- package/framework/.claude/skills/prd/references/audit-phase.md +478 -0
- package/framework/.claude/skills/prd/references/backlog-phase.md +145 -0
- package/framework/.claude/skills/prd/references/discovery-phase.md +359 -0
- package/framework/.claude/skills/prd/references/impact-analysis.md +233 -0
- package/framework/.claude/skills/prd/references/prd-add-phase.md +214 -0
- package/framework/.claude/skills/prd/references/prd-writing-phase.md +145 -0
- package/framework/.claude/skills/prd/references/research-phase.md +216 -0
- package/framework/.claude/skills/prd/references/ui-design-phase.md +61 -0
- package/framework/.claude/skills/prd/references/validation-phase.md +72 -0
- package/framework/.claude/skills/prd-add/SKILL.md +222 -0
- package/framework/.claude/skills/prd-add/references/impact-analysis.md +233 -0
- package/framework/.claude/skills/remotion-best-practices/SKILL.md +48 -0
- package/framework/.claude/skills/remotion-best-practices/rules/3d.md +86 -0
- package/framework/.claude/skills/remotion-best-practices/rules/animations.md +29 -0
- package/framework/.claude/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
- package/framework/.claude/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
- package/framework/.claude/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/framework/.claude/skills/remotion-best-practices/rules/assets.md +78 -0
- package/framework/.claude/skills/remotion-best-practices/rules/audio.md +169 -0
- package/framework/.claude/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
- package/framework/.claude/skills/remotion-best-practices/rules/can-decode.md +75 -0
- package/framework/.claude/skills/remotion-best-practices/rules/charts.md +58 -0
- package/framework/.claude/skills/remotion-best-practices/rules/compositions.md +141 -0
- package/framework/.claude/skills/remotion-best-practices/rules/display-captions.md +184 -0
- package/framework/.claude/skills/remotion-best-practices/rules/extract-frames.md +229 -0
- package/framework/.claude/skills/remotion-best-practices/rules/fonts.md +152 -0
- package/framework/.claude/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
- package/framework/.claude/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
- package/framework/.claude/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
- package/framework/.claude/skills/remotion-best-practices/rules/gifs.md +141 -0
- package/framework/.claude/skills/remotion-best-practices/rules/images.md +130 -0
- package/framework/.claude/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
- package/framework/.claude/skills/remotion-best-practices/rules/light-leaks.md +73 -0
- package/framework/.claude/skills/remotion-best-practices/rules/lottie.md +67 -0
- package/framework/.claude/skills/remotion-best-practices/rules/maps.md +401 -0
- package/framework/.claude/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
- package/framework/.claude/skills/remotion-best-practices/rules/measuring-text.md +143 -0
- package/framework/.claude/skills/remotion-best-practices/rules/parameters.md +98 -0
- package/framework/.claude/skills/remotion-best-practices/rules/sequencing.md +118 -0
- package/framework/.claude/skills/remotion-best-practices/rules/subtitles.md +36 -0
- package/framework/.claude/skills/remotion-best-practices/rules/tailwind.md +11 -0
- package/framework/.claude/skills/remotion-best-practices/rules/text-animations.md +20 -0
- package/framework/.claude/skills/remotion-best-practices/rules/timing.md +179 -0
- package/framework/.claude/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
- package/framework/.claude/skills/remotion-best-practices/rules/transitions.md +197 -0
- package/framework/.claude/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
- package/framework/.claude/skills/remotion-best-practices/rules/trimming.md +52 -0
- package/framework/.claude/skills/remotion-best-practices/rules/videos.md +171 -0
- package/framework/.claude/skills/seo-audit/SKILL.md +394 -0
- package/framework/.claude/skills/seo-audit/references/aeo-geo-patterns.md +279 -0
- package/framework/.claude/skills/seo-audit/references/ai-writing-detection.md +190 -0
- package/framework/.claude/skills/simplify/SKILL.md +137 -0
- package/framework/.claude/skills/skill-creator/LICENSE.txt +202 -0
- package/framework/.claude/skills/skill-creator/SKILL.md +356 -0
- package/framework/.claude/skills/skill-creator/references/output-patterns.md +82 -0
- package/framework/.claude/skills/skill-creator/references/workflows.md +28 -0
- package/framework/.claude/skills/skill-creator/scripts/init_skill.py +303 -0
- package/framework/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
- package/framework/.claude/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/framework/.claude/skills/ui-design/SKILL.md +199 -0
- package/framework/.claude/skills/ui-design/references/component-discovery.md +54 -0
- package/framework/.claude/skills/ui-design/references/evaluation.md +171 -0
- package/framework/.claude/skills/ui-design/references/generation.md +109 -0
- package/framework/.claude/skills/ui-design/references/inventory.md +59 -0
- package/framework/.claude/skills/webapp-testing/LICENSE.txt +202 -0
- package/framework/.claude/skills/webapp-testing/SKILL.md +123 -0
- package/framework/.claude/skills/webapp-testing/examples/console_logging.py +35 -0
- package/framework/.claude/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/framework/.claude/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/framework/.claude/skills/webapp-testing/scripts/with_server.py +106 -0
- package/framework/.claude/skills/worktree-manager/SKILL.md +680 -0
- package/framework/AGENTS.md +240 -0
- package/framework/agents/api-contracts.md +137 -0
- package/framework/agents/architecture.md +145 -0
- package/framework/agents/coding-standards.md +148 -0
- package/framework/agents/data-model.md +110 -0
- package/framework/agents/deployment-protocol.md +232 -0
- package/framework/agents/design-review.md +172 -0
- package/framework/agents/env-reference.md +171 -0
- package/framework/agents/github-issue-subagent.md +252 -0
- package/framework/agents/index.md +261 -0
- package/framework/agents/llm-wiki-methodology.md +216 -0
- package/framework/agents/maintenance-protocol.md +305 -0
- package/framework/agents/observability.md +162 -0
- package/framework/agents/performance.md +155 -0
- package/framework/agents/project-context.md +145 -0
- package/framework/agents/runbook.md +208 -0
- package/framework/agents/security.md +168 -0
- package/framework/agents/skills-mapping.md +286 -0
- package/framework/agents/testing.md +111 -0
- package/framework/agents/workflows.md +215 -0
- package/framework/docs/PROJECT-CONFIGURATION.md +336 -0
- package/framework/docs/references/brand-guidelines.md +170 -0
- package/framework/docs/references/ui-guidelines.template.md +182 -0
- package/framework/routines/code-review.routine.yml +46 -0
- package/framework/routines/doc-review.routine.yml +45 -0
- package/framework/routines/ds-drift.routine.yml +52 -0
- package/framework/routines/full-sweep.routine.yml +51 -0
- package/framework/routines/index.yml +70 -0
- package/framework/routines/skill-improve.routine.yml +50 -0
- package/framework/routines/wiki-review.routine.yml +45 -0
- package/framework/templates/baldart.config.template.yml +113 -0
- package/framework/templates/breaking-change-checklist.md +484 -0
- package/framework/templates/feature-card.template.yml +125 -0
- package/framework/templates/overlays/README.md +44 -0
- package/framework/templates/overlays/copywriting.fidelity-example.md +62 -0
- package/framework/templates/overlays/ui-design.fidelity-example.md +75 -0
- package/framework/templates/skill-project-context.snippet.md +19 -0
- package/framework/templates/spec.template.md +208 -0
- package/package.json +51 -0
- package/src/commands/add.js +229 -0
- package/src/commands/configure.js +385 -0
- package/src/commands/doctor.js +486 -0
- package/src/commands/migrate.js +185 -0
- package/src/commands/push.js +0 -0
- package/src/commands/routines.js +269 -0
- package/src/commands/status.js +130 -0
- package/src/commands/update.js +419 -0
- package/src/commands/version.js +88 -0
- package/src/utils/contamination.js +400 -0
- package/src/utils/git.js +181 -0
- package/src/utils/hooks.js +152 -0
- package/src/utils/routine-adapters/claude-code-cloud.js +78 -0
- package/src/utils/routine-adapters/cron.js +138 -0
- package/src/utils/routine-adapters/github-actions.js +141 -0
- package/src/utils/routine-adapters/index.js +21 -0
- package/src/utils/routines.js +166 -0
- package/src/utils/state.js +143 -0
- package/src/utils/symlinks.js +425 -0
- package/src/utils/ui.js +133 -0
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
# Breaking Change Checklist
|
|
2
|
+
|
|
3
|
+
**Purpose**: Ensure zero-surprise breaking changes to API contracts, with proper deprecation timeline and client migration support.
|
|
4
|
+
|
|
5
|
+
**When to Use**: Before introducing any breaking change to an existing API endpoint.
|
|
6
|
+
|
|
7
|
+
**Timeline**: Minimum 6 months from deprecation announcement to sunset (removal).
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## What Qualifies as a Breaking Change?
|
|
12
|
+
|
|
13
|
+
A change is **breaking** if existing clients would fail or behave incorrectly without code changes:
|
|
14
|
+
|
|
15
|
+
✅ **Breaking Changes** (Require new version):
|
|
16
|
+
- Remove endpoint or HTTP method
|
|
17
|
+
- Remove request field (required or optional)
|
|
18
|
+
- Remove response field
|
|
19
|
+
- Rename request/response field
|
|
20
|
+
- Change field type (string → number, object → array, etc.)
|
|
21
|
+
- Add required request field (was optional or didn't exist)
|
|
22
|
+
- Change validation rules (stricter limits, new format requirements)
|
|
23
|
+
- Change authentication/authorization requirements
|
|
24
|
+
- Change error response format
|
|
25
|
+
- Change HTTP status codes for existing scenarios
|
|
26
|
+
|
|
27
|
+
❌ **Non-Breaking Changes** (Can update in place):
|
|
28
|
+
- Add optional request field
|
|
29
|
+
- Add response field (clients should ignore unknown fields)
|
|
30
|
+
- Relax validation rules (accept more input)
|
|
31
|
+
- Fix bugs that made endpoint unusable
|
|
32
|
+
- Performance improvements
|
|
33
|
+
- Internal refactoring (no contract change)
|
|
34
|
+
|
|
35
|
+
**When in Doubt**: Treat as breaking. Over-communicate > under-communicate.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Pre-Change Checklist
|
|
40
|
+
|
|
41
|
+
### 1. Document the Decision
|
|
42
|
+
|
|
43
|
+
- [ ] **Create ADR** in `docs/decisions/ADR-YYYYMMDD-<change-description>.md`
|
|
44
|
+
- **Context**: Why is this change needed? What problem does it solve?
|
|
45
|
+
- **Decision**: What exactly are we changing? (Include before/after examples)
|
|
46
|
+
- **Rationale**: Why is breaking change necessary? (Why can't we maintain backward compatibility?)
|
|
47
|
+
- **Alternatives Considered**: What non-breaking alternatives were evaluated?
|
|
48
|
+
- **Consequences**: Impact on clients, migration effort, timeline
|
|
49
|
+
- **Migration Path**: How will clients migrate? (Link to migration guide)
|
|
50
|
+
|
|
51
|
+
**Example ADR filename**: `ADR-20260115-auth-otp-require-country-code.md`
|
|
52
|
+
|
|
53
|
+
### 2. Create New Versioned Endpoint
|
|
54
|
+
|
|
55
|
+
- [ ] **Create new version directory**:
|
|
56
|
+
```bash
|
|
57
|
+
# If changing /api/v1/auth/otp → create /api/v2/auth/otp
|
|
58
|
+
mkdir -p src/app/api/v2/auth/otp
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
- [ ] **Copy and modify route file**:
|
|
62
|
+
```bash
|
|
63
|
+
cp src/app/api/v1/auth/otp/route.ts src/app/api/v2/auth/otp/route.ts
|
|
64
|
+
# Edit v2/route.ts to implement breaking change
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
- [ ] **Implement breaking change** in new version ONLY
|
|
68
|
+
- Old version (`/api/v1/...`) remains unchanged
|
|
69
|
+
- New version (`/api/v2/...`) has new contract
|
|
70
|
+
|
|
71
|
+
### 3. Add Deprecation Headers to Old Version
|
|
72
|
+
|
|
73
|
+
- [ ] **Update old version** (`/api/v1/auth/otp/route.ts`) to add deprecation wrapper:
|
|
74
|
+
```typescript
|
|
75
|
+
import { addDeprecationHeader, getSunsetDate } from "@/lib/apiVersion";
|
|
76
|
+
|
|
77
|
+
export async function POST(req: NextRequest) {
|
|
78
|
+
// Original v1 logic (unchanged)
|
|
79
|
+
const data = await yourExistingLogic(req);
|
|
80
|
+
const response = NextResponse.json(data);
|
|
81
|
+
|
|
82
|
+
// Add deprecation headers
|
|
83
|
+
return addDeprecationHeader(response, "v1", getSunsetDate());
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
- [ ] **Verify deprecation headers** in response:
|
|
88
|
+
```http
|
|
89
|
+
Deprecation: true
|
|
90
|
+
Sunset: YYYY-MM-DD (6 months from now)
|
|
91
|
+
Link: </api/v2>; rel="successor-version"
|
|
92
|
+
X-Migration-Guide: https://github.com/.../docs/api-migration-v1.md
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 4. Update Documentation
|
|
96
|
+
|
|
97
|
+
- [ ] **Update API reference** (appropriate module in `docs/references/api/`):
|
|
98
|
+
- Add new version entry with **Status: Current**
|
|
99
|
+
- Update old version entry with **Status: Deprecated**
|
|
100
|
+
- Add **Sunset** date and **Successor** link
|
|
101
|
+
|
|
102
|
+
**Example**:
|
|
103
|
+
```markdown
|
|
104
|
+
### POST /api/v2/auth/otp
|
|
105
|
+
**Status**: Current
|
|
106
|
+
**Added**: 2026-01-15 (v2)
|
|
107
|
+
**Breaking Changes**: Now requires `countryCode` field
|
|
108
|
+
|
|
109
|
+
[Full documentation here]
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
### POST /api/v1/auth/otp
|
|
114
|
+
**Status**: Deprecated
|
|
115
|
+
**Deprecated**: 2026-01-15
|
|
116
|
+
**Sunset**: 2026-07-15 (6 months)
|
|
117
|
+
**Successor**: `/api/v2/auth/otp`
|
|
118
|
+
|
|
119
|
+
⚠️ **Use `/api/v2/auth/otp` instead.** This version will be removed on 2026-07-15.
|
|
120
|
+
|
|
121
|
+
**Breaking Changes in v2**:
|
|
122
|
+
- Added required field: `countryCode` (ISO 3166-1 alpha-2, e.g., "IT", "US")
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
- [ ] **Update migration guide** if needed (add new patterns/examples)
|
|
126
|
+
|
|
127
|
+
- [ ] **Create backlog card** (if not already exists):
|
|
128
|
+
- **Type**: `type: breaking-change`
|
|
129
|
+
- **Status**: `IN_PROGRESS`
|
|
130
|
+
- **Linked ADR**: Reference ADR filename
|
|
131
|
+
- **Sunset date**: 6 months from deprecation
|
|
132
|
+
|
|
133
|
+
### 5. Test Both Versions
|
|
134
|
+
|
|
135
|
+
- [ ] **Manual testing**:
|
|
136
|
+
- [ ] Old version (`/api/v1/...`) still works with old contract
|
|
137
|
+
- [ ] Old version returns deprecation headers
|
|
138
|
+
- [ ] New version (`/api/v2/...`) works with new contract
|
|
139
|
+
- [ ] New version does NOT return deprecation headers
|
|
140
|
+
|
|
141
|
+
- [ ] **Automated testing**:
|
|
142
|
+
- [ ] Add tests for v2 endpoint (new contract)
|
|
143
|
+
- [ ] Verify v1 tests still pass (no regression)
|
|
144
|
+
- [ ] Add test for deprecation headers on v1
|
|
145
|
+
|
|
146
|
+
**Example test**:
|
|
147
|
+
```typescript
|
|
148
|
+
describe("POST /api/v1/auth/otp (deprecated)", () => {
|
|
149
|
+
it("returns deprecation headers", async () => {
|
|
150
|
+
const response = await fetch("/api/v1/auth/otp", { method: "POST", ... });
|
|
151
|
+
expect(response.headers.get("Deprecation")).toBe("true");
|
|
152
|
+
expect(response.headers.get("Sunset")).toMatch(/\d{4}-\d{2}-\d{2}/);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it("still accepts old contract (no countryCode)", async () => {
|
|
156
|
+
const response = await fetch("/api/v1/auth/otp", {
|
|
157
|
+
method: "POST",
|
|
158
|
+
body: JSON.stringify({ phoneNumber: "+393331234567" }), // No countryCode
|
|
159
|
+
});
|
|
160
|
+
expect(response.status).toBe(200);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe("POST /api/v2/auth/otp", () => {
|
|
165
|
+
it("requires countryCode field", async () => {
|
|
166
|
+
const response = await fetch("/api/v2/auth/otp", {
|
|
167
|
+
method: "POST",
|
|
168
|
+
body: JSON.stringify({ phoneNumber: "+393331234567" }), // Missing countryCode
|
|
169
|
+
});
|
|
170
|
+
expect(response.status).toBe(400); // Bad Request
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it("accepts new contract with countryCode", async () => {
|
|
174
|
+
const response = await fetch("/api/v2/auth/otp", {
|
|
175
|
+
method: "POST",
|
|
176
|
+
body: JSON.stringify({
|
|
177
|
+
phoneNumber: "+393331234567",
|
|
178
|
+
countryCode: "IT"
|
|
179
|
+
}),
|
|
180
|
+
});
|
|
181
|
+
expect(response.status).toBe(200);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 6. Announce Deprecation
|
|
187
|
+
|
|
188
|
+
- [ ] **Internal announcement** (team Slack/email):
|
|
189
|
+
- What's changing (endpoint + contract)
|
|
190
|
+
- When it's deprecated (today)
|
|
191
|
+
- When it's removed (6 months)
|
|
192
|
+
- How to migrate (link to guide + ADR)
|
|
193
|
+
|
|
194
|
+
**Example announcement**:
|
|
195
|
+
```
|
|
196
|
+
🚨 **API Breaking Change Alert**
|
|
197
|
+
|
|
198
|
+
**Endpoint**: POST /api/v1/auth/otp
|
|
199
|
+
**Status**: Deprecated as of 2026-01-15
|
|
200
|
+
**Sunset**: 2026-07-15 (6 months)
|
|
201
|
+
**New Version**: POST /api/v2/auth/otp
|
|
202
|
+
|
|
203
|
+
**What Changed**:
|
|
204
|
+
The `countryCode` field is now REQUIRED in v2 (was optional/missing in v1).
|
|
205
|
+
|
|
206
|
+
**Migration**:
|
|
207
|
+
Update your calls to use `/api/v2/auth/otp` and include `countryCode`:
|
|
208
|
+
```json
|
|
209
|
+
{
|
|
210
|
+
"phoneNumber": "+393331234567",
|
|
211
|
+
"countryCode": "IT" // ← New required field
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Docs**: See docs/api-migration-v1.md
|
|
216
|
+
**ADR**: docs/decisions/ADR-20260115-auth-otp-require-country-code.md
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
- [ ] **External announcement** (if API is public):
|
|
220
|
+
- Blog post or changelog entry
|
|
221
|
+
- Email to registered API users
|
|
222
|
+
- Update API documentation site
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## During Migration Period (Months 0-6)
|
|
227
|
+
|
|
228
|
+
### 7. Monitor Usage
|
|
229
|
+
|
|
230
|
+
- [ ] **Add logging** to old endpoint to track usage:
|
|
231
|
+
```typescript
|
|
232
|
+
export async function POST(req: NextRequest) {
|
|
233
|
+
// Log deprecated endpoint usage
|
|
234
|
+
console.warn(`[DEPRECATED] /api/v1/auth/otp called - Sunset: ${getSunsetDate()}`);
|
|
235
|
+
|
|
236
|
+
// Or use analytics/monitoring
|
|
237
|
+
trackEvent("api.deprecated.v1.auth.otp", { userAgent: req.headers.get("user-agent") });
|
|
238
|
+
|
|
239
|
+
// Continue with original logic...
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
- [ ] **Track metrics**:
|
|
244
|
+
- Daily/weekly request count to old endpoint
|
|
245
|
+
- Unique clients calling old endpoint (by IP, user-agent, auth token)
|
|
246
|
+
- Error rate on new endpoint (migration issues?)
|
|
247
|
+
|
|
248
|
+
### 8. Proactive Client Outreach
|
|
249
|
+
|
|
250
|
+
**Month 1-2** (25% through sunset period):
|
|
251
|
+
- [ ] Review usage metrics
|
|
252
|
+
- [ ] Identify top clients still using old endpoint
|
|
253
|
+
- [ ] Send reminder emails with migration guide
|
|
254
|
+
|
|
255
|
+
**Month 3-4** (50% through sunset period):
|
|
256
|
+
- [ ] Review usage metrics again
|
|
257
|
+
- [ ] Escalate outreach to heavy users
|
|
258
|
+
- [ ] Offer migration support (pair programming, code review)
|
|
259
|
+
|
|
260
|
+
**Month 5** (80% through sunset period):
|
|
261
|
+
- [ ] Final warning emails to remaining clients
|
|
262
|
+
- [ ] Announce firm removal date (sunset)
|
|
263
|
+
- [ ] Publish sunset countdown (30 days, 14 days, 7 days, 1 day)
|
|
264
|
+
|
|
265
|
+
### 9. Update Client Code
|
|
266
|
+
|
|
267
|
+
- [ ] **Search for old endpoint usage** in codebase:
|
|
268
|
+
```bash
|
|
269
|
+
rg 'fetch.*["\x27]/api/v1/auth/otp' --type ts --type tsx
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
- [ ] **Update all calls** to use new version:
|
|
273
|
+
```typescript
|
|
274
|
+
// Before (v1 - deprecated)
|
|
275
|
+
const response = await fetch("/api/v1/auth/otp", {
|
|
276
|
+
method: "POST",
|
|
277
|
+
body: JSON.stringify({ phoneNumber: "+393331234567" }),
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
// After (v2 - current)
|
|
281
|
+
const response = await fetch("/api/v2/auth/otp", {
|
|
282
|
+
method: "POST",
|
|
283
|
+
body: JSON.stringify({
|
|
284
|
+
phoneNumber: "+393331234567",
|
|
285
|
+
countryCode: "IT", // ← New required field
|
|
286
|
+
}),
|
|
287
|
+
});
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
- [ ] **Test updated code** (manual + automated)
|
|
291
|
+
|
|
292
|
+
- [ ] **Deploy updated clients** BEFORE sunset date
|
|
293
|
+
|
|
294
|
+
### 10. Backward Compatibility Strategy
|
|
295
|
+
|
|
296
|
+
**Option A: Graceful Degradation** (Recommended for minor changes)
|
|
297
|
+
- Old version (`/api/v1/...`) still works but returns deprecation headers
|
|
298
|
+
- New version (`/api/v2/...`) has enhanced functionality
|
|
299
|
+
|
|
300
|
+
**Option B: Feature Flag Rollout** (For risky changes)
|
|
301
|
+
- Deploy v2 behind feature flag
|
|
302
|
+
- Gradually roll out to 1% → 10% → 50% → 100% traffic
|
|
303
|
+
- Monitor error rates at each stage
|
|
304
|
+
- Rollback flag if issues detected
|
|
305
|
+
|
|
306
|
+
**Option C: Dual Write** (For data model changes)
|
|
307
|
+
- Write to both old and new schemas during migration
|
|
308
|
+
- Read from new schema (with fallback to old)
|
|
309
|
+
- Remove old schema after sunset
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Post-Sunset Checklist (Month 6+)
|
|
314
|
+
|
|
315
|
+
### 11. Verify Zero Traffic
|
|
316
|
+
|
|
317
|
+
- [ ] **Check usage metrics** for old endpoint:
|
|
318
|
+
- Zero requests for 30+ consecutive days
|
|
319
|
+
- Or <0.01% of total API traffic
|
|
320
|
+
|
|
321
|
+
- [ ] **Final warning announcement** (7 days before removal):
|
|
322
|
+
```
|
|
323
|
+
🚨 **Final Notice: API Removal in 7 Days**
|
|
324
|
+
|
|
325
|
+
**Endpoint**: POST /api/v1/auth/otp
|
|
326
|
+
**Removal Date**: 2026-07-15
|
|
327
|
+
**Replacement**: POST /api/v2/auth/otp
|
|
328
|
+
|
|
329
|
+
This is your FINAL WARNING. After 2026-07-15, the old endpoint will return 410 Gone.
|
|
330
|
+
|
|
331
|
+
If you are still using the old endpoint, migrate NOW: [migration guide link]
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### 12. Remove Old Endpoint
|
|
335
|
+
|
|
336
|
+
- [ ] **Delete old route file**:
|
|
337
|
+
```bash
|
|
338
|
+
rm src/app/api/v1/auth/otp/route.ts
|
|
339
|
+
# Keep directory if other routes exist in v1
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
- [ ] **Add 410 Gone stub** (optional but recommended for 30 days):
|
|
343
|
+
```typescript
|
|
344
|
+
// src/app/api/v1/auth/otp/route.ts (temporary stub)
|
|
345
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
346
|
+
|
|
347
|
+
export async function POST(req: NextRequest) {
|
|
348
|
+
return NextResponse.json(
|
|
349
|
+
{
|
|
350
|
+
error: "This endpoint has been removed",
|
|
351
|
+
message: "POST /api/v1/auth/otp was sunset on 2026-07-15",
|
|
352
|
+
successor: "/api/v2/auth/otp",
|
|
353
|
+
migrationGuide: "https://github.com/.../docs/api-migration-v1.md"
|
|
354
|
+
},
|
|
355
|
+
{ status: 410 } // 410 Gone (permanent removal)
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
- [ ] **Remove 410 stub** after 30 days (now return 404 from framework)
|
|
361
|
+
|
|
362
|
+
### 13. Update Documentation
|
|
363
|
+
|
|
364
|
+
- [ ] **Remove old endpoint** from appropriate `docs/references/api/*.md` module
|
|
365
|
+
- Or move to "Removed Endpoints" section with removal date
|
|
366
|
+
|
|
367
|
+
- [ ] **Update migration guide** if needed (mark migration complete)
|
|
368
|
+
|
|
369
|
+
- [ ] **Create removal ADR**:
|
|
370
|
+
- `docs/decisions/ADR-YYYYMMDD-remove-v1-auth-otp.md`
|
|
371
|
+
- **Context**: Old endpoint sunset date reached, zero traffic confirmed
|
|
372
|
+
- **Decision**: Removed `/api/v1/auth/otp` on YYYY-MM-DD
|
|
373
|
+
- **Consequences**: Clients using old endpoint will receive 410 Gone (or 404 after stub removed)
|
|
374
|
+
|
|
375
|
+
### 14. Clean Up Code
|
|
376
|
+
|
|
377
|
+
- [ ] **Remove feature flags** (if used for rollout)
|
|
378
|
+
|
|
379
|
+
- [ ] **Remove dual-write code** (if used for data model migration)
|
|
380
|
+
|
|
381
|
+
- [ ] **Remove monitoring/logging** specific to old endpoint
|
|
382
|
+
|
|
383
|
+
- [ ] **Archive related backlog cards**:
|
|
384
|
+
- Mark breaking change card as `DONE`
|
|
385
|
+
- Add completion notes (removal date, final usage metrics)
|
|
386
|
+
|
|
387
|
+
### 15. Post-Mortem (Optional but Recommended)
|
|
388
|
+
|
|
389
|
+
- [ ] **Review migration metrics**:
|
|
390
|
+
- How many clients migrated proactively vs. reactively?
|
|
391
|
+
- Did we have any surprise breakages?
|
|
392
|
+
- Was 6-month timeline sufficient?
|
|
393
|
+
- Were deprecation headers effective?
|
|
394
|
+
|
|
395
|
+
- [ ] **Document lessons learned** in ADR or team wiki
|
|
396
|
+
|
|
397
|
+
- [ ] **Update this checklist** if needed (new best practices discovered)
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## Emergency Rollback
|
|
402
|
+
|
|
403
|
+
**If breaking change causes unexpected issues:**
|
|
404
|
+
|
|
405
|
+
### Option 1: Immediate Revert (Recommended)
|
|
406
|
+
```bash
|
|
407
|
+
git revert <commit-hash> # Revert the breaking change commit
|
|
408
|
+
git push origin main # Deploy old version immediately
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
### Option 2: Feature Flag Rollback
|
|
412
|
+
```typescript
|
|
413
|
+
// Temporarily disable v2 endpoint
|
|
414
|
+
export async function POST(req: NextRequest) {
|
|
415
|
+
const useV2 = process.env.ENABLE_V2_AUTH_OTP === "true";
|
|
416
|
+
|
|
417
|
+
if (!useV2) {
|
|
418
|
+
// Fallback to v1 logic
|
|
419
|
+
return v1Handler(req);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// v2 logic
|
|
423
|
+
return v2Handler(req);
|
|
424
|
+
}
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### Option 3: Traffic Routing
|
|
428
|
+
- Route 100% traffic back to old endpoint via load balancer/reverse proxy
|
|
429
|
+
- Fix issues in new endpoint
|
|
430
|
+
- Gradually re-enable new endpoint
|
|
431
|
+
|
|
432
|
+
**Post-Rollback**:
|
|
433
|
+
- [ ] Notify clients about rollback
|
|
434
|
+
- [ ] Investigate root cause
|
|
435
|
+
- [ ] Fix issue in new version
|
|
436
|
+
- [ ] Re-test thoroughly
|
|
437
|
+
- [ ] Re-deploy with extended sunset timeline (e.g., +2 months)
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
## Examples
|
|
442
|
+
|
|
443
|
+
### Example 1: Add Required Field
|
|
444
|
+
|
|
445
|
+
**Breaking Change**: POST /api/v1/coupons/redeem now requires `restaurantId` field.
|
|
446
|
+
|
|
447
|
+
**Checklist**:
|
|
448
|
+
- ✅ ADR: `ADR-20260120-coupons-redeem-require-restaurant-id.md`
|
|
449
|
+
- ✅ New version: `/api/v2/coupons/redeem` (requires `restaurantId`)
|
|
450
|
+
- ✅ Old version: `/api/v1/coupons/redeem` (deprecation headers, works without `restaurantId`)
|
|
451
|
+
- ✅ Sunset: 2026-07-20 (6 months)
|
|
452
|
+
- ✅ Tests: v1 accepts old contract, v2 rejects missing `restaurantId`
|
|
453
|
+
|
|
454
|
+
### Example 2: Remove Response Field
|
|
455
|
+
|
|
456
|
+
**Breaking Change**: GET /api/v1/user/dashboard removes `legacyStats` field from response.
|
|
457
|
+
|
|
458
|
+
**Checklist**:
|
|
459
|
+
- ✅ ADR: `ADR-20260125-dashboard-remove-legacy-stats.md`
|
|
460
|
+
- ✅ New version: `/api/v2/user/dashboard` (no `legacyStats` in response)
|
|
461
|
+
- ✅ Old version: `/api/v1/user/dashboard` (deprecation headers, still returns `legacyStats`)
|
|
462
|
+
- ✅ Sunset: 2026-07-25 (6 months)
|
|
463
|
+
- ✅ Client migration: Update code to not rely on `legacyStats` field
|
|
464
|
+
|
|
465
|
+
### Example 3: Change Field Type
|
|
466
|
+
|
|
467
|
+
**Breaking Change**: POST /api/v1/receipts/upload changes `totalAmount` from string to number.
|
|
468
|
+
|
|
469
|
+
**Checklist**:
|
|
470
|
+
- ✅ ADR: `ADR-20260201-receipts-total-amount-type-change.md`
|
|
471
|
+
- ✅ New version: `/api/v2/receipts/upload` (accepts `totalAmount: 12.34` as number)
|
|
472
|
+
- ✅ Old version: `/api/v1/receipts/upload` (deprecation headers, accepts `totalAmount: "12.34"` as string)
|
|
473
|
+
- ✅ Sunset: 2026-08-01 (6 months)
|
|
474
|
+
- ✅ Migration: Clients update to send number instead of string
|
|
475
|
+
|
|
476
|
+
---
|
|
477
|
+
|
|
478
|
+
## See Also
|
|
479
|
+
|
|
480
|
+
- [docs/api-migration-v1.md](../docs/api-migration-v1.md) - Complete migration guide for URL-based versioning
|
|
481
|
+
- TODO (needs confirmation): document the current location of any API versioning utilities (previously referenced as `src/lib/apiVersion.ts`)
|
|
482
|
+
- [docs/references/api/index.md](../docs/references/api/index.md) - API inventory with deprecation status (split into modules)
|
|
483
|
+
- [RFC 8594](https://www.rfc-editor.org/rfc/rfc8594.html) - HTTP Deprecation Header standard
|
|
484
|
+
- [docs/decisions/ADR-20260107-drift-prevention-protocols.md](../docs/decisions/ADR-20260107-drift-prevention-protocols.md) - Why we chose URL-based versioning
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Feature Card Template
|
|
2
|
+
# Copy this file to /backlog/<feature-name>.yml and fill in all sections
|
|
3
|
+
|
|
4
|
+
id: FEAT-XXX
|
|
5
|
+
title: "[Brief feature name]"
|
|
6
|
+
status: TODO # TODO | IN_PROGRESS | BLOCKED | DONE
|
|
7
|
+
priority: MEDIUM # LOW | MEDIUM | HIGH | CRITICAL
|
|
8
|
+
execution_mode: cloud # local | cloud
|
|
9
|
+
owner_agent: "" # codex | claude | human
|
|
10
|
+
claimed_at: "" # YYYY-MM-DD HH:MM
|
|
11
|
+
claimed_paths: [] # File/path ownership lock for this card
|
|
12
|
+
|
|
13
|
+
git_strategy:
|
|
14
|
+
branch: "" # feat/<card-id>-<slug> | main (hotfix only). Children inherit from parent epic.
|
|
15
|
+
reason: "" # Why this choice (optional, for documentation)
|
|
16
|
+
|
|
17
|
+
# Card grouping — defines family relationships for worktree isolation.
|
|
18
|
+
# If this card is part of a multi-card feature, set parent + sequence.
|
|
19
|
+
# If this IS the parent/epic card, set is_epic: true and list children.
|
|
20
|
+
group:
|
|
21
|
+
parent: "" # Parent/epic card ID (e.g., FEAT-0394). Empty if standalone.
|
|
22
|
+
sequence: null # Execution order within group (1, 2, 3...). Null if standalone.
|
|
23
|
+
is_epic: false # True if this is the parent/epic card that owns the group.
|
|
24
|
+
children: [] # Child card IDs (e.g., [FEAT-0394-01, FEAT-0394-02]). Only on epic cards.
|
|
25
|
+
|
|
26
|
+
scope:
|
|
27
|
+
summary: "[1-2 sentence description of what this feature does]"
|
|
28
|
+
users: [] # CUSTOMER | MERCHANT | ADMIN
|
|
29
|
+
value: "[Why this feature matters - business/user value]"
|
|
30
|
+
|
|
31
|
+
areas:
|
|
32
|
+
ui: [] # List of UI pages/components affected (e.g., /dashboard, /merchant/page.tsx)
|
|
33
|
+
api: [] # List of API routes affected (e.g., /api/merchants, /api/coupons/generate)
|
|
34
|
+
data: [] # Firestore collections affected (e.g., merchants, coupons, users)
|
|
35
|
+
external: [] # External dependencies (e.g., html5-qrcode, Firebase Admin)
|
|
36
|
+
|
|
37
|
+
entrypoints:
|
|
38
|
+
ui:
|
|
39
|
+
- path: ""
|
|
40
|
+
description: ""
|
|
41
|
+
api:
|
|
42
|
+
- endpoint: ""
|
|
43
|
+
method: "" # GET | POST | PATCH | DELETE
|
|
44
|
+
description: ""
|
|
45
|
+
|
|
46
|
+
data:
|
|
47
|
+
collections:
|
|
48
|
+
- name: ""
|
|
49
|
+
operations: [] # CREATE | READ | UPDATE | DELETE
|
|
50
|
+
new_fields: [] # List new fields if schema changes
|
|
51
|
+
indexes: [] # List required Firestore indexes
|
|
52
|
+
|
|
53
|
+
acceptance_criteria:
|
|
54
|
+
- "[AC-1] User can..."
|
|
55
|
+
- "[AC-2] System validates..."
|
|
56
|
+
- "[AC-3] Error handling for..."
|
|
57
|
+
|
|
58
|
+
definition_of_done:
|
|
59
|
+
- "[ ] Code implemented and reviewed"
|
|
60
|
+
- "[ ] CI checks pass on PR"
|
|
61
|
+
- "[ ] Manual testing completed (required for local mode, optional for cloud mode unless requested)"
|
|
62
|
+
- "[ ] QA issues created on GitHub for this feature (atomic tests, labeled)"
|
|
63
|
+
- "[ ] docs/references/* updated (api-surface, data-model, ui-pages, project-status)"
|
|
64
|
+
- "[ ] No TypeScript errors (npm run build passes)"
|
|
65
|
+
- "[ ] PR opened and linked in notes (cloud mode)"
|
|
66
|
+
- "[ ] Seed script updated if needed"
|
|
67
|
+
|
|
68
|
+
tasks:
|
|
69
|
+
- id: 1
|
|
70
|
+
title: ""
|
|
71
|
+
status: TODO # TODO | IN_PROGRESS | DONE
|
|
72
|
+
assigned_to: null
|
|
73
|
+
- id: 2
|
|
74
|
+
title: ""
|
|
75
|
+
status: TODO
|
|
76
|
+
assigned_to: null
|
|
77
|
+
- id: 3
|
|
78
|
+
title: "Create QA GitHub issues for this feature (atomic tests + labels)"
|
|
79
|
+
status: TODO
|
|
80
|
+
assigned_to: null
|
|
81
|
+
|
|
82
|
+
unknowns:
|
|
83
|
+
- "[U-1] Question or unknown requirement"
|
|
84
|
+
- "[U-2] Technical decision needed"
|
|
85
|
+
|
|
86
|
+
assumptions:
|
|
87
|
+
- "[A-1] Assumption made with rationale"
|
|
88
|
+
|
|
89
|
+
blockers:
|
|
90
|
+
- "[B-1] Blocked by..."
|
|
91
|
+
|
|
92
|
+
handoff:
|
|
93
|
+
from: null
|
|
94
|
+
to: null
|
|
95
|
+
status: null # HANDOFF_READY | ACKNOWLEDGED | COMPLETE
|
|
96
|
+
summary: null
|
|
97
|
+
next_steps: []
|
|
98
|
+
|
|
99
|
+
ci_evidence:
|
|
100
|
+
pr_url: ""
|
|
101
|
+
required_checks: [] # build | test | lint | typecheck
|
|
102
|
+
status: "" # PASS | FAIL | PENDING
|
|
103
|
+
|
|
104
|
+
links:
|
|
105
|
+
spec: "" # Link to docs/specs/<feature-name>.md
|
|
106
|
+
related_features: [] # Links to related feature cards
|
|
107
|
+
project_md_sections: [] # Sections in docs/references this affects
|
|
108
|
+
|
|
109
|
+
notes: |
|
|
110
|
+
Additional context, decisions, or implementation notes.
|
|
111
|
+
|
|
112
|
+
# Checkpoint section for context window management (used by coder agent)
|
|
113
|
+
checkpoint:
|
|
114
|
+
timestamp: null # "YYYY-MM-DD HH:MM" when checkpoint was created
|
|
115
|
+
completed: [] # List of completed tasks/milestones
|
|
116
|
+
in_progress: null # Current task being worked on
|
|
117
|
+
next_action: null # Specific next step for resuming
|
|
118
|
+
files_modified: [] # Files changed in this session
|
|
119
|
+
build_status: null # PASS/FAIL from last build
|
|
120
|
+
context_for_resume: null # Essential info needed to resume work
|
|
121
|
+
|
|
122
|
+
metadata:
|
|
123
|
+
created: YYYY-MM-DD
|
|
124
|
+
updated: YYYY-MM-DD
|
|
125
|
+
estimated_effort: "" # S | M | L | XL
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# BALDART Skill Overlay Examples
|
|
2
|
+
|
|
3
|
+
This directory contains **reference overlays** distilled from a real project
|
|
4
|
+
(the multi-merchant "fidelity-app" Loyalty/CRM platform) that used to live
|
|
5
|
+
hard-coded inside BALDART skills before v3.0.0.
|
|
6
|
+
|
|
7
|
+
## How to use
|
|
8
|
+
|
|
9
|
+
1. Run `npx baldart configure` in your consumer repo — this generates
|
|
10
|
+
`baldart.config.yml`.
|
|
11
|
+
2. Copy any overlay example you want to adopt into
|
|
12
|
+
`.baldart/overlays/<skill-name>.md` (e.g.
|
|
13
|
+
`cp .framework/templates/overlays/ui-design.fidelity-example.md
|
|
14
|
+
.baldart/overlays/ui-design.md`).
|
|
15
|
+
3. Edit freely. The framework never touches `.baldart/overlays/` on update.
|
|
16
|
+
|
|
17
|
+
## Conventions
|
|
18
|
+
|
|
19
|
+
Every overlay file has YAML frontmatter:
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
---
|
|
23
|
+
base_skill: <skill-name> # MUST match the skill directory name
|
|
24
|
+
base_skill_version: <semver> # framework version when authored
|
|
25
|
+
mode: extend | override # default: extend
|
|
26
|
+
---
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Sections marked `## [OVERRIDE] <topic>` replace the same `<topic>` from the
|
|
30
|
+
base skill. Everything else extends the base.
|
|
31
|
+
|
|
32
|
+
Full protocol: [`framework/agents/project-context.md`](../../agents/project-context.md) § 5.
|
|
33
|
+
|
|
34
|
+
## Available examples
|
|
35
|
+
|
|
36
|
+
| File | Replaces hard-coded content from |
|
|
37
|
+
|------|------|
|
|
38
|
+
| `ui-design.fidelity-example.md` | Neo-Brutalism, Recharts/nivo charting stack, merchant theming pairing, Safari open command, evaluation thresholds |
|
|
39
|
+
| `copywriting.fidelity-example.md` | 4-pillar brand voice, Italian-only rule, segment register matrix (customer/merchant/staff/admin), forbidden vocabulary |
|
|
40
|
+
|
|
41
|
+
Other overlay examples may be added over time. Skills that did not have
|
|
42
|
+
heavy hard-coded opinions (e.g. `find-skills`, `simplify`) don't need
|
|
43
|
+
example overlays — write your own only when your project has
|
|
44
|
+
opinions to enforce.
|