@@ -370,6 +370,64 @@ export function generateSkills(
370370 } ) ,
371371 } ) ;
372372
373+ // Embedder reference (generated once when any table has Vector fields)
374+ const hasEmbeddings = tables . some ( ( t ) =>
375+ categorizeSpecialFields ( t , registry ) . some ( ( g ) => g . category === 'embedding' ) ,
376+ ) ;
377+ if ( hasEmbeddings ) {
378+ referenceNames . push ( 'embedder' ) ;
379+ files . push ( {
380+ fileName : `${ skillName } /references/embedder.md` ,
381+ content : buildSkillReference ( {
382+ title : 'Embedder Configuration' ,
383+ description :
384+ `Configure text-to-vector embedding for \`--auto-embed\` support in ${ toolName } .\n\n` +
385+ 'When an embedder is configured, you can pass plain text to vector fields and ' +
386+ 'the CLI will automatically convert it to an embedding vector.\n\n' +
387+ '**Supported providers:** ollama, openai\n\n' +
388+ '**Configuration methods:** appstash config (persisted per-context) or environment variables' ,
389+ usage : [
390+ `# Configure via appstash config (persisted per-context)` ,
391+ `${ toolName } config set embedder.provider <provider>` ,
392+ `${ toolName } config set embedder.model <model>` ,
393+ `${ toolName } config set embedder.baseUrl <url>` ,
394+ '' ,
395+ `# Or configure via environment variables` ,
396+ `EMBEDDER_PROVIDER=<provider> EMBEDDER_MODEL=<model> EMBEDDER_BASE_URL=<url> ${ toolName } <command>` ,
397+ ] ,
398+ examples : [
399+ {
400+ description : 'Ollama with nomic-embed-text (open-source, local)' ,
401+ code : [
402+ `# Start Ollama locally and pull the model` ,
403+ `ollama pull nomic-embed-text` ,
404+ '' ,
405+ `# Register the embedder` ,
406+ `${ toolName } config set embedder.provider ollama` ,
407+ `${ toolName } config set embedder.model nomic-embed-text` ,
408+ `${ toolName } config set embedder.baseUrl http://localhost:11434` ,
409+ '' ,
410+ `# Now use --auto-embed with any vector field` ,
411+ `${ toolName } ${ toKebabCase ( getTableNames ( tables [ 0 ] ) . singularName ) } search "my query" --auto-embed` ,
412+ ] ,
413+ } ,
414+ {
415+ description : 'OpenAI with an API key' ,
416+ code : [
417+ `# Register the embedder` ,
418+ `${ toolName } config set embedder.provider openai` ,
419+ `${ toolName } config set embedder.model text-embedding-3-small` ,
420+ `${ toolName } config set embedder.apiKey sk-proj-...your-api-key` ,
421+ '' ,
422+ `# Or use environment variables` ,
423+ `EMBEDDER_PROVIDER=openai EMBEDDER_MODEL=text-embedding-3-small EMBEDDER_API_KEY=sk-proj-...your-api-key ${ toolName } ${ toKebabCase ( getTableNames ( tables [ 0 ] ) . singularName ) } search "my query" --auto-embed` ,
424+ ] ,
425+ } ,
426+ ] ,
427+ } ) ,
428+ } ) ;
429+ }
430+
373431 // Table references
374432 for ( const table of tables ) {
375433 const { singularName } = getTableNames ( table ) ;
@@ -989,6 +1047,68 @@ export function generateMultiTargetSkills(
9891047 } ) ,
9901048 } ) ;
9911049
1050+ // Embedder reference (generated once when any target has tables with Vector fields)
1051+ const allTargetTables = targets . flatMap ( ( t ) => t . tables ) ;
1052+ const hasEmbeddings = allTargetTables . some ( ( t ) =>
1053+ categorizeSpecialFields ( t , registry ) . some ( ( g ) => g . category === 'embedding' ) ,
1054+ ) ;
1055+ if ( hasEmbeddings ) {
1056+ const firstTableName = allTargetTables . length > 0
1057+ ? toKebabCase ( getTableNames ( allTargetTables [ 0 ] ) . singularName )
1058+ : 'model' ;
1059+ commonReferenceNames . push ( 'embedder' ) ;
1060+ files . push ( {
1061+ fileName : `${ commonSkillName } /references/embedder.md` ,
1062+ content : buildSkillReference ( {
1063+ title : 'Embedder Configuration' ,
1064+ description :
1065+ `Configure text-to-vector embedding for \`--auto-embed\` support in ${ toolName } .\n\n` +
1066+ 'When an embedder is configured, you can pass plain text to vector fields and ' +
1067+ 'the CLI will automatically convert it to an embedding vector.\n\n' +
1068+ '**Supported providers:** ollama, openai\n\n' +
1069+ '**Configuration methods:** appstash config (persisted per-context) or environment variables' ,
1070+ usage : [
1071+ `# Configure via appstash config (persisted per-context)` ,
1072+ `${ toolName } ${ builtinNames . config } set embedder.provider <provider>` ,
1073+ `${ toolName } ${ builtinNames . config } set embedder.model <model>` ,
1074+ `${ toolName } ${ builtinNames . config } set embedder.baseUrl <url>` ,
1075+ '' ,
1076+ `# Or configure via environment variables` ,
1077+ `EMBEDDER_PROVIDER=<provider> EMBEDDER_MODEL=<model> EMBEDDER_BASE_URL=<url> ${ toolName } <command>` ,
1078+ ] ,
1079+ examples : [
1080+ {
1081+ description : 'Ollama with nomic-embed-text (open-source, local)' ,
1082+ code : [
1083+ `# Start Ollama locally and pull the model` ,
1084+ `ollama pull nomic-embed-text` ,
1085+ '' ,
1086+ `# Register the embedder` ,
1087+ `${ toolName } ${ builtinNames . config } set embedder.provider ollama` ,
1088+ `${ toolName } ${ builtinNames . config } set embedder.model nomic-embed-text` ,
1089+ `${ toolName } ${ builtinNames . config } set embedder.baseUrl http://localhost:11434` ,
1090+ '' ,
1091+ `# Now use --auto-embed with any vector field` ,
1092+ `${ toolName } ${ targets [ 0 ] ?. name ? `${ targets [ 0 ] . name } :` : '' } ${ firstTableName } search "my query" --auto-embed` ,
1093+ ] ,
1094+ } ,
1095+ {
1096+ description : 'OpenAI with an API key' ,
1097+ code : [
1098+ `# Register the embedder` ,
1099+ `${ toolName } ${ builtinNames . config } set embedder.provider openai` ,
1100+ `${ toolName } ${ builtinNames . config } set embedder.model text-embedding-3-small` ,
1101+ `${ toolName } ${ builtinNames . config } set embedder.apiKey sk-proj-...your-api-key` ,
1102+ '' ,
1103+ `# Or use environment variables` ,
1104+ `EMBEDDER_PROVIDER=openai EMBEDDER_MODEL=text-embedding-3-small EMBEDDER_API_KEY=sk-proj-...your-api-key ${ toolName } ${ targets [ 0 ] ?. name ? `${ targets [ 0 ] . name } :` : '' } ${ firstTableName } search "my query" --auto-embed` ,
1105+ ] ,
1106+ } ,
1107+ ] ,
1108+ } ) ,
1109+ } ) ;
1110+ }
1111+
9921112 // Common SKILL.md
9931113 files . push ( {
9941114 fileName : `${ commonSkillName } /SKILL.md` ,
0 commit comments