promptopskit 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/parser/parser.ts","../../src/schema/schema.ts","../../src/parser/sections.ts","../../src/parser/loader.ts","../../src/renderer/interpolate.ts","../../src/validation/levenshtein.ts","../../src/validation/validate.ts","../../src/cli/commands/compile.ts","../../src/cli/commands/render.ts","../../src/overrides/apply-overrides.ts","../../src/cli/commands/inspect.ts","../../src/cli/commands/init.ts","../../src/cli/index.ts"],"sourcesContent":["import { readdir, readFile } from 'node:fs/promises';\r\nimport { join, extname } from 'node:path';\r\nimport { parsePrompt } from '../../parser/index.js';\r\nimport { validateAsset } from '../../validation/index.js';\r\n\r\nconst HELP = `\r\npromptopskit validate <dir>\r\n\r\nValidate all prompt .md files in a directory.\r\n\r\nOptions:\r\n --strict Treat warnings as errors\r\n --help, -h Show this help\r\n`.trim();\r\n\r\nexport async function validate(args: string[]): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n console.log(HELP);\r\n return;\r\n }\r\n\r\n const dir = args.find((a) => !a.startsWith('--'));\r\n if (!dir) {\r\n console.error('Error: Please provide a directory to validate.');\r\n process.exit(1);\r\n }\r\n\r\n const strict = args.includes('--strict');\r\n const files = await collectPromptFiles(dir);\r\n\r\n if (files.length === 0) {\r\n console.log(`No .md prompt files found in ${dir}`);\r\n return;\r\n }\r\n\r\n let errorCount = 0;\r\n let warnCount = 0;\r\n\r\n for (const file of files) {\r\n try {\r\n const content = await readFile(file, 'utf-8');\r\n const { asset, raw } = parsePrompt(content, file);\r\n const result = validateAsset(asset, Object.keys(raw.frontMatter), file);\r\n\r\n if (result.errors.length > 0) {\r\n errorCount += result.errors.length;\r\n console.error(` ✗ ${file}`);\r\n for (const err of result.errors) {\r\n console.error(` ${err.code}: ${err.message}`);\r\n }\r\n } else {\r\n console.log(` ✓ ${file}`);\r\n }\r\n\r\n if (result.warnings.length > 0) {\r\n warnCount += result.warnings.length;\r\n for (const warn of result.warnings) {\r\n const suggestion = warn.suggestion ? ` (${warn.suggestion})` : '';\r\n console.warn(` ⚠ ${warn.code}: ${warn.message}${suggestion}`);\r\n }\r\n }\r\n } catch (err) {\r\n errorCount++;\r\n const message = err instanceof Error ? err.message : String(err);\r\n console.error(` ✗ ${file}`);\r\n console.error(` ${message}`);\r\n }\r\n }\r\n\r\n console.log();\r\n console.log(`Validated ${files.length} file(s): ${errorCount} error(s), ${warnCount} warning(s)`);\r\n\r\n if (errorCount > 0 || (strict && warnCount > 0)) {\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function collectPromptFiles(dir: string): Promise<string[]> {\r\n const results: string[] = [];\r\n const entries = await readdir(dir, { withFileTypes: true, recursive: true });\r\n for (const entry of entries) {\r\n if (entry.isFile() && extname(entry.name) === '.md' && !entry.name.endsWith('.test.md')) {\r\n results.push(join(entry.parentPath ?? dir, entry.name));\r\n }\r\n }\r\n return results.sort();\r\n}\r\n","import matter from 'gray-matter';\r\nimport { PromptAssetSchema } from '../schema/index.js';\r\nimport type { PromptAsset } from '../schema/index.js';\r\nimport { extractSections } from './sections.js';\r\n\r\nexport interface ParseResult {\r\n asset: PromptAsset;\r\n raw: {\r\n frontMatter: Record<string, unknown>;\r\n body: string;\r\n };\r\n}\r\n\r\n/**\r\n * Parse a prompt markdown string (YAML front matter + markdown body)\r\n * into a validated PromptAsset.\r\n */\r\nexport function parsePrompt(content: string, filePath?: string): ParseResult {\r\n const { data: frontMatter, content: body } = matter(content);\r\n\r\n const sections = extractSections(body);\r\n\r\n const raw = {\r\n ...frontMatter,\r\n sections,\r\n source: filePath ? { file_path: filePath } : undefined,\r\n };\r\n\r\n const asset = PromptAssetSchema.parse(raw);\r\n\r\n return {\r\n asset,\r\n raw: {\r\n frontMatter: frontMatter as Record<string, unknown>,\r\n body,\r\n },\r\n };\r\n}\r\n","import { z } from 'zod';\r\n\r\n// --- Tool definitions ---\r\n\r\nexport const InlineToolDefSchema = z.object({\r\n name: z.string(),\r\n description: z.string().optional(),\r\n input_schema: z.record(z.unknown()).optional(),\r\n});\r\n\r\nexport type InlineToolDef = z.infer<typeof InlineToolDefSchema>;\r\n\r\nexport const ToolRefSchema = z.union([z.string(), InlineToolDefSchema]);\r\n\r\n// --- MCP ---\r\n\r\nexport const MCPServerRefSchema = z.union([\r\n z.string(),\r\n z.object({\r\n name: z.string(),\r\n config: z.record(z.unknown()).optional(),\r\n }),\r\n]);\r\n\r\nexport type MCPServerRef = z.infer<typeof MCPServerRefSchema>;\r\n\r\n// --- Reasoning ---\r\n\r\nexport const ReasoningSchema = z.object({\r\n effort: z.enum(['low', 'medium', 'high']).optional(),\r\n budget_tokens: z.number().int().positive().optional(),\r\n});\r\n\r\n// --- Sampling ---\r\n\r\nexport const SamplingSchema = z.object({\r\n temperature: z.number().min(0).max(2).optional(),\r\n top_p: z.number().min(0).max(1).optional(),\r\n frequency_penalty: z.number().optional(),\r\n presence_penalty: z.number().optional(),\r\n stop: z.array(z.string()).optional(),\r\n max_output_tokens: z.number().int().positive().optional(),\r\n});\r\n\r\n// --- Response ---\r\n\r\nexport const ResponseSchema = z.object({\r\n format: z.enum(['text', 'json', 'markdown']).optional(),\r\n stream: z.boolean().optional(),\r\n});\r\n\r\n// --- Context ---\r\n\r\nexport const HistorySchema = z.object({\r\n max_items: z.number().int().positive().optional(),\r\n});\r\n\r\nexport const ContextSchema = z.object({\r\n inputs: z.array(z.string()).optional(),\r\n history: HistorySchema.optional(),\r\n});\r\n\r\n// --- Metadata ---\r\n\r\nexport const MetadataSchema = z.object({\r\n owner: z.string().optional(),\r\n tags: z.array(z.string()).optional(),\r\n review_required: z.boolean().optional(),\r\n stable: z.boolean().optional(),\r\n});\r\n\r\n// --- MCP block ---\r\n\r\nexport const MCPSchema = z.object({\r\n servers: z.array(MCPServerRefSchema).optional(),\r\n});\r\n\r\n// --- Overrides (subset allowed in environments/tiers) ---\r\n\r\nexport const PromptAssetOverridesSchema = z.object({\r\n model: z.string().optional(),\r\n fallback_models: z.array(z.string()).optional(),\r\n reasoning: ReasoningSchema.optional(),\r\n sampling: SamplingSchema.optional(),\r\n response: ResponseSchema.optional(),\r\n tools: z.array(ToolRefSchema).optional(),\r\n});\r\n\r\nexport type PromptAssetOverrides = z.infer<typeof PromptAssetOverridesSchema>;\r\n\r\n// --- Source tracking ---\r\n\r\nexport const SourceSchema = z.object({\r\n file_path: z.string().optional(),\r\n checksum: z.string().optional(),\r\n});\r\n\r\n// --- Sections (populated by parser) ---\r\n\r\nexport const SectionsSchema = z.object({\r\n system_instructions: z.string().optional(),\r\n prompt_template: z.string().optional(),\r\n notes: z.string().optional(),\r\n});\r\n\r\n// --- Top-level PromptAsset ---\r\n\r\nexport const PromptAssetSchema = z.object({\r\n id: z.string(),\r\n schema_version: z.number().int().positive().default(1),\r\n description: z.string().optional(),\r\n\r\n provider: z.enum(['openai', 'anthropic', 'google', 'openrouter', 'any']).optional(),\r\n model: z.string().optional(),\r\n fallback_models: z.array(z.string()).optional(),\r\n\r\n reasoning: ReasoningSchema.optional(),\r\n sampling: SamplingSchema.optional(),\r\n response: ResponseSchema.optional(),\r\n\r\n tools: z.array(ToolRefSchema).optional(),\r\n mcp: MCPSchema.optional(),\r\n\r\n context: ContextSchema.optional(),\r\n\r\n includes: z.array(z.string()).optional(),\r\n\r\n environments: z.record(PromptAssetOverridesSchema).optional(),\r\n tiers: z.record(PromptAssetOverridesSchema).optional(),\r\n\r\n metadata: MetadataSchema.optional(),\r\n\r\n // Populated by parser, not authored in YAML\r\n sections: SectionsSchema.optional(),\r\n source: SourceSchema.optional(),\r\n});\r\n\r\nexport type PromptAsset = z.infer<typeof PromptAssetSchema>;\r\n\r\n// --- Resolved asset (after includes, overrides applied) ---\r\n\r\nexport interface ResolvedPromptAsset extends PromptAsset {\r\n sections: {\r\n system_instructions?: string;\r\n prompt_template?: string;\r\n notes?: string;\r\n };\r\n source: {\r\n file_path?: string;\r\n checksum?: string;\r\n };\r\n}\r\n","export interface Sections {\r\n system_instructions?: string;\r\n prompt_template?: string;\r\n notes?: string;\r\n}\r\n\r\nconst SECTION_MAP: Record<string, keyof Sections> = {\r\n 'system instructions': 'system_instructions',\r\n 'prompt template': 'prompt_template',\r\n 'notes': 'notes',\r\n};\r\n\r\n/**\r\n * Extract named sections from the markdown body using H1 headings.\r\n * Case-insensitive. H2+ within a section is treated as content.\r\n * If no H1 headings are found, the entire body is treated as prompt_template.\r\n */\r\nexport function extractSections(body: string): Sections {\r\n const lines = body.split('\\n');\r\n const sections: Sections = {};\r\n\r\n let currentKey: keyof Sections | null = null;\r\n let currentLines: string[] = [];\r\n let foundAnyH1 = false;\r\n\r\n for (const line of lines) {\r\n const h1Match = line.match(/^#\\s+(.+)$/);\r\n if (h1Match) {\r\n // Flush previous section\r\n if (currentKey) {\r\n sections[currentKey] = currentLines.join('\\n').trim();\r\n }\r\n\r\n foundAnyH1 = true;\r\n const heading = h1Match[1].trim().toLowerCase();\r\n currentKey = SECTION_MAP[heading] ?? null;\r\n currentLines = [];\r\n } else {\r\n currentLines.push(line);\r\n }\r\n }\r\n\r\n // Flush last section\r\n if (currentKey) {\r\n sections[currentKey] = currentLines.join('\\n').trim();\r\n }\r\n\r\n // If no H1 headings found, treat entire body as prompt_template\r\n if (!foundAnyH1) {\r\n const trimmed = body.trim();\r\n if (trimmed) {\r\n sections.prompt_template = trimmed;\r\n }\r\n }\r\n\r\n return sections;\r\n}\r\n","import { readFile } from 'node:fs/promises';\r\nimport { parsePrompt } from './parser.js';\r\nimport type { ParseResult } from './parser.js';\r\n\r\n/**\r\n * Load and parse a prompt file from disk.\r\n */\r\nexport async function loadPromptFile(filePath: string): Promise<ParseResult> {\r\n const content = await readFile(filePath, 'utf-8');\r\n return parsePrompt(content, filePath);\r\n}\r\n","export interface InterpolateOptions {\r\n strict?: boolean;\r\n}\r\n\r\nconst VARIABLE_RE = /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\}\\}/g;\r\nconst ESCAPED_OPEN = /\\\\\\{\\\\\\{/g;\r\nconst ESCAPE_PLACEHOLDER = '\\x00ESCAPED_OPEN\\x00';\r\n\r\n/**\r\n * Interpolate variables into a template string.\r\n *\r\n * Syntax: {{ variable_name }}\r\n * Escape: \\{\\{ produces literal {{\r\n *\r\n * In strict mode, throws on missing variables.\r\n * In permissive mode, leaves {{ placeholder }} intact.\r\n */\r\nexport function interpolate(\r\n template: string,\r\n variables: Record<string, string>,\r\n options: InterpolateOptions = {},\r\n): string {\r\n const { strict = false } = options;\r\n\r\n // Replace escaped sequences with placeholder\r\n let result = template.replace(ESCAPED_OPEN, ESCAPE_PLACEHOLDER);\r\n\r\n result = result.replace(VARIABLE_RE, (match, name: string) => {\r\n if (name in variables) {\r\n return variables[name];\r\n }\r\n if (strict) {\r\n throw new Error(`Missing required variable: \"${name}\"`);\r\n }\r\n return match; // leave placeholder intact in permissive mode\r\n });\r\n\r\n // Restore escaped sequences\r\n result = result.replaceAll(ESCAPE_PLACEHOLDER, '{{');\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Extract all variable names referenced in a template.\r\n */\r\nexport function extractVariables(template: string): string[] {\r\n const vars = new Set<string>();\r\n let match: RegExpExecArray | null;\r\n const re = new RegExp(VARIABLE_RE.source, 'g');\r\n while ((match = re.exec(template)) !== null) {\r\n vars.add(match[1]);\r\n }\r\n return [...vars];\r\n}\r\n","/**\r\n * Compute the Levenshtein distance between two strings.\r\n * Used for \"did you mean?\" suggestions on unknown fields.\r\n */\r\nexport function levenshtein(a: string, b: string): number {\r\n const m = a.length;\r\n const n = b.length;\r\n\r\n if (m === 0) return n;\r\n if (n === 0) return m;\r\n\r\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0) as number[]);\r\n\r\n for (let i = 0; i <= m; i++) dp[i][0] = i;\r\n for (let j = 0; j <= n; j++) dp[0][j] = j;\r\n\r\n for (let i = 1; i <= m; i++) {\r\n for (let j = 1; j <= n; j++) {\r\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\r\n dp[i][j] = Math.min(\r\n dp[i - 1][j] + 1,\r\n dp[i][j - 1] + 1,\r\n dp[i - 1][j - 1] + cost,\r\n );\r\n }\r\n }\r\n\r\n return dp[m][n];\r\n}\r\n","import { PromptAssetSchema } from '../schema/index.js';\r\nimport type { PromptAsset } from '../schema/index.js';\r\nimport { extractVariables } from '../renderer/index.js';\r\nimport { levenshtein } from './levenshtein.js';\r\n\r\nexport interface ValidationError {\r\n code: string;\r\n message: string;\r\n filePath?: string;\r\n suggestion?: string;\r\n}\r\n\r\nexport interface PromptValidationResult {\r\n valid: boolean;\r\n errors: ValidationError[];\r\n warnings: ValidationError[];\r\n}\r\n\r\nconst KNOWN_FRONT_MATTER_KEYS = new Set([\r\n 'id', 'schema_version', 'description', 'provider', 'model', 'fallback_models',\r\n 'reasoning', 'sampling', 'response', 'tools', 'mcp', 'context', 'includes',\r\n 'environments', 'tiers', 'metadata',\r\n]);\r\n\r\n/**\r\n * Validate a parsed prompt asset, returning all errors and warnings.\r\n */\r\nexport function validateAsset(\r\n asset: PromptAsset,\r\n frontMatterKeys?: string[],\r\n filePath?: string,\r\n): PromptValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: ValidationError[] = [];\r\n\r\n // Schema validation\r\n const result = PromptAssetSchema.safeParse(asset);\r\n if (!result.success) {\r\n for (const issue of result.error.issues) {\r\n errors.push({\r\n code: 'POK001',\r\n message: `Schema error at ${issue.path.join('.')}: ${issue.message}`,\r\n filePath,\r\n });\r\n }\r\n }\r\n\r\n // Missing id\r\n if (!asset.id) {\r\n errors.push({\r\n code: 'POK002',\r\n message: 'Missing required field: \"id\"',\r\n filePath,\r\n });\r\n }\r\n\r\n // Missing body sections\r\n if (!asset.sections?.system_instructions && !asset.sections?.prompt_template) {\r\n errors.push({\r\n code: 'POK003',\r\n message: 'Prompt must have at least one body section (System instructions or Prompt template)',\r\n filePath,\r\n });\r\n }\r\n\r\n // Unknown front matter keys with \"did you mean?\"\r\n if (frontMatterKeys) {\r\n for (const key of frontMatterKeys) {\r\n if (!KNOWN_FRONT_MATTER_KEYS.has(key)) {\r\n const suggestion = findClosestMatch(key, KNOWN_FRONT_MATTER_KEYS);\r\n warnings.push({\r\n code: 'POK010',\r\n message: `Unknown front matter field: \"${key}\"`,\r\n filePath,\r\n suggestion: suggestion ? `Did you mean \"${suggestion}\"?` : undefined,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Variable validation: used but not declared\r\n const declaredInputs = new Set(asset.context?.inputs ?? []);\r\n const usedVars = new Set<string>();\r\n\r\n if (asset.sections?.system_instructions) {\r\n for (const v of extractVariables(asset.sections.system_instructions)) {\r\n usedVars.add(v);\r\n }\r\n }\r\n if (asset.sections?.prompt_template) {\r\n for (const v of extractVariables(asset.sections.prompt_template)) {\r\n usedVars.add(v);\r\n }\r\n }\r\n\r\n for (const v of usedVars) {\r\n if (declaredInputs.size > 0 && !declaredInputs.has(v)) {\r\n warnings.push({\r\n code: 'POK011',\r\n message: `Variable \"{{ ${v} }}\" is used but not declared in context.inputs`,\r\n filePath,\r\n });\r\n }\r\n }\r\n\r\n // Declared but unused\r\n for (const v of declaredInputs) {\r\n if (!usedVars.has(v)) {\r\n warnings.push({\r\n code: 'POK012',\r\n message: `Variable \"${v}\" is declared in context.inputs but never used`,\r\n filePath,\r\n });\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n };\r\n}\r\n\r\nfunction findClosestMatch(input: string, candidates: Set<string>): string | undefined {\r\n let best: string | undefined;\r\n let bestDist = Infinity;\r\n\r\n for (const candidate of candidates) {\r\n const dist = levenshtein(input.toLowerCase(), candidate.toLowerCase());\r\n if (dist < bestDist && dist <= 3) {\r\n bestDist = dist;\r\n best = candidate;\r\n }\r\n }\r\n\r\n return best;\r\n}\r\n","import { readdir, readFile, writeFile, mkdir, rm } from 'node:fs/promises';\r\nimport { join, extname, relative, dirname } from 'node:path';\r\nimport { parsePrompt } from '../../parser/index.js';\r\n\r\nconst HELP = `\r\npromptopskit compile <sourceDir> <outputDir> [options]\r\n\r\nCompile .md prompt files to JSON artifacts.\r\n\r\nOptions:\r\n --no-clean Don't clear the output directory before compiling\r\n --dry-run Show what would be compiled without writing files\r\n --format Output format: json (default) or esm\r\n --help, -h Show this help\r\n`.trim();\r\n\r\nexport async function compile(args: string[]): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n console.log(HELP);\r\n return;\r\n }\r\n\r\n const positional = args.filter((a) => !a.startsWith('--'));\r\n const sourceDir = positional[0];\r\n const outputDir = positional[1];\r\n\r\n if (!sourceDir || !outputDir) {\r\n console.error('Error: Please provide source and output directories.');\r\n console.error('Usage: promptopskit compile <sourceDir> <outputDir>');\r\n process.exit(1);\r\n }\r\n\r\n const dryRun = args.includes('--dry-run');\r\n const noClean = args.includes('--no-clean');\r\n const format = getFlag(args, '--format') ?? 'json';\r\n\r\n if (format !== 'json' && format !== 'esm') {\r\n console.error(`Error: Unknown format \"${format}\". Use \"json\" or \"esm\".`);\r\n process.exit(1);\r\n }\r\n\r\n // Collect prompt files\r\n const files = await collectPromptFiles(sourceDir);\r\n\r\n if (files.length === 0) {\r\n console.log(`No .md prompt files found in ${sourceDir}`);\r\n return;\r\n }\r\n\r\n // Clean output dir\r\n if (!noClean && !dryRun) {\r\n await rm(outputDir, { recursive: true, force: true });\r\n }\r\n\r\n let compiled = 0;\r\n let errors = 0;\r\n\r\n for (const file of files) {\r\n const rel = relative(sourceDir, file).replace(/\\.md$/, '');\r\n const outExt = format === 'esm' ? '.mjs' : '.json';\r\n const outPath = join(outputDir, rel + outExt);\r\n\r\n try {\r\n const content = await readFile(file, 'utf-8');\r\n const { asset } = parsePrompt(content, file);\r\n\r\n if (dryRun) {\r\n console.log(` Would create: ${outPath}`);\r\n } else {\r\n await mkdir(dirname(outPath), { recursive: true });\r\n\r\n if (format === 'esm') {\r\n const esmContent = `export default ${JSON.stringify(asset, null, 2)};\\n`;\r\n await writeFile(outPath, esmContent, 'utf-8');\r\n } else {\r\n await writeFile(outPath, JSON.stringify(asset, null, 2) + '\\n', 'utf-8');\r\n }\r\n console.log(` ✓ ${outPath}`);\r\n }\r\n compiled++;\r\n } catch (err) {\r\n errors++;\r\n const message = err instanceof Error ? err.message : String(err);\r\n console.error(` ✗ ${file}`);\r\n console.error(` ${message}`);\r\n }\r\n }\r\n\r\n console.log();\r\n if (dryRun) {\r\n console.log(`Dry run: ${compiled} file(s) would be compiled, ${errors} error(s)`);\r\n } else {\r\n console.log(`Compiled ${compiled} file(s), ${errors} error(s)`);\r\n }\r\n\r\n if (errors > 0) {\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction getFlag(args: string[], flag: string): string | undefined {\r\n const idx = args.indexOf(flag);\r\n if (idx >= 0 && idx + 1 < args.length) {\r\n return args[idx + 1];\r\n }\r\n return undefined;\r\n}\r\n\r\nasync function collectPromptFiles(dir: string): Promise<string[]> {\r\n const results: string[] = [];\r\n const entries = await readdir(dir, { withFileTypes: true, recursive: true });\r\n for (const entry of entries) {\r\n if (entry.isFile() && extname(entry.name) === '.md' && !entry.name.endsWith('.test.md')) {\r\n results.push(join(entry.parentPath ?? dir, entry.name));\r\n }\r\n }\r\n return results.sort();\r\n}\r\n","import { readFile } from 'node:fs/promises';\r\nimport { existsSync } from 'node:fs';\r\nimport { parsePrompt } from '../../parser/index.js';\r\nimport { applyOverrides } from '../../overrides/index.js';\r\nimport { interpolate } from '../../renderer/interpolate.js';\r\n\r\nconst HELP = `\r\npromptopskit render <file> [options]\r\n\r\nRender a prompt preview with variables.\r\n\r\nOptions:\r\n --env <name> Environment override\r\n --tier <name> Tier override\r\n --vars <file> JSON file with variables\r\n --json Output raw JSON instead of readable format\r\n --help, -h Show this help\r\n`.trim();\r\n\r\nexport async function render(args: string[]): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n console.log(HELP);\r\n return;\r\n }\r\n\r\n const file = args.find((a) => !a.startsWith('--'));\r\n if (!file) {\r\n console.error('Error: Please provide a prompt file to render.');\r\n process.exit(1);\r\n }\r\n\r\n const env = getFlag(args, '--env');\r\n const tier = getFlag(args, '--tier');\r\n const varsFile = getFlag(args, '--vars');\r\n const jsonOutput = args.includes('--json');\r\n\r\n // Load variables from file or sidecar\r\n let variables: Record<string, string> = {};\r\n\r\n if (varsFile) {\r\n const varsContent = await readFile(varsFile, 'utf-8');\r\n variables = JSON.parse(varsContent);\r\n } else {\r\n // Try auto-loading sidecar .test.yaml\r\n const sidecarPath = file.replace(/\\.md$/, '.test.yaml');\r\n if (existsSync(sidecarPath)) {\r\n const { default: yaml } = await import('gray-matter');\r\n const sidecarContent = await readFile(sidecarPath, 'utf-8');\r\n // Wrap in --- delimiters so gray-matter parses the entire file as front matter\r\n const parsed = yaml(`---\\n${sidecarContent}---\\n`);\r\n const data = parsed.data as { cases?: Array<{ variables?: Record<string, string> }> };\r\n if (data.cases?.[0]?.variables) {\r\n variables = data.cases[0].variables;\r\n }\r\n }\r\n }\r\n\r\n const content = await readFile(file, 'utf-8');\r\n const { asset } = parsePrompt(content, file);\r\n\r\n // Apply overrides using the standard applyOverrides function\r\n const overridden = applyOverrides(asset, {\r\n environment: env,\r\n tier: tier,\r\n });\r\n\r\n // Render sections with variables\r\n const renderedSystem = overridden.sections?.system_instructions\r\n ? interpolate(overridden.sections.system_instructions, variables)\r\n : undefined;\r\n const renderedPrompt = overridden.sections?.prompt_template\r\n ? interpolate(overridden.sections.prompt_template, variables)\r\n : undefined;\r\n\r\n if (jsonOutput) {\r\n console.log(JSON.stringify({\r\n id: overridden.id,\r\n provider: overridden.provider,\r\n model: overridden.model,\r\n system_instructions: renderedSystem,\r\n prompt_template: renderedPrompt,\r\n tools: overridden.tools,\r\n }, null, 2));\r\n return;\r\n }\r\n\r\n // Readable output\r\n const label = [\r\n overridden.provider,\r\n overridden.model,\r\n [env, tier].filter(Boolean).join('/'),\r\n ].filter(Boolean).join(', ');\r\n\r\n console.log(`── ${overridden.id} (${label}) ${'─'.repeat(Math.max(0, 50 - overridden.id.length - label.length))}`);\r\n\r\n if (renderedSystem) {\r\n console.log(`System: ${renderedSystem.split('\\n')[0]}${renderedSystem.includes('\\n') ? '...' : ''}`);\r\n }\r\n if (renderedPrompt) {\r\n console.log(`User: ${renderedPrompt.split('\\n')[0]}${renderedPrompt.includes('\\n') ? '...' : ''}`);\r\n }\r\n if (overridden.tools?.length) {\r\n const toolNames = overridden.tools.map((t) => typeof t === 'string' ? t : t.name);\r\n console.log(`Tools: ${toolNames.join(', ')}`);\r\n }\r\n console.log(`Model: ${overridden.model ?? 'not set'}`);\r\n console.log('─'.repeat(60));\r\n}\r\n\r\nfunction getFlag(args: string[], flag: string): string | undefined {\r\n const idx = args.indexOf(flag);\r\n if (idx >= 0 && idx + 1 < args.length) {\r\n return args[idx + 1];\r\n }\r\n return undefined;\r\n}\r\n","import type { PromptAsset, PromptAssetOverrides } from '../schema/index.js';\r\n\r\nexport interface OverrideOptions {\r\n environment?: string;\r\n tier?: string;\r\n runtime?: Partial<PromptAssetOverrides>;\r\n}\r\n\r\n/**\r\n * Apply environment, tier, and runtime overrides to a prompt asset.\r\n *\r\n * Precedence: base → environment → tier → runtime\r\n * Scalars are replaced. Arrays are replaced (not concatenated).\r\n */\r\nexport function applyOverrides(\r\n asset: PromptAsset,\r\n options: OverrideOptions = {},\r\n): PromptAsset {\r\n let result = { ...asset };\r\n\r\n // Apply environment override\r\n if (options.environment && result.environments?.[options.environment]) {\r\n result = mergeOverride(result, result.environments[options.environment]);\r\n }\r\n\r\n // Apply tier override\r\n if (options.tier && result.tiers?.[options.tier]) {\r\n result = mergeOverride(result, result.tiers[options.tier]);\r\n }\r\n\r\n // Apply runtime overrides\r\n if (options.runtime) {\r\n result = mergeOverride(result, options.runtime);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction mergeOverride(\r\n base: PromptAsset,\r\n override: Partial<PromptAssetOverrides>,\r\n): PromptAsset {\r\n const result = { ...base };\r\n\r\n if (override.model !== undefined) result.model = override.model;\r\n if (override.fallback_models !== undefined) result.fallback_models = override.fallback_models;\r\n if (override.tools !== undefined) result.tools = override.tools;\r\n\r\n if (override.reasoning !== undefined) {\r\n result.reasoning = { ...result.reasoning, ...override.reasoning };\r\n }\r\n if (override.sampling !== undefined) {\r\n result.sampling = { ...result.sampling, ...override.sampling };\r\n }\r\n if (override.response !== undefined) {\r\n result.response = { ...result.response, ...override.response };\r\n }\r\n\r\n return result;\r\n}\r\n","import { readFile } from 'node:fs/promises';\r\nimport { parsePrompt } from '../../parser/index.js';\r\n\r\nconst HELP = `\r\npromptopskit inspect <file>\r\n\r\nPrint the normalized prompt asset as JSON.\r\n\r\nOptions:\r\n --help, -h Show this help\r\n`.trim();\r\n\r\nexport async function inspect(args: string[]): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n console.log(HELP);\r\n return;\r\n }\r\n\r\n const file = args.find((a) => !a.startsWith('--'));\r\n if (!file) {\r\n console.error('Error: Please provide a prompt file to inspect.');\r\n process.exit(1);\r\n }\r\n\r\n const content = await readFile(file, 'utf-8');\r\n const { asset } = parsePrompt(content, file);\r\n\r\n console.log(JSON.stringify(asset, null, 2));\r\n}\r\n","import { writeFile, mkdir } from 'node:fs/promises';\r\nimport { join, dirname } from 'node:path';\r\nimport { existsSync, readFileSync } from 'node:fs';\r\n\r\nconst HELP = `\r\npromptopskit init [dir]\r\n\r\nScaffold a prompts directory with starter files.\r\n\r\nOptions:\r\n --help, -h Show this help\r\n`.trim();\r\n\r\nconst HELLO_PROMPT = `---\r\nid: hello\r\nschema_version: 1\r\nprovider: openai\r\nmodel: gpt-5.4\r\ncontext:\r\n inputs:\r\n - name\r\nincludes:\r\n - ./shared/tone.md\r\n---\r\n\r\n# System instructions\r\n\r\nYou are a friendly assistant. Be helpful and concise.\r\n\r\n# Prompt template\r\n\r\nSay hello to {{ name }} and ask how you can help them today.\r\n`.trimStart();\r\n\r\nconst TONE_INCLUDE = `---\r\nid: shared.tone\r\nschema_version: 1\r\n---\r\n\r\n# System instructions\r\n\r\nAlways be polite, professional, and concise. Avoid jargon unless the user uses it first.\r\n`.trimStart();\r\n\r\nconst TEST_SIDECAR = `cases:\r\n - name: basic-greeting\r\n variables:\r\n name: \"World\"\r\n - name: named-greeting\r\n variables:\r\n name: \"Alice\"\r\n`;\r\n\r\nexport async function init(args: string[]): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n console.log(HELP);\r\n return;\r\n }\r\n\r\n const dir = args.find((a) => !a.startsWith('--')) ?? './prompts';\r\n\r\n const files: Array<{ path: string; content: string }> = [\r\n { path: join(dir, 'hello.md'), content: HELLO_PROMPT },\r\n { path: join(dir, 'hello.test.yaml'), content: TEST_SIDECAR },\r\n { path: join(dir, 'shared', 'tone.md'), content: TONE_INCLUDE },\r\n ];\r\n\r\n let created = 0;\r\n let skipped = 0;\r\n\r\n for (const file of files) {\r\n if (existsSync(file.path)) {\r\n console.log(` skip ${file.path} (already exists)`);\r\n skipped++;\r\n continue;\r\n }\r\n await mkdir(dirname(file.path), { recursive: true });\r\n await writeFile(file.path, file.content, 'utf-8');\r\n console.log(` ✓ ${file.path}`);\r\n created++;\r\n }\r\n\r\n console.log();\r\n console.log(`Created ${created} file(s), skipped ${skipped} existing.`);\r\n\r\n // Suggest build script if package.json exists\r\n if (existsSync('package.json')) {\r\n try {\r\n const pkg = JSON.parse(readFileSync('package.json', 'utf-8'));\r\n if (!pkg.scripts?.['build:prompts']) {\r\n console.log();\r\n console.log(`Tip: Add to your package.json scripts:`);\r\n console.log(` \"build:prompts\": \"promptopskit compile ${dir} ./dist/prompts\"`);\r\n }\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n }\r\n}\r\n","import { validate } from './commands/validate.js';\r\nimport { compile } from './commands/compile.js';\r\nimport { render } from './commands/render.js';\r\nimport { inspect } from './commands/inspect.js';\r\nimport { init } from './commands/init.js';\r\n\r\nconst HELP = `\r\npromptopskit — Manage prompts, system instructions, tools, and model settings as code\r\n\r\nUsage:\r\n promptopskit <command> [options]\r\n\r\nCommands:\r\n init [dir] Scaffold a prompts directory with starter files\r\n validate <dir> Validate prompt files\r\n compile <src> <out> [options] Compile .md prompts to JSON/ESM artifacts\r\n render <file> [options] Render a prompt preview\r\n inspect <file> Print normalized prompt asset\r\n\r\nOptions:\r\n --help, -h Show this help message\r\n --version, -v Show version\r\n\r\nRun promptopskit <command> --help for command-specific help.\r\n`.trim();\r\n\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n if (!command || command === '--help' || command === '-h') {\r\n console.log(HELP);\r\n process.exit(0);\r\n }\r\n\r\n if (command === '--version' || command === '-v') {\r\n // Dynamic import to read version from package.json\r\n console.log('0.0.1');\r\n process.exit(0);\r\n }\r\n\r\n const commandArgs = args.slice(1);\r\n\r\n switch (command) {\r\n case 'init':\r\n await init(commandArgs);\r\n break;\r\n case 'validate':\r\n await validate(commandArgs);\r\n break;\r\n case 'compile':\r\n await compile(commandArgs);\r\n break;\r\n case 'render':\r\n await render(commandArgs);\r\n break;\r\n case 'inspect':\r\n await inspect(commandArgs);\r\n break;\r\n default:\r\n console.error(`Unknown command: ${command}`);\r\n console.log(HELP);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nmain().catch((err) => {\r\n console.error(err.message);\r\n process.exit(1);\r\n});\r\n"],"mappings":"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","names":["readFile","readFile","readdir","readFile","join","extname","HELP","collectPromptFiles","join","readFile","readdir","extname","readFile","HELP","getFlag","readFile","readFile","HELP","readFile","writeFile","mkdir","join","dirname","existsSync","HELP","HELP"]}
@@ -0,0 +1,179 @@
1
+ import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-DHRI5Mzl.js';
2
+ export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-DHRI5Mzl.js';
3
+ import { P as ProviderAdapter, a as ProviderRequest } from './types-D9hquVja.js';
4
+ export { R as RuntimeRenderOptions, V as ValidationResult } from './types-D9hquVja.js';
5
+ export { anthropicAdapter } from './providers/anthropic.js';
6
+ export { geminiAdapter } from './providers/gemini.js';
7
+ export { openrouterAdapter } from './providers/openrouter.js';
8
+ export { openaiAdapter } from './providers/openai.js';
9
+ import 'zod';
10
+
11
+ interface ValidationError {
12
+ code: string;
13
+ message: string;
14
+ filePath?: string;
15
+ suggestion?: string;
16
+ }
17
+ interface PromptValidationResult {
18
+ valid: boolean;
19
+ errors: ValidationError[];
20
+ warnings: ValidationError[];
21
+ }
22
+ /**
23
+ * Validate a parsed prompt asset, returning all errors and warnings.
24
+ */
25
+ declare function validateAsset(asset: PromptAsset, frontMatterKeys?: string[], filePath?: string): PromptValidationResult;
26
+
27
+ interface InterpolateOptions {
28
+ strict?: boolean;
29
+ }
30
+ /**
31
+ * Interpolate variables into a template string.
32
+ *
33
+ * Syntax: {{ variable_name }}
34
+ * Escape: \{\{ produces literal {{
35
+ *
36
+ * In strict mode, throws on missing variables.
37
+ * In permissive mode, leaves {{ placeholder }} intact.
38
+ */
39
+ declare function interpolate(template: string, variables: Record<string, string>, options?: InterpolateOptions): string;
40
+ /**
41
+ * Extract all variable names referenced in a template.
42
+ */
43
+ declare function extractVariables(template: string): string[];
44
+
45
+ interface RenderOptions {
46
+ variables?: Record<string, string>;
47
+ strict?: boolean;
48
+ }
49
+ interface RenderedSections {
50
+ system_instructions?: string;
51
+ prompt_template?: string;
52
+ }
53
+
54
+ interface ParseResult {
55
+ asset: PromptAsset;
56
+ raw: {
57
+ frontMatter: Record<string, unknown>;
58
+ body: string;
59
+ };
60
+ }
61
+ /**
62
+ * Parse a prompt markdown string (YAML front matter + markdown body)
63
+ * into a validated PromptAsset.
64
+ */
65
+ declare function parsePrompt(content: string, filePath?: string): ParseResult;
66
+
67
+ /**
68
+ * Load and parse a prompt file from disk.
69
+ */
70
+ declare function loadPromptFile(filePath: string): Promise<ParseResult>;
71
+
72
+ interface Sections {
73
+ system_instructions?: string;
74
+ prompt_template?: string;
75
+ notes?: string;
76
+ }
77
+ /**
78
+ * Extract named sections from the markdown body using H1 headings.
79
+ * Case-insensitive. H2+ within a section is treated as content.
80
+ * If no H1 headings are found, the entire body is treated as prompt_template.
81
+ */
82
+ declare function extractSections(body: string): Sections;
83
+
84
+ interface OverrideOptions {
85
+ environment?: string;
86
+ tier?: string;
87
+ runtime?: Partial<PromptAssetOverrides>;
88
+ }
89
+ /**
90
+ * Apply environment, tier, and runtime overrides to a prompt asset.
91
+ *
92
+ * Precedence: base → environment → tier → runtime
93
+ * Scalars are replaced. Arrays are replaced (not concatenated).
94
+ */
95
+ declare function applyOverrides(asset: PromptAsset, options?: OverrideOptions): PromptAsset;
96
+
97
+ /**
98
+ * Resolve includes for a prompt asset, inlining content from referenced files.
99
+ * Detects and rejects circular includes.
100
+ */
101
+ declare function resolveIncludes(asset: PromptAsset, basePath: string, visited?: Set<string>): Promise<PromptAsset>;
102
+
103
+ /**
104
+ * Get a provider adapter by name.
105
+ */
106
+ declare function getAdapter(provider: string): ProviderAdapter;
107
+
108
+ interface PromptOpsKitConfig {
109
+ sourceDir: string;
110
+ compiledDir?: string;
111
+ mode?: 'auto' | 'compiled-only' | 'source-only';
112
+ cache?: boolean;
113
+ }
114
+ interface RenderPromptOptions {
115
+ /** Prompt path (no extension), e.g. 'support/reply' */
116
+ path?: string;
117
+ /** Inline prompt source string (alternative to path) */
118
+ source?: string;
119
+ /** Provider name */
120
+ provider: string;
121
+ /** Environment override */
122
+ environment?: string;
123
+ /** Tier override */
124
+ tier?: string;
125
+ /** Variables for interpolation */
126
+ variables?: Record<string, string>;
127
+ /** Conversation history */
128
+ history?: Array<{
129
+ role: string;
130
+ content: string;
131
+ }>;
132
+ /** Tool registry for resolving tool references */
133
+ toolRegistry?: Record<string, unknown>;
134
+ /** Strict mode — fail on missing variables */
135
+ strict?: boolean;
136
+ }
137
+ interface RenderResult {
138
+ resolved: ResolvedPromptAsset;
139
+ request: ProviderRequest;
140
+ warnings: string[];
141
+ }
142
+ declare class PromptOpsKit {
143
+ private config;
144
+ private promptCache;
145
+ constructor(config: PromptOpsKitConfig);
146
+ /**
147
+ * Load a prompt asset from compiled or source, based on mode.
148
+ */
149
+ loadPrompt(promptPath: string): Promise<PromptAsset>;
150
+ /**
151
+ * Resolve a prompt: load, resolve includes, apply overrides.
152
+ */
153
+ resolvePrompt(promptPath: string, options?: {
154
+ environment?: string;
155
+ tier?: string;
156
+ }): Promise<ResolvedPromptAsset>;
157
+ /**
158
+ * Render a prompt for a specific provider.
159
+ */
160
+ renderPrompt(options: RenderPromptOptions): Promise<RenderResult>;
161
+ /**
162
+ * Validate a prompt file.
163
+ */
164
+ validatePrompt(promptPath: string): Promise<PromptValidationResult>;
165
+ /**
166
+ * Clear the internal cache.
167
+ */
168
+ clearCache(): void;
169
+ }
170
+ declare function createPromptOpsKit(config: PromptOpsKitConfig): PromptOpsKit;
171
+ /**
172
+ * Standalone renderPrompt for quick usage without creating a PromptOpsKit instance.
173
+ * Requires either `source` (inline) or `path` + implicit sourceDir of '.'.
174
+ */
175
+ declare function renderPrompt(options: RenderPromptOptions & {
176
+ sourceDir?: string;
177
+ }): Promise<RenderResult>;
178
+
179
+ export { type OverrideOptions, type ParseResult, PromptAsset, PromptOpsKit, type PromptOpsKitConfig, type PromptValidationResult, ProviderAdapter, ProviderRequest, type RenderOptions, type RenderPromptOptions, type RenderResult, type RenderedSections, ResolvedPromptAsset, type ValidationError, applyOverrides, createPromptOpsKit, extractSections, extractVariables, getAdapter, interpolate, loadPromptFile, parsePrompt, renderPrompt, resolveIncludes, validateAsset };