feat(06-02): add sftp entry to registry, index, and rclone-conf

- Add sftp entry to BACKEND_REGISTRY with host, user, pass, key_pem fields
- Remove placeholder NOTE comment (sftp entry now present)
- Add sftp, onedrive, gcs, b2 to BACKEND_SCHEMAS in index.ts
- Add sftp, onedrive, gcs (google cloud storage), b2 to RCLONE_TYPE_MAP
- All 55 registry and rclone-conf tests pass; zero TypeScript errors
This commit is contained in:
2026-03-30 18:12:39 +02:00
parent 631470d5ac
commit c1d61d380c
3 changed files with 43 additions and 3 deletions
+4
View File
@@ -11,6 +11,10 @@ const RCLONE_TYPE_MAP: Record<string, string> = {
azureblob: 'azureblob',
s3: 's3',
's3-compatible': 's3',
onedrive: 'onedrive',
sftp: 'sftp',
gcs: 'google cloud storage',
b2: 'b2',
};
export function buildRcloneConf(state: WizardState): string {
+4
View File
@@ -21,5 +21,9 @@ export const BACKEND_SCHEMAS = {
azureblob: buildZodSchema('azureblob'),
s3: buildZodSchema('s3'),
's3-compatible': buildZodSchema('s3-compatible'),
onedrive: buildZodSchema('onedrive'),
sftp: buildZodSchema('sftp'),
gcs: buildZodSchema('gcs'),
b2: buildZodSchema('b2'),
} as const;
+35 -3
View File
@@ -16,9 +16,6 @@ export interface FieldDef {
options?: { value: string; label: string }[]; // for inputType: 'select'
}
// NOTE: 'sftp' entry is intentionally missing — Plan 02 (06-02-PLAN.md) adds it.
// The type cast below suppresses the incomplete-record error until that plan runs.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const BACKEND_REGISTRY = {
azureblob: {
displayName: 'Azure Blob Storage',
@@ -180,6 +177,41 @@ export const BACKEND_REGISTRY = {
},
],
},
sftp: {
displayName: 'SFTP',
description: 'SSH File Transfer Protocol',
fields: [
{
key: 'host',
label: 'Host',
inputType: 'text',
required: true,
placeholder: 'sftp.example.com',
helpText: 'The SSH server hostname or IP address',
},
{
key: 'user',
label: 'Username',
inputType: 'text',
required: true,
placeholder: 'admin',
},
{
key: 'pass',
label: 'Password',
inputType: 'password',
required: false,
helpText: 'SFTP password. Note: rclone may require the password to be obscured using `rclone obscure <password>`. If authentication fails, use the obscured value instead of the plain password.',
},
{
key: 'key_pem',
label: 'Private Key (PEM)',
inputType: 'password',
required: false,
helpText: 'Paste your private key in PEM format (-----BEGIN ... PRIVATE KEY-----)',
},
],
},
b2: {
displayName: 'Backblaze B2',
description: 'Backblaze B2 Cloud Storage',