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.
Files changed (230) hide show
  1. package/CHANGELOG.md +599 -0
  2. package/README.md +566 -0
  3. package/VERSION +1 -0
  4. package/bin/baldart.js +143 -0
  5. package/framework/.claude/agents/REGISTRY.md +169 -0
  6. package/framework/.claude/agents/api-perf-cost-auditor.md +291 -0
  7. package/framework/.claude/agents/code-reviewer.md +350 -0
  8. package/framework/.claude/agents/codebase-architect.md +391 -0
  9. package/framework/.claude/agents/coder.md +291 -0
  10. package/framework/.claude/agents/deep-human-insight.md +198 -0
  11. package/framework/.claude/agents/doc-reviewer.md +440 -0
  12. package/framework/.claude/agents/email-deliverability-architect.md +193 -0
  13. package/framework/.claude/agents/hybrid-ml-architect.md +285 -0
  14. package/framework/.claude/agents/hyper-gamification-designer.md +149 -0
  15. package/framework/.claude/agents/legal-counsel-gdpr.md +179 -0
  16. package/framework/.claude/agents/marketing-conversion-strategist.md +162 -0
  17. package/framework/.claude/agents/motion-expert.md +108 -0
  18. package/framework/.claude/agents/onboarding-architect-lead.md +230 -0
  19. package/framework/.claude/agents/plan-auditor.md +546 -0
  20. package/framework/.claude/agents/prd-card-writer.md +372 -0
  21. package/framework/.claude/agents/prd.md +744 -0
  22. package/framework/.claude/agents/qa-sentinel.md +305 -0
  23. package/framework/.claude/agents/remotion-animator-orchestrator.md +218 -0
  24. package/framework/.claude/agents/security-reviewer.md +276 -0
  25. package/framework/.claude/agents/senior-researcher.md +175 -0
  26. package/framework/.claude/agents/seo-analytics-strategist.md +156 -0
  27. package/framework/.claude/agents/skill-improver.md +61 -0
  28. package/framework/.claude/agents/ui-expert.md +191 -0
  29. package/framework/.claude/agents/visual-designer.md +190 -0
  30. package/framework/.claude/agents/website-orchestrator.md +118 -0
  31. package/framework/.claude/agents/wiki-curator.md +145 -0
  32. package/framework/.claude/commands/baldart-push.md +15 -0
  33. package/framework/.claude/commands/check.md +237 -0
  34. package/framework/.claude/commands/codexreview.md +203 -0
  35. package/framework/.claude/commands/design-review.md +11 -0
  36. package/framework/.claude/commands/issue-review.md +34 -0
  37. package/framework/.claude/commands/new.md +331 -0
  38. package/framework/.claude/commands/qa.md +257 -0
  39. package/framework/.claude/hooks/framework-edit-gate.js +208 -0
  40. package/framework/.claude/hooks/lint-before-commit.sh.template +66 -0
  41. package/framework/.claude/settings.local.json.example +32 -0
  42. package/framework/.claude/skills/api-design-principles/SKILL.md +567 -0
  43. package/framework/.claude/skills/api-design-principles/assets/api-design-checklist.md +155 -0
  44. package/framework/.claude/skills/api-design-principles/assets/rest-api-template.py +182 -0
  45. package/framework/.claude/skills/api-design-principles/references/graphql-schema-design.md +583 -0
  46. package/framework/.claude/skills/api-design-principles/references/rest-best-practices.md +408 -0
  47. package/framework/.claude/skills/baldart-push/SKILL.md +222 -0
  48. package/framework/.claude/skills/bug/SKILL.md +200 -0
  49. package/framework/.claude/skills/bug/references/logging-patterns.md +174 -0
  50. package/framework/.claude/skills/capture/SKILL.md +125 -0
  51. package/framework/.claude/skills/capture/references/synthesis-template.md +42 -0
  52. package/framework/.claude/skills/context-primer/SKILL.md +189 -0
  53. package/framework/.claude/skills/copywriting/SKILL.md +273 -0
  54. package/framework/.claude/skills/copywriting/references/copy-frameworks.md +338 -0
  55. package/framework/.claude/skills/copywriting/references/natural-transitions.md +252 -0
  56. package/framework/.claude/skills/doc-writing-for-rag/SKILL.md +119 -0
  57. package/framework/.claude/skills/doc-writing-for-rag/references/before-after-examples.md +291 -0
  58. package/framework/.claude/skills/doc-writing-for-rag/references/compact-templates.md +183 -0
  59. package/framework/.claude/skills/doc-writing-for-rag/references/frontmatter-minimal.md +112 -0
  60. package/framework/.claude/skills/doc-writing-for-rag/references/line-count-targets.md +110 -0
  61. package/framework/.claude/skills/doc-writing-for-rag/references/schemas-and-errors.md +129 -0
  62. package/framework/.claude/skills/find-skills/SKILL.md +133 -0
  63. package/framework/.claude/skills/frontend-design/LICENSE.txt +177 -0
  64. package/framework/.claude/skills/frontend-design/SKILL.md +84 -0
  65. package/framework/.claude/skills/gamification-design/SKILL.md +130 -0
  66. package/framework/.claude/skills/issue-review/SKILL.md +45 -0
  67. package/framework/.claude/skills/kie-ai/SKILL.md +262 -0
  68. package/framework/.claude/skills/kie-ai/references/models-catalog.md +272 -0
  69. package/framework/.claude/skills/kie-ai/scripts/kie_api.sh +209 -0
  70. package/framework/.claude/skills/kie-ai/scripts/remove_greenscreen.py +69 -0
  71. package/framework/.claude/skills/kie-ai/scripts/setup_api_key.sh +77 -0
  72. package/framework/.claude/skills/motion-design/LICENSE +21 -0
  73. package/framework/.claude/skills/motion-design/README.md +82 -0
  74. package/framework/.claude/skills/motion-design/SKILL.md +336 -0
  75. package/framework/.claude/skills/motion-design/director/choreography.md +93 -0
  76. package/framework/.claude/skills/motion-design/director/context-adaptation.md +83 -0
  77. package/framework/.claude/skills/motion-design/director/core-philosophy.md +53 -0
  78. package/framework/.claude/skills/motion-design/director/decision-framework.md +91 -0
  79. package/framework/.claude/skills/motion-design/director/disney-principles.md +102 -0
  80. package/framework/.claude/skills/motion-design/director/emotion-mapping.md +71 -0
  81. package/framework/.claude/skills/motion-design/director/motion-personality.md +89 -0
  82. package/framework/.claude/skills/motion-design/director/narrative-structure.md +62 -0
  83. package/framework/.claude/skills/motion-design/patterns/ambient-continuous.md +81 -0
  84. package/framework/.claude/skills/motion-design/patterns/entrance-exit.md +82 -0
  85. package/framework/.claude/skills/motion-design/patterns/multi-element.md +69 -0
  86. package/framework/.claude/skills/motion-design/patterns/state-feedback.md +96 -0
  87. package/framework/.claude/skills/motion-design/reference/property-selection.md +95 -0
  88. package/framework/.claude/skills/motion-design/reference/quality-checklist.md +67 -0
  89. package/framework/.claude/skills/motion-design/reference/timing-easing-tables.md +106 -0
  90. package/framework/.claude/skills/motion-design/reference/troubleshooting.md +73 -0
  91. package/framework/.claude/skills/new/SKILL.md +1687 -0
  92. package/framework/.claude/skills/playwright-skill/API_REFERENCE.md +652 -0
  93. package/framework/.claude/skills/playwright-skill/SKILL.md +157 -0
  94. package/framework/.claude/skills/playwright-skill/package.json +26 -0
  95. package/framework/.claude/skills/prd/SKILL.md +228 -0
  96. package/framework/.claude/skills/prd/assets/card-template.yml +232 -0
  97. package/framework/.claude/skills/prd/assets/epic-template.yml +190 -0
  98. package/framework/.claude/skills/prd/assets/prd-template.md +230 -0
  99. package/framework/.claude/skills/prd/assets/state-template.md +78 -0
  100. package/framework/.claude/skills/prd/references/api-perf-gate.md +152 -0
  101. package/framework/.claude/skills/prd/references/audit-phase.md +478 -0
  102. package/framework/.claude/skills/prd/references/backlog-phase.md +145 -0
  103. package/framework/.claude/skills/prd/references/discovery-phase.md +359 -0
  104. package/framework/.claude/skills/prd/references/impact-analysis.md +233 -0
  105. package/framework/.claude/skills/prd/references/prd-add-phase.md +214 -0
  106. package/framework/.claude/skills/prd/references/prd-writing-phase.md +145 -0
  107. package/framework/.claude/skills/prd/references/research-phase.md +216 -0
  108. package/framework/.claude/skills/prd/references/ui-design-phase.md +61 -0
  109. package/framework/.claude/skills/prd/references/validation-phase.md +72 -0
  110. package/framework/.claude/skills/prd-add/SKILL.md +222 -0
  111. package/framework/.claude/skills/prd-add/references/impact-analysis.md +233 -0
  112. package/framework/.claude/skills/remotion-best-practices/SKILL.md +48 -0
  113. package/framework/.claude/skills/remotion-best-practices/rules/3d.md +86 -0
  114. package/framework/.claude/skills/remotion-best-practices/rules/animations.md +29 -0
  115. package/framework/.claude/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  116. package/framework/.claude/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  117. package/framework/.claude/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
  118. package/framework/.claude/skills/remotion-best-practices/rules/assets.md +78 -0
  119. package/framework/.claude/skills/remotion-best-practices/rules/audio.md +169 -0
  120. package/framework/.claude/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
  121. package/framework/.claude/skills/remotion-best-practices/rules/can-decode.md +75 -0
  122. package/framework/.claude/skills/remotion-best-practices/rules/charts.md +58 -0
  123. package/framework/.claude/skills/remotion-best-practices/rules/compositions.md +141 -0
  124. package/framework/.claude/skills/remotion-best-practices/rules/display-captions.md +184 -0
  125. package/framework/.claude/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  126. package/framework/.claude/skills/remotion-best-practices/rules/fonts.md +152 -0
  127. package/framework/.claude/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  128. package/framework/.claude/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  129. package/framework/.claude/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
  130. package/framework/.claude/skills/remotion-best-practices/rules/gifs.md +141 -0
  131. package/framework/.claude/skills/remotion-best-practices/rules/images.md +130 -0
  132. package/framework/.claude/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
  133. package/framework/.claude/skills/remotion-best-practices/rules/light-leaks.md +73 -0
  134. package/framework/.claude/skills/remotion-best-practices/rules/lottie.md +67 -0
  135. package/framework/.claude/skills/remotion-best-practices/rules/maps.md +401 -0
  136. package/framework/.claude/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
  137. package/framework/.claude/skills/remotion-best-practices/rules/measuring-text.md +143 -0
  138. package/framework/.claude/skills/remotion-best-practices/rules/parameters.md +98 -0
  139. package/framework/.claude/skills/remotion-best-practices/rules/sequencing.md +118 -0
  140. package/framework/.claude/skills/remotion-best-practices/rules/subtitles.md +36 -0
  141. package/framework/.claude/skills/remotion-best-practices/rules/tailwind.md +11 -0
  142. package/framework/.claude/skills/remotion-best-practices/rules/text-animations.md +20 -0
  143. package/framework/.claude/skills/remotion-best-practices/rules/timing.md +179 -0
  144. package/framework/.claude/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
  145. package/framework/.claude/skills/remotion-best-practices/rules/transitions.md +197 -0
  146. package/framework/.claude/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
  147. package/framework/.claude/skills/remotion-best-practices/rules/trimming.md +52 -0
  148. package/framework/.claude/skills/remotion-best-practices/rules/videos.md +171 -0
  149. package/framework/.claude/skills/seo-audit/SKILL.md +394 -0
  150. package/framework/.claude/skills/seo-audit/references/aeo-geo-patterns.md +279 -0
  151. package/framework/.claude/skills/seo-audit/references/ai-writing-detection.md +190 -0
  152. package/framework/.claude/skills/simplify/SKILL.md +137 -0
  153. package/framework/.claude/skills/skill-creator/LICENSE.txt +202 -0
  154. package/framework/.claude/skills/skill-creator/SKILL.md +356 -0
  155. package/framework/.claude/skills/skill-creator/references/output-patterns.md +82 -0
  156. package/framework/.claude/skills/skill-creator/references/workflows.md +28 -0
  157. package/framework/.claude/skills/skill-creator/scripts/init_skill.py +303 -0
  158. package/framework/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
  159. package/framework/.claude/skills/skill-creator/scripts/quick_validate.py +95 -0
  160. package/framework/.claude/skills/ui-design/SKILL.md +199 -0
  161. package/framework/.claude/skills/ui-design/references/component-discovery.md +54 -0
  162. package/framework/.claude/skills/ui-design/references/evaluation.md +171 -0
  163. package/framework/.claude/skills/ui-design/references/generation.md +109 -0
  164. package/framework/.claude/skills/ui-design/references/inventory.md +59 -0
  165. package/framework/.claude/skills/webapp-testing/LICENSE.txt +202 -0
  166. package/framework/.claude/skills/webapp-testing/SKILL.md +123 -0
  167. package/framework/.claude/skills/webapp-testing/examples/console_logging.py +35 -0
  168. package/framework/.claude/skills/webapp-testing/examples/element_discovery.py +40 -0
  169. package/framework/.claude/skills/webapp-testing/examples/static_html_automation.py +33 -0
  170. package/framework/.claude/skills/webapp-testing/scripts/with_server.py +106 -0
  171. package/framework/.claude/skills/worktree-manager/SKILL.md +680 -0
  172. package/framework/AGENTS.md +240 -0
  173. package/framework/agents/api-contracts.md +137 -0
  174. package/framework/agents/architecture.md +145 -0
  175. package/framework/agents/coding-standards.md +148 -0
  176. package/framework/agents/data-model.md +110 -0
  177. package/framework/agents/deployment-protocol.md +232 -0
  178. package/framework/agents/design-review.md +172 -0
  179. package/framework/agents/env-reference.md +171 -0
  180. package/framework/agents/github-issue-subagent.md +252 -0
  181. package/framework/agents/index.md +261 -0
  182. package/framework/agents/llm-wiki-methodology.md +216 -0
  183. package/framework/agents/maintenance-protocol.md +305 -0
  184. package/framework/agents/observability.md +162 -0
  185. package/framework/agents/performance.md +155 -0
  186. package/framework/agents/project-context.md +145 -0
  187. package/framework/agents/runbook.md +208 -0
  188. package/framework/agents/security.md +168 -0
  189. package/framework/agents/skills-mapping.md +286 -0
  190. package/framework/agents/testing.md +111 -0
  191. package/framework/agents/workflows.md +215 -0
  192. package/framework/docs/PROJECT-CONFIGURATION.md +336 -0
  193. package/framework/docs/references/brand-guidelines.md +170 -0
  194. package/framework/docs/references/ui-guidelines.template.md +182 -0
  195. package/framework/routines/code-review.routine.yml +46 -0
  196. package/framework/routines/doc-review.routine.yml +45 -0
  197. package/framework/routines/ds-drift.routine.yml +52 -0
  198. package/framework/routines/full-sweep.routine.yml +51 -0
  199. package/framework/routines/index.yml +70 -0
  200. package/framework/routines/skill-improve.routine.yml +50 -0
  201. package/framework/routines/wiki-review.routine.yml +45 -0
  202. package/framework/templates/baldart.config.template.yml +113 -0
  203. package/framework/templates/breaking-change-checklist.md +484 -0
  204. package/framework/templates/feature-card.template.yml +125 -0
  205. package/framework/templates/overlays/README.md +44 -0
  206. package/framework/templates/overlays/copywriting.fidelity-example.md +62 -0
  207. package/framework/templates/overlays/ui-design.fidelity-example.md +75 -0
  208. package/framework/templates/skill-project-context.snippet.md +19 -0
  209. package/framework/templates/spec.template.md +208 -0
  210. package/package.json +51 -0
  211. package/src/commands/add.js +229 -0
  212. package/src/commands/configure.js +385 -0
  213. package/src/commands/doctor.js +486 -0
  214. package/src/commands/migrate.js +185 -0
  215. package/src/commands/push.js +0 -0
  216. package/src/commands/routines.js +269 -0
  217. package/src/commands/status.js +130 -0
  218. package/src/commands/update.js +419 -0
  219. package/src/commands/version.js +88 -0
  220. package/src/utils/contamination.js +400 -0
  221. package/src/utils/git.js +181 -0
  222. package/src/utils/hooks.js +152 -0
  223. package/src/utils/routine-adapters/claude-code-cloud.js +78 -0
  224. package/src/utils/routine-adapters/cron.js +138 -0
  225. package/src/utils/routine-adapters/github-actions.js +141 -0
  226. package/src/utils/routine-adapters/index.js +21 -0
  227. package/src/utils/routines.js +166 -0
  228. package/src/utils/state.js +143 -0
  229. package/src/utils/symlinks.js +425 -0
  230. 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.