9.3 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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 02-generators | 01 | execute | 1 |
|
true |
|
|
Purpose: Nyquist rule — tests must exist before implementations. Plans 02, 03, 04 implement against these stubs. The barrel establishes the public API that Phase 4 will import from. Output: Four test files (RED), one barrel file, all four generator module paths defined.
<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/STATE.md@src/store/types.ts @src/schemas/registry.ts
From src/store/types.ts:
export interface WizardState {
currentStep: number;
remote: {
name: string;
backendType: BackendType | null;
params: Record<string, string>;
};
deployment: {
includeInstall: boolean;
configPath: 'machine-wide' | 'user-profile';
scriptTargets: ('intune' | 'rmm')[];
};
}
export const INITIAL_STATE: WizardState = {
currentStep: 0,
remote: { name: '', backendType: null, params: {} },
deployment: {
includeInstall: false,
configPath: 'machine-wide',
scriptTargets: ['intune', 'rmm'],
},
};
From src/schemas/registry.ts:
export type BackendType = 'azureblob' | 's3' | 's3-compatible';
intune-install.test.ts:
- imports buildIntuneInstall from './intune-install' (file does not exist yet — RED)
- machine-wide path: output contains 'C:\ProgramData\rclone'
- user-profile path: output contains '%APPDATA%\rclone'
- includeInstall=true: output contains 'https://downloads.rclone.org/rclone-current-windows-amd64.zip'
- includeInstall=false: output does NOT contain 'downloads.rclone.org'
- output contains '[System.IO.File]::WriteAllText' (UTF-8 no-BOM idiom present)
- output contains 'exit 0'
- output does NOT contain credential variable interpolation inside config content (no $account, $key inside here-string block)
intune-detection.test.ts:
- imports buildIntuneDetection from './intune-detection' (file does not exist yet — RED)
- machine-wide path: output contains 'C:\ProgramData\rclone'
- user-profile path: output contains '%APPDATA%\rclone'
- output contains 'exit 0' and 'exit 1'
- output contains 'Write-Output' (STDOUT signal)
- output does NOT contain '$ErrorActionPreference' (STDERR contamination risk)
- output does NOT contain 'Write-Error' or 'Write-Host' (no STDERR leakage)
rmm-script.test.ts:
- imports buildRmmScript from './rmm-script' (file does not exist yet — RED)
- machine-wide path: output contains 'C:\ProgramData\rclone'
- user-profile path: output contains '%APPDATA%\rclone'
- includeInstall=true: output contains 'https://downloads.rclone.org/rclone-current-windows-amd64.zip'
- includeInstall=false: output does NOT contain 'downloads.rclone.org'
- output contains '$ErrorActionPreference = ''Stop''' (RMM scripts DO use Stop — unlike detection)
- output contains '[System.IO.File]::WriteAllText' (UTF-8 no-BOM)
Representative fixture pattern (replicate across all four files):
```typescript
import { buildRcloneConf } from './rclone-conf';
import { INITIAL_STATE } from '../store/types';
import type { WizardState } from '../store/types';
const azureState: WizardState = {
...INITIAL_STATE,
remote: {
name: 'my-azure',
backendType: 'azureblob',
params: { account: 'mystorageaccount', key: 'BASE64KEY', sas_url: '' },
},
};
```
Tests will fail at import (module not found) until Plans 02-04 create implementations. This is intentional RED state. Vitest with passWithNoTests:true will still pass overall suite; individual test files will error. That is correct behavior for Wave 0 stubs.
Keep test descriptions concise and specific to the substring being asserted. No mocking needed — these are pure string functions.
Since the generator files don't exist yet, write the barrel with the final export shape. Vitest will see the import error from test files; the barrel itself need not be tested.
```typescript
// src/generators/index.ts
// Re-exports all generator functions.
// Phase 4 imports generators from this barrel — do not remove exports.
export { buildRcloneConf } from './rclone-conf';
export { buildIntuneInstall } from './intune-install';
export { buildIntuneDetection } from './intune-detection';
export { buildRmmScript } from './rmm-script';
```
No implementation logic in this file. The barrel is purely structural.
<success_criteria> Wave 0 is complete: test stubs define every assertion that Plans 02, 03, 04 must satisfy. The barrel defines the public API contract. No implementation exists yet — all generator imports are RED. </success_criteria>
After completion, create `.planning/phases/02-generators/02-01-SUMMARY.md`