Wave 0 TDD stubs, Wave 1 parallel (registry + ReviewStep), Wave 2 act() fix. Covers TECH-01 through TECH-05. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, requirements, must_haves
| phase | plan | type | wave | depends_on | files_modified | autonomous | requirements | must_haves | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 05-tech-debt | 01 | execute | 1 |
|
|
true |
|
|
Purpose: TECH-03 makes the registry the single source of truth for both field definitions AND display metadata — Phase 6 backend additions auto-surface with zero additional UI code. TECH-04 removes dead code. Output: registry.ts with new shape, BackendSelectionStep.tsx driven by registry, schemas/index.ts clean.
<execution_context> @C:/Users/SebastienQUEROL/.claude/get-shit-done/workflows/execute-plan.md @C:/Users/SebastienQUEROL/.claude/get-shit-done/templates/summary.md </execution_context>
@.planning/PROJECT.md @.planning/ROADMAP.md @.planning/phases/05-tech-debt/05-CONTEXT.md @.planning/phases/05-tech-debt/05-RESEARCH.md @.planning/phases/05-tech-debt/05-00-SUMMARY.mdFrom src/schemas/registry.ts (CURRENT shape — executor REPLACES this):
export type BackendType = 'azureblob' | 's3' | 's3-compatible';
export interface FieldDef { key, label, inputType, required, placeholder?, helpText?, options? }
export const BACKEND_REGISTRY: Record<BackendType, FieldDef[]> = { ... }
New shape (TECH-03 target):
export const BACKEND_REGISTRY: Record<BackendType, {
displayName: string;
description: string;
fields: FieldDef[];
}> = {
azureblob: {
displayName: 'Azure Blob Storage',
description: 'Microsoft Azure cloud storage',
fields: [ /* existing FieldDef[] content unchanged */ ],
},
s3: {
displayName: 'Amazon S3',
description: 'AWS Simple Storage Service',
fields: [ /* existing FieldDef[] content unchanged */ ],
},
's3-compatible': {
displayName: 'S3-Compatible',
description: 'Wasabi, MinIO, Cloudflare R2, and others',
fields: [ /* existing FieldDef[] content unchanged */ ],
},
};
Display strings MUST match existing BackendSelectionStep card text exactly (test assertions check these strings).
From src/schemas/index.ts line 10 (consumer 1 — must update):
const fields = BACKEND_REGISTRY[backendType]; // CHANGE TO: BACKEND_REGISTRY[backendType].fields
From src/components/wizard/RemoteConfigStep.tsx (consumers 2 and 3 — must update):
// Line 58: BACKEND_REGISTRY.azureblob.find(f => f.key === 'account')
// CHANGE TO: BACKEND_REGISTRY.azureblob.fields.find(f => f.key === 'account')
// Line 73: BACKEND_REGISTRY[backendType].map(field => ...)
// CHANGE TO: BACKEND_REGISTRY[backendType].fields.map(field => ...)
From src/components/wizard/BackendSelectionStep.tsx (TECH-03 — replace hardcoded BACKENDS):
// Remove: const BACKENDS: { type: BackendType; name: string; description: string }[] = [...]
// Replace rendering with:
import { BACKEND_REGISTRY } from '../../schemas/registry';
// ...
{Object.entries(BACKEND_REGISTRY).map(([type, entry]) => (
<BackendCard
key={type}
name={entry.displayName}
description={entry.description}
selected={state.remote.backendType === type}
onClick={() => handleCardClick(type as BackendType)}
/>
))}
From src/schemas/index.ts lines 27-28 (TECH-04 — remove entirely):
// REMOVE these two lines:
export type BackendFormValues<T extends BackendType> =
z.infer<typeof BACKEND_SCHEMAS[T]>;
2. Edit src/schemas/index.ts line 10:
- Change `const fields = BACKEND_REGISTRY[backendType];` to `const fields = BACKEND_REGISTRY[backendType].fields;`
3. Edit src/components/wizard/RemoteConfigStep.tsx:
- Line 58: Change `BACKEND_REGISTRY.azureblob.find(f => f.key === 'account')` to `BACKEND_REGISTRY.azureblob.fields.find(f => f.key === 'account')`
- Line 73: Change `BACKEND_REGISTRY[backendType].map(field =>` to `BACKEND_REGISTRY[backendType].fields.map(field =>`
2. Edit src/schemas/index.ts:
- Remove lines 27-28: the `export type BackendFormValues<T extends BackendType> = z.infer<typeof BACKEND_SCHEMAS[T]>;` export
- Also remove the blank comment line above it (line 26: `// Utility type: infer TypeScript type from a backend's Zod schema`) to avoid orphan comment
3. Run TypeScript check to confirm no consumers of BackendFormValues exist:
`npx tsc --noEmit`
<success_criteria>
- BACKEND_REGISTRY shape is
Record<BackendType, { displayName, description, fields: FieldDef[] }> - BackendSelectionStep uses
Object.entries(BACKEND_REGISTRY)— no hardcoded BACKENDS array - schemas/index.ts uses
.fieldsaccess and has no BackendFormValues export - RemoteConfigStep uses
.fieldsaccess - registry.test.ts fully green
- BackendSelectionStep.test.tsx fully green
- npx tsc --noEmit: zero errors </success_criteria>