Generate AI-assisted frontmatter field suggestions using para-obsidian LLM utilities. Demonstrates 3-layer architecture (constraints, prompt-builder, orchestration) for metadata extraction.
View on GitHubnathanvale/side-quest-marketplace
para-obsidian
February 4, 2026
Select agents to install to:
npx add-skill https://github.com/nathanvale/side-quest-marketplace/blob/main/plugins/para-obsidian/skills/field-suggestions/SKILL.md -a claude-code --skill field-suggestionsInstallation paths:
.claude/skills/field-suggestions/# Field Suggestions Skill
## Purpose
This skill demonstrates how to use the para-obsidian LLM utilities for AI-assisted field suggestions in custom slash commands. It shows how to leverage the 3-layer architecture (constraints, prompt-builder, orchestration) to build intelligent metadata extraction that respects vault context and frontmatter rules.
---
## Architecture Overview
The para-obsidian plugin provides a **3-layer LLM utility architecture** in `src/llm/`:
### Layer 1: Constraints (`constraints.ts`)
Deterministic extraction with enum/wikilink/vault context awareness:
- `buildConstraintSet()`: Converts template + frontmatter rules into LLM constraints
- Handles enums, wikilinks, validation rules, and vault context
- Ensures AI suggestions respect PARA structure and Dataview compatibility
### Layer 2: Prompt Builder (`prompt-builder.ts`)
Declarative, composable prompts:
- `buildStructuredPrompt()`: Assembles system role, task, content, constraints
- Separates concerns: what to extract vs how to format
- Reusable across different templates and use cases
### Layer 3: Orchestration (`orchestration.ts`)
High-level workflows:
- `suggestFieldValues()`: Single-field suggestions
- `convertNoteToTemplate()`: Full note conversion with validation
- `callOllama()`: LLM integration with error handling
- `parseOllamaResponse()`: Structured response parsing
---
## Usage Example
### Basic Field Suggestion (Single Field)
```typescript
import {
buildConstraintSet,
buildStructuredPrompt,
callOllama,
parseOllamaResponse,
type VaultContext
} from './llm';
import { getTemplate } from './templates';
import { loadConfig } from './config';
async function suggestProjectMetadata(
userTitle: string,
userDescription: string
): Promise<{ args: Record<string, unknown>; title: string }> {
// 1. Load config and template
const config = await loadConfig();
const template = getTemplate(config, 'project');
// 2. Build vault context (for wikilink validation)
co